From c106e87a0101ccba2bce1ddae30be7a2dce801ae Mon Sep 17 00:00:00 2001 From: Unnunu Date: Thu, 26 Jun 2025 18:58:23 +0300 Subject: [PATCH] Refactored Object structure (#650) * remove ObjectSegment from Object * remove some unused structs * remove SegmentPropertiesObject from Object * object types * remove unneeded structs * save * fix build * remove unneeded unk64 union fields * get rid of unk64 * update score * Apply suggestions from code review Co-authored-by: Ryan Myers --------- Co-authored-by: Ryan Myers --- include/object_properties.h | 237 +- include/structs.h | 2564 ++++++++++---------- src/audio_vehicle.c | 96 +- src/camera.c | 73 +- src/game_ui.c | 155 +- src/lights.c | 36 +- src/menu.c | 20 +- src/object_functions.c | 2445 ++++++++++--------- src/object_functions.h | 205 +- src/object_models.c | 30 +- src/objects.c | 3285 +++++++++++--------------- src/objects.h | 191 +- src/particles.c | 105 +- src/racer.c | 1633 +++++++------ src/tracks.c | 274 ++- src/vehicle_bluey.c | 56 +- src/vehicle_bubbler.c | 44 +- src/vehicle_rocket.c | 54 +- src/vehicle_smokey.c | 134 +- src/vehicle_tricky.c | 64 +- src/vehicle_wizpig.c | 86 +- src/waves.c | 17 +- src/weather.c | 29 +- ver/symbols/symbol_addrs.jpn.v79.txt | 2 +- ver/symbols/symbol_addrs.pal.v77.txt | 2 +- ver/symbols/symbol_addrs.pal.v80.txt | 2 +- ver/symbols/symbol_addrs.us.v77.txt | 2 +- ver/symbols/symbol_addrs.us.v80.txt | 2 +- 28 files changed, 5498 insertions(+), 6345 deletions(-) diff --git a/include/object_properties.h b/include/object_properties.h index 2ec29d61..209112a9 100644 --- a/include/object_properties.h +++ b/include/object_properties.h @@ -6,9 +6,9 @@ #include "level_object_entries.h" /** - * Objects have a union at offset 0x78, that's 8 bytes large. + * Objects have a union at offset 0x78, that's 8 bytes large. * Here's a collection of unions to help improve readability for them. -*/ + */ typedef struct ObjPropertyCommon { s32 unk0; @@ -20,10 +20,9 @@ typedef struct ObjPropertyDistance { s32 unk4; } ObjPropertyDistance; -typedef struct ObjPropertySpeed { +typedef struct ObjPropertyTorchMist { s32 speed; - s32 unk4; -} ObjPropertySpeed; +} ObjPropertyTorchMist; typedef struct ObjPropertyBanana { s32 status; @@ -48,110 +47,152 @@ typedef struct ObjPropertyLog { } ObjPropertyLog; typedef struct ObjPropertyScenery { - struct Object *interactObj; - s16 hitTimer; - s16 angleVel; + struct Object *interactObj; + s16 hitTimer; + s16 angleVel; } ObjPropertyScenery; typedef struct ObjPropertyFireball { - struct Object *obj; - s32 timer; + struct Object *obj; + s32 timer; } ObjPropertyFireball; -typedef struct ObjPropertyLasergun { - s32 timer; - struct Object_LaserGun *obj; -} ObjPropertyLasergun; +typedef struct ObjPropertyWizPigShip { + s32 unk0; + s32 timer; +} ObjPropertyWizPigShip; + +typedef struct ObjPropertyLaserbolt { + s32 timer; + struct Object_LaserGun *obj; +} ObjPropertyLaserbolt; typedef struct ObjPropertyTrophyCabinet { - s32 action; - s32 trophy; + s32 action; + s32 trophy; } ObjPropertyTrophyCabinet; typedef struct ObjPropertyEggSpawner { - struct Object *egg; + struct Object *egg; } ObjPropertyEggSpawner; typedef struct ObjPropertyZipper { - s32 radius; + s32 radius; } ObjPropertyZipper; typedef struct ObjPropertyCharacterFlag { - s32 playerID; - s32 characterID; + s32 playerID; + s32 characterID; } ObjPropertyCharacterFlag; -typedef struct ObjPropertyNPC { - s32 action; - s32 timer; -} ObjPropertyNPC; +typedef struct ObjPropertyGoldenBalloon { + s32 action; + s32 timer; +} ObjPropertyGoldenBalloon; + +typedef struct ObjPropertySilverCoin { + s32 action; + s32 timer; +} ObjPropertySilverCoin; + +typedef struct ObjPropertyTT { + s32 action; + s32 timer; +} ObjPropertyTT; + +typedef struct ObjPropertyTaj { + s32 action; + s32 timer; +} ObjPropertyTaj; typedef struct ObjPropertyLavaSpurt { - s32 actionTimer; - s32 delayTimer; + s32 actionTimer; + s32 delayTimer; } ObjPropertyLavaSpurt; +typedef struct ObjPropertyPosArrow { + s32 playerID; +} ObjPropertyPosArrow; + typedef struct ObjPropertyAnimation { - s32 action; - s32 behaviourID; + s32 action; + s32 behaviourID; } ObjPropertyAnimation; +typedef struct ObjPropertyAnimatedObject { + s32 unk0; + s32 unk4; +} ObjPropertyAnimatedObject; + typedef struct ObjPropertyInfoPoint { - s32 radius; - s32 visible; + s32 radius; + s32 visible; } ObjPropertyInfoPoint; typedef struct ObjPropertyBombExplosion { - s32 timer; - s32 unk4; + s32 timer; + s32 unk4; } ObjPropertyBombExplosion; typedef struct ObjPropertyLighthouse { - s32 active; + s32 active; } ObjPropertyLighthouse; typedef struct ObjPropertyDoor { - s32 closeAngle; - s32 openAngle; + s32 closeAngle; + s32 openAngle; } ObjPropertyDoor; +typedef struct ObjPropertyBridgeWhaleRamp { + s32 unk0; +} ObjPropertyBridgeWhaleRamp; + +typedef struct ObjPropertyRampSwitch { + s32 unk0; +} ObjPropertyRampSwitch; + typedef struct ObjPropertySkyControl { - s32 setting; - s32 radius; + s32 setting; + s32 radius; } ObjPropertySkyControl; typedef struct ObjPropertyTreasureSucker { - s32 playerID; - s32 spawnTimer; + s32 playerID; + s32 spawnTimer; } ObjPropertyTreasureSucker; typedef struct ObjPropertyTreasureBanana { - s32 diff; - struct Object_Racer *racer; + s32 diff; + struct Object_Racer *racer; } ObjPropertyTreasureBanana; +typedef struct ObjPropertyFlyCoin { + s32 diff; + struct Object_Racer *racer; +} ObjPropertyFlyCoin; + typedef struct ObjPropertyBananaSpawner { - s32 timer; - s32 spawn; + s32 timer; + s32 spawn; } ObjPropertyBananaSpawner; typedef struct ObjPropertyWorldKey { - s32 keyID; + s32 keyID; } ObjPropertyWorldKey; typedef struct ObjPropertyWeaponBalloon { - s32 balloonID; + s32 balloonID; s32 particleTimer; } ObjPropertyWeaponBalloon; typedef struct ObjPropertyRacer { - struct Object *unk0; + struct Object *unk0; s32 unk4; } ObjPropertyRacer; typedef struct ObjPropertySetupPoint { - s32 racerIndex; - s32 entranceID; + s32 racerIndex; + s32 entranceID; } ObjPropertySetupPoint; typedef struct ObjPropertyWeapon { @@ -162,24 +203,32 @@ typedef struct ObjPropertyWeapon { } ObjPropertyWeapon; typedef struct ObjPropertyCamControl { - s32 cameraID; + s32 cameraID; } ObjPropertyCamControl; typedef struct ObjPropertyTimeTrial { - s32 timestamp; - struct ObjectHeader *header; + s32 timestamp; + struct ObjectHeader *header; } ObjPropertyTimeTrial; +typedef struct ObjPropertyDinoWhale { + s32 unk0; +} ObjPropertyDinoWhale; + +typedef struct ObjPropertyBubbler { + s32 unk0; +} ObjPropertyBubbler; + typedef struct ObjPropertyBoost { struct Object *obj; union { - s32 indexes; // Keep this for compatibility + s32 indexes; // Keep this for compatibility // This is a bitfield definition for the bits in indexes. // It won't match when used, but it's useful for understanding the structure. struct { - s32 racerIndex : 4; // bits 28-31 ((indexes >> 28) & 0xF) - s32 vertIndex : 14; // bits 14-27 ((indexes >> 14) & 0x3FFF) - s32 trisIndex : 14; // bits 0-13 (indexes & 0x3FFF) + s32 racerIndex : 4; // bits 28-31 ((indexes >> 28) & 0xF) + s32 vertIndex : 14; // bits 14-27 ((indexes >> 14) & 0x3FFF) + s32 trisIndex : 14; // bits 0-13 (indexes & 0x3FFF) }; }; } ObjPropertyBoost; @@ -187,37 +236,53 @@ typedef struct ObjPropertyBoost { typedef struct ObjProperties { union { ObjPropertyCommon common; - ObjPropertyDistance distance; - ObjPropertySpeed speed; - ObjPropertyBanana banana; - ObjPropertyName levelName; - ObjPropertyProjectile projectile; - ObjPropertyLog log; - ObjPropertyScenery scenery; - ObjPropertyFireball fireball; - ObjPropertyLasergun lasergun; - ObjPropertyTrophyCabinet trophyCabinet; - ObjPropertyEggSpawner eggSpawner; - ObjPropertyZipper zipper; - ObjPropertyCharacterFlag characterFlag; - ObjPropertyNPC npc; - ObjPropertyLavaSpurt lavaSpurt; - ObjPropertyAnimation animatedObj; - ObjPropertyInfoPoint infoPoint; - ObjPropertyBombExplosion bombExplosion; - ObjPropertyLighthouse lighthouse; - ObjPropertyDoor door; - ObjPropertySkyControl skyControl; - ObjPropertyTreasureSucker treasureSucker; - ObjPropertyTreasureBanana treasureBanana; - ObjPropertyBananaSpawner bananaSpawner; - ObjPropertyWorldKey worldKey; - ObjPropertyWeaponBalloon weaponBalloon; - ObjPropertyRacer racer; - ObjPropertySetupPoint setupPoint; - ObjPropertyWeapon weapon; - ObjPropertyCamControl camControl; - ObjPropertyTimeTrial timeTrial; + ObjPropertyDistance distance; // BHV_FOG_CHANGER, BHV_WEATHER + ObjPropertyTorchMist torchMist; // BHV_TORCH_MIST + ObjPropertyBanana banana; // BHV_BANANA + ObjPropertyName levelName; // BHV_LEVEL_NAME + ObjPropertyProjectile projectile; // BHV_WEAPON_2 + ObjPropertyLog log; // BHV_LOG + ObjPropertyScenery scenery; // BHV_SCENERY + ObjPropertyFireball fireball; // BHV_FIREBALL_OCTOWEAPON, BHV_FIREBALL_OCTOWEAPON_2 + ObjPropertyLaserbolt laserbolt; // BHV_LASER_BOLT + ObjPropertyTrophyCabinet trophyCabinet; // BHV_TROPHY_CABINET + ObjPropertyEggSpawner eggSpawner; // BHV_EGG_CREATOR + ObjPropertyZipper zipper; // BHV_ZIPPER_GROUND + ObjPropertyCharacterFlag characterFlag; // BHV_CHARACTER_FLAG + ObjPropertyGoldenBalloon goldenBalloon; // BHV_GOLDEN_BALLOON + ObjPropertySilverCoin silverCoin; // BHV_SILVER_COIN_2, BHV_SILVER_COIN + ObjPropertyTT tt; // BHV_STOPWATCH_MAN + ObjPropertyTaj taj; // BHV_PARK_WARDEN + ObjPropertyLavaSpurt lavaSpurt; // BHV_LAVA_SPURT + ObjPropertyPosArrow posArrow; // BHV_POS_ARROW + ObjPropertyAnimation animation; // BHV_ANIMATION + ObjPropertyWizPigShip wizpigship; // BHV_WIZPIG_SHIP + ObjPropertyAnimatedObject animatedObj; // BHV_DINO_WHALE, BHV_ANIMATED_OBJECT, BHV_CAMERA_ANIMATION + // BHV_CAR_ANIMATION, BHV_CHARACTER_SELECT, BHV_VEHICLE_ANIMATION + // BHV_HIT_TESTER, BHV_HIT_TESTER_2, BHV_PARK_WARDEN_2 + // BHV_ANIMATED_OBJECT_2, BHV_WIZPIG_SHIP, BHV_ANIMATED_OBJECT_3 + // BHV_ANIMATED_OBJECT_4, BHV_SNOWBALL, BHV_SNOWBALL_2 + // BHV_SNOWBALL_3, BHV_SNOWBALL_4, BHV_HIT_TESTER_3 + // BHV_HIT_TESTER_4, BHV_DOOR_OPENER, BHV_PIG_ROCKETEER + // BHV_WIZPIG_GHOSTS + ObjPropertyInfoPoint infoPoint; // BHV_INFO_POINT + ObjPropertyBombExplosion bombExplosion; // BHV_BOMB_EXPLOSION + ObjPropertyLighthouse lighthouse; // BHV_TELEPORT + ObjPropertyDoor door; // BHV_DOOR, BHV_TT_DOOR + ObjPropertyBridgeWhaleRamp bridgeWhaleRamp; // BHV_BRIDGE_WHALE_RAMP + ObjPropertyRampSwitch rampSwitch; // BHV_RAMP_SWITCH + ObjPropertySkyControl skyControl; // BHV_SKY_CONTROL + ObjPropertyTreasureSucker treasureSucker; // BHV_TREASURE_SUCKER + ObjPropertyFlyCoin flyCoin; // BHV_FLY_COIN + ObjPropertyBananaSpawner bananaSpawner; // BHV_BANANA_SPAWNER + ObjPropertyWorldKey worldKey; // BHV_WORLD_KEY + ObjPropertyWeaponBalloon weaponBalloon; // BHV_WEAPON_BALLOON + ObjPropertySetupPoint setupPoint; // BHV_SETUP_POINT + ObjPropertyWeapon weapon; // BHV_WEAPON + ObjPropertyCamControl camControl; // BHV_CAMERA_CONTROL + ObjPropertyTimeTrial timeTrial; // BHV_TIMETRIAL_GHOST + ObjPropertyDinoWhale dinoWhale; // BHV_DINO_WHALE + ObjPropertyBubbler bubbler; // BHV_BUBBLER ObjPropertyBoost boost; }; } ObjProperties; diff --git a/include/structs.h b/include/structs.h index eff16491..3e3c5942 100644 --- a/include/structs.h +++ b/include/structs.h @@ -10,15 +10,15 @@ #include "audio.h" typedef struct Vec4f { - union { - struct { - f32 x; - f32 y; - f32 z; - f32 w; + union { + struct { + f32 x; + f32 y; + f32 z; + f32 w; + }; + f32 f[4]; }; - f32 f[4]; - }; } Vec4f; // Stolen from PD @@ -27,134 +27,136 @@ typedef struct Vec4f { // coord->f[0], coord->f[1] and coord->f[2]. // In some places code only matches when using the float array. typedef struct Vec3f { - union { - struct { - f32 x; - f32 y; - f32 z; + union { + struct { + f32 x; + f32 y; + f32 z; + }; + f32 f[3]; }; - f32 f[3]; - }; } Vec3f; typedef struct Vec2f { - union { - struct { - f32 x; - f32 y; + union { + struct { + f32 x; + f32 y; + }; + f32 f[2]; }; - f32 f[2]; - }; } Vec2f; typedef struct Vec3s { - union { - struct { - s16 y_rotation; - s16 x_rotation; - s16 z_rotation; + union { + struct { + s16 y_rotation; + s16 x_rotation; + s16 z_rotation; + }; + struct { + s16 x; + s16 y; + s16 z; + }; + s16 s[3]; }; - struct { - s16 x; - s16 y; - s16 z; - }; - s16 s[3]; - }; } Vec3s; typedef struct Vec2s { - union { - struct { - s16 y_rotation; - s16 x_rotation; + union { + struct { + s16 y_rotation; + s16 x_rotation; + }; + struct { + s16 x; + s16 y; + }; + s16 s[2]; }; - struct { - s16 x; - s16 y; - }; - s16 s[2]; - }; } Vec2s; typedef struct Vec3i { - union { - struct { - s32 x; - s32 y; - s32 z; + union { + struct { + s32 x; + s32 y; + s32 z; + }; + s32 i[3]; }; - s32 i[3]; - }; } Vec3i; typedef struct Vec2i { - union { - struct { - s32 x; - s32 y; - }; - s32 i[2]; - }; + union { + struct { + s32 x; + s32 y; + }; + s32 i[2]; + }; } Vec2i; /* Size: 0x20 bytes */ typedef struct TextureHeader { - /* 0x00 */ u8 width; - /* 0x01 */ u8 height; - /* 0x02 */ u8 format; // Lower 4 bits determines image format. - // 0 = RGBA32 - // 1 = RGBA16 - // 2 = I8 - // 3 = I4 - // 4 = IA16 - // 5 = IA8 - // 6 = IA4 - // 7 = CI4 (16 colors) - // 8 = CI8 (64 colors) - /* 0x03 */ s8 posX; // X coordinate of the texture in the sprite's 2D space - /* 0x04 */ s8 posY; // Y coordinate of the texture in the sprite's 2D space - /* 0x05 */ u8 numberOfInstances; // Always 1 in the ROM. - /* 0x06 */ s16 flags; - // 0x04 = Interlaced texture - // 0x40 = U clamp flag. 0 = Wrap, 1 = Clamp - // 0x80 = V clamp flag. 0 = Wrap, 1 = Clamp - /* 0x08 */ s16 ciPaletteOffset; - /* 0x0A */ s16 numberOfCommands; // initialized in RAM; Number of commands in the texture display list. (Usually 0x07) - /* 0x0C */ Gfx *cmd; // initialized in RAM; Pointer to texture display list. - /* 0x10 */ u8 unk10; - /* 0x11 */ u8 unk11; - /* 0x12 */ u16 numOfTextures; // For animated textures, static textures are just 0x01. Each texture has it's own header. - /* 0x14 */ u16 frameAdvanceDelay; // How many frames to delay before moving to the next texture. - /* 0x16 */ s16 textureSize; // Size in number of bytes, including the header - /* 0x18 */ u8 unk18; - /* 0x19 */ u8 unk19; - /* 0x1A */ u8 unk1A; - /* 0x1B */ u8 unk1B; - /* 0x1C */ u8 unk1C; - /* 0x1D */ u8 isCompressed; - /* 0x1E */ u8 unk1E; - /* 0x1F */ u8 unk1F; + /* 0x00 */ u8 width; + /* 0x01 */ u8 height; + /* 0x02 */ u8 format; // Lower 4 bits determines image format. + // 0 = RGBA32 + // 1 = RGBA16 + // 2 = I8 + // 3 = I4 + // 4 = IA16 + // 5 = IA8 + // 6 = IA4 + // 7 = CI4 (16 colors) + // 8 = CI8 (64 colors) + /* 0x03 */ s8 posX; // X coordinate of the texture in the sprite's 2D space + /* 0x04 */ s8 posY; // Y coordinate of the texture in the sprite's 2D space + /* 0x05 */ u8 numberOfInstances; // Always 1 in the ROM. + /* 0x06 */ s16 flags; + // 0x04 = Interlaced texture + // 0x40 = U clamp flag. 0 = Wrap, 1 = Clamp + // 0x80 = V clamp flag. 0 = Wrap, 1 = Clamp + /* 0x08 */ s16 ciPaletteOffset; + /* 0x0A */ s16 + numberOfCommands; // initialized in RAM; Number of commands in the texture display list. (Usually 0x07) + /* 0x0C */ Gfx *cmd; // initialized in RAM; Pointer to texture display list. + /* 0x10 */ u8 unk10; + /* 0x11 */ u8 unk11; + /* 0x12 */ u16 + numOfTextures; // For animated textures, static textures are just 0x01. Each texture has it's own header. + /* 0x14 */ u16 frameAdvanceDelay; // How many frames to delay before moving to the next texture. + /* 0x16 */ s16 textureSize; // Size in number of bytes, including the header + /* 0x18 */ u8 unk18; + /* 0x19 */ u8 unk19; + /* 0x1A */ u8 unk1A; + /* 0x1B */ u8 unk1B; + /* 0x1C */ u8 unk1C; + /* 0x1D */ u8 isCompressed; + /* 0x1E */ u8 unk1E; + /* 0x1F */ u8 unk1F; } TextureHeader; // Probably not unique to the boot menu. typedef struct DrawTexture { TextureHeader *texture; // Pointer to texture to draw. - s16 xOffset; // Offset from the center of the screen. - s16 yOffset; // Offset from the center of the screen. + s16 xOffset; // Offset from the center of the screen. + s16 yOffset; // Offset from the center of the screen. } DrawTexture; // Probably not unique to the boot menu. typedef struct ShadowHeapProperties { - TextureHeader *texture; // Pointer to texture to draw. - s16 triCount; // Offset from the center of the screen. - s16 vtxCount; // Offset from the center of the screen. + TextureHeader *texture; // Pointer to texture to draw. + s16 triCount; // Offset from the center of the screen. + s16 vtxCount; // Offset from the center of the screen. } ShadowHeapProperties; typedef struct SpriteAsset { /* 0x00 */ s16 baseTextureId; /* 0x02 */ s16 numberOfFrames; // 1 means static texture - /* 0x04 */ Vec2s anchor; // 2D coordinates on the sprite used as the anchor point for positioning in 3D space + /* 0x04 */ Vec2s anchor; // 2D coordinates on the sprite used as the anchor point for positioning in 3D space /* 0x08 */ s32 unused_field; /* 0x0C */ u8 frameTexOffsets[1]; // actual size is numberOfFrames + 1 } SpriteAsset; @@ -170,235 +172,237 @@ typedef struct Sprite { /* Size: 0x20 bytes */ typedef struct MenuElement { - // Element Position - /* 0x00 */ s16 left; // Where the element spawns on entry. - /* 0x02 */ s16 top; - /* 0x04 */ s16 center; // Value of where the element moves to after entry - /* 0x06 */ s16 middle; - /* 0x08 */ s16 right; // Value of where the element moves to after exit - /* 0x0A */ s16 bottom; - // Element Color/Transparency - /* 0x0C */ u8 filterRed; - /* 0x0D */ u8 filterGreen; - /* 0x0E */ u8 filterBlue; - /* 0x0F */ u8 filterBlendFactor; // 0 = no filter color, 0xFF = full color. - /* 0x10 */ u8 opacity; - // Element Properties - /* 0x11 */ u8 textFont; - /* 0x12 */ u8 textAlignFlags; - // Element Type - /* 0x13 */ u8 elementType; // Source type? 0 = ascii text, 2 = number, 7 = texture - union { - /* 0x14 */ void *element; // Generic pointer - /* 0x14 */ char *asciiText; // Pointer to ascii text to be displayed on the screen. - /* 0x14 */ TextureHeader *texture; // Pointer to texture to be displayed on the screen. - /* 0x14 */ DrawTexture *drawTexture; // Pointer to texture to be displayed on the screen. - /* 0x14 */ s32 *number; // Pointer to a number to be displayed on the screen. - /* 0x14 */ u16 *numberU16; // Pointer to a number to be displayed on the screen. - /* 0x14 */ s32 assetID; // Some value for elementType == 5 - } t; - union { - struct { - // Element Background Color/Transparency - /* 0x18 */ s16 backgroundRed; - /* 0x1A */ s16 backgroundGreen; - /* 0x1C */ s16 backgroundBlue; - /* 0x1E */ s16 backgroundAlpha; // 0x0000 = No background, 0x00FF = full background color. - } background; - struct { - // Texture Size - /* 0x18 */ s16 width; - /* 0x1A */ s16 height; - /* 0x1C */ s16 borderWidth; - /* 0x1E */ s16 borderHeight; - } texture; - } details; + // Element Position + /* 0x00 */ s16 left; // Where the element spawns on entry. + /* 0x02 */ s16 top; + /* 0x04 */ s16 center; // Value of where the element moves to after entry + /* 0x06 */ s16 middle; + /* 0x08 */ s16 right; // Value of where the element moves to after exit + /* 0x0A */ s16 bottom; + // Element Color/Transparency + /* 0x0C */ u8 filterRed; + /* 0x0D */ u8 filterGreen; + /* 0x0E */ u8 filterBlue; + /* 0x0F */ u8 filterBlendFactor; // 0 = no filter color, 0xFF = full color. + /* 0x10 */ u8 opacity; + // Element Properties + /* 0x11 */ u8 textFont; + /* 0x12 */ u8 textAlignFlags; + // Element Type + /* 0x13 */ u8 elementType; // Source type? 0 = ascii text, 2 = number, 7 = texture + union { + /* 0x14 */ void *element; // Generic pointer + /* 0x14 */ char *asciiText; // Pointer to ascii text to be displayed on the screen. + /* 0x14 */ TextureHeader *texture; // Pointer to texture to be displayed on the screen. + /* 0x14 */ DrawTexture *drawTexture; // Pointer to texture to be displayed on the screen. + /* 0x14 */ s32 *number; // Pointer to a number to be displayed on the screen. + /* 0x14 */ u16 *numberU16; // Pointer to a number to be displayed on the screen. + /* 0x14 */ s32 assetID; // Some value for elementType == 5 + } t; + union { + struct { + // Element Background Color/Transparency + /* 0x18 */ s16 backgroundRed; + /* 0x1A */ s16 backgroundGreen; + /* 0x1C */ s16 backgroundBlue; + /* 0x1E */ s16 backgroundAlpha; // 0x0000 = No background, 0x00FF = full background color. + } background; + struct { + // Texture Size + /* 0x18 */ s16 width; + /* 0x1A */ s16 height; + /* 0x1C */ s16 borderWidth; + /* 0x1E */ s16 borderHeight; + } texture; + } details; } MenuElement; #define TEX_FORMAT_RGBA32 0 #define TEX_FORMAT_RGBA16 1 -#define TEX_FORMAT_I8 2 -#define TEX_FORMAT_I4 3 -#define TEX_FORMAT_IA16 4 -#define TEX_FORMAT_IA8 5 -#define TEX_FORMAT_IA4 6 -#define TEX_FORMAT_CI4 7 -#define TEX_FORMAT_CI8 8 +#define TEX_FORMAT_I8 2 +#define TEX_FORMAT_I4 3 +#define TEX_FORMAT_IA16 4 +#define TEX_FORMAT_IA8 5 +#define TEX_FORMAT_IA4 6 +#define TEX_FORMAT_CI4 7 +#define TEX_FORMAT_CI8 8 /* Size: 0x18 bytes */ typedef struct Racer { - /* 0x00 */ u32 trophy_points; - /* 0x04 */ s8 best_times; - /* 0x05 */ s8 character; - /* 0x06 */ s8 starting_position; - /* 0x07 */ s8 unk7; - /* 0x08 */ u16 placements[4]; - /* 0x10 */ u16 course_time; - /* 0x12 */ u16 lap_times[3]; + /* 0x00 */ u32 trophy_points; + /* 0x04 */ s8 best_times; + /* 0x05 */ s8 character; + /* 0x06 */ s8 starting_position; + /* 0x07 */ s8 unk7; + /* 0x08 */ u16 placements[4]; + /* 0x10 */ u16 course_time; + /* 0x12 */ u16 lap_times[3]; } Racer; /* Unknown Size */ typedef struct Settings4C { - u8 courseID; //courseId? - u8 unk1; // This value + 8 is cutsceneId index? gGameCurrentCutscene = gLevelSettings[gLevelSettings[1] + 8]; - s8 mapID; //mapId? + u8 courseID; // courseId? + u8 unk1; // This value + 8 is cutsceneId index? gGameCurrentCutscene = gLevelSettings[gLevelSettings[1] + 8]; + s8 mapID; // mapId? u8 pad3[0xC]; - u8 entranceID; //entranceId? + u8 entranceID; // entranceId? } Settings4C; -#define TAJ_FLAGS_CAR_CHAL_UNLOCKED 0x01 -#define TAJ_FLAGS_HOVER_CHAL_UNLOCKED 0x02 -#define TAJ_FLAGS_PLANE_CHAL_UNLOCKED 0x04 -#define TAJ_FLAGS_UNLOCKED_A_CHALLENGE (TAJ_FLAGS_CAR_CHAL_UNLOCKED | TAJ_FLAGS_HOVER_CHAL_UNLOCKED | TAJ_FLAGS_PLANE_CHAL_UNLOCKED) -#define TAJ_FLAGS_CAR_CHAL_COMPLETED 0x08 +#define TAJ_FLAGS_CAR_CHAL_UNLOCKED 0x01 +#define TAJ_FLAGS_HOVER_CHAL_UNLOCKED 0x02 +#define TAJ_FLAGS_PLANE_CHAL_UNLOCKED 0x04 +#define TAJ_FLAGS_UNLOCKED_A_CHALLENGE \ + (TAJ_FLAGS_CAR_CHAL_UNLOCKED | TAJ_FLAGS_HOVER_CHAL_UNLOCKED | TAJ_FLAGS_PLANE_CHAL_UNLOCKED) +#define TAJ_FLAGS_CAR_CHAL_COMPLETED 0x08 #define TAJ_FLAGS_HOVER_CHAL_COMPLETED 0x10 #define TAJ_FLAGS_PLANE_CHAL_COMPLETED 0x20 -#define CUTSCENE_NONE 0x0 -#define CUTSCENE_LIGHTHOUSE_ROCKET 0x1 -#define CUTSCENE_TT_HELP 0x2 -#define CUTSCENE_ADVENTURE_TWO 0x4 -#define CUTSCENE_DINO_DOMAIN_BOSS 0x8 -#define CUTSCENE_SHERBET_ISLAND_BOSS 0x10 -#define CUTSCENE_SNOWFLAKE_MOUNTAIN_BOSS 0x20 -#define CUTSCENE_DRAGON_FOREST_BOSS 0x40 -#define CUTSCENE_FUTURE_FUN_LAND_BOSS 0x80 -#define CUTSCENE_DINO_DOMAIN_BOSS_2 0x100 -#define CUTSCENE_SHERBET_ISLAND_BOSS_2 0x200 +#define CUTSCENE_NONE 0x0 +#define CUTSCENE_LIGHTHOUSE_ROCKET 0x1 +#define CUTSCENE_TT_HELP 0x2 +#define CUTSCENE_ADVENTURE_TWO 0x4 +#define CUTSCENE_DINO_DOMAIN_BOSS 0x8 +#define CUTSCENE_SHERBET_ISLAND_BOSS 0x10 +#define CUTSCENE_SNOWFLAKE_MOUNTAIN_BOSS 0x20 +#define CUTSCENE_DRAGON_FOREST_BOSS 0x40 +#define CUTSCENE_FUTURE_FUN_LAND_BOSS 0x80 +#define CUTSCENE_DINO_DOMAIN_BOSS_2 0x100 +#define CUTSCENE_SHERBET_ISLAND_BOSS_2 0x200 #define CUTSCENE_SNOWFLAKE_MOUNTAIN_BOSS_2 0x400 -#define CUTSCENE_DRAGON_FOREST_BOSS_2 0x800 -#define CUTSCENE_WIZPIG_FACE 0x2000 -#define CUTSCENE_DINO_DOMAIN_KEY 0x4000 -#define CUTSCENE_SHERBET_ISLAND_KEY 0x8000 -#define CUTSCENE_SNOWFLAKE_MOUNTAIN_KEY 0x10000 -#define CUTSCENE_DRAGON_FOREST_KEY 0x20000 +#define CUTSCENE_DRAGON_FOREST_BOSS_2 0x800 +#define CUTSCENE_WIZPIG_FACE 0x2000 +#define CUTSCENE_DINO_DOMAIN_KEY 0x4000 +#define CUTSCENE_SHERBET_ISLAND_KEY 0x8000 +#define CUTSCENE_SNOWFLAKE_MOUNTAIN_KEY 0x10000 +#define CUTSCENE_DRAGON_FOREST_KEY 0x20000 /* Size: 0x118 bytes */ typedef struct Settings { - // Balloon indices: - // 0 = Total balloons - // 1 = Dino Domain balloons - // 2 = Sherbet Island balloons - // 3 = Snowflake Mountain balloons - // 4 = Dragon Forest balloons - // 5 = Future Fun Land balloons - /* 0x0000 */ s16 *balloonsPtr; + // Balloon indices: + // 0 = Total balloons + // 1 = Dino Domain balloons + // 2 = Sherbet Island balloons + // 3 = Snowflake Mountain balloons + // 4 = Dragon Forest balloons + // 5 = Future Fun Land balloons + /* 0x0000 */ s16 *balloonsPtr; - // Course flag bits: - // 0x1 = Map has been visited. - // 0x2 = Map has been completed. - // 0x4 = Map's silver coin challenge has been completed. - // 0x00000000-0xFFFF0000 = Used as bit fields for hub worlds to indicate whether or not a door can open when the player gets near it. - /* 0x0004 */ s32 *courseFlagsPtr; + // Course flag bits: + // 0x1 = Map has been visited. + // 0x2 = Map has been completed. + // 0x4 = Map's silver coin challenge has been completed. + // 0x00000000-0xFFFF0000 = Used as bit fields for hub worlds to indicate whether or not a door can open when the + // player gets near it. + /* 0x0004 */ s32 *courseFlagsPtr; - // Key bits: - // 0x02 = Dino Domain key - // 0x04 = Sherbet Island key - // 0x08 = Snowflake Mountain key - // 0x10 = Dragon Forest key - /* 0x0008 */ u16 keys; + // Key bits: + // 0x02 = Dino Domain key + // 0x04 = Sherbet Island key + // 0x08 = Snowflake Mountain key + // 0x10 = Dragon Forest key + /* 0x0008 */ u16 keys; - /* 0x000A */ u16 unkA; + /* 0x000A */ u16 unkA; - // Boss bits: - // 0x001 = Wizpig 1 - // 0x002 = Tricky 1 - // 0x004 = Bubbler 1 - // 0x008 = Bluey 1 - // 0x010 = Smokey 1 - // 0x020 = Wizpig 2 - // 0x080 = Tricky 2 - // 0x100 = Bubbler 2 - // 0x200 = Bluey 2 - // 0x400 = Smokey 2 - /* 0x000C */ u16 bosses; + // Boss bits: + // 0x001 = Wizpig 1 + // 0x002 = Tricky 1 + // 0x004 = Bubbler 1 + // 0x008 = Bluey 1 + // 0x010 = Smokey 1 + // 0x020 = Wizpig 2 + // 0x080 = Tricky 2 + // 0x100 = Bubbler 2 + // 0x200 = Bluey 2 + // 0x400 = Smokey 2 + /* 0x000C */ u16 bosses; - // Trophy bits: - // Bit field 0b00-0b11 = Empty, 3rd, 2nd, and 1st place trophies. - // `trophies` consists of 5 of these bit fields, from LSB to MSB, Dino, Sherbet, Snowflake, Dragon, and FFL. - /* 0x000E */ u16 trophies; + // Trophy bits: + // Bit field 0b00-0b11 = Empty, 3rd, 2nd, and 1st place trophies. + // `trophies` consists of 5 of these bit fields, from LSB to MSB, Dino, Sherbet, Snowflake, Dragon, and FFL. + /* 0x000E */ u16 trophies; - // Cutscene flags: - // 0x1 = Lighthouse rocket cutscene - // 0x2 = T.T. help prompt - // 0x4 = Adventure 2 flag? - // 0x8 = Dino domain boss cutscene - // 0x10 = Sherbet island boss cutscene - // 0x20 = Snowflake mountain boss cutscene - // 0x40 = Dragon forest boss cutscene - // 0x80 = Future Fun Land boss cutscene - // 0x100 = Dino domain boss cutscene 2 - // 0x200 = Shertbet island boss cutscene 2 - // 0x400 = Snowflake mountain boss cutscene 2 - // 0x800 = Dragon forest boss cutscene 2 - // 0x2000 = Wizpig face cutscene - // 0x4000 = Dino domain key cutscene - // 0x8000 = Sherbet Island key cutscene - // 0x10000 = Snowflake mountain key cutscene - // 0x20000 = Dragon forest key cutscene - /* 0x0010 */ u32 cutsceneFlags; - - // Taj flags: - // 0x1 = Car challenge unlocked - // 0x2 = Hover challenge unlocked - // 0x4 = Plane challenge unlocked - // 0x8 = Car challenge completed - // 0x10 = Hover challenge completed - // 0x20 = Plane challenge completed - /* 0x0014 */ u16 tajFlags; - - // Not a bitfield, just a counter from 0-4. - /* 0x0016 */ u8 ttAmulet; - - // Not a bitfield, just a counter from 0-4. - /* 0x0017 */ u8 wizpigAmulet; + // Cutscene flags: + // 0x1 = Lighthouse rocket cutscene + // 0x2 = T.T. help prompt + // 0x4 = Adventure 2 flag? + // 0x8 = Dino domain boss cutscene + // 0x10 = Sherbet island boss cutscene + // 0x20 = Snowflake mountain boss cutscene + // 0x40 = Dragon forest boss cutscene + // 0x80 = Future Fun Land boss cutscene + // 0x100 = Dino domain boss cutscene 2 + // 0x200 = Shertbet island boss cutscene 2 + // 0x400 = Snowflake mountain boss cutscene 2 + // 0x800 = Dragon forest boss cutscene 2 + // 0x2000 = Wizpig face cutscene + // 0x4000 = Dino domain key cutscene + // 0x8000 = Sherbet Island key cutscene + // 0x10000 = Snowflake mountain key cutscene + // 0x20000 = Dragon forest key cutscene + /* 0x0010 */ u32 cutsceneFlags; - /* 0x0018 */ u16 *flapInitialsPtr[3]; - /* 0x0024 */ u16 *flapTimesPtr[3]; - /* 0x0030 */ u16 *courseInitialsPtr[3]; - /* 0x003C */ u16 *courseTimesPtr[3]; - /* 0x0048 */ u8 worldId; - /* 0x0049 */ u8 courseId; - /* 0x004A */ u8 gNumRacers; - /* 0x004B */ u8 newGame; - /* 0x004C */ Settings4C *unk4C; - /* 0x0050 */ u32 filename; - /* 0x0054 */ Racer racers[8]; - /* 0x0114 */ s8 timeTrialRacer; - /* 0x0115 */ s8 unk115[2]; - /* 0x0117 */ s8 display_times; + // Taj flags: + // 0x1 = Car challenge unlocked + // 0x2 = Hover challenge unlocked + // 0x4 = Plane challenge unlocked + // 0x8 = Car challenge completed + // 0x10 = Hover challenge completed + // 0x20 = Plane challenge completed + /* 0x0014 */ u16 tajFlags; + + // Not a bitfield, just a counter from 0-4. + /* 0x0016 */ u8 ttAmulet; + + // Not a bitfield, just a counter from 0-4. + /* 0x0017 */ u8 wizpigAmulet; + + /* 0x0018 */ u16 *flapInitialsPtr[3]; + /* 0x0024 */ u16 *flapTimesPtr[3]; + /* 0x0030 */ u16 *courseInitialsPtr[3]; + /* 0x003C */ u16 *courseTimesPtr[3]; + /* 0x0048 */ u8 worldId; + /* 0x0049 */ u8 courseId; + /* 0x004A */ u8 gNumRacers; + /* 0x004B */ u8 newGame; + /* 0x004C */ Settings4C *unk4C; + /* 0x0050 */ u32 filename; + /* 0x0054 */ Racer racers[8]; + /* 0x0114 */ s8 timeTrialRacer; + /* 0x0115 */ s8 unk115[2]; + /* 0x0117 */ s8 display_times; } Settings; /* Size: 8 bytes */ typedef struct LevelHeader_70_18 { - s32 unk0; //0x0000001E - u8 red; //0xFF - u8 green; //0x70 - u8 blue; //0x00 - u8 alpha; //0xFF + s32 unk0; // 0x0000001E + u8 red; // 0xFF + u8 green; // 0x70 + u8 blue; // 0x00 + u8 alpha; // 0xFF } LevelHeader_70_18; typedef struct { - union { - struct { - u8 r; - u8 g; - u8 b; - u8 a; + union { + struct { + u8 r; + u8 g; + u8 b; + u8 a; + }; + u32 word; }; - u32 word; - }; } ColourRGBA; /* Unknown size */ typedef struct LevelHeader_70 { - /* 0x00 */ s32 unk0; //0x00000004 - /* 0x04 */ s32 unk4; //0x00000000 - /* 0x08 */ s32 unk8; //0x00000000 - /* 0x0C */ s32 unkC; //0x00000000 - /* 0x10 */ ColourRGBA rgba; - /* 0x14 */ ColourRGBA rgba2; - /* 0x18 */ LevelHeader_70_18 unk18[1]; // Actual length depends on unk0 + /* 0x00 */ s32 unk0; // 0x00000004 + /* 0x04 */ s32 unk4; // 0x00000000 + /* 0x08 */ s32 unk8; // 0x00000000 + /* 0x0C */ s32 unkC; // 0x00000000 + /* 0x10 */ ColourRGBA rgba; + /* 0x14 */ ColourRGBA rgba2; + /* 0x18 */ LevelHeader_70_18 unk18[1]; // Actual length depends on unk0 } LevelHeader_70; // Used to update the pulsating lights in Spaceport Alpha @@ -417,178 +421,179 @@ typedef struct PulsatingLightData { } PulsatingLightData; typedef struct ByteColour { - u8 red; - u8 green; - u8 blue; + u8 red; + u8 green; + u8 blue; } ByteColour; /* Size: 0xC4 bytes */ typedef struct LevelHeader { - /* 0x00 */ s8 world; - /* 0x01 */ u8 unk1; - /* 0x02 */ s8 unk2; - /* 0x03 */ s8 unk3; - /* 0x04 */ s8 unk4[4]; - /* 0x08 */ f32 course_height; - /* 0x0C */ u8 unkC[10]; - /* 0x16 */ u8 unk16[10]; - /* 0x20 */ s8 *AILevelTable; - /* 0x24 */ u8 pad24[6]; - /* 0x2A */ s8 unk2A[10]; - /* 0x34 */ s16 geometry; - /* 0x36 */ s16 collectables; // Objects such as bananas, balloons, etc. - /* 0x38 */ s16 skybox; + /* 0x00 */ s8 world; + /* 0x01 */ u8 unk1; + /* 0x02 */ s8 unk2; + /* 0x03 */ s8 unk3; + /* 0x04 */ s8 unk4[4]; + /* 0x08 */ f32 course_height; + /* 0x0C */ u8 unkC[10]; + /* 0x16 */ u8 unk16[10]; + /* 0x20 */ s8 *AILevelTable; + /* 0x24 */ u8 pad24[6]; + /* 0x2A */ s8 unk2A[10]; + /* 0x34 */ s16 geometry; + /* 0x36 */ s16 collectables; // Objects such as bananas, balloons, etc. + /* 0x38 */ s16 skybox; - // Fog related? - /* 0x3A */ s16 fogNear; - /* 0x3C */ s16 fogFar; - /* 0x3E */ s16 fogR; - /* 0x40 */ s16 fogG; - /* 0x42 */ s16 fogB; + // Fog related? + /* 0x3A */ s16 fogNear; + /* 0x3C */ s16 fogFar; + /* 0x3E */ s16 fogR; + /* 0x40 */ s16 fogG; + /* 0x42 */ s16 fogB; - /* 0x44 */ u8 unk44[0x5]; + /* 0x44 */ u8 unk44[0x5]; - /* 0x49 */ s8 skyDome; - /* 0x4A */ s8 playerIndex; - /* 0x4B */ s8 laps; - /* 0x4C */ s8 race_type; - /* 0x4D */ s8 vehicle; - /* 0x4E */ s8 available_vehicles; + /* 0x49 */ s8 skyDome; + /* 0x4A */ s8 playerIndex; + /* 0x4B */ s8 laps; + /* 0x4C */ s8 race_type; + /* 0x4D */ s8 vehicle; + /* 0x4E */ s8 available_vehicles; - /* 0x4F */ s8 unk4F[3]; + /* 0x4F */ s8 unk4F[3]; - /* 0x52 */ u8 music; - /* 0x53 */ u8 unk53; - /* 0x54 */ u16 instruments; - // Waves - /* 0x56 */ u8 waveSubdivisons; // values between 2 and 8 (except 5 and 7), used to determine waves count? - /* 0x57 */ u8 unk57; // possible values: 2,4,8,16,20, related to waves - /* 0x58 */ u8 waveSineStep0; // possible values: 1,2,4 - /* 0x59 */ u8 waveSineBase0; // always 0? - /* 0x5A */ s16 waveSineHeight0; // values between 512 and 4608 - /* 0x5C */ u8 waveSineStep1; // possible values: 1,2,4 - /* 0x5D */ u8 waveSineBase1; // always 0? - /* 0x5E */ s16 waveSineHeight1; // values between 512 and 4963 - /* 0x60 */ s16 waveSeedSize; // possible values: 120, 130, 157, 178, 187 - /* 0x62 */ s16 wavePower; // always 256 - /* 0x64 */ s16 unk64; // Always 153 except in Smokey Castle where it's 0 and the title screen where it's 256 (Some form of secondary power) - /* 0x66 */ s16 unk66; // values between 908 and 2560 - /* 0x68 */ s16 waveTexID; // always 62 except in the trophy race where it's 205 - /* 0x6A */ u8 waveUVScaleX; // values between 1 and 6 - /* 0x6B */ u8 waveUVScaleY; // values between 1 and 6 - /* 0x6C */ s8 waveUVScrollX; // values between 0 and 4 - /* 0x6D */ s8 waveUVScrollY; // values between 0 and 2 except in Hot Top Volcano where it's -2 - /* 0x6E */ s16 waveViewDist; // possible values: 3,5 + /* 0x52 */ u8 music; + /* 0x53 */ u8 unk53; + /* 0x54 */ u16 instruments; + // Waves + /* 0x56 */ u8 waveSubdivisons; // values between 2 and 8 (except 5 and 7), used to determine waves count? + /* 0x57 */ u8 unk57; // possible values: 2,4,8,16,20, related to waves + /* 0x58 */ u8 waveSineStep0; // possible values: 1,2,4 + /* 0x59 */ u8 waveSineBase0; // always 0? + /* 0x5A */ s16 waveSineHeight0; // values between 512 and 4608 + /* 0x5C */ u8 waveSineStep1; // possible values: 1,2,4 + /* 0x5D */ u8 waveSineBase1; // always 0? + /* 0x5E */ s16 waveSineHeight1; // values between 512 and 4963 + /* 0x60 */ s16 waveSeedSize; // possible values: 120, 130, 157, 178, 187 + /* 0x62 */ s16 wavePower; // always 256 + /* 0x64 */ s16 unk64; // Always 153 except in Smokey Castle where it's 0 and the title screen where it's 256 (Some + // form of secondary power) + /* 0x66 */ s16 unk66; // values between 908 and 2560 + /* 0x68 */ s16 waveTexID; // always 62 except in the trophy race where it's 205 + /* 0x6A */ u8 waveUVScaleX; // values between 1 and 6 + /* 0x6B */ u8 waveUVScaleY; // values between 1 and 6 + /* 0x6C */ s8 waveUVScrollX; // values between 0 and 4 + /* 0x6D */ s8 waveUVScrollY; // values between 0 and 2 except in Hot Top Volcano where it's -2 + /* 0x6E */ s16 waveViewDist; // possible values: 3,5 - //waves_init_header Seems to use this struct, and it differs on unk70 only. - union { - /* 0x70 */ LevelHeader_70 *unk70[1]; // unknown size, however only size of 1 matches - struct { - /* 0x70 */ u8 wavesXlu; // always 1 except in Hot Top Volcano where it's 0 - /* 0x71 */ u8 waveDoubleDensity; // possible values: 0,1 - }; - }; + // waves_init_header Seems to use this struct, and it differs on unk70 only. + union { + /* 0x70 */ LevelHeader_70 *unk70[1]; // unknown size, however only size of 1 matches + struct { + /* 0x70 */ u8 wavesXlu; // always 1 except in Hot Top Volcano where it's 0 + /* 0x71 */ u8 waveDoubleDensity; // possible values: 0,1 + }; + }; - /* 0x74 */ LevelHeader_70 *unk74[7]; + /* 0x74 */ LevelHeader_70 *unk74[7]; - // Weather related? - /* 0x90 */ s16 weatherEnable; // This affects snow density, but for rain, it simply needs to be nonzero. - /* 0x92 */ s16 weatherType; - /* 0x94 */ u8 weatherIntensity; - /* 0x95 */ u8 weatherOpacity; - /* 0x96 */ s16 weatherVelX; - /* 0x98 */ s16 weatherVelY; - /* 0x9A */ s16 weatherVelZ; + // Weather related? + /* 0x90 */ s16 weatherEnable; // This affects snow density, but for rain, it simply needs to be nonzero. + /* 0x92 */ s16 weatherType; + /* 0x94 */ u8 weatherIntensity; + /* 0x95 */ u8 weatherOpacity; + /* 0x96 */ s16 weatherVelX; + /* 0x98 */ s16 weatherVelY; + /* 0x9A */ s16 weatherVelZ; - /* 0x9C */ s8 cameraFOV; // Must be a value within [0, 90] - /* 0x9D */ u8 bgColorRed; - /* 0x9E */ u8 bgColorGreen; - /* 0x9F */ u8 bgColorBlue; - /* 0xA0 */ u8 unkA0; - /* 0xA1 */ u8 unkA1; - /* 0xA2 */ s8 unkA2; - /* 0xA3 */ s8 unkA3; - /* 0xA4 */ TextureHeader *unkA4; - /* 0xA8 */ s16 unkA8; - /* 0xAA */ s16 unkAA; - /* 0xAC */ PulsatingLightData *pulseLightData; + /* 0x9C */ s8 cameraFOV; // Must be a value within [0, 90] + /* 0x9D */ u8 bgColorRed; + /* 0x9E */ u8 bgColorGreen; + /* 0x9F */ u8 bgColorBlue; + /* 0xA0 */ u8 unkA0; + /* 0xA1 */ u8 unkA1; + /* 0xA2 */ s8 unkA2; + /* 0xA3 */ s8 unkA3; + /* 0xA4 */ TextureHeader *unkA4; + /* 0xA8 */ s16 unkA8; + /* 0xAA */ s16 unkAA; + /* 0xAC */ PulsatingLightData *pulseLightData; - /* 0xB0 */ s16 unkB0; - /* 0xB2 */ u8 unkB2; - /* 0xB3 */ u8 voiceLimit; - /* 0xB4 */ ByteColour voidColour; - /* 0xB7 */ u8 useVoid; // Disallow the player from looking through walls by drawing a blank screen behind walls. - /* 0xB8 */ s8 bossRaceID; - /* 0xB9 */ u8 unkB9; - /* 0xBA */ s16 unkBA; - /* 0xBC */ u8 unkBC; - /* 0xBD */ s8 unkBD; - // Multiplayer gradient background - /* 0xBE */ u8 BGColourBottomR; - /* 0xBF */ u8 BGColourBottomG; - /* 0xC0 */ u8 BGColourBottomB; - /* 0xC1 */ u8 BGColourTopR; - /* 0xC2 */ u8 BGColourTopG; - /* 0xC3 */ u8 BGColourTopB; + /* 0xB0 */ s16 unkB0; + /* 0xB2 */ u8 unkB2; + /* 0xB3 */ u8 voiceLimit; + /* 0xB4 */ ByteColour voidColour; + /* 0xB7 */ u8 useVoid; // Disallow the player from looking through walls by drawing a blank screen behind walls. + /* 0xB8 */ s8 bossRaceID; + /* 0xB9 */ u8 unkB9; + /* 0xBA */ s16 unkBA; + /* 0xBC */ u8 unkBC; + /* 0xBD */ s8 unkBD; + // Multiplayer gradient background + /* 0xBE */ u8 BGColourBottomR; + /* 0xBF */ u8 BGColourBottomG; + /* 0xC0 */ u8 BGColourBottomB; + /* 0xC1 */ u8 BGColourTopR; + /* 0xC2 */ u8 BGColourTopG; + /* 0xC3 */ u8 BGColourTopB; } LevelHeader; /* Size: 0x50 bytes */ typedef struct { - /* 0x00 */ u32 unk00; - /* 0x04 */ u32 unk04; - /* 0x08 */ u32 unk08; - /* 0x0C */ f32 unk0C; - /* 0x10 */ u32 unk10; - /* 0x14 */ u32 unk14; - /* 0x18 */ f32 unk18; - /* 0x1C */ u32 unk1C; - /* 0x20 */ u32 unk20; - /* 0x24 */ u32 unk24; - /* 0x28 */ u32 unk28; - /* 0x2C */ u32 unk2C; - /* 0x30 */ u32 unk30; - /* 0x34 */ u32 unk34; - /* 0x38 */ u32 unk38; - /* 0x3C */ u32 unk3C; - /* 0x40 */ f32 unk40; - /* 0x44 */ f32 unk44; - /* 0x48 */ f32 unk48; - /* 0x4C */ u32 unk4C; + /* 0x00 */ u32 unk00; + /* 0x04 */ u32 unk04; + /* 0x08 */ u32 unk08; + /* 0x0C */ f32 unk0C; + /* 0x10 */ u32 unk10; + /* 0x14 */ u32 unk14; + /* 0x18 */ f32 unk18; + /* 0x1C */ u32 unk1C; + /* 0x20 */ u32 unk20; + /* 0x24 */ u32 unk24; + /* 0x28 */ u32 unk28; + /* 0x2C */ u32 unk2C; + /* 0x30 */ u32 unk30; + /* 0x34 */ u32 unk34; + /* 0x38 */ u32 unk38; + /* 0x3C */ u32 unk3C; + /* 0x40 */ f32 unk40; + /* 0x44 */ f32 unk44; + /* 0x48 */ f32 unk48; + /* 0x4C */ u32 unk4C; } dkr_wave_t; /* Size: 8 bytes */ typedef struct TextureInfo { -/* 0x00 */ TextureHeader *texture; -/* 0x04 */ u8 width; -/* 0x05 */ u8 height; -/* 0x06 */ u8 format; -/* 0x07 */ s8 unk7; + /* 0x00 */ TextureHeader *texture; + /* 0x04 */ u8 width; + /* 0x05 */ u8 height; + /* 0x06 */ u8 format; + /* 0x07 */ s8 unk7; } TextureInfo; /* Size: 10 bytes */ typedef struct Vertex { -/* 0x00 */ s16 x; -/* 0x02 */ s16 y; -/* 0x04 */ s16 z; -/* 0x06 */ u8 r; -/* 0x07 */ u8 g; -/* 0x08 */ u8 b; -/* 0x09 */ u8 a; + /* 0x00 */ s16 x; + /* 0x02 */ s16 y; + /* 0x04 */ s16 z; + /* 0x06 */ u8 r; + /* 0x07 */ u8 g; + /* 0x08 */ u8 b; + /* 0x09 */ u8 a; } Vertex; /* Size: 4 bytes */ typedef struct TexCoords { union { - struct { - s16 u, v; - }; - u32 texCoords; // For convenience? + struct { + s16 u, v; + }; + u32 texCoords; // For convenience? }; } TexCoords; #define BACKFACE_CULL 0x00 #define BACKFACE_DRAW 0x40 -#define TRI_FLAG_80 0x80 +#define TRI_FLAG_80 0x80 #define DKR_TRIANGLE(flags, ind0, ind1, ind2) (((flags) << 24) | ((ind0) << 16) | ((ind1) << 8) | ((ind2) << 0)) @@ -597,27 +602,27 @@ typedef struct Triangle { union { struct { /* 0x00 */ u8 flags; // 0x40 = Draw backface, 0x00 = Cull backface - /* 0x01 */ u8 vi0; // First vertex index - /* 0x02 */ u8 vi1; // Second vertex index - /* 0x03 */ u8 vi2; // Third vertex index + /* 0x01 */ u8 vi0; // First vertex index + /* 0x02 */ u8 vi1; // Second vertex index + /* 0x03 */ u8 vi2; // Third vertex index }; - /* 0x00 */ u32 vertices; // For convenience? - u8 verticesArray[4]; + /* 0x00 */ u32 vertices; // For convenience? + u8 verticesArray[4]; }; -/* 0x04 */ TexCoords uv0; // Texture coordinates for the first vertex -/* 0x08 */ TexCoords uv1; // Texture coordinates for the second vertex -/* 0x0C */ TexCoords uv2; // Texture coordinates for the third vertex + /* 0x04 */ TexCoords uv0; // Texture coordinates for the first vertex + /* 0x08 */ TexCoords uv1; // Texture coordinates for the second vertex + /* 0x0C */ TexCoords uv2; // Texture coordinates for the third vertex } Triangle; /* Size: 12 bytes */ typedef struct TriangleBatchInfo { -/* 0x00 */ u8 textureIndex; // 0xFF = No texture -/* 0x01 */ s8 vertOverride; // If used, will end a draw this many verts in, so it can do something mid mesh. -/* 0x02 */ s16 verticesOffset; -/* 0x04 */ s16 facesOffset; -/* 0x06 */ u8 miscData; // 0xFF = vertex colors, otherwise use dynamic lighting normals (Objects only) -/* 0x07 */ u8 texOffset; -/* 0x08 */ u32 flags; // See RenderFlags in textures_sprites.c + /* 0x00 */ u8 textureIndex; // 0xFF = No texture + /* 0x01 */ s8 vertOverride; // If used, will end a draw this many verts in, so it can do something mid mesh. + /* 0x02 */ s16 verticesOffset; + /* 0x04 */ s16 facesOffset; + /* 0x06 */ u8 miscData; // 0xFF = vertex colors, otherwise use dynamic lighting normals (Objects only) + /* 0x07 */ u8 texOffset; + /* 0x08 */ u32 flags; // See RenderFlags in textures_sprites.c } TriangleBatchInfo; #define BATCH_VTX_COL 0xFF @@ -625,10 +630,10 @@ typedef struct TriangleBatchInfo { /* Size: 8 bytes */ typedef struct ObjectModel_44 { union { -/* 0x00 */ s32 *anim; -/* 0x00 */ u8 *animData; + /* 0x00 */ s32 *anim; + /* 0x00 */ u8 *animData; }; -/* 0x04 */ s32 animLength; // Animation length is the result of 16-frame length keyframes. + /* 0x04 */ s32 animLength; // Animation length is the result of 16-frame length keyframes. } ObjectModel_44; typedef struct ObjectModel_C { @@ -643,9 +648,9 @@ typedef struct ObjectModel_10 { } ObjectModel_10; typedef struct ObjectModel { - /* 0x00 */ TextureInfo* textures; - /* 0x04 */ Vertex* vertices; - /* 0x08 */ Triangle* triangles; + /* 0x00 */ TextureInfo *textures; + /* 0x04 */ Vertex *vertices; + /* 0x08 */ Triangle *triangles; /* 0x0C */ ObjectModel_C *unkC; /* 0x10 */ ObjectModel_10 *unk10; /* 0x14 */ s16 *unk14; @@ -663,10 +668,10 @@ typedef struct ObjectModel { /* 0x30 */ s16 references; /* 0x32 */ s16 unk32; /* 0x34 */ u8 pad34[4]; - /* 0x38 */ TriangleBatchInfo* batches; + /* 0x38 */ TriangleBatchInfo *batches; /* 0x3C */ f32 unk3C; - /* 0x40 */ Vec3s* normals; - /* 0x44 */ ObjectModel_44* animations; + /* 0x40 */ Vec3s *normals; + /* 0x44 */ ObjectModel_44 *animations; /* 0x48 */ s16 numberOfAnimations; /* 0x4A */ s16 unk4A; /* 0x4C */ s32 *unk4C; @@ -698,32 +703,32 @@ typedef struct CollisionNode { /* Size: 0x44 bytes */ typedef struct LevelModelSegment { -/* 0x00 */ Vertex *vertices; -/* 0x04 */ Triangle *triangles; -/* 0x08 */ s32 unk8; -/* 0x0C */ TriangleBatchInfo *batches; -/* 0x10 */ s16 *unk10; -/* 0x14 */ CollisionNode *unk14; -union { -/* 0x18 */ f32 *unk18; -/* 0x18 */ Vec4f *unk18_vec4f; // Used for objects, not levels. -}; -/* 0x1C */ s16 numberOfVertices; -/* 0x1E */ s16 numberOfTriangles; -/* 0x20 */ s16 numberOfBatches; - u8 pad22[0x06]; -/* 0x28 */ s16 unk28; -/* 0x2A */ s8 unk2A; -/* 0x2B */ s8 hasWaves; -/* 0x2C */ Vertex *unk2C; -/* 0x30 */ s16 unk30; -/* 0x32 */ s16 unk32; - s16 *unk34; -/* 0x38 */ s16 unk38; - u8 pad3A[2]; -/* 0x3C */ s32 unk3C; -/* 0x40 */ u8 numberofOpaqueBatches; - u8 pad41[0x3]; + /* 0x00 */ Vertex *vertices; + /* 0x04 */ Triangle *triangles; + /* 0x08 */ s32 unk8; + /* 0x0C */ TriangleBatchInfo *batches; + /* 0x10 */ s16 *unk10; + /* 0x14 */ CollisionNode *unk14; + union { + /* 0x18 */ f32 *unk18; + /* 0x18 */ Vec4f *unk18_vec4f; // Used for objects, not levels. + }; + /* 0x1C */ s16 numberOfVertices; + /* 0x1E */ s16 numberOfTriangles; + /* 0x20 */ s16 numberOfBatches; + u8 pad22[0x06]; + /* 0x28 */ s16 unk28; + /* 0x2A */ s8 unk2A; + /* 0x2B */ s8 hasWaves; + /* 0x2C */ Vertex *unk2C; + /* 0x30 */ s16 unk30; + /* 0x32 */ s16 unk32; + s16 *unk34; + /* 0x38 */ s16 unk38; + u8 pad3A[2]; + /* 0x3C */ s32 unk3C; + /* 0x40 */ u8 numberofOpaqueBatches; + u8 pad41[0x3]; } LevelModelSegment; typedef struct LevelModelSegmentBoundingBox { @@ -737,46 +742,46 @@ typedef struct LevelModelSegmentBoundingBox { /* Size: 8 bytes */ typedef struct BspTreeNode { -/* 0x00 */ s16 leftNode; // less than split value -/* 0x02 */ s16 rightNode; // greater or equal to split value? -/* 0x04 */ u8 splitType; // 0 = Camera X, 1 = Camera Y, 2 = Camera Z -/* 0x05 */ u8 segmentIndex; -/* 0x06 */ s16 splitValue; // Decides left or right + /* 0x00 */ s16 leftNode; // less than split value + /* 0x02 */ s16 rightNode; // greater or equal to split value? + /* 0x04 */ u8 splitType; // 0 = Camera X, 1 = Camera Y, 2 = Camera Z + /* 0x05 */ u8 segmentIndex; + /* 0x06 */ s16 splitValue; // Decides left or right } BspTreeNode; typedef struct LevelModel { -/* 0x00 */ TextureInfo *textures; -/* 0x04 */ LevelModelSegment *segments; -/* 0x08 */ LevelModelSegmentBoundingBox *segmentsBoundingBoxes; -/* 0x0C */ u8 *unkC; //Unused? -/* 0x10 */ u8 *segmentsBitfields; -/* 0x14 */ BspTreeNode *segmentsBspTree; -/* 0x18 */ s16 numberOfTextures; -/* 0x1A */ s16 numberOfSegments; -/* 0x1C */ s16 unk1C; // Unused? -/* 0x1E */ s16 numberOfAnimatedTextures; -/* 0x20 */ s32 minimapSpriteIndex; -/* 0x24 */ u16 minimapRotation; // angle for icons on minimap? -/* 0x26 */ u16 unk26; // Unused? Common values: 0x0009, 0xFFFF, 0x0303 -/* 0x28 */ f32 minimapXScale; -/* 0x2C */ f32 minimapYScale; -/* 0x30 */ s16 minimapOffsetXAdv1; // minimap X offset (Adventure 1) -/* 0x32 */ s16 minimapOffsetYAdv1; // minimap Y offset (Adventure 1) -/* 0x34 */ s16 minimapOffsetXAdv2; // minimap X offset (Adventure 2) -/* 0x36 */ s16 minimapOffsetYAdv2; // minimap Y offset (Adventure 2) -/* 0x38 */ u32 minimapColor; -/* 0x3C */ s16 lowerXBounds; -/* 0x3E */ s16 upperXBounds; -/* 0x40 */ s16 lowerYBounds; -/* 0x42 */ s16 upperYBounds; -/* 0x44 */ s16 lowerZBounds; -/* 0x46 */ s16 upperZBounds; -/* 0x48 */ s32 modelSize; + /* 0x00 */ TextureInfo *textures; + /* 0x04 */ LevelModelSegment *segments; + /* 0x08 */ LevelModelSegmentBoundingBox *segmentsBoundingBoxes; + /* 0x0C */ u8 *unkC; // Unused? + /* 0x10 */ u8 *segmentsBitfields; + /* 0x14 */ BspTreeNode *segmentsBspTree; + /* 0x18 */ s16 numberOfTextures; + /* 0x1A */ s16 numberOfSegments; + /* 0x1C */ s16 unk1C; // Unused? + /* 0x1E */ s16 numberOfAnimatedTextures; + /* 0x20 */ s32 minimapSpriteIndex; + /* 0x24 */ u16 minimapRotation; // angle for icons on minimap? + /* 0x26 */ u16 unk26; // Unused? Common values: 0x0009, 0xFFFF, 0x0303 + /* 0x28 */ f32 minimapXScale; + /* 0x2C */ f32 minimapYScale; + /* 0x30 */ s16 minimapOffsetXAdv1; // minimap X offset (Adventure 1) + /* 0x32 */ s16 minimapOffsetYAdv1; // minimap Y offset (Adventure 1) + /* 0x34 */ s16 minimapOffsetXAdv2; // minimap X offset (Adventure 2) + /* 0x36 */ s16 minimapOffsetYAdv2; // minimap Y offset (Adventure 2) + /* 0x38 */ u32 minimapColor; + /* 0x3C */ s16 lowerXBounds; + /* 0x3E */ s16 upperXBounds; + /* 0x40 */ s16 lowerYBounds; + /* 0x42 */ s16 upperYBounds; + /* 0x44 */ s16 lowerZBounds; + /* 0x46 */ s16 upperZBounds; + /* 0x48 */ s32 modelSize; } LevelModel; typedef struct ObjHeaderParticleEntry { - /* 0x00 */ s32 upper; - /* 0x04 */ s32 lower; + /* 0x00 */ s32 upper; + /* 0x04 */ s32 lower; } ObjHeaderParticleEntry; // Size: 0x18 bytes @@ -787,7 +792,7 @@ typedef struct ObjectHeader24 { u8 unk3; u8 unk4; u8 unk5; - u16 unk6; //Misc Asset Id? + u16 unk6; // Misc Asset Id? union { u32 unk8; struct { @@ -806,74 +811,75 @@ typedef struct ObjectHeader24 { } ObjectHeader24; typedef struct ObjectHeader { - /* 0x00 */ s32 unk0; // The one use I've seen for this so far is water effect animation speed. - /* 0x04 */ f32 shadowScale; - /* 0x08 */ f32 unk8; - /* 0x0C */ f32 scale; - /* 0x10 */ s32 *modelIds; - /* 0x14 */ s32 *vehiclePartIds; - /* 0x18 */ s8 *vehiclePartIndices; - /* 0x1C */ ObjHeaderParticleEntry *objectParticles; - s32 pad20; - /* 0x24 */ ObjectHeader24 *unk24; - /* 0x28 */ f32 shadeAmbient; - /* 0x2C */ f32 shadeDiffuse; - /* 0x30 */ u16 flags; - /* 0x32 */ s16 shadowGroup; - /* 0x34 */ s16 unk34; - /* 0x36 */ s16 waterEffectGroup; - /* 0x38 */ s16 unk38; - /* 0x3A */ u8 unk3A; - /* 0x3B */ u8 unk3B; - /* 0x3C */ u8 unk3C; - /* 0x3D */ u8 unk3D; - /* 0x3E */ s16 shadeAngleY; - /* 0x40 */ s16 shadeAngleZ; - /* 0x42 */ s16 unk42; - /* 0x44 */ s16 unk44; - /* 0x48 */ s16 shadowBottom; // Lower bounds for shadow - /* 0x48 */ s16 shadowTop; // Upper bounds for shadow - /* 0x4A */ s16 shadowFadeMin; // Close reference distance for shadow opacity - /* 0x4C */ s16 shadowFadeMax; // Far reference distance for shadow opacity - /* 0x4E */ s16 drawDistance; - /* 0x50 */ s16 unk50; - /* 0x52 */ s8 unk52; - /* 0x53 */ s8 modelType; - /* 0x54 */ s8 behaviorId; - /* 0x55 */ s8 numberOfModelIds; // size of array pointed by Object->unk68 - /* 0x56 */ s8 attachPointCount; - /* 0x57 */ s8 particleCount; // Number of different particle types that are attached - /* 0x58 */ s8 unk58; - /* 0x59 */ u8 pad59; - /* 0x5A */ s8 numLightSources; - /* 0x5B */ u8 unk5B; - /* 0x5C */ u8 unk5C; - /* 0x5D */ u8 unk5D; //Misc Asset index? - /* 0x5E */ u8 pad5E[0x2]; - /* 0x60 */ char internalName[16]; - /* 0x70 */ u8 unk70; - /* 0x71 */ u8 directionalPointLighting; // If enabled, the model is lit from the direction of the light source; if disabled, lighting is applied evenly from all sides - /* 0x72 */ u8 unk72; - /* 0x73 */ u8 unk73; - /* 0x74 */ s8 unk74; - /* 0x75 */ s8 unk75; - /* 0x76 */ u8 unk76; - /* 0x77 */ u8 unk77; + /* 0x00 */ s32 unk0; // The one use I've seen for this so far is water effect animation speed. + /* 0x04 */ f32 shadowScale; + /* 0x08 */ f32 unk8; + /* 0x0C */ f32 scale; + /* 0x10 */ s32 *modelIds; + /* 0x14 */ s32 *vehiclePartIds; + /* 0x18 */ s8 *vehiclePartIndices; + /* 0x1C */ ObjHeaderParticleEntry *objectParticles; + s32 pad20; + /* 0x24 */ ObjectHeader24 *unk24; + /* 0x28 */ f32 shadeAmbient; + /* 0x2C */ f32 shadeDiffuse; + /* 0x30 */ u16 flags; + /* 0x32 */ s16 shadowGroup; + /* 0x34 */ s16 unk34; + /* 0x36 */ s16 waterEffectGroup; + /* 0x38 */ s16 unk38; + /* 0x3A */ u8 unk3A; + /* 0x3B */ u8 unk3B; + /* 0x3C */ u8 unk3C; + /* 0x3D */ u8 unk3D; + /* 0x3E */ s16 shadeAngleY; + /* 0x40 */ s16 shadeAngleZ; + /* 0x42 */ s16 unk42; + /* 0x44 */ s16 unk44; + /* 0x48 */ s16 shadowBottom; // Lower bounds for shadow + /* 0x48 */ s16 shadowTop; // Upper bounds for shadow + /* 0x4A */ s16 shadowFadeMin; // Close reference distance for shadow opacity + /* 0x4C */ s16 shadowFadeMax; // Far reference distance for shadow opacity + /* 0x4E */ s16 drawDistance; + /* 0x50 */ s16 unk50; + /* 0x52 */ s8 unk52; + /* 0x53 */ s8 modelType; + /* 0x54 */ s8 behaviorId; + /* 0x55 */ s8 numberOfModelIds; // size of array pointed by Object->unk68 + /* 0x56 */ s8 attachPointCount; + /* 0x57 */ s8 particleCount; // Number of different particle types that are attached + /* 0x58 */ s8 unk58; + /* 0x59 */ u8 pad59; + /* 0x5A */ s8 numLightSources; + /* 0x5B */ u8 unk5B; + /* 0x5C */ u8 unk5C; + /* 0x5D */ u8 unk5D; // Misc Asset index? + /* 0x5E */ u8 pad5E[0x2]; + /* 0x60 */ char internalName[16]; + /* 0x70 */ u8 unk70; + /* 0x71 */ u8 directionalPointLighting; // If enabled, the model is lit from the direction of the light source; if + // disabled, lighting is applied evenly from all sides + /* 0x72 */ u8 unk72; + /* 0x73 */ u8 unk73; + /* 0x74 */ s8 unk74; + /* 0x75 */ s8 unk75; + /* 0x76 */ u8 unk76; + /* 0x77 */ u8 unk77; } ObjectHeader; typedef struct ObjectInteraction { - /* 0x00 */ struct Object *obj; - /* 0x04 */ f32 x_position; - /* 0x08 */ f32 y_position; - /* 0x0C */ f32 z_position; - /* 0x10 */ s8 hitboxRadius; - /* 0x11 */ u8 unk11; - /* 0x12 */ u8 pushForce; - /* 0x13 */ u8 distance; - /* 0x14 */ s16 flags; - /* 0x16 */ s8 unk16; - /* 0x17 */ s8 unk17; - /* 0x18 */ s32 pad[4]; + /* 0x00 */ struct Object *obj; + /* 0x04 */ f32 x_position; + /* 0x08 */ f32 y_position; + /* 0x0C */ f32 z_position; + /* 0x10 */ s8 hitboxRadius; + /* 0x11 */ u8 unk11; + /* 0x12 */ u8 pushForce; + /* 0x13 */ u8 distance; + /* 0x14 */ s16 flags; + /* 0x16 */ s8 unk16; + /* 0x17 */ s8 unk17; + /* 0x18 */ s32 pad[4]; } ObjectInteraction; typedef struct ShadowData { @@ -929,173 +935,116 @@ typedef struct ShadeProperties { typedef f32 FakeHalfMatrix[2][4]; typedef struct Object_5C { union { - /* 0x0000 */ MtxF matrices[4]; - /* 0x0000 */ FakeHalfMatrix _matrices[8]; // This is a hack. The MtxF[4] is the real one. - }; - /* 0x0100 */ void *unk100; - /* 0x0104 */ u8 unk104; - /* 0x0105 */ u8 unk105; - /* 0x0106 */ u8 unk106; - /* 0x0107 */ u8 unk107; - /* 0x0108 */ s32 unk108; + /* 0x0000 */ MtxF matrices[4]; + /* 0x0000 */ FakeHalfMatrix _matrices[8]; // This is a hack. The MtxF[4] is the real one. + }; + /* 0x0100 */ void *unk100; + /* 0x0104 */ u8 unk104; + /* 0x0105 */ u8 unk105; + /* 0x0106 */ u8 unk106; + /* 0x0107 */ u8 unk107; + /* 0x0108 */ s32 unk108; } Object_5C; typedef struct AttachPoint { - s32 count; // Number of active attach points. + s32 count; // Number of active attach points. struct Object *obj[10]; // Object Ptr List for attachments. - s8 *unk2C; // Attachment indices. + s8 *unk2C; // Attachment indices. } AttachPoint; typedef struct Object_LaserGun { - /* 0x00 */ s32 unk0; - /* 0x00 */ s32 unk4; - /* 0x00 */ s32 unk7; - /* 0x0C */ s16 fireTimer; - /* 0x0E */ s8 targeting; - /* 0x0F */ s8 fireRate; - /* 0x10 */ u8 laserDuration; - /* 0x11 */ u8 radius; + /* 0x00 */ s32 unk0; + /* 0x00 */ s32 unk4; + /* 0x00 */ s32 unk7; + /* 0x0C */ s16 fireTimer; + /* 0x0E */ s8 targeting; + /* 0x0F */ s8 fireRate; + /* 0x10 */ u8 laserDuration; + /* 0x11 */ u8 radius; } Object_LaserGun; -typedef struct Object_Laser { - /* 0x000 */ s16 unk0; - /* 0x004 */ u8 unk4[0x185]; - /* 0x187 */ s8 unk187; -} Object_Laser; - -typedef struct Object_TrophyCabinet { - /* 0x0 */ s32 unk0; - /* 0x4 */ s16 unk4; -} Object_TrophyCabinet; +typedef struct JingleState { + /* 0x0 */ s32 timer; + /* 0x4 */ s16 cooldown; +} JingleState; typedef struct Object_Animator { - /* 0x00 */ s16 segmentId; - /* 0x02 */ s16 batchId; - /* 0x04 */ s16 speedFactorX; - /* 0x06 */ s16 speedFactorY; - /* 0x08 */ s16 xSpeed; - /* 0x0A */ s16 ySpeed; + /* 0x00 */ s16 segmentId; + /* 0x02 */ s16 batchId; + /* 0x04 */ s16 speedFactorX; + /* 0x06 */ s16 speedFactorY; + /* 0x08 */ s16 xSpeed; + /* 0x0A */ s16 ySpeed; } Object_Animator; -typedef struct Object_Animation { - /* 0x00 */ f32 unk0; - /* 0x04 */ f32 unk4; - /* 0x08 */ f32 unk8; - /* 0x0C */ f32 x; - /* 0x10 */ f32 y; - /* 0x14 */ f32 z; - /* 0x18 */ SoundHandle unk18; - /* 0x1C */ struct Object *unk1C; - /* 0x20 */ s32 unk20; - /* 0x24 */ s16 unk24; - /* 0x26 */ s16 unk26; - /* 0x28 */ u16 unk28; - /* 0x2A */ u16 startDelay; - /* 0x2C */ u8 unk2C; - /* 0x2D */ u8 unk2D; - /* 0x2E */ u8 unk2E; - /* 0x2F */ u8 unk2F; - /* 0x30 */ s8 cameraID; - /* 0x31 */ u8 unk31; - /* 0x32 */ u8 unk32; - /* 0x33 */ u8 unk33; - /* 0x34 */ u8 unk34; - /* 0x35 */ u8 unk35; - /* 0x36 */ s16 pauseCounter; - /* 0x38 */ u8 unk38; - /* 0x39 */ u8 unk39; - /* 0x3A */ u8 unk3A; - /* 0x3V */ u8 unk3B; - /* 0x3C */ u8 unk3C; - /* 0x3D */ u8 unk3D; - /* 0x3E */ s8 unk3E; - /* 0x3F */ s8 unk3F; - /* 0x40 */ u8 unk40; - /* 0x41 */ u8 unk41; - /* 0x42 */ u8 unk42; - /* 0x43 */ u8 unk43; - /* 0x44 */ u8 unk44; - /* 0x45 */ u8 unk45; - /* 0x46 */ u8 pad46[4]; - /* 0x4A */ s16 unk4A; - /* 0x4C */ u8 pad4C[0x10]; - /* 0x5C */ s32 unk5C; -} Object_Animation; - -typedef struct Object_Animation2 { - /* 0x00 */ u8 pad0[6]; - /* 0x06 */ s16 flags; -} Object_Animation2; - typedef struct Object_OverridePos { - /* 0x00 */ f32 x; - /* 0x04 */ f32 y; - /* 0x08 */ f32 z; - /* 0x0C */ Object_Animation *anim; + /* 0x00 */ f32 x; + /* 0x04 */ f32 y; + /* 0x08 */ f32 z; + /* 0x0C */ struct Object *anim; } Object_OverridePos; typedef struct Object_WeaponBalloon { - /* 0x0 */ f32 scale; - /* 0x4 */ s16 respawnTime; - /* 0x6 */ s8 unk6[0x2]; + /* 0x0 */ f32 scale; + /* 0x4 */ s16 respawnTime; } Object_WeaponBalloon; typedef struct Object_Weapon { - /* 0x00 */ struct Object *target; - /* 0x04 */ struct Object *owner; - /* 0x08 */ struct Object *hitObj; - /* 0x0C */ f32 checkpointDist; - /* 0x10 */ f32 forwardVel; - /* 0x14 */ s16 unk14; - /* 0x14 */ s16 unk16; - /* 0x18 */ u8 weaponID; - /* 0x19 */ s8 checkpoint; - /* 0x1A */ s16 unk1A; - /* 0x1C */ struct AudioPoint *soundMask; + /* 0x00 */ struct Object *target; + /* 0x04 */ struct Object *owner; + /* 0x08 */ struct Object *hitObj; + /* 0x0C */ f32 checkpointDist; + /* 0x10 */ f32 forwardVel; + /* 0x14 */ s16 unk14; + /* 0x14 */ s16 unk16; + /* 0x18 */ u8 weaponID; + /* 0x19 */ s8 checkpoint; + /* 0x1A */ s16 unk1A; + /* 0x1C */ struct AudioPoint *soundMask; } Object_Weapon; typedef struct Object_Butterfly { - /* 0x000 */ Triangle triangles[8]; - /* 0x080 */ Vertex vertices[12]; - /* 0x0F8 */ TextureHeader *texture; - /* 0x0FC */ u8 unkFC; - /* 0x0FD */ u8 unkFD; - /* 0x0FE */ u8 unkFE; - /* 0x0FF */ u8 unkFF; - /* 0x100 */ struct Object *unk100; - /* 0x104 */ u16 unk104; - /* 0x106 */ s16 unk106; - /* 0x108 */ f32 unk108; - /* 0x10C */ f32 unk10C; + /* 0x000 */ Triangle triangles[8]; + /* 0x080 */ Vertex vertices[12]; + /* 0x0F8 */ TextureHeader *texture; + /* 0x0FC */ u8 unkFC; + /* 0x0FD */ u8 unkFD; + /* 0x0FE */ u8 unkFE; + /* 0x0FF */ u8 unkFF; + /* 0x100 */ struct Object *unk100; + /* 0x104 */ u16 unk104; + /* 0x106 */ s16 unk106; + /* 0x108 */ f32 unk108; + /* 0x10C */ f32 unk10C; } Object_Butterfly; typedef struct Object_Fish { - /* 0x000 */ Triangle triangles[8]; - /* 0x080 */ Vertex vertices[12]; - /* 0x0F8 */ TextureHeader *texture; - /* 0x0FC */ u8 unkFC; - /* 0x0FD */ u8 unkFD; - /* 0x0FE */ s16 unkFE; - /* 0x100 */ s16 unk100; - /* 0x102 */ s16 unk102; - /* 0x104 */ s16 unk104; - /* 0x106 */ s16 unk106; - /* 0x108 */ f32 unk108; - /* 0x10C */ f32 unk10C; - /* 0x110 */ f32 unk110; - /* 0x114 */ f32 unk114; - /* 0x118 */ f32 unk118; - /* 0x11c */ f32 unk11C; + /* 0x000 */ Triangle triangles[8]; + /* 0x080 */ Vertex vertices[12]; + /* 0x0F8 */ TextureHeader *texture; + /* 0x0FC */ u8 unkFC; + /* 0x0FD */ u8 unkFD; + /* 0x0FE */ s16 unkFE; + /* 0x100 */ s16 unk100; + /* 0x102 */ s16 unk102; + /* 0x104 */ s16 unk104; + /* 0x106 */ s16 unk106; + /* 0x108 */ f32 unk108; + /* 0x10C */ f32 unk10C; + /* 0x110 */ f32 unk110; + /* 0x114 */ f32 unk114; + /* 0x118 */ f32 unk118; + /* 0x11c */ f32 unk11C; } Object_Fish; typedef struct Object_Boost_Inner { - Vec3f position; - f32 unkC; - f32 unk10; - f32 unk14; - f32 unk18; - f32 unk1C; - f32 unk20; + Vec3f position; + f32 unkC; + f32 unk10; + f32 unk14; + f32 unk18; + f32 unk1C; + f32 unk20; } Object_Boost_Inner; typedef struct Object_Boost { @@ -1113,430 +1062,378 @@ typedef struct Object_Boost { /* 0x7C */ TextureHeader *tex; } Object_Boost; -typedef struct Object_EffectBox { - s16 unk0; - u8 unk2; - u8 unk3; - s16 unk4; - s16 unk6; - s16 unk8; - s16 unkA; - s16 unkC; - s8 unkE[0x1FE - 0xE]; - u8 unk1FE; - u8 unk1FF; -} Object_EffectBox; - -typedef struct Object_EggCreator { - /* 0x0 */ u8 pad0[4]; - /* 0x4 */ struct Object *currentEgg; -} Object_EggCreator; - typedef struct Object_CollectEgg { - /* 0x0 */ u8 pad0[4]; - /* 0x4 */ struct Object *spawnerObj; - /* 0x8 */ s16 hatchTimer; - /* 0xA */ s8 racerID; - /* 0xB */ s8 status; + /* 0x0 */ u8 pad0[4]; + /* 0x4 */ struct Object *spawnerObj; + /* 0x8 */ s16 hatchTimer; + /* 0xA */ s8 racerID; + /* 0xB */ s8 status; } Object_CollectEgg; -typedef struct Object_UnkId58 { - /* 0x000 */ u8 pad0[0x1D6]; - /* 0x1D6 */ s8 vehicleID; -} Object_UnkId58; - -typedef struct Object_CharacterFlag { - /* 0x00 */ Triangle triangles[2]; - /* 0x20 */ Vertex *vertices; - /* 0x24 */ TextureHeader *texture; -} Object_CharacterFlag; - -typedef struct Object_AnimCamera { - /* 0x00 */ u8 pad0[0x30]; - /* 0x30 */ s8 cameraID; - /* 0x31 */ u8 pad31[0xB]; - /* 0x3C */ s32 unk3C; - /* 0x40 */ u8 pad40[4]; - /* 0x44 */ u8 unk44; - /* 0x45 */ u8 pad45[5]; - /* 0x4A */ s16 unk4A; - /* 0x4C */ u8 pad4C[8]; - /* 0x54 */ s8 unk54; -} Object_AnimCamera; - -typedef struct Object_InfoPoint { - /* 0x0 */ s16 unk0; -} Object_InfoPoint; - -typedef struct Object_WorldKey { - /* 0x0 */ s16 unk0; -} Object_WorldKey; +typedef struct CharacterFlagModel { + /* 0x00 */ Triangle triangles[2]; + /* 0x20 */ Vertex *vertices; + /* 0x24 */ TextureHeader *texture; +} CharacterFlagModel; typedef struct Object_AudioLine { - /* 0x00 */ u8 unk0; - /* 0x01 */ u8 pad1; - /* 0x02 */ u16 soundID; - /* 0x04 */ u16 unk4; - /* 0x06 */ u16 unk6; - /* 0x08 */ union { - struct { - u8 unk8; - u8 unk9; - u8 unkA; - u8 padB; - } unk_struct; - s32 unk8_word; - } unk_union; - /* 0x0C */ u8 lineID; - /* 0x0D */ u8 unkD; - /* 0x0E */ u8 unkE; - /* 0x0F */ u8 unkF; - /* 0x10 */ u8 unk10; - /* 0x11 */ u8 unk11; - /* 0x12 */ u8 unk12; + /* 0x00 */ u8 unk0; + /* 0x01 */ u8 pad1; + /* 0x02 */ u16 soundID; + /* 0x04 */ u16 unk4; + /* 0x06 */ u16 unk6; + /* 0x08 */ union { + struct { + u8 unk8; + u8 unk9; + u8 unkA; + u8 padB; + } unk_struct; + s32 unk8_word; + } unk_union; + /* 0x0C */ u8 lineID; + /* 0x0D */ u8 unkD; + /* 0x0E */ u8 unkE; + /* 0x0F */ u8 unkF; + /* 0x10 */ u8 unk10; + /* 0x11 */ u8 unk11; + /* 0x12 */ u8 unk12; } Object_AudioLine; typedef struct Object_AudioReverb { - /* 0x0 */ u16 pad0; - /* 0x2 */ s16 unk2; - /* 0x4 */ u8 lineID; - /* 0x5 */ u8 unk5; + /* 0x0 */ u16 pad0; + /* 0x2 */ s16 unk2; + /* 0x4 */ u8 lineID; + /* 0x5 */ u8 unk5; } Object_AudioReverb; typedef struct Object_TexScroll { - /* 0x0 */ s16 textureIndex; - /* 0x2 */ s16 pad2; - /* 0x4 */ s16 unk4; - /* 0x6 */ s16 unk6; - /* 0x8 */ s16 unk8; - /* 0xA */ s16 unkA; + /* 0x0 */ s16 textureIndex; + /* 0x2 */ s16 pad2; + /* 0x4 */ s16 unk4; + /* 0x6 */ s16 unk6; + /* 0x8 */ s16 unk8; + /* 0xA */ s16 unkA; } Object_TexScroll; typedef struct Object_Frog { - /* 0x00 */ f32 homeX; - /* 0x04 */ f32 homeY; - /* 0x08 */ f32 homeZ; - /* 0x0C */ f32 homeRadius; - /* 0x10 */ f32 homeRadiusSquare; - /* 0x14 */ u8 action; - /* 0x15 */ u8 drumstick; - /* 0x16 */ s16 hopTimer; - /* 0x18 */ s8 hopFrame; // Animation frame while jumping - /* 0x19 */ s8 squishCooldown; - /* 0x1A */ s16 hopDirection; - /* 0x1C */ f32 forwardVel; - /* 0x20 */ f32 hopStartX; - /* 0x24 */ f32 hopStartZ; - /* 0x28 */ f32 hopTargetX; - /* 0x2C */ f32 hopTargetZ; - /* 0x30 */ f32 scaleY; + /* 0x00 */ f32 homeX; + /* 0x04 */ f32 homeY; + /* 0x08 */ f32 homeZ; + /* 0x0C */ f32 homeRadius; + /* 0x10 */ f32 homeRadiusSquare; + /* 0x14 */ u8 action; + /* 0x15 */ u8 drumstick; + /* 0x16 */ s16 hopTimer; + /* 0x18 */ s8 hopFrame; // Animation frame while jumping + /* 0x19 */ s8 squishCooldown; + /* 0x1A */ s16 hopDirection; + /* 0x1C */ f32 forwardVel; + /* 0x20 */ f32 hopStartX; + /* 0x24 */ f32 hopStartZ; + /* 0x28 */ f32 hopTargetX; + /* 0x2C */ f32 hopTargetZ; + /* 0x30 */ f32 scaleY; } Object_Frog; -typedef struct Object_Wizpig2 { - /* 0x00 */ u8 pad0[0x70]; - /* 0x70 */ u8 unk70; - /* 0x71 */ u8 pad71; - /* 0x72 */ u8 unk72; - /* 0x73 */ u8 pad73; - /* 0x74 */ f32 unk74; -} Object_Wizpig2; - typedef struct Object_Exit { - /* 0x00 */ f32 directionX; - /* 0x04 */ f32 directionY; - /* 0x08 */ f32 directionZ; - /* 0x0C */ f32 rotationDiff; // Rotational offset, to test intersection when the exit is rotated. - /* 0x10 */ s32 radius; // Activation radius. - /* 0x14 */ s8 bossFlag; // Dictates boss level version. 0 is first encounter, 1 is rematch. -1 means no boss. + /* 0x00 */ f32 directionX; + /* 0x04 */ f32 directionY; + /* 0x08 */ f32 directionZ; + /* 0x0C */ f32 rotationDiff; // Rotational offset, to test intersection when the exit is rotated. + /* 0x10 */ s32 radius; // Activation radius. + /* 0x14 */ s8 bossFlag; // Dictates boss level version. 0 is first encounter, 1 is rematch. -1 means no boss. } Object_Exit; typedef struct Object_AiNode { - /* 0x00 */ struct Object *nodeObj[4]; - /* 0x10 */ s16 distToNode[4]; - /* 0x18 */ s8 directions[4]; + /* 0x00 */ struct Object *nodeObj[4]; + /* 0x10 */ s16 distToNode[4]; + /* 0x18 */ s8 directions[4]; } Object_AiNode; /* Size: 0x224 - 548 bytes */ typedef struct Object_Racer { - /* 0x000 */ s16 playerIndex; // -1 = AI Controlled, 0 to 3 = Object controlled - /* 0x002 */ s8 racerIndex; // Unique ID for each racer object. - /* 0x003 */ s8 characterId; // Affects minimap color, horn, voice, etc. - /* 0x004 */ s32 unk4; - /* 0x008 */ f32 forwardVel; - /* 0x00C */ f32 animationSpeed; - /* 0x010 */ SoundHandle unk10; - /* 0x014 */ SoundHandle unk14; - /* 0x018 */ SoundHandle unk18; - /* 0x01C */ SoundHandle unk1C; - /* 0x020 */ SoundHandle unk20; - /* 0x024 */ struct AudioPoint *soundMask; - /* 0x028 */ u16 lastSoundID; - /* 0x02A */ u16 unk2A; - /* 0x02C */ f32 velocity; - /* 0x030 */ f32 lateral_velocity; - /* 0x034 */ f32 unk34; // Vehicle pitch. - /* 0x038 */ f32 ox1; - /* 0x03C */ f32 oy1; - /* 0x040 */ f32 oz1; - /* 0x044 */ f32 ox2; - /* 0x048 */ f32 oy2; - /* 0x04C */ f32 oz2; - /* 0x050 */ f32 ox3; - /* 0x054 */ f32 oy3; - /* 0x058 */ f32 oz3; - /* 0x05C */ f32 prev_x_position; - /* 0x060 */ f32 prev_y_position; - /* 0x064 */ f32 prev_z_position; - /* 0x068 */ f32 unk68; // xPos - /* 0x06C */ f32 unk6C; // yPos - /* 0x070 */ f32 unk70; // zPos - /* 0x074 */ f32 unk74; - /* 0x078 */ f32 carBobX; - /* 0x07C */ f32 carBobY; - /* 0x080 */ f32 carBobZ; - /* 0x084 */ f32 unk84; - /* 0x088 */ f32 unk88; - /* 0x08C */ f32 stretch_height; - /* 0x090 */ f32 stretch_height_cap; - /* 0x094 */ f32 camera_zoom; - /* 0x098 */ f32 unk98; - /* 0x09C */ f32 pitch; - /* 0x0A0 */ f32 roll; - /* 0x0A4 */ f32 yaw; - /* 0x0A8 */ f32 checkpoint_distance; - /* 0x0AC */ f32 unkAC; - /* 0x0B0 */ f32 unkB0; - /* 0x0B4 */ f32 throttle; - /* 0x0B8 */ f32 brake; - /* 0x0BC */ f32 unkBC; - /* 0x0C0 */ f32 buoyancy; - /* 0x0C4 */ f32 unkC4; - /* 0x0C8 */ f32 unkC8; - /* 0x0CC */ f32 unkCC; - /* 0x0D0 */ f32 unkD0; - /* 0x0D4 */ f32 unkD4; - /* 0x0D8 */ Vec3f unkD8; - /* 0x0E4 */ Vec3f unkE4; - /* 0x0F0 */ Vec3f unkF0; - /* 0x0FC */ Vec3f unkFC; - /* 0x108 */ struct Object *exitObj; - /* 0x10C */ s32 unk10C; - /* 0x110 */ s32 unk110; - /* 0x114 */ s32 unk114; - /* 0x118 */ struct VehicleSoundData *vehicleSound; - /* 0x11C */ f32 unk11C; - /* 0x120 */ f32 unk120; - /* 0x124 */ f32 unk124; - /* 0x128 */ s32 lap_times[5]; //mode_init_taj_race implies there should be at least 5 lap times. - /* 0x13C */ s32 unk13C; - /* 0x140 */ struct Object *magnetTargetObj; - /* 0x144 */ struct Object *held_obj; - /* 0x148 */ struct Object *approachTarget; - /* 0x14C */ struct Object *zipperObj; - /* 0x150 */ struct Object *unk150; - /* 0x154 */ struct Object *unk154; - /* 0x158 */ struct Object *nodeCurrent; - /* 0x15C */ struct Object *challengeMarker; - /* 0x160 */ s16 y_rotation_offset; - /* 0x162 */ s16 x_rotation_offset; - /* 0x164 */ s16 z_rotation_offset; - /* 0x166 */ s16 unk166; // I don't know exactly what these are, but this one in particular seems to cause a Y position offset. - /* 0x168 */ s16 unk168; - /* 0x16A */ s16 headAngle; - /* 0x166 */ s16 headAngleTarget; - /* 0x16E */ s16 unk16E; - /* 0x170 */ s16 unk170; - /* 0x172 */ s8 balloon_type; - /* 0x173 */ s8 balloon_quantity; - /* 0x174 */ s8 balloon_level; - /* 0x175 */ s8 magnetTimer; - /* 0x176 */ s16 unk176; - /* 0x178 */ SoundHandle magnetSoundMask; - /* 0x17C */ struct AudioPoint *shieldSoundMask; - /* 0x180 */ struct AudioPoint *bananaSoundMask; - /* 0x184 */ s8 magnetModelID; - /* 0x185 */ s8 bananas; - /* 0x186 */ u8 unk186; - /* 0x187 */ s8 attackType; - /* 0x188 */ s8 unk188; - /* 0x189 */ s8 shieldType; - /* 0x18A */ s16 unk18A; - /* 0x18C */ s16 unk18C; - /* 0x18E */ s16 shieldTimer; - /* 0x190 */ s16 courseCheckpoint; - /* 0x192 */ s8 checkpoint; - /* 0x193 */ s8 lap; - /* 0x194 */ s8 countLap; - /* 0x195 */ s8 magnetLevel3; - /* 0x196 */ s16 cameraYaw; - /* 0x198 */ s16 unk198; - /* 0x19A */ s16 unk19A; - /* 0x19C */ s16 unk19C; - /* 0x19E */ s16 unk19E; - /* 0x1A0 */ s16 steerVisualRotation; - /* 0x1A2 */ s16 y_rotation_vel; - /* 0x1A4 */ s16 x_rotation_vel; - /* 0x1A6 */ s16 z_rotation_vel; - /* 0x1A8 */ s16 unk1A8; - /* 0x1AA */ s16 racerOrder; // Current racer index order, but doesn't necessarily mean their exact race place. - /* 0x1AC */ s16 finishPosition; - /* 0x1AE */ s16 racePosition; // Current decided race position. - /* 0x1B0 */ s16 unk1B0; - /* 0x1B2 */ s16 unk1B2; - /* 0x1B4 */ s32 unk1B4; - /* 0x1B8 */ s16 unk1B8; - /* 0x1BA */ s16 unk1BA; - /* 0x1BC */ s16 unk1BC; - /* 0x1BE */ s16 unk1BE; - /* 0x1C0 */ s16 unk1C0; - /* 0x1C2 */ s16 unk1C2; - /* 0x1C4 */ s16 unk1C4; - /* 0x1C6 */ s16 unk1C6; - /* 0x1C8 */ u8 unk1C8; - /* 0x1C9 */ u8 unk1C9; - /* 0x1CA */ s8 unk1CA; - /* 0x1CB */ u8 unk1CB; - /* 0x1CC */ s8 aiSkill; - /* 0x1CD */ u8 unk1CD; - /* 0x1CE */ u8 unk1CE; - /* 0x1CF */ s8 eggHudCounter; - /* 0x1D0 */ s8 spectateCamID; - /* 0x1D1 */ s8 unk1D1; - /* 0x1D2 */ s8 unk1D2; - /* 0x1D3 */ s8 boostTimer; - /* 0x1D4 */ s8 unk1D4; - /* 0x1D5 */ s8 unk1D5; - /* 0x1D6 */ s8 vehicleID; - /* 0x1D7 */ s8 vehicleIDPrev; - /* 0x1D8 */ s8 raceFinished; - /* 0x1D9 */ s8 unk1D9; - /* 0x1DA */ u8 unk1DA; - /* 0x1DB */ s8 spinout_timer; - /* 0x1DC */ u8 wheel_surfaces[4]; - /* 0x1E0 */ s8 trickType; // This depends on which vehicle you're using, but this name fits the most for now. - /* 0x1E1 */ s8 steerAngle; - /* 0x1E2 */ s8 groundedWheels; - /* 0x1E3 */ s8 unk1E3; - /* 0x1E4 */ s8 unk1E4; - /* 0x1E5 */ s8 waterTimer; // Set to a value, then counts down when leaving water. - /* 0x1E6 */ s8 drift_direction; - /* 0x1E7 */ s8 miscAnimCounter; - /* 0x1E8 */ s8 unk1E8; - /* 0x1E9 */ s8 unk1E9; - /* 0x1EA */ s8 unk1EA; - /* 0x1EB */ s8 tapTimerR; - /* 0x1EC */ s8 tappedR; - /* 0x1ED */ s8 squish_timer; - /* 0x1EE */ u8 unk1EE; - /* 0x1EF */ u8 boost_sound; - /* 0x1F0 */ u8 unk1F0; - /* 0x1F1 */ u8 unk1F1; - /* 0x1F2 */ u8 unk1F2; - /* 0x1F3 */ u8 unk1F3; - /* 0x1F4 */ u8 startInput; - /* 0x1F5 */ u8 zipperDirCorrection; - /* 0x1F6 */ s8 unk1F6; - /* 0x1F7 */ u8 transparency; - /* 0x290 */ u8 indicator_type; - /* 0x291 */ s8 indicator_timer; - /* 0x1FA */ s8 drifting; - /* 0x1FB */ s8 unk1FB; - /* 0x1FC */ u8 wrongWayCounter; - /* 0x1FD */ s8 cameraIndex; - /* 0x1FE */ u8 unk1FE; - /* 0x1FF */ u8 unk1FF; - /* 0x200 */ s8 transitionTimer; - /* 0x201 */ s8 unk201; - /* 0x202 */ s8 silverCoinCount; - /* 0x203 */ s8 boostType; - /* 0x204 */ s16 bubbleTrapTimer; - /* 0x206 */ s16 unk206; - /* 0x208 */ s8 unk208; - /* 0x209 */ u8 unk209; - /* 0x20A */ u8 lightFlags; - /* 0x20B */ u8 unk20B; - /* 0x20C */ u8 throttleReleased; - /* 0x20D */ u8 unk20D; - /* 0x20E */ u16 delaySoundID; - /* 0x210 */ u8 delaySoundTimer; - /* 0x211 */ s8 unk211; - /* 0x212 */ s8 elevation; // Some maps like Icicle Pyramid have elevation levels that are communicated on the minimap. - /* 0x213 */ s8 unk213; - /* 0x214 */ s8 unk214; - /* 0x215 */ s8 unk215; - /* 0x216 */ u8 unk216; - /* 0x217 */ u8 unk217; - /* 0x218 */ SoundHandle weaponSoundMask; - /* 0x21C */ SoundHandle unk21C; - /* 0x220 */ SoundHandle unk220; + /* 0x000 */ s16 playerIndex; // -1 = AI Controlled, 0 to 3 = Object controlled + /* 0x002 */ s8 racerIndex; // Unique ID for each racer object. + /* 0x003 */ s8 characterId; // Affects minimap color, horn, voice, etc. + /* 0x004 */ s32 unk4; + /* 0x008 */ f32 forwardVel; + /* 0x00C */ f32 animationSpeed; + /* 0x010 */ SoundHandle unk10; + /* 0x014 */ SoundHandle unk14; + /* 0x018 */ SoundHandle unk18; + /* 0x01C */ SoundHandle unk1C; + /* 0x020 */ SoundHandle unk20; + /* 0x024 */ struct AudioPoint *soundMask; + /* 0x028 */ u16 lastSoundID; + /* 0x02A */ u16 unk2A; + /* 0x02C */ f32 velocity; + /* 0x030 */ f32 lateral_velocity; + /* 0x034 */ f32 unk34; // Vehicle pitch. + /* 0x038 */ f32 ox1; + /* 0x03C */ f32 oy1; + /* 0x040 */ f32 oz1; + /* 0x044 */ f32 ox2; + /* 0x048 */ f32 oy2; + /* 0x04C */ f32 oz2; + /* 0x050 */ f32 ox3; + /* 0x054 */ f32 oy3; + /* 0x058 */ f32 oz3; + /* 0x05C */ f32 prev_x_position; + /* 0x060 */ f32 prev_y_position; + /* 0x064 */ f32 prev_z_position; + /* 0x068 */ f32 unk68; // xPos + /* 0x06C */ f32 unk6C; // yPos + /* 0x070 */ f32 unk70; // zPos + /* 0x074 */ f32 unk74; + /* 0x078 */ f32 carBobX; + /* 0x07C */ f32 carBobY; + /* 0x080 */ f32 carBobZ; + /* 0x084 */ f32 unk84; + /* 0x088 */ f32 unk88; + /* 0x08C */ f32 stretch_height; + /* 0x090 */ f32 stretch_height_cap; + /* 0x094 */ f32 camera_zoom; + /* 0x098 */ f32 unk98; + /* 0x09C */ f32 pitch; + /* 0x0A0 */ f32 roll; + /* 0x0A4 */ f32 yaw; + /* 0x0A8 */ f32 checkpoint_distance; + /* 0x0AC */ f32 unkAC; + /* 0x0B0 */ f32 unkB0; + /* 0x0B4 */ f32 throttle; + /* 0x0B8 */ f32 brake; + /* 0x0BC */ f32 unkBC; + /* 0x0C0 */ f32 buoyancy; + /* 0x0C4 */ f32 unkC4; + /* 0x0C8 */ f32 unkC8; + /* 0x0CC */ f32 unkCC; + /* 0x0D0 */ f32 unkD0; + /* 0x0D4 */ f32 unkD4; + /* 0x0D8 */ Vec3f unkD8; + /* 0x0E4 */ Vec3f unkE4; + /* 0x0F0 */ Vec3f unkF0; + /* 0x0FC */ Vec3f unkFC; + /* 0x108 */ struct Object *exitObj; + /* 0x10C */ s32 unk10C; + /* 0x110 */ s32 unk110; + /* 0x114 */ s32 unk114; + /* 0x118 */ struct VehicleSoundData *vehicleSound; + /* 0x11C */ f32 unk11C; + /* 0x120 */ f32 unk120; + /* 0x124 */ f32 unk124; + /* 0x128 */ s32 lap_times[5]; // mode_init_taj_race implies there should be at least 5 lap times. + /* 0x13C */ s32 unk13C; + /* 0x140 */ struct Object *magnetTargetObj; + /* 0x144 */ struct Object *held_obj; + /* 0x148 */ struct Object *approachTarget; + /* 0x14C */ struct Object *zipperObj; + /* 0x150 */ struct Object *unk150; + /* 0x154 */ struct Object *unk154; + /* 0x158 */ struct Object *nodeCurrent; + /* 0x15C */ struct Object *challengeMarker; + /* 0x160 */ s16 y_rotation_offset; + /* 0x162 */ s16 x_rotation_offset; + /* 0x164 */ s16 z_rotation_offset; + /* 0x166 */ s16 + unk166; // I don't know exactly what these are, but this one in particular seems to cause a Y position offset. + /* 0x168 */ s16 unk168; + /* 0x16A */ s16 headAngle; + /* 0x166 */ s16 headAngleTarget; + /* 0x16E */ s16 unk16E; + /* 0x170 */ s16 unk170; + /* 0x172 */ s8 balloon_type; + /* 0x173 */ s8 balloon_quantity; + /* 0x174 */ s8 balloon_level; + /* 0x175 */ s8 magnetTimer; + /* 0x176 */ s16 unk176; + /* 0x178 */ SoundHandle magnetSoundMask; + /* 0x17C */ struct AudioPoint *shieldSoundMask; + /* 0x180 */ struct AudioPoint *bananaSoundMask; + /* 0x184 */ s8 magnetModelID; + /* 0x185 */ s8 bananas; + /* 0x186 */ u8 unk186; + /* 0x187 */ s8 attackType; + /* 0x188 */ s8 unk188; + /* 0x189 */ s8 shieldType; + /* 0x18A */ s16 unk18A; + /* 0x18C */ s16 unk18C; + /* 0x18E */ s16 shieldTimer; + /* 0x190 */ s16 courseCheckpoint; + /* 0x192 */ s8 checkpoint; + /* 0x193 */ s8 lap; + /* 0x194 */ s8 countLap; + /* 0x195 */ s8 magnetLevel3; + /* 0x196 */ s16 cameraYaw; + /* 0x198 */ s16 unk198; + /* 0x19A */ s16 unk19A; + /* 0x19C */ s16 unk19C; + /* 0x19E */ s16 unk19E; + /* 0x1A0 */ s16 steerVisualRotation; + /* 0x1A2 */ s16 y_rotation_vel; + /* 0x1A4 */ s16 x_rotation_vel; + /* 0x1A6 */ s16 z_rotation_vel; + /* 0x1A8 */ s16 unk1A8; + /* 0x1AA */ s16 racerOrder; // Current racer index order, but doesn't necessarily mean their exact race place. + /* 0x1AC */ s16 finishPosition; + /* 0x1AE */ s16 racePosition; // Current decided race position. + /* 0x1B0 */ s16 unk1B0; + /* 0x1B2 */ s16 unk1B2; + /* 0x1B4 */ s32 unk1B4; + /* 0x1B8 */ s16 unk1B8; + /* 0x1BA */ s16 unk1BA; + /* 0x1BC */ s16 unk1BC; + /* 0x1BE */ s16 unk1BE; + /* 0x1C0 */ s16 unk1C0; + /* 0x1C2 */ s16 unk1C2; + /* 0x1C4 */ s16 unk1C4; + /* 0x1C6 */ s16 unk1C6; + /* 0x1C8 */ u8 unk1C8; + /* 0x1C9 */ u8 unk1C9; + /* 0x1CA */ s8 unk1CA; + /* 0x1CB */ u8 unk1CB; + /* 0x1CC */ s8 aiSkill; + /* 0x1CD */ u8 unk1CD; + /* 0x1CE */ u8 unk1CE; + /* 0x1CF */ s8 eggHudCounter; + /* 0x1D0 */ s8 spectateCamID; + /* 0x1D1 */ s8 unk1D1; + /* 0x1D2 */ s8 unk1D2; + /* 0x1D3 */ s8 boostTimer; + /* 0x1D4 */ s8 unk1D4; + /* 0x1D5 */ s8 unk1D5; + /* 0x1D6 */ s8 vehicleID; + /* 0x1D7 */ s8 vehicleIDPrev; + /* 0x1D8 */ s8 raceFinished; + /* 0x1D9 */ s8 unk1D9; + /* 0x1DA */ u8 unk1DA; + /* 0x1DB */ s8 spinout_timer; + /* 0x1DC */ u8 wheel_surfaces[4]; + /* 0x1E0 */ s8 trickType; // This depends on which vehicle you're using, but this name fits the most for now. + /* 0x1E1 */ s8 steerAngle; + /* 0x1E2 */ s8 groundedWheels; + /* 0x1E3 */ s8 unk1E3; + /* 0x1E4 */ s8 unk1E4; + /* 0x1E5 */ s8 waterTimer; // Set to a value, then counts down when leaving water. + /* 0x1E6 */ s8 drift_direction; + /* 0x1E7 */ s8 miscAnimCounter; + /* 0x1E8 */ s8 unk1E8; + /* 0x1E9 */ s8 unk1E9; + /* 0x1EA */ s8 unk1EA; + /* 0x1EB */ s8 tapTimerR; + /* 0x1EC */ s8 tappedR; + /* 0x1ED */ s8 squish_timer; + /* 0x1EE */ u8 unk1EE; + /* 0x1EF */ u8 boost_sound; + /* 0x1F0 */ u8 unk1F0; + /* 0x1F1 */ u8 unk1F1; + /* 0x1F2 */ u8 unk1F2; + /* 0x1F3 */ u8 unk1F3; + /* 0x1F4 */ u8 startInput; + /* 0x1F5 */ u8 zipperDirCorrection; + /* 0x1F6 */ s8 unk1F6; + /* 0x1F7 */ u8 transparency; + /* 0x290 */ u8 indicator_type; + /* 0x291 */ s8 indicator_timer; + /* 0x1FA */ s8 drifting; + /* 0x1FB */ s8 unk1FB; + /* 0x1FC */ u8 wrongWayCounter; + /* 0x1FD */ s8 cameraIndex; + /* 0x1FE */ u8 unk1FE; + /* 0x1FF */ u8 unk1FF; + /* 0x200 */ s8 transitionTimer; + /* 0x201 */ s8 unk201; + /* 0x202 */ s8 silverCoinCount; + /* 0x203 */ s8 boostType; + /* 0x204 */ s16 bubbleTrapTimer; + /* 0x206 */ s16 unk206; + /* 0x208 */ s8 unk208; + /* 0x209 */ u8 unk209; + /* 0x20A */ u8 lightFlags; + /* 0x20B */ u8 unk20B; + /* 0x20C */ u8 throttleReleased; + /* 0x20D */ u8 unk20D; + /* 0x20E */ u16 delaySoundID; + /* 0x210 */ u8 delaySoundTimer; + /* 0x211 */ s8 unk211; + /* 0x212 */ s8 elevation; // Some maps like Icicle Pyramid have elevation levels + // that are communicated on the minimap. + /* 0x213 */ s8 unk213; + /* 0x214 */ s8 unk214; + /* 0x215 */ s8 unk215; + /* 0x216 */ u8 unk216; + /* 0x217 */ u8 unk217; + /* 0x218 */ SoundHandle weaponSoundMask; + /* 0x21C */ SoundHandle unk21C; + /* 0x220 */ SoundHandle unk220; } Object_Racer; typedef struct Object_Door { - /* 0x00 */ f32 homeY; - /* 0x04 */ struct AudioPoint* soundMask; - /* 0x08 */ s32 jingleTimer; - /* 0x0A */ s16 jingleCooldown; - /* 0x0E */ s8 doorID; - /* 0x0F */ u8 doorType; - /* 0x10 */ u8 balloonCount; - /* 0x11 */ u8 balloonCountUnused; - /* 0x12 */ u8 radius; - /* 0x13 */ s8 textID; - /* 0x14 */ s8 keyID; - /* 0x15 */ s8 openDir; + /* 0x00 */ f32 homeY; + /* 0x04 */ struct AudioPoint *soundMask; + /* 0x08 */ s32 jingleTimer; + /* 0x0C */ s16 jingleCooldown; + /* 0x0E */ s8 doorID; + /* 0x0F */ u8 doorType; + /* 0x10 */ u8 balloonCount; + /* 0x11 */ u8 balloonCountUnused; + /* 0x12 */ u8 radius; + /* 0x13 */ s8 textID; + /* 0x14 */ s8 keyID; + /* 0x15 */ s8 openDir; } Object_Door; typedef struct Object_Trigger { - /* 0x00 */ f32 directionX; - /* 0x04 */ f32 directionY; - /* 0x08 */ f32 directionZ; - /* 0x0C */ f32 rotationDiff; // Rotational offset, to test intersection when the exit is rotated. - /* 0x10 */ s32 radius; - union { - /* 0x14 */ u8 vehicleID; - /* 0x14 */ u8 unk14; - }; + /* 0x00 */ f32 directionX; + /* 0x04 */ f32 directionY; + /* 0x08 */ f32 directionZ; + /* 0x0C */ f32 rotationDiff; // Rotational offset, to test intersection when the exit is rotated. + /* 0x10 */ s32 radius; + union { + /* 0x14 */ u8 vehicleID; + /* 0x14 */ u8 unk14; + }; } Object_Trigger; typedef struct Object_Audio { - /* 0x00 */ u16 soundId; - /* 0x02 */ u16 unk2; - /* 0x04 */ u8 unk4; - /* 0x05 */ u8 unk5; - /* 0x06 */ u8 unk6; - /* 0x07 */ u8 unk7; - /* 0x08 */ struct AudioPoint *soundMask; - /* 0x0C */ u8 unkC; - /* 0x0D */ u8 unkD; + /* 0x00 */ u16 soundId; + /* 0x02 */ u16 unk2; + /* 0x04 */ u8 unk4; + /* 0x05 */ u8 unk5; + /* 0x06 */ u8 unk6; + /* 0x07 */ u8 unk7; + /* 0x08 */ struct AudioPoint *soundMask; + /* 0x0C */ u8 unkC; + /* 0x0D */ u8 unkD; } Object_Audio; typedef struct Object_MidiFade { - /* 0x00 */ s8 unk0; - /* 0x01 */ u8 unk1; - /* 0x02 */ u8 unk2; - /* 0x04 */ u16 unk4; - /* 0x06 */ s16 unk6; - /* 0x08 */ f32 unk8; - /* 0x0C */ f32 unkC; - /* 0x10 */ f32 unk10; - /* 0x14 */ f32 unk14; - /* 0x18 */ f32 unk18; - /* 0x1C */ f32 unk1C; - /* 0x20 */ f32 unk20; - /* 0x24 */ f32 unk24; - /* 0x28 */ f32 unk28; - /* 0x2C */ f32 unk2C; - /* 0x2F */ u8 unk2F[16]; - /* 0x40 */ u8 unk40; + /* 0x00 */ s8 unk0; + /* 0x01 */ u8 unk1; + /* 0x02 */ u8 unk2; + /* 0x04 */ u16 unk4; + /* 0x06 */ s16 unk6; + /* 0x08 */ f32 unk8; + /* 0x0C */ f32 unkC; + /* 0x10 */ f32 unk10; + /* 0x14 */ f32 unk14; + /* 0x18 */ f32 unk18; + /* 0x1C */ f32 unk1C; + /* 0x20 */ f32 unk20; + /* 0x24 */ f32 unk24; + /* 0x28 */ f32 unk28; + /* 0x2C */ f32 unk2C; + /* 0x2F */ u8 unk2F[16]; + /* 0x40 */ u8 unk40; } Object_MidiFade; typedef struct Object_MidiFadePoint { - /* 0x00 */ u16 unk0; - /* 0x02 */ u16 unk2; - /* 0x04 */ f32 unk4; - /* 0x08 */ f32 unk8; - /* 0x0C */ u8 unkC[16]; - /* 0x1C */ u8 unk1C; + /* 0x00 */ u16 unk0; + /* 0x02 */ u16 unk2; + /* 0x04 */ f32 unk4; + /* 0x08 */ f32 unk8; + /* 0x0C */ u8 unkC[16]; + /* 0x1C */ u8 unk1C; } Object_MidiFadePoint; typedef struct Object_MidiChannelSet { @@ -1545,76 +1442,50 @@ typedef struct Object_MidiChannelSet { u8 unk3; } Object_MidiChannelSet; -typedef struct Object_PosArrow { - /* 0x000 */ s16 unk0; - /* 0x004 */ u8 pad4[0x14E]; - /* 0x150 */ struct Object *unk150; -} Object_PosArrow; - typedef struct Object_Banana { - /* 0x0 */ s32 unk0; - /* 0x4 */ struct Object *spawner; - /* 0x8 */ s8 unk8; - /* 0x9 */ s8 droppedVehicleID; + /* 0x0 */ s32 unk0; + /* 0x4 */ struct Object *spawner; + /* 0x8 */ s8 unk8; + /* 0x9 */ s8 droppedVehicleID; } Object_Banana; -typedef struct Object_FogChanger { - /* 0x0 */ s16 unk0; -} Object_FogChanger; - typedef struct Object_NPC { - /* 0x00 */ f32 unk0; - /* 0x04 */ f32 animFrameF; - /* 0x08 */ f32 unk8; - union { - /* 0x0C */ u8 nodeData[5]; - struct { - /* 0x0C */ s8 nodeBack1; // One node backwards - /* 0x0D */ u8 nodeCurrent; // Intended target node - /* 0x0E */ u8 nodeBack2; // Two nodes backward - /* 0x0F */ u8 nodeForward1; // One node forward - /* 0x10 */ u8 nodeForward2; // Two nodes forward + /* 0x00 */ f32 unk0; + /* 0x04 */ f32 animFrameF; + /* 0x08 */ f32 unk8; + union { + /* 0x0C */ u8 nodeData[5]; + struct { + /* 0x0C */ s8 nodeBack1; // One node backwards + /* 0x0D */ u8 nodeCurrent; // Intended target node + /* 0x0E */ u8 nodeBack2; // Two nodes backward + /* 0x0F */ u8 nodeForward1; // One node forward + /* 0x10 */ u8 nodeForward2; // Two nodes forward + }; }; - }; - /* 0x11 */ u8 fogR; - /* 0x12 */ u8 fogG; - /* 0x13 */ u8 fogB; - /* 0x14 */ f32 forwardVel; - /* 0x18 */ f32 unk18; - /* 0x1C */ s16 unk1C; - /* 0x1E */ s16 unk1E; - /* 0x20 */ s16 fogNear; - /* 0x22 */ s16 fogFar; - /* 0x24 */ s32 unk24; - /* 0x28 */ s16 unk28; - /* 0x2A */ s16 unk2A; - /* 0x2C */ s32 unk2C; - /* 0x30 */ s32 unk30; - /* 0x34 */ u16 musicFade; - /* 0x36 */ s8 unk36; + /* 0x11 */ u8 fogR; + /* 0x12 */ u8 fogG; + /* 0x13 */ u8 fogB; + /* 0x14 */ f32 forwardVel; + /* 0x18 */ f32 unk18; + /* 0x1C */ s16 unk1C; + /* 0x1E */ s16 unk1E; + /* 0x20 */ s16 fogNear; + /* 0x22 */ s16 fogFar; + /* 0x24 */ s32 unk24; + /* 0x28 */ s16 unk28; + /* 0x2A */ s16 unk2A; + /* 0x2C */ s32 unk2C; + /* 0x30 */ s32 unk30; + /* 0x34 */ u16 musicFade; + /* 0x36 */ s8 unk36; } Object_NPC; -typedef struct Object_TT { - /* 0x0 */ f32 unk0; - /* 0x4 */ u8 pad4[0x9]; - /* 0xD */ u8 unkD; -} Object_TT; - typedef struct Object_Bridge_WhaleRamp { - /* 0x0 */ f32 homeY; - /* 0x4 */ struct AudioPoint *soundMask; + /* 0x0 */ f32 homeY; + /* 0x4 */ struct AudioPoint *soundMask; } Object_Bridge_WhaleRamp; -typedef struct Object_64_80021400 { - /* 0x00 */ u8 pad[0x2A]; - /* 0x2A */ s16 unk2A; -} Object_64_80021400; - -typedef struct Object_80021400_64 { - /* 0x000 */ u8 pad[0x64]; - /* 0x064 */ struct Object_64_80021400 *obj64; -} Object_80021400_64; - typedef struct Object_Log { /* 0x00 */ s16 unk0; /* 0x02 */ u8 unk2; @@ -1627,126 +1498,140 @@ typedef struct Object_Log { /* 0x0E */ s8 unkE[2]; } Object_Log; -typedef struct Object_Fireball_Octoweapon { - u8 pad0[0x1C]; - struct AudioPoint *soundMask; -} Object_Fireball_Octoweapon; - typedef struct Object_AnimatedObject { - u8 pad0[0x20]; - /* 0x20 */ u32 soundMask; - /* 0x24 */ s16 currentSound; - /* 0x26 */ s16 unk26; - s16 unk28; - u8 pad2A[0xC]; - s16 unk36; - s8 soundID; - s8 unk39; - s8 unk3A; - s8 unk3B; - s8 pad3C[0xC]; -} Object_AnimatedObject; - -typedef struct Object_WizpigRocket { - u8 pad0[0x70]; - u8 unk70; - u8 unk71; - u8 unk72; - u8 unk73; - f32 unk74; -} Object_WizpigRocket; - -typedef struct Object_8001E89C_64_C { - /* 0x00 */ u8 pad0[0xC]; - /* 0x0C */ f32 unkC; - /* 0x10 */ f32 unk10; - /* 0x14 */ f32 unk14; -} Object_8001E89C_64_C; - -typedef struct Object_8001E89C_64 { /* 0x00 */ f32 unk0; /* 0x04 */ f32 unk4; /* 0x08 */ f32 unk8; - /* 0x0C */ Object_8001E89C_64_C *unkC; -} Object_8001E89C_64; + /* 0x0C */ f32 x; + /* 0x10 */ f32 y; + /* 0x14 */ f32 z; + /* 0x18 */ SoundHandle unk18; + /* 0x1C */ struct Object *unk1C; + /* 0x20 */ u32 soundMask; + /* 0x24 */ s16 currentSound; + /* 0x26 */ s16 unk26; + /* 0x28 */ s16 unk28; + /* 0x2A */ s16 startDelay; + /* 0x2C */ u8 unk2C; + /* 0x2D */ u8 unk2D; + /* 0x2E */ u8 unk2E; + /* 0x2F */ u8 unk2F; + /* 0x30 */ s8 cameraID; + /* 0x31 */ u8 unk31; + /* 0x32 */ u8 unk32; + /* 0x33 */ u8 unk33; + /* 0x34 */ u8 unk34; + /* 0x35 */ u8 unk35; + /* 0x36 */ s16 pauseCounter; + /* 0x38 */ s8 soundID; + /* 0x39 */ s8 unk39; + /* 0x3A */ s8 unk3A; + /* 0x3B */ u8 unk3B; + /* 0x3C */ u8 unk3C; + /* 0x3D */ u8 unk3D; + /* 0x3E */ s8 unk3E; + /* 0x3F */ s8 unk3F; + /* 0x40 */ u8 unk40; + /* 0x41 */ u8 unk41; + /* 0x42 */ u8 unk42; + /* 0x43 */ u8 unk43; + /* 0x44 */ u8 unk44; + /* 0x45 */ u8 unk45; +} Object_AnimatedObject; -typedef struct Object_CharacterSelect { - u8 pad0[0x14]; - f32 unk14; - u8 pad18[0x10]; - s16 unk28; - u8 unk2A[2]; - u8 unk2C; - u8 pad2D[2]; - u8 unk2F; - u8 pad30[6]; - s16 unk36; - u8 unk38; - u8 unk39; - s8 unk3A; - s8 unk3B; - s8 unk3C; - s8 pad3D[2]; - s8 unk3F; - s8 unk40; - s8 unk41; - s8 pad42; - s8 unk43; -} Object_CharacterSelect; - -typedef struct Object_64 { +/* Size: 0x018 bytes */ +typedef struct ObjectTransform { + /* 0x0000 */ Vec3s rotation; union { - struct Object *obj; - Object_Laser laser; - Object_TrophyCabinet trophy_cabinet; - Object_Animator animator; - Object_Animation animation; - Object_Animation2 animation2; - Object_WeaponBalloon weapon_balloon; - Object_Weapon weapon; - Object_Butterfly butterfly; - Object_Fish fish; - Object_Boost boost; - Object_EffectBox effect_box; - Object_EggCreator egg_creator; - Object_CollectEgg egg; - Object_UnkId58 unkid58; - Object_CharacterFlag character_flag; - Object_AnimCamera anim_camera; - Object_InfoPoint info_point; - Object_WorldKey world_key; - Object_AudioLine audio_line; - Object_AudioReverb audio_reverb; - Object_TexScroll tex_scroll; - Object_Frog frog; - Object_Wizpig2 wizpig2; - Object_Exit exit; - Object_Racer racer; - Object_Door door; - Object_Trigger trigger; - Object_Audio audio; - Object_MidiFade midi_fade; - Object_MidiFadePoint midi_fade_point; - Object_MidiChannelSet midi_channel_set; - Object_PosArrow pos_arrow; - Object_Banana banana; - Object_FogChanger fog_changer; - Object_NPC npc; - Object_TT tt; - Object_Bridge_WhaleRamp bridge_whale_ramp; - Object_80021400_64 obj80021400_64; - Object_Log log; - Object_Fireball_Octoweapon fireball_octoweapon; - Object_LaserGun lasergun; - Object_AnimatedObject animatedObject; - Object_WizpigRocket wizpigRocket; - Object_8001E89C_64 obj8001E89C_64; - Object_CharacterSelect characterSelect; - Object_AiNode ai_node; - Object_OverridePos override_pos; + /* 0x0006 */ s16 flags; + /* 0x0006 */ s16 spriteID; }; -} Object_64; - + /* 0x0008 */ f32 scale; + /* 0x000C */ f32 x_position; + /* 0x0010 */ f32 y_position; + /* 0x0014 */ f32 z_position; +} ObjectTransform; + +/* Size: 0x0630 bytes */ +typedef struct Object { + /* 0x0000 */ ObjectTransform trans; + /* 0x0018 */ s16 animFrame; + /* 0x001A */ s16 numActiveEmitters; + /* 0x001C */ f32 x_velocity; + /* 0x0020 */ f32 y_velocity; + /* 0x0024 */ f32 z_velocity; + /* 0x0028 */ f32 unk28; + /* 0x002C */ s16 headerType; + /* 0x002E */ s16 segmentID; + /* 0x0030 */ f32 distanceToCamera; + /* 0x0034 */ f32 unk34; + /* 0x0038 */ s8 unk38; + /* 0x0039 */ u8 opacity; + /* 0x003A */ s8 modelIndex; + /* 0x003B */ s8 animationID; + /* 0x003C */ LevelObjectEntry *level_entry; + /* 0x0040 */ ObjectHeader *header; + /* 0x0044 */ Vertex *curVertData; + /* 0x0048 */ s16 behaviorId; + /* 0x004A */ s16 objectID; // First 9 bits are object ID, last 7 bits are header size + /* 0x004C */ ObjectInteraction *interactObj; + /* 0x0050 */ ShadowData *shadow; + /* 0x0054 */ ShadeProperties *shading; + /* 0x0058 */ WaterEffect *waterEffect; + /* 0x005C */ Object_5C *unk5C; + /* 0x0060 */ AttachPoint *attachPoints; + /* 0x0064 */ union { + struct Object *animTarget; // BHV_ANIMATION + struct ObjectLight *light; // BHV_LIGHT_RGBA + Object_Log *log; // BHV_BUOY_PIRATE_SHIP, BHV_LOG + Object_Boost *boost; // BHV_BOOST + JingleState *jingle_state; // BHV_TROPHY_CABINET + Object_Animator *animator; // BHV_ANIMATOR + Object_WeaponBalloon *weapon_balloon; // BHV_WEAPON_BALLOON + Object_Weapon *weapon; // BHV_FIREBALL_OCTOWEAPON_2, BHV_WEAPON, BHV_WEAPON_2 + Object_Butterfly *butterfly; // BHV_BUTTERFLY + Object_Fish *fish; // BHV_FISH + CharacterFlagModel *characterFlagModel; // BHV_CHARACTER_FLAG + Object_CollectEgg *egg; // BHV_COLLECT_EGG + Object_AudioLine *audio_line; // BHV_AUDIO_LINE + Object_AudioReverb *audio_reverb; // BHV_AUDIO_REVERB + Object_TexScroll *tex_scroll; // BHV_TEXTURE_SCROLL + Object_Frog *frog; // BHV_FROG + Object_Exit *exit; // BHV_EXIT + Object_Racer *racer; // BHV_RACER + Object_Door *door; // BHV_DOOR, BHV_TT_DOOR + Object_Trigger *trigger; // BHV_MODECHANGE, BHV_BONUS, BHV_TRIGGER + Object_Audio *audio; // BHV_AUDIO + Object_MidiFade *midi_fade; // BHV_MIDI_FADE + Object_MidiFadePoint *midi_fade_point; // BHV_MIDI_FADE_POINT + Object_MidiChannelSet *midi_channel_set; // BHV_MIDI_CHANNEL_SET + Object_Banana *banana; // BHV_BANANA + Object_NPC *npc; // BHV_STOPWATCH_MAN, BHV_PARK_WARDEN, BHV_GOLDEN_BALLOON + Object_Bridge_WhaleRamp *bridge_whale_ramp; // BHV_BRIDGE_WHALE_RAMP + Object_LaserGun *lasergun; // BHV_LASER_GUN + Object_AnimatedObject *animatedObject; // BHV_DINO_WHALE, BHV_ANIMATED_OBJECT, BHV_CAMERA_ANIMATION + // BHV_CAR_ANIMATION, BHV_CHARACTER_SELECT, BHV_VEHICLE_ANIMATION + // BHV_HIT_TESTER, BHV_HIT_TESTER_2, BHV_PARK_WARDEN_2 + // BHV_ANIMATED_OBJECT_2, BHV_WIZPIG_SHIP, BHV_ANIMATED_OBJECT_3 + // BHV_ANIMATED_OBJECT_4, BHV_SNOWBALL, BHV_SNOWBALL_2 + // BHV_SNOWBALL_3, BHV_SNOWBALL_4, BHV_HIT_TESTER_3 + // BHV_HIT_TESTER_4, BHV_DOOR_OPENER, BHV_PIG_ROCKETEER + // BHV_WIZPIG_GHOSTS + Object_AiNode *ai_node; // BHV_AINODE + Object_OverridePos *override_pos; // BHV_OVERRIDE_POS + void *anyBehaviorData; + }; + /* 0x0068 */ union { + ModelInstance **modelInstances; + TextureHeader **textures; + Sprite **sprites; + }; + /* 0x006C */ struct ParticleEmitter *particleEmitter; + /* 0x0070 */ struct ObjectLight **lightData; + /* 0x0074 */ u32 particleEmittersEnabled; + /* 0x0078 */ ObjProperties properties; +} Object; + typedef struct unk800B2260_C { s32 unk0; s32 unk4; @@ -1761,42 +1646,29 @@ typedef struct unk800B2260_C { u8 unk74; } unk800B2260_C; -/* Size: 0x018 bytes */ -typedef struct ObjectTransform { - /* 0x0000 */ Vec3s rotation; - union { - /* 0x0006 */ s16 flags; - /* 0x0006 */ s16 spriteID; - }; - /* 0x0008 */ f32 scale; - /* 0x000C */ f32 x_position; - /* 0x0010 */ f32 y_position; - /* 0x0014 */ f32 z_position; -} ObjectTransform; - typedef struct SegmentPropertiesObject { - /* 0x002C */ s16 unk2C; - /* 0x002E */ s16 segmentID; - /* 0x0030 */ f32 distanceToCamera; - /* 0x0034 */ f32 unk34; - /* 0x0038 */ s8 unk38; - /* 0x0039 */ u8 opacity; - /* 0x003A */ s8 modelIndex; - /* 0x003B */ s8 animationID; + /* 0x002C */ s16 unk2C; + /* 0x002E */ s16 segmentID; + /* 0x0030 */ f32 distanceToCamera; + /* 0x0034 */ f32 unk34; + /* 0x0038 */ s8 unk38; + /* 0x0039 */ u8 opacity; + /* 0x003A */ s8 modelIndex; + /* 0x003B */ s8 animationID; } SegmentPropertiesObject; /* Size: 0x44 bytes */ typedef struct ObjectSegment { - /* 0x0000 */ ObjectTransform trans; - /* 0x0018 */ s16 animFrame; - /* 0x001A */ s16 numActiveEmitters; - /* 0x001C */ f32 x_velocity; - /* 0x0020 */ f32 y_velocity; - /* 0x0024 */ f32 z_velocity; - /* 0x0028 */ f32 unk28; - /* 0x002C */ SegmentPropertiesObject object; - /* 0x003C */ LevelObjectEntry* level_entry; - /* 0x0040 */ ObjectHeader *header; + /* 0x0000 */ ObjectTransform trans; + /* 0x0018 */ s16 animFrame; + /* 0x001A */ s16 numActiveEmitters; + /* 0x001C */ f32 x_velocity; + /* 0x0020 */ f32 y_velocity; + /* 0x0024 */ f32 z_velocity; + /* 0x0028 */ f32 unk28; + /* 0x002C */ SegmentPropertiesObject object; + /* 0x003C */ LevelObjectEntry *level_entry; + /* 0x0040 */ ObjectHeader *header; } ObjectSegment; typedef struct Object_LightData_UnkC_Unk44 { @@ -1805,72 +1677,48 @@ typedef struct Object_LightData_UnkC_Unk44 { } Object_LightData_UnkC_Unk44; typedef struct Object_LightData_UnkC { - /* 0x00 */ ObjectTransform trans; - /* 0x18 */ u8 pad18[0x22]; - /* 0x3A */ s16 unk3A; - /* 0x3C */ u8 pad3C[0x8]; - /* 0x44 */ Object_LightData_UnkC_Unk44 *unk44; - /* 0x48 */ u8 pad48[0x14]; - /* 0x5C */ s16 unk5C; - /* 0x5E */ u8 pad5E[0xE]; - /* 0x6C */ u8 unk6C; - /* 0x6D */ u8 unk6D; - /* 0x6E */ u8 unk6E; - /* 0x6F */ u8 pad6F[0x6]; - /* 0x75 */ u8 unk75; - /* 0x76 */ u8 pad76; - /* 0x77 */ s8 unk77; + /* 0x00 */ ObjectTransform trans; + /* 0x18 */ u8 pad18[0x22]; + /* 0x3A */ s16 unk3A; + /* 0x3C */ u8 pad3C[0x8]; + /* 0x44 */ Object_LightData_UnkC_Unk44 *unk44; + /* 0x48 */ u8 pad48[0x14]; + /* 0x5C */ s16 unk5C; + /* 0x5E */ u8 pad5E[0xE]; + /* 0x6C */ u8 unk6C; + /* 0x6D */ u8 unk6D; + /* 0x6E */ u8 unk6E; + /* 0x6F */ u8 pad6F[0x6]; + /* 0x75 */ u8 unk75; + /* 0x76 */ u8 pad76; + /* 0x77 */ s8 unk77; } Object_LightData_UnkC; typedef struct Object_LightData { - /* 0x00 */ u8 pad0[6]; - /* 0x06 */ u8 unk6; - /* 0x07 */ u8 pad7[5]; - /* 0x0C */ Object_LightData_UnkC **unkC; + /* 0x00 */ u8 pad0[6]; + /* 0x06 */ u8 unk6; + /* 0x07 */ u8 pad7[5]; + /* 0x0C */ Object_LightData_UnkC **unkC; } Object_LightData; -/* Size: 0x0630 bytes */ -typedef struct Object { - /* 0x0000 */ ObjectSegment segment; - /* 0x0044 */ Vertex *curVertData; - /* 0x0048 */ s16 behaviorId; - /* 0x004A */ s16 objectID; // First 9 bits are object ID, last 7 bits are header size - /* 0x004C */ ObjectInteraction *interactObj; //player + 0x318 - /* 0x0050 */ ShadowData *shadow; //player + 0x2F4 - /* 0x0054 */ ShadeProperties *shading; //player + 0x2C0 - /* 0x0058 */ WaterEffect *waterEffect; //player + 0x304 - /* 0x005C */ Object_5C *unk5C; - /* 0x0060 */ AttachPoint *attachPoints; // Object attachments. This includes vehicle parts. - /* 0x0064 */ Object_64 *unk64; //player + 0x98 - /* 0x0068 */ union { - ModelInstance **modelInstances; - TextureHeader **textures; - Sprite **sprites; - }; - /* 0x006C */ struct ParticleEmitter *particleEmitter; //player + 0x370 - /* 0x0070 */ struct ObjectLight **lightData; - /* 0x0074 */ u32 particleEmittersEnabled; - /* 0x0078 */ ObjProperties properties; -} Object; - // Unused typedef struct GhostHeaderUnk0 { - u8 levelID; - u8 vehicleID; // 0 = Car, 1 = Hovercraft, 2 = Plane + u8 levelID; + u8 vehicleID; // 0 = Car, 1 = Hovercraft, 2 = Plane } GhostHeaderUnk0; /* Size: 8 bytes */ typedef struct GhostHeader { union { - GhostHeaderUnk0 unk0; - s16 checksum; + GhostHeaderUnk0 unk0; + s16 checksum; }; union { - struct { - u8 characterID; // 9 = T.T. - u8 unk3; - }; - s16 unk2; + struct { + u8 characterID; // 9 = T.T. + u8 unk3; + }; + s16 unk2; }; union { struct { @@ -1884,11 +1732,11 @@ typedef struct GhostHeader { /* Size: 12 bytes */ typedef struct GhostNode { - /* 0x00 */ s16 x; - /* 0x02 */ s16 y; - /* 0x04 */ s16 z; - /* 0x06 */ s16 zRotation; // This order is correct. - /* 0x08 */ s16 xRotation; - /* 0x0A */ s16 yRotation; + /* 0x00 */ s16 x; + /* 0x02 */ s16 y; + /* 0x04 */ s16 z; + /* 0x06 */ s16 zRotation; // This order is correct. + /* 0x08 */ s16 xRotation; + /* 0x0A */ s16 yRotation; } GhostNode; #endif diff --git a/src/audio_vehicle.c b/src/audio_vehicle.c index b9e80b78..53b2abdd 100644 --- a/src/audio_vehicle.c +++ b/src/audio_vehicle.c @@ -143,7 +143,7 @@ VehicleSoundData *racer_sound_init(s32 characterId, s32 vehicleId) { */ void racer_sound_update(Object *obj, u32 buttonsPressed, u32 buttonsHeld, s32 ticksDelta) { if (gVehicleSounds) { - gSoundRacerObj = &obj->unk64->racer; + gSoundRacerObj = obj->racer; gRacerSound = gSoundRacerObj->vehicleSound; if (gRacerSound != NULL) { if (get_race_countdown() != 0) { @@ -157,9 +157,9 @@ void racer_sound_update(Object *obj, u32 buttonsPressed, u32 buttonsHeld, s32 ti gRacerSound->racerPos.y = -32000.0f; gRacerSound->racerPos.z = -32000.0f; } else { - gRacerSound->racerPos.x = obj->segment.trans.x_position; - gRacerSound->racerPos.y = obj->segment.trans.y_position; - gRacerSound->racerPos.z = obj->segment.trans.z_position; + gRacerSound->racerPos.x = obj->trans.x_position; + gRacerSound->racerPos.y = obj->trans.y_position; + gRacerSound->racerPos.z = obj->trans.z_position; switch (gSoundRacerObj->vehicleIDPrev) { case VEHICLE_HOVERCRAFT: racer_sound_hovercraft(obj, buttonsPressed, buttonsHeld, ticksDelta); @@ -357,8 +357,8 @@ void racer_sound_car(Object *obj, u32 buttonsPressed, u32 buttonsHeld, s32 ticks sndp_set_param(gRacerSound->brakeSound, AL_SNDP_VOL_EVT, 0); } else { sndp_set_param(gRacerSound->brakeSound, AL_SNDP_VOL_EVT, gRacerSound->brakeSoundVolume << 8); - audspat_calculate_echo(gRacerSound->brakeSound, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position); + audspat_calculate_echo(gRacerSound->brakeSound, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position); } } @@ -389,8 +389,7 @@ void racer_sound_hovercraft(Object *obj, UNUSED u32 buttonsPressed, u32 buttonsH u8 i; if (get_race_countdown() == 0) { - speed = sqrtf((obj->segment.x_velocity * obj->segment.x_velocity) + - (obj->segment.z_velocity * obj->segment.z_velocity)); + speed = sqrtf((obj->x_velocity * obj->x_velocity) + (obj->z_velocity * obj->z_velocity)); } else { speed = 0.0f; } @@ -507,9 +506,8 @@ void racer_sound_plane(Object *obj, UNUSED u32 buttonsPressed, u32 buttonsHeld, f32 temp2; if (get_race_countdown() == 0) { - speed = sqrtf((obj->segment.x_velocity * obj->segment.x_velocity) + - (obj->segment.z_velocity * obj->segment.z_velocity) + - (obj->segment.y_velocity * obj->segment.y_velocity)); + speed = sqrtf((obj->x_velocity * obj->x_velocity) + (obj->z_velocity * obj->z_velocity) + + (obj->y_velocity * obj->y_velocity)); } else { speed = 0.0f; } @@ -557,8 +555,8 @@ void racer_sound_plane(Object *obj, UNUSED u32 buttonsPressed, u32 buttonsHeld, targetPitch += gRacerSound->thrustPitch; // Add pitch modifiers based on pitch and roll angles of the plane. - xSine = sins_f(obj->segment.trans.rotation.x_rotation); - zSine = sins_f(obj->segment.trans.rotation.z_rotation); + xSine = sins_f(obj->trans.rotation.x_rotation); + zSine = sins_f(obj->trans.rotation.z_rotation); temp = gRacerSound->pitchAnglePitchScale * xSine; temp2 = gRacerSound->rollAnglePitchScale * zSine; temp2 = ABSF(temp2); @@ -618,7 +616,7 @@ void racer_sound_plane(Object *obj, UNUSED u32 buttonsPressed, u32 buttonsHeld, void racer_sound_free(Object *obj) { s32 i; - gRacerSound = obj->unk64->racer.vehicleSound; + gRacerSound = obj->racer->vehicleSound; if (gRacerSound != NULL) { for (i = 0; i != 2; i++) { if (gRacerSound->soundHandle[i] != NULL) { @@ -640,7 +638,7 @@ void racer_sound_free(Object *obj) { } } mempool_free(gRacerSound); - obj->unk64->racer.vehicleSound = NULL; + obj->racer->vehicleSound = NULL; } } @@ -681,8 +679,8 @@ void racer_sound_doppler_effect(Object *observerObj, Camera *camera, Object *sou questionable logic deserves to be pointed out. */ - observerRacer = &observerObj->unk64->racer; - sourceRacer = &sourceObj->unk64->racer; + observerRacer = observerObj->racer; + sourceRacer = sourceObj->racer; gRacerSound = sourceRacer->vehicleSound; if (gRacerSound != NULL) { if (camera != NULL) { @@ -695,9 +693,9 @@ void racer_sound_doppler_effect(Object *observerObj, Camera *camera, Object *sou } else { // If the observer is a player, things get unnecessarily complex. // First, fetch the observer's position. - xObs = observerObj->segment.trans.x_position; - yObs = observerObj->segment.trans.y_position; - zObs = observerObj->segment.trans.z_position; + xObs = observerObj->trans.x_position; + yObs = observerObj->trans.y_position; + zObs = observerObj->trans.z_position; // Then compute the observer's speed. switch (observerRacer->vehicleID) { @@ -711,14 +709,14 @@ void racer_sound_doppler_effect(Object *observerObj, Camera *camera, Object *sou break; case VEHICLE_HOVERCRAFT: // 2D ground speed - obsSpeed = sqrtf(observerObj->segment.x_velocity * observerObj->segment.x_velocity + - observerObj->segment.z_velocity * observerObj->segment.z_velocity); + obsSpeed = sqrtf(observerObj->x_velocity * observerObj->x_velocity + + observerObj->z_velocity * observerObj->z_velocity); break; default: // Full 3D velocity - obsSpeed = sqrtf(observerObj->segment.x_velocity * observerObj->segment.x_velocity + - observerObj->segment.z_velocity * observerObj->segment.z_velocity + - observerObj->segment.y_velocity * observerObj->segment.y_velocity); + obsSpeed = sqrtf(observerObj->x_velocity * observerObj->x_velocity + + observerObj->z_velocity * observerObj->z_velocity + + observerObj->y_velocity * observerObj->y_velocity); break; } // For some reason, speed is capped at 15, and a velocity factor is derived from that. @@ -730,9 +728,9 @@ void racer_sound_doppler_effect(Object *observerObj, Camera *camera, Object *sou } // Calculate the distance between source and observer - deltaX = sourceObj->segment.trans.x_position - xObs; - deltaY = sourceObj->segment.trans.y_position - yObs; - deltaZ = sourceObj->segment.trans.z_position - zObs; + deltaX = sourceObj->trans.x_position - xObs; + deltaY = sourceObj->trans.y_position - yObs; + deltaZ = sourceObj->trans.z_position - zObs; distance = sqrtf(((deltaX * deltaX) + (deltaY * deltaY)) + (deltaZ * deltaZ)); // Compute relative velocity — this is actually all that's needed for the Doppler effect! @@ -795,7 +793,7 @@ void racer_sound_update_all(Object **racerObjs, s32 numRacers, Camera *cameras, // First, calculate engine and idle sound parameters for each player. for (i = 0; i < numCameras; i++) { - racer = &racerObjs[i]->unk64->racer; + racer = racerObjs[i]->racer; if (racer != NULL) { gRacerSound = racer->vehicleSound; } else { @@ -806,9 +804,9 @@ void racer_sound_update_all(Object **racerObjs, s32 numRacers, Camera *cameras, if (racer->raceFinished || check_if_showing_cutscene_camera()) { // If the race is finished or a cutscene is playing, the vehicle is considered to move relative to the // camera, so we calculate the engine sound's pitch, volume, and stereo pan accordingly. - deltaX = racerObjs[i]->segment.trans.x_position - cameras[i].trans.x_position; - deltaY = racerObjs[i]->segment.trans.y_position - cameras[i].trans.y_position; - deltaZ = racerObjs[i]->segment.trans.z_position - cameras[i].trans.z_position; + deltaX = racerObjs[i]->trans.x_position - cameras[i].trans.x_position; + deltaY = racerObjs[i]->trans.y_position - cameras[i].trans.y_position; + deltaZ = racerObjs[i]->trans.z_position - cameras[i].trans.z_position; racer_sound_doppler_effect(racerObjs[i], cameras, racerObjs[i], tickDelta); gRacerSound->distToCamera = sqrtf((deltaX * deltaX) + (deltaY * deltaY) + (deltaZ * deltaZ)); @@ -851,9 +849,8 @@ void racer_sound_update_all(Object **racerObjs, s32 numRacers, Camera *cameras, gRacerSound->engineIdleMaxPitch / 100.0f) * idle_intensity; if (gRacerSound->engineIdleSoundHandle != NULL) { - audspat_calculate_echo( - gRacerSound->engineIdleSoundHandle, racerObjs[i]->segment.trans.x_position, - racerObjs[i]->segment.trans.y_position, racerObjs[i]->segment.trans.z_position); + audspat_calculate_echo(gRacerSound->engineIdleSoundHandle, racerObjs[i]->trans.x_position, + racerObjs[i]->trans.y_position, racerObjs[i]->trans.z_position); sndp_set_param(gRacerSound->engineIdleSoundHandle, AL_SNDP_VOL_EVT, volume << 8); sndp_set_param(gRacerSound->engineIdleSoundHandle, AL_SNDP_PITCH_EVT, *((u32 *) &pitch)); sndp_set_priority(gRacerSound->engineIdleSoundHandle, 80); @@ -897,9 +894,8 @@ void racer_sound_update_all(Object **racerObjs, s32 numRacers, Camera *cameras, func_80001F14(gRacerSound->soundId[j], &gRacerSound->soundHandle[j]); } if (gRacerSound->soundHandle[j] != NULL) { - audspat_calculate_echo(gRacerSound->soundHandle[j], racerObjs[i]->segment.trans.x_position, - racerObjs[i]->segment.trans.y_position, - racerObjs[i]->segment.trans.z_position); + audspat_calculate_echo(gRacerSound->soundHandle[j], racerObjs[i]->trans.x_position, + racerObjs[i]->trans.y_position, racerObjs[i]->trans.z_position); sndp_set_param(gRacerSound->soundHandle[j], AL_SNDP_VOL_EVT, volume << 8); sndp_set_param(gRacerSound->soundHandle[j], AL_SNDP_PITCH_EVT, *((u32 *) &pitch)); sndp_set_priority(gRacerSound->soundHandle[j], 80); @@ -925,7 +921,7 @@ void racer_sound_update_all(Object **racerObjs, s32 numRacers, Camera *cameras, // First, reset background volume for each AI vehicle. for (j = numCameras; j < numRacers; j++) { - racer = &racerObjs[j]->unk64->racer; + racer = racerObjs[j]->racer; if (racer != NULL) { gRacerSound = racer->vehicleSound; if (gRacerSound != NULL) { @@ -940,19 +936,19 @@ void racer_sound_update_all(Object **racerObjs, s32 numRacers, Camera *cameras, // Doppler effect is the only pitch modifier applied here. for (i = 0; i < numCameras; i++) { - racer = &racerObjs[i]->unk64->racer; + racer = racerObjs[i]->racer; for (j = numCameras; j < numRacers; j++) { - if (racerObjs[j]->unk64 != NULL) { - gRacerSound = racerObjs[j]->unk64->racer.vehicleSound; + if (racerObjs[j]->racer != NULL) { + gRacerSound = racerObjs[j]->racer->vehicleSound; if (gRacerSound != NULL) { if (racer->raceFinished) { - deltaX = racerObjs[j]->segment.trans.x_position - cameras[i].trans.x_position; - deltaY = racerObjs[j]->segment.trans.y_position - cameras[i].trans.y_position; - deltaZ = racerObjs[j]->segment.trans.z_position - cameras[i].trans.z_position; + deltaX = racerObjs[j]->trans.x_position - cameras[i].trans.x_position; + deltaY = racerObjs[j]->trans.y_position - cameras[i].trans.y_position; + deltaZ = racerObjs[j]->trans.z_position - cameras[i].trans.z_position; } else { - deltaX = racerObjs[j]->segment.trans.x_position - racerObjs[i]->segment.trans.x_position; - deltaY = racerObjs[j]->segment.trans.y_position - racerObjs[i]->segment.trans.y_position; - deltaZ = racerObjs[j]->segment.trans.z_position - racerObjs[i]->segment.trans.z_position; + deltaX = racerObjs[j]->trans.x_position - racerObjs[i]->trans.x_position; + deltaY = racerObjs[j]->trans.y_position - racerObjs[i]->trans.y_position; + deltaZ = racerObjs[j]->trans.z_position - racerObjs[i]->trans.z_position; } gRacerSound->distToCamera = sqrtf((deltaX * deltaX) + (deltaY * deltaY) + (deltaZ * deltaZ)); if (gRacerSound->distToCamera < 1500.0f) { @@ -1012,8 +1008,8 @@ void racer_sound_update_all(Object **racerObjs, s32 numRacers, Camera *cameras, // Replace background sounds based on volume priority. //!@bug: loop starts from 1 instead of numCameras — possibly unintended. for (j = 1; j < numRacers; j++) { - racer = &racerObjs[j]->unk64->racer; - if (racerObjs[j]->unk64 != NULL) { + racer = racerObjs[j]->racer; + if (racerObjs[j]->racer != NULL) { gRacerSound = racer->vehicleSound; if (gRacerSound != NULL) { // If a sound is currently stopped, check whether it should be restarted and find a suitable slot. diff --git a/src/camera.c b/src/camera.c index ec1219b2..1f630646 100644 --- a/src/camera.c +++ b/src/camera.c @@ -1073,15 +1073,15 @@ s32 render_sprite_billboard(Gfx **dList, Mtx **mtx, Vertex **vtx, Object *obj, S // between the object and the camera, as well as properly orienting the sprite in 3D space. // Calculate camera position relative to the object's position - diffX = gCameraRelPosStackX[gCameraMatrixPos] - obj->segment.trans.x_position; - diffY = gCameraRelPosStackY[gCameraMatrixPos] - obj->segment.trans.y_position; - diffZ = gCameraRelPosStackZ[gCameraMatrixPos] - obj->segment.trans.z_position; + diffX = gCameraRelPosStackX[gCameraMatrixPos] - obj->trans.x_position; + diffY = gCameraRelPosStackY[gCameraMatrixPos] - obj->trans.y_position; + diffZ = gCameraRelPosStackZ[gCameraMatrixPos] - obj->trans.z_position; // Rotate camera coordinates by the object's yaw rotation // to get the camera orientation relative to the vehicle, // e.g., to determine if we view the wheel from the side. - sineY = sins_f(obj->segment.trans.rotation.y_rotation); - cosY = coss_f(obj->segment.trans.rotation.y_rotation); + sineY = sins_f(obj->trans.rotation.y_rotation); + cosY = coss_f(obj->trans.rotation.y_rotation); temp = (diffX * cosY) + (diffZ * sineY); diffZ = (diffZ * cosY) - (diffX * sineY); @@ -1113,17 +1113,17 @@ s32 render_sprite_billboard(Gfx **dList, Mtx **mtx, Vertex **vtx, Object *obj, S // Construct the model matrix for the sprite, // orienting it perpendicular to the camera and applying the calculated tilt angle. - diffX = gCameraRelPosStackX[gCameraMatrixPos] - obj->segment.trans.x_position; - diffY = gCameraRelPosStackY[gCameraMatrixPos] - obj->segment.trans.y_position; - diffZ = gCameraRelPosStackZ[gCameraMatrixPos] - obj->segment.trans.z_position; + diffX = gCameraRelPosStackX[gCameraMatrixPos] - obj->trans.x_position; + diffY = gCameraRelPosStackY[gCameraMatrixPos] - obj->trans.y_position; + diffZ = gCameraRelPosStackZ[gCameraMatrixPos] - obj->trans.z_position; lateralDist = sqrtf((diffX * diffX) + (diffZ * diffZ)); gCameraTransform.rotation.y_rotation = arctan2_f(diffX, diffZ); gCameraTransform.rotation.x_rotation = -arctan2_f(diffY, lateralDist); gCameraTransform.rotation.z_rotation = tiltAngle; - gCameraTransform.scale = obj->segment.trans.scale; - gCameraTransform.x_position = obj->segment.trans.x_position; - gCameraTransform.y_position = obj->segment.trans.y_position; - gCameraTransform.z_position = obj->segment.trans.z_position; + gCameraTransform.scale = obj->trans.scale; + gCameraTransform.x_position = obj->trans.x_position; + gCameraTransform.y_position = obj->trans.y_position; + gCameraTransform.z_position = obj->trans.z_position; mtxf_from_transform(&gCurrentModelMatrixF, &gCameraTransform); gModelMatrixStackPos++; mtxf_mul(&gCurrentModelMatrixF, gModelMatrixF[gModelMatrixStackPos - 1], gModelMatrixF[gModelMatrixStackPos]); @@ -1139,9 +1139,9 @@ s32 render_sprite_billboard(Gfx **dList, Mtx **mtx, Vertex **vtx, Object *obj, S // Push the anchor vertex at the object's position v = *vtx; - v->x = obj->segment.trans.x_position; - v->y = obj->segment.trans.y_position; - v->z = obj->segment.trans.z_position; + v->x = obj->trans.x_position; + v->y = obj->trans.y_position; + v->z = obj->trans.z_position; v->r = 255; // These don't actually do anything since vertex colours are disabled anyway. v->g = 255; v->b = 255; @@ -1153,14 +1153,13 @@ s32 render_sprite_billboard(Gfx **dList, Mtx **mtx, Vertex **vtx, Object *obj, S // so the sprite tilts consistently with other objects relative to the camera. // Aspect ratio compensation is applied to maintain proper sprite proportions on screen. if (!gCutsceneCameraActive) { - tiltAngle = gCameras[gActiveCameraID].trans.rotation.z_rotation + obj->segment.trans.rotation.z_rotation; + tiltAngle = gCameras[gActiveCameraID].trans.rotation.z_rotation + obj->trans.rotation.z_rotation; } else { - tiltAngle = - gCameras[gActiveCameraID + 4].trans.rotation.z_rotation + obj->segment.trans.rotation.z_rotation; + tiltAngle = gCameras[gActiveCameraID + 4].trans.rotation.z_rotation + obj->trans.rotation.z_rotation; } - frameID = obj->segment.animFrame; + frameID = obj->animFrame; gModelMatrixStackPos++; - mtxf_billboard(gModelMatrixF[gModelMatrixStackPos], tiltAngle, obj->segment.trans.scale, gVideoAspectRatio); + mtxf_billboard(gModelMatrixF[gModelMatrixStackPos], tiltAngle, obj->trans.scale, gVideoAspectRatio); mtxf_to_mtx(gModelMatrixF[gModelMatrixStackPos], *mtx); gModelMatrix[gModelMatrixStackPos] = *mtx; gSPMatrixDKR((*dList)++, OS_K0_TO_PHYSICAL((*mtx)++), G_MTX_DKR_INDEX_2); @@ -1299,23 +1298,23 @@ void mtx_shear_push(Gfx **dList, Mtx **mtx, Object *obj, Object *objBase, f32 sh f32 arg3_zPos; MtxF matrix_mult; - cossf_x_arg2 = coss_f(obj->segment.trans.rotation.x_rotation); - sinsf_x_arg2 = sins_f(obj->segment.trans.rotation.x_rotation); - cossf_y_arg2 = coss_f(obj->segment.trans.rotation.y_rotation); - sinsf_y_arg2 = sins_f(obj->segment.trans.rotation.y_rotation); - arg2_xPos = obj->segment.trans.x_position; - arg2_yPos = obj->segment.trans.y_position; - arg2_zPos = obj->segment.trans.z_position; - cossf_z_arg3 = coss_f(objBase->segment.trans.rotation.z_rotation); - sinsf_z_arg3 = sins_f(objBase->segment.trans.rotation.z_rotation); - cossf_x_arg3 = coss_f(objBase->segment.trans.rotation.x_rotation); - sinsf_x_arg3 = sins_f(objBase->segment.trans.rotation.x_rotation); - cossf_y_arg3 = coss_f(objBase->segment.trans.rotation.y_rotation); - sinsf_y_arg3 = sins_f(objBase->segment.trans.rotation.y_rotation); - arg3_xPos = objBase->segment.trans.x_position; - arg3_yPos = objBase->segment.trans.y_position; - arg3_zPos = objBase->segment.trans.z_position; - arg2_scale = obj->segment.trans.scale; + cossf_x_arg2 = coss_f(obj->trans.rotation.x_rotation); + sinsf_x_arg2 = sins_f(obj->trans.rotation.x_rotation); + cossf_y_arg2 = coss_f(obj->trans.rotation.y_rotation); + sinsf_y_arg2 = sins_f(obj->trans.rotation.y_rotation); + arg2_xPos = obj->trans.x_position; + arg2_yPos = obj->trans.y_position; + arg2_zPos = obj->trans.z_position; + cossf_z_arg3 = coss_f(objBase->trans.rotation.z_rotation); + sinsf_z_arg3 = sins_f(objBase->trans.rotation.z_rotation); + cossf_x_arg3 = coss_f(objBase->trans.rotation.x_rotation); + sinsf_x_arg3 = sins_f(objBase->trans.rotation.x_rotation); + cossf_y_arg3 = coss_f(objBase->trans.rotation.y_rotation); + sinsf_y_arg3 = sins_f(objBase->trans.rotation.y_rotation); + arg3_xPos = objBase->trans.x_position; + arg3_yPos = objBase->trans.y_position; + arg3_zPos = objBase->trans.z_position; + arg2_scale = obj->trans.scale; shear *= arg2_scale; matrix_mult[0][0] = ((((cossf_z_arg3 * cossf_y_arg3) + (sinsf_z_arg3 * (sinsf_x_arg3 * sinsf_y_arg3))) * cossf_y_arg2) + diff --git a/src/game_ui.c b/src/game_ui.c index 63be5e9b..1395365e 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -704,7 +704,7 @@ void hud_render_player(Gfx **dList, Mtx **mtx, Vertex **vertexList, Object *obj, } } if (gShowHUD == FALSE) { - racer = &obj->unk64->racer; + racer = obj->racer; if (D_8012718A) { gHudController = 1 - racer->playerIndex; } else { @@ -947,7 +947,7 @@ void hud_audio_update(s32 updateRate) { * In a race, render all of the race related HUD. */ void hud_main_race(s32 countdown, Object *obj, s32 updateRate) { - Object_Racer *racer = &obj->unk64->racer; + Object_Racer *racer = obj->racer; cam_set_sprite_anim_mode(SPRITE_ANIM_FRAME_INDEX); hud_course_arrows(racer, updateRate); @@ -1078,14 +1078,14 @@ void hud_main_treasure(s32 countdown, Object *obj, s32 updateRate) { s32 numRacers; s32 i; - racer = &obj->unk64->racer; + racer = obj->racer; racers = get_racer_objects(&numRacers); cam_set_sprite_anim_mode(SPRITE_ANIM_FRAME_INDEX); hud_race_start(countdown, updateRate); switch (gNumActivePlayers) { case 1: for (i = 0; i < numRacers; i++) { - racer = &racers[i]->unk64->racer; + racer = racers[i]->racer; hud_treasure(racer); if (i == 1) { gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x += 55.0f; @@ -1103,7 +1103,7 @@ void hud_main_treasure(s32 countdown, Object *obj, s32 updateRate) { hud_treasure(racer); break; } - racer = &obj->unk64->racer; + racer = obj->racer; rendermode_reset(&gHudDL); hud_bananas(racer, updateRate); hud_weapon(obj, updateRate); @@ -1114,7 +1114,7 @@ void hud_main_treasure(s32 countdown, Object *obj, s32 updateRate) { * The Egg Collector challenge mode displays the icons of each player and their score. */ void hud_main_eggs(s32 countdown, Object *obj, s32 updateRate) { - Object_Racer *racer = &obj->unk64->racer; + Object_Racer *racer = obj->racer; if (racer->raceFinished == FALSE) { cam_set_sprite_anim_mode(SPRITE_ANIM_FRAME_INDEX); hud_race_start(countdown, updateRate); @@ -1152,7 +1152,7 @@ void hud_draw_eggs(Object *racerObj, s32 updateRate) { if (gNumActivePlayers == 2) { finishedPlayers = 0; for (i = 0; i < numRacers; i++) { - curRacer = &racers[i]->unk64->racer; + curRacer = racers[i]->racer; if (curRacer->playerIndex != PLAYER_COMPUTER && curRacer->raceFinished) { finishedPlayers++; } @@ -1162,9 +1162,9 @@ void hud_draw_eggs(Object *racerObj, s32 updateRate) { } } if (racerObj != NULL) { - racer = &racerObj->unk64->racer; + racer = racerObj->racer; } else { - racer = &racers[0]->unk64->racer; + racer = racers[0]->racer; } if (numRacers == MAXCONTROLLERS) { cam_set_sprite_anim_mode(SPRITE_ANIM_FRAME_INDEX); @@ -1173,7 +1173,7 @@ void hud_draw_eggs(Object *racerObj, s32 updateRate) { diffX = (gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x - portraitX); diffY = (gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.y - portraitY); for (i = 0; i < MAXCONTROLLERS; i++) { - curRacer = &racers[i]->unk64->racer; + curRacer = racers[i]->racer; if (gNumActivePlayers < 3 || racer->playerIndex == curRacer->playerIndex) { hud_eggs_portrait(curRacer, updateRate); } @@ -1251,7 +1251,7 @@ void hud_main_battle(s32 countdown, Object *obj, s32 updateRate) { s32 racersFinished; s32 i; - racer = &obj->unk64->racer; + racer = obj->racer; if (gNumActivePlayers != 1 || racer->raceFinished == FALSE) { cam_set_sprite_anim_mode(SPRITE_ANIM_FRAME_INDEX); hud_race_start(countdown, updateRate); @@ -1264,7 +1264,7 @@ void hud_main_battle(s32 countdown, Object *obj, s32 updateRate) { case 2: racersFinished = 0; for (i = 0; i < numRacers; i++) { - racer = &racerObjs[i]->unk64->racer; + racer = racerObjs[i]->racer; if (racer->playerIndex != PLAYER_COMPUTER && racer->raceFinished) { racersFinished++; } @@ -1297,9 +1297,9 @@ void func_800A1E48(Object *racerObj, s32 updateRate) { racers = get_racer_objects(&numRacers); if (racerObj != NULL) { - racer = &racerObj->unk64->racer; + racer = racerObj->racer; } else { - racer = &racers[PLAYER_ONE]->unk64->racer; + racer = racers[PLAYER_ONE]->racer; } cam_set_sprite_anim_mode(SPRITE_ANIM_FRAME_INDEX); @@ -1309,7 +1309,7 @@ void func_800A1E48(Object *racerObj, s32 updateRate) { prevChallengerPortraitX = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x; prevChallengerPortraitY = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; for (i = 0; i < 4; i++) { - curRacer = &racers[i]->unk64->racer; + curRacer = racers[i]->racer; tempX = (offsetX + prevChallengerPortraitX) - gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x; tempY = (offsetY + prevChallengerPortraitY) - gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x += tempX; @@ -1395,7 +1395,7 @@ void hud_lives_render(Object_Racer *racer, UNUSED s32 updateRate) { */ void hud_main_boss(s32 countdown, Object *obj, s32 updateRate) { LevelHeader *level; - Object_Racer *racer = &obj->unk64->racer; + Object_Racer *racer = obj->racer; cam_set_sprite_anim_mode(SPRITE_ANIM_FRAME_INDEX); hud_wrong_way(racer, updateRate); @@ -1417,7 +1417,7 @@ void hud_main_boss(s32 countdown, Object *obj, s32 updateRate) { * When racing Taj in the overworld, render most of the basic race hud. */ void hud_main_taj(s32 countdown, Object *obj, s32 updateRate) { - Object_Racer *racer = &obj->unk64->racer; + Object_Racer *racer = obj->racer; cam_set_sprite_anim_mode(SPRITE_ANIM_FRAME_INDEX); hud_wrong_way(racer, updateRate); @@ -1438,7 +1438,7 @@ void hud_main_hub(Object *obj, s32 updateRate) { HudElement *portrait; if (cam_get_viewport_layout() == PLAYER_ONE) { - racer = &obj->unk64->racer; + racer = obj->racer; cam_set_sprite_anim_mode(SPRITE_ANIM_FRAME_INDEX); hud_balloons(racer); hud_speedometre(obj, updateRate); @@ -1473,7 +1473,7 @@ void hud_main_time_trial(s32 arg0, Object *playerRacerObj, s32 updateRate) { f32 posZ; u16 soundID; - curRacer = &playerRacerObj->unk64->racer; + curRacer = playerRacerObj->racer; stopwatchTimer = 0; if (gAssetHudElements->entry[HUD_BALLOON_COUNT_X] == NULL) { ttSWBody.objectID = gAssetHudElementIds[HUD_BALLOON_COUNT_X] & 0xFFFF; @@ -1484,7 +1484,7 @@ void hud_main_time_trial(s32 arg0, Object *playerRacerObj, s32 updateRate) { gAssetHudElements->entry[HUD_BALLOON_COUNT_X] = spawn_object(&ttSWBody, OBJECT_SPAWN_NONE); gCurrentHud->entry[HUD_STOPWATCH_HANDS].rotation.y_rotation = -0x8000; if (gAssetHudElements->entry[HUD_BALLOON_COUNT_X] != NULL) { - ((Object *) gAssetHudElements->entry[HUD_BALLOON_COUNT_X])->segment.animFrame = 0; + ((Object *) gAssetHudElements->entry[HUD_BALLOON_COUNT_X])->animFrame = 0; } } @@ -1503,42 +1503,42 @@ void hud_main_time_trial(s32 arg0, Object *playerRacerObj, s32 updateRate) { return; } - ttSWBodyObject->segment.object.animationID = gStopwatchAnimID; + ttSWBodyObject->animationID = gStopwatchAnimID; modInst = ttSWBodyObject->modelInstances[0]; modInst->objModel->texOffsetUpdateRate = updateRate; if (gStopwatchAnimID != 0xFF) { if (gStopwatchAnimID == 4 && (get_race_countdown() || !music_is_playing())) { - ttSWBodyObject->segment.animFrame = 16; + ttSWBodyObject->animFrame = 16; } else if (gStopwatchAnimID == 4) { animcationFraction = music_animation_fraction(); temp_t6 = (modInst->objModel->animations[gStopwatchAnimID].animLength - 1) << 4; if (animcationFraction == -1.0) { - ttSWBodyObject->segment.animFrame = 0.0; + ttSWBodyObject->animFrame = 0.0; } else if (animcationFraction > 0.5) { animcationFraction -= 0.5; animcationFraction *= 2.0; - ttSWBodyObject->segment.animFrame = temp_t6 - (animcationFraction * temp_t6); + ttSWBodyObject->animFrame = temp_t6 - (animcationFraction * temp_t6); } else { animcationFraction *= 2; - ttSWBodyObject->segment.animFrame = temp_t6 * animcationFraction; + ttSWBodyObject->animFrame = temp_t6 * animcationFraction; } } else if (is_game_paused() == FALSE) { if (D_80126D69 < 0) { - if (ttSWBodyObject->segment.animFrame > -(updateRate * D_80126D69)) { - ttSWBodyObject->segment.animFrame += (updateRate * D_80126D69); + if (ttSWBodyObject->animFrame > -(updateRate * D_80126D69)) { + ttSWBodyObject->animFrame += (updateRate * D_80126D69); } else { - ttSWBodyObject->segment.animFrame = 1; + ttSWBodyObject->animFrame = 1; D_80126D69 = -D_80126D69; } } else { - ttSWBodyObject->segment.animFrame += (updateRate * D_80126D69); + ttSWBodyObject->animFrame += (updateRate * D_80126D69); temp_lo = (modInst->objModel->animations[gStopwatchAnimID].animLength - 1) << 4; - if (ttSWBodyObject->segment.animFrame >= temp_lo) { + if (ttSWBodyObject->animFrame >= temp_lo) { if (D_80126D68 != 0) { D_80126D69 = -D_80126D69; - ttSWBodyObject->segment.animFrame = temp_lo - 1; + ttSWBodyObject->animFrame = temp_lo - 1; } else { - ttSWBodyObject->segment.animFrame = 0; + ttSWBodyObject->animFrame = 0; if (curRacer->wrongWayCounter == 0 && curRacer->raceFinished == FALSE) { hud_stopwatch_face(4, 0, 4, 1, 1); } @@ -1644,9 +1644,9 @@ void hud_main_time_trial(s32 arg0, Object *playerRacerObj, s32 updateRate) { ttSWBodyObject = timetrial_player_ghost(); if (ttSWBodyObject != NULL) { if (get_race_countdown() == 0 && curRacer->raceFinished == FALSE) { - posX = ttSWBodyObject->segment.trans.x_position - playerRacerObj->segment.trans.x_position; - posY = ttSWBodyObject->segment.trans.y_position - playerRacerObj->segment.trans.y_position; - posZ = ttSWBodyObject->segment.trans.z_position - playerRacerObj->segment.trans.z_position; + posX = ttSWBodyObject->trans.x_position - playerRacerObj->trans.x_position; + posY = ttSWBodyObject->trans.y_position - playerRacerObj->trans.y_position; + posZ = ttSWBodyObject->trans.z_position - playerRacerObj->trans.z_position; if ((sqrtf((posX * posX) + (posY * posY) + (posZ * posZ)) < 600.0f) && (gHUDVoiceSoundMask == 0) && (D_80126D50 == 0)) { soundID = SOUND_VOICE_TT_GO_FOR_IT + rand_range(0, 2); @@ -1819,15 +1819,13 @@ void hud_speedometre(Object *obj, UNUSED s32 updateRate) { if (gNumActivePlayers == 1) { if (!check_if_showing_cutscene_camera()) { - racer = &obj->unk64->racer; + racer = obj->racer; if (racer->raceFinished == FALSE) { if (racer->vehicleID == VEHICLE_PLANE) { - vel = 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)); + vel = sqrtf((obj->x_velocity * obj->x_velocity) + (obj->y_velocity * obj->y_velocity) + + (obj->z_velocity * obj->z_velocity)); } else { - vel = sqrtf((obj->segment.x_velocity * obj->segment.x_velocity) + - (obj->segment.z_velocity * obj->segment.z_velocity)); + vel = sqrtf((obj->x_velocity * obj->x_velocity) + (obj->z_velocity * obj->z_velocity)); } if (sRecordVel < vel) { sRecordVel = vel; @@ -1914,14 +1912,14 @@ void hud_race_start(s32 countdown, s32 updateRate) { s32 numRacerObjects; racerGroup = get_racer_objects(&numRacerObjects); randomRacer = racerGroup[rand_range(1, numRacerObjects) - 1]; - racer = &randomRacer->unk64->racer; + racer = randomRacer->racer; if (racer->vehicleID == VEHICLE_CAR) { if (rand_range(0, 100) >= 96) { frequency = 1.25 - ((rand_range(0, 7) * 0.5) / 7.0); - audspat_play_sound_direct( - 76, randomRacer->segment.trans.x_position, randomRacer->segment.trans.y_position, - randomRacer->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, - ((rand_range(0, 7) * 63) / 7) + 24, frequency * 100.0f, &gRaceStartSoundMask); + audspat_play_sound_direct(76, randomRacer->trans.x_position, randomRacer->trans.y_position, + randomRacer->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, + ((rand_range(0, 7) * 63) / 7) + 24, frequency * 100.0f, + &gRaceStartSoundMask); } } } @@ -3029,7 +3027,7 @@ void hud_weapon(Object *obj, s32 updateRate) { Object_Racer *racer; s32 temp_a0; - racer = &obj->unk64->racer; + racer = obj->racer; if (racer->raceFinished == FALSE) { enable_pal_viewport_height_adjust(TRUE); temp_a0 = (racer->balloon_type * 3) + (racer->balloon_level); @@ -3119,12 +3117,12 @@ void hud_magnet_reticle(Object *racerObj) { Object_Racer *racer; if (entry) {} // Fakematch - racer = &racerObj->unk64->racer; + racer = racerObj->racer; if (racer->magnetTargetObj != NULL && get_current_viewport() == racer->playerIndex) { hud = &gCurrentHud->entry[HUD_MAGNET_RETICLE]; - hud->pos.x = racer->magnetTargetObj->segment.trans.x_position; - hud->pos.y = racer->magnetTargetObj->segment.trans.y_position; - hud->pos.z = racer->magnetTargetObj->segment.trans.z_position; + hud->pos.x = racer->magnetTargetObj->trans.x_position; + hud->pos.y = racer->magnetTargetObj->trans.y_position; + hud->pos.z = racer->magnetTargetObj->trans.z_position; entry = gAssetHudElements->entry[hud->spriteID]; if (entry == NULL) { return; @@ -3402,8 +3400,8 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) { if (gNumActivePlayers == 3) { tempVar4 = NULL; for (tempVar2 = 0; tempVar2 < objectCount; tempVar2++) { - if (objectGroup[tempVar2]->unk64->racer.playerIndex == PLAYER_COMPUTER) { - tempVar4 = &objectGroup[tempVar2]->unk64->racer; + if (objectGroup[tempVar2]->racer->playerIndex == PLAYER_COMPUTER) { + tempVar4 = objectGroup[tempVar2]->racer; } } if (tempVar4 != NULL) { @@ -3445,8 +3443,8 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) { if (gNumActivePlayers == 3) { curRacerObj = NULL; for (tempVar2 = 0; tempVar2 < objectCount; tempVar2++) { - if (objectGroup[tempVar2]->unk64->racer.playerIndex == PLAYER_COMPUTER) { - curRacerObj = &objectGroup[tempVar2]->unk64->racer; + if (objectGroup[tempVar2]->racer->playerIndex == PLAYER_COMPUTER) { + curRacerObj = objectGroup[tempVar2]->racer; } } if (curRacerObj != NULL) { @@ -3524,7 +3522,7 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) { spBC = gCurrentHud->entry[HUD_TREASURE_METRE].pos.y; racerGroup = get_racer_objects(&racerCount); for (sp144 = 0; sp144 < racerCount; sp144++) { - someRacer = &racerGroup[sp144]->unk64->racer; + someRacer = racerGroup[sp144]->racer; hud_treasure(someRacer); if (osTvType == OS_TV_TYPE_PAL) { gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y += 66.0; @@ -3541,8 +3539,8 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) { } else if (gNumActivePlayers == 3) { tempVar4 = NULL; for (tempVar2 = 0; tempVar2 < objectCount; tempVar2++) { - if (objectGroup[tempVar2]->unk64->racer.playerIndex == PLAYER_COMPUTER) { - tempVar4 = &objectGroup[tempVar2]->unk64->racer; + if (objectGroup[tempVar2]->racer->playerIndex == PLAYER_COMPUTER) { + tempVar4 = objectGroup[tempVar2]->racer; } } if (tempVar4 != NULL) { @@ -3584,7 +3582,7 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) { sp113 = TRUE; for (i = 0; i < objectCount; i++) { - someRacer = &objectGroup[i]->unk64->racer; + someRacer = objectGroup[i]->racer; if (someRacer != NULL && someRacer->playerIndex != PLAYER_COMPUTER && someRacer->raceFinished == FALSE) { sp113 = FALSE; } @@ -3667,22 +3665,20 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) { if (is_in_time_trial() && timetrial_valid_player_ghost()) { temp_v0_8 = timetrial_player_ghost(); if (temp_v0_8 != NULL) { - minimap_marker_pos(temp_v0_8->segment.trans.x_position, temp_v0_8->segment.trans.z_position, sp114, sp118, - sp11C); + minimap_marker_pos(temp_v0_8->trans.x_position, temp_v0_8->trans.z_position, sp114, sp118, sp11C); gCurrentHud->entry[HUD_MINIMAP_MARKER].spriteID = HUD_SPRITE_MAP_DOT; gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = 0; gCurrentHud->entry[HUD_MINIMAP_MARKER].scale = 1.0f; - tempVar1 = (opacity * (f32) temp_v0_8->segment.object.opacity) * (1.0 / 128.0); + tempVar1 = (opacity * (f32) temp_v0_8->opacity) * (1.0 / 128.0); gDPSetPrimColor(gHudDL++, 0, 0, 60, 60, 60, tempVar1); hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_MINIMAP_MARKER]); } } temp_v0_8 = timetrial_ghost_staff(); if (temp_v0_8 != NULL) { - minimap_marker_pos(temp_v0_8->segment.trans.x_position, temp_v0_8->segment.trans.z_position, sp114, sp118, - sp11C); + minimap_marker_pos(temp_v0_8->trans.x_position, temp_v0_8->trans.z_position, sp114, sp118, sp11C); gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = 0; - tempVar1 = (opacity * (f32) temp_v0_8->segment.object.opacity) * (1.0 / 128.0); + tempVar1 = (opacity * (f32) temp_v0_8->opacity) * (1.0 / 128.0); gDPSetPrimColor(gHudDL++, 0, 0, gHudMinimapColours[8].red, gHudMinimapColours[8].green, gHudMinimapColours[8].blue, tempVar1); gCurrentHud->entry[HUD_MINIMAP_MARKER].scale = 1.0f; @@ -3694,8 +3690,7 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) { temp_v0_8 = find_taj_object(); if (temp_v0_8 != NULL) { gCurrentHud->entry[HUD_MINIMAP_MARKER].spriteID = HUD_SPRITE_MAP_DOT; - minimap_marker_pos(temp_v0_8->segment.trans.x_position, temp_v0_8->segment.trans.z_position, sp114, sp118, - sp11C); + minimap_marker_pos(temp_v0_8->trans.x_position, temp_v0_8->trans.z_position, sp114, sp118, sp11C); gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = 0; gDPSetPrimColor(gHudDL++, 0, 0, 255, 0, 255, opacity); gCurrentHud->entry[HUD_MINIMAP_MARKER].scale = 1.0f; @@ -3706,16 +3701,14 @@ void hud_render_general(Gfx **dList, Mtx **mtx, Vertex **vtx, s32 updateRate) { // Non AI players get an arrow instead of a blob that rotates. for (i = objectCount - 1; i >= 0; i--) { temp_v0_8 = objectGroup[i]; - someRacer = &objectGroup[i]->unk64->racer; + someRacer = objectGroup[i]->racer; if (someRacer != NULL) { - minimap_marker_pos(objectGroup[i]->segment.trans.x_position, objectGroup[i]->segment.trans.z_position, - sp114, sp118, sp11C); + minimap_marker_pos(objectGroup[i]->trans.x_position, objectGroup[i]->trans.z_position, sp114, sp118, sp11C); if (someRacer->playerIndex != PLAYER_COMPUTER) { gCurrentHud->entry[HUD_MINIMAP_MARKER].pos.y -= 1.0f; gCurrentHud->entry[HUD_MINIMAP_MARKER].spriteID = HUD_SPRITE_MAP_ARROW; gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = - (objectGroup[i]->segment.trans.rotation.y_rotation - ((lvlMdl->minimapRotation * 0xFFFF) / 360)) & - 0xFFFF; + (objectGroup[i]->trans.rotation.y_rotation - ((lvlMdl->minimapRotation * 0xFFFF) / 360)) & 0xFFFF; if (get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) { gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = @@ -3959,15 +3952,15 @@ void hud_element_render(Gfx **dList, Mtx **mtx, Vertex **vtxList, HudElement *hu hud->rotation.z += camera->trans.rotation.z; } else if (gAssetHudElementIds[spriteID] & ASSET_MASK_OBJECT) { tempObject = gAssetHudElements->entry[spriteID]; - tempObject->segment.trans.rotation.x = hud->rotation.x; - tempObject->segment.trans.rotation.y = hud->rotation.y; - tempObject->segment.trans.rotation.z = hud->rotation.z; - tempObject->segment.trans.x_position = hud->pos.x; - tempObject->segment.trans.y_position = hud->pos.y; - tempObject->segment.trans.z_position = hud->pos.z; - tempObject->segment.trans.scale = hud->scale; - tempObject->segment.object.modelIndex = 0; - tempObject->segment.object.opacity = 0xFF; + tempObject->trans.rotation.x = hud->rotation.x; + tempObject->trans.rotation.y = hud->rotation.y; + tempObject->trans.rotation.z = hud->rotation.z; + tempObject->trans.x_position = hud->pos.x; + tempObject->trans.y_position = hud->pos.y; + tempObject->trans.z_position = hud->pos.z; + tempObject->trans.scale = hud->scale; + tempObject->modelIndex = 0; + tempObject->opacity = 0xFF; render_object(&gHudDL, &gHudMtx, &gHudVtx, tempObject); } else { mtx_cam_push(&gHudDL, &gHudMtx, (ObjectTransform *) hud, 1.0f, 0.0f); diff --git a/src/lights.c b/src/lights.c index ab4b8339..8e13d068 100644 --- a/src/lights.c +++ b/src/lights.c @@ -87,9 +87,9 @@ ObjectLight *func_80031CAC(Object *obj, LevelObjectEntry_RgbaLight *lightEntry) light->homeY = 0; light->homeZ = 0; if (obj != NULL) { - light->pos.x = obj->segment.trans.x_position; - light->pos.y = obj->segment.trans.y_position; - light->pos.z = obj->segment.trans.z_position; + light->pos.x = obj->trans.x_position; + light->pos.y = obj->trans.y_position; + light->pos.z = obj->trans.z_position; } else { light->pos.x = lightEntry->common.x; light->pos.y = lightEntry->common.y; @@ -273,10 +273,10 @@ void func_80032424(ObjectLight *light, s32 updateRate) { light->pos.x = light->homeX; light->pos.y = light->homeY; light->pos.z = light->homeZ; - vec3f_rotate(&light->owner->segment.trans.rotation, &light->pos); - light->pos.x += light->owner->segment.trans.x_position; - light->pos.y += light->owner->segment.trans.y_position; - light->pos.z += light->owner->segment.trans.z_position; + vec3f_rotate(&light->owner->trans.rotation, &light->pos); + light->pos.x += light->owner->trans.x_position; + light->pos.y += light->owner->trans.y_position; + light->pos.z += light->owner->trans.z_position; light->unk5 = 1; } if (light->unk44 != NULL) { @@ -391,7 +391,7 @@ void func_80032424(ObjectLight *light, s32 updateRate) { rotation.z_rotation = 0; vec3f_rotate_py(&rotation, &light->direction); if (light->owner != NULL) { - vec3f_rotate(&light->owner->segment.trans.rotation, &light->direction); + vec3f_rotate(&light->owner->trans.rotation, &light->direction); } light->direction.x = -light->direction.x; light->direction.y = -light->direction.y; @@ -439,8 +439,8 @@ void func_80032C7C(Object *object) { u8 sp64; s32 i; - if (object->segment.header->unk3D == 0) { - switch (object->segment.header->modelType) { + if (object->header->unk3D == 0) { + switch (object->header->modelType) { case OBJECT_MODEL_TYPE_3D_MODEL: sp64 = 2; break; @@ -458,9 +458,9 @@ void func_80032C7C(Object *object) { break; } - objX = object->segment.trans.x_position; - objY = object->segment.trans.y_position; - objZ = object->segment.trans.z_position; + objX = object->trans.x_position; + objY = object->trans.y_position; + objZ = object->trans.z_position; numLights = 0; @@ -478,9 +478,9 @@ void func_80032C7C(Object *object) { numLights++; } } else { - gLightDiffX = light->pos.x - object->segment.trans.x_position; - gLightDiffY = light->pos.y - object->segment.trans.y_position; - gLightDiffZ = light->pos.z - object->segment.trans.z_position; + gLightDiffX = light->pos.x - object->trans.x_position; + gLightDiffY = light->pos.y - object->trans.y_position; + gLightDiffZ = light->pos.z - object->trans.z_position; if (light->unk0 == 2) { gLightDiffY = 0.0f; } @@ -495,7 +495,7 @@ void func_80032C7C(Object *object) { if (intensity > 0.0f) { intensity *= light_distance_calc(light); if (intensity > 0.0f) { - if (object->segment.header->directionalPointLighting) { + if (object->header->directionalPointLighting) { if (gLightDistance > 0.0f) { f32 temp = 1.0f / sqrtf(gLightDistance); gLightDiffX *= temp; @@ -523,7 +523,7 @@ void func_80032C7C(Object *object) { } } - if (object->segment.header->directionalPointLighting) { + if (object->header->directionalPointLighting) { // find two brightest light sources if (numLights == 0) { object->shading->lightIntensity = 0; diff --git a/src/menu.c b/src/menu.c index fe23c209..ceea54b7 100644 --- a/src/menu.c +++ b/src/menu.c @@ -13844,18 +13844,18 @@ void menu_element_render(s32 elementID) { if (0) {} // Fakematch object = (Object *) gMenuAssets[gMenuImages[elementID].trans.spriteID]; asset = (MenuAsset *) &gMenuImages[elementID]; - object->segment.trans.rotation.y_rotation = asset->trans.rotation.y_rotation; - object->segment.trans.rotation.x_rotation = asset->trans.rotation.x_rotation; - object->segment.trans.rotation.z_rotation = asset->trans.rotation.z_rotation; - object->segment.trans.x_position = asset->trans.x_position; - object->segment.trans.y_position = asset->trans.y_position; - object->segment.trans.z_position = asset->trans.z_position; - object->segment.trans.scale = asset->trans.scale; + object->trans.rotation.y_rotation = asset->trans.rotation.y_rotation; + object->trans.rotation.x_rotation = asset->trans.rotation.x_rotation; + object->trans.rotation.z_rotation = asset->trans.rotation.z_rotation; + object->trans.x_position = asset->trans.x_position; + object->trans.y_position = asset->trans.y_position; + object->trans.z_position = asset->trans.z_position; + object->trans.scale = asset->trans.scale; if (gMenuDisableObjAnim == FALSE) { - object->segment.animFrame = asset->unk1D; - object->segment.object.modelIndex = asset->spriteOffset; + object->animFrame = asset->unk1D; + object->modelIndex = asset->spriteOffset; } - object->segment.object.opacity = sMenuGuiOpacity; + object->opacity = sMenuGuiOpacity; render_object(&sMenuCurrDisplayList, &sMenuCurrHudMat, &sMenuCurrHudVerts, object); } else { if ((*gAssetsMenuElementIds)[gMenuImages[elementID].trans.spriteID] & ASSET_MASK_SPRITE) { diff --git a/src/object_functions.c b/src/object_functions.c index e6985ebc..a549b6fd 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -110,16 +110,16 @@ s16 gTajSoundID; // Taj Voice clips */ void obj_init_scenery(Object *obj, LevelObjectEntry_Scenery *entry) { f32 radius; - obj->segment.trans.flags |= OBJ_FLAGS_UNK_0002; + obj->trans.flags |= OBJ_FLAGS_UNK_0002; radius = entry->radius & 0xFF; if (radius < 10) { radius = 10; } radius /= 64; - obj->segment.trans.scale = obj->segment.header->scale * radius; - obj->shadow->scale = obj->segment.header->shadowScale * radius; - obj->segment.object.modelIndex = entry->modelIndex; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + obj->trans.scale = obj->header->scale * radius; + obj->shadow->scale = obj->header->shadowScale * radius; + obj->modelIndex = entry->modelIndex; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); if (entry->solid) { obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 1; @@ -128,8 +128,8 @@ void obj_init_scenery(Object *obj, LevelObjectEntry_Scenery *entry) { obj->interactObj->unk16 = -5; obj->interactObj->unk17 = entry->solid; } - if (obj->segment.object.modelIndex >= obj->segment.header->numberOfModelIds) { - obj->segment.object.modelIndex = 0; + if (obj->modelIndex >= obj->header->numberOfModelIds) { + obj->modelIndex = 0; } obj->properties.scenery.interactObj = NULL; obj->properties.common.unk4 = 0; @@ -149,17 +149,17 @@ void obj_loop_scenery(Object *obj, s32 updateRate) { properties->hitTimer -= updateRate; } if (obj->interactObj->flags & INTERACT_FLAGS_COLLIDED && properties->hitTimer <= 0) { - audspat_play_sound_at_position(SOUND_TWANG, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(SOUND_TWANG, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); properties->interactObj = obj->interactObj->obj; properties->angleVel = 0x71C; properties->hitTimer = 10; if (get_number_of_active_players() < 2) { - if (obj->segment.header->particleCount > 0) { - if (obj->segment.header->particleCount == 1) { + if (obj->header->particleCount > 0) { + if (obj->header->particleCount == 1) { particleFlagShift = 0; } else { - particleFlagShift = rand_range(0, obj->segment.header->particleCount - 1); + particleFlagShift = rand_range(0, obj->header->particleCount - 1); } obj->particleEmittersEnabled = OBJ_EMIT_1 << particleFlagShift; obj_spawn_particle(obj, LOGIC_30FPS); @@ -168,7 +168,7 @@ void obj_loop_scenery(Object *obj, s32 updateRate) { } else if (properties->hitTimer <= 0) { properties->interactObj = NULL; } - obj->segment.trans.rotation.z_rotation = properties->angleVel; + obj->trans.rotation.z_rotation = properties->angleVel; properties->angleVel = (properties->angleVel * -200) >> 8; } } @@ -192,7 +192,7 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { f32 diff; f32 updateRateF; UNUSED s32 pad; - Object_Fireball_Octoweapon *weapon; + Object_Weapon *weapon; Object_Racer *racer; UNUSED s32 pad2[6]; ObjectInteraction *interactObj; @@ -205,65 +205,61 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { updateRateF *= 1.2; } if (obj->behaviorId == BHV_FIREBALL_OCTOWEAPON_2 && obj->properties.fireball.timer < 0) { - obj->segment.trans.x_position = 0.0f; - obj->segment.trans.y_position = 0.0f; - obj->segment.trans.z_position = 0.0f; + obj->trans.x_position = 0.0f; + obj->trans.y_position = 0.0f; + obj->trans.z_position = 0.0f; ignore_bounds_check(); - move_object(obj, someObj->segment.trans.x_position, someObj->segment.trans.y_position, - someObj->segment.trans.z_position); + move_object(obj, someObj->trans.x_position, someObj->trans.y_position, someObj->trans.z_position); } else { - diff = (someObj->segment.trans.x_position - obj->segment.trans.x_position) * 0.1; + diff = (someObj->trans.x_position - obj->trans.x_position) * 0.1; if (diff > 10.0) { diff = 10.0f; } if (diff < -10.0) { diff = -10.0f; } - obj->segment.x_velocity += (diff - obj->segment.x_velocity) * 0.125 * updateRateF; - diff = (someObj->segment.trans.y_position - obj->segment.trans.y_position) * 0.1; + obj->x_velocity += (diff - obj->x_velocity) * 0.125 * updateRateF; + diff = (someObj->trans.y_position - obj->trans.y_position) * 0.1; if (diff > 10.0) { diff = 10.0f; } if (diff < -10.0) { diff = -10.0f; } - obj->segment.y_velocity += (diff - obj->segment.y_velocity) * 0.125 * updateRateF; - diff = (someObj->segment.trans.z_position - obj->segment.trans.z_position) * 0.1; + obj->y_velocity += (diff - obj->y_velocity) * 0.125 * updateRateF; + diff = (someObj->trans.z_position - obj->trans.z_position) * 0.1; if (diff > 10.0) { diff = 10.0f; } if (diff < -10.0) { diff = -10.0f; } - obj->segment.z_velocity += (diff - obj->segment.z_velocity) * 0.125 * updateRateF; - if (sqrtf((obj->segment.x_velocity * obj->segment.x_velocity) + - (obj->segment.z_velocity * obj->segment.z_velocity)) > 0.5) { - obj->segment.trans.rotation.y_rotation = arctan2_f(obj->segment.x_velocity, obj->segment.z_velocity); - obj->segment.trans.rotation.x_rotation -= updateRate * 0x200; + obj->z_velocity += (diff - obj->z_velocity) * 0.125 * updateRateF; + if (sqrtf((obj->x_velocity * obj->x_velocity) + (obj->z_velocity * obj->z_velocity)) > 0.5) { + obj->trans.rotation.y_rotation = arctan2_f(obj->x_velocity, obj->z_velocity); + obj->trans.rotation.x_rotation -= updateRate * 0x200; } - move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, - obj->segment.z_velocity * updateRateF); + move_object(obj, obj->x_velocity * updateRateF, obj->y_velocity * updateRateF, obj->z_velocity * updateRateF); if (obj->objectID == ASSET_OBJECT_ID_OCTOBOMB) { - if (get_wave_properties(obj->segment.trans.y_position, &waveHeight, NULL)) { - obj->segment.trans.y_position = waveHeight; + if (get_wave_properties(obj->trans.y_position, &waveHeight, NULL)) { + obj->trans.y_position = waveHeight; } } } - obj->segment.animFrame += updateRate * 10; - weapon = &obj->unk64->fireball_octoweapon; + obj->animFrame += updateRate * 10; + weapon = obj->weapon; interactObj = obj->interactObj; if ((interactObj->obj)) { if ((interactObj->distance < 60)) { someObj = interactObj->obj; - if (someObj->segment.header->behaviorId == BHV_RACER) { - racer = &someObj->unk64->racer; + if (someObj->header->behaviorId == BHV_RACER) { + racer = someObj->racer; if (racer->playerIndex != PLAYER_COMPUTER) { if (obj->behaviorId == BHV_FIREBALL_OCTOWEAPON) { racer->attackType = ATTACK_EXPLOSION; obj->properties.fireball.timer = 20; - obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, - 1.0f, 1); + obj_spawn_effect(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, + ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, 1); free_object(obj); } else if (obj->properties.fireball.timer > 0) { racer->bubbleTrapTimer = 60; @@ -282,12 +278,11 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { if (obj->properties.fireball.timer < 0) { if (obj->objectID == ASSET_OBJECT_ID_OCTOBOMB) { free_object(obj); - obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, - 1); + obj_spawn_effect(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, + ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, 1); } - obj->segment.trans.scale *= 0.9; //!@Delta - if (obj->segment.trans.scale < 0.5) { + obj->trans.scale *= 0.9; //!@Delta + if (obj->trans.scale < 0.5) { free_object(obj); } } @@ -308,8 +303,8 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { if (soundMask != NULL) { sndp_stop(soundMask); } - audspat_play_sound_at_position(SOUND_POP, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(SOUND_POP, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); free_object(obj); } } @@ -324,14 +319,14 @@ void obj_init_lasergun(Object *obj, LevelObjectEntry_Lasergun *entry) { Object_LaserGun *laserGun; obj->interactObj->flags = INTERACT_FLAGS_TANGIBLE | INTERACT_FLAGS_UNK_0020; obj->interactObj->unk11 = 0; - laserGun = &obj->unk64->lasergun; + laserGun = obj->lasergun; laserGun->targeting = entry->targeting; laserGun->fireRate = entry->fireRate; laserGun->laserDuration = entry->laserDuration; laserGun->radius = entry->radius; laserGun->fireTimer = laserGun->fireRate; - obj->segment.trans.rotation.y_rotation = entry->angleY << 4 << 4; // Not sure about the shift amounts here, but it - obj->segment.trans.rotation.x_rotation = entry->angleX << 4 << 4; // just needs to be 2 left shifts to add up to 8. + obj->trans.rotation.y_rotation = entry->angleY << 4 << 4; // Not sure about the shift amounts here, but it + obj->trans.rotation.x_rotation = entry->angleX << 4 << 4; // just needs to be 2 left shifts to add up to 8. } /** @@ -352,7 +347,7 @@ void obj_loop_lasergun(Object *obj, s32 updateRate) { ObjectInteraction *interactObj; LevelObjectEntryCommon spawnObj; - lasergun = &obj->unk64->lasergun; + lasergun = obj->lasergun; if (lasergun->fireTimer > 0) { lasergun->fireTimer -= updateRate; } else { @@ -361,49 +356,48 @@ void obj_loop_lasergun(Object *obj, s32 updateRate) { if (lasergun->targeting) { racerObj = interactObj->obj; if (racerObj != NULL && racerObj->behaviorId == BHV_RACER) { - diffX = obj->segment.trans.x_position - racerObj->segment.trans.x_position; - diffY = obj->segment.trans.y_position - racerObj->segment.trans.y_position; - diffZ = obj->segment.trans.z_position - racerObj->segment.trans.z_position; + diffX = obj->trans.x_position - racerObj->trans.x_position; + diffY = obj->trans.y_position - racerObj->trans.y_position; + diffZ = obj->trans.z_position - racerObj->trans.z_position; distance = sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)); if (distance > 10.0f) { diffX /= distance; diffY /= distance; diffZ /= distance; - obj->segment.trans.rotation.y_rotation = (arctan2_f(diffX, diffZ) - 0x8000) & 0xFFFF; - obj->segment.trans.rotation.x_rotation = arctan2_f(diffY, 1.0f) & 0xFFFF; + obj->trans.rotation.y_rotation = (arctan2_f(diffX, diffZ) - 0x8000) & 0xFFFF; + obj->trans.rotation.x_rotation = arctan2_f(diffY, 1.0f) & 0xFFFF; } } } lasergun->fireTimer = lasergun->fireRate; - spawnObj.x = obj->segment.trans.x_position; - spawnObj.y = obj->segment.trans.y_position; - spawnObj.z = obj->segment.trans.z_position; + spawnObj.x = obj->trans.x_position; + spawnObj.y = obj->trans.y_position; + spawnObj.z = obj->trans.z_position; spawnObj.size = sizeof(LevelObjectEntryCommon); spawnObj.objectID = ASSET_OBJECT_ID_LASERBOLT; - audspat_play_sound_at_position(SOUND_LASER_GUN, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(SOUND_LASER_GUN, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); laserBoltObj = spawn_object(&spawnObj, OBJECT_SPAWN_UNK01); if (laserBoltObj != NULL) { - laserBoltObj->segment.level_entry = NULL; - laserBoltObj->segment.trans.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - laserBoltObj->segment.trans.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; - laserBoltObj->properties.lasergun.timer = lasergun->laserDuration; - laserBoltObj->properties.lasergun.obj = lasergun; + laserBoltObj->level_entry = NULL; + laserBoltObj->trans.rotation.y_rotation = obj->trans.rotation.y_rotation; + laserBoltObj->trans.rotation.x_rotation = obj->trans.rotation.x_rotation; + laserBoltObj->properties.laserbolt.timer = lasergun->laserDuration; + laserBoltObj->properties.laserbolt.obj = lasergun; trans.x_position = 0.0f; trans.y_position = 0.0f; trans.z_position = 0.0f; trans.scale = 1.0f; - trans.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - trans.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; + trans.rotation.y_rotation = obj->trans.rotation.y_rotation; + trans.rotation.x_rotation = obj->trans.rotation.x_rotation; trans.rotation.z_rotation = 0; mtxf_from_transform(&mtx, &trans); diffX = 30.0f; // Need to use diffX to match. if (lasergun->targeting == FALSE) { diffX = 45.0f; } - mtxf_transform_point(&mtx, 0.0f, 0.0f, diffX, &laserBoltObj->segment.x_velocity, - &laserBoltObj->segment.y_velocity, &laserBoltObj->segment.z_velocity); + mtxf_transform_point(&mtx, 0.0f, 0.0f, diffX, &laserBoltObj->x_velocity, &laserBoltObj->y_velocity, + &laserBoltObj->z_velocity); } } } @@ -428,7 +422,7 @@ void obj_loop_laserbolt(Object *obj, s32 updateRate) { Object *racerObj; Object_LaserGun *laserGun; - Object_Laser *laser; + Object_Racer *racer; s8 delete; // Boolean s8 surface; @@ -441,29 +435,28 @@ void obj_loop_laserbolt(Object *obj, s32 updateRate) { if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } - dir.x = obj->segment.trans.x_position + (obj->segment.x_velocity * updateRateF); - dir.y = obj->segment.trans.y_position + (obj->segment.y_velocity * updateRateF); - dir.z = obj->segment.trans.z_position + (obj->segment.z_velocity * updateRateF); + dir.x = obj->trans.x_position + (obj->x_velocity * updateRateF); + dir.y = obj->trans.y_position + (obj->y_velocity * updateRateF); + dir.z = obj->trans.z_position + (obj->z_velocity * updateRateF); radius = 9.0f; - func_80031130(1, &obj->segment.trans.x_position, &dir.x, -1); + func_80031130(1, &obj->trans.x_position, &dir.x, -1); hasCollision = FALSE; - func_80031600(&obj->segment.trans.x_position, (f32 *) &dir, &radius, &surface, TRUE, &hasCollision); + func_80031600(&obj->trans.x_position, (f32 *) &dir, &radius, &surface, TRUE, &hasCollision); if (hasCollision) { - obj->segment.x_velocity = (dir.x - obj->segment.trans.x_position) / updateRateF; - obj->segment.y_velocity = (dir.y - obj->segment.trans.y_position) / updateRateF; - obj->segment.z_velocity = (dir.z - obj->segment.trans.z_position) / updateRateF; + obj->x_velocity = (dir.x - obj->trans.x_position) / updateRateF; + obj->y_velocity = (dir.y - obj->trans.y_position) / updateRateF; + obj->z_velocity = (dir.z - obj->trans.z_position) / updateRateF; } - move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, - obj->segment.z_velocity * updateRateF); + move_object(obj, obj->x_velocity * updateRateF, obj->y_velocity * updateRateF, obj->z_velocity * updateRateF); if (hasCollision) { - obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position - 36.0f, - obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_NONE, 0.2, 0); + obj_spawn_effect(obj->trans.x_position, obj->trans.y_position - 36.0f, obj->trans.z_position, + ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_NONE, 0.2, 0); delete = TRUE; } - if (obj->properties.lasergun.timer > 0) { - obj->properties.lasergun.timer -= updateRate; + if (obj->properties.laserbolt.timer > 0) { + obj->properties.laserbolt.timer -= updateRate; } else { delete = TRUE; } @@ -471,18 +464,18 @@ void obj_loop_laserbolt(Object *obj, s32 updateRate) { if (obj->interactObj->distance < 80) { racerObj = obj->interactObj->obj; if (racerObj && racerObj->behaviorId == BHV_RACER) { - laser = &racerObj->unk64->laser; + racer = racerObj->racer; delete = TRUE; - if (laser->unk0 != -1) { - laser->unk187 = 1; + if (racer->playerIndex != PLAYER_COMPUTER) { + racer->attackType = ATTACK_EXPLOSION; } - laserGun = obj->properties.lasergun.obj; - if (laserGun) { + laserGun = obj->properties.laserbolt.obj; + if (laserGun != NULL) { laserGun->fireTimer = 180; } delete = TRUE; - obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position - 36.0f, - obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 0.5, 0); + obj_spawn_effect(obj->trans.x_position, obj->trans.y_position - 36.0f, obj->trans.z_position, + ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 0.5, 0); } } if (delete) { @@ -500,8 +493,8 @@ void obj_init_torch_mist(Object *obj, LevelObjectEntry_Torch_Mist *entry) { radius = 10.0f; } radius /= 64; - obj->segment.trans.scale = obj->segment.header->scale * radius; - obj->properties.speed.speed = entry->animSpeed; + obj->trans.scale = obj->header->scale * radius; + obj->properties.torchMist.speed = entry->animSpeed; } /** @@ -509,7 +502,7 @@ void obj_init_torch_mist(Object *obj, LevelObjectEntry_Torch_Mist *entry) { * Updates the animation frame based on spawn info's animation speed. */ void obj_loop_torch_mist(Object *obj, s32 updateRate) { - obj->segment.animFrame += obj->properties.speed.speed * updateRate; + obj->animFrame += obj->properties.torchMist.speed * updateRate; } /** @@ -541,7 +534,7 @@ void obj_loop_effectbox(Object *obj, UNUSED s32 updateRate) { f32 yDiff; s32 i; - effectBoxEntry = (LevelObjectEntry_EffectBox *) obj->segment.level_entry; + effectBoxEntry = (LevelObjectEntry_EffectBox *) obj->level_entry; racers = get_racer_objects(&numRacers); cosAngle = coss_f(-(effectBoxEntry->unkB * 256)); sinAngle = sins_f(-(effectBoxEntry->unkB * 256)); @@ -550,16 +543,16 @@ void obj_loop_effectbox(Object *obj, UNUSED s32 updateRate) { zExtents = effectBoxEntry->unkA * 3; for (i = 0; i < numRacers; i++) { curRacerObj = racers[i]; - xDiff = curRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - yDiff = curRacerObj->segment.trans.y_position - obj->segment.trans.y_position; - zDiff = curRacerObj->segment.trans.z_position - obj->segment.trans.z_position; + xDiff = curRacerObj->trans.x_position - obj->trans.x_position; + yDiff = curRacerObj->trans.y_position - obj->trans.y_position; + zDiff = curRacerObj->trans.z_position - obj->trans.z_position; if (-yExtents < yDiff && yDiff < yExtents) { yExtentsHalf = (xDiff * cosAngle) + (zDiff * sinAngle); if (-xExtents < yExtentsHalf && yExtentsHalf < xExtents) { zDiff = (-xDiff * sinAngle) + (zDiff * cosAngle); if (-zExtents < zDiff && zDiff < zExtents) { yExtentsHalf = yExtents / 2; - curRacer = &curRacerObj->unk64->racer; + curRacer = curRacerObj->racer; curRacer->unk1FE = effectBoxEntry->unkC; curRacer->unk1FF = effectBoxEntry->unkD; if (yExtentsHalf < yDiff && curRacer->unk1FE == 1) { @@ -580,7 +573,7 @@ void obj_loop_effectbox(Object *obj, UNUSED s32 updateRate) { void obj_init_trophycab(Object *obj, LevelObjectEntry_TrophyCab *entry) { obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 2; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); } /** @@ -590,7 +583,7 @@ void obj_init_trophycab(Object *obj, LevelObjectEntry_TrophyCab *entry) { */ void obj_loop_trophycab(Object *obj, s32 updateRate) { Settings *settings; - Object_TrophyCabinet *gfxData; + JingleState *jingle_state; UNUSED f32 dist; LevelObjectEntryCommon newObject; LevelHeader *header; @@ -604,20 +597,20 @@ void obj_loop_trophycab(Object *obj, s32 updateRate) { settings = get_settings(); header = get_current_level_header(); - gfxData = &obj->unk64->trophy_cabinet; + jingle_state = obj->jingle_state; if (obj->properties.trophyCabinet.trophy == FALSE) { if (header->race_type != RACETYPE_CUTSCENE_2 && header->race_type != RACETYPE_CUTSCENE_1) { obj->properties.trophyCabinet.trophy = TRUE; if ((settings->trophies >> (((settings->worldId - 1) ^ 0) * 2)) & 3) { // Fakematch newObject.objectID = ASSET_OBJECT_ID_TROPHY; - newObject.x = obj->segment.level_entry->animation.common.x; - newObject.y = obj->segment.level_entry->animation.common.y; - newObject.z = obj->segment.level_entry->animation.common.z; + newObject.x = obj->level_entry->animation.common.x; + newObject.y = obj->level_entry->animation.common.y; + newObject.z = obj->level_entry->animation.common.z; newObject.size = sizeof(LevelObjectEntryCommon); tempObj = spawn_object(&newObject, OBJECT_SPAWN_UNK01); if (tempObj != NULL) { - tempObj->segment.level_entry = NULL; - tempObj->segment.trans.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; + tempObj->level_entry = NULL; + tempObj->trans.rotation.y_rotation = obj->trans.rotation.y_rotation; } } } @@ -626,8 +619,8 @@ void obj_loop_trophycab(Object *obj, s32 updateRate) { obj->shading->ambient = 0.0f; tempObj = get_racer_object(PLAYER_ONE); if (tempObj != NULL) { - diffX = obj->segment.trans.x_position - tempObj->segment.trans.x_position; - diffZ = obj->segment.trans.z_position - tempObj->segment.trans.z_position; + diffX = obj->trans.x_position - tempObj->trans.x_position; + diffZ = obj->trans.z_position - tempObj->trans.z_position; dist = sqrtf((diffX * diffX) + (diffZ * diffZ)); // unused bossFlags = settings->bosses; bossFlags |= 0x800; @@ -637,7 +630,7 @@ void obj_loop_trophycab(Object *obj, s32 updateRate) { } if (obj->properties.trophyCabinet.action == NULL && textbox_visible() == FALSE) { if (obj->unk5C->unk100 != NULL) { - if (gfxData->unk4 == 0) { + if (jingle_state->cooldown == 0) { if (worldBalloons) { obj->properties.trophyCabinet.action = 1; sound_play(SOUND_VOICE_TT_TROPHY_RACE, NULL); @@ -646,8 +639,8 @@ void obj_loop_trophycab(Object *obj, s32 updateRate) { // Text for "TROPHY RACE" "TO ENTER THE TROPHY RACE, YOU MUST COMPLETE ALL THE TASKS FROM THIS // WORLD. KEEP RACING!" set_current_text(ASSET_GAME_TEXT_4); - gfxData->unk4 = 180; - gfxData->unk0 = 140; + jingle_state->cooldown = 180; + jingle_state->timer = 140; music_jingle_voicelimit_set(16); music_fade(-8); music_jingle_play(SEQUENCE_NO_TROPHY_FOR_YOU); @@ -655,22 +648,22 @@ void obj_loop_trophycab(Object *obj, s32 updateRate) { } } } - if (gfxData->unk0 && music_jingle_playing() == SEQUENCE_NONE) { - if (updateRate < gfxData->unk0) { - gfxData->unk0 -= updateRate; + if (jingle_state->timer && music_jingle_playing() == SEQUENCE_NONE) { + if (updateRate < jingle_state->timer) { + jingle_state->timer -= updateRate; } else { - gfxData->unk0 = 0; + jingle_state->timer = 0; music_fade(8); music_jingle_voicelimit_set(6); } } if (obj->unk5C->unk100 != NULL || textbox_visible()) { - gfxData->unk4 = 180; + jingle_state->cooldown = 180; } - if (gfxData->unk4 > 0) { - gfxData->unk4 -= updateRate; + if (jingle_state->cooldown > 0) { + jingle_state->cooldown -= updateRate; } else { - gfxData->unk4 = 0; + jingle_state->cooldown = 0; } if (obj->properties.trophyCabinet.action == 1) { minimap_opacity_set(3); @@ -720,7 +713,7 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) { s32 hasCollision; s8 surface; - egg = &obj->unk64->egg; + egg = obj->egg; updateRateF = updateRate; if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; @@ -730,27 +723,27 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) { try_to_collect_egg(obj, egg); break; case EGG_MOVING: - obj->segment.trans.flags &= (0xFFFF - OBJ_FLAGS_INVISIBLE); - dir[0] = obj->segment.trans.x_position + (obj->segment.x_velocity * updateRateF); - dir[1] = obj->segment.trans.y_position + (obj->segment.y_velocity * updateRateF); - dir[2] = obj->segment.trans.z_position + (obj->segment.z_velocity * updateRateF); + obj->trans.flags &= ~OBJ_FLAGS_INVISIBLE; + dir[0] = obj->trans.x_position + (obj->x_velocity * updateRateF); + dir[1] = obj->trans.y_position + (obj->y_velocity * updateRateF); + dir[2] = obj->trans.z_position + (obj->z_velocity * updateRateF); radius = 9.0f; - func_80031130(1, &obj->segment.trans.x_position, dir, -1); + func_80031130(1, &obj->trans.x_position, dir, -1); hasCollision = FALSE; surface = SURFACE_DEFAULT; - func_80031600(&obj->segment.trans.x_position, dir, &radius, &surface, TRUE, &hasCollision); - obj->segment.x_velocity = (dir[0] - obj->segment.trans.x_position) / updateRateF; - obj->segment.y_velocity = (dir[1] - obj->segment.trans.y_position) / updateRateF; - obj->segment.z_velocity = (dir[2] - obj->segment.trans.z_position) / updateRateF; - obj->segment.trans.x_position = dir[0]; - obj->segment.trans.y_position = dir[1]; - obj->segment.trans.z_position = dir[2]; - obj->segment.y_velocity -= 0.5; - obj->segment.x_velocity *= 0.98; - obj->segment.z_velocity *= 0.98; - obj->segment.y_velocity *= 0.95; + func_80031600(&obj->trans.x_position, dir, &radius, &surface, TRUE, &hasCollision); + obj->x_velocity = (dir[0] - obj->trans.x_position) / updateRateF; + obj->y_velocity = (dir[1] - obj->trans.y_position) / updateRateF; + obj->z_velocity = (dir[2] - obj->trans.z_position) / updateRateF; + obj->trans.x_position = dir[0]; + obj->trans.y_position = dir[1]; + obj->trans.z_position = dir[2]; + obj->y_velocity -= 0.5; + obj->x_velocity *= 0.98; + obj->z_velocity *= 0.98; + obj->y_velocity *= 0.95; // Destroy the egg if it lands on an invalid surface. - if (obj->segment.trans.y_position < -2000.0f || + if (obj->trans.y_position < -2000.0f || (hasCollision && (surface < SURFACE_EGG_SPAWN || surface > SURFACE_EGG_04))) { if (egg->spawnerObj != NULL) { egg->spawnerObj->properties.eggSpawner.egg = NULL; @@ -759,27 +752,27 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) { } if (hasCollision && surface == SURFACE_EGG_SPAWN) { egg->status = EGG_SPAWNED; - obj->segment.x_velocity = 0.0f; - obj->segment.z_velocity = 0.0f; + obj->x_velocity = 0.0f; + obj->z_velocity = 0.0f; } if (hasCollision && surface >= SURFACE_EGG_01 && surface <= SURFACE_EGG_04) { egg->racerID = surface - SURFACE_EGG_01; egg->status = EGG_IN_BASE; racerObj = get_racer_object(egg->racerID); if (racerObj != NULL) { - racer = &racerObj->unk64->racer; + racer = racerObj->racer; racer->eggHudCounter += 1; } egg->hatchTimer = 600; - obj->segment.x_velocity = 0.0f; - obj->segment.z_velocity = 0.0f; + obj->x_velocity = 0.0f; + obj->z_velocity = 0.0f; } break; case EGG_IN_BASE: egg->hatchTimer -= updateRate; racerObj = get_racer_object(egg->racerID); if (racerObj != NULL) { - racer = &racerObj->unk64->racer; + racer = racerObj->racer; } if (egg->hatchTimer <= 0) { if (racerObj != NULL) { @@ -798,12 +791,12 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) { case EGG_HATCHED: racerObj = get_racer_object(egg->racerID); if (racerObj != NULL) { - racer = &racerObj->unk64->racer; + racer = racerObj->racer; if (racer->lap >= 3) { racer->raceFinished = TRUE; } } - obj->segment.animFrame = 128; + obj->animFrame = 128; break; } } @@ -825,17 +818,17 @@ void obj_loop_eggcreator(Object *obj, UNUSED s32 updateRate) { Object *eggObj; if (obj->properties.eggSpawner.egg == NULL) { - spawnObj.x = obj->segment.trans.x_position; - spawnObj.y = obj->segment.trans.y_position; - spawnObj.z = obj->segment.trans.z_position; + spawnObj.x = obj->trans.x_position; + spawnObj.y = obj->trans.y_position; + spawnObj.z = obj->trans.z_position; spawnObj.size = sizeof(LevelObjectEntryCommon); spawnObj.objectID = ASSET_OBJECT_ID_COLLECTEGG; eggObj = spawn_object(&spawnObj, OBJECT_SPAWN_UNK01); if (eggObj != NULL) { - Object_EggCreator *eggSpawner = &eggObj->unk64->egg_creator; - eggSpawner->currentEgg = obj; + Object_CollectEgg *egg = eggObj->egg; + egg->spawnerObj = obj; obj->properties.eggSpawner.egg = eggObj; - eggObj->segment.level_entry = NULL; + eggObj->level_entry = NULL; } } } @@ -850,10 +843,10 @@ void obj_init_lighthouse_rocketsignpost(Object *obj, LevelObjectEntry_Lighthouse radius = 10; } radius /= 64; - obj->segment.trans.scale = obj->segment.header->scale * radius; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); - if (obj->segment.object.modelIndex >= obj->segment.header->numberOfModelIds) { - obj->segment.object.modelIndex = 0; + obj->trans.scale = obj->header->scale * radius; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + if (obj->modelIndex >= obj->header->numberOfModelIds) { + obj->modelIndex = 0; } obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 2; @@ -897,12 +890,12 @@ void obj_init_airzippers_waterzippers(Object *obj, LevelObjectEntry_AirZippers_W if (radius < 10.0f) { radius = 10.0f; } - objHeader = obj->segment.header; + objHeader = obj->header; radius /= 64; - obj->segment.trans.scale = objHeader->scale * radius; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); - if (obj->segment.object.modelIndex >= objHeader->numberOfModelIds) { - obj->segment.object.modelIndex = 0; + obj->trans.scale = objHeader->scale * radius; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + if (obj->modelIndex >= objHeader->numberOfModelIds) { + obj->modelIndex = 0; } obj->interactObj->flags = INTERACT_FLAGS_TANGIBLE; obj->interactObj->unk11 = 0; @@ -930,19 +923,19 @@ void obj_loop_airzippers_waterzippers(Object *obj, UNUSED s32 updateRate) { s32 i; if (find_non_car_racers() == FALSE) { - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; } else { - obj->segment.trans.flags &= (0xFFFF - OBJ_FLAGS_INVISIBLE); + obj->trans.flags &= ~OBJ_FLAGS_INVISIBLE; } - if (obj->interactObj->distance < 100 && !(obj->segment.trans.flags & OBJ_FLAGS_INVISIBLE)) { + if (obj->interactObj->distance < 100 && !(obj->trans.flags & OBJ_FLAGS_INVISIBLE)) { racerObjs = get_racer_objects(&numObjects); for (i = 0; i < numObjects; i++) { curRacerObj = racerObjs[i]; - racer = &curRacerObj->unk64->racer; + racer = curRacerObj->racer; if (racer->zipperDirCorrection == FALSE && racer->boostTimer < 15) { - diffX = curRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = curRacerObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = curRacerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = curRacerObj->trans.x_position - obj->trans.x_position; + diffY = curRacerObj->trans.y_position - obj->trans.y_position; + diffZ = curRacerObj->trans.z_position - obj->trans.z_position; if ((s32) sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < 100) { racer->zipperDirCorrection = TRUE; racer->zipperObj = obj; @@ -965,12 +958,12 @@ void obj_init_groundzipper(Object *obj, LevelObjectEntry_GroundZipper *entry) { radius = 10.0f; } radius /= 64; - header = obj->segment.header; - obj->segment.trans.scale = header->scale * radius; + header = obj->header; + obj->trans.scale = header->scale * radius; obj->shadow->scale = header->shadowScale * radius; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); - if (obj->segment.object.modelIndex >= obj->segment.header->numberOfModelIds) { - obj->segment.object.modelIndex = 0; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + if (obj->modelIndex >= obj->header->numberOfModelIds) { + obj->modelIndex = 0; } obj->properties.zipper.radius = (s32) (28.0f * radius) + 15; if (obj->properties.zipper.radius < 0) { @@ -1005,23 +998,22 @@ void obj_loop_groundzipper(Object *obj, UNUSED s32 updateRate) { Object **racerObjs; s32 i; - obj->segment.trans.flags &= (0xFFFF - OBJ_FLAGS_INVISIBLE); - obj->segment.trans.flags |= OBJ_FLAGS_SHADOW_ONLY; + obj->trans.flags &= ~OBJ_FLAGS_INVISIBLE; + obj->trans.flags |= OBJ_FLAGS_SHADOW_ONLY; get_racer_object(PLAYER_ONE); // Unused. I guess the developers forgot to remove this? if (obj->interactObj->distance < obj->properties.zipper.radius) { racerObjs = get_racer_objects(&numObjects); for (i = 0; i < numObjects; i++) { racerObj = racerObjs[i]; - racer = &racerObj->unk64->racer; + racer = racerObj->racer; if (racer->boostTimer < 15 && racer->groundedWheels) { - diffX = racerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = racerObj->trans.x_position - obj->trans.x_position; + diffY = racerObj->trans.y_position - obj->trans.y_position; + diffZ = racerObj->trans.z_position - obj->trans.z_position; if ((s32) sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < obj->properties.zipper.radius) { if (racer->playerIndex != PLAYER_COMPUTER) { - sound_play_spatial(SOUND_ZIP_PAD_BOOST, racerObj->segment.trans.x_position, - racerObj->segment.trans.y_position, racerObj->segment.trans.z_position, - NULL); + sound_play_spatial(SOUND_ZIP_PAD_BOOST, racerObj->trans.x_position, racerObj->trans.y_position, + racerObj->trans.z_position, NULL); } racer->boostTimer = normalise_time(45); racer->boostType = BOOST_LARGE; @@ -1043,7 +1035,7 @@ void obj_loop_groundzipper(Object *obj, UNUSED s32 updateRate) { */ void obj_init_timetrialghost(Object *obj, UNUSED LevelObjectEntry_TimeTrial_Ghost *entry) { obj->properties.timeTrial.timestamp = 0; - obj->properties.timeTrial.header = obj->segment.header; + obj->properties.timeTrial.header = obj->header; } /** @@ -1054,28 +1046,28 @@ void obj_init_timetrialghost(Object *obj, UNUSED LevelObjectEntry_TimeTrial_Ghos */ void obj_loop_timetrialghost(Object *obj, s32 updateRate) { Object *someObj; - Object *someOtherObj; - Object_UnkId58 *someOtherObj64; + Object *racerObj; + Object_Racer *racer; AttachPoint *attachPoint; s8 vehicleID; - obj->segment.object.animationID = 0; - obj->segment.animFrame = 40; + obj->animationID = 0; + obj->animFrame = 40; if (get_race_countdown() == 0) { obj->properties.timeTrial.timestamp += updateRate; } timetrial_ghost_read(obj); obj_spawn_particle(obj, updateRate); - someOtherObj = get_racer_object(PLAYER_ONE); - someOtherObj64 = &someOtherObj->unk64->unkid58; + racerObj = get_racer_object(PLAYER_ONE); + racer = racerObj->racer; attachPoint = obj->attachPoints; if (attachPoint->count == 1) { - vehicleID = someOtherObj64->vehicleID; + vehicleID = racer->vehicleID; if (vehicleID == VEHICLE_HOVERCRAFT || vehicleID == VEHICLE_PLANE) { - someObj = (Object *) attachPoint->obj[0]; - someObj->segment.trans.rotation.y_rotation = 0x4000; - someObj->segment.object.modelIndex++; - someObj->segment.object.modelIndex &= 1; + someObj = attachPoint->obj[0]; + someObj->trans.rotation.y_rotation = 0x4000; + someObj->modelIndex++; + someObj->modelIndex &= 1; } } } @@ -1089,13 +1081,13 @@ void obj_init_characterflag(Object *obj, LevelObjectEntry_CharacterFlag *entry) f32 radius; obj->properties.characterFlag.playerID = entry->playerIndex; obj->properties.characterFlag.characterID = -1; // Set to -1 so the loop func builds the gfx data. - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); radius = entry->radius & 0xFF; if (radius < 10.0f) { radius = 10.0f; } radius /= 64; - obj->segment.trans.scale = obj->segment.header->scale * radius; + obj->trans.scale = obj->header->scale * radius; } /** @@ -1107,32 +1099,32 @@ void obj_loop_characterflag(Object *obj, UNUSED s32 updateRate) { s32 temp_t4; s32 temp_t5; Object *racerObj; - Object_CharacterFlag *flag; + CharacterFlagModel *flagModel; Object_Racer *racer; if (obj->properties.characterFlag.characterID < 0) { racerObj = get_racer_object(obj->properties.characterFlag.playerID); if (racerObj != NULL) { - flag = &obj->unk64->character_flag; - racer = &racerObj->unk64->racer; + flagModel = obj->characterFlagModel; + racer = racerObj->racer; obj->properties.characterFlag.characterID = racer->characterId; if (obj->properties.characterFlag.characterID < 0 || obj->properties.characterFlag.characterID >= NUMBER_OF_CHARACTERS) { obj->properties.characterFlag.characterID = 0; } - flag->vertices = gCharacterFlagVertices; - flag->texture = obj->textures[obj->properties.characterFlag.characterID]; - temp_t4 = (flag->texture->width - 1) << 21; - temp_t5 = (flag->texture->height - 1) << 5; + flagModel->vertices = gCharacterFlagVertices; + flagModel->texture = obj->textures[obj->properties.characterFlag.characterID]; + temp_t4 = (flagModel->texture->width - 1) << 21; + temp_t5 = (flagModel->texture->height - 1) << 5; // 0x40 = Draw backface - flag->triangles[0].vertices = (0x40 << 24) | (0 << 16) | (1 << 8) | 3; - flag->triangles[0].uv0.texCoords = 0; - flag->triangles[0].uv1.texCoords = temp_t4; - flag->triangles[0].uv2.texCoords = temp_t5; - flag->triangles[1].vertices = (0x40 << 24) | (1 << 16) | (2 << 8) | 3; - flag->triangles[1].uv0.texCoords = temp_t4; - flag->triangles[1].uv1.texCoords = (temp_t4 | temp_t5); - flag->triangles[1].uv2.texCoords = temp_t5; + flagModel->triangles[0].vertices = DKR_TRIANGLE(BACKFACE_DRAW, 0, 1, 3); + flagModel->triangles[0].uv0.texCoords = 0; + flagModel->triangles[0].uv1.texCoords = temp_t4; + flagModel->triangles[0].uv2.texCoords = temp_t5; + flagModel->triangles[1].vertices = DKR_TRIANGLE(BACKFACE_DRAW, 1, 2, 3); + flagModel->triangles[1].uv0.texCoords = temp_t4; + flagModel->triangles[1].uv1.texCoords = (temp_t4 | temp_t5); + flagModel->triangles[1].uv2.texCoords = temp_t5; } } } @@ -1149,26 +1141,25 @@ void try_to_collect_egg(Object *obj, Object_CollectEgg *egg) { if (obj->interactObj->distance < 40) { interactedObj = obj->interactObj->obj; - if (interactedObj->segment.header->behaviorId == BHV_RACER) { - racer = &interactedObj->unk64->racer; + if (interactedObj->header->behaviorId == BHV_RACER) { + racer = interactedObj->racer; if (racer->held_obj == NULL) { egg->status = EGG_COLLECTED; - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; racer->held_obj = obj; - transF.rotation.y_rotation = -interactedObj->segment.trans.rotation.y_rotation; - transF.rotation.x_rotation = -interactedObj->segment.trans.rotation.x_rotation; - transF.rotation.z_rotation = -interactedObj->segment.trans.rotation.z_rotation; + transF.rotation.y_rotation = -interactedObj->trans.rotation.y_rotation; + transF.rotation.x_rotation = -interactedObj->trans.rotation.x_rotation; + transF.rotation.z_rotation = -interactedObj->trans.rotation.z_rotation; transF.scale = 1.0f; - transF.x_position = -interactedObj->segment.trans.x_position; - transF.y_position = -interactedObj->segment.trans.y_position; - transF.z_position = -interactedObj->segment.trans.z_position; + transF.x_position = -interactedObj->trans.x_position; + transF.y_position = -interactedObj->trans.y_position; + transF.z_position = -interactedObj->trans.z_position; mtxf_from_inverse_transform(&mat, &transF); - mtxf_transform_point(&mat, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, &obj->segment.trans.x_position, - &obj->segment.trans.y_position, &obj->segment.trans.z_position); - obj->segment.trans.x_position /= interactedObj->segment.trans.scale; - obj->segment.trans.y_position /= interactedObj->segment.trans.scale; - obj->segment.trans.z_position /= interactedObj->segment.trans.scale; + mtxf_transform_point(&mat, obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, + &obj->trans.x_position, &obj->trans.y_position, &obj->trans.z_position); + obj->trans.x_position /= interactedObj->trans.scale; + obj->trans.y_position /= interactedObj->trans.scale; + obj->trans.z_position /= interactedObj->trans.scale; } } } @@ -1179,13 +1170,13 @@ void try_to_collect_egg(Object *obj, Object_CollectEgg *egg) { * Sets hitbox data to make him solid. */ void obj_init_stopwatchman(Object *obj, UNUSED LevelObjectEntry_StopWatchMan *entry) { - Object_TT *tt; + Object_NPC *tt; obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 0; obj->interactObj->hitboxRadius = 30; obj->interactObj->pushForce = 0; - tt = &obj->unk64->tt; - tt->unkD = 0xFF; + tt = obj->npc; + tt->nodeCurrent = 0xFF; tt->unk0 = 0.0f; gTTSoundMask = NULL; } @@ -1211,32 +1202,30 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { LevelHeader *header; struct WaterProperties **water; - tempPosY = obj->segment.trans.y_position; + tempPosY = obj->trans.y_position; updateRateF = updateRate; if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } - tt = &obj->unk64->npc; - if (obj->segment.animFrame == 0) { + tt = obj->npc; + if (obj->animFrame == 0) { if (tt->animFrameF > 1.0) { tt->animFrameF = 0.0f; } } header = get_current_level_header(); distance = 0.0f; - obj->segment.x_velocity = 0.0f; - obj->segment.z_velocity = 0.0f; + obj->x_velocity = 0.0f; + obj->z_velocity = 0.0f; racerObj = get_racer_object(PLAYER_ONE); if (racerObj != NULL) { - racer = &racerObj->unk64->racer; - diffX = ((racerObj->segment.trans.x_position - (racer->ox1 * 50.0f)) - (racer->ox3 * 5.0f)) - - obj->segment.trans.x_position; - diffZ = ((racerObj->segment.trans.z_position - (racer->oz1 * 50.0f)) - (racer->oz3 * 5.0f)) - - obj->segment.trans.z_position; + racer = racerObj->racer; + diffX = ((racerObj->trans.x_position - (racer->ox1 * 50.0f)) - (racer->ox3 * 5.0f)) - obj->trans.x_position; + diffZ = ((racerObj->trans.z_position - (racer->oz1 * 50.0f)) - (racer->oz3 * 5.0f)) - obj->trans.z_position; distance = sqrtf((diffX * diffX) + (diffZ * diffZ)); - angleDiff = arctan2_f(racerObj->segment.trans.x_position - obj->segment.trans.x_position, - racerObj->segment.trans.z_position - obj->segment.trans.z_position) - - (racerObj->segment.trans.rotation.y_rotation & 0xFFFF); + angleDiff = arctan2_f(racerObj->trans.x_position - obj->trans.x_position, + racerObj->trans.z_position - obj->trans.z_position) - + (racerObj->trans.rotation.y_rotation & 0xFFFF); if (angleDiff > 0x8000) { angleDiff = -0xFFFF; } @@ -1244,19 +1233,19 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { angleDiff = 0xFFFF; } if (racer->exitObj != NULL) { - obj->properties.npc.action = TT_MODE_ROAM; - obj->properties.npc.timer = 1; + obj->properties.tt.action = TT_MODE_ROAM; + obj->properties.tt.timer = 1; } } index = input_pressed(PLAYER_ONE); - if (obj->properties.npc.action == TT_MODE_ROAM && distance < 300.0 && obj->properties.npc.timer == 0) { + if (obj->properties.tt.action == TT_MODE_ROAM && distance < 300.0 && obj->properties.tt.timer == 0) { if (angleDiff > -0x2000 && angleDiff < 0x2000) { if ((obj->interactObj->flags & INTERACT_FLAGS_PUSHING && racerObj == obj->interactObj->obj) || index & Z_TRIG) { if (index & Z_TRIG) { play_char_horn_sound(racerObj, racer); } - obj->properties.npc.action = TT_MODE_APPROACH_PLAYER; + obj->properties.tt.action = TT_MODE_APPROACH_PLAYER; get_fog_settings(PLAYER_ONE, &tt->fogNear, &tt->fogFar, &tt->fogR, &tt->fogG, &tt->fogB); slowly_change_fog(PLAYER_ONE, 128, 128, 255, 900, 998, 240); music_channel_reset_all(); @@ -1268,82 +1257,80 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { } } } - if (obj->properties.npc.action != TT_MODE_ROAM) { + if (obj->properties.tt.action != TT_MODE_ROAM) { disable_racer_input(); minimap_fade(3); } - if (obj->properties.npc.action >= TT_MODE_TURN_TOWARDS_PLAYER) { + if (obj->properties.tt.action >= TT_MODE_TURN_TOWARDS_PLAYER) { index = npc_dialogue_loop(DIALOGUE_TT); } else { dialogue_npc_finish(2); index = 0; } - switch (obj->properties.npc.action) { + switch (obj->properties.tt.action) { case TT_MODE_APPROACH_PLAYER: - obj->segment.object.animationID = 0; + obj->animationID = 0; tt->nodeCurrent = 255; if (distance < 100.0) { racer_set_dialogue_camera(); } if (distance > 10.0) { - angleDiff = (arctan2_f(diffX / distance, diffZ / distance) - - (obj->segment.trans.rotation.y_rotation & 0xFFFF)) + - 0x8000; + angleDiff = + (arctan2_f(diffX / distance, diffZ / distance) - (obj->trans.rotation.y_rotation & 0xFFFF)) + + 0x8000; WRAP(angleDiff, -0x8000, 0x8000); if (angleDiff > 0) { if (angleDiff < 0x10) { angleDiff = 0x10; } } - obj->segment.trans.rotation.y_rotation += angleDiff >> 4; + obj->trans.rotation.y_rotation += angleDiff >> 4; distance = -2.0f; if (angleDiff > 0x800 || angleDiff < -0x800) { distance = -0.5f; } tt->forwardVel += (distance - tt->forwardVel) * 0.125; - obj->segment.x_velocity = sins_f(obj->segment.trans.rotation.y_rotation) * tt->forwardVel; - obj->segment.z_velocity = coss_f(obj->segment.trans.rotation.y_rotation) * tt->forwardVel; + obj->x_velocity = sins_f(obj->trans.rotation.y_rotation) * tt->forwardVel; + obj->z_velocity = coss_f(obj->trans.rotation.y_rotation) * tt->forwardVel; tt->animFrameF -= (tt->forwardVel * 2 * updateRateF); } else { - obj->properties.npc.action = TT_MODE_TURN_TOWARDS_PLAYER; + obj->properties.tt.action = TT_MODE_TURN_TOWARDS_PLAYER; } - move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, - obj->segment.z_velocity * updateRateF); + move_object(obj, obj->x_velocity * updateRateF, obj->y_velocity * updateRateF, + obj->z_velocity * updateRateF); set_pause_lockout_timer(1); break; case TT_MODE_TURN_TOWARDS_PLAYER: racer_set_dialogue_camera(); - obj->segment.object.animationID = 0; + obj->animationID = 0; tt->animFrameF += 3.0 * updateRateF; - angleDiff = - (racerObj->segment.trans.rotation.y_rotation - (obj->segment.trans.rotation.y_rotation & 0xFFFF)) + - 0x8000; + angleDiff = (racerObj->trans.rotation.y_rotation - (obj->trans.rotation.y_rotation & 0xFFFF)) + 0x8000; WRAP(angleDiff, -0x8000, 0x8000); if (angleDiff > 0) { if (angleDiff < 0x10) { angleDiff = 0x10; } } - obj->segment.trans.rotation.y_rotation += (angleDiff >> 4); - obj->segment.x_velocity = diffX * 0.05; - obj->segment.z_velocity = diffZ * 0.05; + obj->trans.rotation.y_rotation += (angleDiff >> 4); + obj->x_velocity = diffX * 0.05; + obj->z_velocity = diffZ * 0.05; if (angleDiff < 0x500) { if (angleDiff >= -0x4FF) { - obj->properties.npc.action = TT_MODE_DIALOGUE; + obj->properties.tt.action = TT_MODE_DIALOGUE; play_tt_voice_clip(SOUND_VOICE_TT_INTRO, 1); // Hi there, I'm T.T! } } - move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, - obj->segment.z_velocity * updateRateF); + move_object(obj, obj->x_velocity * updateRateF, obj->y_velocity * updateRateF, + obj->z_velocity * updateRateF); break; case TT_MODE_DIALOGUE: - obj->segment.x_velocity = diffX * 0.05; - obj->segment.z_velocity = diffZ * 0.05; - obj->segment.object.animationID = 1; + obj->x_velocity = diffX * 0.05; + obj->z_velocity = diffZ * 0.05; + obj->animationID = 1; tt->animFrameF += 1.0 * updateRateF; racer_set_dialogue_camera(); if (index == 3) { - obj->properties.npc.action = TT_MODE_DIALOGUE_END; + obj->properties.tt.action = TT_MODE_DIALOGUE_END; if (is_time_trial_enabled()) { play_tt_voice_clip(SOUND_VOICE_TT_SEE_YOU, 1); } else { @@ -1354,25 +1341,25 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { music_dynamic_set(header->instruments); racer->vehicleSound = racer_sound_init(racer->characterId, racer->vehicleID); } - obj->properties.npc.timer = 180; - move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, - obj->segment.z_velocity * updateRateF); + obj->properties.tt.timer = 180; + move_object(obj, obj->x_velocity * updateRateF, obj->y_velocity * updateRateF, + obj->z_velocity * updateRateF); break; case TT_MODE_DIALOGUE_END: tt->animFrameF += 1.0 * updateRateF; racer_set_dialogue_camera(); - if (obj->properties.npc.timer < 140) { - obj->properties.npc.timer += 60; - obj->properties.npc.action = TT_MODE_ROAM; - obj->segment.object.animationID = 0; + if (obj->properties.tt.timer < 140) { + obj->properties.tt.timer += 60; + obj->properties.tt.action = TT_MODE_ROAM; + obj->animationID = 0; } break; default: - obj->segment.object.animationID = 0; + obj->animationID = 0; tt->forwardVel = 0.0f; if (tt->nodeCurrent == NODE_NONE) { - tt->nodeCurrent = ainode_find_nearest(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, FALSE); + tt->nodeCurrent = + ainode_find_nearest(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, FALSE); if (tt->nodeCurrent != NODE_NONE) { tt->nodeBack2 = ainode_find_next(tt->nodeCurrent, -1, 0); tt->nodeForward1 = ainode_find_next(tt->nodeBack2, tt->nodeCurrent, 0); @@ -1385,31 +1372,30 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { } break; } - obj->segment.trans.y_position = tempPosY; - index = func_8002B0F4(obj->segment.object.segmentID, obj->segment.trans.x_position, obj->segment.trans.z_position, - &water); + obj->trans.y_position = tempPosY; + index = func_8002B0F4(obj->segmentID, obj->trans.x_position, obj->trans.z_position, &water); if (index != 0) { index--; while (index >= 0) { if ((water[index]->type != WATER_CALM) && (water[index]->type != WATER_WAVY) && (water[index]->rot.y > 0.0)) { - obj->segment.trans.y_position = water[index]->waveHeight; + obj->trans.y_position = water[index]->waveHeight; } index--; } } - obj->segment.trans.rotation.x_rotation = 0; - obj->segment.trans.rotation.z_rotation = 0; - if (obj->properties.npc.action != TT_MODE_ROAM) { - gNPCPosY = obj->segment.trans.y_position; + obj->trans.rotation.x_rotation = 0; + obj->trans.rotation.z_rotation = 0; + if (obj->properties.tt.action != TT_MODE_ROAM) { + gNPCPosY = obj->trans.y_position; } - obj->segment.animFrame = 1.0 * tt->animFrameF; + obj->animFrame = 1.0 * tt->animFrameF; func_80061C0C(obj); if (0) {} // Fakematch - if (obj->properties.npc.timer > 0) { - obj->properties.npc.timer -= updateRate; + if (obj->properties.tt.timer > 0) { + obj->properties.tt.timer -= updateRate; } else { - obj->properties.npc.timer = 0; + obj->properties.tt.timer = 0; } } @@ -1439,7 +1425,7 @@ void obj_init_fish(Object *fishObj, LevelObjectEntry_Fish *fishEntry, s32 param) s32 i; f32 tempxPos; - fish = &fishObj->unk64->fish; + fish = fishObj->fish; fish->unk100 = fishEntry->unkE << 4; fish->unk104 = fishEntry->unkF << 8; fish->unk114 = fishEntry->unk8; @@ -1454,7 +1440,7 @@ void obj_init_fish(Object *fishObj, LevelObjectEntry_Fish *fishEntry, s32 param) fish->unkFD = 0; } else { fish->unkFE = 0x4000; - fishObj->segment.trans.rotation.y_rotation = fish->unk104; + fishObj->trans.rotation.y_rotation = fish->unk104; } xPos = sins_f(fish->unkFE * 2) * fish->unk114; @@ -1467,8 +1453,8 @@ void obj_init_fish(Object *fishObj, LevelObjectEntry_Fish *fishEntry, s32 param) xPos = (tempxPos * coss104) + (zPos * sins104); zPos = (zPos * coss104) - (tempxPos * sins104); - fishObj->segment.trans.x_position = fish->unk108; - fishObj->segment.trans.z_position = fish->unk110; + fishObj->trans.x_position = fish->unk108; + fishObj->trans.z_position = fish->unk110; ignore_bounds_check(); move_object(fishObj, xPos, 0.0f, zPos); @@ -1499,8 +1485,8 @@ void obj_init_fish(Object *fishObj, LevelObjectEntry_Fish *fishEntry, s32 param) } fish->unkFC = 1; } - fishObj->segment.trans.scale = fishEntry->unkC * 0.01f; - if (fishEntry->unkB < fishObj->segment.header->numberOfModelIds) { + fishObj->trans.scale = fishEntry->unkC * 0.01f; + if (fishEntry->unkB < fishObj->header->numberOfModelIds) { fish->texture = fishObj->textures[fishEntry->unkB]; } else { fish->texture = fishObj->textures[0]; @@ -1546,14 +1532,14 @@ void obj_loop_fish(Object *fishObj, s32 updateRate) { free_object(fishObj); return; } - fish = &fishObj->unk64->fish; - yThing = fishObj->segment.trans.y_position; + fish = fishObj->fish; + yThing = fishObj->trans.y_position; if (fish->unkFD != 0) { - if ((s32) fish->unkFD >= updateRate) { - yThing += (fishObj->segment.y_velocity * updateRate); - fish->unkFD = fish->unkFD - updateRate; + if (fish->unkFD >= updateRate) { + yThing += fishObj->y_velocity * updateRate; + fish->unkFD -= updateRate; } else { - yThing += (fishObj->segment.y_velocity * fish->unkFD); + yThing += fishObj->y_velocity * fish->unkFD; fish->unkFD = 0; } } else { @@ -1561,11 +1547,10 @@ void obj_loop_fish(Object *fishObj, s32 updateRate) { if (randNumber == 0 && fish->unk118 >= 1.0f) { fish->unkFD = rand_range(160, 255); randNumber = rand_range(0, fish->unk118); - fishObj->segment.y_velocity = fish->unk10C - fishObj->segment.trans.y_position; - fishObj->segment.y_velocity = (fishObj->segment.trans.y_position < fish->unk10C) - ? (fishObj->segment.y_velocity + randNumber) - : (fishObj->segment.y_velocity - randNumber); - fishObj->segment.y_velocity /= fish->unkFD; + fishObj->y_velocity = fish->unk10C - fishObj->trans.y_position; + fishObj->y_velocity = (fishObj->trans.y_position < fish->unk10C) ? (fishObj->y_velocity + randNumber) + : (fishObj->y_velocity - randNumber); + fishObj->y_velocity /= fish->unkFD; } } fish->unkFE += updateRate * fish->unk100; @@ -1581,26 +1566,26 @@ void obj_loop_fish(Object *fishObj, s32 updateRate) { xThing = (prevZThing * cosUnk104) - (prevXThing * sinUnk104); zThing += fish->unk108; xThing += fish->unk110; - xDiff = fishObj->segment.trans.x_position - zThing; - yDiff = fishObj->segment.trans.y_position - yThing; - zDiff = fishObj->segment.trans.z_position - xThing; - fishObj->segment.trans.x_position = 0.0f; - fishObj->segment.trans.y_position = 0.0f; - fishObj->segment.trans.z_position = 0.0f; + xDiff = fishObj->trans.x_position - zThing; + yDiff = fishObj->trans.y_position - yThing; + zDiff = fishObj->trans.z_position - xThing; + fishObj->trans.x_position = 0.0f; + fishObj->trans.y_position = 0.0f; + fishObj->trans.z_position = 0.0f; ignore_bounds_check(); move_object(fishObj, zThing, yThing, xThing); dist2D = (xDiff * xDiff) + (zDiff * zDiff); dist3D = sqrtf((yDiff * yDiff) + dist2D); dist2D = sqrtf(dist2D); fish->unk106 += (s32) (dist3D * 0x600); - fishObj->segment.trans.rotation.y_rotation = arctan2_f(xDiff, zDiff); + fishObj->trans.rotation.y_rotation = arctan2_f(xDiff, zDiff); temp_v0_2 = arctan2_f(-yDiff, dist2D); - temp_t9 = (temp_v0_2 - fishObj->segment.trans.rotation.x_rotation) & 0xFFFF; - temp_t1 = (fishObj->segment.trans.rotation.x_rotation - temp_v0_2) & 0xFFFF; + temp_t9 = (temp_v0_2 - fishObj->trans.rotation.x_rotation) & 0xFFFF; + temp_t1 = (fishObj->trans.rotation.x_rotation - temp_v0_2) & 0xFFFF; if (temp_t9 < temp_t1) { - fishObj->segment.trans.rotation.x_rotation += ((temp_t9 * updateRate) >> 3); + fishObj->trans.rotation.x_rotation += ((temp_t9 * updateRate) >> 3); } else { - fishObj->segment.trans.rotation.x_rotation -= ((temp_t1 * updateRate) >> 3); + fishObj->trans.rotation.x_rotation -= ((temp_t1 * updateRate) >> 3); } fish->unkFC = 1 - fish->unkFC; verts = &fish->vertices[fish->unkFC * 6]; @@ -1630,65 +1615,65 @@ void obj_init_lavaspurt(Object *obj, LevelObjectEntry_LavaSpurt *entry) { void obj_loop_lavaspurt(Object *obj, s32 updateRate) { if (obj->properties.lavaSpurt.actionTimer > 0) { obj->properties.lavaSpurt.actionTimer -= updateRate; - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; } else { - obj->segment.trans.flags &= ~OBJ_FLAGS_INVISIBLE; - obj->segment.animFrame += updateRate * 4; - if (obj->segment.animFrame > 255) { - obj->segment.animFrame = 0; + obj->trans.flags &= ~OBJ_FLAGS_INVISIBLE; + obj->animFrame += updateRate * 4; + if (obj->animFrame > 255) { + obj->animFrame = 0; obj->properties.lavaSpurt.actionTimer = rand_range(0, 30) + obj->properties.lavaSpurt.delayTimer; } } } void obj_init_posarrow(Object *obj, UNUSED LevelObjectEntry_PosArrow *entry) { - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; } void obj_loop_posarrow(Object *obj, UNUSED s32 updateRate) { - Object_PosArrow *posArrow; - Object **someObjList; - Object *someObj; - s32 numberOfObjects; + Object_Racer *racer; + Object **racerObjects; + Object *racerObj; + s32 numRacers; - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; - someObjList = get_racer_objects_by_position(&numberOfObjects); - if (obj->properties.common.unk0 < numberOfObjects) { - someObj = someObjList[obj->properties.common.unk0]; - posArrow = &someObj->unk64->pos_arrow; - if (posArrow->unk0 == -1) { - obj->segment.trans.flags &= ~OBJ_FLAGS_INVISIBLE; - posArrow->unk150 = obj; + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; + racerObjects = get_racer_objects_by_position(&numRacers); + if (obj->properties.posArrow.playerID < numRacers) { + racerObj = racerObjects[obj->properties.posArrow.playerID]; + racer = racerObj->racer; + if (racer->playerIndex == PLAYER_COMPUTER) { + obj->trans.flags &= ~OBJ_FLAGS_INVISIBLE; + racer->unk150 = obj; } - obj->segment.animFrame = obj->properties.common.unk0 * 127; + obj->animFrame = obj->properties.posArrow.playerID * 127; } } /* Offical name: animInit */ void obj_init_animator(Object *obj, LevelObjectEntry_Animator *entry, s32 param) { - Object_Animator *obj64; + Object_Animator *animator; LevelModel *levelModel; s16 segmentBatchCount; - obj64 = &obj->unk64->animator; + animator = obj->animator; levelModel = get_current_level_model(); - obj64->batchId = entry->batchID; - obj64->speedFactorX = entry->speedFactorX; - obj64->speedFactorY = entry->speedfactorY; - obj64->segmentId = get_level_segment_index_from_position( - obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); + animator->batchId = entry->batchID; + animator->speedFactorX = entry->speedFactorX; + animator->speedFactorY = entry->speedfactorY; + animator->segmentId = + get_level_segment_index_from_position(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position); // Always true. if (param == 0) { - obj64->xSpeed = 0; - obj64->ySpeed = 0; + animator->xSpeed = 0; + animator->ySpeed = 0; } - if (obj64->segmentId != -1) { - if (obj64->batchId < 0) { - obj64->batchId = 0; + if (animator->segmentId != -1) { + if (animator->batchId < 0) { + animator->batchId = 0; } - segmentBatchCount = levelModel->segments[obj64->segmentId].numberOfBatches; - if (obj64->batchId >= segmentBatchCount) { - obj64->batchId = segmentBatchCount - 1; + segmentBatchCount = levelModel->segments[animator->segmentId].numberOfBatches; + if (animator->batchId >= segmentBatchCount) { + animator->batchId = segmentBatchCount - 1; } } obj_loop_animator(obj, 0x20000); @@ -1711,7 +1696,7 @@ void obj_loop_animator(Object *obj, s32 updateRate) { s32 shift2; TextureHeader *tex; - animator = &obj->unk64->animator; + animator = obj->animator; t0 = animator->speedFactorX; t1 = animator->speedFactorY; @@ -1754,7 +1739,7 @@ void obj_loop_animator(Object *obj, s32 updateRate) { shift = tex->width << 7; for (tri = trisStart; tri < trisEnd; tri++) { curTriangle = &curBlock->triangles[tri]; - if (!(curTriangle->flags & 0x80)) { + if (!(curTriangle->flags & TRI_FLAG_80)) { if ((shift << 1) < curTriangle->uv0.v) { curTriangle->uv0.v -= shift; curTriangle->uv1.v -= shift; @@ -1787,7 +1772,7 @@ void obj_loop_animator(Object *obj, s32 updateRate) { } void obj_init_animation(Object *obj, LevelObjectEntry_Animation *entry, s32 arg2) { - Object *obj64; + Object *animTarget; s8 tempOrderIndex; f32 scalef; @@ -1796,10 +1781,10 @@ void obj_init_animation(Object *obj, LevelObjectEntry_Animation *entry, s32 arg2 scalef = 1.0f; } scalef /= 64; - obj->segment.trans.scale = obj->segment.header->scale * scalef; - obj->segment.trans.rotation.y_rotation = entry->y_rotation << 8; - obj->segment.trans.rotation.x_rotation = entry->x_rotation << 8; - obj->segment.trans.rotation.z_rotation = entry->z_rotation << 8; + obj->trans.scale = obj->header->scale * scalef; + obj->trans.rotation.y_rotation = entry->y_rotation << 8; + obj->trans.rotation.x_rotation = entry->x_rotation << 8; + obj->trans.rotation.z_rotation = entry->z_rotation << 8; if (entry->actorIndex == -2) { entry->actorIndex = func_8001F3B8(); } else { @@ -1829,24 +1814,24 @@ void obj_init_animation(Object *obj, LevelObjectEntry_Animation *entry, s32 arg2 } } path_enable(); - obj->properties.animatedObj.behaviourID = entry->actorIndex; - obj->properties.animatedObj.action = arg2; + obj->properties.animation.behaviourID = entry->actorIndex; + obj->properties.animation.action = arg2; if (arg2 != 0 && (input_pressed(PLAYER_ONE) & R_CBUTTONS)) { - obj->properties.animatedObj.action = 2; + obj->properties.animation.action = 2; } - if (((cutscene_id() == entry->channel) || (entry->channel == 20)) && (obj->unk64 == NULL) && (entry->order == 0) && - (entry->objectIdToSpawn != -1)) { + if (((cutscene_id() == entry->channel) || (entry->channel == 20)) && (obj->animTarget == NULL) && + (entry->order == 0) && (entry->objectIdToSpawn != -1)) { func_8001F23C(obj, entry); } - obj64 = (Object *) &obj->unk64->obj; - if (obj->unk64 != NULL) { - obj_init_animcamera(obj, obj64); - if (entry->order != 0 || obj64->objectID != entry->objectIdToSpawn) { - free_object(obj64); - obj->unk64 = NULL; + animTarget = obj->animTarget; + if (obj->animTarget != NULL) { + obj_init_animobject(obj, animTarget); + if (entry->order != 0 || animTarget->objectID != entry->objectIdToSpawn) { + free_object(animTarget); + obj->animTarget = NULL; } } - if (func_80021600(obj->properties.animatedObj.behaviourID)) { + if (func_80021600(obj->properties.animation.behaviourID)) { func_8001EE74(); } } @@ -1857,11 +1842,11 @@ void obj_loop_animobject(Object *obj, s32 updateRate) { void obj_loop_dooropener(Object *obj, s32 updateRate) { s32 openDoors; - unk80037D08_arg0_64 *doorOpener; + Object_AnimatedObject *doorOpener; - doorOpener = (unk80037D08_arg0_64 *) obj->unk64; + doorOpener = obj->animatedObject; openDoors = 1 - func_8001F460(obj, updateRate, obj); - if (doorOpener->unk2A > 0) { + if (doorOpener->startDelay > 0) { openDoors = FALSE; } obj_door_open(openDoors); @@ -1900,21 +1885,21 @@ void obj_loop_wizpigship(Object *wizShipObj, s32 updateRate) { func_8001F460(wizShipObj, updateRate, wizShipObj); if (wizShipObj->modelInstances[0] != NULL) { wizShipModel = wizShipObj->modelInstances[0]->objModel; - if (wizShipObj->properties.fireball.timer > 0) { - wizShipObj->properties.fireball.timer -= updateRate; + if (wizShipObj->properties.wizpigship.timer > 0) { + wizShipObj->properties.wizpigship.timer -= updateRate; } else { - wizShipObj->properties.fireball.timer = 0; + wizShipObj->properties.wizpigship.timer = 0; } - if (wizShipObj->attachPoints != NULL && wizShipObj->properties.fireball.timer == 0) { + if (wizShipObj->attachPoints != NULL && wizShipObj->properties.wizpigship.timer == 0) { if (wizShipObj->particleEmittersEnabled & OBJ_EMIT_1) { - wizShipObj->properties.fireball.timer = 20; - mtxf_from_transform(&shipMtx, &wizShipObj->segment.trans); + wizShipObj->properties.wizpigship.timer = 20; + mtxf_from_transform(&shipMtx, &wizShipObj->trans); trans.x_position = 0.0f; trans.y_position = 0.0f; trans.z_position = 0.0f; trans.scale = 1.0f; - trans.rotation.y_rotation = wizShipObj->segment.trans.rotation.y_rotation; - trans.rotation.x_rotation = wizShipObj->segment.trans.rotation.x_rotation; + trans.rotation.y_rotation = wizShipObj->trans.rotation.y_rotation; + trans.rotation.x_rotation = wizShipObj->trans.rotation.x_rotation; trans.rotation.z_rotation = 0; mtxf_from_transform(&laserMtx, &trans); @@ -1933,18 +1918,15 @@ void obj_loop_wizpigship(Object *wizShipObj, s32 updateRate) { newObject.objectID = ASSET_OBJECT_ID_LASERBOLT; newObj = spawn_object(&newObject, OBJECT_SPAWN_UNK01); if (newObj != NULL) { - newObj->segment.level_entry = NULL; - newObj->segment.trans.rotation.y_rotation = - wizShipObj->segment.trans.rotation.y_rotation + 0x8000; - newObj->segment.trans.rotation.x_rotation = - -wizShipObj->segment.trans.rotation.x_rotation; - newObj->properties.lasergun.timer = 0x3C; - mtxf_transform_point(&laserMtx, 0.0f, 0.0f, -30.0f, &newObj->segment.x_velocity, - &newObj->segment.y_velocity, &newObj->segment.z_velocity); - audspat_play_sound_at_position(SOUND_LASER_GUN, wizShipObj->segment.trans.x_position, - wizShipObj->segment.trans.y_position, - wizShipObj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + newObj->level_entry = NULL; + newObj->trans.rotation.y_rotation = wizShipObj->trans.rotation.y_rotation + 0x8000; + newObj->trans.rotation.x_rotation = -wizShipObj->trans.rotation.x_rotation; + newObj->properties.laserbolt.timer = 60; + mtxf_transform_point(&laserMtx, 0.0f, 0.0f, -30.0f, &newObj->x_velocity, + &newObj->y_velocity, &newObj->z_velocity); + audspat_play_sound_at_position( + SOUND_LASER_GUN, wizShipObj->trans.x_position, wizShipObj->trans.y_position, + wizShipObj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } } } @@ -1957,7 +1939,7 @@ void obj_loop_wizpigship(Object *wizShipObj, s32 updateRate) { /** * Cutscene Vehicle loop behaviour. * Performs its set behaviour while having its own handler for the attached vehicle parts. -*/ + */ void obj_loop_vehicleanim(Object *obj, s32 updateRate) { AttachPoint *attachPoint; Object *attachObj; @@ -1967,12 +1949,12 @@ void obj_loop_vehicleanim(Object *obj, s32 updateRate) { if (attachPoint == NULL || attachPoint->count <= 0) { return; } - + attachObj = attachPoint->count == 3 ? attachPoint->obj[2] : attachPoint->obj[0]; - attachObj->segment.trans.rotation.y_rotation = 0x4000; - attachObj->segment.object.modelIndex++; - if (attachObj->segment.object.modelIndex == attachObj->segment.header->numberOfModelIds) { - attachObj->segment.object.modelIndex = 0; + attachObj->trans.rotation.y_rotation = 0x4000; + attachObj->modelIndex++; + if (attachObj->modelIndex == attachObj->header->numberOfModelIds) { + attachObj->modelIndex = 0; } } @@ -2017,20 +1999,20 @@ void obj_init_snowball(Object *obj, UNUSED LevelObjectEntry_Snowball *entry) { } void obj_loop_snowball(Object *obj, s32 updateRate) { - Object_AnimatedObject *obj64 = &obj->unk64->animatedObject; - if (obj64->currentSound == SOUND_NONE) { - if (obj64->soundID != SOUND_NONE) { - obj64->currentSound = obj64->soundID & 0xFF; + Object_AnimatedObject *animated = obj->animatedObject; + if (animated->currentSound == SOUND_NONE) { + if (animated->soundID != SOUND_NONE) { + animated->currentSound = animated->soundID & 0xFF; } } - if (obj64->currentSound != SOUND_NONE) { - if (obj64->soundMask == NULL) { - audspat_play_sound_at_position(obj64->currentSound, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_1, (AudioPoint **) &obj64->soundMask); + if (animated->currentSound != SOUND_NONE) { + if (animated->soundMask == NULL) { + audspat_play_sound_at_position(animated->currentSound, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_1, + (AudioPoint **) &animated->soundMask); } else { - audspat_point_set_position((AudioPoint *) obj64->soundMask, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position); + audspat_point_set_position((AudioPoint *) animated->soundMask, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position); } } func_8001F460(obj, updateRate, obj); @@ -2048,7 +2030,7 @@ void obj_loop_char_select(Object *charSelectObj, s32 updateRate) { s32 i; f32 temp_f0; ObjectModel *objMdl; - Object_CharacterSelect *charSelect; + Object_AnimatedObject *charSelect; s32 charCount; s32 var_s0; s8 *status = NULL; @@ -2059,10 +2041,10 @@ void obj_loop_char_select(Object *charSelectObj, s32 updateRate) { var_s0 = 0; func_8001F460(charSelectObj, updateRate, NULL); - charSelect = &charSelectObj->unk64->characterSelect; + charSelect = charSelectObj->animatedObject; charSelectObj->particleEmittersEnabled = OBJ_EMIT_NONE; if (charSelect != NULL) { - modInst = charSelectObj->modelInstances[charSelectObj->segment.object.modelIndex]; + modInst = charSelectObj->modelInstances[charSelectObj->modelIndex]; if (modInst != NULL) { objMdl = modInst->objModel; if (is_drumstick_unlocked()) { @@ -2088,7 +2070,7 @@ void obj_loop_char_select(Object *charSelectObj, s32 updateRate) { } i--; if (var_s0) { - charSelectObj->segment.object.animationID = 1; + charSelectObj->animationID = 1; for (var_s0 = 0, sp4F = 0; var_s0 < MAXCONTROLLERS; var_s0++) { if (get_player_character(var_s0) == i) { sp50[sp4F++] = var_s0; @@ -2118,21 +2100,21 @@ void obj_loop_char_select(Object *charSelectObj, s32 updateRate) { objMdl->batches[i2].textureIndex = sp50[D_800DCA88[i]]; } } - charSelectObj->segment.object.animationID = 0; + charSelectObj->animationID = 0; } } - if (charSelectObj->segment.object.animationID >= 0) { - if ((charSelectObj->segment.object.animationID < objMdl->numberOfAnimations)) { - i = (objMdl->animations[charSelectObj->segment.object.animationID].animLength - 1) << 4; + if (charSelectObj->animationID >= 0) { + if ((charSelectObj->animationID < objMdl->numberOfAnimations)) { + i = (objMdl->animations[charSelectObj->animationID].animLength - 1) << 4; if (charSelect->unk2C == 1) { temp_f0 = music_animation_fraction(); if (temp_f0 > 0.5) { temp_f0 -= 0.5; temp_f0 *= 2.0; - charSelectObj->segment.animFrame = i - (temp_f0 * i); + charSelectObj->animFrame = i - (temp_f0 * i); } else { temp_f0 *= 2; - charSelectObj->segment.animFrame = temp_f0 * i; + charSelectObj->animFrame = temp_f0 * i; } } } @@ -2148,11 +2130,11 @@ void obj_loop_char_select(Object *charSelectObj, s32 updateRate) { void obj_loop_animcamera(Object *obj, s32 updateRate) { s32 temp_v0; s32 updateCam; - Object_Animation *camera; + Object_AnimatedObject *camera; temp_v0 = func_8001F460(obj, updateRate, obj); - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; - camera = &obj->unk64->animation; + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; + camera = obj->animatedObject; if (temp_v0 == 0) { if (cam_get_viewport_layout() == VIEWPORT_LAYOUT_1_PLAYER) { updateCam = func_800210CC(camera->unk44); @@ -2160,10 +2142,9 @@ void obj_loop_animcamera(Object *obj, s32 updateRate) { updateCam = TRUE; } if (updateCam) { - write_to_object_render_stack(camera->cameraID, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, 0x8000 - obj->segment.trans.rotation.y_rotation, - -obj->segment.trans.rotation.x_rotation, - obj->segment.trans.rotation.z_rotation); + write_to_object_render_stack(camera->cameraID, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, 0x8000 - obj->trans.rotation.y_rotation, + -obj->trans.rotation.x_rotation, obj->trans.rotation.z_rotation); } } } @@ -2182,15 +2163,15 @@ UNUSED void obj_init_animcar(UNUSED Object *obj, UNUSED s32 arg1) { void obj_loop_animcar(Object *obj, s32 updateRate) { Object *racerObj; s32 racerID; - racerID = obj->properties.common.unk0; + racerID = obj->properties.animatedObj.unk0; racerObj = NULL; if (racerID != 0) { racerObj = get_racer_object(racerID - 1); } - obj->properties.common.unk4 = func_8001F460(obj, updateRate, obj); - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; - if (obj->properties.common.unk4 == 0 && racerObj != NULL) { - Object_Racer *racer = &racerObj->unk64->racer; + obj->properties.animatedObj.unk4 = func_8001F460(obj, updateRate, obj); + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; + if (obj->properties.animatedObj.unk4 == 0 && racerObj != NULL) { + Object_Racer *racer = racerObj->racer; racer->approachTarget = obj; } } @@ -2206,7 +2187,7 @@ void obj_init_infopoint(Object *obj, LevelObjectEntry_InfoPoint *entry) { obj->interactObj->pushForce = 0; obj->properties.infoPoint.radius = (entry->hitbox[2] << 16) | entry->hitbox[0]; // Not sure about the values here. obj->properties.infoPoint.visible = entry->hitbox[1]; - obj->segment.trans.rotation.y_rotation = entry->unkB << 10; // Not sure about the values here. + obj->trans.rotation.y_rotation = entry->unkB << 10; // Not sure about the values here. } void obj_loop_infopoint(Object *obj, UNUSED s32 updateRate) { @@ -2215,17 +2196,17 @@ void obj_loop_infopoint(Object *obj, UNUSED s32 updateRate) { Object *playerObj; if (obj->properties.infoPoint.visible == FALSE) { - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; } else { - obj->segment.trans.flags &= ~OBJ_FLAGS_INVISIBLE; + obj->trans.flags &= ~OBJ_FLAGS_INVISIBLE; } interactObj = obj->interactObj; if (interactObj->distance < ((obj->properties.infoPoint.radius >> 16) & 0xFF)) { playerObj = interactObj->obj; - if (playerObj->segment.header->behaviorId == 1) { - Object_InfoPoint *playerObj64 = &playerObj->unk64->info_point; - player = playerObj64->unk0; + if (playerObj->header->behaviorId == BHV_RACER) { + Object_Racer *racer = playerObj->racer; + player = racer->playerIndex; if ((player != PLAYER_COMPUTER) && (input_pressed(player) & Z_TRIG)) { set_current_text(obj->properties.infoPoint.radius & 0xFF); } @@ -2241,13 +2222,13 @@ void obj_loop_smoke(Object *obj, s32 updateRate) { if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } - obj->segment.trans.x_position += obj->segment.x_velocity * updateRateF; - obj->segment.animFrame += updateRate * 16; - obj->segment.trans.y_position += obj->segment.y_velocity * updateRateF; - obj->segment.trans.z_position += obj->segment.z_velocity * updateRateF; - if (obj->segment.animFrame > 255) { + obj->trans.x_position += obj->x_velocity * updateRateF; + obj->animFrame += updateRate * 16; + obj->trans.y_position += obj->y_velocity * updateRateF; + obj->trans.z_position += obj->z_velocity * updateRateF; + if (obj->animFrame > 255) { free_object(obj); - obj->segment.animFrame = 255; + obj->animFrame = 255; } } @@ -2255,10 +2236,10 @@ void obj_init_unknown25(UNUSED Object *obj, UNUSED LevelObjectEntry_Unknown25 *e } void obj_loop_unknown25(Object *obj, s32 updateRate) { - obj->segment.animFrame += updateRate * 8; - if (obj->segment.animFrame > 255) { + obj->animFrame += updateRate * 8; + if (obj->animFrame > 255) { free_object(obj); - obj->segment.animFrame = 255; + obj->animFrame = 255; } } @@ -2272,19 +2253,19 @@ void obj_loop_wardensmoke(Object *obj, s32 updateRate) { if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } - obj->segment.animFrame += updateRate * 4; - obj->segment.trans.y_position += updateRateF * 0.25; - if (obj->segment.animFrame > 255) { + obj->animFrame += updateRate * 4; + obj->trans.y_position += updateRateF * 0.25; + if (obj->animFrame > 255) { free_object(obj); - obj->segment.animFrame = 255; + obj->animFrame = 255; } } void obj_init_bombexplosion(Object *obj, LevelObjectEntry_BombExplosion *entry) { LevelObjectEntry_BombExplosion *entry2; - obj->segment.animFrame = 0; - obj->segment.trans.scale = 0.5f; - obj->segment.object.modelIndex = rand_range(0, obj->segment.header->numberOfModelIds - 1); + obj->animFrame = 0; + obj->trans.scale = 0.5f; + obj->modelIndex = rand_range(0, obj->header->numberOfModelIds - 1); entry2 = entry; // Needed for a match. obj->properties.bombExplosion.timer = 0; obj->properties.bombExplosion.unk4 = 0xFF; @@ -2301,14 +2282,14 @@ void obj_loop_bombexplosion(Object *obj, s32 updateRate) { temp_t8 = (obj->properties.bombExplosion.unk4 >> 8) & 0xFF; if (obj->properties.bombExplosion.timer > 10 && temp_t8 != 0) { obj->properties.bombExplosion.unk4 ^= (temp_t8 << 8); - obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, + obj_spawn_effect(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_NONE, 1.0f, temp_t8 - 1); } if (obj->properties.bombExplosion.timer < 20) { - obj->segment.trans.scale = ((obj->properties.bombExplosion.timer / 20.0f) * 10.0f) + 0.5f; + obj->trans.scale = ((obj->properties.bombExplosion.timer / 20.0f) * 10.0f) + 0.5f; obj->properties.bombExplosion.unk4 |= 0xFF; } else if (obj->properties.bombExplosion.timer < 0x28) { - obj->segment.trans.scale = (((obj->properties.bombExplosion.timer - 20) / 20.0f) * 5.0f) + 10.5f; + obj->trans.scale = (((obj->properties.bombExplosion.timer - 20) / 20.0f) * 5.0f) + 10.5f; obj->properties.bombExplosion.unk4 = 0x1EF - (obj->properties.bombExplosion.timer * 0xC); } else { free_object(obj); @@ -2343,7 +2324,7 @@ void obj_init_teleport(Object *obj, UNUSED LevelObjectEntry_Teleport *entry) { */ void obj_loop_teleport(Object *obj, UNUSED s32 updateRate) { if (obj->properties.lighthouse.active) { - LevelObjectEntry_Teleport *level_entry = &obj->segment.level_entry->teleport; + LevelObjectEntry_Teleport *level_entry = &obj->level_entry->teleport; if (obj->interactObj->distance < 120) { begin_level_teleport(level_entry->levelID); obj->properties.lighthouse.active = FALSE; @@ -2365,15 +2346,14 @@ void obj_init_exit(Object *obj, LevelObjectEntry_Exit *entry) { if (radius < 5) { radius = 5; } - exit = &obj->unk64->exit; + exit = obj->exit; radius /= 128; - obj->segment.trans.scale = radius; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); - exit->directionX = sins_f(obj->segment.trans.rotation.y_rotation); + obj->trans.scale = radius; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + exit->directionX = sins_f(obj->trans.rotation.y_rotation); exit->directionY = 0.0f; - exit->directionZ = coss_f(obj->segment.trans.rotation.y_rotation); - exit->rotationDiff = - -((exit->directionX * obj->segment.trans.x_position) + (exit->directionZ * obj->segment.trans.z_position)); + exit->directionZ = coss_f(obj->trans.rotation.y_rotation); + exit->rotationDiff = -((exit->directionX * obj->trans.x_position) + (exit->directionZ * obj->trans.z_position)); exit->radius = entry->radius; exit->bossFlag = entry->bossFlag; obj->interactObj->flags = INTERACT_FLAGS_TANGIBLE; @@ -2402,7 +2382,7 @@ void obj_loop_exit(Object *obj, UNUSED s32 updateRate) { s32 i; f32 rotDiff; - exit = &obj->unk64->exit; + exit = obj->exit; enableWarp = TRUE; settings = get_settings(); // Disable the warp if it's for the first boss encounter, having collected every balloon. @@ -2420,14 +2400,14 @@ void obj_loop_exit(Object *obj, UNUSED s32 updateRate) { racerObjects = get_racer_objects(&numberOfRacers); for (i = 0; i < numberOfRacers; i++) { racerObj = racerObjects[i]; - racer = &racerObj->unk64->racer; + racer = racerObj->racer; if (racer->playerIndex != PLAYER_COMPUTER && racer->exitObj == NULL) { - diffX = racerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = racerObj->trans.x_position - obj->trans.x_position; + diffY = racerObj->trans.y_position - obj->trans.y_position; + diffZ = racerObj->trans.z_position - obj->trans.z_position; if ((sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < dist)) { - rotDiff = (exit->directionX * racerObj->segment.trans.x_position) + - (exit->directionZ * racerObj->segment.trans.z_position) + exit->rotationDiff; + rotDiff = (exit->directionX * racerObj->trans.x_position) + + (exit->directionZ * racerObj->trans.z_position) + exit->rotationDiff; if (rotDiff < 0.0f) { racer->exitObj = obj; racer->transitionTimer = -120; @@ -2461,7 +2441,7 @@ void obj_loop_cameracontrol(UNUSED Object *obj, UNUSED s32 updateRate) { void obj_init_setuppoint(Object *obj, LevelObjectEntry_SetupPoint *entry) { obj->properties.setupPoint.racerIndex = entry->racerIndex; obj->properties.setupPoint.entranceID = entry->entranceID; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); } /** @@ -2489,21 +2469,20 @@ void obj_init_dino_whale(Object *obj, UNUSED LevelObjectEntry_Dino_Whale *entry) void obj_loop_dino_whale(Object *obj, s32 updateRate) { s32 animFrame; - if (obj->properties.common.unk0 > 0) { - obj->properties.common.unk0 -= updateRate; + if (obj->properties.dinoWhale.unk0 > 0) { + obj->properties.dinoWhale.unk0 -= updateRate; updateRate *= 2; } else { - obj->properties.common.unk0 = 0; + obj->properties.dinoWhale.unk0 = 0; } - animFrame = obj->segment.animFrame; + animFrame = obj->animFrame; func_8001F460(obj, updateRate, obj); play_footstep_sounds(obj, 0, animFrame, SOUND_STOMP2, SOUND_STOMP3); if (obj->interactObj->distance < 255) { - if (obj->properties.common.unk0 == 0) { - obj->properties.common.unk0 = 60; - audspat_play_sound_at_position(SOUND_VOICE_BRONTO_ROAR, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + if (obj->properties.dinoWhale.unk0 == 0) { + obj->properties.dinoWhale.unk0 = 60; + audspat_play_sound_at_position(SOUND_VOICE_BRONTO_ROAR, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } } } @@ -2518,7 +2497,7 @@ void obj_init_parkwarden(Object *obj, UNUSED LevelObjectEntry_Parkwarden *entry) obj->interactObj->unk11 = 0; obj->interactObj->hitboxRadius = 30; obj->interactObj->pushForce = 0; - taj = &obj->unk64->npc; + taj = obj->npc; taj->nodeCurrent = 0xFF; taj->unk0 = 0.0f; taj->unk28 = 0; @@ -2569,40 +2548,40 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { s32 temp; spawnSmoke = FALSE; - tempPosY = obj->segment.trans.y_position; + tempPosY = obj->trans.y_position; updateRateF2 = updateRate; updateRateF = updateRateF2; if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } - taj = &obj->unk64->npc; + taj = obj->npc; levelHeader = get_current_level_header(); obj->particleEmittersEnabled = OBJ_EMIT_NONE; - if (obj->segment.animFrame == 0 && taj->animFrameF > 1.0) { + if (obj->animFrame == 0 && taj->animFrameF > 1.0) { taj->animFrameF = 0.0f; } distance = 0.0f; - obj->segment.x_velocity = 0.0f; - obj->segment.z_velocity = 0.0f; + obj->x_velocity = 0.0f; + obj->z_velocity = 0.0f; racerObj = get_racer_object(PLAYER_ONE); if (racerObj != NULL) { - racer = &racerObj->unk64->racer; - xPosDiff = (racerObj->segment.trans.x_position - (racer->ox1 * 50.0f)) - obj->segment.trans.x_position; - zPosDiff = (racerObj->segment.trans.z_position - (racer->oz1 * 50.0f)) - obj->segment.trans.z_position; + racer = racerObj->racer; + xPosDiff = (racerObj->trans.x_position - (racer->ox1 * 50.0f)) - obj->trans.x_position; + zPosDiff = (racerObj->trans.z_position - (racer->oz1 * 50.0f)) - obj->trans.z_position; distance = sqrtf((xPosDiff * xPosDiff) + (zPosDiff * zPosDiff)); } buttonsPressed = input_pressed(PLAYER_ONE); var_a2 = FALSE; - if ((obj->properties.npc.action == NULL) && (distance < 300.0) && + if ((obj->properties.taj.action == NULL) && (distance < 300.0) && (((obj->interactObj->flags & INTERACT_FLAGS_PUSHING) && (racerObj == obj->interactObj->obj)) || (buttonsPressed & Z_TRIG))) { if (buttonsPressed & Z_TRIG) { play_char_horn_sound(racerObj, racer); } - arctan = arctan2_f(racerObj->segment.trans.x_position - obj->segment.trans.x_position, - racerObj->segment.trans.z_position - obj->segment.trans.z_position) - - (racerObj->segment.trans.rotation.y_rotation & 0xFFFF); + arctan = arctan2_f(racerObj->trans.x_position - obj->trans.x_position, + racerObj->trans.z_position - obj->trans.z_position) - + (racerObj->trans.rotation.y_rotation & 0xFFFF); if (arctan > 0x8000) { arctan = -0xFFFF; } @@ -2616,7 +2595,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { } obj->interactObj->flags = INTERACT_FLAGS_SOLID; if ((should_taj_teleport() || var_a2) && - (obj->properties.npc.action == TAJ_MODE_ROAM || obj->properties.npc.action == TAJ_MODE_UNK1F)) { + (obj->properties.taj.action == TAJ_MODE_ROAM || obj->properties.taj.action == TAJ_MODE_UNK1F)) { music_channel_reset_all(); music_voicelimit_set(24); music_play(SEQUENCE_ENTRANCED); @@ -2625,18 +2604,18 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { racer->vehicleSound = NULL; } audspat_jingle_off(); - arctan = arctan2_f(racerObj->segment.trans.x_position - obj->segment.trans.x_position, - racerObj->segment.trans.z_position - obj->segment.trans.z_position); - arctan -= (racerObj->segment.trans.rotation.y_rotation & 0xFFFF); + arctan = arctan2_f(racerObj->trans.x_position - obj->trans.x_position, + racerObj->trans.z_position - obj->trans.z_position); + arctan -= (racerObj->trans.rotation.y_rotation & 0xFFFF); if ((arctan > 0x8000)) { // Probably had a debug statement here. - if ((obj->properties.npc.action) && (!obj->properties.npc.action) && (!obj->properties.npc.action)) { + if ((obj->properties.taj.action) && (!obj->properties.taj.action) && (!obj->properties.taj.action)) { } // Fakematch } if (var_a2) { - obj->properties.npc.action = TAJ_MODE_APPROACH_PLAYER; + obj->properties.taj.action = TAJ_MODE_APPROACH_PLAYER; } else { - obj->properties.npc.action = TAJ_MODE_TELEPORT_TO_PLAYER_BEGIN; + obj->properties.taj.action = TAJ_MODE_TELEPORT_TO_PLAYER_BEGIN; spawnSmoke = TRUE; } get_fog_settings(PLAYER_ONE, &taj->fogNear, &taj->fogFar, &taj->fogR, &taj->fogG, &taj->fogB); @@ -2644,14 +2623,14 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { taj->animFrameF = 0.0f; } - if (!(obj->properties.npc.action == TAJ_MODE_ROAM || obj->properties.npc.action == TAJ_MODE_RACE || - obj->properties.npc.action == TAJ_MODE_TELEPORT_AWAY_BEGIN || - obj->properties.npc.action == TAJ_MODE_TELEPORT_AWAY_END)) { + if (!(obj->properties.taj.action == TAJ_MODE_ROAM || obj->properties.taj.action == TAJ_MODE_RACE || + obj->properties.taj.action == TAJ_MODE_TELEPORT_AWAY_BEGIN || + obj->properties.taj.action == TAJ_MODE_TELEPORT_AWAY_END)) { disable_racer_input(); minimap_fade(3); } - switch (obj->properties.npc.action) { + switch (obj->properties.taj.action) { case TAJ_MODE_GREET_PLAYER: case TAJ_MODE_DIALOGUE: case TAJ_MODE_TRANSFORM_BEGIN: @@ -2664,7 +2643,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { break; } - switch (obj->properties.npc.action) { + switch (obj->properties.taj.action) { case TAJ_MODE_APPROACH_PLAYER: case TAJ_MODE_TURN_TOWARDS_PLAYER: case TAJ_MODE_GREET_PLAYER: @@ -2678,20 +2657,20 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { set_pause_lockout_timer(1); break; } - if (obj->properties.npc.action != TAJ_MODE_ROAM && dialogueID != 0 && obj->properties.npc.action < 4) { - obj->properties.npc.action = TAJ_MODE_DIALOGUE; + if (obj->properties.taj.action != TAJ_MODE_ROAM && dialogueID != 0 && obj->properties.taj.action < 4) { + obj->properties.taj.action = TAJ_MODE_DIALOGUE; } - switch (obj->properties.npc.action) { + switch (obj->properties.taj.action) { case TAJ_MODE_APPROACH_PLAYER: - obj->segment.object.animationID = 0; + obj->animationID = 0; taj->nodeCurrent = 0xFF; if (distance < 100.0) { racer_set_dialogue_camera(); } if (distance > 10.0) { - arctan = (arctan2_f(xPosDiff / distance, zPosDiff / distance) - - (obj->segment.trans.rotation.y_rotation & 0xFFFF)) + - 0x8000; + arctan = + (arctan2_f(xPosDiff / distance, zPosDiff / distance) - (obj->trans.rotation.y_rotation & 0xFFFF)) + + 0x8000; if (arctan > 0x8000) { arctan -= 0xFFFF; } @@ -2701,27 +2680,26 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (arctan > 0 && arctan < 16) { arctan = 16; } - obj->segment.trans.rotation.y_rotation += (arctan >> 4); + obj->trans.rotation.y_rotation += (arctan >> 4); var_f2 = -2.0f; if (arctan > 0x800 || arctan < -0x800) { var_f2 = -0.5f; } taj->forwardVel += (var_f2 - taj->forwardVel) * 0.125; - obj->segment.x_velocity = sins_f(obj->segment.trans.rotation.y_rotation) * taj->forwardVel; - obj->segment.z_velocity = coss_f(obj->segment.trans.rotation.y_rotation) * taj->forwardVel; + obj->x_velocity = sins_f(obj->trans.rotation.y_rotation) * taj->forwardVel; + obj->z_velocity = coss_f(obj->trans.rotation.y_rotation) * taj->forwardVel; taj->animFrameF -= taj->forwardVel * 2 * updateRateF; } else { - obj->properties.npc.action = TAJ_MODE_TURN_TOWARDS_PLAYER; + obj->properties.taj.action = TAJ_MODE_TURN_TOWARDS_PLAYER; } - move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, - obj->segment.z_velocity * updateRateF); + move_object(obj, obj->x_velocity * updateRateF, obj->y_velocity * updateRateF, + obj->z_velocity * updateRateF); break; case TAJ_MODE_TURN_TOWARDS_PLAYER: racer_set_dialogue_camera(); - obj->segment.object.animationID = 0; + obj->animationID = 0; taj->animFrameF += updateRateF * 2.0; - arctan = (racerObj->segment.trans.rotation.y_rotation - (obj->segment.trans.rotation.y_rotation & 0xFFFF)) + - 0x8000; + arctan = (racerObj->trans.rotation.y_rotation - (obj->trans.rotation.y_rotation & 0xFFFF)) + 0x8000; if (arctan > 0x8000) { arctan -= 0xFFFF; } @@ -2731,30 +2709,29 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (arctan > 0 && arctan < 16) { arctan = 16; } - obj->segment.trans.rotation.y_rotation += arctan >> 3; + obj->trans.rotation.y_rotation += arctan >> 3; if (arctan < 0x400 && arctan > -0x400 && distance < 2.0) { - obj->properties.npc.action = TAJ_MODE_GREET_PLAYER; + obj->properties.taj.action = TAJ_MODE_GREET_PLAYER; taj->animFrameF = 0; play_taj_voice_clip(gTajSoundID, TRUE); gTajSoundID = SOUND_VOICE_TAJ_HELLO; } - obj->segment.x_velocity = xPosDiff * 0.125; - obj->segment.y_velocity = 0; - obj->segment.z_velocity = zPosDiff * 0.125; - move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, - obj->segment.z_velocity * updateRateF); + obj->x_velocity = xPosDiff * 0.125; + obj->y_velocity = 0; + obj->z_velocity = zPosDiff * 0.125; + move_object(obj, obj->x_velocity * updateRateF, obj->y_velocity * updateRateF, + obj->z_velocity * updateRateF); break; case TAJ_MODE_GREET_PLAYER: - obj->segment.object.animationID = 1; + obj->animationID = 1; taj->forwardVel = 0.0f; taj->animFrameF += updateRateF * 1.0; if (taj->animFrameF > 77.0) { taj->animFrameF = 77.0; taj->unk18 = -1.0f; - obj->properties.npc.action = TAJ_MODE_DIALOGUE; + obj->properties.taj.action = TAJ_MODE_DIALOGUE; } - arctan = (racerObj->segment.trans.rotation.y_rotation - (obj->segment.trans.rotation.y_rotation & 0xFFFF)) + - 0x8000; + arctan = (racerObj->trans.rotation.y_rotation - (obj->trans.rotation.y_rotation & 0xFFFF)) + 0x8000; if (arctan > 0x8000) { arctan -= 0xFFFF; } @@ -2764,18 +2741,18 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (arctan > 0 && arctan < 16) { arctan = 16; } - obj->segment.trans.rotation.y_rotation = obj->segment.trans.rotation.y_rotation + (arctan >> 4); + obj->trans.rotation.y_rotation = obj->trans.rotation.y_rotation + (arctan >> 4); racer_set_dialogue_camera(); break; case TAJ_MODE_DIALOGUE: - obj->segment.object.animationID = 4; + obj->animationID = 4; taj->animFrameF += updateRateF * 1.0; racer_set_dialogue_camera(); if (dialogueID == 3 || dialogueID == 4) { - obj->properties.npc.action = + obj->properties.taj.action = (dialogueID == 4) ? TAJ_MODE_END_DIALOGUE_CHALLENGE : TAJ_MODE_END_DIALOGUE; taj->animFrameF = 0.1f; - obj->segment.object.animationID = 2; + obj->animationID = 2; taj->unk1C = 0; play_taj_voice_clip(SOUND_VOICE_TAJ_BYE, TRUE); slowly_change_fog(PLAYER_ONE, taj->fogR, taj->fogG, taj->fogB, taj->fogNear, taj->fogFar, 180); @@ -2787,7 +2764,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (dialogueID & 0x80) { gTajDialogueChoice = dialogueID & 0x7F; if (gTajDialogueChoice != racer->vehicleID) { - obj->properties.npc.action = TAJ_MODE_TRANSFORM_BEGIN; + obj->properties.taj.action = TAJ_MODE_TRANSFORM_BEGIN; taj->animFrameF = 0; // Voice clips: Abrakadabra, Alakazam, Alakazoom? play_taj_voice_clip((racer->vehicleID + SOUND_VOICE_TAJ_ABRAKADABRA), TRUE); @@ -2799,12 +2776,12 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { gTajDialogueChoice = dialogueID & 0xF; if (gTajDialogueChoice != racer->vehicleID) { gTajDialogueChoice |= 0x80; - obj->properties.npc.action = TAJ_MODE_TRANSFORM_BEGIN; + obj->properties.taj.action = TAJ_MODE_TRANSFORM_BEGIN; taj->animFrameF = 0.0f; // Voice clips: Abrakadabra, Alakazam, Alakazoom? play_taj_voice_clip((racer->vehicleID + SOUND_VOICE_TAJ_ABRAKADABRA), TRUE); } else { - obj->properties.npc.action = TAJ_MODE_SET_CHALLENGE; + obj->properties.taj.action = TAJ_MODE_SET_CHALLENGE; transition_begin(&gTajTransition); spawnSmoke = TRUE; play_taj_voice_clip(SOUND_WHOOSH4, TRUE); @@ -2813,7 +2790,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { } break; case TAJ_MODE_TRANSFORM_BEGIN: - obj->segment.object.animationID = 5; + obj->animationID = 5; racer_set_dialogue_camera(); taj->animFrameF += updateRateF * 2.0; if (taj->animFrameF > 25.0) { @@ -2829,7 +2806,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { } else { racer->transparency = 0; despawn_player_racer(racerObj, gTajDialogueChoice & 0xF); - obj->properties.npc.action = TAJ_MODE_TRANSFORM_END; + obj->properties.taj.action = TAJ_MODE_TRANSFORM_END; sound_play(SOUND_CYMBAL, NULL); transition_begin(&gTajTransformTransitionEnd); } @@ -2854,11 +2831,11 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (gTajDialogueChoice & 0x80) { transition_begin(&gTajTransition); spawnSmoke = TRUE; - obj->properties.npc.action = TAJ_MODE_SET_CHALLENGE; + obj->properties.taj.action = TAJ_MODE_SET_CHALLENGE; sound_play(SOUND_WHOOSH4, NULL); taj->animFrameF = 0.0f; } else { - obj->properties.npc.action = TAJ_MODE_DIALOGUE; + obj->properties.taj.action = TAJ_MODE_DIALOGUE; set_menu_id_if_option_equal(0x62, 2); } } @@ -2872,18 +2849,17 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { } if (taj->animFrameF == 0) { spawnSmoke = TRUE; - if (obj->properties.npc.action == TAJ_MODE_END_DIALOGUE_CHALLENGE) { - obj_taj_create_balloon( - obj->segment.object.segmentID, obj->segment.trans.x_position - (racer->ox1 * 50.0f), - obj->segment.trans.y_position, obj->segment.trans.z_position - (racer->oz1 * 50.0f)); + if (obj->properties.taj.action == TAJ_MODE_END_DIALOGUE_CHALLENGE) { + obj_taj_create_balloon(obj->segmentID, obj->trans.x_position - (racer->ox1 * 50.0f), + obj->trans.y_position, obj->trans.z_position - (racer->oz1 * 50.0f)); } - obj->properties.npc.action = TAJ_MODE_TELEPORT_AWAY_BEGIN; + obj->properties.taj.action = TAJ_MODE_TELEPORT_AWAY_BEGIN; sound_play(SOUND_WHOOSH4, NULL); racer->vehicleSound = racer_sound_init(racer->characterId, racer->vehicleID); } break; case TAJ_MODE_TELEPORT_TO_PLAYER_BEGIN: - obj->segment.object.animationID = 3; + obj->animationID = 3; taj->nodeCurrent = 0xFF; taj->forwardVel = 0.0f; taj->animFrameF += updateRateF * 2.0; @@ -2895,36 +2871,36 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (taj->animFrameF < 20.0f) { var_a2 = 0; } - if (obj->segment.object.opacity > var_a2) { - obj->segment.object.opacity -= var_a2; + if (obj->opacity > var_a2) { + obj->opacity -= var_a2; } else { sound_play(SOUND_WHOOSH4, NULL); spawnSmoke = TRUE; - obj->segment.object.opacity = 0; - obj->properties.npc.action = TAJ_MODE_TELEPORT_TO_PLAYER_END; - obj->segment.trans.x_position = racerObj->segment.trans.x_position - (racer->ox1 * 150.0f); - obj->segment.trans.z_position = racerObj->segment.trans.z_position - (racer->oz1 * 150.0f); - 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); - obj->segment.trans.rotation.y_rotation = racerObj->segment.trans.rotation.y_rotation + 0x8000; + obj->opacity = 0; + obj->properties.taj.action = TAJ_MODE_TELEPORT_TO_PLAYER_END; + obj->trans.x_position = racerObj->trans.x_position - (racer->ox1 * 150.0f); + obj->trans.z_position = racerObj->trans.z_position - (racer->oz1 * 150.0f); + obj->segmentID = get_level_segment_index_from_position(obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position); + obj->trans.rotation.y_rotation = racerObj->trans.rotation.y_rotation + 0x8000; } break; case TAJ_MODE_TELEPORT_TO_PLAYER_END: - obj->segment.object.animationID = 3; + obj->animationID = 3; taj->animFrameF -= updateRateF * 2.0; if (taj->animFrameF < 0.0f) { taj->animFrameF = 0.0f; } var_a2 = updateRate * 4; - if (obj->segment.object.opacity < (255 - var_a2)) { - obj->segment.object.opacity += var_a2; + if (obj->opacity < (255 - var_a2)) { + obj->opacity += var_a2; } else { - obj->segment.object.opacity = 255; - obj->properties.npc.action = TAJ_MODE_APPROACH_PLAYER; + obj->opacity = 255; + obj->properties.taj.action = TAJ_MODE_APPROACH_PLAYER; } break; case TAJ_MODE_SET_CHALLENGE: - obj->segment.object.animationID = 3; + obj->animationID = 3; taj->nodeCurrent = 0xFF; taj->forwardVel = 0.0f; taj->animFrameF += updateRateF * 2.0; @@ -2935,8 +2911,8 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (taj->animFrameF < 20.0f) { var_a2 = 0; } - if (obj->segment.object.opacity > var_a2) { - obj->segment.object.opacity -= var_a2; + if (obj->opacity > var_a2) { + obj->opacity -= var_a2; } else { racer->vehicleSound = racer_sound_init(racer->characterId, racer->vehicleID); slowly_change_fog(PLAYER_ONE, taj->fogR, taj->fogG, taj->fogB, taj->fogNear, taj->fogFar, 180); @@ -2944,18 +2920,18 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { music_play(levelHeader->music); music_dynamic_set(levelHeader->instruments); init_racer_for_challenge(racer->vehicleID); - telepoint = find_furthest_telepoint(obj->segment.trans.x_position, obj->segment.trans.z_position); + telepoint = find_furthest_telepoint(obj->trans.x_position, obj->trans.z_position); if (telepoint != NULL) { - obj->segment.trans.x_position = telepoint->segment.trans.x_position; - obj->segment.trans.z_position = telepoint->segment.trans.z_position; - obj->segment.object.segmentID = telepoint->segment.object.segmentID; - obj->segment.trans.rotation.y_rotation = racerObj->segment.trans.rotation.y_rotation + 0x8000; + obj->trans.x_position = telepoint->trans.x_position; + obj->trans.z_position = telepoint->trans.z_position; + obj->segmentID = telepoint->segmentID; + obj->trans.rotation.y_rotation = racerObj->trans.rotation.y_rotation + 0x8000; } - obj->properties.npc.action = TAJ_MODE_RACE; + obj->properties.taj.action = TAJ_MODE_RACE; } break; case TAJ_MODE_TELEPORT_AWAY_BEGIN: - obj->segment.object.animationID = 3; + obj->animationID = 3; taj->nodeCurrent = 0xFF; taj->forwardVel = 0.0f; taj->animFrameF += updateRateF * 2.0; @@ -2966,46 +2942,46 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (taj->animFrameF < 20.0f) { var_a2 = 0; } - if (obj->segment.object.opacity > var_a2) { - obj->segment.object.opacity -= var_a2; + if (obj->opacity > var_a2) { + obj->opacity -= var_a2; } else { - obj->segment.object.opacity = 0; - obj->properties.npc.action = TAJ_MODE_TELEPORT_AWAY_END; - telepoint = find_furthest_telepoint(obj->segment.trans.x_position, obj->segment.trans.z_position); + obj->opacity = 0; + obj->properties.taj.action = TAJ_MODE_TELEPORT_AWAY_END; + telepoint = find_furthest_telepoint(obj->trans.x_position, obj->trans.z_position); if (telepoint != NULL) { - obj->segment.trans.x_position = telepoint->segment.trans.x_position; - obj->segment.trans.z_position = telepoint->segment.trans.z_position; - obj->segment.object.segmentID = telepoint->segment.object.segmentID; - obj->segment.trans.rotation.y_rotation = racerObj->segment.trans.rotation.y_rotation + 0x8000; + obj->trans.x_position = telepoint->trans.x_position; + obj->trans.z_position = telepoint->trans.z_position; + obj->segmentID = telepoint->segmentID; + obj->trans.rotation.y_rotation = racerObj->trans.rotation.y_rotation + 0x8000; } } break; case TAJ_MODE_TELEPORT_AWAY_END: - obj->segment.object.animationID = 3; + obj->animationID = 3; taj->animFrameF -= updateRateF * 2.0; if (taj->animFrameF < 0.0f) { taj->animFrameF = 0.0f; } var_a2 = updateRate * 4; - if (obj->segment.object.opacity < (255 - var_a2)) { - obj->segment.object.opacity += var_a2; + if (obj->opacity < (255 - var_a2)) { + obj->opacity += var_a2; } else { - obj->segment.object.opacity = 255; - obj->properties.npc.action = TAJ_MODE_ROAM; + obj->opacity = 255; + obj->properties.taj.action = TAJ_MODE_ROAM; } break; case TAJ_MODE_RACE: obj->interactObj->flags = INTERACT_FLAGS_NONE; - obj->segment.object.animationID = 6; - obj->segment.object.opacity = 255; + obj->animationID = 6; + obj->opacity = 255; taj->animFrameF += updateRateF * 1.0; break; default: - obj->segment.object.animationID = 0; + obj->animationID = 0; taj->forwardVel = 0.0f; if (taj->nodeCurrent == NODE_NONE) { - taj->nodeCurrent = ainode_find_nearest(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, FALSE); + taj->nodeCurrent = + ainode_find_nearest(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, FALSE); if (taj->nodeCurrent != NODE_NONE) { taj->nodeBack2 = ainode_find_next(taj->nodeCurrent, -1, 0); taj->nodeForward1 = ainode_find_next(taj->nodeBack2, taj->nodeCurrent, 0); @@ -3025,32 +3001,32 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (taj->unk1C < 120) { taj->animFrameF += func_8001C6C4(taj, obj, updateRateF, 1.0f, 0); } else { - var_a2 = taj->unk1E - (obj->segment.trans.rotation.y_rotation & 0xFFFF); + var_a2 = taj->unk1E - (obj->trans.rotation.y_rotation & 0xFFFF); if (var_a2 > 0x8000) { var_a2 -= 0xFFFF; } if (var_a2 < -0x8000) { var_a2 += 0xFFFF; } - obj->segment.trans.rotation.y_rotation += ((var_a2 * updateRate) >> 4); - xPosDiff = sins_f(obj->segment.trans.rotation.y_rotation + 0x8000); - zPosDiff = coss_f(obj->segment.trans.rotation.y_rotation + 0x8000); + obj->trans.rotation.y_rotation += ((var_a2 * updateRate) >> 4); + xPosDiff = sins_f(obj->trans.rotation.y_rotation + 0x8000); + zPosDiff = coss_f(obj->trans.rotation.y_rotation + 0x8000); move_object(obj, (updateRateF2 * xPosDiff) * 1.1, 0.0f, (updateRateF2 * zPosDiff) * 1.1); taj->animFrameF += updateRate * 2.2; } } racerObjs = get_racer_objects(&numRacers); if (racerObjs[PLAYER_ONE] != NULL) { - xPosDiff = racerObjs[PLAYER_ONE]->segment.trans.x_position - obj->segment.trans.x_position; - distance = racerObjs[PLAYER_ONE]->segment.trans.y_position - obj->segment.trans.y_position; - zPosDiff = racerObjs[PLAYER_ONE]->segment.trans.z_position - obj->segment.trans.z_position; + xPosDiff = racerObjs[PLAYER_ONE]->trans.x_position - obj->trans.x_position; + distance = racerObjs[PLAYER_ONE]->trans.y_position - obj->trans.y_position; + zPosDiff = racerObjs[PLAYER_ONE]->trans.z_position - obj->trans.z_position; var_f2 = sqrtf((xPosDiff * xPosDiff) + (distance * distance) + (zPosDiff * zPosDiff)); if (var_f2 < 1000.0f) { var_f2 = 1000.0f - var_f2; sp3C = (127.0f * var_f2) / 1000.0f; temp_v0_22 = cam_get_cameras(); - xPosDiff = obj->segment.trans.x_position - temp_v0_22->trans.x_position; - zPosDiff = obj->segment.trans.z_position - temp_v0_22->trans.z_position; + xPosDiff = obj->trans.x_position - temp_v0_22->trans.x_position; + zPosDiff = obj->trans.z_position - temp_v0_22->trans.z_position; arctan = audspat_calculate_spatial_pan(xPosDiff, zPosDiff, temp_v0_22->trans.rotation.y_rotation); temp = arctan; music_channel_fade_set(10, sp3C); @@ -3117,29 +3093,28 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { taj->unk28 = music_channel_get_mask() & 0xBFFF; break; } - obj->segment.trans.y_position = tempPosY; - var_a2 = func_8002B0F4(obj->segment.object.segmentID, obj->segment.trans.x_position, obj->segment.trans.z_position, - &water); + obj->trans.y_position = tempPosY; + var_a2 = func_8002B0F4(obj->segmentID, obj->trans.x_position, obj->trans.z_position, &water); if (var_a2 != 0) { var_a2--; while (var_a2 >= 0) { if ((water[var_a2]->type != WATER_CALM) && (water[var_a2]->type != WATER_WAVY) && (water[var_a2]->rot.y > 0.0)) { - obj->segment.trans.y_position = water[var_a2]->waveHeight; + obj->trans.y_position = water[var_a2]->waveHeight; } var_a2--; } } - obj->segment.trans.rotation.x_rotation = 0; - obj->segment.trans.rotation.z_rotation = 0; - if (obj->properties.npc.action != TAJ_MODE_ROAM) { - gNPCPosY = obj->segment.trans.y_position; + obj->trans.rotation.x_rotation = 0; + obj->trans.rotation.z_rotation = 0; + if (obj->properties.taj.action != TAJ_MODE_ROAM) { + gNPCPosY = obj->trans.y_position; } if (spawnSmoke) { - obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, + obj_spawn_effect(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, ASSET_OBJECT_ID_WARDENSMOKE, SOUND_NONE, 1.0f, 0); } - obj->segment.animFrame = taj->animFrameF * 1.0; + obj->animFrame = taj->animFrameF * 1.0; func_80061C0C(obj); obj_spawn_particle(obj, updateRate); } @@ -3179,8 +3154,8 @@ void obj_init_checkpoint(Object *obj, LevelObjectEntry_Checkpoint *entry, UNUSED scale = 5.0f; } scale /= 64; - obj->segment.trans.scale = scale; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + obj->trans.scale = scale; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); path_enable(); } @@ -3202,15 +3177,14 @@ void obj_init_modechange(Object *obj, LevelObjectEntry_ModeChange *entry) { if (radius < 5) { radius = 5; } - obj64 = &obj->unk64->trigger; + obj64 = obj->trigger; radius /= 128; - obj->segment.trans.scale = radius; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); - obj64->directionX = sins_f(obj->segment.trans.rotation.y_rotation); + obj->trans.scale = radius; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + obj64->directionX = sins_f(obj->trans.rotation.y_rotation); obj64->directionY = 0.0f; - obj64->directionZ = coss_f(obj->segment.trans.rotation.y_rotation); - obj64->rotationDiff = - -((obj64->directionX * obj->segment.trans.x_position) + (obj64->directionZ * obj->segment.trans.z_position)); + obj64->directionZ = coss_f(obj->trans.rotation.y_rotation); + obj64->rotationDiff = -((obj64->directionX * obj->trans.x_position) + (obj64->directionZ * obj->trans.z_position)); obj64->radius = entry->radius; obj64->vehicleID = entry->vehicleID; obj->interactObj->flags = INTERACT_FLAGS_TANGIBLE; @@ -3237,21 +3211,21 @@ void obj_loop_modechange(Object *obj, UNUSED s32 updateRate) { f32 radiusF; f32 dist; - trigger = &obj->unk64->trigger; + trigger = obj->trigger; if (obj->interactObj->distance < trigger->radius) { radiusF = trigger->radius; racerObjects = get_racer_objects(&numRacers); for (i = 0; i < numRacers; i++) { racerObj = racerObjects[i]; - racer = &racerObj->unk64->racer; + racer = racerObj->racer; if (racer->vehicleID != trigger->vehicleID) { - diffX = racerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = racerObj->trans.x_position - obj->trans.x_position; + diffY = racerObj->trans.y_position - obj->trans.y_position; + diffZ = racerObj->trans.z_position - obj->trans.z_position; dist = sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)); if (dist < radiusF) { - dist = ((trigger->directionX * racerObj->segment.trans.x_position) + - (trigger->directionZ * racerObj->segment.trans.z_position) + trigger->rotationDiff); + dist = ((trigger->directionX * racerObj->trans.x_position) + + (trigger->directionZ * racerObj->trans.z_position) + trigger->rotationDiff); if (dist < 0.0f) { racer->trickType = 0; if (trigger->vehicleID == VEHICLE_CAR) { @@ -3263,9 +3237,8 @@ void obj_loop_modechange(Object *obj, UNUSED s32 updateRate) { if (racer->raceFinished == FALSE) { rumble_set(racer->playerIndex, RUMBLE_TYPE_8); } - node = ainode_find_nearest(racerObj->segment.trans.x_position, - racerObj->segment.trans.y_position, - racerObj->segment.trans.z_position, FALSE); + node = ainode_find_nearest(racerObj->trans.x_position, racerObj->trans.y_position, + racerObj->trans.z_position, FALSE); if (node != NODE_NONE) { racer->nodeCurrent = ainode_get(node); } else { @@ -3274,7 +3247,7 @@ void obj_loop_modechange(Object *obj, UNUSED s32 updateRate) { racer->challengeMarker = NULL; racer->unk19A = 0; } - racer->unk198 = obj->segment.trans.rotation.y_rotation; + racer->unk198 = obj->trans.rotation.y_rotation; } } } @@ -3289,15 +3262,14 @@ void obj_init_bonus(Object *obj, LevelObjectEntry_Bonus *entry) { if (radius < 5) { radius = 5; } - bonus = &obj->unk64->trigger; + bonus = obj->trigger; radius /= 128; - obj->segment.trans.scale = radius; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); - bonus->directionX = sins_f(obj->segment.trans.rotation.y_rotation); + obj->trans.scale = radius; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + bonus->directionX = sins_f(obj->trans.rotation.y_rotation); bonus->directionY = 0.0f; - bonus->directionZ = coss_f(obj->segment.trans.rotation.y_rotation); - bonus->rotationDiff = - -((bonus->directionX * obj->segment.trans.x_position) + (bonus->directionZ * obj->segment.trans.z_position)); + bonus->directionZ = coss_f(obj->trans.rotation.y_rotation); + bonus->rotationDiff = -((bonus->directionX * obj->trans.x_position) + (bonus->directionZ * obj->trans.z_position)); bonus->radius = entry->radius; bonus->unk14 = entry->unkA; // Unused? obj->interactObj->flags = INTERACT_FLAGS_TANGIBLE; @@ -3319,30 +3291,29 @@ void obj_loop_bonus(Object *obj, UNUSED s32 updateRate) { Object **racerObjects; s32 i; - obj64 = &obj->unk64->trigger; + obj64 = obj->trigger; if (obj->interactObj->distance < obj64->radius) { dist = obj64->radius; halfDist = dist * 0.5; racerObjects = get_racer_objects(&numberOfRacers); for (i = 0; i < numberOfRacers; i++) { racerObj = racerObjects[i]; - racer = &racerObj->unk64->racer; - diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; + racer = racerObj->racer; + diffY = racerObj->trans.y_position - obj->trans.y_position; if (diffY < halfDist && -halfDist < diffY) { - diffX = racerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = racerObj->trans.x_position - obj->trans.x_position; + diffZ = racerObj->trans.z_position - obj->trans.z_position; if (sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < dist) { - f32 temp = (obj64->directionX * racerObj->segment.trans.x_position) + - (obj64->directionZ * racerObj->segment.trans.z_position) + obj64->rotationDiff; + f32 temp = (obj64->directionX * racerObj->trans.x_position) + + (obj64->directionZ * racerObj->trans.z_position) + obj64->rotationDiff; if (temp < 0.0f) { if (racer->bananas < 10) { racer->bananas = 10; - audspat_play_sound_at_position( - SOUND_SELECT, racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, - racerObj->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); - sound_play_spatial(racer->characterId + SOUND_UNK_7B, racerObj->segment.trans.x_position, - racerObj->segment.trans.y_position, racerObj->segment.trans.z_position, - NULL); + audspat_play_sound_at_position(SOUND_SELECT, racerObj->trans.x_position, + racerObj->trans.y_position, racerObj->trans.z_position, + AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + sound_play_spatial(racer->characterId + SOUND_UNK_7B, racerObj->trans.x_position, + racerObj->trans.y_position, racerObj->trans.z_position, NULL); } } } @@ -3376,16 +3347,16 @@ void obj_init_goldenballoon(Object *obj, LevelObjectEntry_GoldenBalloon *entry) scalef = 10.0f; } scalef /= 64; - obj->segment.trans.scale = obj->segment.header->scale * scalef; - obj64 = &obj->unk64->npc; + obj->trans.scale = obj->header->scale * scalef; + obj64 = obj->npc; obj64->nodeCurrent = 255; obj64->unk0 = 0.0f; - obj->properties.npc.action = 0; + obj->properties.goldenBalloon.action = 0; if (entry->challengeID) { if (get_settings()->tajFlags & (1 << (entry->challengeID + 2))) { - obj->properties.npc.action = 0; + obj->properties.goldenBalloon.action = 0; } else { - obj->properties.npc.action = 1; + obj->properties.goldenBalloon.action = 1; } } } @@ -3422,31 +3393,31 @@ void obj_loop_goldenballoon(Object *obj, s32 updateRate) { #endif speedf = updateRateF; settings = get_settings(); - levelEntry = obj->segment.level_entry; + levelEntry = obj->level_entry; flag = 0x10000 << levelEntry->goldenBalloon.balloonID; if (settings->courseFlagsPtr[settings->courseId] & flag) { - if (obj->properties.npc.timer > 0) { + if (obj->properties.goldenBalloon.timer > 0) { obj->particleEmittersEnabled = OBJ_EMIT_2; obj_spawn_particle(obj, updateRate); - obj->properties.npc.timer -= updateRate; + obj->properties.goldenBalloon.timer -= updateRate; } else { free_object(obj); } } else { - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; - if (obj->properties.npc.action == 0) { - obj->segment.trans.flags &= (0xFFFF - OBJ_FLAGS_INVISIBLE); + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; + if (obj->properties.goldenBalloon.action == 0) { + obj->trans.flags &= ~OBJ_FLAGS_INVISIBLE; doubleSpeed = updateRate * 2; - if (obj->segment.object.opacity < 255 - doubleSpeed) { - obj->segment.object.opacity += doubleSpeed; + if (obj->opacity < 255 - doubleSpeed) { + obj->opacity += doubleSpeed; } else { - obj->segment.object.opacity = 255; + obj->opacity = 255; } interactObj = obj->interactObj; if (interactObj->distance < 45 && isPirated == FALSE) { racerObj = interactObj->obj; - if ((racerObj && (racerObj->segment.header->behaviorId == 1))) { - racer = &racerObj->unk64->racer; + if ((racerObj && (racerObj->header->behaviorId == 1))) { + racer = racerObj->racer; if (racer->playerIndex == PLAYER_ONE) { settings->balloonsPtr[settings->worldId]++; if (isPirated == 1) {} // Fakematch @@ -3455,22 +3426,22 @@ void obj_loop_goldenballoon(Object *obj, s32 updateRate) { } settings->courseFlagsPtr[settings->courseId] |= flag; if (1) {} // Fakematch - 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; + sound_play_spatial(SOUND_COLLECT_BALLOON, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, NULL); + obj->properties.goldenBalloon.timer = 16; obj->particleEmittersEnabled = OBJ_EMIT_2; - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; obj_spawn_particle(obj, updateRate); } } } - npc = &obj->unk64->npc; - obj->segment.object.animationID = 0; + npc = obj->npc; + obj->animationID = 0; npc->forwardVel = 0.0f; - speedf = (obj->segment.object.opacity < 255) ? 0 : 1; + speedf = (obj->opacity < 255) ? 0 : 1; if (npc->nodeCurrent == 255) { - npc->nodeCurrent = ainode_find_nearest(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, FALSE); + npc->nodeCurrent = + ainode_find_nearest(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, FALSE); if (npc->nodeCurrent != 255) { npc->nodeBack2 = ainode_find_next(npc->nodeCurrent, -1, 0); npc->nodeForward1 = ainode_find_next(npc->nodeBack2, npc->nodeCurrent, 0); @@ -3492,7 +3463,7 @@ void obj_init_door(Object *obj, LevelObjectEntry_Door *entry) { Object_Door *door; f32 radius; - door = &obj->unk64->door; + door = obj->door; if (entry->doorID == -1) { entry->doorID = func_8000CC20(obj); } else { @@ -3506,26 +3477,26 @@ void obj_init_door(Object *obj, LevelObjectEntry_Door *entry) { if (door->doorID == -1) { rmonPrintf("Illegal door no!!!\n"); } - obj->segment.object.modelIndex = entry->modelIndex; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->closedRotation); - door->homeY = obj->segment.trans.y_position; + obj->modelIndex = entry->modelIndex; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->closedRotation); + door->homeY = obj->trans.y_position; door->jingleTimer = 0; - obj->properties.door.closeAngle = obj->segment.trans.rotation.y_rotation; + obj->properties.door.closeAngle = obj->trans.rotation.y_rotation; obj->properties.door.openAngle = (entry->openRotation & 0x3F) << 10; radius = entry->scale & 0xFF; if (radius < 10.0f) { radius = 10.0f; } radius /= 64; - obj->segment.trans.scale = obj->segment.header->scale * radius; + obj->trans.scale = obj->header->scale * radius; door->textID = entry->textID; door->keyID = entry->keyID; obj->interactObj->flags = INTERACT_FLAGS_SOLID | INTERACT_FLAGS_UNK_0020; obj->interactObj->unk11 = 2; obj->interactObj->hitboxRadius = 20; obj->interactObj->pushForce = 0; - if (obj->segment.object.modelIndex >= obj->segment.header->numberOfModelIds) { - obj->segment.object.modelIndex = 0; + if (obj->modelIndex >= obj->header->numberOfModelIds) { + obj->modelIndex = 0; } } @@ -3550,14 +3521,14 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { s32 model; s32 sp28; - doorEntry = &doorObj->segment.level_entry->door; + doorEntry = &doorObj->level_entry->door; updateRateF = updateRate; if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } settings = get_settings(); playSound = settings->courseFlagsPtr[settings->courseId]; - door = &doorObj->unk64->door; + door = doorObj->door; if (door->doorID >= 0) { doorIDFlag = 0x10000 << door->doorID; racerObjInter = doorObj->interactObj; @@ -3568,8 +3539,8 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { sp28 = playSound & doorIDFlag; if (sp28 == 0 && racerObjInter->distance < door->radius) { racerObj = racerObjInter->obj; - if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { - racer = &racerObj->unk64->racer; + if (racerObj != NULL && racerObj->header->behaviorId == BHV_RACER) { + racer = racerObj->racer; if (racer->playerIndex != PLAYER_COMPUTER && racerObj == doorObj->unk5C->unk100) { if (door->textID != -1 && textbox_visible() == FALSE && door->jingleCooldown == 0) { music_fade(-8); @@ -3606,8 +3577,8 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { keyBits = 0; if (racerObjInter->distance < door->radius) { racerObj = racerObjInter->obj; - if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { - racer = &racerObj->unk64->racer; + if (racerObj != NULL && racerObj->header->behaviorId == BHV_RACER) { + racer = racerObj->racer; switch (racer->vehicleID) { case VEHICLE_HOVERCRAFT: keyBits = 2; @@ -3642,52 +3613,52 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { if (settings->worldId == WORLD_FUTURE_FUN_LAND || settings->bosses & (1 << settings->worldId)) { door->balloonCount = doorEntry->balloonCountOverride; if (door->balloonCount >= 10) { - doorObj->segment.object.modelIndex = 3; + doorObj->modelIndex = 3; } else { - doorObj->segment.object.modelIndex = 2; + doorObj->modelIndex = 2; } } else { - doorObj->segment.object.modelIndex = 0; + doorObj->modelIndex = 0; } } if (settings->courseFlagsPtr[doorEntry->levelID] & RACE_CLEARED_SILVER_COINS) { - doorObj->segment.object.modelIndex = 1; + doorObj->modelIndex = 1; } } if (door->openDir == DOOR_OPENING) { - if (doorObj->segment.trans.y_position < door->homeY + 130.0) { + if (doorObj->trans.y_position < door->homeY + 130.0) { playSound = TRUE; - doorObj->segment.trans.y_position += 2.0 * updateRateF; + doorObj->trans.y_position += 2.0 * updateRateF; } } else if (door->openDir == DOOR_CLOSING) { - if (door->homeY < doorObj->segment.trans.y_position) { + if (door->homeY < doorObj->trans.y_position) { playSound = TRUE; - doorObj->segment.trans.y_position -= 2.0 * updateRateF; + doorObj->trans.y_position -= 2.0 * updateRateF; } } } else { if (doorEntry->common.objectID == ASSET_OBJECT_ID_BOSSDOOR) { - doorObj->segment.object.modelIndex = 0; + doorObj->modelIndex = 0; if (settings->bosses & (1 << settings->worldId)) { if (settings->balloonsPtr[settings->worldId] == 8) { - doorObj->segment.object.modelIndex = 1; + doorObj->modelIndex = 1; } } if (settings->bosses & (1 << (settings->worldId + 6))) { - doorObj->segment.object.modelIndex = 2; + doorObj->modelIndex = 2; } if (settings->worldId == WORLD_FUTURE_FUN_LAND) { - model = doorObj->segment.object.modelIndex; + model = doorObj->modelIndex; if (model < 2) { - doorObj->segment.object.modelIndex = model + 1; + doorObj->modelIndex = model + 1; } } } angleVel = 0; if (door->openDir == DOOR_OPENING) { - angleVel = doorObj->segment.trans.rotation.y_rotation - doorObj->properties.common.unk4; + angleVel = doorObj->trans.rotation.y_rotation - doorObj->properties.common.unk4; } else if (door->openDir == DOOR_CLOSING) { - angleVel = doorObj->segment.trans.rotation.y_rotation - doorObj->properties.common.unk0; + angleVel = doorObj->trans.rotation.y_rotation - doorObj->properties.common.unk0; } angleVel >>= 3; if (angleVel > 0x200) { @@ -3696,16 +3667,15 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { if (angleVel < -0x200) { angleVel = -0x200; } - doorObj->segment.trans.rotation.y_rotation -= angleVel; //@!Delta + doorObj->trans.rotation.y_rotation -= angleVel; //@!Delta if (angleVel != 0) { playSound = TRUE; } } if (playSound) { if (door->soundMask == NULL) { - audspat_play_sound_at_position(SOUND_DOOR_OPEN, doorObj->segment.trans.x_position, - doorObj->segment.trans.y_position, doorObj->segment.trans.z_position, - AUDIO_POINT_FLAG_1, &door->soundMask); + audspat_play_sound_at_position(SOUND_DOOR_OPEN, doorObj->trans.x_position, doorObj->trans.y_position, + doorObj->trans.z_position, AUDIO_POINT_FLAG_1, &door->soundMask); } } else { door->openDir = DOOR_CLOSED; @@ -3745,31 +3715,31 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { * A much simpler version of the regular door, but has many of the same attributes. */ void obj_init_ttdoor(Object *obj, LevelObjectEntry_TTDoor *entry) { - Object_Door *obj64; + Object_Door *ttDoor; f32 radius; - obj->segment.object.modelIndex = 0; - obj64 = &obj->unk64->door; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); - obj64->doorType = entry->doorType; - obj64->textID = entry->textID; - obj64->homeY = obj->segment.trans.y_position; - obj64->jingleTimer = 0; - obj64->radius = entry->radius; - obj->properties.door.closeAngle = obj->segment.trans.rotation.y_rotation; + obj->modelIndex = 0; + ttDoor = obj->door; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + ttDoor->doorType = entry->doorType; + ttDoor->textID = entry->textID; + ttDoor->homeY = obj->trans.y_position; + ttDoor->jingleTimer = 0; + ttDoor->radius = entry->radius; + obj->properties.door.closeAngle = obj->trans.rotation.y_rotation; obj->properties.door.openAngle = (entry->unk9 & 0x3F) << 0xA; radius = entry->scale & 0xFF; if (radius < 10) { radius = 10; } radius /= 64; - obj->segment.trans.scale = obj->segment.header->scale * radius; + obj->trans.scale = obj->header->scale * radius; obj->interactObj->flags = INTERACT_FLAGS_SOLID | INTERACT_FLAGS_UNK_0020; obj->interactObj->unk11 = 2; obj->interactObj->hitboxRadius = 20; obj->interactObj->pushForce = 0; - if (obj->segment.object.modelIndex >= obj->segment.header->numberOfModelIds) { - obj->segment.object.modelIndex = 0; + if (obj->modelIndex >= obj->header->numberOfModelIds) { + obj->modelIndex = 0; } } @@ -3786,17 +3756,17 @@ void obj_loop_ttdoor(Object *obj, s32 updateRate) { s16 angle; s32 openDoor; - ttDoor = &obj->unk64->door; + ttDoor = obj->door; settings = get_settings(); if (ttDoor->doorType == 0) { - obj->segment.object.modelIndex = D_800DCA94[settings->ttAmulet]; + obj->modelIndex = D_800DCA94[settings->ttAmulet]; } else { - obj->segment.object.modelIndex = D_800DCA9C[settings->ttAmulet]; + obj->modelIndex = D_800DCA9C[settings->ttAmulet]; } if (obj->interactObj->distance < ttDoor->radius && (settings->ttAmulet < 4 || *settings->balloonsPtr < 47)) { racerObj = obj->interactObj->obj; - if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { - racer = &racerObj->unk64->racer; + if (racerObj != NULL && racerObj->header->behaviorId == BHV_RACER) { + racer = racerObj->racer; if (racer->playerIndex != PLAYER_COMPUTER && racerObj == obj->unk5C->unk100) { if (ttDoor->textID != -1 && textbox_visible() == 0 && ttDoor->jingleCooldown == 0) { music_fade(-8); @@ -3828,9 +3798,9 @@ void obj_loop_ttdoor(Object *obj, s32 updateRate) { } openDoor = TRUE; if (settings->ttAmulet >= 4 && obj->interactObj->distance < ttDoor->radius && *settings->balloonsPtr >= 47) { - angle = obj->segment.trans.rotation.y_rotation - obj->properties.door.openAngle; + angle = obj->trans.rotation.y_rotation - obj->properties.door.openAngle; } else { - angle = obj->segment.trans.rotation.y_rotation - obj->properties.door.closeAngle; + angle = obj->trans.rotation.y_rotation - obj->properties.door.closeAngle; } angle >>= 3; if (angle > 0x200) { @@ -3839,15 +3809,14 @@ void obj_loop_ttdoor(Object *obj, s32 updateRate) { if (angle < -0x200) { angle = -0x200; } - obj->segment.trans.rotation.y_rotation -= angle; + obj->trans.rotation.y_rotation -= angle; if (angle == 0) { openDoor = FALSE; } if (openDoor) { if (ttDoor->soundMask == NULL) { - audspat_play_sound_at_position(SOUND_DOOR_OPEN, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_1, &ttDoor->soundMask); + audspat_play_sound_at_position(SOUND_DOOR_OPEN, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_1, &ttDoor->soundMask); } } else if (ttDoor->soundMask != NULL) { audspat_point_stop((AudioPoint *) ((s32) ttDoor->soundMask)); @@ -3861,7 +3830,7 @@ void obj_loop_ttdoor(Object *obj, s32 updateRate) { void obj_init_trigger(Object *obj, LevelObjectEntry_Trigger *entry) { f32 radius; - Object_Trigger *obj64; + Object_Trigger *trigger; if (entry->index == -1) { entry->index = func_8000CC20(obj); @@ -3875,17 +3844,17 @@ void obj_init_trigger(Object *obj, LevelObjectEntry_Trigger *entry) { if (radius < 5.0f) { radius = 5.0f; } - obj64 = &obj->unk64->trigger; + trigger = obj->trigger; radius /= 128; - obj->segment.trans.scale = radius; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); - obj64->directionX = sins_f(obj->segment.trans.rotation.y_rotation); - obj64->directionY = 0.0f; - obj64->directionZ = coss_f(obj->segment.trans.rotation.y_rotation); - obj64->rotationDiff = - -((obj64->directionX * obj->segment.trans.x_position) + (obj64->directionZ * obj->segment.trans.z_position)); - obj64->radius = entry->scale; - obj64->unk14 = entry->unkD; + obj->trans.scale = radius; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + trigger->directionX = sins_f(obj->trans.rotation.y_rotation); + trigger->directionY = 0.0f; + trigger->directionZ = coss_f(obj->trans.rotation.y_rotation); + trigger->rotationDiff = + -((trigger->directionX * obj->trans.x_position) + (trigger->directionZ * obj->trans.z_position)); + trigger->radius = entry->scale; + trigger->unk14 = entry->unkD; obj->interactObj->flags = INTERACT_FLAGS_TANGIBLE; obj->interactObj->unk11 = 0; obj->interactObj->hitboxRadius = entry->scale; @@ -3910,8 +3879,8 @@ void obj_loop_trigger(Object *obj, UNUSED s32 updateRate) { f32 distance; s32 courseFlags; - triggerEntry = &obj->segment.level_entry->trigger; - trigger = &obj->unk64->trigger; + triggerEntry = &obj->level_entry->trigger; + trigger = obj->trigger; settings = get_settings(); courseFlags = settings->courseFlagsPtr[settings->courseId]; curRaceType = get_current_level_race_type(); @@ -3923,17 +3892,16 @@ void obj_loop_trigger(Object *obj, UNUSED s32 updateRate) { racers = get_racer_objects(&numRacers); for (i = 0; i < numRacers; i++) { racerObj = racers[i]; - racer = &racerObj->unk64->racer; + racer = racerObj->racer; if ((!(trigger->unk14 & 1) && racer->playerIndex == PLAYER_COMPUTER) || (!(trigger->unk14 & 2) && racer->playerIndex != PLAYER_COMPUTER)) { - diffX = racerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = racerObj->trans.x_position - obj->trans.x_position; + diffY = racerObj->trans.y_position - obj->trans.y_position; + diffZ = racerObj->trans.z_position - obj->trans.z_position; distance = sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)); if (distance < radiusF) { - distance = (trigger->directionX * racerObj->segment.trans.x_position) + - (trigger->directionZ * racerObj->segment.trans.z_position) + - trigger->rotationDiff; + distance = (trigger->directionX * racerObj->trans.x_position) + + (trigger->directionZ * racerObj->trans.z_position) + trigger->rotationDiff; if (distance < 0.0f) { settings->courseFlagsPtr[settings->courseId] |= flags; if (triggerEntry->unkB != 0xFF) { @@ -3956,17 +3924,17 @@ void obj_loop_trigger(Object *obj, UNUSED s32 updateRate) { * Sets hitbox info and the model from spawn info. */ void obj_init_bridge_whaleramp(Object *obj, LevelObjectEntry_Bridge_WhaleRamp *entry) { - Object_Bridge_WhaleRamp *bridge = &obj->unk64->bridge_whale_ramp; - obj->segment.object.modelIndex = entry->modelIndex; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); - bridge->homeY = obj->segment.trans.y_position; + Object_Bridge_WhaleRamp *bridge = obj->bridge_whale_ramp; + obj->modelIndex = entry->modelIndex; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + bridge->homeY = obj->trans.y_position; obj->interactObj->flags = INTERACT_FLAGS_SOLID | INTERACT_FLAGS_UNK_0020; obj->interactObj->unk11 = 2; obj->interactObj->hitboxRadius = 20; obj->interactObj->pushForce = 0; bridge->soundMask = NULL; - if (obj->segment.object.modelIndex >= obj->segment.header->numberOfModelIds) { - obj->segment.object.modelIndex = 0; + if (obj->modelIndex >= obj->header->numberOfModelIds) { + obj->modelIndex = 0; } } @@ -3992,8 +3960,8 @@ void obj_loop_bridge_whaleramp(Object *obj, s32 updateRate) { f32 bellZ2; Object_Racer *racer; - whaleRamp = &obj->unk64->bridge_whale_ramp; - entry = &obj->segment.level_entry->bridge_whaleRamp; + whaleRamp = obj->bridge_whale_ramp; + entry = &obj->level_entry->bridge_whaleRamp; updateRateF = updateRate; if (osTvType == OS_TV_TYPE_PAL) { @@ -4001,29 +3969,29 @@ void obj_loop_bridge_whaleramp(Object *obj, s32 updateRate) { } if (entry->unkB != 3) { - if (obj->properties.common.unk0 != 0) { + if (obj->properties.bridgeWhaleRamp.unk0 != 0) { bobAmount = 2.0 * (f32) entry->bobAmount; if (bobAmount > 0.0f) { - if (obj->segment.trans.y_position < whaleRamp->homeY + bobAmount) { - obj->segment.trans.y_position += updateRateF * 2; + if (obj->trans.y_position < whaleRamp->homeY + bobAmount) { + obj->trans.y_position += updateRateF * 2; } } else { - if (whaleRamp->homeY + bobAmount < obj->segment.trans.y_position) { - obj->segment.trans.y_position -= updateRateF * 2; + if (whaleRamp->homeY + bobAmount < obj->trans.y_position) { + obj->trans.y_position -= updateRateF * 2; } } } else if (entry->radius > 0) { - if (whaleRamp->homeY < obj->segment.trans.y_position) { - obj->segment.trans.y_position -= updateRateF * 2; + if (whaleRamp->homeY < obj->trans.y_position) { + obj->trans.y_position -= updateRateF * 2; } } else { - if (obj->segment.trans.y_position < whaleRamp->homeY) { - obj->segment.trans.y_position += updateRateF * 2; + if (obj->trans.y_position < whaleRamp->homeY) { + obj->trans.y_position += updateRateF * 2; } } - } else if (obj->properties.common.unk0 != 0) { - if (obj->segment.trans.rotation.x_rotation > -0x1300) { - obj->segment.trans.rotation.x_rotation -= updateRate * 45; + } else if (obj->properties.bridgeWhaleRamp.unk0 != 0) { + if (obj->trans.rotation.x_rotation > -0x1300) { + obj->trans.rotation.x_rotation -= updateRate * 45; } if (whaleRamp->soundMask == NULL) { obj_bridge_pos(entry->unkA, &bellX1, &bellY1, &bellZ1); @@ -4031,15 +3999,15 @@ void obj_loop_bridge_whaleramp(Object *obj, s32 updateRate) { &whaleRamp->soundMask); } } else { - if (obj->segment.trans.rotation.x_rotation < 0) { - obj->segment.trans.rotation.x_rotation += updateRate * 40; + if (obj->trans.rotation.x_rotation < 0) { + obj->trans.rotation.x_rotation += updateRate * 40; if (whaleRamp->soundMask == NULL) { obj_bridge_pos(entry->unkA, &bellX2, &bellY2, &bellZ2); audspat_play_sound_at_position(SOUND_DRAWBRIDGE_BELL, bellX2, bellY2, bellZ2, AUDIO_POINT_FLAG_1, &whaleRamp->soundMask); } } else { - obj->segment.trans.rotation.x_rotation = 0; + obj->trans.rotation.x_rotation = 0; if (whaleRamp->soundMask != NULL) { audspat_point_stop(whaleRamp->soundMask); } @@ -4048,16 +4016,16 @@ void obj_loop_bridge_whaleramp(Object *obj, s32 updateRate) { switch (entry->unkB) { case 0: - obj->properties.common.unk0 = 0; + obj->properties.bridgeWhaleRamp.unk0 = 0; if (obj->interactObj->distance < entry->radius) { - obj->properties.common.unk0 = 1; + obj->properties.bridgeWhaleRamp.unk0 = 1; } break; case 2: - obj->properties.common.unk0 = 1; + obj->properties.bridgeWhaleRamp.unk0 = 1; racerObj = get_racer_object(PLAYER_ONE); if (racerObj != NULL) { - racer = &racerObj->unk64->racer; + racer = racerObj->racer; switch (racer->vehicleID) { default: vehicleID = VEHICLE_HOVERCRAFT; @@ -4070,18 +4038,18 @@ void obj_loop_bridge_whaleramp(Object *obj, s32 updateRate) { break; } if (entry->allowedVehicles & vehicleID) { - obj->properties.common.unk0 = NULL; + obj->properties.bridgeWhaleRamp.unk0 = NULL; } } break; default: if (func_8001E2EC(entry->unkA) != 0) { - obj->properties.common.unk0 = (entry->unkD * 2); + obj->properties.bridgeWhaleRamp.unk0 = (entry->unkD * 2); } - if (obj->properties.common.unk0 > 0) { - obj->properties.common.unk0 -= updateRate; + if (obj->properties.bridgeWhaleRamp.unk0 > 0) { + obj->properties.bridgeWhaleRamp.unk0 -= updateRate; } else { - obj->properties.common.unk0 = 0; + obj->properties.bridgeWhaleRamp.unk0 = 0; } break; } @@ -4096,12 +4064,12 @@ void obj_init_rampswitch(Object *obj, LevelObjectEntry_RampSwitch *entry) { obj->interactObj->unk11 = 0; obj->interactObj->hitboxRadius = 20; obj->interactObj->pushForce = 0; - obj->properties.common.unk0 = entry->unk8; + obj->properties.rampSwitch.unk0 = entry->unk8; } void obj_loop_rampswitch(Object *obj, UNUSED s32 updateRate) { if (obj->interactObj->distance < 45) { - func_8001E344(obj->properties.common.unk0); + func_8001E344(obj->properties.rampSwitch.unk0); } obj->interactObj->distance = 255; } @@ -4167,7 +4135,7 @@ void obj_loop_ainode(UNUSED Object *obj, UNUSED s32 updateRate) { * Sets up player ID, making sure the value doesn't go over 4 players. */ void obj_init_treasuresucker(Object *obj, LevelObjectEntry_TreasureSucker *entry) { - obj->segment.animFrame = 120; + obj->animFrame = 120; obj->properties.treasureSucker.playerID = (entry->playerID - 1) & 3; } @@ -4188,12 +4156,12 @@ void obj_loop_treasuresucker(Object *obj, s32 updateRate) { racerObj = get_racer_object(obj->properties.treasureSucker.playerID); if (racerObj != NULL) { - racer = &racerObj->unk64->racer; + racer = racerObj->racer; doSpawnObj = FALSE; if (racer->bananas != 0 && obj->properties.treasureSucker.spawnTimer == 0) { - diffX = obj->segment.trans.x_position - racerObj->segment.trans.x_position; - diffY = obj->segment.trans.y_position - racerObj->segment.trans.y_position; - diffZ = obj->segment.trans.z_position - racerObj->segment.trans.z_position; + diffX = obj->trans.x_position - racerObj->trans.x_position; + diffY = obj->trans.y_position - racerObj->trans.y_position; + diffZ = obj->trans.z_position - racerObj->trans.z_position; diffX = (diffX * diffX) + (diffY * diffY) + (diffZ * diffZ); // Required to match. if (diffX < 225 * 225) { obj->properties.treasureSucker.spawnTimer = 8; @@ -4215,22 +4183,20 @@ void obj_loop_treasuresucker(Object *obj, s32 updateRate) { } } if (doSpawnObj) { - spawnObj.x = racerObj->segment.trans.x_position; - spawnObj.y = (s16) racerObj->segment.trans.y_position + 10; - spawnObj.z = racerObj->segment.trans.z_position; + spawnObj.x = racerObj->trans.x_position; + spawnObj.y = (s16) racerObj->trans.y_position + 10; + spawnObj.z = racerObj->trans.z_position; spawnObj.size = sizeof(LevelObjectEntryCommon); spawnObj.objectID = ASSET_OBJECT_ID_FLYCOIN; newObj = spawn_object(&spawnObj, OBJECT_SPAWN_UNK01); if (newObj != NULL) { - newObj->segment.level_entry = NULL; - newObj->segment.y_velocity = 10.0f; - scale = (newObj->segment.y_velocity * 2) / 0.5; - newObj->segment.x_velocity = - (obj->segment.trans.x_position - racerObj->segment.trans.x_position) / scale; - newObj->segment.z_velocity = - (obj->segment.trans.z_position - racerObj->segment.trans.z_position) / scale; - newObj->properties.treasureBanana.racer = racer; - newObj->properties.treasureBanana.diff = scale; + newObj->level_entry = NULL; + newObj->y_velocity = 10.0f; + scale = (newObj->y_velocity * 2) / 0.5; + newObj->x_velocity = (obj->trans.x_position - racerObj->trans.x_position) / scale; + newObj->z_velocity = (obj->trans.z_position - racerObj->trans.z_position) / scale; + newObj->properties.flyCoin.racer = racer; + newObj->properties.flyCoin.diff = scale; } } } @@ -4255,12 +4221,11 @@ void obj_loop_flycoin(Object *obj, s32 updateRate) { if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } - obj->segment.y_velocity -= 0.5 * updateRateF; - move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, - obj->segment.z_velocity * updateRateF); - obj->properties.treasureBanana.diff -= updateRate; - if (obj->properties.treasureBanana.diff <= 0) { - racerObj = obj->properties.treasureBanana.racer; + obj->y_velocity -= 0.5 * updateRateF; + move_object(obj, obj->x_velocity * updateRateF, obj->y_velocity * updateRateF, obj->z_velocity * updateRateF); + obj->properties.flyCoin.diff -= updateRate; + if (obj->properties.flyCoin.diff <= 0) { + racerObj = obj->properties.flyCoin.racer; racerObj->lap++; if (racerObj->lap >= 10) { racerObj->raceFinished = TRUE; @@ -4270,7 +4235,7 @@ void obj_loop_flycoin(Object *obj, s32 updateRate) { sound_play(SOUND_SELECT, NULL); } } - obj->segment.animFrame += updateRate * 8; + obj->animFrame += updateRate * 8; } /** @@ -4278,7 +4243,7 @@ void obj_loop_flycoin(Object *obj, s32 updateRate) { * Seemingly does nothing. */ void obj_init_bananacreator(Object *obj, UNUSED LevelObjectEntry_BananaCreator *entry) { - obj->segment.animFrame = 100; + obj->animFrame = 100; } /** @@ -4295,19 +4260,19 @@ void obj_loop_bananacreator(Object *obj, s32 updateRate) { } if (obj->properties.bananaSpawner.timer <= 0) { - newEntry.x = obj->segment.trans.x_position; - newEntry.y = (s16) obj->segment.trans.y_position - 3; - newEntry.z = obj->segment.trans.z_position; + newEntry.x = obj->trans.x_position; + newEntry.y = (s16) obj->trans.y_position - 3; + newEntry.z = obj->trans.z_position; newEntry.size = sizeof(LevelObjectEntryCommon); newEntry.objectID = ASSET_OBJECT_ID_COIN; newBananaObj = spawn_object(&newEntry, OBJECT_SPAWN_UNK01); obj->properties.bananaSpawner.spawn = TRUE; if (newBananaObj) { - newBananaObj->segment.level_entry = NULL; - newBananaObj64 = &newBananaObj->unk64->banana; + newBananaObj->level_entry = NULL; + newBananaObj64 = newBananaObj->banana; newBananaObj64->spawner = obj; - obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position - 14.0f, - obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_SELECT, 0.25f, 0); + obj_spawn_effect(obj->trans.x_position, obj->trans.y_position - 14.0f, obj->trans.z_position, + ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_SELECT, 0.25f, 0); obj->properties.bananaSpawner.spawn = FALSE; } // Set respawn timer 20 seconds. Poor PAL users aren't accounted for, and must wait 24 seconds. @@ -4355,11 +4320,11 @@ void obj_loop_banana(Object *obj, s32 updateRate) { if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } - banana = &obj->unk64->banana; - obj->segment.animFrame += updateRate * 8; + banana = obj->banana; + obj->animFrame += updateRate * 8; properties = &obj->properties.banana; if (properties->status == BANANA_COLLECTED) { - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; properties->destroyTimer -= updateRate; obj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(obj, updateRate); @@ -4374,34 +4339,34 @@ void obj_loop_banana(Object *obj, s32 updateRate) { banana->unk0 = 0; } if (properties->status == BANANA_DROPPED) { - tempPos[0] = obj->segment.trans.x_position + (obj->segment.x_velocity * updateRateF); - tempPos[1] = obj->segment.trans.y_position + (obj->segment.y_velocity * updateRateF); - tempPos[2] = obj->segment.trans.z_position + (obj->segment.z_velocity * updateRateF); + tempPos[0] = obj->trans.x_position + (obj->x_velocity * updateRateF); + tempPos[1] = obj->trans.y_position + (obj->y_velocity * updateRateF); + tempPos[2] = obj->trans.z_position + (obj->z_velocity * updateRateF); radius = 8.0f; - func_80031130(1, &obj->segment.trans.x_position, tempPos, -1); + func_80031130(1, &obj->trans.x_position, tempPos, -1); sp48 = 0; - func_80031600(&obj->segment.trans.x_position, tempPos, &radius, &sp43, TRUE, &sp48); - obj->segment.x_velocity = (tempPos[0] - obj->segment.trans.x_position) / updateRateF; - obj->segment.y_velocity = (tempPos[1] - obj->segment.trans.y_position) / updateRateF; - obj->segment.z_velocity = (tempPos[2] - obj->segment.trans.z_position) / updateRateF; - obj->segment.trans.x_position = tempPos[0]; - obj->segment.trans.y_position = tempPos[1]; - obj->segment.trans.z_position = tempPos[2]; + func_80031600(&obj->trans.x_position, tempPos, &radius, &sp43, TRUE, &sp48); + obj->x_velocity = (tempPos[0] - obj->trans.x_position) / updateRateF; + obj->y_velocity = (tempPos[1] - obj->trans.y_position) / updateRateF; + obj->z_velocity = (tempPos[2] - obj->trans.z_position) / updateRateF; + obj->trans.x_position = tempPos[0]; + obj->trans.y_position = tempPos[1]; + obj->trans.z_position = tempPos[2]; // Bananas dropped by planes will not have gravity. if (banana->droppedVehicleID != VEHICLE_PLANE) { - obj->segment.y_velocity -= 1.0; //!@Delta - obj->segment.x_velocity *= 0.95; //!@Delta - obj->segment.z_velocity *= 0.95; //!@Delta + obj->y_velocity -= 1.0; //!@Delta + obj->x_velocity *= 0.95; //!@Delta + obj->z_velocity *= 0.95; //!@Delta } else { - obj->segment.x_velocity = 0.0f; - obj->segment.y_velocity = 0.0f; - obj->segment.z_velocity = 0.0f; + obj->x_velocity = 0.0f; + obj->y_velocity = 0.0f; + obj->z_velocity = 0.0f; } - velX = obj->segment.x_velocity; + velX = obj->x_velocity; if (velX < 0.0) { velX = -velX; } - velZ = obj->segment.z_velocity; + velZ = obj->z_velocity; if (velZ < 0.0) { velZ = -velZ; } @@ -4409,9 +4374,9 @@ void obj_loop_banana(Object *obj, s32 updateRate) { properties->status = BANANA_IDLE; } radius = -10000.0f; - if (func_8002B9BC(obj, &radius, NULL, 1) != 0 && obj->segment.trans.y_position < radius) { + if (func_8002B9BC(obj, &radius, NULL, 1) != 0 && obj->trans.y_position < radius) { properties->status = BANANA_IDLE; - obj->segment.trans.y_position = radius; + obj->trans.y_position = radius; } } hitDist = 70; @@ -4427,8 +4392,8 @@ void obj_loop_banana(Object *obj, s32 updateRate) { if (obj->interactObj->distance < 120) { if (get_current_level_race_type() == RACETYPE_CHALLENGE_BANANAS) { racerObj = obj->interactObj->obj; - if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { - racer = &racerObj->unk64->racer; + if (racerObj != NULL && racerObj->header->behaviorId == BHV_RACER) { + racer = racerObj->racer; if (racer->playerIndex == PLAYER_COMPUTER) { hitDist += 30; // AI players are offered extra courtesy. } @@ -4437,20 +4402,19 @@ void obj_loop_banana(Object *obj, s32 updateRate) { } if (obj->interactObj->distance < hitDist && properties->intangibleTimer == 0) { racerObj = obj->interactObj->obj; - if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { - racer = &racerObj->unk64->racer; + if (racerObj != NULL && racerObj->header->behaviorId == BHV_RACER) { + racer = racerObj->racer; if (get_current_level_race_type() != RACETYPE_CHALLENGE_BANANAS || racer->bananas < 2) { prevSoundMask = racer->bananaSoundMask; - audspat_play_sound_at_position( - SOUND_SELECT, racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, - racerObj->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, &racer->bananaSoundMask); + audspat_play_sound_at_position(SOUND_SELECT, racerObj->trans.x_position, racerObj->trans.y_position, + racerObj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, + &racer->bananaSoundMask); if (prevSoundMask) { audspat_point_stop(prevSoundMask); } if (racer->playerIndex != PLAYER_COMPUTER && racer->bananas == 9) { - sound_play_spatial(racer->characterId + SOUND_UNK_7B, racerObj->segment.trans.x_position, - racerObj->segment.trans.y_position, racerObj->segment.trans.z_position, - NULL); + sound_play_spatial(racer->characterId + SOUND_UNK_7B, racerObj->trans.x_position, + racerObj->trans.y_position, racerObj->trans.z_position, NULL); } racer->bananas++; if (banana->spawner != NULL) { @@ -4479,17 +4443,17 @@ void obj_init_silvercoin_adv2(Object *obj, UNUSED LevelObjectEntry_SilverCoinAdv obj->interactObj->flags = INTERACT_FLAGS_TANGIBLE; obj->interactObj->unk11 = 0; obj->interactObj->hitboxRadius = 30; - obj->properties.npc.action = SILVER_COIN_INACTIVE; - obj->properties.npc.timer = 16; + obj->properties.silverCoin.action = SILVER_COIN_INACTIVE; + obj->properties.silverCoin.timer = 16; if (!is_in_tracks_mode()) { if (check_if_silver_coin_race() && is_in_adventure_two()) { - obj->properties.npc.action = SILVER_COIN_ACTIVE; + obj->properties.silverCoin.action = SILVER_COIN_ACTIVE; } else { - obj->properties.npc.action = SILVER_COIN_INACTIVE; + obj->properties.silverCoin.action = SILVER_COIN_INACTIVE; } } - if (obj->properties.npc.action == SILVER_COIN_INACTIVE) { - obj->segment.trans.flags |= OBJ_FLAGS_INVIS_PLAYER1 | OBJ_FLAGS_INVIS_PLAYER2; + if (obj->properties.silverCoin.action == SILVER_COIN_INACTIVE) { + obj->trans.flags |= OBJ_FLAGS_INVIS_PLAYER1 | OBJ_FLAGS_INVIS_PLAYER2; free_object(obj); } } @@ -4503,17 +4467,17 @@ void obj_init_silvercoin(Object *obj, UNUSED LevelObjectEntry_SilverCoin *entry) obj->interactObj->flags = INTERACT_FLAGS_TANGIBLE; obj->interactObj->unk11 = 0; obj->interactObj->hitboxRadius = 30; - obj->properties.npc.action = SILVER_COIN_INACTIVE; - obj->properties.npc.timer = 0; + obj->properties.silverCoin.action = SILVER_COIN_INACTIVE; + obj->properties.silverCoin.timer = 0; if (!is_in_tracks_mode()) { if (check_if_silver_coin_race() && !is_in_adventure_two()) { - obj->properties.npc.action = SILVER_COIN_ACTIVE; + obj->properties.silverCoin.action = SILVER_COIN_ACTIVE; } else { - obj->properties.npc.action = SILVER_COIN_INACTIVE; + obj->properties.silverCoin.action = SILVER_COIN_INACTIVE; } } - if (obj->properties.npc.action == SILVER_COIN_INACTIVE) { - obj->segment.trans.flags |= OBJ_FLAGS_INVIS_PLAYER2 | OBJ_FLAGS_INVIS_PLAYER1; + if (obj->properties.silverCoin.action == SILVER_COIN_INACTIVE) { + obj->trans.flags |= OBJ_FLAGS_INVIS_PLAYER2 | OBJ_FLAGS_INVIS_PLAYER1; free_object(obj); } } @@ -4531,29 +4495,29 @@ void obj_loop_silvercoin(Object *obj, s32 updateRate) { s32 twoPlayerAdv; twoPlayerAdv = is_two_player_adventure_race(); - if ((twoPlayerAdv && obj->properties.npc.action != SILVER_COIN_INACTIVE) || - (!twoPlayerAdv && obj->properties.npc.action == SILVER_COIN_ACTIVE)) { + if ((twoPlayerAdv && obj->properties.silverCoin.action != SILVER_COIN_INACTIVE) || + (!twoPlayerAdv && obj->properties.silverCoin.action == SILVER_COIN_ACTIVE)) { interactObj = obj->interactObj; if (interactObj->distance < 80) { racerObj = interactObj->obj; - if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { - racer = &racerObj->unk64->racer; + if (racerObj != NULL && racerObj->header->behaviorId == BHV_RACER) { + racer = racerObj->racer; if (racer->playerIndex != PLAYER_COMPUTER) { if (racer->raceFinished == FALSE && - !(obj->properties.npc.action & (SILVER_COIN_COLLECTED << racer->playerIndex))) { - obj->properties.npc.action |= SILVER_COIN_COLLECTED << racer->playerIndex; - obj->properties.npc.timer = 16; - obj->segment.trans.flags |= OBJ_FLAGS_INVIS_PLAYER1 << racer->playerIndex; + !(obj->properties.silverCoin.action & (SILVER_COIN_COLLECTED << racer->playerIndex))) { + obj->properties.silverCoin.action |= SILVER_COIN_COLLECTED << racer->playerIndex; + obj->properties.silverCoin.timer = 16; + obj->trans.flags |= OBJ_FLAGS_INVIS_PLAYER1 << racer->playerIndex; music_jingle_play(SEQUENCE_SILVER_COIN_1 + racer->silverCoinCount); racer->silverCoinCount++; } } } } - obj->segment.animFrame += 8 * updateRate; + obj->animFrame += 8 * updateRate; } - if (obj->properties.npc.timer > 0) { - obj->properties.npc.timer -= updateRate; + if (obj->properties.silverCoin.timer > 0) { + obj->properties.silverCoin.timer -= updateRate; obj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(obj, updateRate); } @@ -4593,9 +4557,9 @@ void obj_loop_worldkey(Object *worldKeyObj, s32 updateRate) { // the key object, otherwise it is NULL. playerObj = worldKeyObj->interactObj->obj; if (playerObj != NULL) { - if (playerObj->segment.header->behaviorId == BHV_RACER) { - Object_WorldKey *obj64 = &playerObj->unk64->world_key; - if (obj64->unk0 != -1) { + if (playerObj->header->behaviorId == BHV_RACER) { + Object_Racer *racer = playerObj->racer; + if (racer->playerIndex != PLAYER_COMPUTER) { // Player has grabbed the key! music_jingle_play(SEQUENCE_KEY_COLLECT); settings = get_settings(); @@ -4607,7 +4571,7 @@ void obj_loop_worldkey(Object *worldKeyObj, s32 updateRate) { } // Rotate world key - worldKeyObj->segment.trans.rotation.y_rotation += updateRate * 0x100; + worldKeyObj->trans.rotation.y_rotation += updateRate * 0x100; } /** @@ -4643,12 +4607,12 @@ void obj_init_weaponballoon(Object *obj, LevelObjectEntry_WeaponBalloon *entry) entry->unk8 = 0; } - if (obj->segment.object.modelIndex >= obj->segment.header->numberOfModelIds) { - obj->segment.object.modelIndex = 0; + if (obj->modelIndex >= obj->header->numberOfModelIds) { + obj->modelIndex = 0; } - obj->segment.object.modelIndex = entry->balloonType; - obj->properties.weaponBalloon.balloonID = obj->segment.object.modelIndex; + obj->modelIndex = entry->balloonType; + obj->properties.weaponBalloon.balloonID = obj->modelIndex; scale = entry->scale & 0xFF; if (scale < 10) { @@ -4656,10 +4620,10 @@ void obj_init_weaponballoon(Object *obj, LevelObjectEntry_WeaponBalloon *entry) } scale /= 64; - balloon = &obj->unk64->weapon_balloon; + balloon = obj->weapon_balloon; - obj->segment.trans.scale = obj->segment.header->scale * scale; - balloon->scale = obj->segment.trans.scale; + obj->trans.scale = obj->header->scale * scale; + balloon->scale = obj->trans.scale; balloon->respawnTime = 0; obj->properties.weaponBalloon.particleTimer = 0; @@ -4685,15 +4649,15 @@ void obj_loop_weaponballoon(Object *weaponBalloonObj, s32 updateRate) { ObjectInteraction *interactObj; s32 prevBalloonType; - weaponBalloon = &weaponBalloonObj->unk64->weapon_balloon; - weaponBalloonObj->segment.trans.scale = weaponBalloon->scale * (1.0 - (weaponBalloon->respawnTime / 90.0f)); - if (weaponBalloonObj->segment.trans.scale < 0.001) { - weaponBalloonObj->segment.trans.scale = 0.001f; + weaponBalloon = weaponBalloonObj->weapon_balloon; + weaponBalloonObj->trans.scale = weaponBalloon->scale * (1.0 - (weaponBalloon->respawnTime / 90.0f)); + if (weaponBalloonObj->trans.scale < 0.001) { + weaponBalloonObj->trans.scale = 0.001f; } - if (weaponBalloonObj->segment.trans.scale < 0.1) { - weaponBalloonObj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + if (weaponBalloonObj->trans.scale < 0.1) { + weaponBalloonObj->trans.flags |= OBJ_FLAGS_INVISIBLE; } else { - weaponBalloonObj->segment.trans.flags &= ~OBJ_FLAGS_INVISIBLE; + weaponBalloonObj->trans.flags &= ~OBJ_FLAGS_INVISIBLE; } if (weaponBalloonObj->properties.weaponBalloon.particleTimer > 0) { weaponBalloonObj->particleEmittersEnabled = OBJ_EMIT_1; @@ -4711,8 +4675,8 @@ void obj_loop_weaponballoon(Object *weaponBalloonObj, s32 updateRate) { interactObj = weaponBalloonObj->interactObj; if (interactObj->distance < 45) { whatObjInteracted = interactObj->obj; - if (whatObjInteracted != NULL && whatObjInteracted->segment.header->behaviorId == BHV_RACER) { - racer = &whatObjInteracted->unk64->racer; + if (whatObjInteracted != NULL && whatObjInteracted->header->behaviorId == BHV_RACER) { + racer = whatObjInteracted->racer; if (racer->vehicleID < VEHICLE_BOSSES || racer->playerIndex != PLAYER_COMPUTER) { prevBalloonType = racer->balloon_type; racer->balloon_type = weaponBalloonObj->properties.weaponBalloon.balloonID; @@ -4748,10 +4712,9 @@ void obj_loop_weaponballoon(Object *weaponBalloonObj, s32 updateRate) { weaponBalloonObj->properties.weaponBalloon.particleTimer = 16; } if (racer->playerIndex == PLAYER_COMPUTER) { - audspat_play_sound_at_position(SOUND_BALLOON_POP, weaponBalloonObj->segment.trans.x_position, - weaponBalloonObj->segment.trans.y_position, - weaponBalloonObj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position( + SOUND_BALLOON_POP, weaponBalloonObj->trans.x_position, weaponBalloonObj->trans.y_position, + weaponBalloonObj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } else { if (levelMask == racer->balloon_level) { if (racer->raceFinished == FALSE) { @@ -4763,11 +4726,10 @@ void obj_loop_weaponballoon(Object *weaponBalloonObj, s32 updateRate) { } sound_play(SOUND_COLLECT_ITEM + prevBalloonQuantity, NULL); } else { - audspat_play_sound_at_position(SOUND_BALLOON_POP, - weaponBalloonObj->segment.trans.x_position, - weaponBalloonObj->segment.trans.y_position, - weaponBalloonObj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position( + SOUND_BALLOON_POP, weaponBalloonObj->trans.x_position, + weaponBalloonObj->trans.y_position, weaponBalloonObj->trans.z_position, + AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } } } else if (racer->raceFinished == FALSE) { @@ -4820,7 +4782,7 @@ void obj_init_weapon(Object *obj, UNUSED LevelObjectEntry_Weapon *entry) { * Stationary traps will drop to the floor and stay there for a while before self-detonating. */ void obj_loop_weapon(Object *obj, s32 updateRate) { - Object_Weapon *weapon = &obj->unk64->weapon; + Object_Weapon *weapon = obj->weapon; switch (weapon->weaponID) { case WEAPON_ROCKET_HOMING: case WEAPON_ROCKET: @@ -4865,33 +4827,32 @@ void weapon_projectile(Object *obj, s32 updateRate) { ObjectTransform trans; obj->interactObj->flags |= INTERACT_FLAGS_UNK_0100; - weapon = &obj->unk64->weapon; - posX = obj->segment.trans.x_position; - posY = obj->segment.trans.y_position; - posZ = obj->segment.trans.z_position; - trans.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - trans.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; + weapon = obj->weapon; + posX = obj->trans.x_position; + posY = obj->trans.y_position; + posZ = obj->trans.z_position; + trans.rotation.y_rotation = obj->trans.rotation.y_rotation; + trans.rotation.x_rotation = obj->trans.rotation.x_rotation; trans.rotation.z_rotation = 0; trans.x_position = 0.0f; trans.y_position = 0.0f; trans.z_position = 0.0f; trans.scale = 1.0f; mtxf_from_transform(&mtxf, &trans); - mtxf_transform_point(&mtxf, 0.0f, 0.0f, weapon->forwardVel, &obj->segment.x_velocity, &obj->segment.y_velocity, - &obj->segment.z_velocity); + mtxf_transform_point(&mtxf, 0.0f, 0.0f, weapon->forwardVel, &obj->x_velocity, &obj->y_velocity, &obj->z_velocity); updateRateF = updateRate; if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } - offset.x = obj->segment.trans.x_position + (obj->segment.x_velocity * updateRateF); - offset.y = obj->segment.trans.y_position + (obj->segment.y_velocity * updateRateF); - offset.z = obj->segment.trans.z_position + (obj->segment.z_velocity * updateRateF); + offset.x = obj->trans.x_position + (obj->x_velocity * updateRateF); + offset.y = obj->trans.y_position + (obj->y_velocity * updateRateF); + offset.z = obj->trans.z_position + (obj->z_velocity * updateRateF); if (weapon->weaponID != WEAPON_MAGNET_LEVEL_3) { radius = 16.0f; - func_80031130(1, &obj->segment.trans.x_position, (f32 *) &offset, -1); + func_80031130(1, &obj->trans.x_position, (f32 *) &offset, -1); hasCollision = FALSE; surface = SURFACE_NONE; - func_80031600(&obj->segment.trans.x_position, (f32 *) &offset, &radius, &surface, TRUE, &hasCollision); + func_80031600(&obj->trans.x_position, (f32 *) &offset, &radius, &surface, TRUE, &hasCollision); if (hasCollision > 0) { if (func_8002ACD4(&diffX, &diffY, &diffZ)) { obj->properties.projectile.timer = 0; @@ -4948,10 +4909,10 @@ void weapon_projectile(Object *obj, s32 updateRate) { size = 60; } if (obj->interactObj->distance < size) { - if (interactObj->segment.header->behaviorId == BHV_RACER) { - racer = &interactObj->unk64->racer; + if (interactObj->header->behaviorId == BHV_RACER) { + racer = interactObj->racer; racer->attackType = ATTACK_EXPLOSION; - weaponOwner = &weapon->owner->unk64->racer; + weaponOwner = weapon->owner->racer; if (racer->playerIndex != PLAYER_COMPUTER || weaponOwner->playerIndex != PLAYER_COMPUTER) { weaponOwner->boost_sound |= BOOST_SOUND_UNK2; } @@ -4959,8 +4920,8 @@ void weapon_projectile(Object *obj, s32 updateRate) { rumble_set(racer->playerIndex, RUMBLE_TYPE_9); } } - obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, 1); + obj_spawn_effect(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, + ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, 1); free_object(obj); return; } @@ -4970,16 +4931,16 @@ block_37: if (obj->attachPoints != NULL) { temp_s1_2 = obj->attachPoints->obj[0]; if (obj->properties.projectile.unk4 < 8) { - temp_s1_2->segment.trans.scale = obj->properties.projectile.unk4 * 0.5f; + temp_s1_2->trans.scale = obj->properties.projectile.unk4 * 0.5f; } else if (obj->properties.projectile.unk4 < 16) { - temp_s1_2->segment.trans.scale = 4.0f - ((obj->properties.projectile.unk4 - 8) * 0.25f); + temp_s1_2->trans.scale = 4.0f - ((obj->properties.projectile.unk4 - 8) * 0.25f); } else { - temp_s1_2->segment.trans.scale = (sins_f(obj->properties.projectile.unk4 << 12) * 0.25f) + 2.0f; + temp_s1_2->trans.scale = (sins_f(obj->properties.projectile.unk4 << 12) * 0.25f) + 2.0f; } } obj->properties.projectile.timer -= updateRate; if (obj->properties.projectile.timer < 0) { - obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, + obj_spawn_effect(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, 1); free_object(obj); return; @@ -5008,21 +4969,21 @@ void rocket_prevent_overshoot(Object *obj, UNUSED s32 updateRate, Object_Weapon } interactedObj = rocket->hitObj; if (rocket->hitObj != NULL) { - diffX = interactedObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = interactedObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = interactedObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = interactedObj->trans.x_position - obj->trans.x_position; + diffY = interactedObj->trans.y_position - obj->trans.y_position; + diffZ = interactedObj->trans.z_position - obj->trans.z_position; dist = sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)); if (dist > 0.0f) { rocket->forwardVel = -25.0f; angle = (arctan2_f(diffX, diffZ) - 0x8000) & 0xFFFF; - angleDiff = angle - (obj->segment.trans.rotation.y_rotation & 0xFFFF); + angleDiff = angle - (obj->trans.rotation.y_rotation & 0xFFFF); WRAP(angleDiff, -0x8000, 0x8000); if (angleDiff > 0x6000 || angleDiff < -0x6000) { obj->interactObj->obj = interactedObj; obj->interactObj->distance = 1; } - obj->segment.trans.rotation.x_rotation = arctan2_f(diffY, dist); - obj->segment.trans.rotation.y_rotation = angle; + obj->trans.rotation.x_rotation = arctan2_f(diffY, dist); + obj->trans.rotation.y_rotation = angle; } } play_rocket_trailing_sound(obj, rocket, SOUND_INCOMING_ROCKET); @@ -5049,12 +5010,12 @@ void homing_rocket_prevent_overshoot(Object *obj, s32 updateRate, Object_Weapon if (rocket->target != NULL) { targetObj = rocket->target; - racer = &targetObj->unk64->racer; + racer = targetObj->racer; rocket->unk14 = racer->unk1BA >> 1; rocket->unk16 = racer->unk1BC >> 1; - diffX = targetObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = targetObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = targetObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = targetObj->trans.x_position - obj->trans.x_position; + diffY = targetObj->trans.y_position - obj->trans.y_position; + diffZ = targetObj->trans.z_position - obj->trans.z_position; dist = (diffX * diffX) + (diffZ * diffZ); distY = diffY * diffY; if (dist < 10000.0 && distY > 10000.0) { @@ -5073,21 +5034,21 @@ void homing_rocket_prevent_overshoot(Object *obj, s32 updateRate, Object_Weapon sp58 = FALSE; } angle = (arctan2_f(diffX, diffZ) - 0x8000) & 0xFFFF; - angleDiff = angle - (obj->segment.trans.rotation.y_rotation & 0xFFFF); + angleDiff = angle - (obj->trans.rotation.y_rotation & 0xFFFF); WRAP(angleDiff, -0x8000, 0x8000); if (sp58) { - obj->segment.trans.rotation.y_rotation += (angleDiff * updateRate) >> shift; - angleDiff = sineY - (obj->segment.trans.rotation.x_rotation & 0xFFFF); + obj->trans.rotation.y_rotation += (angleDiff * updateRate) >> shift; + angleDiff = sineY - (obj->trans.rotation.x_rotation & 0xFFFF); WRAP(angleDiff, -0x8000, 0x8000); - obj->segment.trans.rotation.x_rotation += (angleDiff * updateRate) >> shift; + obj->trans.rotation.x_rotation += (angleDiff * updateRate) >> shift; } else { if (angleDiff > 0x6000 || angleDiff < -0x6000) { obj->interactObj->obj = targetObj; obj->interactObj->distance = 1; } - obj->segment.trans.rotation.x_rotation = arctan2_f(diffY, dist) & 0xFFFFu; + obj->trans.rotation.x_rotation = arctan2_f(diffY, dist) & 0xFFFFu; - obj->segment.trans.rotation.y_rotation = angle; + obj->trans.rotation.y_rotation = angle; } } play_rocket_trailing_sound(obj, rocket, SOUND_HOMING_ROCKET); @@ -5130,10 +5091,10 @@ void play_rocket_trailing_sound(Object *obj, struct Object_Weapon *weapon, u16 s racerGroup = get_racer_objects_by_port(&numRacers); for (i = 0; i < numRacers; i++) { racer = racerGroup[i]; - if (weapon->owner != racerGroup[i] && racer->unk64->racer.playerIndex != PLAYER_COMPUTER) { - diffX = racer->segment.trans.x_position - obj->segment.trans.x_position; - diffY = racer->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = racer->segment.trans.z_position - obj->segment.trans.z_position; + if (weapon->owner != racerGroup[i] && racer->racer->playerIndex != PLAYER_COMPUTER) { + diffX = racer->trans.x_position - obj->trans.x_position; + diffY = racer->trans.y_position - obj->trans.y_position; + diffZ = racer->trans.z_position - obj->trans.z_position; distance = sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)); if (distance <= sound_distance(soundID)) { shouldPlaySound = TRUE; @@ -5143,13 +5104,13 @@ void play_rocket_trailing_sound(Object *obj, struct Object_Weapon *weapon, u16 s if (shouldPlaySound) { if (weapon->soundMask == NULL) { if (gRocketSoundTimer < 8) { - audspat_play_sound_at_position(soundID, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, AUDIO_POINT_FLAG_1, &weapon->soundMask); + audspat_play_sound_at_position(soundID, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_1, &weapon->soundMask); gRocketSoundTimer++; } } else { - audspat_point_set_position(weapon->soundMask, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position); + audspat_point_set_position(weapon->soundMask, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position); } } else { if (weapon->soundMask) { @@ -5180,45 +5141,45 @@ void weapon_trap(Object *weaponObj, s32 updateRate) { Object_Weapon *weapon; ObjPropertyWeapon *weaponProperties; - weapon = &weaponObj->unk64->weapon; - weaponOwner = &weapon->owner->unk64->racer; + weapon = weaponObj->weapon; + weaponOwner = weapon->owner->racer; updateRateF = updateRate; weaponProperties = &weaponObj->properties.weapon; if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } if (weaponProperties->status == WEAPON_DROPPED) { - intendedPos.x = weaponObj->segment.trans.x_position + (weaponObj->segment.x_velocity * updateRateF); - intendedPos.y = weaponObj->segment.trans.y_position + (weaponObj->segment.y_velocity * updateRateF); - intendedPos.z = weaponObj->segment.trans.z_position + (weaponObj->segment.z_velocity * updateRateF); + intendedPos.x = weaponObj->trans.x_position + (weaponObj->x_velocity * updateRateF); + intendedPos.y = weaponObj->trans.y_position + (weaponObj->y_velocity * updateRateF); + intendedPos.z = weaponObj->trans.z_position + (weaponObj->z_velocity * updateRateF); radius = 9.0f; - func_80031130(1, &weaponObj->segment.trans.x_position, &intendedPos.x, -1); + func_80031130(1, &weaponObj->trans.x_position, &intendedPos.x, -1); hasCollision = FALSE; surface = -1; - func_80031600(&weaponObj->segment.trans.x_position, &intendedPos.x, &radius, &surface, 1, &hasCollision); - weaponObj->segment.x_velocity = (intendedPos.x - weaponObj->segment.trans.x_position) / updateRateF; - weaponObj->segment.y_velocity = (intendedPos.y - weaponObj->segment.trans.y_position) / updateRateF; - weaponObj->segment.z_velocity = (intendedPos.z - weaponObj->segment.trans.z_position) / updateRateF; - weaponObj->segment.trans.x_position = intendedPos.x; - weaponObj->segment.trans.y_position = intendedPos.y; - weaponObj->segment.trans.z_position = intendedPos.z; + func_80031600(&weaponObj->trans.x_position, &intendedPos.x, &radius, &surface, 1, &hasCollision); + weaponObj->x_velocity = (intendedPos.x - weaponObj->trans.x_position) / updateRateF; + weaponObj->y_velocity = (intendedPos.y - weaponObj->trans.y_position) / updateRateF; + weaponObj->z_velocity = (intendedPos.z - weaponObj->trans.z_position) / updateRateF; + weaponObj->trans.x_position = intendedPos.x; + weaponObj->trans.y_position = intendedPos.y; + weaponObj->trans.z_position = intendedPos.z; if (hasCollision || weaponOwner->vehicleID == VEHICLE_PLANE) { - weaponObj->segment.x_velocity = 0.0f; - weaponObj->segment.z_velocity = 0.0f; + weaponObj->x_velocity = 0.0f; + weaponObj->z_velocity = 0.0f; weaponProperties->status = WEAPON_ARMED; weaponProperties->submerged = 0; weaponProperties->scale = 0; if (weapon->weaponID == WEAPON_BUBBLE_TRAP) { - weaponObj->segment.trans.y_position += 16.0f; + weaponObj->trans.y_position += 16.0f; } } radius = -10000.0f; - if (func_8002B9BC(weaponObj, &radius, NULL, 1) && (weaponObj->segment.trans.y_position < radius)) { + if (func_8002B9BC(weaponObj, &radius, NULL, 1) && (weaponObj->trans.y_position < radius)) { weaponProperties->status = WEAPON_ARMED; weaponProperties->submerged = 1; weaponProperties->scale = 0; if (weapon->weaponID == WEAPON_BUBBLE_TRAP) { - weaponObj->segment.trans.y_position += 16.0f; + weaponObj->trans.y_position += 16.0f; } } } @@ -5242,18 +5203,18 @@ void weapon_trap(Object *weaponObj, s32 updateRate) { } else { weaponObj->shadow->scale = weaponProperties->scale * 0.6f; } - weaponObj->segment.trans.flags |= OBJ_FLAGS_SHADOW_ONLY; + weaponObj->trans.flags |= OBJ_FLAGS_SHADOW_ONLY; } } } if (weapon->weaponID == WEAPON_BUBBLE_TRAP) { if (weapon->target != NULL) { - weaponObj->segment.trans.x_position = 0.0f; - weaponObj->segment.trans.y_position = 0.0f; - weaponObj->segment.trans.z_position = 0.0f; + weaponObj->trans.x_position = 0.0f; + weaponObj->trans.y_position = 0.0f; + weaponObj->trans.z_position = 0.0f; ignore_bounds_check(); - move_object(weaponObj, weapon->target->segment.trans.x_position, weapon->target->segment.trans.y_position, - weapon->target->segment.trans.z_position); + move_object(weaponObj, weapon->target->trans.x_position, weapon->target->trans.y_position, + weapon->target->trans.z_position); } if (weaponProperties->status == WEAPON_ARMED || weaponProperties->status == WEAPON_TRIGGERED) { weaponProperties->scale += updateRate; @@ -5269,15 +5230,14 @@ void weapon_trap(Object *weaponObj, s32 updateRate) { audspat_point_stop(weapon->soundMask); weapon->soundMask = NULL; } - audspat_play_sound_at_position(SOUND_POP, weaponObj->segment.trans.x_position, - weaponObj->segment.trans.y_position, weaponObj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(SOUND_POP, weaponObj->trans.x_position, weaponObj->trans.y_position, + weaponObj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } } if (weaponProperties->status == WEAPON_DESTROY) { weaponObj->particleEmittersEnabled = OBJ_EMIT_1; obj_spawn_particle(weaponObj, updateRate); - weaponObj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + weaponObj->trans.flags |= OBJ_FLAGS_INVISIBLE; weaponProperties->scale -= updateRate; if (weaponProperties->scale < 1) { weaponProperties->scale = 1; @@ -5285,20 +5245,20 @@ void weapon_trap(Object *weaponObj, s32 updateRate) { } } if (weaponProperties->status != WEAPON_DROPPED) { - weaponObj->segment.trans.scale = weaponProperties->scale * 0.075f; + weaponObj->trans.scale = weaponProperties->scale * 0.075f; } - weaponObj->segment.animFrame += updateRate * 16; + weaponObj->animFrame += updateRate * 16; } if (weaponProperties->status < WEAPON_TRIGGERED) { hitDist = 60; if (weaponOwner->vehicleID != VEHICLE_PLANE) { hitDist = 34; - weaponObj->segment.y_velocity -= 2.0; - weaponObj->segment.x_velocity -= (weaponObj->segment.x_velocity / 8); - weaponObj->segment.z_velocity -= (weaponObj->segment.z_velocity / 8); + weaponObj->y_velocity -= 2.0; + weaponObj->x_velocity -= (weaponObj->x_velocity / 8); + weaponObj->z_velocity -= (weaponObj->z_velocity / 8); } else { - weaponObj->segment.y_velocity = 0.0f; - weaponObj->segment.animFrame += updateRate * 8; + weaponObj->y_velocity = 0.0f; + weaponObj->animFrame += updateRate * 8; } if (weapon->weaponID == WEAPON_BUBBLE_TRAP || weapon->weaponID == WEAPON_OIL_SLICK) { hitDist += hitDist >> 1; @@ -5308,27 +5268,26 @@ void weapon_trap(Object *weaponObj, s32 updateRate) { if (weapon->owner != weaponObj->interactObj->obj || weaponProperties->decayTimer < normalise_time(450)) { if (weaponObj->interactObj->distance < hitDist) { weaponInteractObj = weaponObj->interactObj->obj; - if (weaponInteractObj->segment.header->behaviorId == BHV_RACER) { - weaponHit = &weaponInteractObj->unk64->racer; + if (weaponInteractObj->header->behaviorId == BHV_RACER) { + weaponHit = weaponInteractObj->racer; weaponHit->attackType = ATTACK_EXPLOSION; if (weapon->weaponID == WEAPON_TRIPMINE) { - obj_spawn_effect(weaponObj->segment.trans.x_position, weaponObj->segment.trans.y_position, - weaponObj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, + obj_spawn_effect(weaponObj->trans.x_position, weaponObj->trans.y_position, + weaponObj->trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, 1); } else if (weapon->weaponID == WEAPON_BUBBLE_TRAP) { if (weaponHit->shieldTimer > 0 && weaponHit->shieldType >= SHIELD_LEVEL3) { weaponProperties->status = WEAPON_DESTROY; - audspat_play_sound_at_position( - SOUND_POP, weaponObj->segment.trans.x_position, weaponObj->segment.trans.y_position, - weaponObj->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(SOUND_POP, weaponObj->trans.x_position, + weaponObj->trans.y_position, weaponObj->trans.z_position, + AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } else { weapon->target = weaponInteractObj; - audspat_play_sound_at_position(SOUND_BUBBLE, - weaponInteractObj->segment.trans.x_position, - weaponInteractObj->segment.trans.y_position, - weaponInteractObj->segment.trans.z_position, + audspat_play_sound_at_position(SOUND_BUBBLE, weaponInteractObj->trans.x_position, + weaponInteractObj->trans.y_position, + weaponInteractObj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, &weapon->soundMask); weaponHit->attackType = ATTACK_BUBBLE; weaponProperties->status = WEAPON_TRIGGERED; @@ -5341,7 +5300,7 @@ void weapon_trap(Object *weaponObj, s32 updateRate) { if (!weaponHit->raceFinished) { rumble_set(weaponHit->playerIndex, RUMBLE_TYPE_13); } - weaponOwner = &weapon->owner->unk64->racer; + weaponOwner = weapon->owner->racer; if (weaponHit->playerIndex != PLAYER_COMPUTER || weaponOwner->playerIndex != PLAYER_COMPUTER) { weaponOwner->boost_sound |= BOOST_SOUND_UNK2; } @@ -5360,13 +5319,13 @@ void weapon_trap(Object *weaponObj, s32 updateRate) { weaponProperties->status = WEAPON_TRIGGERED; } else if (weapon->weaponID == WEAPON_BUBBLE_TRAP) { weaponProperties->status = WEAPON_DESTROY; - audspat_play_sound_at_position( - SOUND_POP, weaponObj->segment.trans.x_position, weaponObj->segment.trans.y_position, - weaponObj->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(SOUND_POP, weaponObj->trans.x_position, weaponObj->trans.y_position, + weaponObj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, + NULL); } else { - obj_spawn_effect(weaponObj->segment.trans.x_position, weaponObj->segment.trans.y_position, - weaponObj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, - SOUND_EXPLOSION, 1.0f, 1); + obj_spawn_effect(weaponObj->trans.x_position, weaponObj->trans.y_position, + weaponObj->trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, + 1); free_object(weaponObj); } } @@ -5390,11 +5349,11 @@ void obj_spawn_effect(f32 x, f32 y, f32 z, s32 objectID, s32 soundID, f32 scale, spawnObj.unk9 = arg6; newObj = spawn_object((LevelObjectEntryCommon *) &spawnObj, OBJECT_SPAWN_UNK01); if (newObj != NULL) { - newObj->segment.level_entry = NULL; - newObj->segment.x_velocity = 0.0f; - newObj->segment.y_velocity = 0.0f; - newObj->segment.z_velocity = 0.0f; - newObj->segment.trans.scale = newObj->segment.trans.scale * 3.5 * scale; + newObj->level_entry = NULL; + newObj->x_velocity = 0.0f; + newObj->y_velocity = 0.0f; + newObj->z_velocity = 0.0f; + newObj->trans.scale = newObj->trans.scale * 3.5 * scale; } if (soundID != SOUND_NONE) { audspat_play_sound_at_position(soundID, x, y, z, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); @@ -5402,23 +5361,23 @@ void obj_spawn_effect(f32 x, f32 y, f32 z, s32 objectID, s32 soundID, f32 scale, } void obj_init_audio(Object *obj, LevelObjectEntry_Audio *entry) { - Object_Audio *obj64; + Object_Audio *audio; - obj64 = &obj->unk64->audio; - obj64->soundId = entry->soundId; - obj64->unk2 = entry->unkA; - obj64->unkC = entry->unkF; - obj64->unk6 = entry->unkE; - obj64->unk4 = entry->unkC; - obj64->unk5 = entry->unkD; - obj64->unkD = entry->unk10; - obj64->soundMask = NULL; - if (gSoundBank_GetSoundDecayTime(obj64->soundId)) { - audspat_point_create(obj64->soundId, entry->common.x, entry->common.y, entry->common.z, 9, obj64->unk5, - obj64->unk4, obj64->unk2, obj64->unkC, obj64->unk6, obj64->unkD, &obj64->soundMask); + audio = obj->audio; + audio->soundId = entry->soundId; + audio->unk2 = entry->unkA; + audio->unkC = entry->unkF; + audio->unk6 = entry->unkE; + audio->unk4 = entry->unkC; + audio->unk5 = entry->unkD; + audio->unkD = entry->unk10; + audio->soundMask = NULL; + if (gSoundBank_GetSoundDecayTime(audio->soundId)) { + audspat_point_create(audio->soundId, entry->common.x, entry->common.y, entry->common.z, 9, audio->unk5, + audio->unk4, audio->unk2, audio->unkC, audio->unk6, audio->unkD, &audio->soundMask); } else { - audspat_point_create(obj64->soundId, entry->common.x, entry->common.y, entry->common.z, 10, obj64->unk5, - obj64->unk4, obj64->unk2, obj64->unkC, obj64->unk6, obj64->unkD, &obj64->soundMask); + audspat_point_create(audio->soundId, entry->common.x, entry->common.y, entry->common.z, 10, audio->unk5, + audio->unk4, audio->unk2, audio->unkC, audio->unk6, audio->unkD, &audio->soundMask); } free_object(obj); } @@ -5427,7 +5386,7 @@ void obj_init_audio(Object *obj, LevelObjectEntry_Audio *entry) { void obj_init_audioline(Object *obj, LevelObjectEntry_AudioLine *entry) { Object_AudioLine *audLine; - audLine = &obj->unk64->audio_line; + audLine = obj->audio_line; audLine->unk0 = entry->unk8; audLine->soundID = entry->soundID; audLine->lineID = entry->lineID; @@ -5447,7 +5406,7 @@ void obj_init_audioline(Object *obj, LevelObjectEntry_AudioLine *entry) { void obj_init_audioreverb(Object *obj, LevelObjectEntry_AudioReverb *entry) { s32 temp; - Object_AudioReverb *reverb = &obj->unk64->audio_reverb; + Object_AudioReverb *reverb = obj->audio_reverb; reverb->unk2 = entry->unk8; temp = entry->lineID; reverb->lineID = temp & 0xFF; @@ -5459,25 +5418,25 @@ void obj_init_audioreverb(Object *obj, LevelObjectEntry_AudioReverb *entry) { /* Official name: texscrollInit */ void obj_init_texscroll(Object *obj, LevelObjectEntry_TexScroll *entry, s32 arg2) { - Object_TexScroll *obj64; + Object_TexScroll *texscroll; LevelModel *levelModel; s16 numberOfTexturesInLevel; - obj64 = &obj->unk64->tex_scroll; + texscroll = obj->tex_scroll; levelModel = get_current_level_model(); - obj64->textureIndex = entry->textureIndex; - if (obj64->textureIndex < 0) { - obj64->textureIndex = 0; + texscroll->textureIndex = entry->textureIndex; + if (texscroll->textureIndex < 0) { + texscroll->textureIndex = 0; } numberOfTexturesInLevel = levelModel->numberOfTextures; - if (obj64->textureIndex >= numberOfTexturesInLevel) { - obj64->textureIndex = numberOfTexturesInLevel - 1; + if (texscroll->textureIndex >= numberOfTexturesInLevel) { + texscroll->textureIndex = numberOfTexturesInLevel - 1; } - obj64->unk4 = entry->unkA; - obj64->unk6 = entry->unkB; + texscroll->unk4 = entry->unkA; + texscroll->unk6 = entry->unkB; if (arg2 == 0) { - obj64->unk8 = 0; - obj64->unkA = 0; + texscroll->unk8 = 0; + texscroll->unkA = 0; } } @@ -5506,7 +5465,7 @@ void obj_loop_texscroll(Object *obj, s32 updateRate) { s32 i; s32 j; - texScroll = &obj->unk64->tex_scroll; + texScroll = obj->tex_scroll; levelModel = get_current_level_model(); t0 = texScroll->unk4; @@ -5578,7 +5537,7 @@ void obj_loop_texscroll(Object *obj, s32 updateRate) { /* Official name: rgbalightInit */ void obj_init_rgbalight(Object *obj, LevelObjectEntry_RgbaLight *entry, UNUSED s32 arg2) { - obj->unk64 = (Object_64 *) func_80031CAC(obj, entry); + obj->light = func_80031CAC(obj, entry); } /** @@ -5586,8 +5545,7 @@ void obj_init_rgbalight(Object *obj, LevelObjectEntry_RgbaLight *entry, UNUSED s * Sets hitbox data from spawn info. */ void obj_init_buoy_pirateship(Object *obj, UNUSED LevelObjectEntry_Buoy_PirateShip *entry, UNUSED s32 arg2) { - obj->unk64 = (Object_64 *) obj_wave_init(obj->segment.object.segmentID, obj->segment.trans.x_position, - obj->segment.trans.z_position); + obj->log = obj_wave_init(obj->segmentID, obj->trans.x_position, obj->trans.z_position); obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 0; obj->interactObj->hitboxRadius = 30; @@ -5600,10 +5558,10 @@ void obj_init_buoy_pirateship(Object *obj, UNUSED LevelObjectEntry_Buoy_PirateSh * All it does is stays afloat on water and scrolls through each texture. */ void obj_loop_buoy_pirateship(Object *obj, s32 updateRate) { - if (obj->unk64 != NULL) { - obj->segment.trans.y_position = obj_wave_height((Object_Log *) obj->unk64, updateRate); + if (obj->log != NULL) { + obj->trans.y_position = obj_wave_height(obj->log, updateRate); } - obj->segment.animFrame += updateRate * 8; + obj->animFrame += updateRate * 8; } /** @@ -5612,8 +5570,7 @@ void obj_loop_buoy_pirateship(Object *obj, s32 updateRate) { */ void obj_init_log(Object *obj, LevelObjectEntry_Log *entry, UNUSED s32 arg2) { f32 radius; - obj->unk64 = (Object_64 *) obj_wave_init(obj->segment.object.segmentID, obj->segment.trans.x_position, - obj->segment.trans.z_position); + obj->log = obj_wave_init(obj->segmentID, obj->trans.x_position, obj->trans.z_position); obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 2; obj->interactObj->hitboxRadius = 30; @@ -5622,9 +5579,9 @@ void obj_init_log(Object *obj, LevelObjectEntry_Log *entry, UNUSED s32 arg2) { radius = 10.0f; } radius /= 64; - obj->segment.trans.scale = obj->segment.header->scale * radius; - obj->segment.object.modelIndex = entry->modelIndex; - obj->segment.trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); + obj->trans.scale = obj->header->scale * radius; + obj->modelIndex = entry->modelIndex; + obj->trans.rotation.y_rotation = U8_ANGLE_TO_U16(entry->angleY); } /** @@ -5640,29 +5597,29 @@ void obj_loop_log(Object *obj, s32 updateRate) { f32 diffZ; f32 diffX; - log = &obj->unk64->log; + log = obj->log; if (log != NULL) { - obj->segment.trans.y_position = obj_wave_height(log, updateRate); + obj->trans.y_position = obj_wave_height(log, updateRate); } else { - obj->segment.trans.y_position = ((LevelObjectEntryCommon *) obj->segment.level_entry)->y; + obj->trans.y_position = ((LevelObjectEntryCommon *) obj->level_entry)->y; } if (obj->unk5C->unk100 != NULL) { obj->properties.log.velocityY++; racerObj = obj->unk5C->unk100; if (racerObj->behaviorId == BHV_RACER) { - racer = &racerObj->unk64->racer; + racer = racerObj->racer; if (racer->velocity < -4.0 && racer->raceFinished == FALSE) { rumble_set(racer->playerIndex, RUMBLE_TYPE_18); } } - sine = sins_f(-obj->segment.trans.rotation.y_rotation); - cosine = coss_f(-obj->segment.trans.rotation.y_rotation); + sine = sins_f(-obj->trans.rotation.y_rotation); + cosine = coss_f(-obj->trans.rotation.y_rotation); // This looks a bit messy, but is required to match. - diffX = obj->segment.trans.x_position - racerObj->segment.trans.x_position; - diffZ = obj->segment.trans.z_position - racerObj->segment.trans.z_position; + diffX = obj->trans.x_position - racerObj->trans.x_position; + diffZ = obj->trans.z_position - racerObj->trans.z_position; diffX = (diffX * cosine) + (diffZ * sine); - diffZ = (racerObj->segment.x_velocity * sine) - (racerObj->segment.z_velocity * cosine); + diffZ = (racerObj->x_velocity * sine) - (racerObj->z_velocity * cosine); diffX *= diffZ; obj->properties.log.angleVel -= (s32) (diffX / 4); @@ -5677,7 +5634,7 @@ void obj_loop_log(Object *obj, s32 updateRate) { obj->properties.log.velocityY--; } } - obj->segment.trans.y_position -= (f32) obj->properties.log.velocityY * 1.0; + obj->trans.y_position -= (f32) obj->properties.log.velocityY * 1.0; if (obj->properties.log.angleVel > 0) { obj->properties.log.angleVel -= updateRate; if (obj->properties.log.angleVel < 0) { @@ -5690,7 +5647,7 @@ void obj_loop_log(Object *obj, s32 updateRate) { obj->properties.log.angleVel = 0; } } - obj->segment.trans.rotation.y_rotation += obj->properties.log.angleVel * updateRate; + obj->trans.rotation.y_rotation += obj->properties.log.angleVel * updateRate; obj->unk5C->unk100 = NULL; } @@ -5726,16 +5683,15 @@ void obj_loop_weather(Object *obj, UNUSED s32 updateRate) { last = numberOfObjects - 1; do { curObj = objects[cur + 1]; - racer = &curObj->unk64->racer; + racer = curObj->racer; } while (++cur < last && currViewport != racer->playerIndex); - diffX = obj->segment.trans.x_position - curObj->segment.trans.x_position; - diffZ = obj->segment.trans.z_position - curObj->segment.trans.z_position; + diffX = obj->trans.x_position - curObj->trans.x_position; + diffZ = obj->trans.z_position - curObj->trans.z_position; dist = obj->properties.distance.radius; - entry = (LevelObjectEntry_Weather *) obj->segment.level_entry; + entry = (LevelObjectEntry_Weather *) obj->level_entry; if ((diffX * diffX) + (diffZ * diffZ) <= dist) { - if (((!obj->segment.level_entry) && (!obj->segment.level_entry)) && (!obj->segment.level_entry)) { - } // Fakematch + if (((!obj->level_entry) && (!obj->level_entry)) && (!obj->level_entry)) {} // Fakematch weather_set(entry->unkA * 256, entry->unkC * 256, entry->unkE * 256, entry->unk10 * 257, entry->unk11 * 257, entry->unk12); } @@ -5757,8 +5713,8 @@ void obj_init_lensflare(Object *obj, UNUSED LevelObjectEntry_LensFlare *entry) { */ void obj_init_lensflareswitch(Object *obj, LevelObjectEntry_LensFlareSwitch *entry, UNUSED s32 arg2) { lensflare_override_add(obj); - obj->segment.trans.scale = entry->radius; - obj->segment.trans.scale /= 40.0f; + obj->trans.scale = entry->radius; + obj->trans.scale /= 40.0f; } /** @@ -5775,9 +5731,9 @@ void obj_init_butterfly(Object *butterflyObj, LevelObjectEntry_Butterfly *butter s32 vMask; s32 i; - butterfly = &butterflyObj->unk64->butterfly; + butterfly = butterflyObj->butterfly; if (param == 0) { - butterflyObj->segment.y_velocity = 0.0f; + butterflyObj->y_velocity = 0.0f; butterfly->unkFE = 0; butterfly->unk100 = 0; butterfly->unk104 = 0; @@ -5810,8 +5766,8 @@ void obj_init_butterfly(Object *butterflyObj, LevelObjectEntry_Butterfly *butter } butterfly->unkFC = 1; } - butterflyObj->segment.trans.scale = butterflyEntry->unkB * 0.01f; - if (butterflyEntry->unkA < butterflyObj->segment.header->numberOfModelIds) { + butterflyObj->trans.scale = butterflyEntry->unkB * 0.01f; + if (butterflyEntry->unkA < butterflyObj->header->numberOfModelIds) { butterfly->texture = butterflyObj->textures[butterflyEntry->unkA]; } else { butterfly->texture = butterflyObj->textures[0]; @@ -5854,8 +5810,8 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { Object_Butterfly *butterfly; LevelObjectEntry_Butterfly *butterflyEntry; - butterflyEntry = &butterflyObj->segment.level_entry->butterfly; - butterfly = &butterflyObj->unk64->butterfly; + butterflyEntry = &butterflyObj->level_entry->butterfly; + butterfly = butterflyObj->butterfly; sp64 = butterflyEntry->unkA == 2; sp72 = butterfly->unk106; if (sp72 < 0) { @@ -5887,9 +5843,9 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { butterfly->unkFD = 3; } } - butterflyObj->segment.animFrame = (butterflyObj->segment.animFrame + updateRate) & 0xFF; + butterflyObj->animFrame = (butterflyObj->animFrame + updateRate) & 0xFF; if (sp64) { - butterflyObj->segment.animFrame = 0x78; + butterflyObj->animFrame = 0x78; } break; case 1: @@ -5900,36 +5856,36 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { butterfly->unk106 = 0x480; } } - xDiff = butterflyObj->segment.trans.x_position - butterflyEntry->common.x; - zDiff = butterflyObj->segment.trans.z_position - butterflyEntry->common.z; + xDiff = butterflyObj->trans.x_position - butterflyEntry->common.x; + zDiff = butterflyObj->trans.z_position - butterflyEntry->common.z; temp = arctan2_f(xDiff, zDiff); - temp -= butterflyObj->segment.trans.rotation.y_rotation & 0xffff & 0xffff; + temp -= butterflyObj->trans.rotation.y_rotation & 0xffff & 0xffff; if (temp < 0) { if (temp > -sp72) { - butterflyObj->segment.trans.rotation.y_rotation += temp; + butterflyObj->trans.rotation.y_rotation += temp; } else { - butterflyObj->segment.trans.rotation.y_rotation -= sp72; + butterflyObj->trans.rotation.y_rotation -= sp72; } } else if ((temp > 0)) { if (temp < sp72) { - butterflyObj->segment.trans.rotation.y_rotation += temp; + butterflyObj->trans.rotation.y_rotation += temp; } else { - butterflyObj->segment.trans.rotation.y_rotation += sp72; + butterflyObj->trans.rotation.y_rotation += sp72; } } - sp84 = butterflyEntry->common.y - butterflyObj->segment.trans.y_position; + sp84 = butterflyEntry->common.y - butterflyObj->trans.y_position; if (sp84 < 0.0f) { - butterflyObj->segment.y_velocity -= sp7C * updateRate; - if (butterflyObj->segment.y_velocity < sp84) { - butterflyObj->segment.y_velocity = sp84; + butterflyObj->y_velocity -= sp7C * updateRate; + if (butterflyObj->y_velocity < sp84) { + butterflyObj->y_velocity = sp84; } } else if ((sp84 > 0.0f)) { - butterflyObj->segment.y_velocity += sp7C * updateRate; - if (sp84 < butterflyObj->segment.y_velocity) { - butterflyObj->segment.y_velocity = sp84; + butterflyObj->y_velocity += sp7C * updateRate; + if (sp84 < butterflyObj->y_velocity) { + butterflyObj->y_velocity = sp84; } } else { - butterflyObj->segment.y_velocity = 0.0f; + butterflyObj->y_velocity = 0.0f; } if (butterfly->unkFD == 1) { sp84 = butterflyEntry->unk8; @@ -5948,16 +5904,16 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { } } if (butterfly->unkFD != 3) { - yDiff = butterflyObj->segment.trans.y_position - butterflyEntry->common.y; + yDiff = butterflyObj->trans.y_position - butterflyEntry->common.y; if (sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)) < 4.0f) { ignore_bounds_check(); move_object(butterflyObj, -xDiff, -yDiff, -zDiff); - butterflyObj->segment.y_velocity = 0.0f; + butterflyObj->y_velocity = 0.0f; butterfly->unkFD = 0; butterfly->unk108 = 0.0f; } } - butterflyObj->segment.animFrame = (butterflyObj->segment.animFrame + (updateRate * 0x10)) & 0xFF; + butterflyObj->animFrame = (butterflyObj->animFrame + (updateRate * 0x10)) & 0xFF; break; case 3: if (butterfly->unk106 < 0x480) { @@ -5966,8 +5922,8 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { butterfly->unk106 = 0x480; } } - xDiff = butterfly->unk100->segment.trans.x_position - butterflyEntry->common.x; - zDiff = butterfly->unk100->segment.trans.z_position - butterflyEntry->common.z; + xDiff = butterfly->unk100->trans.x_position - butterflyEntry->common.x; + zDiff = butterfly->unk100->trans.z_position - butterflyEntry->common.z; radius = (butterflyEntry->unk8 * 2); radius *= radius; if (radius < ((xDiff * xDiff) + (zDiff * zDiff))) { @@ -5986,33 +5942,33 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { } } if (butterfly->unk100 != 0) { - xDiff = butterflyObj->segment.trans.x_position - butterfly->unk100->segment.trans.x_position; - zDiff = butterflyObj->segment.trans.z_position - butterfly->unk100->segment.trans.z_position; + xDiff = butterflyObj->trans.x_position - butterfly->unk100->trans.x_position; + zDiff = butterflyObj->trans.z_position - butterfly->unk100->trans.z_position; temp = arctan2_f(xDiff, zDiff); - temp -= butterflyObj->segment.trans.rotation.y_rotation & 0xffff & 0xffff; + temp -= butterflyObj->trans.rotation.y_rotation & 0xffff & 0xffff; if (temp < 0) { if (-sp72 < temp) { - butterflyObj->segment.trans.rotation.y_rotation += temp; + butterflyObj->trans.rotation.y_rotation += temp; } else { - butterflyObj->segment.trans.rotation.y_rotation -= sp72; + butterflyObj->trans.rotation.y_rotation -= sp72; } } else if ((temp > 0)) { if (temp < sp72) { - butterflyObj->segment.trans.rotation.y_rotation += temp; + butterflyObj->trans.rotation.y_rotation += temp; } else { - butterflyObj->segment.trans.rotation.y_rotation += sp72; + butterflyObj->trans.rotation.y_rotation += sp72; } } - sp84 = (butterfly->unk100->segment.trans.y_position + 16.0f) - butterflyObj->segment.trans.y_position; + sp84 = (butterfly->unk100->trans.y_position + 16.0f) - butterflyObj->trans.y_position; if (sp84 < 0.0f) { - butterflyObj->segment.y_velocity -= sp7C * updateRate; - if (butterflyObj->segment.y_velocity < sp84) { - butterflyObj->segment.y_velocity = sp84; + butterflyObj->y_velocity -= sp7C * updateRate; + if (butterflyObj->y_velocity < sp84) { + butterflyObj->y_velocity = sp84; } } else if ((sp84 > 0.0f)) { - butterflyObj->segment.y_velocity += sp7C * updateRate; - if (sp84 < butterflyObj->segment.y_velocity) { - butterflyObj->segment.y_velocity = sp84; + butterflyObj->y_velocity += sp7C * updateRate; + if (sp84 < butterflyObj->y_velocity) { + butterflyObj->y_velocity = sp84; } } if (((xDiff * xDiff) + (zDiff * zDiff)) < 256.0f) { @@ -6021,7 +5977,7 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { } else { butterfly->unkFD = 1; } - butterflyObj->segment.animFrame = (butterflyObj->segment.animFrame + (updateRate * 0x10)) & 0xFF; + butterflyObj->animFrame = (butterflyObj->animFrame + (updateRate * 0x10)) & 0xFF; break; case 4: if (butterfly->unk106 >= 0x181) { @@ -6030,8 +5986,8 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { butterfly->unk106 = 0x180; } } - xDiff = butterflyObj->segment.trans.x_position - butterflyEntry->common.x; - zDiff = butterflyObj->segment.trans.z_position - butterflyEntry->common.z; + xDiff = butterflyObj->trans.x_position - butterflyEntry->common.x; + zDiff = butterflyObj->trans.z_position - butterflyEntry->common.z; radius = (butterflyEntry->unk8 * 2); radius *= radius; if (radius < ((xDiff * xDiff) + (zDiff * zDiff))) { @@ -6041,8 +5997,8 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { butterfly->unk104 -= updateRate; } else { butterfly->unk104 = 0; - var_v1 = obj_dist_racer(butterflyObj->segment.trans.x_position, 0.0f, - butterflyObj->segment.trans.z_position, 150.0f, 1, sp44); + var_v1 = obj_dist_racer(butterflyObj->trans.x_position, 0.0f, butterflyObj->trans.z_position, + 150.0f, 1, sp44); if (var_v1 == 0) { butterfly->unk100 = 0; butterfly->unkFD = 1; @@ -6056,32 +6012,30 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { } } if (butterfly->unkFD == 4) { - xDiff = butterflyObj->segment.trans.x_position - butterfly->unk100->segment.trans.x_position; - zDiff = butterflyObj->segment.trans.z_position - butterfly->unk100->segment.trans.z_position; + xDiff = butterflyObj->trans.x_position - butterfly->unk100->trans.x_position; + zDiff = butterflyObj->trans.z_position - butterfly->unk100->trans.z_position; if (((xDiff * xDiff) + (zDiff * zDiff)) > 22500.0f) { butterfly->unkFD = 3; } else { if (rand_range(0, 0x64) >= 0x63) { butterfly->unk106 = -butterfly->unk106; } - butterflyObj->segment.trans.rotation.y_rotation += updateRate * butterfly->unk106; - if ((butterfly->unk100->segment.trans.y_position + 64.0f) < - butterflyObj->segment.trans.y_position) { + butterflyObj->trans.rotation.y_rotation += updateRate * butterfly->unk106; + if ((butterfly->unk100->trans.y_position + 64.0f) < butterflyObj->trans.y_position) { butterfly->unkFE = 0; - } else if (butterflyObj->segment.trans.y_position < - (butterfly->unk100->segment.trans.y_position + 8.0f)) { + } else if (butterflyObj->trans.y_position < (butterfly->unk100->trans.y_position + 8.0f)) { butterfly->unkFE = 1; } if (butterfly->unkFE != 0) { - butterflyObj->segment.y_velocity += (sp7C * updateRate); + butterflyObj->y_velocity += (sp7C * updateRate); } else { - butterflyObj->segment.y_velocity -= (sp7C * updateRate); + butterflyObj->y_velocity -= (sp7C * updateRate); } - butterflyObj->segment.trans.rotation.y_rotation += butterfly->unk106; + butterflyObj->trans.rotation.y_rotation += butterfly->unk106; } } } - butterflyObj->segment.animFrame = (butterflyObj->segment.animFrame + (updateRate * 0x10)) & 0xFF; + butterflyObj->animFrame = (butterflyObj->animFrame + (updateRate * 0x10)) & 0xFF; break; } if (butterfly->unkFD != 0) { @@ -6101,26 +6055,23 @@ void obj_loop_butterfly(Object *butterflyObj, s32 updateRate) { if (sp64) { var_f0 *= 1.6f; } - if (butterflyObj->segment.y_velocity < -var_f0) { - butterflyObj->segment.y_velocity = -var_f0; + if (butterflyObj->y_velocity < -var_f0) { + butterflyObj->y_velocity = -var_f0; } - if (var_f0 < butterflyObj->segment.y_velocity) { - butterflyObj->segment.y_velocity = var_f0; + if (var_f0 < butterflyObj->y_velocity) { + butterflyObj->y_velocity = var_f0; } if (butterfly->unk108 != 0.0f) { - butterflyObj->segment.x_velocity = - sins_f(butterflyObj->segment.trans.rotation.y_rotation) * -butterfly->unk108; - butterflyObj->segment.z_velocity = - coss_f(butterflyObj->segment.trans.rotation.y_rotation) * -butterfly->unk108; - move_object(butterflyObj, butterflyObj->segment.x_velocity, butterflyObj->segment.y_velocity, - butterflyObj->segment.z_velocity); + butterflyObj->x_velocity = sins_f(butterflyObj->trans.rotation.y_rotation) * -butterfly->unk108; + butterflyObj->z_velocity = coss_f(butterflyObj->trans.rotation.y_rotation) * -butterfly->unk108; + move_object(butterflyObj, butterflyObj->x_velocity, butterflyObj->y_velocity, butterflyObj->z_velocity); } } butterfly->unkFC = 1 - butterfly->unkFC; vertices = &butterfly->vertices[butterfly->unkFC * 6]; var_v1 = sp64 == 0 ? 7 : 8; - xPos = sins_s16((butterflyObj->segment.animFrame << var_v1)) >> 10; - yPos = coss_s16((butterflyObj->segment.animFrame << var_v1)) >> 10; + xPos = sins_s16((butterflyObj->animFrame << var_v1)) >> 10; + yPos = coss_s16((butterflyObj->animFrame << var_v1)) >> 10; if (xPos < 0) { xPos = -xPos; } @@ -6161,17 +6112,17 @@ void obj_init_midifade(Object *obj, LevelObjectEntry_MidiFade *entry) { f32 tempF2; s32 i; - obj->segment.trans.rotation.y_rotation = entry->angleY << 8 << 2; // Two shifts needed to skip a register. - midiFade = &obj->unk64->midi_fade; + obj->trans.rotation.y_rotation = entry->angleY << 8 << 2; // Two shifts needed to skip a register. + midiFade = obj->midi_fade; scaleF = (f32) (((s32) entry->scale) & 0xFFFF); if (scaleF < 1.0f) { scaleF = 1.0f; } scaleF /= 8; - obj->segment.trans.scale = obj->segment.header->scale * (scaleF); - transform.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - transform.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; - transform.rotation.z_rotation = obj->segment.trans.rotation.z_rotation; + obj->trans.scale = obj->header->scale * (scaleF); + transform.rotation.y_rotation = obj->trans.rotation.y_rotation; + transform.rotation.x_rotation = obj->trans.rotation.x_rotation; + transform.rotation.z_rotation = obj->trans.rotation.z_rotation; transform.scale = 1.0f; transform.x_position = 0.0f; transform.y_position = 0.0f; @@ -6181,8 +6132,7 @@ void obj_init_midifade(Object *obj, LevelObjectEntry_MidiFade *entry) { midiFade->unk8 = ox; midiFade->unkC = oy; midiFade->unk10 = oz; - midiFade->unk14 = -((obj->segment.trans.x_position * ox) + (obj->segment.trans.y_position * oy) + - (obj->segment.trans.z_position * oz)); + midiFade->unk14 = -((obj->trans.x_position * ox) + (obj->trans.y_position * oy) + (obj->trans.z_position * oz)); midiFade->unk2 = entry->unk1A; midiFade->unk40 = entry->unk1B; @@ -6220,8 +6170,8 @@ void obj_init_midifade(Object *obj, LevelObjectEntry_MidiFade *entry) { maxZ = vertex->z; } } - cosYRot = coss_f(obj->segment.trans.rotation.y_rotation); - sinYRot = sins_f(obj->segment.trans.rotation.y_rotation); + cosYRot = coss_f(obj->trans.rotation.y_rotation); + sinYRot = sins_f(obj->trans.rotation.y_rotation); tempF3 = minX; minX = (minX * cosYRot) + (minZ * sinYRot); minZ = (minZ * cosYRot) - (tempF3 * sinYRot); @@ -6238,17 +6188,17 @@ void obj_init_midifade(Object *obj, LevelObjectEntry_MidiFade *entry) { maxZ = minZ; minZ = tempF2; } - midiFade->unk18 = (obj->segment.trans.scale * minX) + obj->segment.trans.x_position; - midiFade->unk1C = (obj->segment.trans.scale * minY) + obj->segment.trans.y_position; - midiFade->unk20 = (obj->segment.trans.scale * minZ) + obj->segment.trans.z_position; - midiFade->unk24 = (obj->segment.trans.scale * maxX) + obj->segment.trans.x_position; - midiFade->unk28 = (obj->segment.trans.scale * maxY) + obj->segment.trans.y_position; - midiFade->unk2C = (obj->segment.trans.scale * maxZ) + obj->segment.trans.z_position; + midiFade->unk18 = (obj->trans.scale * minX) + obj->trans.x_position; + midiFade->unk1C = (obj->trans.scale * minY) + obj->trans.y_position; + midiFade->unk20 = (obj->trans.scale * minZ) + obj->trans.z_position; + midiFade->unk24 = (obj->trans.scale * maxX) + obj->trans.x_position; + midiFade->unk28 = (obj->trans.scale * maxY) + obj->trans.y_position; + midiFade->unk2C = (obj->trans.scale * maxZ) + obj->trans.z_position; midiFade->unk1 = 0; } void obj_init_midifadepoint(Object *obj, LevelObjectEntry_MidiFadePoint *entry) { - Object_MidiFadePoint *obj64; + Object_MidiFadePoint *midi_fade_point; ModelInstance *modInst; ObjectModel *objModel; Vertex *vertex; @@ -6258,19 +6208,19 @@ void obj_init_midifadepoint(Object *obj, LevelObjectEntry_MidiFadePoint *entry) f32 z; f32 dist; - obj64 = &obj->unk64->midi_fade_point; - obj64->unk2 = entry->unkA; - obj64->unk0 = entry->unk8; - obj64->unk1C = entry->unk1C; - if (obj64->unk2 < obj64->unk0) { - obj64->unk2 = obj64->unk0 + 10; + midi_fade_point = obj->midi_fade_point; + midi_fade_point->unk2 = entry->unkA; + midi_fade_point->unk0 = entry->unk8; + midi_fade_point->unk1C = entry->unk1C; + if (midi_fade_point->unk2 < midi_fade_point->unk0) { + midi_fade_point->unk2 = midi_fade_point->unk0 + 10; } - obj->segment.trans.rotation.z_rotation = 0; - obj->segment.trans.rotation.x_rotation = 0; - obj->segment.trans.rotation.y_rotation = 0; + obj->trans.rotation.z_rotation = 0; + obj->trans.rotation.x_rotation = 0; + obj->trans.rotation.y_rotation = 0; for (i = 0; i < 15; i++) { - obj64->unkC[i] = entry->unkC[i]; + midi_fade_point->unkC[i] = entry->unkC[i]; } modInst = obj->modelInstances[0]; @@ -6280,13 +6230,13 @@ void obj_init_midifadepoint(Object *obj, LevelObjectEntry_MidiFadePoint *entry) y = vertex->y; z = vertex->z; dist = sqrtf(((x * x) + (y * y)) + (z * z)); - obj64->unk4 = entry->unk8 / dist; - obj64->unk8 = entry->unkA / dist; - obj->segment.trans.scale = obj64->unk8; + midi_fade_point->unk4 = entry->unk8 / dist; + midi_fade_point->unk8 = entry->unkA / dist; + obj->trans.scale = midi_fade_point->unk8; } void obj_init_midichset(Object *obj, LevelObjectEntry_Midichset *entry) { - unk80042014_arg0_64 *temp = (unk80042014_arg0_64 *) obj->unk64; + Object_MidiChannelSet *temp = obj->midi_channel_set; temp->unk0 = entry->unk8; temp->unk2 = entry->unkA; temp->unk3 = entry->unkB; @@ -6295,7 +6245,7 @@ void obj_init_midichset(Object *obj, LevelObjectEntry_Midichset *entry) { /* Official name: bubblerInit */ void obj_init_bubbler(Object *obj, LevelObjectEntry_Bubbler *entry) { emitter_change_settings(obj->particleEmitter, entry->particleBehaviourID, entry->particlePropertyID, 0, 0, 0); - obj->properties.common.unk0 = entry->particleDensity; + obj->properties.bubbler.unk0 = entry->particleDensity; } /** @@ -6304,7 +6254,7 @@ void obj_init_bubbler(Object *obj, LevelObjectEntry_Bubbler *entry) { * This rolls a random number and starts emitting particles based on that for variable density. */ void obj_loop_bubbler(Object *obj, s32 updateRate) { - if (obj->properties.common.unk0 >= rand_range(0, 1024)) { + if (obj->properties.bubbler.unk0 >= rand_range(0, 1024)) { obj->particleEmittersEnabled = OBJ_EMIT_1; } else { obj->particleEmittersEnabled = OBJ_EMIT_NONE; @@ -6316,8 +6266,8 @@ void obj_loop_bubbler(Object *obj, s32 updateRate) { void obj_init_boost(Object *obj, LevelObjectEntry_Boost2 *entry) { Object_Boost *asset20 = (Object_Boost *) get_misc_asset(ASSET_MISC_20); - obj->unk64 = (Object_64 *) &asset20[entry->unk8[0]]; - obj->segment.level_entry = NULL; + obj->boost = &asset20[entry->unk8[0]]; + obj->level_entry = NULL; } void obj_init_unknown94(UNUSED Object *obj, UNUSED LevelObjectEntry_Unknown94 *entry, UNUSED s32 arg2) { @@ -6343,8 +6293,8 @@ void obj_loop_rangetrigger(Object *obj, s32 updateRate) { LevelObjectEntry_RangeTrigger *entry; Object *objs[8]; - 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) { + entry = &obj->level_entry->rangeTrigger; + if (obj_dist_racer(obj->trans.x_position, 0, obj->trans.z_position, entry->radius, 1, objs) > 0) { obj->particleEmittersEnabled = entry->particleFlags; } else { obj->particleEmittersEnabled = OBJ_EMIT_NONE; @@ -6361,21 +6311,21 @@ void obj_loop_rangetrigger(Object *obj, s32 updateRate) { void obj_init_frog(Object *obj, LevelObjectEntry_Frog *entry) { Object_Frog *frog; - frog = &obj->unk64->frog; + frog = obj->frog; frog->drumstick = entry->drumstick; - frog->homeX = obj->segment.trans.x_position; - frog->homeY = obj->segment.trans.y_position; - frog->homeZ = obj->segment.trans.z_position; + frog->homeX = obj->trans.x_position; + frog->homeY = obj->trans.y_position; + frog->homeZ = obj->trans.z_position; frog->homeRadius = entry->homeRadius; frog->homeRadiusSquare = frog->homeRadius * frog->homeRadius; frog->action = FROG_IDLE; - frog->hopStartX = obj->segment.trans.x_position; - frog->hopStartZ = obj->segment.trans.z_position; + frog->hopStartX = obj->trans.x_position; + frog->hopStartZ = obj->trans.z_position; frog->squishCooldown = 0; frog->scaleY = 1.0f; if (frog->drumstick) { - obj->segment.object.modelIndex = 1; + obj->modelIndex = 1; /** * Don't spawn the chicken frog if drumstick is already unlocked, or * if the player hasn't completed the trophy races yet. @@ -6384,7 +6334,7 @@ void obj_init_frog(Object *obj, LevelObjectEntry_Frog *entry) { free_object(obj); } } else { - obj->segment.object.modelIndex = 0; + obj->modelIndex = 0; } } @@ -6413,7 +6363,7 @@ void obj_loop_frog(Object *obj, s32 updateRate) { if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } - frog = &obj->unk64->frog; + frog = obj->frog; switch (frog->action) { case FROG_IDLE: @@ -6421,15 +6371,15 @@ void obj_loop_frog(Object *obj, s32 updateRate) { if (frog->squishCooldown > 0) { frog->squishCooldown -= updateRate; } - if (obj_dist_racer(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, 96.0f, 1, &racerObj) > 0) { - diffX = obj->segment.trans.x_position - racerObj->segment.trans.x_position; - diffY = obj->segment.trans.y_position - racerObj->segment.trans.y_position; - diffZ = obj->segment.trans.z_position - racerObj->segment.trans.z_position; + if (obj_dist_racer(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, 96.0f, 1, + &racerObj) > 0) { + diffX = obj->trans.x_position - racerObj->trans.x_position; + diffY = obj->trans.y_position - racerObj->trans.y_position; + diffZ = obj->trans.z_position - racerObj->trans.z_position; if (frog->squishCooldown <= 0 && (diffX * diffX) + (diffY * diffY) + (diffZ * diffZ) < 40.0f * 40.0f) { if (frog->drumstick) { - audspat_play_sound_at_position(SOUND_VOICE_DRUMSTICK_POSITIVE2, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, + audspat_play_sound_at_position(SOUND_VOICE_DRUMSTICK_POSITIVE2, obj->trans.x_position, + obj->trans.y_position, obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); set_eeprom_settings_value(2); set_magic_code_flags(CHEAT_CONTROL_DRUMSTICK); @@ -6438,9 +6388,8 @@ void obj_loop_frog(Object *obj, s32 updateRate) { break; } else { frog->action = FROG_SQUISH; - audspat_play_sound_at_position(SOUND_SPLAT, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(SOUND_SPLAT, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } } else { frog->forwardVel = 72.0f; @@ -6455,15 +6404,15 @@ void obj_loop_frog(Object *obj, s32 updateRate) { if (frog->hopTimer < 0) { hopping = TRUE; frog->forwardVel = rand_range(40, 72); - frog->hopDirection = rand_range(-0x4000, 0x4000) + obj->segment.trans.rotation.y_rotation; + frog->hopDirection = rand_range(-0x4000, 0x4000) + obj->trans.rotation.y_rotation; } } if (hopping) { for (i = 0, var_v1 = FALSE; i < 4 && var_v1 == FALSE; i++) { frog->hopTargetX = sins_f(frog->hopDirection) * frog->forwardVel; frog->hopTargetZ = coss_f(frog->hopDirection) * -frog->forwardVel; - diffX = (obj->segment.trans.x_position + frog->hopTargetX) - frog->homeX; - diffZ = (obj->segment.trans.z_position + frog->hopTargetZ) - frog->homeZ; + diffX = (obj->trans.x_position + frog->hopTargetX) - frog->homeX; + diffZ = (obj->trans.z_position + frog->hopTargetZ) - frog->homeZ; if ((diffX * diffX) + (diffZ * diffZ) < frog->homeRadiusSquare) { var_v1 = TRUE; } else { @@ -6471,24 +6420,23 @@ void obj_loop_frog(Object *obj, s32 updateRate) { } } if (var_v1 == FALSE) { - diffX = frog->homeX - obj->segment.trans.x_position; - diffZ = frog->homeZ - obj->segment.trans.z_position; + diffX = frog->homeX - obj->trans.x_position; + diffZ = frog->homeZ - obj->trans.z_position; frog->hopDirection = arctan2_f(diffX, diffZ); } if (frog->drumstick) { - audspat_play_sound_at_position(SOUND_VOICE_DRUMSTICK_POSITIVE6, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, + audspat_play_sound_at_position(SOUND_VOICE_DRUMSTICK_POSITIVE6, obj->trans.x_position, + obj->trans.y_position, obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } else { - audspat_play_sound_at_position(SOUND_RIBBIT, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(SOUND_RIBBIT, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } frog->action = FROG_HOP; - frog->hopStartX = obj->segment.trans.x_position; - frog->hopStartZ = obj->segment.trans.z_position; + frog->hopStartX = obj->trans.x_position; + frog->hopStartZ = obj->trans.z_position; frog->hopFrame = 32; - obj->segment.trans.rotation.y_rotation = -frog->hopDirection; + obj->trans.rotation.y_rotation = -frog->hopDirection; } default: break; @@ -6502,26 +6450,25 @@ void obj_loop_frog(Object *obj, s32 updateRate) { frog->hopTimer = rand_range(0, 300); frog->hopFrame = 0; } - obj->segment.animFrame = ((32 - frog->hopFrame) << 3) / 3; + obj->animFrame = ((32 - frog->hopFrame) << 3) / 3; cosine = (coss_f(frog->hopFrame << 10) + 1.0f) * 0.5f; - obj->segment.trans.x_position = frog->hopStartX; - obj->segment.trans.z_position = frog->hopStartZ; - obj->segment.x_velocity = frog->hopTargetX * cosine; - obj->segment.z_velocity = frog->hopTargetZ * cosine; + obj->trans.x_position = frog->hopStartX; + obj->trans.z_position = frog->hopStartZ; + obj->x_velocity = frog->hopTargetX * cosine; + obj->z_velocity = frog->hopTargetZ * cosine; ignore_bounds_check(); - move_object(obj, obj->segment.x_velocity, 0.0f, obj->segment.z_velocity); - if (func_8002BAB0(obj->segment.object.segmentID, obj->segment.trans.x_position, - obj->segment.trans.z_position, colY) != 0) { - obj->segment.trans.y_position = 0.0f; + move_object(obj, obj->x_velocity, 0.0f, obj->z_velocity); + if (func_8002BAB0(obj->segmentID, obj->trans.x_position, obj->trans.z_position, colY) != 0) { + obj->trans.y_position = 0.0f; ignore_bounds_check(); move_object(obj, 0.0f, (f32) colY[0], 0.0f); } if (frog->squishCooldown <= 0 && (frog->hopFrame < 6 || frog->hopFrame >= 27)) { - if (obj_dist_racer(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, 40.0f, 0, &racerObj)) { + if (obj_dist_racer(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, 40.0f, 0, + &racerObj)) { if (frog->drumstick) { - audspat_play_sound_at_position(SOUND_VOICE_DRUMSTICK_POSITIVE2, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, + audspat_play_sound_at_position(SOUND_VOICE_DRUMSTICK_POSITIVE2, obj->trans.x_position, + obj->trans.y_position, obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); set_eeprom_settings_value(2); set_magic_code_flags(CHEAT_CONTROL_DRUMSTICK); @@ -6529,9 +6476,8 @@ void obj_loop_frog(Object *obj, s32 updateRate) { free_object(obj); } else { frog->action = FROG_SQUISH; - audspat_play_sound_at_position(SOUND_SPLAT, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(SOUND_SPLAT, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } } } @@ -6548,9 +6494,8 @@ void obj_loop_frog(Object *obj, s32 updateRate) { frog->hopTimer -= updateRate; if (frog->hopTimer < 0) { frog->action = FROG_UNSQUISH; - audspat_play_sound_at_position(SOUND_PLOP2, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(SOUND_PLOP2, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } break; case FROG_UNSQUISH: @@ -6567,19 +6512,19 @@ void obj_loop_frog(Object *obj, s32 updateRate) { } void obj_loop_pigrocketeer(Object *obj, s32 updateRate) { - Object *someObj; - Object_Wizpig2 *obj64; + Object *boostObj; + Object_Boost *boost; func_8001F460(obj, updateRate, obj); - someObj = racerfx_get_boost(BOOST_DEFAULT); + boostObj = racerfx_get_boost(BOOST_DEFAULT); - if (someObj != NULL) { - obj64 = &someObj->unk64->wizpig2; - someObj->properties.common.unk0 = 0; - if (obj64 != 0) { - obj64->unk72 += updateRate; - obj64->unk70 = 2; - obj64->unk74 = 1.0f; + if (boostObj != NULL) { + boost = boostObj->boost; + boostObj->properties.common.unk0 = 0; + if (boost != 0) { + boost->unk72 += updateRate; + boost->unk70 = 2; + boost->unk74 = 1.0f; func_8000B750(obj, -1, 2, 1, 1); } } @@ -6619,8 +6564,8 @@ void obj_loop_levelname(Object *obj, s32 updateRate) { racerObj = get_racer_object_by_port(PLAYER_ONE); if (racerObj != NULL) { - diffX = obj->segment.trans.x_position - racerObj->segment.trans.x_position; - diffZ = obj->segment.trans.z_position - racerObj->segment.trans.z_position; + diffX = obj->trans.x_position - racerObj->trans.x_position; + diffZ = obj->trans.z_position - racerObj->trans.z_position; properties = &obj->properties.levelName; if ((diffX * diffX) + (diffZ * diffZ) < properties->radius) { properties->opacity += updateRate * 16; @@ -6665,5 +6610,5 @@ void obj_loop_levelname(Object *obj, s32 updateRate) { void obj_loop_wizghosts(Object *obj, s32 updateRate) { func_8001F460(obj, updateRate, obj); - obj->segment.animFrame = (obj->segment.animFrame + (updateRate * 8)) & 0xFF; + obj->animFrame = (obj->animFrame + (updateRate * 8)) & 0xFF; } diff --git a/src/object_functions.h b/src/object_functions.h index b1d634b4..09658fea 100644 --- a/src/object_functions.h +++ b/src/object_functions.h @@ -10,15 +10,11 @@ #define WORLD_KEY_GRAB_CHECK_RADIUS 50 #define TIME_JIFFIES_PER_SECOND 60 -#define TIME_SECONDS(sec) sec * TIME_JIFFIES_PER_SECOND +#define TIME_SECONDS(sec) sec *TIME_JIFFIES_PER_SECOND #define U8_ANGLE_TO_U16(x) (x << 6 << 4) #define TEX_INDEX_NO_TEXTURE 0xFF -enum BananaBehaviour { - BANANA_COLLECTED = -1, - BANANA_IDLE, - BANANA_DROPPED -}; +enum BananaBehaviour { BANANA_COLLECTED = -1, BANANA_IDLE, BANANA_DROPPED }; enum WeaponBehaviour { WEAPON_DROPPED, @@ -29,11 +25,7 @@ enum WeaponBehaviour { WEAPON_STATUS_5 }; -enum DoorStatus { - DOOR_CLOSING = -1, - DOOR_CLOSED, - DOOR_OPENING -}; +enum DoorStatus { DOOR_CLOSING = -1, DOOR_CLOSED, DOOR_OPENING }; enum BossRaceWarps { WARP_STANDARD = -1, @@ -75,188 +67,14 @@ enum SilvereCoinBehaviours { SILVER_COIN_INACTIVE }; -enum EggPickupStatus { - EGG_SPAWNED, - EGG_COLLECTED, - EGG_MOVING, - EGG_IN_BASE, - EGG_HATCHED -}; +enum EggPickupStatus { EGG_SPAWNED, EGG_COLLECTED, EGG_MOVING, EGG_IN_BASE, EGG_HATCHED }; -enum FrogActions { - FROG_IDLE, - FROG_HOP, - FROG_SQUISH, - FROG_FLAT, - FROG_UNSQUISH -}; - -typedef struct unk80034B4C { - u8 pad0[0x18]; - s16 unk18; - u8 pad1A[0x5E]; - s32 unk78; -} unk80034B4C; - -typedef struct unk80035E20 { - u8 pad0[0x40]; - s32 unk40; - u8 pad44[0x34]; - s32 unk78; - s32 unk7C; -} unk80035E20; - -typedef struct unk80037578 { - u8 pad0[0x78]; - s32 unk78; - s32 unk7C; -} unk80037578; - -typedef struct unk80037624 { - u8 pad0[6]; - s16 unk6; -} unk80037624; - -/* Size: 12 bytes */ -typedef struct LevelObjectEntry800376E0 { - LevelObjectEntryCommon common; - s8 unk8; - s8 unk9; - s8 unkA; -} LevelObjectEntry800376E0; - -typedef struct unk80037D08_arg0_64 { - u8 pad0[0x2A]; - s16 unk2A; -} unk80037D08_arg0_64; - -typedef struct unk80037D08_arg0 { - u8 pad0[0x64]; - unk80037D08_arg0_64 *unk64; -} unk80037D08_arg0; - -typedef struct unk80038B74 { - u8 pad0[8]; - s8 unk8; -} unk80038B74; - -typedef struct unk80039160 { - u8 pad0[0x78]; - s32 unk78; -} unk80039160; - -typedef struct unk80039190 { - u16 unk0; - u8 pad2[0x76]; - s32 unk78; - s32 unk7C; -} unk80039190; - -typedef struct unk8003CF18 { - u8 pad1A[0x78]; - f32 unk78; -} unk8003CF18; - -typedef struct unk8003D038 { - u8 pad0[0x18]; - s16 unk18; - u8 pad1A[0x5E]; - s32 unk78; -} unk8003D038; - -typedef struct unk8003D3EC { - u8 pad0[0x18]; - u16 unk18; -} unk8003D3EC; - -typedef struct unk8003FC44 { - s8 unk0; - s8 unk1; - s16 unk2; - s16 unk4; - s16 unk6; - s8 unk7; -} unk8003FC44; - -typedef struct LevelObjectEntry8003FEF4 { - LevelObjectEntryCommon common; - u8 unk8; - u8 unk9; - u16 unkA; - u8 unkC; - u8 unkD; - u16 unkE; - u8 unk10; - u8 unk11; - u8 unk12; - u8 unk13; -} LevelObjectEntry8003FEF4; - -typedef struct LevelObjectEntry8004001C { - LevelObjectEntryCommon common; - u8 unk8; - u8 unk9; - u8 unkA; -} LevelObjectEntry8004001C; - -typedef struct unk80040800 { - u8 pad0[0x78]; - f32 unk78; -} unk80040800; - -typedef struct unk80042014_arg0_64 { - u16 unk0; - u8 unk2; - u8 unk3; -} unk80042014_arg0_64; - -typedef struct unk80042014_arg0 { - u8 pad0[0x64]; - unk80042014_arg0_64 *unk64; -} unk80042014_arg0; - -typedef struct unk80042014_arg1 { - u8 pad0[8]; - u16 unk8; - u8 unkA; - u8 unkB; -} unk80042014_arg1; - -typedef struct unk8004210C { - u8 pad0[0x3C]; - s32 unk3C; - u8 pad40[0x24]; - s32 unk64; -} unk8004210C; - -typedef struct unk80042A1C { - u8 pad0[0x78]; - f32 unk78; - s16 unk7C; - s16 unk7E; -} unk80042A1C; - -typedef struct unk80042CD0 { - u8 pad0[0x18]; - s16 unk18; -} unk80042CD0; - -//void rumble_set(s16 obj, u8 arg1); - -typedef struct unk80041A90_MidiFade { - s16 unk0; // Y rotation - s16 unk2; // X rotation - s16 unk4; // Z rotation - f32 unk8; - f32 unkC; - f32 unk10; - f32 unk14; -} unk80041A90_MidiFade; +enum FrogActions { FROG_IDLE, FROG_HOP, FROG_SQUISH, FROG_FLAT, FROG_UNSQUISH }; typedef struct VertexPosition { -/* 0x00 */ s16 x; -/* 0x02 */ s16 y; -/* 0x04 */ s16 z; + /* 0x00 */ s16 x; + /* 0x02 */ s16 y; + /* 0x04 */ s16 z; } VertexPosition; extern Triangle D_800DCAA8[8]; @@ -371,7 +189,7 @@ void obj_init_levelname(Object *obj, LevelObjectEntry_LevelName *entry); void obj_loop_wizghosts(Object *obj, s32 updateRate); void obj_loop_ttdoor(Object *obj, s32 updateRate); void obj_loop_trophycab(Object *obj, s32 updateRate); -void obj_loop_wizpigship(Object* wizShipObj, s32 updateRate); +void obj_loop_wizpigship(Object *wizShipObj, s32 updateRate); void obj_loop_silvercoin(Object *obj, s32 updateRate); void obj_loop_bombexplosion(Object *obj, s32 updateRate); void obj_loop_flycoin(Object *obj, s32 updateRate); @@ -435,9 +253,8 @@ void obj_init_fish(Object *fishObj, LevelObjectEntry_Fish *fishEntry, s32 param) void obj_init_midifade(Object *obj, LevelObjectEntry_MidiFade *entry); void obj_loop_butterfly(Object *butterflyObj, s32 updateRate); s32 ainode_find_nearest(f32 diffX, f32 diffY, f32 diffZ, s32 useElevation); -void func_8000CBF0(Object*, s32); -void try_to_collect_egg(Object *, Object_CollectEgg*); - +void func_8000CBF0(Object *, s32); +void try_to_collect_egg(Object *, Object_CollectEgg *); s32 func_8001F3EC(s32); s32 func_80021600(s32); diff --git a/src/object_models.c b/src/object_models.c index 6f13e777..5b0e6540 100644 --- a/src/object_models.c +++ b/src/object_models.c @@ -952,32 +952,32 @@ void func_80061C0C(Object *obj) { ModelInstance *modInst; s32 var_v1; - if (obj->segment.object.modelIndex < 0) { - obj->segment.object.modelIndex = 0; + if (obj->modelIndex < 0) { + obj->modelIndex = 0; } - var_v1 = obj->segment.header->numberOfModelIds - 1; - if (var_v1 < obj->segment.object.modelIndex) { - obj->segment.object.modelIndex = var_v1; + var_v1 = obj->header->numberOfModelIds - 1; + if (var_v1 < obj->modelIndex) { + obj->modelIndex = var_v1; } - modInst = obj->modelInstances[obj->segment.object.modelIndex]; + modInst = obj->modelInstances[obj->modelIndex]; mdl = modInst->objModel; if (modInst->objModel->animations != NULL) { - if (obj->segment.object.animationID < 0) { - obj->segment.object.animationID = 0; + if (obj->animationID < 0) { + obj->animationID = 0; } - if (obj->segment.object.animationID >= mdl->numberOfAnimations) { - obj->segment.object.animationID = mdl->numberOfAnimations - 1; + if (obj->animationID >= mdl->numberOfAnimations) { + obj->animationID = mdl->numberOfAnimations - 1; } if (mdl->numberOfAnimations > 0) { - var_v1 = mdl->animations[obj->segment.object.animationID].animLength - 2; + var_v1 = mdl->animations[obj->animationID].animLength - 2; } else { var_v1 = 0; } - if (obj->segment.animFrame >> 4 < 0) { - obj->segment.animFrame = var_v1; + if (obj->animFrame >> 4 < 0) { + obj->animFrame = var_v1; } - if (var_v1 < obj->segment.animFrame >> 4) { - obj->segment.animFrame = 0; + if (var_v1 < obj->animFrame >> 4) { + obj->animFrame = 0; modInst->animationID = -1; } } diff --git a/src/objects.c b/src/objects.c index 71b5239b..714686c9 100644 --- a/src/objects.c +++ b/src/objects.c @@ -578,17 +578,16 @@ void func_8000B750(Object *racerObj, s32 racerIndex, s32 vehicleIDPrev, s32 boos gNumOfBoostTris += BOOST_TRI_COUNT; } gBoostEffectObjects[racerIndex]->properties.boost.obj = racerObj; - gBoostEffectObjects[racerIndex]->segment.trans.x_position = 0.0f; - gBoostEffectObjects[racerIndex]->segment.trans.y_position = 0.0f; - gBoostEffectObjects[racerIndex]->segment.trans.z_position = 0.0f; + gBoostEffectObjects[racerIndex]->trans.x_position = 0.0f; + gBoostEffectObjects[racerIndex]->trans.y_position = 0.0f; + gBoostEffectObjects[racerIndex]->trans.z_position = 0.0f; sp74.x = boostData->position.x; sp74.y = boostData->position.y; sp74.z = boostData->position.z; - vec3f_rotate(&racerObj->segment.trans.rotation, &sp74); + vec3f_rotate(&racerObj->trans.rotation, &sp74); ignore_bounds_check(); - move_object(gBoostEffectObjects[racerIndex], racerObj->segment.trans.x_position + sp74.f[0], - racerObj->segment.trans.y_position + sp74.f[1], - racerObj->segment.trans.z_position + sp74.f[2]); + move_object(gBoostEffectObjects[racerIndex], racerObj->trans.x_position + sp74.f[0], + racerObj->trans.y_position + sp74.f[1], racerObj->trans.z_position + sp74.f[2]); } if (arg4 != FALSE) { D_8011B068[racerIndex] = FALSE; @@ -625,7 +624,7 @@ void racerfx_update(s32 updateRate) { if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2f; } - racer = &(*gRacers)[i]->unk64->racer; + racer = (*gRacers)[i]->racer; boostObj = &asset20[racer->racerIndex]; if (racer->shieldTimer != 0) { gShieldSineTime[racer->racerIndex] += updateRate; @@ -1131,16 +1130,16 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { } for (i2 = 0; i2 < gObjectCount; i2++) { curObj = gObjPtrList[i2]; - if (!(curObj->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { + if (!(curObj->trans.flags & OBJ_FLAGS_PARTICLE)) { if (curObj->behaviorId == BHV_SETUP_POINT) { if (arg1 == (u32) curObj->properties.setupPoint.entranceID) { if (curObj->properties.setupPoint.racerIndex < 8) { - spF4[curObj->properties.setupPoint.racerIndex] = curObj->segment.trans.x_position; - spD4[curObj->properties.setupPoint.racerIndex] = curObj->segment.trans.y_position; - spB4[curObj->properties.setupPoint.racerIndex] = curObj->segment.trans.z_position; - sp94[curObj->properties.setupPoint.racerIndex] = curObj->segment.trans.rotation.y_rotation; + spF4[curObj->properties.setupPoint.racerIndex] = curObj->trans.x_position; + spD4[curObj->properties.setupPoint.racerIndex] = curObj->trans.y_position; + spB4[curObj->properties.setupPoint.racerIndex] = curObj->trans.z_position; + sp94[curObj->properties.setupPoint.racerIndex] = curObj->trans.rotation.y_rotation; } - tempVehicle = curObj->segment.level_entry->setupPoint.vehicle; + tempVehicle = curObj->level_entry->setupPoint.vehicle; if (tempVehicle != -1) { vehicle = tempVehicle; } @@ -1229,8 +1228,8 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { } } } - if (((!(curObj->segment.trans.rotation.y_rotation)) && (!(curObj->segment.trans.rotation.y_rotation))) && - (!(curObj->segment.trans.rotation.y_rotation))) {} + if (((!(curObj->trans.rotation.y_rotation)) && (!(curObj->trans.rotation.y_rotation))) && + (!(curObj->trans.rotation.y_rotation))) {} entry = mempool_alloc_safe(sizeof(LevelObjectEntry_Unk8000CC7C), COLOUR_TAG_YELLOW); entry->unkC = 0; entry->unkA = 0; @@ -1312,12 +1311,12 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { model_anim_offset(0); } newRacerObj = spawn_object((LevelObjectEntryCommon *) entry, spawnObjFlags); - newRacerObj->segment.trans.rotation.y_rotation = sp94[i6]; + newRacerObj->trans.rotation.y_rotation = sp94[i6]; (*gRacers)[i6] = newRacerObj; gRacersByPosition[i6] = newRacerObj; gRacersByPort[var_s4] = newRacerObj; - curRacer = &newRacerObj->unk64->racer; - newRacerObj->segment.level_entry = NULL; + curRacer = newRacerObj->racer; + newRacerObj->level_entry = NULL; curRacer->vehicleID = vehicle; curRacer->vehicleIDPrev = vehicle; if (sp127 != -1 && sp127 != (s32) vehicle) { @@ -1383,7 +1382,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { if (get_game_mode() == GAMEMODE_INGAME) { for (j = 0; j < gObjectCount; j++) { curObj = gObjPtrList[j]; - tajFlags = curObj->segment.header->flags; + tajFlags = curObj->header->flags; if ((tajFlags & 0x20) && (gIsTimeTrial)) { free_object(curObj); } else if ((tajFlags & 0x40) && (numPlayers >= 2)) { @@ -1410,12 +1409,12 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { entry->common.z = spB4[0]; entry->unkC = sp94[0]; newRacerObj = spawn_object((LevelObjectEntryCommon *) entry, OBJECT_SPAWN_UNK01); - newRacerObj->segment.level_entry = NULL; + newRacerObj->level_entry = NULL; newRacerObj->behaviorId = BHV_TIMETRIAL_GHOST; newRacerObj->shadow->scale = 0.01f; newRacerObj->interactObj->flags = INTERACT_FLAGS_NONE; gGhostObjPlayer = newRacerObj; - newRacerObj->unk64->racer.transparency = 0x60; + newRacerObj->racer->transparency = 0x60; } if (timetrial_init_staff_ghost(get_current_map_id()) != 0) { objectId = D_800DC7B8[gMapDefaultVehicle * 10]; @@ -1426,24 +1425,24 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { entry->common.z = spB4[0]; entry->unkC = sp94[0]; newRacerObj = spawn_object((LevelObjectEntryCommon *) entry, OBJECT_SPAWN_UNK01); - newRacerObj->segment.level_entry = NULL; + newRacerObj->level_entry = NULL; newRacerObj->behaviorId = BHV_TIMETRIAL_GHOST; newRacerObj->shadow->scale = 0.01f; newRacerObj->interactObj->flags = INTERACT_FLAGS_NONE; gGhostObjStaff = newRacerObj; - newRacerObj->unk64->racer.transparency = 0x60; + newRacerObj->racer->transparency = 0x60; } } gEventCountdown = 100; for (j = 0; j < gNumRacers; j++) { curRacerObj = (*gRacers)[j]; - curRacer = &curRacerObj->unk64->racer; + curRacer = curRacerObj->racer; for (i2 = 0; i2 < 10; i2++) { update_player_racer(curRacerObj, LOGIC_30FPS); // Simulate 10 updates? } if (curRacer->playerIndex == PLAYER_COMPUTER) { var_s4 = (var_s4 + 1) & 1; - for (i2 = 0; i2 < curRacerObj->segment.header->numberOfModelIds; i2++) { + for (i2 = 0; i2 < curRacerObj->header->numberOfModelIds; i2++) { if (curRacerObj->modelInstances[i2] != NULL) { if (curRacerObj->modelInstances[i2]->animUpdateTimer != 0) { curRacerObj->modelInstances[i2]->animUpdateTimer = (var_s4 * 2); @@ -1452,7 +1451,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { } } else { // curRacer is a human racer. - for (i2 = 0; i2 < curRacerObj->segment.header->numberOfModelIds; i2++) { + for (i2 = 0; i2 < curRacerObj->header->numberOfModelIds; i2++) { if (curRacerObj->modelInstances[i2] != NULL) { if (curRacerObj->modelInstances[i2]->animUpdateTimer != 0) { curRacerObj->modelInstances[i2]->animUpdateTimer = 0; @@ -1461,10 +1460,10 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { } } if (get_filtered_cheats() & CHEAT_BIG_CHARACTERS) { - curRacerObj->segment.trans.scale *= 1.4f; + curRacerObj->trans.scale *= 1.4f; } if (get_filtered_cheats() & CHEAT_SMALL_CHARACTERS) { - curRacerObj->segment.trans.scale *= 0.714f; + curRacerObj->trans.scale *= 0.714f; } curRacer->stretch_height_cap = 1.0f; curRacer->stretch_height = 1.0f; @@ -1484,7 +1483,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { entry->common.z = 0; newRacerObj = spawn_object((LevelObjectEntryCommon *) entry, OBJECT_SPAWN_UNK01); newRacerObj->properties.common.unk0 = i2; - newRacerObj->segment.level_entry = NULL; + newRacerObj->level_entry = NULL; } } } @@ -1615,10 +1614,10 @@ void despawn_player_racer(Object *obj, s32 vehicleID) { gTransformObject = obj; gTransformTimer = 4; gOverworldVehicle = vehicleID; - gTransformPosX = obj->segment.trans.x_position; - gTransformPosY = obj->segment.trans.y_position; - gTransformPosZ = obj->segment.trans.z_position; - gTransformAngleY = obj->segment.trans.rotation.y_rotation; + gTransformPosX = obj->trans.x_position; + gTransformPosY = obj->trans.y_position; + gTransformPosZ = obj->trans.z_position; + gTransformAngleY = obj->trans.rotation.y_rotation; free_object(obj); gNumRacers = 0; } @@ -1664,7 +1663,7 @@ void transform_player_vehicle(void) { (*gRacers)[PLAYER_ONE] = player; gRacersByPort[PLAYER_ONE] = player; *gRacersByPosition = player; - racer = &player->unk64->racer; + racer = player->racer; racer->vehicleID = gOverworldVehicle; racer->vehicleIDPrev = gOverworldVehicle; racer->racerIndex = 0; @@ -1672,14 +1671,14 @@ void transform_player_vehicle(void) { racer->playerIndex = 0; racer->vehicleSound = 0; if (get_filtered_cheats() & CHEAT_BIG_CHARACTERS) { - player->segment.trans.scale *= 1.4f; + player->trans.scale *= 1.4f; } if (get_filtered_cheats() & CHEAT_SMALL_CHARACTERS) { - player->segment.trans.scale *= 0.714f; + player->trans.scale *= 0.714f; } - player->segment.level_entry = NULL; - player->segment.trans.rotation.y_rotation = gTransformAngleY; - player->segment.trans.y_position = gTransformPosY; + player->level_entry = NULL; + player->trans.rotation.y_rotation = gTransformAngleY; + player->trans.y_position = gTransformPosY; } /** @@ -1728,10 +1727,10 @@ UNUSED void func_8000E4E8(s32 index) { UNUSED s32 func_8000E558(Object *arg0) { s32 temp_v0; s32 new_var, new_var2; - if (arg0->segment.level_entry == NULL) { + if (arg0->level_entry == NULL) { return TRUE; } - temp_v0 = (s32) arg0->segment.level_entry; + temp_v0 = (s32) arg0->level_entry; new_var2 = (s32) D_8011AE98[0]; if ((temp_v0 >= new_var2) && (((D_8011AEA0[0] * 8) + new_var2) >= temp_v0)) { return FALSE; @@ -1777,11 +1776,11 @@ void func_8000E5EC(LevelObjectEntryCommon *arg0) { for (i = 0; i < gObjectCount; i++) { Object *obj = gObjPtrList[i]; - if (obj != NULL && obj->segment.level_entry != NULL) { - if ((s32) arg0 < (s32) obj->segment.level_entry && (s32) obj->segment.level_entry < end) { - obj->segment.level_entry = (LevelObjectEntry *) ((s32) obj->segment.level_entry - size); - } else if ((s32) arg0 == (s32) obj->segment.level_entry) { - obj->segment.level_entry = NULL; + if (obj != NULL && obj->level_entry != NULL) { + if ((s32) arg0 < (s32) obj->level_entry && (s32) obj->level_entry < end) { + obj->level_entry = (LevelObjectEntry *) ((s32) obj->level_entry - size); + } else if ((s32) arg0 == (s32) obj->level_entry) { + obj->level_entry = NULL; } } } @@ -1890,8 +1889,8 @@ UNUSED s32 particle_count(void) { } void add_particle_to_entity_list(Object *obj) { - obj->segment.trans.flags |= OBJ_FLAGS_PARTICLE; - func_800245B4(obj->segment.object.unk2C | (OBJ_FLAGS_PARTICLE | OBJ_FLAGS_INVISIBLE)); + obj->trans.flags |= OBJ_FLAGS_PARTICLE; + func_800245B4(obj->headerType | (OBJ_FLAGS_PARTICLE | OBJ_FLAGS_INVISIBLE)); gObjPtrList[gObjectCount++] = obj; if (1) {} // Fakematch gParticleCount++; @@ -1929,51 +1928,50 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { } curObj = (Object *) gSpawnObjectHeap; - curObj->segment.trans.flags = OBJ_FLAGS_UNK_0002; - curObj->segment.header = load_object_header(headerType); - if (curObj->segment.header == NULL) { + curObj->trans.flags = OBJ_FLAGS_UNK_0002; + curObj->header = load_object_header(headerType); + if (curObj->header == NULL) { return NULL; } - if (curObj->segment.header->flags & HEADER_FLAGS_UNK_0080) { - curObj->segment.trans.flags |= OBJ_FLAGS_UNK_0080; + if (curObj->header->flags & HEADER_FLAGS_UNK_0080) { + curObj->trans.flags |= OBJ_FLAGS_UNK_0080; } - if (curObj->segment.header->behaviorId == BHV_ROCKET_SIGNPOST && - (settings->cutsceneFlags & CUTSCENE_LIGHTHOUSE_ROCKET)) { + if (curObj->header->behaviorId == BHV_ROCKET_SIGNPOST && (settings->cutsceneFlags & CUTSCENE_LIGHTHOUSE_ROCKET)) { update_object_stack_trace(OBJECT_SPAWN, -1); return NULL; } - curObj->segment.trans.x_position = entry->x; - curObj->segment.trans.y_position = entry->y; - curObj->segment.trans.z_position = entry->z; - curObj->segment.object.segmentID = get_level_segment_index_from_position( - curObj->segment.trans.x_position, curObj->segment.trans.y_position, curObj->segment.trans.z_position); + curObj->trans.x_position = entry->x; + curObj->trans.y_position = entry->y; + curObj->trans.z_position = entry->z; + curObj->segmentID = get_level_segment_index_from_position(curObj->trans.x_position, curObj->trans.y_position, + curObj->trans.z_position); - curObj->segment.object.unk2C = headerType; - curObj->segment.level_entry = (LevelObjectEntry *) entry; + curObj->headerType = headerType; + curObj->level_entry = (LevelObjectEntry *) entry; curObj->objectID = objType; func_800245B4(objType); - curObj->segment.trans.scale = curObj->segment.header->scale; - curObj->segment.object.unk34 = curObj->segment.header->unk50 * curObj->segment.trans.scale; - curObj->segment.object.opacity = 255; - behaviourFlags = obj_init_property_flags(curObj->segment.header->behaviorId); - curObj->segment.header->unk52++; + curObj->trans.scale = curObj->header->scale; + curObj->unk34 = curObj->header->unk50 * curObj->trans.scale; + curObj->opacity = 255; + behaviourFlags = obj_init_property_flags(curObj->header->behaviorId); + curObj->header->unk52++; - assetCount = curObj->segment.header->numberOfModelIds; + assetCount = curObj->header->numberOfModelIds; - objType = curObj->segment.header->modelType; + objType = curObj->header->modelType; curObj->modelInstances = (ModelInstance **) &curObj[1]; if (spawnFlags & OBJECT_SPAWN_UNK10) { assetCount = 1; } i = 0; // a2 - switch (curObj->segment.header->behaviorId) { + switch (curObj->header->behaviorId) { case BHV_PARK_WARDEN: model_anim_offset(7); break; case BHV_ANIMATED_OBJECT_4: i = get_character_id_from_slot(PLAYER_ONE); - curObj->segment.object.modelIndex = i; + curObj->modelIndex = i; assetCount = i + 1; break; case BHV_UNK_5B: @@ -1982,13 +1980,13 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { if (i) { i--; assetCount = i + 1; - curObj->segment.object.modelIndex = i; + curObj->modelIndex = i; } break; case BHV_DYNAMIC_LIGHT_OBJECT_2: i = settings->wizpigAmulet; assetCount = i + 1; - curObj->segment.object.modelIndex = settings->wizpigAmulet; + curObj->modelIndex = settings->wizpigAmulet; break; case BHV_ROCKET_SIGNPOST_2: objType = settings->trophies; @@ -1998,15 +1996,15 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { } objType >>= 2; } - curObj->segment.object.modelIndex = i; + curObj->modelIndex = i; assetCount = i + 1; break; case BHV_GOLDEN_BALLOON: assetCount = 1; if (is_in_adventure_two()) { - curObj->segment.header->modelIds[0] = curObj->segment.header->modelIds[1]; + curObj->header->modelIds[0] = curObj->header->modelIds[1]; } - curObj->segment.header->numberOfModelIds = 1; + curObj->header->numberOfModelIds = 1; break; } if (!(spawnFlags & OBJECT_SPAWN_UNK02)) { @@ -2014,18 +2012,18 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { case ASSET_OBJECT_ID_POLYGOLDBALOON: assetCount = 1; if (is_in_adventure_two()) { - curObj->segment.header->modelIds[0] = curObj->segment.header->modelIds[1]; + curObj->header->modelIds[0] = curObj->header->modelIds[1]; } - curObj->segment.header->numberOfModelIds = 1; + curObj->header->numberOfModelIds = 1; break; case ASSET_OBJECT_ID_LEVELDOOR: if (is_in_adventure_two()) { for (i = 0; i < 5; i++) { - curObj->segment.header->modelIds[i] = curObj->segment.header->modelIds[i + 5]; + curObj->header->modelIds[i] = curObj->header->modelIds[i + 5]; } } assetCount = 5; - curObj->segment.header->numberOfModelIds = 5; + curObj->header->numberOfModelIds = 5; i = 0; break; } @@ -2039,7 +2037,7 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { } else if (i == 1 && (spawnFlags & OBJECT_SPAWN_UNK08)) { curObj->modelInstances[i] = NULL; } else { - curObj->modelInstances[i] = object_model_init(curObj->segment.header->modelIds[i], behaviourFlags); + curObj->modelInstances[i] = object_model_init(curObj->header->modelIds[i], behaviourFlags); if (curObj->modelInstances[i] == NULL) { failed = TRUE; } @@ -2048,7 +2046,7 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { } } else if (objType == OBJECT_MODEL_TYPE_MISC) { while (i < assetCount) { - curObj->textures[i] = load_texture(curObj->segment.header->modelIds[i]); + curObj->textures[i] = load_texture(curObj->header->modelIds[i]); if (curObj->textures[i] == NULL) { failed = TRUE; } @@ -2056,7 +2054,7 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { } } else { while (i < assetCount) { - curObj->sprites[i] = tex_load_sprite(curObj->segment.header->modelIds[i], 10); + curObj->sprites[i] = tex_load_sprite(curObj->header->modelIds[i], 10); if (curObj->sprites[i] == NULL) { failed = TRUE; } @@ -2069,8 +2067,8 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { return NULL; } - address = (u8 *) &curObj->modelInstances[curObj->segment.header->numberOfModelIds]; - address += get_object_property_size(curObj, (Object_64 *) address); + address = (u8 *) &curObj->modelInstances[curObj->header->numberOfModelIds]; + address += get_object_property_size(curObj, address); D_8011AE50 = NULL; D_8011AE54 = NULL; @@ -2104,17 +2102,17 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { if (behaviourFlags & OBJECT_BEHAVIOUR_UNK20) { address += func_8000FD34(curObj, (Object_5C *) address); } - if (curObj->segment.header->attachPointCount > 0 && curObj->segment.header->attachPointCount < 10) { + if (curObj->header->attachPointCount > 0 && curObj->header->attachPointCount < 10) { curObj->attachPoints = (AttachPoint *) address; address += sizeof(AttachPoint); } - if (curObj->segment.header->particleCount > 0) { + if (curObj->header->particleCount > 0) { address += obj_init_emitter(curObj, (ParticleEmitter *) address); } - if (curObj->segment.header->numLightSources > 0) { + if (curObj->header->numLightSources > 0) { curObj->lightData = (ObjectLight **) address; - address += curObj->segment.header->numLightSources * 4; + address += curObj->header->numLightSources * 4; } sizeOfobj = (s32) address - (s32) curObj; @@ -2155,8 +2153,9 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { curObj->shading = (ShadeProperties *) (((uintptr_t) curObj + (uintptr_t) curObj->shading) - (uintptr_t) gSpawnObjectHeap); } - if (curObj->unk64 != NULL) { - curObj->unk64 = (Object_64 *) (((uintptr_t) curObj + (uintptr_t) curObj->unk64) - (uintptr_t) gSpawnObjectHeap); + if (curObj->anyBehaviorData != NULL) { + curObj->anyBehaviorData = + (void *) (((uintptr_t) curObj + (uintptr_t) curObj->anyBehaviorData) - (uintptr_t) gSpawnObjectHeap); } if (curObj->interactObj != NULL) { curObj->interactObj = (ObjectInteraction *) (((uintptr_t) curObj + (uintptr_t) curObj->interactObj) - @@ -2169,11 +2168,11 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { curObj->attachPoints = (AttachPoint *) (((uintptr_t) curObj + (uintptr_t) curObj->attachPoints) - (uintptr_t) gSpawnObjectHeap); } - if (curObj->segment.header->particleCount > 0) { + if (curObj->header->particleCount > 0) { curObj->particleEmitter = (ParticleEmitter *) (((uintptr_t) curObj + (uintptr_t) curObj->particleEmitter) - (uintptr_t) gSpawnObjectHeap); } - if (curObj->segment.header->numLightSources > 0) { + if (curObj->header->numLightSources > 0) { curObj->lightData = (ObjectLight **) (((uintptr_t) curObj + (uintptr_t) curObj->lightData) - (uintptr_t) gSpawnObjectHeap); } @@ -2185,12 +2184,11 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { } run_object_init_func(curObj, entry, 0); if (curObj->interactObj != NULL) { - curObj->interactObj->x_position = curObj->segment.trans.x_position; - curObj->interactObj->y_position = curObj->segment.trans.y_position; - curObj->interactObj->z_position = curObj->segment.trans.z_position; + curObj->interactObj->x_position = curObj->trans.x_position; + curObj->interactObj->y_position = curObj->trans.y_position; + curObj->interactObj->z_position = curObj->trans.z_position; } - if (curObj->segment.header->attachPointCount > 0 && curObj->segment.header->attachPointCount < 10 && - obj_init_attachpoint(curObj)) { + if (curObj->header->attachPointCount > 0 && curObj->header->attachPointCount < 10 && obj_init_attachpoint(curObj)) { if (D_8011AE50 != NULL) { tex_free((TextureHeader *) (s32) D_8011AE50); } @@ -2205,7 +2203,7 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 spawnFlags) { } return NULL; } - if (curObj->segment.header->numLightSources > 0) { + if (curObj->header->numLightSources > 0) { light_setup_light_sources(curObj); } model_anim_offset(0); @@ -2244,8 +2242,8 @@ void objFreeAssets(Object *obj, s32 count, s32 objType) { */ void light_setup_light_sources(Object *obj) { s32 i; - for (i = 0; i < obj->segment.header->numLightSources; i++) { - obj->lightData[i] = add_object_light(obj, &obj->segment.header->unk24[i]); + for (i = 0; i < obj->header->numLightSources; i++) { + obj->lightData[i] = add_object_light(obj, &obj->header->unk24[i]); } } @@ -2258,23 +2256,23 @@ s32 init_object_shading(Object *obj, ShadeProperties *shadeData) { obj->shading = shadeData; returnSize = 0; - if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { + if (obj->header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { for (i = 0; obj->modelInstances[i] == NULL; i++) {} if (obj->modelInstances[i] != NULL && obj->modelInstances[i]->objModel->normals != NULL) { - set_shading_properties(obj->shading, obj->segment.header->shadeAmbient, obj->segment.header->shadeDiffuse, - 0, obj->segment.header->shadeAngleY, obj->segment.header->shadeAngleZ); - if (obj->segment.header->unk3D != 0) { - obj->shading->lightR = obj->segment.header->unk3A; - obj->shading->lightG = obj->segment.header->unk3B; - obj->shading->lightB = obj->segment.header->unk3C; - obj->shading->lightIntensity = obj->segment.header->unk3D; + set_shading_properties(obj->shading, obj->header->shadeAmbient, obj->header->shadeDiffuse, 0, + obj->header->shadeAngleY, obj->header->shadeAngleZ); + if (obj->header->unk3D != 0) { + obj->shading->lightR = obj->header->unk3A; + obj->shading->lightG = obj->header->unk3B; + obj->shading->lightB = obj->header->unk3C; + obj->shading->lightIntensity = obj->header->unk3D; obj->shading->lightDirX = -(obj->shading->shadowDirX >> 1); obj->shading->lightDirY = -(obj->shading->shadowDirY >> 1); obj->shading->lightDirZ = -(obj->shading->shadowDirZ >> 1); } returnSize = sizeof(ShadeProperties); } - } else if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { + } else if (obj->header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { obj->shading->unk0 = 1.0f; shadeData->lightR = 255; shadeData->lightG = 255; @@ -2295,11 +2293,11 @@ s32 obj_init_attachpoint(Object *obj) { s32 failed; attachPoint = obj->attachPoints; - attachPoint->count = obj->segment.header->attachPointCount; + attachPoint->count = obj->header->attachPointCount; attachPoint->count = attachPoint->count; // Fakematch? failed = FALSE; for (i = 0; i < attachPoint->count; i++) { - attachPoint->obj[i] = obj_spawn_attachment(obj->segment.header->vehiclePartIds[i ^ 0]); // i ^ 0 fakematch + attachPoint->obj[i] = obj_spawn_attachment(obj->header->vehiclePartIds[i ^ 0]); // i ^ 0 fakematch if (attachPoint->obj[i] == NULL) { failed = TRUE; } @@ -2308,15 +2306,14 @@ s32 obj_init_attachpoint(Object *obj) { for (i = 0; i < attachPoint->count; i++) { attachObj = attachPoint->obj[i]; if (attachObj != NULL) { - objFreeAssets(attachObj, attachObj->segment.header->numberOfModelIds, - attachObj->segment.header->modelType); - try_free_object_header(attachObj->segment.object.unk2C); + objFreeAssets(attachObj, attachObj->header->numberOfModelIds, attachObj->header->modelType); + try_free_object_header(attachObj->headerType); mempool_free(attachObj); } } return TRUE; } - attachPoint->unk2C = obj->segment.header->vehiclePartIndices; + attachPoint->unk2C = obj->header->vehiclePartIndices; return FALSE; } @@ -2325,8 +2322,8 @@ s32 obj_init_emitter(Object *obj, ParticleEmitter *emitter) { s32 i; obj->particleEmitter = emitter; - particleDataEntry = obj->segment.header->objectParticles; - for (i = 0; i < obj->segment.header->particleCount; i++) { + particleDataEntry = obj->header->objectParticles; + for (i = 0; i < obj->header->particleCount; i++) { if ((particleDataEntry[i].upper & 0xFFFF0000) == 0xFFFF0000) { emitter_init(&obj->particleEmitter[i], (particleDataEntry[i].upper >> 8) & 0xFF, particleDataEntry[i].upper & 0xFF); @@ -2336,7 +2333,7 @@ s32 obj_init_emitter(Object *obj, ParticleEmitter *emitter) { (particleDataEntry[i].lower >> 0x10) & 0xFFFF, particleDataEntry[i].lower & 0xFFFF); } } - return ((obj->segment.header->particleCount * sizeof(ParticleEmitter)) + 3) & ~3; + return ((obj->header->particleCount * sizeof(ParticleEmitter)) + 3) & ~3; } /** @@ -2348,15 +2345,15 @@ s32 init_object_shadow(Object *obj, ShadowData *shadow) { obj->shadow = shadow; shadow->texture = NULL; - objHeader = obj->segment.header; + objHeader = obj->header; if (objHeader->shadowGroup) { shadow->texture = load_texture(objHeader->unk34); - objHeader = obj->segment.header; + objHeader = obj->header; } shadow->scale = objHeader->shadowScale; shadow->meshStart = -1; D_8011AE50 = shadow->texture; - if (obj->segment.header->shadowGroup && shadow->texture == NULL) { + if (obj->header->shadowGroup && shadow->texture == NULL) { return 0; } return sizeof(ShadowData); @@ -2368,16 +2365,16 @@ s32 init_object_shadow(Object *obj, ShadowData *shadow) { */ s32 init_object_water_effect(Object *obj, WaterEffect *waterEffect) { obj->waterEffect = waterEffect; - waterEffect->scale = obj->segment.header->unk8; + waterEffect->scale = obj->header->unk8; waterEffect->textureFrame = 0; - waterEffect->animationSpeed = obj->segment.header->unk0 >> 8; + waterEffect->animationSpeed = obj->header->unk0 >> 8; waterEffect->texture = NULL; - if (obj->segment.header->waterEffectGroup) { - waterEffect->texture = load_texture(obj->segment.header->unk38); + if (obj->header->waterEffectGroup) { + waterEffect->texture = load_texture(obj->header->unk38); } waterEffect->meshStart = -1; D_8011AE54 = waterEffect->texture; - if (obj->segment.header->waterEffectGroup && waterEffect->texture == NULL) { + if (obj->header->waterEffectGroup && waterEffect->texture == NULL) { return 0; } return sizeof(WaterEffect); @@ -2433,29 +2430,29 @@ Object *obj_spawn_attachment(s32 objID) { for (i = 0; i < objSize; i++) { objectAsRawBytes[i] = 0; } // Must be one line! (Why not use bzero?) // clang-format on - object->segment.trans.flags = OBJ_FLAGS_UNK_0002; - object->segment.header = objHeader; - object->segment.object.unk2C = objID; + object->trans.flags = OBJ_FLAGS_UNK_0002; + object->header = objHeader; + object->headerType = objID; object->objectID = objID; - object->segment.trans.scale = objHeader->scale; + object->trans.scale = objHeader->scale; if (objHeader->flags & HEADER_FLAGS_UNK_0080) { - object->segment.trans.flags |= OBJ_FLAGS_UNK_0080; + object->trans.flags |= OBJ_FLAGS_UNK_0080; } - numModelIds = object->segment.header->numberOfModelIds; - modelType = object->segment.header->modelType; + numModelIds = object->header->numberOfModelIds; + modelType = object->header->modelType; object->modelInstances = (ModelInstance **) &object[1]; failedToLoadModel = FALSE; if (modelType == OBJECT_MODEL_TYPE_3D_MODEL) { for (i = 0; i < numModelIds; i++) { - object->modelInstances[i] = object_model_init(object->segment.header->modelIds[i], 0); + object->modelInstances[i] = object_model_init(object->header->modelIds[i], 0); if (object->modelInstances[i] == NULL) { failedToLoadModel = TRUE; } } } else { for (i = 0; i < numModelIds; i++) { - object->sprites[i] = tex_load_sprite(object->segment.header->modelIds[i], 10); + object->sprites[i] = tex_load_sprite(object->header->modelIds[i], 10); if (object->sprites[i] == NULL) { failedToLoadModel = TRUE; } @@ -2534,19 +2531,19 @@ void func_800101AC(Object *obj, s32 arg1) { Object *tempObj; Object_Weapon *weapon; Object_Racer *racer; - Object_Animation *snowball; - Object_Fireball_Octoweapon *fireball; + Object_AnimatedObject *snowball; + Object_Weapon *fireball; Object_Log *log; Object_Butterfly *butterfly; SoundHandle soundMask; s32 numberOfModelIds; s32 i; s32 j; - Object_64 *obj64; + Object_AnimatedObject *obj64; ModelInstance *models; s32 modelType; - if (obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) { + if (obj->trans.flags & OBJ_FLAGS_PARTICLE) { particle_deallocate((Particle *) obj); gParticleCount--; return; @@ -2555,8 +2552,8 @@ void func_800101AC(Object *obj, s32 arg1) { if (obj->attachPoints != NULL) { for (i = 0; i < obj->attachPoints->count; i++) { tempObj = obj->attachPoints->obj[i]; - numberOfModelIds = tempObj->segment.header->numberOfModelIds; - modelType = tempObj->segment.header->modelType; + numberOfModelIds = tempObj->header->numberOfModelIds; + modelType = tempObj->header->modelType; if (modelType == OBJECT_MODEL_TYPE_3D_MODEL) { for (j = 0; j < numberOfModelIds; j++) { free_3d_model((ModelInstance *) &tempObj->modelInstances[j]->objModel); @@ -2566,12 +2563,12 @@ void func_800101AC(Object *obj, s32 arg1) { sprite_free(tempObj->sprites[j]); } } - try_free_object_header(tempObj->segment.object.unk2C); + try_free_object_header(tempObj->headerType); mempool_free(tempObj); } } if (obj->lightData != NULL) { - for (i = 0; i < obj->segment.header->numLightSources; i++) { + for (i = 0; i < obj->header->numLightSources; i++) { func_80032BAC(obj->lightData[i]); } } @@ -2581,7 +2578,7 @@ void func_800101AC(Object *obj, s32 arg1) { for (i = 0; i < gObjectCount; i++) { tempObj = gObjPtrList[i]; if (tempObj->behaviorId == BHV_BUTTERFLY) { - butterfly = &tempObj->unk64->butterfly; + butterfly = tempObj->butterfly; if (obj == butterfly->unk100) { butterfly->unk100 = 0; butterfly->unkFD = 1; @@ -2593,7 +2590,7 @@ void func_800101AC(Object *obj, s32 arg1) { break; case BHV_WEAPON: case BHV_WEAPON_2: - weapon = &obj->unk64->weapon; + weapon = obj->weapon; if (weapon->soundMask != NULL) { audspat_point_stop(weapon->soundMask); weapon->soundMask = NULL; @@ -2605,8 +2602,7 @@ void func_800101AC(Object *obj, s32 arg1) { i = BHV_RACER; break; case BHV_FIREBALL_OCTOWEAPON_2: - // This needs to be a weapon otherwise it doesn't match - weapon = (Object_Weapon *) &obj->unk64->fireball_octoweapon; + weapon = obj->weapon; if (weapon->soundMask != NULL) { audspat_point_stop(weapon->soundMask); } @@ -2617,10 +2613,9 @@ void func_800101AC(Object *obj, s32 arg1) { case BHV_SNOWBALL_2: case BHV_SNOWBALL_3: case BHV_SNOWBALL_4: - // This should probably be it's own struct instead of re-using animation - snowball = &obj->unk64->animation; - if (snowball->unk20 != NULL) { - audspat_point_stop((AudioPoint *) snowball->unk20); + snowball = obj->animatedObject; + if (snowball->soundMask != NULL) { + audspat_point_stop((AudioPoint *) snowball->soundMask); } i = BHV_RACER; @@ -2631,13 +2626,13 @@ void func_800101AC(Object *obj, s32 arg1) { i = BHV_RACER; break; case BHV_LIGHT_RGBA: - func_80032BAC((ObjectLight *) obj->unk64); + func_80032BAC(obj->light); i = BHV_RACER; break; case BHV_ANIMATION: - if (obj->unk64 != NULL && arg1 == 0) { - free_object((Object *) &obj->unk64->obj); + if (obj->animTarget != NULL && arg1 == 0) { + free_object(obj->animTarget); } i = BHV_RACER; @@ -2655,7 +2650,7 @@ void func_800101AC(Object *obj, s32 arg1) { break; case BHV_BUOY_PIRATE_SHIP: case BHV_LOG: - log = &obj->unk64->log; + log = obj->log; if (log != NULL) { mempool_free(log); } @@ -2700,15 +2695,15 @@ void func_800101AC(Object *obj, s32 arg1) { case BHV_DOOR_OPENER: case BHV_PIG_ROCKETEER: case BHV_WIZPIG_GHOSTS: - obj64 = obj->unk64; - soundMask = obj64->animation.unk18; + obj64 = obj->animatedObject; + soundMask = obj64->unk18; if (soundMask != NULL) { sndp_stop(soundMask); } break; } if (obj->behaviorId == i) { - racer = &obj->unk64->racer; + racer = obj->racer; if (racer->unk18 != NULL) { sndp_stop((SoundHandle) (s32) racer->unk18); // type cast required to match } @@ -2735,9 +2730,9 @@ void func_800101AC(Object *obj, s32 arg1) { } racer_sound_free(obj); for (j = 0; j < gObjectCount; j++) { - if ((gObjPtrList[j]->segment.trans.flags & OBJ_FLAGS_PARTICLE) && - ((s32) gObjPtrList[j]->segment.level_entry == (s32) obj)) { - gObjPtrList[j]->segment.level_entry = NULL; + if ((gObjPtrList[j]->trans.flags & OBJ_FLAGS_PARTICLE) && + ((s32) gObjPtrList[j]->level_entry == (s32) obj)) { + gObjPtrList[j]->level_entry = NULL; } if (gObjPtrList[j]->behaviorId == BHV_WEAPON_2 || gObjPtrList[j]->behaviorId == BHV_FLY_COIN || gObjPtrList[j]->behaviorId == BHV_WEAPON) { @@ -2751,8 +2746,8 @@ void func_800101AC(Object *obj, s32 arg1) { if (obj->waterEffect != NULL && obj->waterEffect->texture != NULL) { tex_free(obj->waterEffect->texture); } - numberOfModelIds = obj->segment.header->numberOfModelIds; - modelType = obj->segment.header->modelType; + numberOfModelIds = obj->header->numberOfModelIds; + modelType = obj->header->modelType; if (modelType == OBJECT_MODEL_TYPE_3D_MODEL) { for (j = 0; j < numberOfModelIds; j++) { if (obj->modelInstances[j] != NULL) { @@ -2769,12 +2764,12 @@ void func_800101AC(Object *obj, s32 arg1) { sprite_free(obj->sprites[j]); } } - if (obj->segment.header->particleCount > 0) { - for (j = 0; j < obj->segment.header->particleCount; j++) { + if (obj->header->particleCount > 0) { + for (j = 0; j < obj->header->particleCount; j++) { emitter_cleanup(&obj->particleEmitter[j]); } } - try_free_object_header(obj->segment.object.unk2C); + try_free_object_header(obj->headerType); mempool_free(obj); } @@ -2801,10 +2796,10 @@ void obj_update(s32 updateRate) { D_8011AD21 = 1 - D_8011AD21; D_8011AD22[D_8011AD21] = 0; for (j = 0; j < gNumRacers; j++) { - racer = &(*gRacers)[j]->unk64->racer; - racer->prev_x_position = (*gRacers)[j]->segment.trans.x_position; - racer->prev_y_position = (*gRacers)[j]->segment.trans.y_position; - racer->prev_z_position = (*gRacers)[j]->segment.trans.z_position; + racer = (*gRacers)[j]->racer; + racer->prev_x_position = (*gRacers)[j]->trans.x_position; + racer->prev_y_position = (*gRacers)[j]->trans.y_position; + racer->prev_z_position = (*gRacers)[j]->trans.z_position; } obj_tick_anims(); process_object_interactions(); @@ -2819,7 +2814,7 @@ void obj_update(s32 updateRate) { j = gObjectCount; for (i = gObjectListStart; i < j; i++) { obj = gObjPtrList[i]; - if (!(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { + if (!(obj->trans.flags & OBJ_FLAGS_PARTICLE)) { if ((obj->behaviorId != BHV_LIGHT_RGBA) && (obj->behaviorId != BHV_WEAPON) && (obj->behaviorId != BHV_FOG_CHANGER)) { if (obj->interactObj != NULL) { @@ -2829,14 +2824,14 @@ void obj_update(s32 updateRate) { } else { run_object_loop_func(obj, updateRate); } - if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { - for (sp54 = 0; sp54 < obj->segment.header->numberOfModelIds; sp54++) { + if (obj->header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { + for (sp54 = 0; sp54 < obj->header->numberOfModelIds; sp54++) { modInst = obj->modelInstances[sp54]; if (modInst != NULL) { modInst->objModel->texOffsetUpdateRate = updateRate; } } - if (obj->segment.header->unk72 != 0xFF) { + if (obj->header->unk72 != 0xFF) { func_80014090(obj, updateRate); } } @@ -2848,7 +2843,7 @@ void obj_update(s32 updateRate) { } if (get_current_level_race_type() == RACETYPE_DEFAULT) { for (i = 0; i < gNumRacers; i++) { - racer = &gRacersByPosition[i]->unk64->racer; + racer = gRacersByPosition[i]->racer; if (racer->playerIndex != -1) { increment_ai_behaviour_chances(gRacersByPosition[i], racer, updateRate); i = gNumRacers; // Why not just break? @@ -2858,7 +2853,7 @@ void obj_update(s32 updateRate) { racerfx_update(updateRate); for (i = gObjectListStart; i < j; i++) { obj = gObjPtrList[i]; - if ((!(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && (obj->behaviorId == BHV_WEAPON)) || + if ((!(obj->trans.flags & OBJ_FLAGS_PARTICLE) && (obj->behaviorId == BHV_WEAPON)) || (obj->behaviorId == BHV_FOG_CHANGER)) { run_object_loop_func(obj, updateRate); } @@ -2866,7 +2861,7 @@ void obj_update(s32 updateRate) { if (gParticleCount > 0) { for (i = gObjectListStart; i < j; i++) { obj = gObjPtrList[i]; - if (obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) { + if (obj->trans.flags & OBJ_FLAGS_PARTICLE) { // Why is this object being treated as a Particle? particle_update((Particle *) obj, updateRate); } @@ -2877,7 +2872,7 @@ void obj_update(s32 updateRate) { if (get_light_count() > 0) { for (i = gObjectListStart; i < gObjectCount; i++) { obj = gObjPtrList[i]; - if (!(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && (obj->shading != NULL)) { + if (!(obj->trans.flags & OBJ_FLAGS_PARTICLE) && (obj->shading != NULL)) { func_80032C7C(obj); } } @@ -2942,7 +2937,7 @@ void obj_tex_animate(Object *obj, s32 updateRate) { s32 batchNumber; ModelInstance *modInst; - modInst = obj->modelInstances[obj->segment.object.modelIndex]; + modInst = obj->modelInstances[obj->modelIndex]; model = modInst->objModel; batches = model->batches; temp_s5 = model->unk50; @@ -2973,7 +2968,7 @@ void obj_door_number(ObjectModel *model, Object *obj) { return; } - door = &obj->unk64->door; + door = obj->door; remaining = door->balloonCount; current = ((remaining / 10) - 1) << 2; remaining = (remaining % 10) << 2; @@ -3060,27 +3055,27 @@ s32 play_footstep_sounds(Object *obj, s32 arg1, s32 frame, s32 oddSoundId, s32 e s32 soundId; ret = 0; - if (arg1 < obj->segment.header->unk5B) { + if (arg1 < obj->header->unk5B) { // TODO: Figure this one out better. The index could be something like this: - // obj->segment.header->internalName[arg1 - 4] - asset = (s8 *) get_misc_asset(*(&obj->segment.header->unk5C + arg1)); + // obj->header->internalName[arg1 - 4] + asset = (s8 *) get_misc_asset(*(&obj->header->unk5C + arg1)); asset0 = asset[0]; shakeDist = (asset[1] & 0xFF) * 8.0f; shakeMagnitude = asset[2]; frame >>= 4; - animFrame = obj->segment.animFrame >> 4; + animFrame = obj->animFrame >> 4; for (i = 0; i < asset0; i++) { nextAsset = asset[i + 3]; if ((animFrame >= nextAsset && frame < nextAsset) || (nextAsset >= animFrame && nextAsset < frame)) { - set_camera_shake_by_distance(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, shakeDist, shakeMagnitude); + set_camera_shake_by_distance(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, + shakeDist, shakeMagnitude); if (i & 1) { soundId = oddSoundId; // Always set to SOUND_STOMP2 } else { soundId = evenSoundId; // Always set to SOUND_STOMP3 } - audspat_play_sound_at_position(soundId, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(soundId, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); ret = i + 1; i = asset0; // Come on, just use break! } @@ -3115,40 +3110,40 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { s32 intXPos, intYPos, intZPos; levelModel = get_current_level_model(); - newXPos = obj->segment.trans.x_position + xPos; - newYPos = obj->segment.trans.y_position + yPos; - newZPos = obj->segment.trans.z_position + zPos; + newXPos = obj->trans.x_position + xPos; + newYPos = obj->trans.y_position + yPos; + newZPos = obj->trans.z_position + zPos; if (levelModel == NULL) { gNoBoundsCheck = FALSE; return FALSE; } outOfBounds = FALSE; x2 = (levelModel->upperXBounds + 1000.0); - //!@bug should've campared against "obj->segment.trans.x_position" + //!@bug should've compared against "obj->trans.x_position" if (newXPos > x2) { outOfBounds = TRUE; } x1 = (levelModel->lowerXBounds - 1000.0); - if (obj->segment.trans.x_position < x1) { + if (obj->trans.x_position < x1) { outOfBounds = TRUE; } if (1) {} if (1) {} if (1) {} // Fakematch y2 = (levelModel->upperYBounds + 3000.0); - if (obj->segment.trans.y_position > y2) { + if (obj->trans.y_position > y2) { outOfBounds = TRUE; } y1 = (levelModel->lowerYBounds - 500.00); - if (obj->segment.trans.y_position < y1) { + if (obj->trans.y_position < y1) { outOfBounds = TRUE; } z2 = (levelModel->upperZBounds + 1000.0); - if (obj->segment.trans.z_position > z2) { + if (obj->trans.z_position > z2) { outOfBounds = TRUE; } z1 = (levelModel->lowerZBounds - 1000.0); - if (obj->segment.trans.z_position < z1) { + if (obj->trans.z_position < z1) { outOfBounds = TRUE; } if (gNoBoundsCheck) { @@ -3157,20 +3152,20 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { gNoBoundsCheck = FALSE; if (outOfBounds) { - obj->segment.object.segmentID = -1; + obj->segmentID = -1; return TRUE; } - obj->segment.trans.x_position = newXPos; - obj->segment.trans.y_position = newYPos; - obj->segment.trans.z_position = newZPos; - box = get_segment_bounding_box(obj->segment.object.segmentID); + obj->trans.x_position = newXPos; + obj->trans.y_position = newYPos; + obj->trans.z_position = newZPos; + box = get_segment_bounding_box(obj->segmentID); // For some reason the XYZ positions are converted into integers for the next section intXPos = newXPos, intYPos = newYPos, intZPos = newZPos; if (box == NULL) { - obj->segment.object.segmentID = get_level_segment_index_from_position(intXPos, intYPos, intZPos); + obj->segmentID = get_level_segment_index_from_position(intXPos, intYPos, intZPos); return FALSE; } else { outsideBBox = FALSE; @@ -3186,7 +3181,7 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { if (outsideBBox) { segmentID = get_level_segment_index_from_position(intXPos, intYPos, intZPos); if (segmentID != -1) { - obj->segment.object.segmentID = segmentID; + obj->segmentID = segmentID; } } } @@ -3200,7 +3195,7 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { void render_misc_model(Object *obj, Vertex *verts, u32 numVertices, Triangle *triangles, u32 numTriangles, TextureHeader *tex, u32 flags, u32 texOffset, f32 scaleY) { s32 hasTexture = FALSE; - mtx_cam_push(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->segment.trans, scaleY, 0.0f); + mtx_cam_push(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->trans, scaleY, 0.0f); gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); gDPSetEnvColor(gObjectCurrDisplayList++, 255, 255, 255, 0); if (tex != NULL) { @@ -3217,32 +3212,33 @@ void render_misc_model(Object *obj, Vertex *verts, u32 numVertices, Triangle *tr */ void render_3d_misc(Object *obj) { f32 scaleY; - Object_64 *objData; + Object_Fish *fish; + Object_Butterfly *butterfly; + CharacterFlagModel *characterFlagModel; switch (obj->behaviorId) { case BHV_CHARACTER_FLAG: if (obj->properties.characterFlag.characterID >= 0) { - objData = obj->unk64; - render_misc_model(obj, objData->character_flag.vertices, 4, objData->character_flag.triangles, 2, - objData->character_flag.texture, + characterFlagModel = obj->characterFlagModel; + render_misc_model(obj, characterFlagModel->vertices, 4, characterFlagModel->triangles, 2, + characterFlagModel->texture, RENDER_ANTI_ALIASING | RENDER_Z_COMPARE | RENDER_FOG_ACTIVE, 0, 1.0f); } break; case BHV_BUTTERFLY: - objData = obj->unk64; - render_misc_model(obj, &objData->butterfly.vertices[objData->butterfly.unkFC * 6], 6, - objData->butterfly.triangles, 8, objData->butterfly.texture, - RENDER_Z_COMPARE | RENDER_FOG_ACTIVE, 0, 1.0f); + butterfly = obj->butterfly; + render_misc_model(obj, &butterfly->vertices[butterfly->unkFC * 6], 6, butterfly->triangles, 8, + butterfly->texture, RENDER_Z_COMPARE | RENDER_FOG_ACTIVE, 0, 1.0f); break; case BHV_FISH: - objData = obj->unk64; - scaleY = obj->segment.level_entry->fish.unkD; + fish = obj->fish; + scaleY = obj->level_entry->fish.unkD; scaleY *= 0.01f; - render_misc_model(obj, &objData->fish.vertices[objData->fish.unkFC * 6], 6, objData->fish.triangles, 8, - objData->fish.texture, RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_CUTOUT, 0, scaleY); + render_misc_model(obj, &fish->vertices[fish->unkFC * 6], 6, fish->triangles, 8, fish->texture, + RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_CUTOUT, 0, scaleY); break; case BHV_BOOST: - if (obj->properties.common.unk0 && (obj->unk64->boost.unk70 > 0 || obj->unk64->boost.unk74 > 0.0f)) { + if (obj->properties.common.unk0 && (obj->boost->unk70 > 0 || obj->boost->unk74 > 0.0f)) { func_800135B8(obj); } break; @@ -3267,7 +3263,7 @@ void render_3d_billboard(Object *obj) { intensity = 255; hasPrimCol = FALSE; hasEnvCol = FALSE; - flags = obj->segment.trans.flags | RENDER_Z_UPDATE | RENDER_FOG_ACTIVE; + flags = obj->trans.flags | RENDER_Z_UPDATE | RENDER_FOG_ACTIVE; if (obj->shading != NULL) { hasPrimCol = TRUE; hasEnvCol = TRUE; @@ -3276,15 +3272,14 @@ void render_3d_billboard(Object *obj) { if (obj->behaviorId == BHV_BOMB_EXPLOSION) { //!@bug Never true, because the type is u8. - if (obj->segment.object.opacity > 255) { - obj->segment.object.opacity = obj->properties.bombExplosion.unk4 & 0xFF; + if (obj->opacity > 255) { + obj->opacity = obj->properties.bombExplosion.unk4 & 0xFF; } else { - obj->segment.object.opacity = - (obj->segment.object.opacity * (obj->properties.bombExplosion.unk4 & 0xFF)) >> 8; + obj->opacity = (obj->opacity * (obj->properties.bombExplosion.unk4 & 0xFF)) >> 8; } } - alpha = obj->segment.object.opacity; + alpha = obj->opacity; if (alpha > 255) { alpha = 255; } @@ -3298,7 +3293,7 @@ void render_3d_billboard(Object *obj) { flags |= RENDER_SEMI_TRANSPARENT; hasPrimCol = TRUE; } - if ((obj->behaviorId == 5) && (obj->segment.trans.scale == 6.0f)) { + if ((obj->behaviorId == 5) && (obj->trans.scale == 6.0f)) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, (intensity * 3) >> 2, intensity, intensity >> 1, alpha); hasPrimCol = TRUE; } else if (obj->behaviorId == BHV_WIZPIG_GHOSTS) { // If the behavior is a wizpig ghost @@ -3318,7 +3313,7 @@ void render_3d_billboard(Object *obj) { } else { gDPSetEnvColor(gObjectCurrDisplayList++, 255, 255, 255, 0); } - sprite = obj->sprites[obj->segment.object.modelIndex]; + sprite = obj->sprites[obj->modelIndex]; bubbleTrap = NULL; if (obj->behaviorId == BHV_FIREBALL_OCTOWEAPON_2) { bubbleTrap = obj->properties.fireball.obj; @@ -3328,23 +3323,23 @@ void render_3d_billboard(Object *obj) { } // 5 = OilSlick, SmokeCloud, Bomb, BubbleWeapon - if (bubbleTrap != NULL || !(obj->behaviorId != BHV_WEAPON || obj->unk64->weapon.weaponID != WEAPON_BUBBLE_TRAP)) { + if (bubbleTrap != NULL || !(obj->behaviorId != BHV_WEAPON || obj->weapon->weaponID != WEAPON_BUBBLE_TRAP)) { objTrans.trans.rotation.z_rotation = 0; objTrans.trans.rotation.x_rotation = 0; objTrans.trans.rotation.y_rotation = 0; - objTrans.trans.scale = obj->segment.trans.scale; + objTrans.trans.scale = obj->trans.scale; objTrans.trans.x_position = 0.0f; objTrans.trans.z_position = 0.0f; objTrans.trans.y_position = 12.0f; - objTrans.animFrame = obj->segment.animFrame; + objTrans.animFrame = obj->animFrame; objTrans.unk1A = 32; if (bubbleTrap == NULL) { - bubbleTrap = obj->unk64->weapon.target; + bubbleTrap = obj->weapon->target; if (bubbleTrap == NULL) { bubbleTrap = obj; } } - render_bubble_trap(&bubbleTrap->segment.trans, sprite, (Object *) &objTrans, + render_bubble_trap(&bubbleTrap->trans, sprite, (Object *) &objTrans, RENDER_Z_COMPARE | RENDER_SEMI_TRANSPARENT | RENDER_Z_UPDATE); } else { render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, obj, sprite, @@ -3386,7 +3381,7 @@ void render_3d_model(Object *obj) { ObjectModel *objModel; Sprite *something; - modInst = obj->modelInstances[obj->segment.object.modelIndex]; + modInst = obj->modelInstances[obj->modelIndex]; if (modInst != NULL) { objModel = modInst->objModel; hasOpacity = FALSE; @@ -3398,7 +3393,7 @@ void render_3d_model(Object *obj) { hasLighting = TRUE; } if (obj->behaviorId == BHV_RACER) { - racerObj = &obj->unk64->racer; + racerObj = obj->racer; object_do_player_tumble(obj); } else { racerObj = NULL; @@ -3442,18 +3437,18 @@ void render_3d_model(Object *obj) { obj_tex_animate(obj, objModel->texOffsetUpdateRate); modInst->objModel->texOffsetUpdateRate = 0; } - mtx_cam_push(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->segment.trans, gObjectModelScaleY, 0.0f); + mtx_cam_push(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->trans, gObjectModelScaleY, 0.0f); vertOffset = FALSE; if (racerObj != NULL) { object_undo_player_tumble(obj); - if (obj->segment.object.animationID == 0 || racerObj->vehicleID >= VEHICLE_BOSSES) { + if (obj->animationID == 0 || racerObj->vehicleID >= VEHICLE_BOSSES) { mtx_head_push(&gObjectCurrDisplayList, &gObjectCurrMatrix, modInst, racerObj->headAngle); vertOffset = TRUE; } else { racerObj->headAngle = 0; } } - opacity = obj->segment.object.opacity; + opacity = obj->opacity; if (opacity > 255) { opacity = 255; } @@ -3470,7 +3465,7 @@ void render_3d_model(Object *obj) { } else { gDPSetEnvColor(gObjectCurrDisplayList++, 255, 255, 255, 0); } - if (obj->segment.header->directionalPointLighting) { + if (obj->header->directionalPointLighting) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, obj->shading->shadowR, obj->shading->shadowG, obj->shading->shadowB, opacity); directional_lighting_on(); @@ -3484,7 +3479,7 @@ void render_3d_model(Object *obj) { } else { meshBatch = render_mesh(objModel, obj, 0, RENDER_NONE, vertOffset); } - if (obj->segment.header->directionalPointLighting) { + if (obj->header->directionalPointLighting) { if (hasOpacity) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, intensity, intensity, intensity, opacity); } else { @@ -3499,17 +3494,17 @@ void render_3d_model(Object *obj) { } for (i = 0; i < attachPointCount; i++) { loopObj = obj->attachPoints->obj[i]; - if (!(loopObj->segment.trans.flags & OBJ_FLAGS_INVISIBLE)) { + if (!(loopObj->trans.flags & OBJ_FLAGS_INVISIBLE)) { index = obj->attachPoints->unk2C[i]; if (index >= 0 && index < objModel->unk18) { - something = loopObj->sprites[loopObj->segment.object.modelIndex]; + something = loopObj->sprites[loopObj->modelIndex]; vtxX = obj->curVertData[objModel->unk14[index]].x; vtxY = obj->curVertData[objModel->unk14[index]].y; vtxZ = obj->curVertData[objModel->unk14[index]].z; - loopObj->segment.trans.x_position += vtxX; - loopObj->segment.trans.y_position += vtxY; - loopObj->segment.trans.z_position += vtxZ; - if (loopObj->segment.header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { + loopObj->trans.x_position += vtxX; + loopObj->trans.y_position += vtxY; + loopObj->trans.z_position += vtxZ; + if (loopObj->header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { flags = (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE); } else { flags = (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE | RENDER_ANTI_ALIASING); @@ -3528,7 +3523,7 @@ void render_3d_model(Object *obj) { if (1) { #endif // In this instance, cargo refers to the eggs in the fire mountain challenge. - isCargo = (loopObj->segment.trans.flags & OBJ_FLAGS_UNK_0080 && attachPointCount == 3); + isCargo = (loopObj->trans.flags & OBJ_FLAGS_UNK_0080 && attachPointCount == 3); if (racerObj != NULL && racerObj->transparency < 255) { isCargo = FALSE; } @@ -3546,9 +3541,9 @@ void render_3d_model(Object *obj) { func_80012CE8(&gObjectCurrDisplayList); } } - loopObj->segment.trans.x_position -= vtxX; - loopObj->segment.trans.y_position -= vtxY; - loopObj->segment.trans.z_position -= vtxZ; + loopObj->trans.x_position -= vtxX; + loopObj->trans.y_position -= vtxY; + loopObj->trans.z_position -= vtxZ; } } } @@ -3557,17 +3552,17 @@ void render_3d_model(Object *obj) { if (racerObj != NULL) { loopObj = racerObj->held_obj; if (loopObj != NULL) { - index = obj->segment.header->unk58; + index = obj->header->unk58; if (index >= 0 && index < objModel->unk18) { flags = (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE); - something = loopObj->sprites[loopObj->segment.object.modelIndex]; + something = loopObj->sprites[loopObj->modelIndex]; vtxX = obj->curVertData[objModel->unk14[index]].x; vtxY = obj->curVertData[objModel->unk14[index]].y; vtxZ = obj->curVertData[objModel->unk14[index]].z; - loopObj->segment.trans.x_position += (vtxX - loopObj->segment.trans.x_position) * 0.25; - loopObj->segment.trans.y_position += (vtxY - loopObj->segment.trans.y_position) * 0.25; - loopObj->segment.trans.z_position += (vtxZ - loopObj->segment.trans.z_position) * 0.25; - if (loopObj->segment.header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { + loopObj->trans.x_position += (vtxX - loopObj->trans.x_position) * 0.25; + loopObj->trans.y_position += (vtxY - loopObj->trans.y_position) * 0.25; + loopObj->trans.z_position += (vtxZ - loopObj->trans.z_position) * 0.25; + if (loopObj->header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, loopObj, something, flags); } @@ -3575,17 +3570,17 @@ void render_3d_model(Object *obj) { } } if (meshBatch != -1) { - if (obj->segment.header->directionalPointLighting) { + if (obj->header->directionalPointLighting) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, obj->shading->shadowR, obj->shading->shadowG, obj->shading->shadowB, opacity); directional_lighting_on(); } render_mesh(objModel, obj, meshBatch, RENDER_SEMI_TRANSPARENT, vertOffset); - if (obj->segment.header->directionalPointLighting) { + if (obj->header->directionalPointLighting) { directional_lighting_off(); } } - if (hasOpacity || obj->segment.header->directionalPointLighting) { + if (hasOpacity || obj->header->directionalPointLighting) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); } if (hasLighting) { @@ -3627,16 +3622,16 @@ void func_80012CE8(Gfx **dList) { */ void render_object(Gfx **dList, Mtx **mtx, Vertex **verts, Object *obj) { f32 scale; - if (obj->segment.trans.flags & (OBJ_FLAGS_INVISIBLE | OBJ_FLAGS_SHADOW_ONLY)) { + if (obj->trans.flags & (OBJ_FLAGS_INVISIBLE | OBJ_FLAGS_SHADOW_ONLY)) { return; } update_object_stack_trace(OBJECT_DRAW, obj->objectID); gObjectCurrDisplayList = *dList; gObjectCurrMatrix = *mtx; gObjectCurrVertexList = *verts; - scale = obj->segment.trans.scale; + scale = obj->trans.scale; render_object_parts(obj); - obj->segment.trans.scale = scale; + obj->trans.scale = scale; *dList = gObjectCurrDisplayList; *mtx = gObjectCurrMatrix; *verts = gObjectCurrVertexList; @@ -3656,10 +3651,10 @@ void object_do_player_tumble(Object *this) { if (this->behaviorId == BHV_RACER) { - sp_20 = &this->unk64->racer; - this->segment.trans.rotation.y_rotation += sp_20->y_rotation_offset; - this->segment.trans.rotation.x_rotation += sp_20->x_rotation_offset; - this->segment.trans.rotation.z_rotation += sp_20->z_rotation_offset; + sp_20 = this->racer; + this->trans.rotation.y_rotation += sp_20->y_rotation_offset; + this->trans.rotation.x_rotation += sp_20->x_rotation_offset; + this->trans.rotation.z_rotation += sp_20->z_rotation_offset; offsetY = 0.0f; if (sp_20->vehicleIDPrev < VEHICLE_BOSSES) { @@ -3673,7 +3668,7 @@ void object_do_player_tumble(Object *this) { if (0) {} // Fakematch offsetY = temp; } - this->segment.trans.y_position = this->segment.trans.y_position + offsetY; + this->trans.y_position = this->trans.y_position + offsetY; gObjectOffsetY = offsetY; } } @@ -3683,11 +3678,11 @@ void object_do_player_tumble(Object *this) { */ void object_undo_player_tumble(Object *obj) { if (obj->behaviorId == BHV_RACER) { - Object_Racer *racer = &obj->unk64->racer; - obj->segment.trans.rotation.y_rotation -= racer->y_rotation_offset; - obj->segment.trans.rotation.x_rotation -= racer->x_rotation_offset; - obj->segment.trans.rotation.z_rotation -= racer->z_rotation_offset; - obj->segment.trans.y_position -= gObjectOffsetY; + Object_Racer *racer = obj->racer; + obj->trans.rotation.y_rotation -= racer->y_rotation_offset; + obj->trans.rotation.x_rotation -= racer->x_rotation_offset; + obj->trans.rotation.z_rotation -= racer->z_rotation_offset; + obj->trans.y_position -= gObjectOffsetY; } } @@ -3710,9 +3705,9 @@ void set_temp_model_transforms(Object *obj) { ret1 = 1.0f; ret2 = 1.0f; - if (!(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { - if (obj->segment.header->behaviorId == BHV_RACER) { - objRacer = &obj->unk64->racer; + if (!(obj->trans.flags & OBJ_FLAGS_PARTICLE)) { + if (obj->header->behaviorId == BHV_RACER) { + objRacer = obj->racer; objRacer->unk201 = 30; if (objRacer->unk206 > 0) { ret2 = 1.0f - (objRacer->unk206 * 0.05f); @@ -3739,16 +3734,16 @@ void set_temp_model_transforms(Object *obj) { if (get_current_viewport() != objRacer->playerIndex) { bossAsset += 5; } - var_f0 = obj->segment.object.distanceToCamera; + var_f0 = obj->distanceToCamera; var_v1 = (s32) var_f0 >> 3; - if (obj->segment.object.distanceToCamera < 0.0f) { + if (obj->distanceToCamera < 0.0f) { var_f0 = 0.0f; } else if (var_f0 > 3500.0f) { var_f0 = 3500.0f; } var_f0 /= 2700.0f; var_f0 += 1.0f; - obj->segment.trans.scale *= var_f0; + obj->trans.scale *= var_f0; var_v1 *= ((f32 *) get_misc_asset(ASSET_MISC_4))[objRacer->characterId]; // ASSET_MISC_4 is just 10 floats of 1.0f. One for each playable character. if (var_v1 < -50) { @@ -3784,7 +3779,7 @@ void set_temp_model_transforms(Object *obj) { modInstList++; } - numberOfModels = obj->segment.header->numberOfModelIds - 1; + numberOfModels = obj->header->numberOfModelIds - 1; modInstList = &obj->modelInstances[numberOfModels]; while (*modInstList == NULL) { @@ -3798,14 +3793,14 @@ void set_temp_model_transforms(Object *obj) { if (numberOfModels < modelIndex) { modelIndex = numberOfModels; } - obj->segment.object.modelIndex = modelIndex; + obj->modelIndex = modelIndex; if ((obj->shading != NULL) && (obj->shading->unk0 < 0.6f)) { objRacer->lightFlags |= RACER_LIGHT_NIGHT; } else { objRacer->lightFlags &= ~RACER_LIGHT_NIGHT; } modelIndex = objRacer->lightFlags & RACER_LIGHT_TIMER; - modInst = obj->modelInstances[obj->segment.object.modelIndex]; + modInst = obj->modelInstances[obj->modelIndex]; objModel = modInst->objModel; if (modelIndex != 0) { modelIndex--; @@ -3827,12 +3822,12 @@ void set_temp_model_transforms(Object *obj) { objModel->batches[batchNum].texOffset = modelIndex; } } - obj->segment.trans.x_position += objRacer->carBobX; - obj->segment.trans.y_position += objRacer->carBobY; - obj->segment.trans.z_position += objRacer->carBobZ; + obj->trans.x_position += objRacer->carBobX; + obj->trans.y_position += objRacer->carBobY; + obj->trans.z_position += objRacer->carBobZ; ret1 = objRacer->stretch_height; } else if (obj->behaviorId == BHV_FROG) { - ret1 = obj->unk64->frog.scaleY; + ret1 = obj->frog->scaleY; } } gObjectModelScaleY = ret1; @@ -3846,15 +3841,15 @@ void set_temp_model_transforms(Object *obj) { */ void render_object_parts(Object *obj) { set_temp_model_transforms(obj); - if (obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) { + if (obj->trans.flags & OBJ_FLAGS_PARTICLE) { render_particle((Particle *) obj, &gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, PARTICLE_UNK_FLAG_8000); } else { - if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { + if (obj->header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { render_3d_model(obj); - } else if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { + } else if (obj->header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { render_3d_billboard(obj); - } else if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_MISC) { + } else if (obj->header->modelType == OBJECT_MODEL_TYPE_MISC) { render_3d_misc(obj); } } @@ -3865,10 +3860,10 @@ void render_object_parts(Object *obj) { * After rendering, sets the object position back to normal. */ void unset_temp_model_transforms(Object *obj) { - if (!(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && obj->segment.header->behaviorId == BHV_RACER) { - obj->segment.trans.x_position -= obj->unk64->racer.carBobX; - obj->segment.trans.y_position -= obj->unk64->racer.carBobY; - obj->segment.trans.z_position -= obj->unk64->racer.carBobZ; + if (!(obj->trans.flags & OBJ_FLAGS_PARTICLE) && obj->header->behaviorId == BHV_RACER) { + obj->trans.x_position -= obj->racer->carBobX; + obj->trans.y_position -= obj->racer->carBobY; + obj->trans.z_position -= obj->racer->carBobZ; } } @@ -3884,7 +3879,7 @@ void func_800135B8(Object *boostObj) { s32 racerIndex; racerIndex = (boostObj->properties.boost.racerIndex) & 0xF; - boost = &boostObj->unk64->boost; + boost = boostObj->boost; switch (D_8011B048[racerIndex]) { case VEHICLE_CAR: boostData = &boost->carBoostData; @@ -3899,8 +3894,7 @@ void func_800135B8(Object *boostObj) { asset = (Object_Boost *) get_misc_asset(ASSET_MISC_20); asset = &asset[D_8011B058[racerIndex]]; object_do_player_tumble(boostObj->properties.boost.obj); - mtx_cam_push(&gObjectCurrDisplayList, &gObjectCurrMatrix, &boostObj->properties.boost.obj->segment.trans, 1.0f, - 0.0f); + mtx_cam_push(&gObjectCurrDisplayList, &gObjectCurrMatrix, &boostObj->properties.boost.obj->trans, 1.0f, 0.0f); object_undo_player_tumble(boostObj->properties.boost.obj); objTransform.trans.x_position = boostData->position.x; objTransform.trans.y_position = boostData->position.y; @@ -3948,24 +3942,24 @@ void render_bubble_trap(ObjectTransform *trans, Sprite *gfxData, Object *obj, s3 Camera *cameraSegment; f32 dist; - vec3f_rotate(&trans->rotation, (Vec3f *) &obj->segment.trans.x_position); - obj->segment.trans.x_position += trans->x_position; - obj->segment.trans.y_position += trans->y_position; - obj->segment.trans.z_position += trans->z_position; + vec3f_rotate(&trans->rotation, (Vec3f *) &obj->trans.x_position); + obj->trans.x_position += trans->x_position; + obj->trans.y_position += trans->y_position; + obj->trans.z_position += trans->z_position; cameraSegment = cam_get_active_camera(); - x = cameraSegment->trans.x_position - obj->segment.trans.x_position; - y = cameraSegment->trans.y_position - obj->segment.trans.y_position; - z = cameraSegment->trans.z_position - obj->segment.trans.z_position; + x = cameraSegment->trans.x_position - obj->trans.x_position; + y = cameraSegment->trans.y_position - obj->trans.y_position; + z = cameraSegment->trans.z_position - obj->trans.z_position; dist = sqrtf((x * x) + (y * y) + (z * z)); if (dist > 0.0) { - dist = obj->segment.numActiveEmitters / dist; + dist = obj->numActiveEmitters / dist; x *= dist; y *= dist; z *= dist; } - obj->segment.trans.x_position += x; - obj->segment.trans.y_position += y; - obj->segment.trans.z_position += z; + obj->trans.x_position += x; + obj->trans.y_position += y; + obj->trans.z_position += z; render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, obj, gfxData, flags); } @@ -3984,7 +3978,7 @@ void render_racer_shield(Gfx **dList, Mtx **mtx, Vertex **vtxList, Object *obj) f32 scale; f32 shear; - racer = &obj->unk64->racer; + racer = obj->racer; if (racer->shieldTimer > 0 && gShieldEffectObject != NULL) { gObjectCurrDisplayList = *dList; gObjectCurrMatrix = *mtx; @@ -4000,16 +3994,16 @@ void render_racer_shield(Gfx **dList, Mtx **mtx, Vertex **vtxList, Object *obj) shield = (RacerShieldGfx *) get_misc_asset(ASSET_MISC_SHIELD_DATA); vehicleID = (vehicleID * 10) + racerIndex; shield = shield + vehicleID; - gShieldEffectObject->segment.trans.x_position = shield->x_position; - gShieldEffectObject->segment.trans.y_position = shield->y_position; - gShieldEffectObject->segment.trans.z_position = shield->z_position; - gShieldEffectObject->segment.trans.y_position += shield->y_offset * sins_f(gShieldSineTime[racerIndex] * 0x200); + gShieldEffectObject->trans.x_position = shield->x_position; + gShieldEffectObject->trans.y_position = shield->y_position; + gShieldEffectObject->trans.z_position = shield->z_position; + gShieldEffectObject->trans.y_position += shield->y_offset * sins_f(gShieldSineTime[racerIndex] * 0x200); shear = (coss_f(gShieldSineTime[racerIndex] * 0x400) * 0.05f) + 0.95f; - gShieldEffectObject->segment.trans.scale = shield->scale * shear; + gShieldEffectObject->trans.scale = shield->scale * shear; shear = shear * shield->turnSpeed; - gShieldEffectObject->segment.trans.rotation.y_rotation = gShieldSineTime[racerIndex] * 0x800; - gShieldEffectObject->segment.trans.rotation.x_rotation = 0x800; - gShieldEffectObject->segment.trans.rotation.z_rotation = 0; + gShieldEffectObject->trans.rotation.y_rotation = gShieldSineTime[racerIndex] * 0x800; + gShieldEffectObject->trans.rotation.x_rotation = 0x800; + gShieldEffectObject->trans.rotation.z_rotation = 0; shieldType = racer->shieldType; if (shieldType != SHIELD_NONE) { shieldType--; @@ -4018,7 +4012,7 @@ void render_racer_shield(Gfx **dList, Mtx **mtx, Vertex **vtxList, Object *obj) shieldType = SHIELD_LEVEL3 - 1; } scale = ((f32) shieldType * 0.1) + 1.0f; - gShieldEffectObject->segment.trans.scale *= scale; + gShieldEffectObject->trans.scale *= scale; shear *= scale; modInst = gShieldEffectObject->modelInstances[shieldType]; mdl = modInst->objModel; @@ -4056,7 +4050,7 @@ void render_racer_magnet(Gfx **dList, Mtx **mtx, Vertex **vtxList, Object *obj) f32 shear; UNUSED s32 pad; - racer = &obj->unk64->racer; + racer = obj->racer; racerIndex = racer->racerIndex; if (gRacerFXData[racerIndex].unk3 != 0) { if (gMagnetEffectObject != NULL) { @@ -4073,17 +4067,17 @@ void render_racer_magnet(Gfx **dList, Mtx **mtx, Vertex **vtxList, Object *obj) if (racerIndex > NUMBER_OF_CHARACTERS) { racerIndex = 0; } - gMagnetEffectObject->segment.trans.x_position = magnet[0]; - gMagnetEffectObject->segment.trans.y_position = magnet[1]; - gMagnetEffectObject->segment.trans.z_position = magnet[2]; + gMagnetEffectObject->trans.x_position = magnet[0]; + gMagnetEffectObject->trans.y_position = magnet[1]; + gMagnetEffectObject->trans.z_position = magnet[2]; magnet += 3; shear = (coss_f((gRacerFXData[racerIndex].unk1 * 0x400)) * 0.02f) + 0.98f; - gMagnetEffectObject->segment.trans.scale = magnet[0] * shear; + gMagnetEffectObject->trans.scale = magnet[0] * shear; magnet += 1; shear = magnet[0] * shear; - gMagnetEffectObject->segment.trans.rotation.y_rotation = gRacerFXData[racerIndex].unk2 * 0x1000; - gMagnetEffectObject->segment.trans.rotation.x_rotation = 0; - gMagnetEffectObject->segment.trans.rotation.z_rotation = 0; + gMagnetEffectObject->trans.rotation.y_rotation = gRacerFXData[racerIndex].unk2 * 0x1000; + gMagnetEffectObject->trans.rotation.x_rotation = 0; + gMagnetEffectObject->trans.rotation.z_rotation = 0; modInst = gMagnetEffectObject->modelInstances[0]; mdl = modInst->objModel; gMagnetEffectObject->curVertData = modInst->vertices[modInst->animationTaskNum]; @@ -4125,7 +4119,7 @@ void func_80014090(Object *obj, s32 arg1) { s16 newV1; s16 newV2; - objHeader = obj->segment.header; + objHeader = obj->header; objHeader73 = objHeader->unk73; objHeader72 = objHeader->unk72; temp = (s16) (objHeader->unk74 * arg1); @@ -4179,9 +4173,8 @@ void obj_tick_anims(void) { for (; i < gObjectCount; i++) { currObj = gObjPtrList[i]; - if (!(currObj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && - currObj->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { - for (j = 0; j < currObj->segment.header->numberOfModelIds; j++) { + if (!(currObj->trans.flags & OBJ_FLAGS_PARTICLE) && currObj->header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { + for (j = 0; j < currObj->header->numberOfModelIds; j++) { modInst = currObj->modelInstances[j]; if (modInst != NULL && modInst->animUpdateTimer > 0) { modInst->animUpdateTimer &= 3; @@ -4299,8 +4292,8 @@ s32 get_first_active_object(s32 *retObjCount) { while (i <= j) { breakLoop = 0; while (i <= maxIndex && breakLoop == 0) { - if (!(gObjPtrList[i]->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { - if (gObjPtrList[i]->segment.header->flags & HEADER_FLAGS_UNK_0001) { + if (!(gObjPtrList[i]->trans.flags & OBJ_FLAGS_PARTICLE)) { + if (gObjPtrList[i]->header->flags & HEADER_FLAGS_UNK_0001) { i++; } else { // Break the loop if neither OBJ_FLAGS_PARTICLE nor bit 1 in header->flags is set @@ -4313,10 +4306,10 @@ s32 get_first_active_object(s32 *retObjCount) { breakLoop = 0; while (j >= minIndex && breakLoop == 0) { - if (gObjPtrList[j]->segment.trans.flags & OBJ_FLAGS_PARTICLE) { + if (gObjPtrList[j]->trans.flags & OBJ_FLAGS_PARTICLE) { // Break the loop if OBJ_FLAGS_PARTICLE is set breakLoop = -1; - } else if (!(gObjPtrList[j]->segment.header->flags & HEADER_FLAGS_UNK_0001)) { + } else if (!(gObjPtrList[j]->header->flags & HEADER_FLAGS_UNK_0001)) { j--; } else { // Break the loop if bit 1 in header->flags is set @@ -4350,7 +4343,7 @@ UNUSED void func_800149C0(unk800149C0 *arg0, UNUSED s32 arg1, s32 arg2, s32 arg3 startVal = func_80014B50(arg2, endVal - 1, temp_f0, arg0->unk4 + 8); for (i = startVal; i < endVal; i++) { - gObjPtrList[i]->segment.object.unk38 += arg6; + gObjPtrList[i]->unk38 += arg6; } *arg4 = startVal; @@ -4368,12 +4361,10 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { switch (arg3) { case 0: while (arg1 >= arg0) { - while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.x_position - - gObjPtrList[arg0]->segment.object.unk34) < arg2)) { + while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->trans.x_position - gObjPtrList[arg0]->unk34) < arg2)) { arg0++; } - while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.x_position - - gObjPtrList[arg1]->segment.object.unk34))) { + while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->trans.x_position - gObjPtrList[arg1]->unk34))) { arg1--; } if (arg0 < arg1) { @@ -4387,12 +4378,10 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { break; case 1: while (arg1 >= arg0) { - while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.y_position - - gObjPtrList[arg0]->segment.object.unk34) < arg2)) { + while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->trans.y_position - gObjPtrList[arg0]->unk34) < arg2)) { arg0++; } - while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.y_position - - gObjPtrList[arg1]->segment.object.unk34))) { + while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->trans.y_position - gObjPtrList[arg1]->unk34))) { arg1--; } if (arg0 < arg1) { @@ -4406,12 +4395,10 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { break; case 2: while (arg1 >= arg0) { - while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.z_position - - gObjPtrList[arg0]->segment.object.unk34) < arg2)) { + while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->trans.z_position - gObjPtrList[arg0]->unk34) < arg2)) { arg0++; } - while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.z_position - - gObjPtrList[arg1]->segment.object.unk34))) { + while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->trans.z_position - gObjPtrList[arg1]->unk34))) { arg1--; } if (arg0 < arg1) { @@ -4425,12 +4412,10 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { break; case 8: while (arg1 >= arg0) { - while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.x_position + - gObjPtrList[arg0]->segment.object.unk34) < arg2)) { + while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->trans.x_position + gObjPtrList[arg0]->unk34) < arg2)) { arg0++; } - while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.x_position + - gObjPtrList[arg1]->segment.object.unk34))) { + while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->trans.x_position + gObjPtrList[arg1]->unk34))) { arg1--; } if (arg0 < arg1) { @@ -4444,12 +4429,10 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { break; case 9: while (arg1 >= arg0) { - while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.y_position + - gObjPtrList[arg0]->segment.object.unk34) < arg2)) { + while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->trans.y_position + gObjPtrList[arg0]->unk34) < arg2)) { arg0++; } - while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.y_position + - gObjPtrList[arg1]->segment.object.unk34))) { + while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->trans.y_position + gObjPtrList[arg1]->unk34))) { arg1--; } if (arg0 < arg1) { @@ -4463,12 +4446,10 @@ s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3) { break; case 10: while (arg1 >= arg0) { - while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->segment.trans.z_position + - gObjPtrList[arg0]->segment.object.unk34) < arg2)) { + while ((var_a1 >= arg0) && ((gObjPtrList[arg0]->trans.z_position + gObjPtrList[arg0]->unk34) < arg2)) { arg0++; } - while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->segment.trans.z_position + - gObjPtrList[arg1]->segment.object.unk34))) { + while ((arg1 >= var_a0) && (arg2 <= (gObjPtrList[arg1]->trans.z_position + gObjPtrList[arg1]->unk34))) { arg1--; } if (arg0 < arg1) { @@ -4499,20 +4480,20 @@ void sort_objects_by_dist(s32 startIndex, s32 lastIndex) { for (i = startIndex; i <= lastIndex; i++) { obj = gObjPtrList[i]; if (obj != NULL) { - if (obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) { + if (obj->trans.flags & OBJ_FLAGS_PARTICLE) { // get_distance_to_camera calculates the distance to the camera from a XYZ location. - obj->segment.object.distanceToCamera = -get_distance_to_camera( - obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); - } else if (obj->segment.header->flags & HEADER_FLAGS_UNK_0080) { - obj->segment.object.distanceToCamera += -16000.0f; + obj->distanceToCamera = + -get_distance_to_camera(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position); + } else if (obj->header->flags & HEADER_FLAGS_UNK_0080) { + obj->distanceToCamera += -16000.0f; } else { - obj->segment.object.distanceToCamera = -get_distance_to_camera( - obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); + obj->distanceToCamera = + -get_distance_to_camera(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position); } } else { //!@bug obj is NULL here, so it would probably cause a crash. Thankfully, gObjPtrList shouldn't have NULL //! objects in it. - obj->segment.object.distanceToCamera = 0.0f; + obj->distanceToCamera = 0.0f; } } @@ -4520,7 +4501,7 @@ void sort_objects_by_dist(s32 startIndex, s32 lastIndex) { do { didNotSwap = TRUE; for (i = startIndex; i < lastIndex; i++) { - if (gObjPtrList[i]->segment.object.distanceToCamera < gObjPtrList[i + 1]->segment.object.distanceToCamera) { + if (gObjPtrList[i]->distanceToCamera < gObjPtrList[i + 1]->distanceToCamera) { obj = gObjPtrList[i]; gObjPtrList[i] = gObjPtrList[i + 1]; gObjPtrList[i + 1] = obj; @@ -4550,7 +4531,7 @@ void process_object_interactions(void) { objsWithInteractives = 0; for (i = gObjectListStart; i < gObjectCount; i++) { obj = gObjPtrList[i]; - if (!(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { + if (!(obj->trans.flags & OBJ_FLAGS_PARTICLE)) { objInteract = obj->interactObj; if (objInteract != NULL) { objList[objsWithInteractives] = obj; @@ -4582,8 +4563,8 @@ void process_object_interactions(void) { if (objInteract2->unk11 == 3) { func_80016748(obj, obj2); } else if (objInteract2->unk11 != 2) { - xDiff = obj->segment.trans.x_position - obj2->segment.trans.x_position; - zDiff = obj->segment.trans.z_position - obj2->segment.trans.z_position; + xDiff = obj->trans.x_position - obj2->trans.x_position; + zDiff = obj->trans.z_position - obj2->trans.z_position; if (objInteract2->flags & INTERACT_FLAGS_UNK_0020) { radius = 0x400000; // 4194304.0f; } else { @@ -4613,9 +4594,9 @@ void process_object_interactions(void) { for (i = 0; i < objsWithInteractives; i++) { obj = objList[i]; objInteract = obj->interactObj; - objInteract->x_position = obj->segment.trans.x_position; - objInteract->y_position = obj->segment.trans.y_position; - objInteract->z_position = obj->segment.trans.z_position; + objInteract->x_position = obj->trans.x_position; + objInteract->y_position = obj->trans.y_position; + objInteract->z_position = obj->trans.z_position; } } @@ -4624,6 +4605,7 @@ void process_object_interactions(void) { void func_800159C8(Object *arg0, Object *arg1) { f32 sp9C; f32 sp98; + f32 temp_f10; // sp94 f32 sp90; f32 sp8C; f32 sp88; @@ -4632,332 +4614,235 @@ void func_800159C8(Object *arg0, Object *arg1) { f32 sp7C; f32 sp78; f32 sp74; + f32 var_f2; // sp70 + f32 temp_f0_3; // sp6C f32 sp68; f32 sp64; f32 sp60; + s32 var_v0; // sp5C ObjectInteraction *sp58; ObjectInteraction *sp54; - Object_64 *sp4C; + Object_Racer *sp50; + Object_Racer *sp4C; f32 sp48; f32 sp44; f32 sp40; - f32 sp3C; - f32 sp38; - f32 sp34; - f32 sp2C; - f32 sp28; - f32 sp24; - f32 sp20; - f32 sp1C; - f32 sp18; - ObjectInteraction *temp_a2; - ObjectInteraction *temp_t0; - Object_64 *temp_a1_2; - Object_64 *temp_a1_3; - Object_64 *temp_t5; - f32 temp_f0; - f32 temp_f0_2; - f32 temp_f0_3; - f32 temp_f0_5; - f32 temp_f0_7; - f32 temp_f0_8; - f32 temp_f0_9; - f32 temp_f10_2; - f32 temp_f10_3; - f32 temp_f12; - f32 temp_f12_2; - f32 temp_f12_3; - f32 temp_f12_4; - f32 temp_f12_5; - f32 temp_f14; - f32 temp_f14_2; - f32 temp_f14_3; - f32 temp_f14_4; - f32 temp_f14_5; - f32 temp_f16; - f32 temp_f16_2; - f32 temp_f18; - f32 temp_f2; - f32 temp_f2_2; - f32 temp_f2_3; - f32 temp_f4; - f32 temp_f4_2; - f32 var_f0; - f32 var_f0_2; - f32 var_f12; - f32 var_f12_2; - f32 var_f16; - f32 var_f16_2; - f32 var_f18; - f32 var_f2; - f64 temp_f0_4; - f64 temp_f0_6; - s16 temp_a1; - s32 temp_f10; - s32 var_at; - s32 var_t4; - s32 var_v0; - s32 var_v0_2; - s32 var_v0_3; - s32 var_v0_4; - s8 temp_v0_2; - s8 temp_v0_3; - u8 temp_v0; - temp_f2 = arg1->segment.trans.x_position - arg0->segment.trans.x_position; - var_f0 = arg1->segment.trans.y_position - arg0->segment.trans.y_position; - temp_f14 = arg1->segment.trans.z_position - arg0->segment.trans.z_position; - temp_a2 = arg1->interactObj; - temp_t0 = arg0->interactObj; - sp80 = 1.0f / gObjectUpdateRateF; - temp_v0 = temp_a2->unk11; - if (temp_v0 == 1) { - temp_f0 = -var_f0; - if (!(temp_f0 < ((f32) temp_a2->unk16 * 10.0f)) && !(((f32) temp_a2->unk17 * 10.0f) < temp_f0)) { - var_f0 = 0.0f; - sp64 = 0.0f; - } else { + sp68 = arg1->trans.x_position - arg0->trans.x_position; + sp64 = arg1->trans.y_position - arg0->trans.y_position; + sp60 = arg1->trans.z_position - arg0->trans.z_position; + + sp58 = arg0->interactObj; + sp54 = arg1->interactObj; + sp80 = 1 / gObjectUpdateRateF; + + if (sp54->unk11 == 1) { + if (-sp64 < sp54->unk16 * 10.0f || sp54->unk17 * 10.0f < -sp64) { return; } + sp64 = 0.0f; } - if ((temp_v0 == 4) && (var_f0 < 0.0f)) { - var_f0 = (f32) ((f64) var_f0 * 0.3); + if (sp54->unk11 == 4 && sp64 < 0.0f) { + sp64 *= 0.3; } - sp54 = temp_a2; - sp58 = temp_t0; - sp64 = var_f0; - sp68 = temp_f2; - sp60 = temp_f14; - var_f0_2 = sqrtf((temp_f2 * temp_f2) + (var_f0 * var_f0) + (temp_f14 * temp_f14)); - var_f16 = var_f0_2; - temp_f10 = (s32) (f32) (s32) var_f0_2; + + sp9C = sqrtf(sp68 * sp68 + sp64 * sp64 + sp60 * sp60); + temp_f10 = (s32) sp9C; + var_v0 = temp_f10; - if (temp_t0->flags & 0x20) { - var_v0 = temp_f10 >> 3; + if (sp58->flags & 0x20) { + var_v0 >>= 3; } - if (var_v0 >= 0x100) { - var_v0 = 0xFF; + if (var_v0 > 255) { + var_v0 = 255; } - if ((s32) temp_t0->distance >= var_v0) { - temp_t0->obj = arg1; - temp_t0->distance = (u8) var_v0; + if (sp58->distance >= var_v0) { + sp58->obj = arg1; + sp58->distance = var_v0; } - temp_a1 = temp_a2->flags; - var_v0_2 = temp_f10; - var_at = var_v0_2 < 0x100; - if (temp_a1 & 0x20) { - var_v0_2 = temp_f10 >> 3; - var_at = var_v0_2 < 0x100; + + var_v0 = temp_f10; + if (sp54->flags & 0x20) { + var_v0 >>= 3; } - if (var_at == 0) { - var_v0_2 = 0xFF; + if (var_v0 > 255) { + var_v0 = 255; } - var_t4 = temp_a1 & 1; - if ((s32) temp_a2->distance >= var_v0_2) { - temp_a2->obj = arg0; - temp_a2->distance = (u8) var_v0_2; - var_t4 = temp_a2->flags & 1; + if (sp54->distance >= var_v0) { + sp54->obj = arg0; + sp54->distance = var_v0; } - if (var_t4 != 0) { - sp98 = (f32) (temp_a2->hitboxRadius + temp_t0->hitboxRadius); - sp3C = temp_t0->x_position; - temp_f4 = arg0->segment.trans.x_position - sp3C; - sp7C = temp_f4; - sp38 = temp_t0->y_position; - sp34 = temp_t0->z_position; - var_f12 = arg0->segment.trans.y_position - sp38; - sp74 = arg0->segment.trans.z_position - sp34; - if (temp_a2->unk11 == 1) { - var_f12 = 0.0f; + + if (sp54->flags & 1) { + sp98 = sp54->hitboxRadius + sp58->hitboxRadius; + + sp7C = arg0->trans.x_position - sp58->x_position; + sp78 = arg0->trans.y_position - sp58->y_position; + sp74 = arg0->trans.z_position - sp58->z_position; + + if (sp54->unk11 == 1) { + sp78 = 0.0f; } - temp_f14_2 = (temp_f4 * temp_f4) + (var_f12 * var_f12) + (sp74 * sp74); - if ((f64) temp_f14_2 > 1.0) { - temp_f18 = arg1->segment.trans.x_position; - sp44 = arg1->segment.trans.y_position; - sp40 = arg1->segment.trans.z_position; - sp18 = sp74; - sp1C = sp3C; - sp20 = temp_f4; - sp24 = sp44; - sp28 = sp38; - sp2C = ((temp_f18 - sp3C) * temp_f4) + ((sp44 - sp38) * var_f12); - temp_f10_2 = sp18; - sp18 = sp40; - sp48 = temp_f18; - temp_f2_2 = (sp2C + ((sp40 - sp34) * temp_f10_2)) / temp_f14_2; - if (temp_f2_2 >= 0.0f) { - sp78 = var_f12; - if ((f64) temp_f2_2 <= 1.0) { - sp2C = sp34; - temp_f4_2 = sp1C + (temp_f2_2 * sp20); - sp8C = temp_f4_2; - sp54 = temp_a2; - temp_f10_3 = sp2C + (temp_f2_2 * temp_f10_2); - temp_f0_2 = temp_f4_2 - sp48; - temp_f14_3 = (sp28 + (temp_f2_2 * sp78)) - sp24; - sp84 = temp_f10_3; - sp58 = temp_t0; - temp_f16 = temp_f10_3 - sp18; - var_f0_2 = sqrtf((temp_f0_2 * temp_f0_2) + (temp_f14_3 * temp_f14_3) + (temp_f16 * temp_f16)); - var_f16 = var_f0_2; - } + if (sp7C * sp7C + sp78 * sp78 + sp74 * sp74 > 1.0) { + sp48 = arg1->trans.x_position; + sp44 = arg1->trans.y_position; + sp40 = arg1->trans.z_position; + var_f2 = ((sp48 - sp58->x_position) * sp7C + (sp44 - sp58->y_position) * sp78 + + (sp40 - sp58->z_position) * sp74) / + (sp7C * sp7C + sp78 * sp78 + sp74 * sp74); + + if (var_f2 >= 0.0f && var_f2 <= 1.0) { + sp8C = sp58->x_position + var_f2 * sp7C; + sp88 = sp58->y_position + var_f2 * sp78; + sp84 = sp58->z_position + var_f2 * sp74; + sp9C = sqrtf((sp8C - sp48) * (sp8C - sp48) + (sp88 - sp44) * (sp88 - sp44) + + (sp84 - sp40) * (sp84 - sp40)); } } - if ((var_f0_2 < sp98) && (var_f0_2 > 0.0f)) { - temp_f2_3 = temp_a2->x_position - temp_t0->x_position; - var_f18 = temp_a2->y_position - temp_t0->y_position; - temp_f14_4 = temp_a2->z_position - temp_t0->z_position; - if (temp_a2->unk11 == 1) { - var_f18 = 0.0f; + if (sp9C < sp98 && sp9C > 0.0f) { + sp8C = sp54->x_position - sp58->x_position; + sp88 = sp54->y_position - sp58->y_position; + sp84 = sp54->z_position - sp58->z_position; + if (sp54->unk11 == 1) { + sp88 = 0.0f; } - sp54 = temp_a2; - sp58 = temp_t0; - sp8C = temp_f2_3; - sp84 = temp_f14_4; - sp9C = var_f16; - sp88 = var_f18; - temp_f0_3 = sqrtf((temp_f2_3 * temp_f2_3) + (var_f18 * var_f18) + (temp_f14_4 * temp_f14_4)); + + temp_f0_3 = sqrtf(sp8C * sp8C + sp88 * sp88 + sp84 * sp84); if (temp_f0_3 > 0.0f) { - sp64 = var_f18 / temp_f0_3; - var_f12_2 = temp_f2_3 / temp_f0_3; - sp60 = temp_f14_4 / temp_f0_3; + sp68 = sp8C / temp_f0_3; + sp64 = sp88 / temp_f0_3; + sp60 = sp84 / temp_f0_3; } else { - var_f12_2 = sp68 / var_f16; - sp68 = var_f12_2; - sp64 /= var_f16; - sp60 /= var_f16; + sp68 /= sp9C; + sp64 /= sp9C; + sp60 /= sp9C; } - var_f16_2 = temp_f0_3 - var_f16; - if (var_f16_2 < 0.0f) { - var_f16_2 = -var_f16_2; + sp9C = temp_f0_3 - sp9C; + if (sp9C < 0.0f) { + sp9C = -sp9C; } - temp_f12 = var_f12_2 * var_f16_2; - sp64 *= var_f16_2; - sp60 *= var_f16_2; - temp_f16_2 = var_f16_2 * sp80; - temp_t0->flags |= 8; - temp_a2->flags |= 8; - if (temp_a2->pushForce == 0) { - arg0->segment.trans.x_position -= temp_f12; - arg0->segment.trans.y_position -= sp64; - arg0->segment.trans.z_position -= sp60; + + sp68 *= sp9C; + sp64 *= sp9C; + sp60 *= sp9C; + sp9C *= sp80; + sp58->flags |= 8; + sp54->flags |= 8; + if (sp54->pushForce == 0) { + arg0->trans.x_position -= sp68; + arg0->trans.y_position -= sp64; + arg0->trans.z_position -= sp60; + + sp68 *= sp80; sp60 *= sp80; if (arg0->behaviorId == 1) { - temp_a1_2 = arg0->unk64; - var_v0_3 = 0; - if (temp_a1_2->racer.vehicleID == 1) { - temp_f0_4 = (f64) temp_f16_2; - if (temp_f0_4 > 0.3) { - if (temp_f0_4 > 1.0) { - var_v0_3 = 1; + sp50 = arg0->racer; + var_v0 = FALSE; + if (sp50->vehicleID == 1) { + if (sp9C > 0.3) { + if (sp9C > 1.0) { + var_v0 = TRUE; } - if (var_v0_3 != 0) { - arg0->segment.x_velocity = (f32) ((f64) arg0->segment.x_velocity * 0.8); - arg0->segment.z_velocity = (f32) ((f64) arg0->segment.z_velocity * 0.8); + if (var_v0) { + arg0->x_velocity *= 0.8; + arg0->z_velocity *= 0.8; } - if (var_v0_3 != 0) { - temp_a2->flags |= 0x40; - temp_f12_2 = arg0->segment.z_velocity; - temp_f0_5 = arg0->segment.x_velocity; - temp_a1_2->racer.unk1D2 = 7; - if ((((arg1->segment.trans.x_position * temp_f12_2) - - (arg1->segment.trans.z_position * temp_f0_5)) - - ((arg0->segment.trans.x_position * temp_f12_2) - - (arg0->segment.trans.z_position * temp_f0_5))) >= 0.0f) { - temp_a1_2->racer.unk120 = (f32) ((f64) arg0->segment.x_velocity * 0.1); - temp_a1_2->racer.unk11C = (f32) ((f64) -arg0->segment.z_velocity * 0.1); + if (var_v0) { + sp54->flags |= 0x40; + var_f2 = (arg0->trans.x_position * arg0->z_velocity - + arg0->trans.z_position * arg0->x_velocity); + var_f2 = (arg1->trans.x_position * arg0->z_velocity - + arg1->trans.z_position * arg0->x_velocity) - + var_f2; + sp50->unk1D2 = 7; + if (var_f2 >= 0.0f) { + sp50->unk120 = arg0->x_velocity * 0.1; + sp50->unk11C = -arg0->z_velocity * 0.1; } else { - temp_a1_2->racer.unk120 = (f32) ((f64) -arg0->segment.x_velocity * 0.1); - temp_a1_2->racer.unk11C = (f32) ((f64) arg0->segment.z_velocity * 0.1); + sp50->unk120 = -arg0->x_velocity * 0.1; + sp50->unk11C = arg0->z_velocity * 0.1; } } } } else { - temp_f0_6 = (f64) temp_f16_2; - if (temp_f0_6 > 0.3) { - if (temp_f0_6 > 1.0) { - var_v0_3 = 1; + if (sp9C > 0.3) { + if (sp9C > 1.0) { + var_v0 = 1; } - arg0->segment.x_velocity -= temp_f12 * sp80; - arg0->segment.z_velocity -= sp60; - temp_a1_2->racer.lateral_velocity = 0.0f; - temp_a1_2->racer.velocity = (f32) (temp_f0_6 * 0.25); + arg0->x_velocity -= sp68; + arg0->z_velocity -= sp60; + sp50->velocity = sp9C * 0.25; + sp50->lateral_velocity = 0.0f; } - if (var_v0_3 != 0) { - temp_a2->flags |= 0x40; - temp_f12_3 = arg0->segment.z_velocity; - temp_f0_7 = arg0->segment.x_velocity; - if ((((arg1->segment.trans.x_position * temp_f12_3) - - (arg1->segment.trans.z_position * temp_f0_7)) - - ((arg0->segment.trans.x_position * temp_f12_3) - - (arg0->segment.trans.z_position * temp_f0_7))) >= 0.0f) { + if (var_v0) { + sp54->flags |= 0x40; + var_f2 = + arg0->trans.x_position * arg0->z_velocity - arg0->trans.z_position * arg0->x_velocity; + var_f2 = arg1->trans.x_position * arg0->z_velocity - + arg1->trans.z_position * arg0->x_velocity - var_f2; + if (var_f2 >= 0.0f) { var_f2 = 2.0f; } else { var_f2 = -2.0f; } - temp_f0_8 = temp_a1_2->racer.velocity; - temp_a1_2->racer.unk1D2 = 7; - temp_a1_2->racer.unk11C = temp_a1_2->racer.ox3 * var_f2 * temp_f0_8; - temp_a1_2->racer.unk120 = temp_a1_2->racer.oz3 * var_f2 * temp_f0_8; + sp50->unk1D2 = 7; + sp50->unk11C = sp50->ox3 * var_f2 * sp50->velocity; + sp50->unk120 = sp50->oz3 * var_f2 * sp50->velocity; } } - if ((var_v0_3 != 0) && (temp_a1_2->racer.playerIndex != -1)) { - func_80016500(arg0, &temp_a1_2->racer); + if (var_v0 && sp50->playerIndex != -1) { + func_80016500(arg0, sp50); } } } else { - temp_f12_4 = (f32) ((f64) temp_f12 * 0.5); - sp64 = (f32) ((f64) sp64 * 0.5); - sp60 = (f32) ((f64) sp60 * 0.5); - if (temp_t0->pushForce != 0) { - arg0->segment.trans.x_position -= temp_f12_4; - arg0->segment.trans.y_position -= sp64; - arg0->segment.trans.z_position -= sp60; + sp68 *= 0.5; + sp64 *= 0.5; + sp60 *= 0.5; + if (sp58->pushForce != 0) { + arg0->trans.x_position -= sp68; + arg0->trans.y_position -= sp64; + arg0->trans.z_position -= sp60; } - arg1->segment.trans.x_position += temp_f12_4; - arg1->segment.trans.y_position += sp64; - temp_f12_5 = temp_f12_4 * sp80; - arg1->segment.trans.z_position += sp60; + arg1->trans.x_position += sp68; + arg1->trans.y_position += sp64; + arg1->trans.z_position += sp60; + + sp68 *= sp80; sp60 *= sp80; - if ((arg0->behaviorId == 1) && (arg1->behaviorId == 1)) { - temp_a1_3 = arg0->unk64; - temp_t5 = arg1->unk64; - sp4C = temp_t5; - temp_v0_2 = temp_a1_3->racer.shieldType; - temp_f14_5 = (f32) ((f64) 1.0f + ((f64) (f32) (temp_t0->pushForce - temp_a2->pushForce) * 0.3)); - if (temp_v0_2 != 0) { - if (temp_t5->racer.shieldType == 0) { - temp_t5->racer.spinout_timer = temp_v0_2; - } + if (arg0->behaviorId == 1 && arg1->behaviorId == 1) { + sp90 = 1.0f; + sp90 += (f32) (sp58->pushForce - sp54->pushForce) * 0.3; + + sp50 = arg0->racer; + sp4C = arg1->racer; + + if (sp50->shieldType != 0 && sp4C->shieldType == 0) { + sp4C->spinout_timer = sp50->shieldType; } - temp_v0_3 = sp4C->racer.shieldType; - if ((temp_v0_3 != 0) && (temp_a1_3->racer.shieldType == 0)) { - temp_a1_3->racer.spinout_timer = temp_v0_3; + if (sp4C->shieldType != 0 && sp50->shieldType == 0) { + sp50->spinout_timer = sp4C->shieldType; } - var_v0_4 = 0; - if (temp_a1_3->racer.vehicleID == 1) { - var_v0_4 = 1; - sp68 = temp_f12_5; - } else { - sp68 = temp_f12_5; - if ((f64) temp_f16_2 > 0.1) { - var_v0_4 = 1; - sp68 = (f32) ((f64) sp68 * 0.5); - sp60 = (f32) ((f64) sp60 * 0.5); - } + + var_v0 = FALSE; + if (sp50->vehicleID == 1) { + var_v0 = TRUE; + } else if (sp9C > 0.1) { + var_v0 = TRUE; + sp68 *= 0.5; + sp60 *= 0.5; } - if (var_v0_4 != 0) { - if (temp_t0->pushForce != 0) { - temp_f0_9 = (f32) (2.0 - (f64) temp_f14_5); - arg0->segment.x_velocity -= sp68 * temp_f0_9; - arg0->segment.z_velocity -= sp60 * temp_f0_9; - sp90 = temp_f14_5; - func_80016500(arg0, &temp_a1_3->racer); + + if (var_v0) { + if (sp58->pushForce != 0) { + temp_f0_3 = 2.0 - sp90; + arg0->x_velocity -= sp68 * temp_f0_3; + arg0->z_velocity -= sp60 * temp_f0_3; + func_80016500(arg0, sp50); } - arg1->segment.x_velocity += sp68 * temp_f14_5; - arg1->segment.z_velocity += sp60 * temp_f14_5; - func_80016500(arg1, &sp4C->racer); + arg1->x_velocity += sp68 * sp90; + arg1->z_velocity += sp60 * sp90; + func_80016500(arg1, sp4C); } } } @@ -4986,8 +4871,8 @@ void func_80016500(Object *obj, Object_Racer *racer) { } cosAngle = coss_f(-angle); sinAngle = sins_f(-angle); - racer->lateral_velocity = (obj->segment.x_velocity * cosAngle) + (obj->segment.z_velocity * sinAngle); - racer->velocity = (-obj->segment.x_velocity * sinAngle) + (obj->segment.z_velocity * cosAngle); + racer->lateral_velocity = (obj->x_velocity * cosAngle) + (obj->z_velocity * sinAngle); + racer->velocity = (-obj->x_velocity * sinAngle) + (obj->z_velocity * cosAngle); if (racer->playerIndex != PLAYER_COMPUTER) { volume = (startVelocity - racer->velocity) * 14.0f; if (volume < 0) { @@ -5049,22 +4934,22 @@ void func_80016748(Object *obj0, Object *obj1) { if (obj1->curVertData != NULL) { modInst = obj1->modelInstances[0]; objModel = modInst->objModel; - xDiff = obj0->segment.trans.x_position - obj1->segment.trans.x_position; - yDiff = obj0->segment.trans.y_position - obj1->segment.trans.y_position; - zDiff = obj0->segment.trans.z_position - obj1->segment.trans.z_position; + xDiff = obj0->trans.x_position - obj1->trans.x_position; + yDiff = obj0->trans.y_position - obj1->trans.y_position; + zDiff = obj0->trans.z_position - obj1->trans.z_position; if (!((objModel->unk3C + 50.0) < sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)))) { obj0Interact = obj0->interactObj; obj1Interact = obj1->interactObj; - mtxf_from_transform((MtxF *) obj1TransformMtx, &obj1->segment.trans); + mtxf_from_transform((MtxF *) obj1TransformMtx, &obj1->trans); for (i = 0; i < objModel->unk20; i += 2) { xDiff = obj1->curVertData[objModel->unk1C[i]].x; yDiff = obj1->curVertData[objModel->unk1C[i]].y; zDiff = obj1->curVertData[objModel->unk1C[i]].z; mtxf_transform_point((MtxF *) obj1TransformMtx, xDiff, yDiff, zDiff, &xDiff, &yDiff, &zDiff); - temp = (((f32) objModel->unk1C[i + 1] / 64) * obj1->segment.trans.scale) * 50.0; - xDiff -= obj0->segment.trans.x_position; - yDiff -= obj0->segment.trans.y_position; - zDiff -= obj0->segment.trans.z_position; + temp = (((f32) objModel->unk1C[i + 1] / 64) * obj1->trans.scale) * 50.0; + xDiff -= obj0->trans.x_position; + yDiff -= obj0->trans.y_position; + zDiff -= obj0->trans.z_position; distance = sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)); temp += obj1Interact->hitboxRadius; if (distance < temp && distance > 0.0f) { @@ -5080,23 +4965,23 @@ void func_80016748(Object *obj0, Object *obj1) { xDiff *= radius; yDiff *= radius; zDiff *= radius; - obj0->segment.trans.x_position -= xDiff; - obj0->segment.trans.y_position -= yDiff; - obj0->segment.trans.z_position -= zDiff; + obj0->trans.x_position -= xDiff; + obj0->trans.y_position -= yDiff; + obj0->trans.z_position -= zDiff; if (obj0->behaviorId == BHV_RACER) { - racer = &obj0->unk64->racer; + racer = obj0->racer; if (!racer->raceFinished) { rumble_set(racer->playerIndex, RUMBLE_TYPE_18); } if (racer->vehicleID == VEHICLE_HOVERCRAFT) { if (radius > 0.1) { - obj0->segment.x_velocity -= xDiff; - obj0->segment.z_velocity -= zDiff; + obj0->x_velocity -= xDiff; + obj0->z_velocity -= zDiff; } } else if (radius > 0.3) { - obj0->segment.x_velocity -= xDiff; - obj0->segment.z_velocity -= zDiff; + obj0->x_velocity -= xDiff; + obj0->z_velocity -= zDiff; racer->velocity = radius * 4.0f; racer->lateral_velocity = 0.0f; } @@ -5113,7 +4998,7 @@ void func_80016BC4(Object *obj) { obj->unk5C->unk104 = 0; func_8001709C(obj); func_8001709C(obj); - for (i = 0; i < obj->segment.header->numberOfModelIds; i++) { + for (i = 0; i < obj->header->numberOfModelIds; i++) { if (obj->modelInstances[i] != NULL) { func_8006017C(obj->modelInstances[i]->objModel); } @@ -5133,11 +5018,11 @@ Object *obj_butterfly_node(f32 x, f32 y, f32 z, f32 maxDistCheck, s32 dontCheckY for (i = 0; i < gObjectCount; i++) { curObj = gObjPtrList[i]; - if (!(curObj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && curObj->behaviorId == BHV_ANIMATED_OBJECT_3) { - diffX = curObj->segment.trans.x_position - x; - diffZ = curObj->segment.trans.z_position - z; + if (!(curObj->trans.flags & OBJ_FLAGS_PARTICLE) && curObj->behaviorId == BHV_ANIMATED_OBJECT_3) { + diffX = curObj->trans.x_position - x; + diffZ = curObj->trans.z_position - z; if (!dontCheckYAxis) { - diffY = curObj->segment.trans.y_position - y; + diffY = curObj->trans.y_position - y; distance = sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)); } else { distance = sqrtf((diffX * diffX) + (diffZ * diffZ)); @@ -5172,16 +5057,16 @@ s32 obj_dist_racer(f32 x, f32 y, f32 z, f32 radius, s32 is2dCheck, Object **sort if (gNumRacers > 0) { for (i = 0; i < gNumRacers; i++) { racerObj = (*gRacers)[i]; - racer = &racerObj->unk64->racer; + racer = racerObj->racer; if (racer->playerIndex >= 0 && racer->playerIndex < 4) { if (is2dCheck) { - xDiff = racerObj->segment.trans.x_position - x; - zDiff = racerObj->segment.trans.z_position - z; + xDiff = racerObj->trans.x_position - x; + zDiff = racerObj->trans.z_position - z; yDiff = sqrtf((xDiff * xDiff) + (zDiff * zDiff)); } else { - xDiff = racerObj->segment.trans.x_position - x; - yDiff = racerObj->segment.trans.y_position - y; - zDiff = racerObj->segment.trans.z_position - z; + xDiff = racerObj->trans.x_position - x; + yDiff = racerObj->trans.y_position - y; + zDiff = racerObj->trans.z_position - z; yDiff = sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)); } if (yDiff < radius) { @@ -5220,15 +5105,15 @@ void func_8001709C(Object *obj) { obj5C = obj->unk5C; obj5C->unk104 = (obj5C->unk104 + 1) & 1; sp6C = (MtxF *) &obj5C->_matrices[obj5C->unk104 << 1]; - sp78.rotation.y_rotation = -obj->segment.trans.rotation.y_rotation; - sp78.rotation.x_rotation = -obj->segment.trans.rotation.x_rotation; - sp78.rotation.z_rotation = -obj->segment.trans.rotation.z_rotation; + sp78.rotation.y_rotation = -obj->trans.rotation.y_rotation; + sp78.rotation.x_rotation = -obj->trans.rotation.x_rotation; + sp78.rotation.z_rotation = -obj->trans.rotation.z_rotation; sp78.scale = 1.0f; - sp78.x_position = -obj->segment.trans.x_position; - sp78.y_position = -obj->segment.trans.y_position; - sp78.z_position = -obj->segment.trans.z_position; + sp78.x_position = -obj->trans.x_position; + sp78.y_position = -obj->trans.y_position; + sp78.z_position = -obj->trans.z_position; mtxf_from_inverse_transform(sp6C, &sp78); - inverseScale = 1.0 / obj->segment.trans.scale; + inverseScale = 1.0 / obj->trans.scale; i = 0; while (i < 16) { ((f32 *) sp2C)[i] = 0.0f; @@ -5239,13 +5124,13 @@ void func_8001709C(Object *obj) { sp2C[2][2] = inverseScale; sp2C[3][3] = 1.0f; mtxf_mul(sp6C, &sp2C, sp6C); - sp78.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - sp78.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; - sp78.rotation.z_rotation = obj->segment.trans.rotation.z_rotation; + sp78.rotation.y_rotation = obj->trans.rotation.y_rotation; + sp78.rotation.x_rotation = obj->trans.rotation.x_rotation; + sp78.rotation.z_rotation = obj->trans.rotation.z_rotation; sp78.scale = 1.0 / inverseScale; - sp78.x_position = obj->segment.trans.x_position; - sp78.y_position = obj->segment.trans.y_position; - sp78.z_position = obj->segment.trans.z_position; + sp78.x_position = obj->trans.x_position; + sp78.y_position = obj->trans.y_position; + sp78.z_position = obj->trans.z_position; mtxf_from_transform((MtxF *) obj5C->_matrices[(obj5C->unk104 + 2) << 1], &sp78); obj5C->unk100 = NULL; } @@ -5327,10 +5212,10 @@ s32 func_80017248(Object *obj, s32 arg1, s32 *arg2, Vec3f *arg3, f32 *arg4, f32 var_s2 = 0; do { temp_v0 = *(D_8011AE6C + var_s2); - objModel = temp_v0->modelInstances[temp_v0->segment.object.modelIndex]->objModel; - temp_f14 = temp_v0->segment.trans.x_position - obj->segment.trans.x_position; - temp_f0 = temp_v0->segment.trans.y_position - obj->segment.trans.y_position; - temp_f2 = temp_v0->segment.trans.z_position - obj->segment.trans.z_position; + objModel = temp_v0->modelInstances[temp_v0->modelIndex]->objModel; + temp_f14 = temp_v0->trans.x_position - obj->trans.x_position; + temp_f0 = temp_v0->trans.y_position - obj->trans.y_position; + temp_f2 = temp_v0->trans.z_position - obj->trans.z_position; otherObj = temp_v0; temp_f0_2 = sqrtf((temp_f14 * temp_f14) + (temp_f0 * temp_f0) + (temp_f2 * temp_f2)); temp_v1 = otherObj->interactObj; @@ -5348,7 +5233,7 @@ s32 func_80017248(Object *obj, s32 arg1, s32 *arg2, Vec3f *arg3, f32 *arg4, f32 otherObj->interactObj->obj = obj; } temp_v1_2 = &(&sp8C[0])[sp160]; - if ((temp_f0_2 - 25.0f) < (objModel->unk3C * otherObj->segment.trans.scale)) { + if ((temp_f0_2 - 25.0f) < (objModel->unk3C * otherObj->trans.scale)) { (&spB4[0])[sp160] = sp170; temp_v1_2[0] = temp_f0_2; if (sp160 > 0) { @@ -5389,7 +5274,7 @@ s32 func_80017248(Object *obj, s32 arg1, s32 *arg2, Vec3f *arg3, f32 *arg4, f32 do { temp_a1 = D_8011AE6C[*sp88]; var_s1 = 0; - objModel = temp_a1->modelInstances[temp_a1->segment.object.modelIndex]->objModel; + objModel = temp_a1->modelInstances[temp_a1->modelIndex]->objModel; temp_v0_2 = temp_a1->unk5C; var_fp_2 = 0; sp16C = 1; @@ -5466,7 +5351,7 @@ s32 func_80017248(Object *obj, s32 arg1, s32 *arg2, Vec3f *arg3, f32 *arg4, f32 *arg2 = 0; sp16C = var_t0; temp_v0_4 = func_80017A18(objModel, arg1, arg2, &sp13C, &sp12C, &sp11C, sp100, spF0, spE0, arg5, surface, - (f32) (1.0 / (f64) otherObj->segment.trans.scale)); + (f32) (1.0 / (f64) otherObj->trans.scale)); var_t0_2 = sp16C; if (temp_v0_4 != 0) { otherObj->unk5C->unk100 = obj; @@ -5734,9 +5619,9 @@ void func_80017E98(void) { gNumberOfCheckpoints = 0; for (i = 0; i < gObjectCount; i++) { obj = gObjPtrList[i]; - if (!(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && obj->behaviorId == BHV_CHECKPOINT && + if (!(obj->trans.flags & OBJ_FLAGS_PARTICLE) && obj->behaviorId == BHV_CHECKPOINT && gNumberOfCheckpoints < MAX_CHECKPOINTS) { - checkpointEntry = &obj->segment.level_entry->checkpoint; + checkpointEntry = &obj->level_entry->checkpoint; if (checkpointEntry->unk1A == gTajChallengeType) { gTrackCheckpoints[gNumberOfCheckpoints].obj = obj; var_a0 = checkpointEntry->unk9; @@ -5792,10 +5677,10 @@ void func_80017E98(void) { for (i = 0; i < D_8011AED4; i++) { checkpoint = &gTrackCheckpoints[i]; obj = checkpoint->obj; - checkpointEntry = &obj->segment.level_entry->checkpoint; - transform.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - transform.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; - transform.rotation.z_rotation = obj->segment.trans.rotation.z_rotation; + checkpointEntry = &obj->level_entry->checkpoint; + transform.rotation.y_rotation = obj->trans.rotation.y_rotation; + transform.rotation.x_rotation = obj->trans.rotation.x_rotation; + transform.rotation.z_rotation = obj->trans.rotation.z_rotation; transform.scale = 1.0f; transform.x_position = 0.0f; transform.y_position = 0.0f; @@ -5805,13 +5690,13 @@ void func_80017E98(void) { checkpoint->rotationXFrac = ox; checkpoint->rotationYFrac = oy; checkpoint->rotationZFrac = oz; - checkpoint->unkC = -(((obj->segment.trans.x_position * ox) + (obj->segment.trans.y_position * oy)) + - (obj->segment.trans.z_position * oz)); - checkpoint->x = obj->segment.trans.x_position; - checkpoint->y = obj->segment.trans.y_position; - checkpoint->z = obj->segment.trans.z_position; - checkpoint->scale = obj->segment.trans.scale * 2; - checkpoint->unk2C = obj->segment.trans.scale * 128.0f; + checkpoint->unkC = + -(((obj->trans.x_position * ox) + (obj->trans.y_position * oy)) + (obj->trans.z_position * oz)); + checkpoint->x = obj->trans.x_position; + checkpoint->y = obj->trans.y_position; + checkpoint->z = obj->trans.z_position; + checkpoint->scale = obj->trans.scale * 2; + checkpoint->unk2C = obj->trans.scale * 128.0f; checkpoint->unk24 = 0.0f; checkpoint->distance = 0.0f; if (i < gNumberOfCheckpoints) { @@ -5819,15 +5704,15 @@ void func_80017E98(void) { if (temp_v1 == gNumberOfCheckpoints) { temp_v1 = 0; } - xDiff = obj->segment.trans.x_position - gTrackCheckpoints[temp_v1].obj->segment.trans.x_position; - yDiff = obj->segment.trans.y_position - gTrackCheckpoints[temp_v1].obj->segment.trans.y_position; - zDiff = obj->segment.trans.z_position - gTrackCheckpoints[temp_v1].obj->segment.trans.z_position; + xDiff = obj->trans.x_position - gTrackCheckpoints[temp_v1].obj->trans.x_position; + yDiff = obj->trans.y_position - gTrackCheckpoints[temp_v1].obj->trans.y_position; + zDiff = obj->trans.z_position - gTrackCheckpoints[temp_v1].obj->trans.z_position; checkpoint->distance = sqrtf(((xDiff * xDiff) + (yDiff * yDiff)) + (zDiff * zDiff)); altRouteId = gTrackCheckpoints[temp_v1].altRouteID; if (altRouteId != -1) { - xDiff = obj->segment.trans.x_position - gTrackCheckpoints[altRouteId].obj->segment.trans.x_position; - yDiff = obj->segment.trans.y_position - gTrackCheckpoints[altRouteId].obj->segment.trans.y_position; - zDiff = obj->segment.trans.z_position - gTrackCheckpoints[altRouteId].obj->segment.trans.z_position; + xDiff = obj->trans.x_position - gTrackCheckpoints[altRouteId].obj->trans.x_position; + yDiff = obj->trans.y_position - gTrackCheckpoints[altRouteId].obj->trans.y_position; + zDiff = obj->trans.z_position - gTrackCheckpoints[altRouteId].obj->trans.z_position; checkpoint->unk24 = sqrtf(((xDiff * xDiff) + (yDiff * yDiff)) + (zDiff * zDiff)); } else { checkpoint->unk24 = checkpoint->distance; @@ -5837,15 +5722,15 @@ void func_80017E98(void) { if (temp_v1 == gNumberOfCheckpoints) { temp_v1 = 0; } - xDiff = obj->segment.trans.x_position - gTrackCheckpoints[temp_v1].obj->segment.trans.x_position; - yDiff = obj->segment.trans.y_position - gTrackCheckpoints[temp_v1].obj->segment.trans.y_position; - zDiff = obj->segment.trans.z_position - gTrackCheckpoints[temp_v1].obj->segment.trans.z_position; + xDiff = obj->trans.x_position - gTrackCheckpoints[temp_v1].obj->trans.x_position; + yDiff = obj->trans.y_position - gTrackCheckpoints[temp_v1].obj->trans.y_position; + zDiff = obj->trans.z_position - gTrackCheckpoints[temp_v1].obj->trans.z_position; checkpoint->distance = sqrtf(((xDiff * xDiff) + (yDiff * yDiff)) + (zDiff * zDiff)); altRouteId = gTrackCheckpoints[temp_v1].altRouteID; if (altRouteId != -1) { - xDiff = obj->segment.trans.x_position - gTrackCheckpoints[altRouteId].obj->segment.trans.x_position; - yDiff = obj->segment.trans.y_position - gTrackCheckpoints[altRouteId].obj->segment.trans.y_position; - zDiff = obj->segment.trans.z_position - gTrackCheckpoints[altRouteId].obj->segment.trans.z_position; + xDiff = obj->trans.x_position - gTrackCheckpoints[altRouteId].obj->trans.x_position; + yDiff = obj->trans.y_position - gTrackCheckpoints[altRouteId].obj->trans.y_position; + zDiff = obj->trans.z_position - gTrackCheckpoints[altRouteId].obj->trans.z_position; checkpoint->unk24 = sqrtf(((xDiff * xDiff) + (yDiff * yDiff)) + (zDiff * zDiff)); } else { checkpoint->unk24 = checkpoint->distance; @@ -5903,9 +5788,9 @@ s32 func_800185E4(s32 checkpointIndex, Object *obj, f32 objX, f32 objY, f32 objZ sp70 = FALSE; if (!(*arg6) && sp48->altRouteID == -1 && sp4C->altRouteID != -1) { sp44 = &gTrackCheckpoints[sp4C->altRouteID]; - sp6C = sp44->x - obj->segment.trans.x_position; - sp68 = sp44->y - obj->segment.trans.y_position; - sp64 = sp44->z - obj->segment.trans.z_position; + sp6C = sp44->x - obj->trans.x_position; + sp68 = sp44->y - obj->trans.y_position; + sp64 = sp44->z - obj->trans.z_position; if (sqrtf(sp6C * sp6C + sp68 * sp68 + sp64 * sp64) < sp44->unk2C) { sp4C = sp44; sp70 = TRUE; @@ -5922,14 +5807,14 @@ s32 func_800185E4(s32 checkpointIndex, Object *obj, f32 objX, f32 objY, f32 objZ sp64 *= 1.0f / length; } - sp58 = sp4C->rotationXFrac * obj->segment.trans.x_position + sp4C->rotationYFrac * obj->segment.trans.y_position + - sp4C->rotationZFrac * obj->segment.trans.z_position + sp4C->unkC; + sp58 = sp4C->rotationXFrac * obj->trans.x_position + sp4C->rotationYFrac * obj->trans.y_position + + sp4C->rotationZFrac * obj->trans.z_position + sp4C->unkC; sp5C = sp4C->rotationXFrac * sp6C + sp4C->rotationYFrac * sp68 + sp4C->rotationZFrac * sp64; sp5C = -sp58 / sp5C; - sp50 = sp48->rotationXFrac * obj->segment.trans.x_position + sp48->rotationYFrac * obj->segment.trans.y_position + - sp48->rotationZFrac * obj->segment.trans.z_position + sp48->unkC; + sp50 = sp48->rotationXFrac * obj->trans.x_position + sp48->rotationYFrac * obj->trans.y_position + + sp48->rotationZFrac * obj->trans.z_position + sp48->unkC; length = sp48->rotationXFrac * sp6C + sp48->rotationYFrac * sp68 + sp48->rotationZFrac * sp64; length = sp50 / length; @@ -5942,7 +5827,7 @@ s32 func_800185E4(s32 checkpointIndex, Object *obj, f32 objX, f32 objY, f32 objZ *arg5 = length; if (obj->behaviorId == BHV_RACER) { - racer = &obj->unk64->racer; + racer = obj->racer; if (racer->playerIndex == PLAYER_COMPUTER) { if (length < -0.3) { return -100; @@ -5964,7 +5849,7 @@ s32 func_800185E4(s32 checkpointIndex, Object *obj, f32 objX, f32 objY, f32 objZ if (sp68 > 0) { if (obj->behaviorId == BHV_RACER) { Object_Racer *racer; - racer = &obj->unk64->racer; + racer = obj->racer; if (sp4C->unk3B != 0) { racer->indicator_type = sp4C->unk3B; racer->indicator_timer = 120; @@ -5979,15 +5864,13 @@ s32 func_800185E4(s32 checkpointIndex, Object *obj, f32 objX, f32 objY, f32 objZ sp4C = &gTrackCheckpoints[checkpointIndex]; - sp58 = sp4C->rotationXFrac * obj->segment.trans.x_position + - sp4C->rotationYFrac * obj->segment.trans.y_position + - sp4C->rotationZFrac * obj->segment.trans.z_position + sp4C->unkC; + sp58 = sp4C->rotationXFrac * obj->trans.x_position + sp4C->rotationYFrac * obj->trans.y_position + + sp4C->rotationZFrac * obj->trans.z_position + sp4C->unkC; sp5C = sp4C->rotationXFrac * sp6C + sp4C->rotationYFrac * sp68 + sp4C->rotationZFrac * sp64; sp5C = -sp58 / sp5C; - sp50 = sp48->rotationXFrac * obj->segment.trans.x_position + - sp48->rotationYFrac * obj->segment.trans.y_position + - sp48->rotationZFrac * obj->segment.trans.z_position + sp48->unkC; + sp50 = sp48->rotationXFrac * obj->trans.x_position + sp48->rotationYFrac * obj->trans.y_position + + sp48->rotationZFrac * obj->trans.z_position + sp48->unkC; length = sp48->rotationXFrac * sp6C + sp48->rotationYFrac * sp68 + sp48->rotationZFrac * sp64; length = sp50 / length; @@ -6019,7 +5902,7 @@ Object *find_taj_object(void) { Object *current_obj; for (i = gObjectListStart; i < gObjectCount; i++) { current_obj = gObjPtrList[i]; - if (!(current_obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && (current_obj->behaviorId == BHV_PARK_WARDEN)) { + if (!(current_obj->trans.flags & OBJ_FLAGS_PARTICLE) && (current_obj->behaviorId == BHV_PARK_WARDEN)) { return current_obj; } } @@ -6097,21 +5980,21 @@ void func_80018CE0(Object *racerObj, f32 xPos, f32 yPos, f32 zPos, s32 updateRat Object_MidiFadePoint *midiFadePoint2; Object_MidiChannelSet *midiChannelSet; - if (racerObj->unk64->racer.playerIndex == 0) { + if (racerObj->racer->playerIndex == 0) { if (cam_get_viewport_layout() == 0) { spF4 = gObjectListStart; if (gObjectListStart < gObjectCount) { sp98 = gObjectListStart * 4; do { obj = *(gObjPtrList + sp98); - if (!(obj->segment.trans.flags & 0x8000)) { + if (!(obj->trans.flags & 0x8000)) { behaviorId = obj->behaviorId; if (behaviorId == BHV_MIDI_FADE_POINT) { - temp_f0 = racerObj->segment.trans.x_position - obj->segment.trans.x_position; - temp_f2 = racerObj->segment.trans.y_position - obj->segment.trans.y_position; - temp_f14 = racerObj->segment.trans.z_position - obj->segment.trans.z_position; + temp_f0 = racerObj->trans.x_position - obj->trans.x_position; + temp_f2 = racerObj->trans.y_position - obj->trans.y_position; + temp_f14 = racerObj->trans.z_position - obj->trans.z_position; temp_f0_2 = sqrtf((temp_f0 * temp_f0) + (temp_f2 * temp_f2) + (temp_f14 * temp_f14)); - midiFadePoint = &obj->unk64->midi_fade_point; + midiFadePoint = obj->midi_fade_point; temp_f2_2 = temp_f0_2; temp_t2 = midiFadePoint->unk2; var_f8 = (f32) temp_t2; @@ -6160,16 +6043,16 @@ void func_80018CE0(Object *racerObj, f32 xPos, f32 yPos, f32 zPos, s32 updateRat } } } else if (behaviorId == BHV_MIDI_FADE) { - midiFade = &obj->unk64->midi_fade; + midiFade = obj->midi_fade; temp_f16 = midiFade->unkC; temp_f30 = temp_f16 * yPos; temp_f18 = midiFade->unk10; temp_f12 = midiFade->unk8; temp_f14_2 = temp_f18 * zPos; - temp_f24 = racerObj->segment.trans.x_position; - temp_f26 = racerObj->segment.trans.y_position; + temp_f24 = racerObj->trans.x_position; + temp_f26 = racerObj->trans.y_position; temp_f20 = midiFade->unk14; - temp_f28 = racerObj->segment.trans.z_position; + temp_f28 = racerObj->trans.z_position; sp78 = temp_f14_2; temp_f0_3 = (temp_f12 * xPos) + temp_f30 + temp_f14_2 + temp_f20; temp_f2_3 = @@ -6205,10 +6088,10 @@ void func_80018CE0(Object *racerObj, f32 xPos, f32 yPos, f32 zPos, s32 updateRat } } } else if (behaviorId == BHV_MIDI_CHANNEL_SET) { - temp_f0_7 = racerObj->segment.trans.x_position - obj->segment.trans.x_position; - temp_f2_5 = racerObj->segment.trans.y_position - obj->segment.trans.y_position; - temp_f14_4 = racerObj->segment.trans.z_position - obj->segment.trans.z_position; - midiChannelSet = &obj->unk64->midi_channel_set; + temp_f0_7 = racerObj->trans.x_position - obj->trans.x_position; + temp_f2_5 = racerObj->trans.y_position - obj->trans.y_position; + temp_f14_4 = racerObj->trans.z_position - obj->trans.z_position; + midiChannelSet = obj->midi_channel_set; if ((sqrtf((temp_f0_7 * temp_f0_7) + (temp_f2_5 * temp_f2_5) + (temp_f14_4 * temp_f14_4)) < (f32) (midiChannelSet->unk2 * 4)) && (midiChannelSet->unk0 != music_channel_get_mask()) && @@ -6353,9 +6236,9 @@ s32 func_8001955C(Object *obj, s32 checkpoint, u8 arg2, s32 arg3, s32 arg4, f32 dy *= temp2; dz *= temp2; } - *outX = (xSpline + dx) - obj->segment.trans.x_position; - *outY = (ySpline + dy) - obj->segment.trans.y_position; - *outZ = (zSpline + dz) - obj->segment.trans.z_position; + *outX = (xSpline + dx) - obj->trans.x_position; + *outY = (ySpline + dy) - obj->trans.y_position; + *outZ = (zSpline + dz) - obj->trans.z_position; return TRUE; } @@ -6404,14 +6287,14 @@ void race_check_finish(s32 updateRate) { } if (gRaceFinishTriggered == FALSE) { for (i = 0; i < gNumRacers; i++) { - racer[i] = &(*gRacers)[i]->unk64->racer; + racer[i] = (*gRacers)[i]->racer; // Manage eliminated racers in deathmatch. if (currentLevelHeader->race_type == RACETYPE_CHALLENGE_BATTLE && racer[i]->bananas <= 0 && !racer[i]->raceFinished) { racer[i]->raceFinished = TRUE; racer[i]->balloon_quantity = 0; racer_sound_free((*gRacers)[i]); - (*gRacers)[i]->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + (*gRacers)[i]->trans.flags |= OBJ_FLAGS_INVISIBLE; (*gRacers)[i]->interactObj->flags = INTERACT_FLAGS_NONE; racer[i]->finishPosition = 5 - gNumFinishedRacers; gNumFinishedRacers++; @@ -6549,12 +6432,12 @@ void race_check_finish(s32 updateRate) { i = 0; do { racerPos = 1; - curRacer = &(*gRacers)[i]->unk64->racer; + curRacer = (*gRacers)[i]->racer; prevRacerPos = curRacer->racerOrder; j = 0; do { if (j != i) { - curRacer2 = &(*gRacers)[j]->unk64->racer; + curRacer2 = (*gRacers)[j]->racer; if (curRacer->raceFinished == FALSE && curRacer2->raceFinished != FALSE) { racerPos++; } else if (curRacer->courseCheckpoint < curRacer2->courseCheckpoint) { @@ -6591,7 +6474,7 @@ void race_check_finish(s32 updateRate) { i = 0; do { - curRacer = &(*gRacers)[i]->unk64->racer; + curRacer = (*gRacers)[i]->racer; if (curRacer->lap >= currentLevelHeader->laps && curRacer->raceFinished == FALSE) { if (get_game_mode() != GAMEMODE_UNUSED_4) { curRacer->raceFinished = TRUE; @@ -6624,7 +6507,7 @@ void race_check_finish(s32 updateRate) { i = 0; do { - curRacer = &(*gRacers)[i]->unk64->racer; + curRacer = (*gRacers)[i]->racer; if (curRacer->raceFinished) { racerPos = curRacer->finishPosition - 1; } else { @@ -6676,7 +6559,7 @@ void race_check_finish(s32 updateRate) { if (gIsTajChallenge && numHumanRacersFinished != 0) { mode_end_taj_race(CHALLENGE_END_FINISH); } else if (D_8011AD3C != 0 && numFinishedRacers != 0) { - curRacer = &(*gRacers)[0]->unk64->racer; + curRacer = (*gRacers)[0]->racer; if (!curRacer->raceFinished) { curRacer->raceFinished = TRUE; curRacer->finishPosition = gNumFinishedRacers; @@ -6694,7 +6577,7 @@ void race_check_finish(s32 updateRate) { if (numHumanRacersFinished != numHumanRacers) { i = 0; do { - curRacer = &gRacersByPosition[i]->unk64->racer; + curRacer = gRacersByPosition[i]->racer; if (curRacer->raceFinished == FALSE) { if (curRacer->playerIndex >= 0) { set_active_camera(curRacer->playerIndex); @@ -6726,7 +6609,7 @@ void race_check_finish(s32 updateRate) { if (!gIsTimeTrial) { i = 0; do { - curRacer = &gRacersByPosition[i]->unk64->racer; + curRacer = gRacersByPosition[i]->racer; racerPos = curRacer->racerIndex; settings->racers[racerPos].starting_position = i; i++; @@ -6738,7 +6621,7 @@ void race_check_finish(s32 updateRate) { (settings->racers[PLAYER_TWO].starting_position < settings->racers[PLAYER_ONE].starting_position)) { gSwapLeadPlayer = TRUE; } - curRacer = &(*gRacersByPosition)->unk64->racer; + curRacer = (*gRacersByPosition)->racer; gFirstTimeFinish = FALSE; if ((settings->gNumRacers == 1 || is_in_two_player_adventure()) && curRacer->playerIndex != PLAYER_COMPUTER && !is_in_tracks_mode() && get_trophy_race_world_id() == 0) { @@ -6796,7 +6679,7 @@ void race_check_finish(s32 updateRate) { s8 set_course_finish_flags(Settings *settings) { Object_Racer *racer; - racer = &gRacersByPosition[PLAYER_ONE]->unk64->racer; + racer = gRacersByPosition[PLAYER_ONE]->racer; if (racer->playerIndex == PLAYER_COMPUTER) { return FALSE; } @@ -6849,7 +6732,7 @@ void race_transition_adventure(s32 updateRate) { sp30 = 0; if (gRaceEndStage == 0 && gRaceEndTimer == -1) { for (i = 0; i < gNumRacers; i++) { - racer = &(*gRacers)[i]->unk64->racer; + racer = (*gRacers)[i]->racer; racer->magnetTargetObj = NULL; if (racer->playerIndex != PLAYER_COMPUTER && racer->finishPosition == 1) { sp30 = i; @@ -6873,7 +6756,7 @@ void race_transition_adventure(s32 updateRate) { cam_set_layout(VIEWPORT_LAYOUT_1_PLAYER); prevRacer0Obj = (*gRacers)[0]; prevPort0Racer = gRacersByPort[0]; - racer = &prevRacer0Obj->unk64->racer; + racer = prevRacer0Obj->racer; gRacersByPort[0] = prevRacer0Obj; gRacersByPort[1] = prevPort0Racer; if (gSwapLeadPlayer != 0) { @@ -6908,7 +6791,7 @@ void race_transition_adventure(s32 updateRate) { } if (gRaceEndStage == 2) { prevPort0Racer = (*gRacers)[0]; - racer = &prevPort0Racer->unk64->racer; + racer = prevPort0Racer->racer; func_800230D0(prevPort0Racer, racer); racer->raceFinished = FALSE; gRaceEndStage = 3; @@ -6992,9 +6875,9 @@ void race_finish_time_trial(void) { settings->unk115[0] = 0; bestCourseTime = 36001; bestRacerTime = 36001; - bestRacer = &gRacersByPosition[0]->unk64->racer; + bestRacer = gRacersByPosition[0]->racer; for (i = 0; i < gNumRacers; i++) { - curRacer = &gRacersByPosition[i]->unk64->racer; + curRacer = gRacersByPosition[i]->racer; if (curRacer->racerIndex >= 0) { if (curRacer->racerIndex < get_number_of_active_players()) { settings->racers[curRacer->racerIndex].best_times = 0; @@ -7277,7 +7160,7 @@ Object *func_8001B7A8(Object_Racer *racer, s32 position, f32 *distance) { if (tempRacerObj == NULL) { return NULL; } - *distance = func_8001B834(racer, &tempRacerObj->unk64->racer); + *distance = func_8001B834(racer, tempRacerObj->racer); return tempRacerObj; } @@ -7459,7 +7342,7 @@ void spectate_update(void) { gCameraObjCount = 0; for (i = 0; i < gObjectCount; i++) { objPtr = gObjPtrList[i]; - if (!(objPtr->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { + if (!(objPtr->trans.flags & OBJ_FLAGS_PARTICLE)) { if (objPtr->behaviorId == BHV_CAMERA_CONTROL) { if (gCameraObjCount < CAMCONTROL_COUNT) { (*gCameraObjList)[gCameraObjCount] = objPtr; @@ -7524,17 +7407,17 @@ Object *spectate_nearest(Object *obj, s32 *cameraId) { currCamera = (*gCameraObjList)[cameraIndex_Curr]; nextCamera = (*gCameraObjList)[cameraIndex_Next]; prevCamera = (*gCameraObjList)[cameraIndex_Prev]; - x = currCamera->segment.trans.x_position - obj->segment.trans.x_position; - y = currCamera->segment.trans.y_position - obj->segment.trans.y_position; - z = currCamera->segment.trans.z_position - obj->segment.trans.z_position; + x = currCamera->trans.x_position - obj->trans.x_position; + y = currCamera->trans.y_position - obj->trans.y_position; + z = currCamera->trans.z_position - obj->trans.z_position; currCameraXYZ = (x * x) + (y * y) + (z * z); - x = nextCamera->segment.trans.x_position - obj->segment.trans.x_position; - y = nextCamera->segment.trans.y_position - obj->segment.trans.y_position; - z = nextCamera->segment.trans.z_position - obj->segment.trans.z_position; + x = nextCamera->trans.x_position - obj->trans.x_position; + y = nextCamera->trans.y_position - obj->trans.y_position; + z = nextCamera->trans.z_position - obj->trans.z_position; nextCameraXYZ = (x * x) + (y * y) + (z * z); - x = prevCamera->segment.trans.x_position - obj->segment.trans.x_position; - y = prevCamera->segment.trans.y_position - obj->segment.trans.y_position; - z = prevCamera->segment.trans.z_position - obj->segment.trans.z_position; + x = prevCamera->trans.x_position - obj->trans.x_position; + y = prevCamera->trans.y_position - obj->trans.y_position; + z = prevCamera->trans.z_position - obj->trans.z_position; prevCameraXYZ = (x * x) + (y * y) + (z * z); if (nextCameraXYZ < currCameraXYZ) { @@ -7581,8 +7464,8 @@ void ainode_update(void) { // Store each existing node ID in the temporary vars. for (i = 0; i < gObjectCount; i++) { obj = gObjPtrList[i]; - if (!(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && obj->behaviorId == BHV_AINODE) { - aiNodeEntry = &obj->segment.level_entry->aiNode; + if (!(obj->trans.flags & OBJ_FLAGS_PARTICLE) && obj->behaviorId == BHV_AINODE) { + aiNodeEntry = &obj->level_entry->aiNode; index2 = aiNodeEntry->nodeID; if (!(index2 & AINODE_COUNT)) { (*gAINodes)[index2] = obj; @@ -7599,8 +7482,8 @@ void ainode_update(void) { for (i = 0; i < AINODE_COUNT; i++) { obj = (*gAINodes)[i]; if (obj != NULL) { - aiNodeObj64 = &obj->unk64->ai_node; - aiNodeEntry = &obj->segment.level_entry->aiNode; + aiNodeObj64 = obj->ai_node; + aiNodeEntry = &obj->level_entry->aiNode; for (j = 0; j < 4; j++) { index2 = aiNodeEntry->adjacent[j]; if (!(index2 & AINODE_COUNT)) { @@ -7609,9 +7492,9 @@ void ainode_update(void) { if (nextAiNodeObj == NULL) { aiNodeEntry->adjacent[j] = -1; } else { - diffX = obj->segment.trans.x_position - nextAiNodeObj->segment.trans.x_position; - diffY = obj->segment.trans.y_position - nextAiNodeObj->segment.trans.y_position; - diffZ = obj->segment.trans.z_position - nextAiNodeObj->segment.trans.z_position; + diffX = obj->trans.x_position - nextAiNodeObj->trans.x_position; + diffY = obj->trans.y_position - nextAiNodeObj->trans.y_position; + diffZ = obj->trans.z_position - nextAiNodeObj->trans.z_position; aiNodeObj64->distToNode[j] = sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)); } } @@ -7622,8 +7505,7 @@ void ainode_update(void) { do { j = TRUE; for (i = 0; i < nodeCount - 1; i++) { - if ((*gAINodes)[nodeIDs[i + 1]]->segment.trans.y_position < - (*gAINodes)[nodeIDs[i]]->segment.trans.y_position) { + if ((*gAINodes)[nodeIDs[i + 1]]->trans.y_position < (*gAINodes)[nodeIDs[i]]->trans.y_position) { swap = nodeIDs[i]; nodeIDs[i] = nodeIDs[i + 1]; nodeIDs[i + 1] = swap; @@ -7648,9 +7530,8 @@ void ainode_update(void) { } if (index < elevations[i]) { index = elevations[i]; - gElevationHeights[index] = ((*gAINodes)[nodeIDs[i]]->segment.trans.y_position + - (*gAINodes)[nodeIDs[i - 1]]->segment.trans.y_position) * - 0.5; + gElevationHeights[index] = + ((*gAINodes)[nodeIDs[i]]->trans.y_position + (*gAINodes)[nodeIDs[i - 1]]->trans.y_position) * 0.5; } else { i = nodeCount; } @@ -7703,7 +7584,7 @@ s32 ainode_find_nearest(f32 diffX, f32 diffY, f32 diffZ, s32 useElevation) { s32 findDist; s32 numSteps; s32 result; - ObjectSegment *segment; + Object *obj; LevelObjectEntry_AiNode *levelObj; if (useElevation) { @@ -7712,9 +7593,9 @@ s32 ainode_find_nearest(f32 diffX, f32 diffY, f32 diffZ, s32 useElevation) { dist = 50000.0; result = 0xFF; for (numSteps = 0; numSteps != AINODE_COUNT; numSteps++) { - segment = &(*gAINodes)[numSteps]->segment; - if (segment) { - levelObj = &((segment->level_entry)->aiNode); + obj = (*gAINodes)[numSteps]; + if (obj) { + levelObj = &((obj->level_entry)->aiNode); findDist = TRUE; if (useElevation && elevation != levelObj->elevation) { findDist = FALSE; @@ -7723,9 +7604,9 @@ s32 ainode_find_nearest(f32 diffX, f32 diffY, f32 diffZ, s32 useElevation) { findDist = FALSE; } if (findDist) { - x = segment->trans.x_position - diffX; - y = segment->trans.y_position - diffY; - z = segment->trans.z_position - diffZ; + x = obj->trans.x_position - diffX; + y = obj->trans.y_position - diffY; + z = obj->trans.z_position - diffZ; len = sqrtf((x * x) + (y * y) + (z * z)); if (len < dist) { dist = len; @@ -7771,9 +7652,9 @@ f32 func_8001C6C4(Object_NPC *npc, Object *npcParentObj, f32 updateRateF, f32 sp return 0.0f; } - xPositions[i] = aiNode->segment.trans.x_position; - yPositions[i] = aiNode->segment.trans.y_position; - zPositions[i] = aiNode->segment.trans.z_position; + xPositions[i] = aiNode->trans.x_position; + yPositions[i] = aiNode->trans.y_position; + zPositions[i] = aiNode->trans.z_position; } xDiff2 = catmull_rom_interpolation(xPositions, 0, npc->unk0); @@ -7809,9 +7690,9 @@ f32 func_8001C6C4(Object_NPC *npc, Object *npcParentObj, f32 updateRateF, f32 sp tempYDiff = yDiff2 = yDiff + yDiff2; zDiff2 = zDiff + zDiff2; - xDiff = xDiff2 - npcParentObj->segment.trans.x_position; - yDiff = yDiff2 - npcParentObj->segment.trans.y_position; - zDiff = zDiff2 - npcParentObj->segment.trans.z_position; + xDiff = xDiff2 - npcParentObj->trans.x_position; + yDiff = yDiff2 - npcParentObj->trans.y_position; + zDiff = zDiff2 - npcParentObj->trans.z_position; xDiff2 = xDiff; yDiff2 = yDiff; @@ -7829,29 +7710,29 @@ f32 func_8001C6C4(Object_NPC *npc, Object *npcParentObj, f32 updateRateF, f32 sp dist = speedF; } if (dist >= 1.0) { - var_s0 = (arctan2_f(xDiff, zDiff) - (npcParentObj->segment.trans.rotation.y_rotation & 0xFFFF)) - 0x8000; + var_s0 = (arctan2_f(xDiff, zDiff) - (npcParentObj->trans.rotation.y_rotation & 0xFFFF)) - 0x8000; if (var_s0 > 0x8000) { var_s0 -= 0xFFFF; } if (var_s0 < -0x8000) { var_s0 += 0xFFFF; } - npcParentObj->segment.trans.rotation.y_rotation += ((var_s0 * (s32) updateRateF)) >> 4; - var_s0 = arctan2_f(yDiff, 255.0f) - (npcParentObj->segment.trans.rotation.x_rotation & 0xFFFF); + npcParentObj->trans.rotation.y_rotation += ((var_s0 * (s32) updateRateF)) >> 4; + var_s0 = arctan2_f(yDiff, 255.0f) - (npcParentObj->trans.rotation.x_rotation & 0xFFFF); if (var_s0 > 0x8000) { var_s0 -= 0xFFFF; } if (var_s0 < -0x8000) { var_s0 += 0xFFFF; } - npcParentObj->segment.trans.rotation.x_rotation += ((var_s0 * (s32) updateRateF)) >> 4; + npcParentObj->trans.rotation.x_rotation += ((var_s0 * (s32) updateRateF)) >> 4; } - npcParentObj->segment.trans.rotation.z_rotation = 0; - xDiff = sins_f((s16) (npcParentObj->segment.trans.rotation.y_rotation + 0x8000)) * dist; + npcParentObj->trans.rotation.z_rotation = 0; + xDiff = sins_f((s16) (npcParentObj->trans.rotation.y_rotation + 0x8000)) * dist; move_object(npcParentObj, xDiff * updateRateF, 0.0f, - coss_f((npcParentObj->segment.trans.rotation.y_rotation + 0x8000)) * dist * updateRateF); - npcParentObj->segment.trans.y_position = tempYDiff; + coss_f((npcParentObj->trans.rotation.y_rotation + 0x8000)) * dist * updateRateF); + npcParentObj->trans.y_position = tempYDiff; dist = dist * updateRateF * 2; if (someBool != 0) { npc->nodeData[0] = npc->nodeData[1]; @@ -7880,8 +7761,8 @@ s32 ainode_find_next(s32 nodeId, s32 nextNodeId, s32 direction) { return NODE_NONE; } - entry = &aiNodeObj->segment.level_entry->aiNode; - aiNode = &aiNodeObj->unk64->ai_node; + entry = &aiNodeObj->level_entry->aiNode; + aiNode = aiNodeObj->ai_node; direction = direction & 3; someCount = 0; nextIndex = (aiNode->directions[direction] + 1) & 3; @@ -7929,8 +7810,8 @@ s16 func_8001CD28(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { } while (i < AINODE_COUNT); aiNodeObj = (*gAINodes)[arg0]; - aiNode = &aiNodeObj->unk64->ai_node; - aiNodeEntry = &aiNodeObj->segment.level_entry->aiNode; + aiNode = aiNodeObj->ai_node; + aiNodeEntry = &aiNodeObj->level_entry->aiNode; var_t1 = 0; var_ra = 0; result = NODE_NONE; @@ -7996,10 +7877,10 @@ s16 func_8001CD28(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { if (var_t1 > 0) { var_t1--; aiNodeObj = (*gAINodes)[spD4[var_t1]]; - aiNodeEntry = &aiNodeObj->segment.level_entry->aiNode; + aiNodeEntry = &aiNodeObj->level_entry->aiNode; var_s3 = sp54[var_t1]; var_ra = sp154[aiNodeEntry->nodeID]; - aiNode = &aiNodeObj->unk64->ai_node; + aiNode = aiNodeObj->ai_node; someBool = 0; if (arg1 & 0x100) { if ((arg1 & 0x7F) == spD4[var_t1]) { @@ -8016,8 +7897,8 @@ s16 func_8001CD28(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { if (result != 0xFF) { aiNodeObj = (*gAINodes)[arg0]; - aiNodeEntry = &aiNodeObj->segment.level_entry->aiNode; - aiNode = &aiNodeObj->unk64->ai_node; + aiNodeEntry = &aiNodeObj->level_entry->aiNode; + aiNode = aiNodeObj->ai_node; for (i = 0; (i < 4) && (result != aiNodeEntry->adjacent[i]); i++) {} if (i < 4) { aiNode->directions[arg3] = i; @@ -8095,11 +7976,11 @@ UNUSED void add_shading_properties(Object *obj, f32 ambientChange, f32 diffuseCh set_shading_properties(obj->shading, obj->shading->ambient, obj->shading->diffuse, (obj->shading->unk22 + angleX), (obj->shading->unk24 + angleY), (obj->shading->unk26 + angleZ)); - if (obj->segment.header->unk3D != 0) { - obj->shading->lightR = obj->segment.header->unk3A; - obj->shading->lightG = obj->segment.header->unk3B; - obj->shading->lightB = obj->segment.header->unk3C; - obj->shading->lightIntensity = obj->segment.header->unk3D; + if (obj->header->unk3D != 0) { + obj->shading->lightR = obj->header->unk3A; + obj->shading->lightG = obj->header->unk3B; + obj->shading->lightB = obj->header->unk3C; + obj->shading->lightIntensity = obj->header->unk3D; obj->shading->lightDirX = -(obj->shading->shadowDirX >> 1); obj->shading->lightDirY = -(obj->shading->shadowDirY >> 1); obj->shading->lightDirZ = -(obj->shading->shadowDirZ >> 1); @@ -8173,7 +8054,7 @@ void obj_shade_fancy(ObjectModel *model, Object *object, s32 arg2, f32 intensity if (dynamicLightingEnabled) { // Calculates dynamic lighting for the object - if (object->segment.header->directionalPointLighting) { + if (object->header->directionalPointLighting) { // Dynamic directional lighting for some objects (Intro diddy, Taj, T.T., Bosses) calc_dynamic_lighting_for_object_1(object, model, arg2, object, intensity, 1.0f); } else { @@ -8184,9 +8065,8 @@ void obj_shade_fancy(ObjectModel *model, Object *object, s32 arg2, f32 intensity if (environmentMappingEnabled) { // Calculates environment mapping for the object - calc_env_mapping_for_object(model, object->segment.trans.rotation.z_rotation, - object->segment.trans.rotation.x_rotation, - object->segment.trans.rotation.y_rotation); + calc_env_mapping_for_object(model, object->trans.rotation.z_rotation, object->trans.rotation.x_rotation, + object->trans.rotation.y_rotation); } } @@ -8218,12 +8098,12 @@ void calc_dynamic_lighting_for_object_1(Object *object, ObjectModel *model, s16 direction.x = -(object->shading->lightDirX << 3); direction.y = -(object->shading->lightDirY << 3); direction.z = -(object->shading->lightDirZ << 3); - objRot.y_rotation = -object->segment.trans.rotation.y_rotation; - objRot.x_rotation = -object->segment.trans.rotation.x_rotation; - objRot.z_rotation = -object->segment.trans.rotation.z_rotation; + objRot.y_rotation = -object->trans.rotation.y_rotation; + objRot.x_rotation = -object->trans.rotation.x_rotation; + objRot.z_rotation = -object->trans.rotation.z_rotation; vec3f_rotate_ypr(&objRot, &direction); - if (object->segment.header->unk3D != 0 && arg2) { + if (object->header->unk3D != 0 && arg2) { mtxf_transform_dir(get_projection_matrix_f32(), &direction, &direction); } @@ -8404,16 +8284,16 @@ UNUSED void set_racer_position_and_angle(s16 player, s16 *x, s16 *y, s16 *z, s16 for (i = 0; i < gObjectCount; i++) { obj = gObjPtrList[i]; - if (!(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { + if (!(obj->trans.flags & OBJ_FLAGS_PARTICLE)) { if (obj->behaviorId == BHV_RACER) { - racer = &obj->unk64->racer; + racer = obj->racer; if (player == racer->playerIndex) { - *x = obj->segment.trans.x_position; - *y = obj->segment.trans.y_position; - *z = obj->segment.trans.z_position; - *angleZ = obj->segment.trans.rotation.z_rotation; - *angleX = obj->segment.trans.rotation.x_rotation; - *angleY = obj->segment.trans.rotation.y_rotation; + *x = obj->trans.x_position; + *y = obj->trans.y_position; + *z = obj->trans.z_position; + *angleZ = obj->trans.rotation.z_rotation; + *angleX = obj->trans.rotation.x_rotation; + *angleY = obj->trans.rotation.y_rotation; i = gObjectCount; // Feels like it should be a break instead. } } @@ -8461,11 +8341,11 @@ void obj_bridge_pos(s32 timing, f32 *x, f32 *y, f32 *z) { for (i = 0; i < gObjectCount; i++) { current_obj = gObjPtrList[i]; - if (current_obj != NULL && !(current_obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && + if (current_obj != NULL && !(current_obj->trans.flags & OBJ_FLAGS_PARTICLE) && current_obj->behaviorId == BHV_RAMP_SWITCH && current_obj->properties.common.unk0 == timing) { - *x = current_obj->segment.trans.x_position; - *y = current_obj->segment.trans.y_position; - *z = current_obj->segment.trans.z_position; + *x = current_obj->trans.x_position; + *y = current_obj->trans.y_position; + *z = current_obj->trans.z_position; } } } @@ -8512,16 +8392,16 @@ void func_8001E4C4(void) { LevelObjectEntry_Animation *entryAnimation; for (i = 0; i < gObjectCount; i++) { - gObjPtrList[i]->segment.trans.flags &= ~OBJ_FLAGS_UNK_2000; + gObjPtrList[i]->trans.flags &= ~OBJ_FLAGS_UNK_2000; } for (i = 0; i < gObjectCount; i++) { obj = gObjPtrList[i]; - if (obj != NULL && !(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && obj->behaviorId == BHV_ANIMATION) { - entryAnimation = &obj->segment.level_entry->animation; + if (obj != NULL && !(obj->trans.flags & OBJ_FLAGS_PARTICLE) && obj->behaviorId == BHV_ANIMATION) { + entryAnimation = &obj->level_entry->animation; if (entryAnimation->channel != gCutsceneID && entryAnimation->channel != 20) { - obj->segment.trans.flags |= OBJ_FLAGS_UNK_2000; - if (obj->unk64 != NULL) { - obj->unk64->animation2.flags |= OBJ_FLAGS_UNK_2000; + obj->trans.flags |= OBJ_FLAGS_UNK_2000; + if (obj->animTarget != NULL) { + obj->animTarget->trans.flags |= OBJ_FLAGS_UNK_2000; } } } @@ -8530,14 +8410,14 @@ void func_8001E4C4(void) { lastObjCount = curObjCount; for (i = 0; curObjCount >= i;) { for (j = 0; lastObjCount >= i && (j == 0);) { - if (gObjPtrList[i]->segment.trans.flags & OBJ_FLAGS_UNK_2000) { + if (gObjPtrList[i]->trans.flags & OBJ_FLAGS_UNK_2000) { i++; } else { j = -1; } } for (j = 0; curObjCount >= 0 && j == 0;) { - if (gObjPtrList[curObjCount]->segment.trans.flags & OBJ_FLAGS_UNK_2000) { + if (gObjPtrList[curObjCount]->trans.flags & OBJ_FLAGS_UNK_2000) { j = -1; } else { curObjCount--; @@ -8562,27 +8442,27 @@ void func_8001E6EC(s8 arg0) { s32 i; s32 j; s32 someBool; - Object_Animation *animation; + Object *animTarget; for (i = 0; i < D_8011AE00; i++) { overridePosObj = D_8011ADD8[i]; - overridePosEntry = &overridePosObj->segment.level_entry->overridePos; - overridePos = &overridePosObj->unk64->override_pos; + overridePosEntry = &overridePosObj->level_entry->overridePos; + overridePos = overridePosObj->override_pos; if ((overridePosEntry->cutsceneId == gCutsceneID) || ((overridePosEntry->cutsceneId == 20))) { - for (j = 0; (j < D_8011AE78) && - (overridePosEntry->behaviorId != D_8011AE74[j]->properties.animatedObj.behaviourID); + for (j = 0; + (j < D_8011AE78) && (overridePosEntry->behaviorId != D_8011AE74[j]->properties.animation.behaviourID); j++) {} - if (j != D_8011AE78 && D_8011AE74[j]->unk64 != NULL) { - someBool = (D_8011AE74[j]->unk64->animation.unk5C) ? FALSE : TRUE; + if (j != D_8011AE78 && D_8011AE74[j]->animTarget != NULL) { + someBool = (D_8011AE74[j]->animTarget->unk5C != NULL) ? FALSE : TRUE; if (arg0 != someBool) { - animation = &D_8011AE74[j]->unk64->animation; - overridePos->x = animation->x; - overridePos->y = animation->y; - overridePos->z = animation->z; - overridePos->anim = animation; - animation->x = overridePosObj->segment.trans.x_position; - animation->y = overridePosObj->segment.trans.y_position; - animation->z = overridePosObj->segment.trans.z_position; + animTarget = D_8011AE74[j]->animTarget; + overridePos->x = animTarget->trans.x_position; + overridePos->y = animTarget->trans.y_position; + overridePos->z = animTarget->trans.z_position; + overridePos->anim = animTarget; + animTarget->trans.x_position = overridePosObj->trans.x_position; + animTarget->trans.y_position = overridePosObj->trans.y_position; + animTarget->trans.z_position = overridePosObj->trans.z_position; } } else { overridePos->anim = NULL; @@ -8595,7 +8475,7 @@ void func_8001E6EC(s8 arg0) { void func_8001E89C(void) { s32 i; Object *obj; - Object_8001E89C_64 *obj64; + Object_OverridePos *obj64; // some flag, flips to 1 when loading a new zone if (D_8011AE01 != FALSE) { @@ -8606,12 +8486,12 @@ void func_8001E89C(void) { // loading (boss) cutscene for (i = 0; i < D_8011AE00; i++) { obj = D_8011ADD8[i]; - obj64 = &obj->unk64->obj8001E89C_64; + obj64 = obj->override_pos; - if (obj64->unkC != NULL) { - obj64->unkC->unkC = obj64->unk0; - obj64->unkC->unk10 = obj64->unk4; - obj64->unkC->unk14 = obj64->unk8; + if (obj64->anim != NULL) { + obj64->anim->trans.x_position = obj64->x; + obj64->anim->trans.y_position = obj64->y; + obj64->anim->trans.z_position = obj64->z; } } } @@ -8635,11 +8515,11 @@ void func_8001E93C(void) { if (D_8011AE7E) { for (numOfObjs = 0; numOfObjs < D_8011AE78; numOfObjs++) { obj = D_8011AE74[numOfObjs]; - animation1 = &obj->segment.level_entry->animation; - if (obj->unk64 != NULL && animation1->channel != 20) { - animObj1 = (Object *) obj->unk64; + animation1 = &obj->level_entry->animation; + if (obj->animTarget != NULL && animation1->channel != 20) { + animObj1 = obj->animTarget; free_object(animObj1); - obj->unk64 = NULL; + obj->animTarget = NULL; } } } @@ -8650,9 +8530,9 @@ void func_8001E93C(void) { numOfObjs = 0; for (i = 0; i < gObjectCount; i++) { if (gObjPtrList[i] != NULL) { - if (!(gObjPtrList[i]->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { + if (!(gObjPtrList[i]->trans.flags & OBJ_FLAGS_PARTICLE)) { if (gObjPtrList[i]->behaviorId == BHV_OVERRIDE_POS) { - overridePos = &gObjPtrList[i]->segment.level_entry->overridePos; + overridePos = &gObjPtrList[i]->level_entry->overridePos; if (overridePos->cutsceneId == gCutsceneID || overridePos->cutsceneId == (CUTSCENE_SHERBET_ISLAND_BOSS | CUTSCENE_ADVENTURE_TWO)) { D_8011ADD8[numOfObjs] = gObjPtrList[i]; @@ -8669,7 +8549,7 @@ void func_8001E93C(void) { numOfObjs = 0; for (i = gObjectListStart; i < gObjectCount; i++) { if (gObjPtrList[i] != NULL) { - if (!(gObjPtrList[i]->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { + if (!(gObjPtrList[i]->trans.flags & OBJ_FLAGS_PARTICLE)) { if (gObjPtrList[i]->behaviorId == BHV_ANIMATION) { D_8011AE74[numOfObjs] = gObjPtrList[i]; numOfObjs++; @@ -8681,8 +8561,8 @@ void func_8001E93C(void) { do { stopLooping = TRUE; for (i = 0; i < numOfObjs - 1; i++) { - animation1 = &D_8011AE74[i]->segment.level_entry->animation; - animation2 = &D_8011AE74[i + 1]->segment.level_entry->animation; + animation1 = &D_8011AE74[i]->level_entry->animation; + animation2 = &D_8011AE74[i + 1]->level_entry->animation; animActorIndex1 = animation1->actorIndex; animActorIndex2 = animation2->actorIndex; @@ -8705,8 +8585,8 @@ void func_8001E93C(void) { D_8011AE74[i + 1] = animObj1; stopLooping = FALSE; } else if (animation1->order == animation2->order && - (D_8011AE74[i + 1]->properties.animatedObj.action == 1 || - D_8011AE74[i]->properties.animatedObj.action == 2)) { + (D_8011AE74[i + 1]->properties.animation.action == 1 || + D_8011AE74[i]->properties.animation.action == 2)) { animObj1 = D_8011AE74[i]; D_8011AE74[i] = D_8011AE74[i + 1]; D_8011AE74[i + 1] = animObj1; @@ -8718,13 +8598,13 @@ void func_8001E93C(void) { var_a0 = -101; for (i = 0; i < numOfObjs; i += 1) { - animation1 = &D_8011AE74[i]->segment.level_entry->animation; + animation1 = &D_8011AE74[i]->level_entry->animation; if (animation1->actorIndex != var_a0) { var_a0 = animation1->actorIndex; sp28 = 0; } animation1->order = sp28++; // It is possible that sp28 could not be initalized? - D_8011AE74[i]->properties.animatedObj.action = 0; + D_8011AE74[i]->properties.animation.action = 0; } D_8011AE78 = numOfObjs; @@ -8741,53 +8621,53 @@ void func_8001EE74(void) { for (i = 0; i < D_8011AE78; i++) { obj = D_8011AE74[i]; - animation = &obj->segment.level_entry->animation; - if (obj->unk64 == NULL && animation->order == 0 && animation->objectIdToSpawn != -1) { + animation = &obj->level_entry->animation; + if (obj->animTarget == NULL && animation->order == 0 && animation->objectIdToSpawn != -1) { func_8001F23C(obj, animation); } if (D_8011AD26 || animation->channel != 20) { - if (obj->unk64 != NULL) { - obj_init_animcamera(obj, (Object *) obj->unk64); + if (obj->animTarget != NULL) { + obj_init_animobject(obj, obj->animTarget); } } } D_8011AD26 = FALSE; } -void obj_init_animcamera(Object *arg0, Object *animObj) { +void obj_init_animobject(Object *animationObj, Object *animatedObj) { LevelObjectEntry_Animation *animEntry; - Object_Animation *anim; + Object_AnimatedObject *anim; f32 scale; - animEntry = &arg0->segment.level_entry->animation; - anim = &animObj->unk64->animation; + animEntry = &animationObj->level_entry->animation; + anim = animatedObj->animatedObject; scale = animEntry->scale & 0xFF; if (scale < 1.0f) { scale = 1.0f; } scale /= 64; - animObj->segment.trans.scale = animObj->segment.header->scale * scale; - animObj->properties.common.unk0 = 0; - animObj->properties.common.unk4 = 0; + animatedObj->trans.scale = animatedObj->header->scale * scale; + animatedObj->properties.animatedObj.unk0 = 0; + animatedObj->properties.animatedObj.unk4 = 0; if (animEntry->unk22 >= 2 && animEntry->unk22 < 10) { - animObj->properties.common.unk0 = animEntry->unk22 - 1; + animatedObj->properties.animatedObj.unk0 = animEntry->unk22 - 1; } if (animEntry->unk22 >= 10 && animEntry->unk22 < 18) { - animObj->properties.common.unk0 = animEntry->unk22 - 9; + animatedObj->properties.animatedObj.unk0 = animEntry->unk22 - 9; } - animObj->segment.trans.x_position = arg0->segment.trans.x_position; - animObj->segment.trans.y_position = arg0->segment.trans.y_position; - animObj->segment.trans.z_position = arg0->segment.trans.z_position; - animObj->segment.trans.rotation.y_rotation = arg0->segment.trans.rotation.y_rotation; - animObj->segment.trans.rotation.z_rotation = arg0->segment.trans.rotation.z_rotation; - animObj->segment.trans.rotation.x_rotation = arg0->segment.trans.rotation.x_rotation; + animatedObj->trans.x_position = animationObj->trans.x_position; + animatedObj->trans.y_position = animationObj->trans.y_position; + animatedObj->trans.z_position = animationObj->trans.z_position; + animatedObj->trans.rotation.y_rotation = animationObj->trans.rotation.y_rotation; + animatedObj->trans.rotation.z_rotation = animationObj->trans.rotation.z_rotation; + animatedObj->trans.rotation.x_rotation = animationObj->trans.rotation.x_rotation; anim->unk26 = 0; anim->unk3D = animEntry->channel; anim->unk28 = animEntry->actorIndex; anim->unk8 = (f32) animEntry->nodeSpeed * 0.1; anim->startDelay = normalise_time(animEntry->animationStartDelay); - animObj->segment.object.animationID = animEntry->objAnimIndex; - animObj->segment.animFrame = animEntry->unk16; + animatedObj->animationID = animEntry->objAnimIndex; + animatedObj->animFrame = animEntry->unk16; anim->z = animEntry->objAnimSpeed; anim->y = 0; anim->unk2C = animEntry->objAnimLoopType; @@ -8801,14 +8681,14 @@ void obj_init_animcamera(Object *arg0, Object *animObj) { anim->unk2D = 0; anim->unk4 = 0; anim->unk0 = 0; - arg0->particleEmitter = NULL; + animationObj->particleEmitter = NULL; anim->pauseCounter = normalise_time(animEntry->pauseFrameCount); anim->unk3A = animEntry->specialHide; if (animEntry->unk13 >= 0) { anim->unk2F = animEntry->unk13; } anim->unk39 = animEntry->unk1F; - anim->unk38 = animEntry->unk1E; + anim->soundID = animEntry->unk1E; anim->unk3B = animEntry->unk29; anim->unk40 = animEntry->soundEffect; anim->unk41 = animEntry->fadeOptions; @@ -8819,7 +8699,7 @@ void obj_init_animcamera(Object *arg0, Object *animObj) { } anim->unk18 = NULL; anim->unk43 = animEntry->unk30; - anim->unk1C = arg0; + anim->unk1C = animationObj; anim->unk45 = 0; } @@ -8827,25 +8707,25 @@ void func_8001F23C(Object *obj, LevelObjectEntry_Animation *animEntry) { s32 i; LevelObjectEntryCommon newObjEntry; Object *newObj; - Object_AnimCamera *camera; + Object_AnimatedObject *camera; s32 viewportCount; NEW_OBJECT_ENTRY(newObjEntry, animEntry->objectIdToSpawn, 8, animEntry->common.x, animEntry->common.y, animEntry->common.z); - obj->unk64 = (Object_64 *) spawn_object(&newObjEntry, OBJECT_SPAWN_UNK01); - newObj = (Object *) obj->unk64; + obj->animTarget = spawn_object(&newObjEntry, OBJECT_SPAWN_UNK01); + newObj = obj->animTarget; // (newObj->behaviorId == BHV_DINO_WHALE) is Dinosaur1, Dinosaur2, Dinosaur3, Whale, and Dinoisle - if (obj->unk64 != NULL && newObj->behaviorId == BHV_DINO_WHALE && gTimeTrialEnabled) { + if (obj->animTarget != NULL && newObj->behaviorId == BHV_DINO_WHALE && gTimeTrialEnabled) { free_object(newObj); - obj->unk64 = NULL; + obj->animTarget = NULL; newObj = NULL; } if (newObj != NULL) { - newObj->segment.level_entry = NULL; - obj_init_animcamera(obj, newObj); - if (newObj->segment.header->behaviorId == BHV_CAMERA_ANIMATION) { - camera = &newObj->unk64->anim_camera; + newObj->level_entry = NULL; + obj_init_animobject(obj, newObj); + if (newObj->header->behaviorId == BHV_CAMERA_ANIMATION) { + camera = newObj->animatedObject; camera->unk44 = D_8011AD3E; viewportCount = cam_get_viewport_layout(); if (is_two_player_adventure_race()) { @@ -8854,9 +8734,9 @@ void func_8001F23C(Object *obj, LevelObjectEntry_Animation *animEntry) { for (i = 0; i < viewportCount;) { newObj = spawn_object(&newObjEntry, OBJECT_SPAWN_UNK01); if (newObj != NULL) { - newObj->segment.level_entry = NULL; - obj_init_animcamera(obj, newObj); - camera = &newObj->unk64->anim_camera; + newObj->level_entry = NULL; + obj_init_animobject(obj, newObj); + camera = newObj->animatedObject; i++; camera->cameraID = i; camera->unk44 = D_8011AD3E; @@ -8887,7 +8767,7 @@ s32 func_8001F3EC(s32 arg0) { count = 0; for (i = 0; i < D_8011AE78; i++) { - if (D_8011AE74[i]->properties.common.unk4 == arg0) { + if (D_8011AE74[i]->properties.animation.behaviourID == arg0) { count++; } } @@ -8902,168 +8782,43 @@ void func_8001F450(void) { // https://decomp.me/scratch/ExBnA #ifdef NON_EQUIVALENT s32 func_8001F460(Object *arg0, s32 arg1, Object *arg2) { - s32 sp174; + f32 var_f2; + f32 var_f4; + f32 var_f0; + f32 var_f20; + f32 var_f6; + s32 var_t0; // sp174 s32 sp168; - f32 sp154; - f32 sp140; - f32 sp12C; + Camera *camera; + f32 sp154[5]; + f32 sp140[5]; + f32 sp12C[5]; + Object **objectsList; f32 sp124; f32 sp120; f32 sp11C; f32 sp114; - f32 sp108; // guessed f32 - f32 spF4; - f32 spE4; - f32 *spE0; - f32 spD0; - f32 *spCC; - f32 spBC; - f32 *spB8; + f32 spF4[5]; + f32 spE0[5]; + f32 spCC[5]; + f32 spB8[5]; f32 spB4; - s16 spAA; - s16 spA8; - s8 spA7; - s8 spA6; - s8 spA5; - u8 spA4; - f32 *sp88; - s32 sp80; - f32 *sp7C; - f32 *sp78; - f32 *sp74; - f32 *sp70; - f32 *sp6C; - f32 *sp68; - s32 sp5C; - f32 *var_ra_2; - f32 *var_t4_2; - f32 *var_t5_2; - ALSoundState *temp_a0; - ALSoundState *temp_a0_2; - f32 temp_f2; - Camera *var_v1_2; - Object **var_a0; - LevelObjectEntry *temp_s1_4; LevelObjectEntry_Animation *temp_s1; - Object *temp_v0_15; Object *var_v1_3; - Object **temp_a0_4; Object **temp_a2; - Object **temp_v0_11; - Object **temp_v0_12; - Object **temp_v0_14; - Object **var_a0_2; ObjectModel *temp_a0_3; - Object_64 *temp_s3; - Object_64 *temp_v1_7; - ModelInstance *temp_v1_4; - f32 temp_f0; - f32 temp_f0_10; - f32 temp_f0_11; - f32 temp_f0_12; - f32 temp_f0_2; - f32 temp_f0_3; - f32 temp_f0_4; - f32 temp_f0_5; - f32 temp_f0_6; - f32 temp_f0_7; - f32 temp_f0_8; - f32 temp_f10; - f32 temp_f10_2; - f32 temp_f10_3; - f32 temp_f10_4; - f32 temp_f12; - f32 temp_f12_2; - f32 temp_f12_3; - f32 temp_f2_2; - f32 temp_f2_3; - f32 temp_f2_4; - f32 temp_f4; - f32 temp_f4_2; - f32 temp_f6; - f32 temp_f6_2; - f32 temp_f6_3; - f32 temp_f6_4; - f32 temp_f6_5; - f32 temp_f6_6; - f32 temp_f8; - f32 temp_f8_2; - f32 temp_f8_3; - f32 temp_f8_4; - f32 var_f0; - f32 var_f0_2; - f32 var_f0_3; - f32 var_f0_4; - f32 var_f20; - f32 var_f6; - f32 *var_a3; - f32 *var_ra; - f32 *var_t1; - f32 *var_t2; - f32 *var_t3; - f32 *var_t4; - f32 *var_t5; - f32 *var_v0_3; - f32 *var_v0_4; - f32 *var_v0_5; - f32 *var_v0_6; - f32 *var_v0_7; - f32 *var_v0_8; - f32 temp_f0_9; - f32 temp_f2_5; - f32 temp_f2_6; - f32 temp_f2_7; - s16 temp_a1; - s16 temp_v0_10; - s16 temp_v0_18; - s16 temp_v0_3; - s16 temp_v0_7; - s16 var_s2_3; - s16 var_t0_5; + Object_AnimatedObject *obj64; + Object *otherObj64; + f32 var_f12; s32 temp_a1_2; - s32 temp_s0; - s32 temp_s2; - s32 temp_t0; - s32 temp_t6; - s32 temp_t7; - s32 temp_t7_2; - s32 temp_t7_3; - s32 temp_t7_4; - s32 temp_v0_13; - s32 temp_v0_16; s32 var_s0; - s32 var_s0_2; - s32 var_s0_3; - s32 var_s0_4; - s32 var_s0_5; s32 var_s2; - s32 var_s2_2; s32 var_s4; s32 var_s5; - s32 var_t0; - s32 var_t0_4; - s32 var_t0_6; + FadeTransition fadeTransition; // spA4 s32 var_v0; s32 var_v0_2; - s8 temp_v0_17; - s8 temp_v0_19; - s8 temp_v0_4; - s8 temp_v0_5; - s8 temp_v0_8; - s8 temp_v0_9; - s8 temp_v1; - s8 temp_v1_2; - s8 temp_v1_3; - s8 var_t0_3; - s8 var_v1; - u32 temp_v0_2; - u8 temp_v0; - u8 temp_v0_6; - u8 temp_v1_5; - u8 temp_v1_6; - u8 var_t0_2; s8 *temp_s1_2; - s8 *temp_s1_3; if (gCutsceneID < 0) { return 1; @@ -9072,701 +8827,547 @@ s32 func_8001F460(Object *arg0, s32 arg1, Object *arg2) { if (arg1 >= 9) { arg1 = 8; } - temp_f0 = (f32) arg1; var_s0 = 0; - sp114 = temp_f0; - temp_s3 = arg0->unk64; + sp114 = arg1; + obj64 = arg0->animatedObject; if (osTvType == 0) { - sp114 = (f32) ((f64) temp_f0 * 1.2); + sp114 *= 1.2; } - if ((s16) temp_s3->racer.unk2A < 0) { - temp_v0 = (u8) temp_s3->effect_box.unkE[0x26]; + if (obj64->startDelay < 0) { var_t0 = 0; - if (temp_v0 & 1) { + if (obj64->unk34 & 1) { var_t0 = 0x8000; } - if (temp_v0 & 2) { + if (obj64->unk34 & 2) { var_t0 |= 0x4000; } - if (temp_v0 & 4) { + if (obj64->unk34 & 4) { var_t0 |= 0x1000; } do { - sp174 = var_t0; - temp_v0_2 = input_pressed(var_s0); + var_s2 |= input_pressed(var_s0); var_s0 += 1; - var_s2 |= temp_v0_2; } while (var_s0 != 4); if (var_s2 & var_t0) { - temp_s3->racer.unk2A = 1; + obj64->startDelay = 1; } } - temp_v0_3 = (s16) temp_s3->racer.unk2A; - if ((temp_v0_3 >= 0) && (temp_s3->effect_box.unkE[0x37] == 0)) { - temp_s3->racer.unk2A = temp_v0_3 - arg1; - if ((s16) temp_s3->racer.unk2A <= 0) { - temp_s3->effect_box.unkE[0x37] = 1; - temp_s1 = (LevelObjectEntry_Animation *) temp_s3->racer.unk1C->pan; - func_80021104(arg0, &temp_s3->animation, temp_s1); - temp_s3->racer.unk2A = 0; - func_8002125C(arg0, (LevelObjectEntry_CharacterSelect *) temp_s1, (Object_CharacterSelect *) temp_s3, -1); + + if ((obj64->startDelay >= 0) && (obj64->unk45 == 0)) { + obj64->startDelay -= arg1; + if (obj64->startDelay <= 0) { + obj64->unk45 = 1; + temp_s1 = (LevelObjectEntry_Animation *) obj64->unk1C->level_entry; + func_80021104(arg0, obj64, temp_s1); + obj64->startDelay = 0; + func_8002125C(arg0, temp_s1, obj64, -1); } } - if ((s16) temp_s3->racer.unk2A != 0) { - if (temp_s3->effect_box.unkE[0x2C] != 0) { - arg0->segment.trans.flags |= 0x4000; - temp_s3->effect_box.unkE[0x34] = 0; + if (obj64->startDelay != 0) { + if (obj64->unk3A != 0) { + arg0->trans.flags |= 0x4000; + obj64->unk42 = 0; return 1; } - goto block_247; + + return 0; } - arg0->segment.trans.flags &= 0xBFFF; - temp_v1 = temp_s3->effect_box.unkE[0x2B]; - if (temp_v1 > 0) { - temp_v1_2 = temp_s3->effect_box.unkE[0x2B]; - if (temp_v1_2 != music_current_sequence()) { - music_play(temp_v1_2 & 0xFF); + + arg0->trans.flags &= 0xBFFF; + if (obj64->unk39 > 0) { + if (obj64->unk39 != music_current_sequence()) { + music_play(obj64->unk39); music_change_off(); } - temp_s3->effect_box.unkE[0x2B] = -2; + obj64->unk39 = -2; music_volume_reset(); - } else if (temp_v1 == -2) { + } else if (obj64->unk39 == -2) { music_change_on(); - temp_s3->effect_box.unkE[0x2B] = -1; + obj64->unk39 = -1; } - temp_v1_3 = temp_s3->effect_box.unkE[0x2A]; - if (temp_v1_3 != 0) { - var_v0 = temp_v1_3 & 0xFF; - if (temp_s3->fish.triangles[2].uv0.u == 0) { - if (var_v0 == 0xFF) { - temp_a0 = temp_s3->racer.unk18; - if (temp_a0 != NULL) { - sndp_stop(temp_a0); + if (obj64->soundID != 0) { + var_v0_2 = obj64->soundID & 0xFF; + if (obj64->currentSound == 0) { + if (var_v0_2 == 0xFF) { + if (obj64->unk18 != NULL) { + sndp_stop(obj64->unk18); } } else { - temp_a0_2 = temp_s3->racer.unk18; - if (temp_a0_2 != NULL) { - sndp_stop(temp_a0_2); - var_v0 = temp_s3->effect_box.unkE[0x2A] & 0xFF; + if (obj64->unk18 != NULL) { + sndp_stop(obj64->unk18); + var_v0_2 = obj64->soundID & 0xFF; } - sound_play(var_v0 & 0xFFFF, &temp_s3->racer.unk18); + sound_play(var_v0_2, &obj64->unk18); } - temp_s3->effect_box.unkE[0x2A] = 0; + obj64->soundID = 0; } } - temp_v0_4 = temp_s3->effect_box.unkE[0x35]; - if (temp_v0_4 != 0) { - music_fade(temp_v0_4 << 8); - temp_s3->effect_box.unkE[0x35] = 0; + var_v0_2 = obj64->unk43; + if (var_v0_2 != 0) { + music_fade(var_v0_2 << 8); + obj64->unk43 = 0; } - temp_v0_5 = temp_s3->effect_box.unkE[0x33]; - var_t0_2 = (u8) temp_s3->effect_box.unkE[0x34]; - if (temp_v0_5 & 1) { - temp_t7 = arg1 * 8; - if (temp_v0_5 & 2) { - var_t0_2 = 0; + var_v0_2 = obj64->unk41; + var_t0 = (u8) obj64->unk42; + if (var_v0_2 & 1) { + if (var_v0_2 & 2) { + var_t0 = 0; } - if (temp_t7 < (s32) var_t0_2) { - var_t0_3 = var_t0_2 - temp_t7; + if ((arg1 * 8) < var_t0) { + var_t0 -= (arg1 * 8); } else { - var_t0_3 = 0; - arg0->segment.trans.flags |= 0x4000; + var_t0 = 0; + arg0->trans.flags |= 0x4000; } } else { - if (temp_v0_5 & 2) { - var_t0_2 = 0xFF; + if (var_v0_2 & 2) { + var_t0 = 0xFF; } - var_t0_3 = var_t0_2 + (arg1 * 8); - if (var_t0_3 >= 0x100) { - var_t0_3 = -1; + var_t0 += arg1 * 8; + if (var_t0 >= 0x100) { + var_t0 = 0xFF; } - arg0->segment.trans.flags &= ~0x4000; + arg0->trans.flags &= ~0x4000; } - temp_v0_6 = (u8) temp_s3->effect_box.unkE[0x2D]; - temp_s2 = temp_v0_6 & 0x7F; - temp_s3->effect_box.unkE[0x34] = var_t0_3; - if (temp_s2 != 0x7F) { - if (temp_s2 >= 8) { - temp_s1_2 = (s8 *) (get_misc_asset(0xD) + (temp_s2 * 5)) - 0x28; - temp_t0 = (temp_s1_2[0] & 0xFF) + 0x384; - temp_s0 = (temp_s1_2[1] & 0xFF) + 0x384; - sp174 = temp_t0; - slowly_change_fog(0, temp_s1_2[2] & 0xFF, temp_s1_2[3] & 0xFF, temp_s1_2[4] & 0xFF, temp_t0, temp_s0, - normalise_time(6) * (u8) temp_s3->effect_box.unkE[0x2E]); - } else if (temp_s2 >= 6) { - spA4 = 0x40; - if (temp_s2 == 7) { - spA7 = -1; - spA6 = -0x38; - spA5 = -0x38; + var_v0_2 = obj64->unk3B; + var_s2 = var_v0_2 & 0x7F; + obj64->unk42 = var_t0; + if (var_s2 != 0x7F) { + if (var_s2 >= 8) { + temp_s1_2 = ((s8 *) get_misc_asset(0xD) + (var_s2 * 5)); + temp_s1_2 -= 0x28; + var_t0 = (temp_s1_2[0] & 0xFF) + 0x384; + var_s0 = (temp_s1_2[1] & 0xFF) + 0x384; + slowly_change_fog(0, temp_s1_2[2] & 0xFF, temp_s1_2[3] & 0xFF, temp_s1_2[4] & 0xFF, var_t0, var_s0, + normalise_time(6) * obj64->unk3C); + } else if (var_s2 >= 6) { + fadeTransition.type = 0x40; + // clang-format off + if (var_s2 == 7) { + fadeTransition.red = 0xC8;\ + fadeTransition.green = 0xC8;\ + fadeTransition.blue = 0xFF;\ } else { - spA7 = -1; - spA6 = -1; - spA5 = -1; + fadeTransition.blue = 0xFF;\ + fadeTransition.green = 0xFF;\ + fadeTransition.red = 0xFF;\ } - spA8 = 7; - spAA = 3; - transition_begin((FadeTransition *) &spA4); + // clang-format on + fadeTransition.duration = 7; + fadeTransition.endTimer = 3; + transition_begin(&fadeTransition); } else { - spA4 = temp_v0_6; - temp_s1_3 = (s8 *) get_misc_asset(0xE) + (temp_s3->effect_box.unkE[0x32] * 3); - spA5 = temp_s1_3[0]; - spA6 = temp_s1_3[1]; - spA7 = temp_s1_3[2]; - if ((u8) temp_s3->effect_box.unkE[0x2D] & 0x80) { - spAA = 0; + fadeTransition.type = var_v0_2; + temp_s1_2 = (s8 *) get_misc_asset(0xE) + (obj64->unk40 * 3); + fadeTransition.red = temp_s1_2[0]; + fadeTransition.green = temp_s1_2[1]; + fadeTransition.blue = temp_s1_2[2]; + if (obj64->unk3B & 0x80) { + fadeTransition.endTimer = 0; } else { - spAA = 0xFFFF; + fadeTransition.endTimer = 0xFFFF; } - spA8 = normalise_time(6) * (u8) temp_s3->effect_box.unkE[0x2E]; - if ((check_fadeout_transition() == 0) || (spA4 & 0x80)) { - transition_begin((FadeTransition *) &spA4); + fadeTransition.duration = normalise_time(6) * obj64->unk3C; + if ((check_fadeout_transition() == 0) || (fadeTransition.type & 0x80)) { + transition_begin(&fadeTransition); } } - temp_s3->effect_box.unkE[0x2D] = -1; + obj64->unk3B = 0xFF; } - if ((u8) temp_s3->effect_box.unkE[0x20] == 1) { - temp_f0_2 = (f32) ((f64) sp114 * 8.0); - arg0->segment.trans.rotation.s[0] += (s32) ((f32) temp_s3->effect_box.unkE[0x23] * temp_f0_2); - arg0->segment.trans.rotation.s[1] += (s32) ((f32) temp_s3->effect_box.unkE[0x24] * temp_f0_2); - arg0->segment.trans.rotation.s[2] += (s32) ((f32) temp_s3->effect_box.unkE[0x25] * temp_f0_2); + if (obj64->unk2E == 1) { + var_f0 = sp114 * 8.0; + arg0->trans.rotation.s[0] += (s16) (obj64->unk31 * var_f0); + arg0->trans.rotation.s[1] += (s16) (obj64->unk32 * var_f0); + arg0->trans.rotation.s[2] += (s16) (obj64->unk33 * var_f0); } - if ((arg2 != NULL) && (arg2->segment.header->modelType == 0)) { - // usage of temp_s3 is definetely incorrect here. unkE[2] is probably a f32, unkE[6] as well, possibly xy - // coordinates - arg2->segment.object.animationID = arg0->segment.object.animationID; - temp_v0_7 = arg2->segment.animFrame; - if (temp_v0_7 != (s16) (s32) temp_s3->effect_box.unkE[2]) { - temp_s3->effect_box.unkE[2] = (f32) temp_v0_7; + if ((arg2 != NULL) && (arg2->header->modelType == 0)) { + arg2->animationID = arg0->animationID; + var_v0_2 = arg2->animFrame; + if (var_v0_2 != (s16) obj64->y) { + obj64->y = var_v0_2; } - temp_v1_4 = arg2->modelInstances[arg2->segment.object.modelIndex]; - if (temp_v1_4 != NULL) { - temp_v0_8 = arg2->segment.object.animationID; - temp_a0_3 = temp_v1_4->objModel; - if ((temp_v0_8 >= 0) && (temp_v0_8 < temp_a0_3->numberOfAnimations)) { - temp_v1_5 = (u8) temp_s3->effect_box.unkE[0x1E]; - temp_t7_2 = (temp_a0_3->animations[temp_v0_8].animLength - 1) * 0x10; - switch (temp_v1_5) { /* irregular */ + if (arg2->modelInstances[arg2->modelIndex] != NULL) { + var_v0_2 = arg2->animationID; + temp_a0_3 = arg2->modelInstances[arg2->modelIndex]->objModel; + if ((var_v0_2 >= 0) && (var_v0_2 < temp_a0_3->numberOfAnimations)) { + var_s5 = temp_a0_3->animations[var_v0_2].animLength; + var_s5--; + var_s5 <<= 4; + switch (obj64->unk2C) { case 0: - temp_f0_3 = (f32) temp_t7_2; - temp_s3->effect_box.unkE[2] = - ((f32) temp_s3->effect_box.unkE[2] + ((f32) temp_s3->effect_box.unkE[6] * sp114)); - temp_f2 = temp_s3->effect_box.unkE[2]; - if (temp_f0_3 <= (f32) temp_f2) { - temp_s3->effect_box.unkE[2] = ((f32) temp_f2 - temp_f0_3); + obj64->y += obj64->z * sp114; + if (var_s5 <= obj64->y) { + obj64->y -= var_s5; } break; case 2: - temp_f0_4 = (f32) temp_t7_2; - temp_s3->effect_box.unkE[2] = - ((f32) temp_s3->effect_box.unkE[2] + ((f32) temp_s3->effect_box.unkE[6] * sp114)); - if (temp_f0_4 <= (f32) temp_s3->effect_box.unkE[2]) { - temp_s3->effect_box.unkE[2] = (temp_f0_4 - 1.0f); + obj64->y += obj64->z * sp114; + if (var_s5 <= obj64->y) { + obj64->y = var_s5 - 1.0f; } break; case 1: - if ((u8) temp_s3->effect_box.unkE[0x1F] == 0) { - temp_f0_5 = (f32) temp_t7_2; - temp_s3->effect_box.unkE[2] = - ((f32) temp_s3->effect_box.unkE[2] + ((f32) temp_s3->effect_box.unkE[6] * sp114)); - if (temp_f0_5 <= (f32) temp_s3->effect_box.unkE[2]) { - temp_s3->effect_box.unkE[0x1F] = 1; - temp_s3->effect_box.unkE[2] = (temp_f0_5 - 1.0f); + if (obj64->unk2D == 0) { + obj64->y += obj64->z * sp114; + if (var_s5 <= obj64->y) { + obj64->unk2D = 1; + obj64->y = var_s5 - 1.0f; } } else { - temp_s3->effect_box.unkE[2] = - ((f32) temp_s3->effect_box.unkE[2] - ((f32) temp_s3->effect_box.unkE[6] * sp114)); - if ((f32) temp_s3->effect_box.unkE[2] <= 0.0f) { - temp_s3->effect_box.unkE[2] = NULL; - temp_s3->effect_box.unkE[0x1F] = 0; + obj64->y -= obj64->z * sp114; + if (obj64->y <= 0) { + obj64->y = 0; + obj64->unk2D = 0; } } break; case 3: - if ((u8) temp_s3->effect_box.unkE[0x1F] == 0) { - temp_f0_6 = (f32) temp_t7_2; - temp_s3->effect_box.unkE[2] = - ((f32) temp_s3->effect_box.unkE[2] + ((f32) temp_s3->effect_box.unkE[6] * sp114)); - if (temp_f0_6 <= (f32) temp_s3->effect_box.unkE[2]) { - temp_s3->effect_box.unkE[0x1F] = 1; - temp_s3->effect_box.unkE[2] = (temp_f0_6 - 1.0f); + if (obj64->unk2D == 0) { + obj64->y += obj64->z * sp114; + if (var_s5 <= obj64->y) { + obj64->unk2D = 1; + obj64->y = var_s5 - 1.0f; } } else { - temp_s3->effect_box.unkE[2] = - ((f32) temp_s3->effect_box.unkE[2] - ((f32) temp_s3->effect_box.unkE[6] * sp114)); - if ((f32) temp_s3->effect_box.unkE[2] <= 0.0f) { - temp_s3->effect_box.unkE[2] = NULL; + obj64->y -= obj64->z * sp114; + if (obj64->y <= 0) { + obj64->y = 0; } } break; } } } - arg2->segment.animFrame = (s16) (s32) (f32) temp_s3->effect_box.unkE[2]; + arg2->animFrame = obj64->y; } - if ((f64) temp_s3->racer.forwardVel <= 0.0) { + + if (obj64->unk8 <= 0.0) { return func_800214E4(arg0, arg1); } - temp_a1 = (s16) temp_s3->racer.lastSoundID; - var_s4 = 0; - if ((D_8011AE78 > 0) && (temp_a1 != (*D_8011AE74)->properties.common.unk4)) { - loop_104: - var_s4 += 1; - if (var_s4 < D_8011AE78) { - if (temp_a1 != D_8011AE74[var_s4]->properties.common.unk4) { - goto loop_104; - } - } - } + + temp_a1_2 = obj64->unk28; + for (var_s4 = 0; var_s4 < D_8011AE78 && temp_a1_2 != D_8011AE74[var_s4]->properties.animation.behaviourID; + var_s4++) {} if (var_s4 >= D_8011AE78) { return func_800214E4(arg0, arg1); } - var_s5 = 1; - if ((var_s4 + 1) < D_8011AE78) { - temp_a0_4 = &D_8011AE74[var_s4]; - var_v0_2 = var_s4 + 1 + 1; - if (temp_a1 == temp_a0_4[1]->properties.common.unk4) { - loop_110: - var_s5 += 1; - if (var_v0_2 < D_8011AE78) { - var_v0_2 += 1; - if (temp_a1 == temp_a0_4[var_s5]->properties.common.unk4) { - goto loop_110; - } - } - } - } + + for (var_s5 = 1; + (var_s4 + var_s5) < D_8011AE78 && temp_a1_2 == D_8011AE74[var_s4 + var_s5]->properties.animation.behaviourID; + var_s5++) {} if (var_s5 < 2) { return func_800214E4(arg0, arg1); } temp_a2 = D_8011AE74; - var_v1 = -1; - spB4 = (f32) (1.0 / (f64) (*temp_a2)->segment.header->scale); + sp168 = -1; + spB4 = 1.0 / (*temp_a2)->header->scale; if (var_s5 >= 3) { - temp_v0_9 = (&temp_a2[var_s4])[var_s5 - 1]->segment.level_entry->animation.goToNode; - if (temp_v0_9 >= 0) { - if (temp_v0_9 < (var_s5 - 1)) { - var_v1 = temp_v0_9; + // modified character select + var_v0_2 = temp_a2[var_s4 + var_s5 - 1]->level_entry->animation.goToNode; + if (var_v0_2 >= 0) { + if (var_v0_2 < (var_s5 - 1)) { + sp168 = var_v0_2; } } } - if ((var_v1 == -1) && (temp_s3->fish.triangles[2].uv0.v >= (var_s5 - 1))) { + if ((sp168 == -1) && (obj64->unk26 >= (var_s5 - 1))) { return func_800214E4(arg0, arg1); } - temp_v0_10 = temp_s3->fish.triangles[3].uv0.v; - sp168 = (s32) var_v1; - var_t1 = &sp154; - if (temp_v0_10 >= 0) { + if (obj64->pauseCounter >= 0) { if (D_8011AD53 == 0) { - temp_s3->fish.triangles[3].uv0.v = temp_v0_10 - arg1; + obj64->pauseCounter -= arg1; } - } else { - var_t2 = &sp140; - var_t3 = &sp12C; - var_t5 = &spE0[0]; - var_t4 = &spCC[0]; - var_ra = &spB8[0]; - var_a3 = &spF4; - var_s0_2 = temp_s3->fish.triangles[2].uv0.v - 1; - do { - if (var_s0_2 == -1) { - if (sp168 != 0) { - temp_v0_11 = &temp_a2[var_s4]; - temp_f0_7 = temp_v0_11[0]->segment.trans.x_position; - *var_t1 = (temp_f0_7 - temp_v0_11[1]->segment.trans.x_position) + temp_f0_7; - temp_f2_2 = temp_v0_11[0]->segment.trans.y_position; - *var_t2 = (temp_f2_2 - temp_v0_11[1]->segment.trans.y_position) + temp_f2_2; - temp_f12 = temp_v0_11[0]->segment.trans.z_position; - *var_t3 = (temp_f12 - temp_v0_11[1]->segment.trans.z_position) + temp_f12; - *var_t5 = (f32) temp_v0_11[0]->segment.trans.rotation.s[0]; - *var_t4 = (f32) temp_v0_11[0]->segment.trans.rotation.s[1]; - *var_ra = (f32) temp_v0_11[0]->segment.trans.rotation.s[2]; - var_f6 = temp_v0_11[0]->segment.trans.scale; + return 0; + } + + var_s0 = obj64->unk26 - 1; + for (var_s2 = 0; var_s2 < 5; var_s2++) { + if (var_s0 == -1) { + if (sp168 != 0) { + objectsList = &temp_a2[var_s4]; + var_f0 = objectsList[0]->trans.x_position; + sp154[var_s2] = (var_f0 - objectsList[1]->trans.x_position) + var_f0; + var_f2 = objectsList[0]->trans.y_position; + sp140[var_s2] = (var_f2 - objectsList[1]->trans.y_position) + var_f2; + var_f12 = objectsList[0]->trans.z_position; + sp12C[var_s2] = (var_f12 - objectsList[1]->trans.z_position) + var_f12; + spE0[var_s2] = objectsList[0]->trans.rotation.s[0]; + spCC[var_s2] = objectsList[0]->trans.rotation.s[1]; + spB8[var_s2] = objectsList[0]->trans.rotation.s[2]; + var_f6 = objectsList[0]->trans.scale; + goto block_144; + } + objectsList = &temp_a2[var_s4 + var_s5]; + sp154[var_s2] = objectsList[-1]->trans.x_position; + sp140[var_s2] = objectsList[-1]->trans.y_position; + sp12C[var_s2] = objectsList[-1]->trans.z_position; + spE0[var_s2] = objectsList[-1]->trans.rotation.s[0]; + spCC[var_s2] = objectsList[-1]->trans.rotation.s[1]; + spB8[var_s2] = objectsList[-1]->trans.rotation.s[2]; + spF4[var_s2] = objectsList[-1]->trans.scale; + } else { + temp_a1_2 = var_s0 + var_s4; + if (var_s0 >= var_s5) { + if (sp168 == -1) { + var_s0 = var_s5 - 1; + var_v0_2 = var_s5 + var_s4; + temp_s1 = temp_a2[var_v0_2 - 1]->level_entry; + if (temp_s1->unk22 == 1) { + set_active_camera(obj64->cameraID); + camera = cam_get_active_camera_no_cutscenes(); + objectsList = &temp_a2[var_v0_2 - 1]; + } else { + objectsList = &temp_a2[var_v0_2 - 1]; + camera = (Camera *) *objectsList; + } + var_f0 = camera->trans.x_position; + sp154[var_s2] = (var_f0 - objectsList[-1]->trans.x_position) + var_f0; + var_f2 = camera->trans.y_position; + sp140[var_s2] = (var_f2 - objectsList[-1]->trans.y_position) + var_f2; + var_f12 = camera->trans.z_position; + sp12C[var_s2] = (var_f12 - objectsList[-1]->trans.z_position) + var_f12; + spCC[var_s2] = camera->trans.rotation.s[1]; + spB8[var_s2] = camera->trans.rotation.s[2]; + spE0[var_s2] = objectsList[0]->trans.rotation.s[0]; + spF4[var_s2] = objectsList[0]->trans.scale; + } else { + objectsList = &temp_a2[(var_s4 + sp168 + var_s0) - var_s5]; + sp154[var_s2] = objectsList[0]->trans.x_position; + sp140[var_s2] = objectsList[0]->trans.y_position; + sp12C[var_s2] = objectsList[0]->trans.z_position; + spE0[var_s2] = objectsList[0]->trans.rotation.s[0]; + spCC[var_s2] = objectsList[0]->trans.rotation.s[1]; + spB8[var_s2] = objectsList[0]->trans.rotation.s[2]; + var_f6 = objectsList[0]->trans.scale; goto block_144; } - temp_v0_12 = &temp_a2[var_s4 + var_s5]; - *var_t1 = temp_v0_12[-1]->segment.trans.x_position; - *var_t2 = temp_v0_12[-1]->segment.trans.y_position; - *var_t3 = temp_v0_12[-1]->segment.trans.z_position; - *var_t5 = (f32) temp_v0_12[-1]->segment.trans.rotation.s[0]; - *var_t4 = (f32) temp_v0_12[-1]->segment.trans.rotation.s[1]; - *var_ra = (f32) temp_v0_12[-1]->segment.trans.rotation.s[2]; - *var_a3 = temp_v0_12[-1]->segment.trans.scale; } else { - temp_a1_2 = var_s0_2 + var_s4; - if (var_s0_2 >= var_s5) { - temp_v0_13 = var_s5 + var_s4; - if (sp168 == -1) { - var_s0_2 = var_s5 - 1; - if (temp_a2[temp_v0_13 - 1]->segment.level_entry->animation.unk22 == 1) { - sp6C = var_ra; - sp74 = var_t5; - sp70 = var_t4; - sp78 = var_t3; - sp7C = var_t2; - sp88 = var_t1; - sp68 = var_a3; - sp5C = (temp_v0_13 * 4) - 4; - set_active_camera((s32) temp_s3->effect_box.unkE[0x22]); - var_v1_2 = cam_get_active_camera_no_cutscenes(); - var_a0 = &D_8011AE74[temp_v0_13 - 1]; - } else { - var_a0 = &temp_a2[temp_v0_13 - 1]; - var_v1_2 = (Camera *) *var_a0; - } - temp_f0_8 = var_v1_2->trans.x_position; - *var_t1 = (temp_f0_8 - var_a0[-1]->segment.trans.x_position) + temp_f0_8; - temp_f2_3 = var_v1_2->trans.y_position; - *var_t2 = (temp_f2_3 - var_a0[-1]->segment.trans.y_position) + temp_f2_3; - temp_f12_2 = var_v1_2->trans.z_position; - *var_t3 = (temp_f12_2 - var_a0[-1]->segment.trans.z_position) + temp_f12_2; - *var_t4 = (f32) var_v1_2->trans.rotation.s[1]; - *var_ra = (f32) var_v1_2->trans.rotation.s[2]; - *var_t5 = (f32) var_a0[0]->segment.trans.rotation.s[0]; - *var_a3 = var_a0[0]->segment.trans.scale; - } else { - temp_v0_14 = &temp_a2[(var_s4 + sp168 + var_s0_2) - var_s5]; - *var_t1 = (*temp_v0_14)->segment.trans.x_position; - *var_t2 = (*temp_v0_14)->segment.trans.y_position; - *var_t3 = (*temp_v0_14)->segment.trans.z_position; - *var_t5 = (f32) (*temp_v0_14)->segment.trans.rotation.s[0]; - *var_t4 = (f32) (*temp_v0_14)->segment.trans.rotation.s[1]; - *var_ra = (f32) (*temp_v0_14)->segment.trans.rotation.s[2]; - var_f6 = (*temp_v0_14)->segment.trans.scale; - goto block_144; - } - } else { - var_a0_2 = &temp_a2[temp_a1_2]; - temp_v0_15 = *var_a0_2; - temp_s1_4 = temp_v0_15->segment.level_entry; - var_v1_3 = temp_v0_15; - if (temp_s1_4->animation.unk22 == 1) { - sp6C = var_ra; - sp74 = var_t5; - sp70 = var_t4; - sp78 = var_t3; - sp7C = var_t2; - sp88 = var_t1; - sp68 = var_a3; - sp80 = temp_a1_2 * 4; - set_active_camera((s32) temp_s3->effect_box.unkE[0x22]); - var_v1_3 = (Object *) cam_get_active_camera_no_cutscenes(); - var_a0_2 = D_8011AE74 + sp80; - } - *var_t1 = var_v1_3->segment.trans.x_position; - *var_t2 = var_v1_3->segment.trans.y_position; - *var_t3 = var_v1_3->segment.trans.z_position; - *var_t4 = (f32) var_v1_3->segment.trans.rotation.s[1]; - *var_ra = (f32) var_v1_3->segment.trans.rotation.s[2]; - *var_t5 = (f32) (*var_a0_2)->segment.trans.rotation.s[0]; - if (temp_s1_4->animation.unk22 == 1) { - *var_t4 = -*var_t4; - } - var_f6 = (*var_a0_2)->segment.trans.scale; - block_144: - *var_a3 = var_f6; + objectsList = &temp_a2[temp_a1_2]; + temp_s1 = objectsList[0]->level_entry; + var_v1_3 = objectsList[0]; + if (temp_s1->unk22 == 1) { + set_active_camera(obj64->cameraID); + var_v1_3 = (Object *) cam_get_active_camera_no_cutscenes(); + objectsList = &D_8011AE74[temp_a1_2]; } - } - var_a3 += 4; - var_t1 += 4; - var_t2 += 4; - var_t3 += 4; - var_t5 += 4; - var_t4 += 4; - var_ra += 4; - var_s0_2 += 1; - } while (var_a3 != &sp108); - var_s2_2 = 0; - var_s0_3 = 0; - if ((f32) temp_s3->racer.unk4 == 0.0f) { - temp_s3->racer.unk4 = 0x3C23D70A; - } - do { - var_f20 = (f32) temp_s3->fish.triangles[0].vertices + ((f32) temp_s3->racer.unk4 * sp114); - temp_f0_9 = (f64) var_f20; - if (temp_f0_9 >= 1.0) { - var_s2_2 = 1; - var_f20 = (f32) (temp_f0_9 - 1.0); - } - if (temp_s3->effect_box.unkE[0x31] == 0) { - sp124 = catmull_rom_interpolation(&sp154, var_s2_2, var_f20); - sp120 = catmull_rom_interpolation(&sp140, var_s2_2, var_f20); - var_f0 = catmull_rom_interpolation(&sp12C, var_s2_2, var_f20); - } else { - sp124 = lerp(&sp154, (u32) var_s2_2, var_f20); - sp120 = lerp(&sp140, (u32) var_s2_2, var_f20); - var_f0 = lerp(&sp12C, (u32) var_s2_2, var_f20); - } - sp11C = var_f0; - temp_f6 = sp124 - arg0->segment.trans.x_position; - sp124 = temp_f6; - temp_f8 = sp120 - arg0->segment.trans.y_position; - sp120 = temp_f8; - sp11C = var_f0 - arg0->segment.trans.z_position; - if (var_s0_3 != 1) { - var_s2_2 = 0; - temp_f2_4 = sqrtf((temp_f6 * temp_f6) + (temp_f8 * temp_f8) + (sp11C * sp11C)) / sp114; - if (temp_f2_4 != 0.0f) { - temp_s3->racer.unk4 = (s32) ((f32) temp_s3->racer.unk4 * (temp_s3->racer.forwardVel / temp_f2_4)); + sp154[var_s2] = var_v1_3->trans.x_position; + sp140[var_s2] = var_v1_3->trans.y_position; + sp12C[var_s2] = var_v1_3->trans.z_position; + spCC[var_s2] = var_v1_3->trans.rotation.s[1]; + spB8[var_s2] = var_v1_3->trans.rotation.s[2]; + var_v1_3 = objectsList[0]; + spE0[var_s2] = var_v1_3->trans.rotation.s[0]; + if (temp_s1->unk22 == 1) { + spCC[var_s2] = -spCC[var_s2]; } - } - var_s0_3 += 1; - } while (var_s0_3 != 2); - arg0->segment.trans.scale = - catmull_rom_interpolation(&spF4, var_s2_2, var_f20) * spB4 * arg0->segment.header->scale; - if ((var_s2_2 != 0) && (sp168 == -1) && (var_s5 == (temp_s3->fish.triangles[2].uv0.v + 2))) { - sp124 = catmull_rom_interpolation(&sp154, 0, 1.0f); - sp120 = catmull_rom_interpolation(&sp140, 0, 1.0f); - temp_f0_10 = catmull_rom_interpolation(&sp12C, 0, 1.0f); - sp11C = temp_f0_10; - sp124 -= arg0->segment.trans.x_position; - sp120 -= arg0->segment.trans.y_position; - sp11C = temp_f0_10 - arg0->segment.trans.z_position; - } - arg0->segment.x_velocity = sp124 / sp114; - arg0->segment.y_velocity = sp120 / sp114; - arg0->segment.z_velocity = sp11C / sp114; - move_object(arg0, sp124, sp120, sp11C); - temp_v1_6 = (u8) temp_s3->effect_box.unkE[0x20]; - if (temp_v1_6 != 1) { - if (temp_v1_6 != 2) { - var_t0_4 = 1; - if (temp_v1_6 != 3) { - var_t5_2 = &spE4; - var_t4_2 = &spD0; - var_ra_2 = &spBC; - do { - temp_f4 = var_t5_2[0]; - temp_f6_2 = var_t5_2[1]; - var_t5_2++; - temp_f2_5 = (f64) (temp_f4 - temp_f6_2); - var_f0_2 = 0.0f; - if (temp_f2_5 > 32768.0) { - var_f0_2 = (f32) ((f64) 0.0f - 65536.0); - } else if (temp_f2_5 < -32768.0) { - var_f0_2 = (f32) ((f64) 0.0f + 65536.0); - } - var_s0_4 = var_t0_4; - if (var_t0_4 < 5) { - temp_t7_3 = (5 - var_t0_4) & 3; - if (temp_t7_3 != 0) { - var_v0_3 = &(&spE0[0])[var_s0_4]; - do { - var_s0_4 += 1; - temp_f8_2 = *var_v0_3 + var_f0_2; - var_v0_3[0] = temp_f8_2; - var_v0_3++; - } while ((temp_t7_3 + var_t0_4) != var_s0_4); - if (var_s0_4 != 5) { - goto block_181; - } - } else { - block_181: - var_v0_4 = &(&spE0[0])[var_s0_4]; - do { - var_v0_4[1] += var_f0_2; - var_v0_4[0] += var_f0_2; - var_v0_4[2] += var_f0_2; - var_v0_4[3] += var_f0_2; - var_v0_4 += 4; - } while (var_v0_4 != &spF4); - } - var_s0_4 = var_t0_4; - } - temp_f4_2 = var_t4_2[0]; - temp_f6_4 = var_t4_2[-1]; - var_t4_2++; - temp_f2_6 = (f64) (temp_f4_2 - temp_f6_4); - var_f0_3 = 0.0f; - if (temp_f2_6 > 32768.0) { - var_f0_3 = (f32) ((f64) 0.0f - 65536.0); - } else if (temp_f2_6 < -32768.0) { - var_f0_3 = (f32) ((f64) 0.0f + 65536.0); - } - if (var_t0_4 < 5) { - temp_t6 = (5 - var_t0_4) & 3; - if (temp_t6 != 0) { - var_v0_5 = &(&spCC[0])[var_s0_4]; - do { - var_s0_4 += 1; - temp_f8_3 = *var_v0_5 + var_f0_3; - var_v0_5[0] = temp_f8_3; - var_v0_5 += 4; - } while ((temp_t6 + var_t0_4) != var_s0_4); - if (var_s0_4 != 5) { - goto block_193; - } - } else { - block_193: - var_v0_6 = &(&spCC[0])[var_s0_4]; - do { - var_v0_6[1] += var_f0_3; - var_v0_6[0] += var_f0_3; - var_v0_6[2] += var_f0_3; - var_v0_6[3] += var_f0_3; - var_v0_6 += 4; - } while (var_v0_6 != &spE0[0]); - } - var_s0_4 = var_t0_4; - } - temp_f2_7 = (f64) (var_ra_2[0] - var_ra_2[-1]); - var_f0_4 = 0.0f; - if (temp_f2_7 > 32768.0) { - var_f0_4 = (f32) ((f64) 0.0f - 65536.0); - } else if (temp_f2_7 < -32768.0) { - var_f0_4 = (f32) ((f64) 0.0f + 65536.0); - } - temp_t7_4 = (5 - var_t0_4) & 3; - if (var_t0_4 < 5) { - if (temp_t7_4 != 0) { - var_v0_7 = &(&spB8[0])[var_s0_4]; - do { - var_s0_4 += 1; - var_v0_7[0] += var_f0_4; - var_v0_7++; - } while ((temp_t7_4 + var_t0_4) != var_s0_4); - if (var_s0_4 != 5) { - goto block_205; - } - } else { - block_205: - var_v0_8 = &(&spB8[0])[var_s0_4]; - do { - var_v0_6[1] += var_f0_4; - var_v0_6[0] += var_f0_4; - var_v0_6[2] += var_f0_4; - var_v0_6[3] += var_f0_4; - var_v0_6 += 4; - } while (var_v0_8 != &spCC[0]); - } - } - var_t0_4 += 1; - var_ra_2 += 4; - } while (var_t0_4 != 5); - if (temp_s3->effect_box.unkE[0x31] == 0) { - arg0->segment.trans.rotation.s[0] = - (s16) (s32) catmull_rom_interpolation(&spE0[0], var_s2_2, var_f20); - arg0->segment.trans.rotation.s[1] = - (s16) (s32) catmull_rom_interpolation(&spCC[0], var_s2_2, var_f20); - arg0->segment.trans.rotation.s[2] = - (s16) (s32) catmull_rom_interpolation(&spB8[0], var_s2_2, var_f20); - } else { - arg0->segment.trans.rotation.s[0] = (s16) (s32) lerp(&spE0[0], (u32) var_s2_2, var_f20); - arg0->segment.trans.rotation.s[1] = (s16) (s32) lerp(&spCC[0], (u32) var_s2_2, var_f20); - arg0->segment.trans.rotation.s[2] = (s16) (s32) lerp(&spB8[0], (u32) var_s2_2, var_f20); - } - } - } else { - if (temp_s3->effect_box.unkE[0x31] == 0) { - cubic_spline_interpolation(&sp154, var_s2_2, var_f20, &sp124); - cubic_spline_interpolation(&sp140, var_s2_2, var_f20, &sp120); - cubic_spline_interpolation(&sp12C, var_s2_2, var_f20, &sp11C); - } else { - lerp_and_get_derivative(&sp154, (u32) var_s2_2, var_f20, &sp124); - lerp_and_get_derivative(&sp140, (u32) var_s2_2, var_f20, &sp120); - lerp_and_get_derivative(&sp12C, (u32) var_s2_2, var_f20, &sp11C); - } - temp_f0_11 = sqrtf((sp124 * sp124) + (sp120 * sp120) + (sp11C * sp11C)); - if (temp_f0_11 != 0.0f) { - temp_f12_3 = (f32) (100.0 / (f64) temp_f0_11); - sp124 *= temp_f12_3; - sp120 *= temp_f12_3; - sp11C *= temp_f12_3; - } - arg0->segment.trans.rotation.s[0] = arctan2_f(sp124, sp11C) - 0x8000; - arg0->segment.trans.rotation.s[1] = arctan2_f(sp120, 100.0f); + var_f6 = objectsList[0]->trans.scale; + block_144: + spF4[var_s2] = var_f6; } } - var_t0_5 = temp_s3->fish.triangles[2].uv0.v; - temp_s3->fish.triangles[0].vertices = (u32) var_f20; - if ((sp168 != -1) && (var_t0_5 >= var_s5)) { - var_t0_5 = (var_t0_5 - var_s5) + sp168; - } - temp_f10_4 = - (f32) ((f64) (f32) (&D_8011AE74[var_s4])[var_t0_5]->segment.level_entry->animation.nodeSpeed * 0.1); - sp124 = temp_f10_4; - if (temp_f10_4 < 0.0f) { - sp124 = temp_s3->racer.animationSpeed; - } else { - temp_s3->racer.animationSpeed = sp124; - } - if (sp124 >= 0.0f) { - temp_v0_16 = var_t0_5 + 1; - if (var_s2_2 == 0) { - var_s0_5 = temp_v0_16; - if ((sp168 != -1) && (temp_v0_16 >= var_s5)) { - var_s0_5 = (temp_v0_16 - var_s5) + sp168; - } - if (var_s0_5 < var_s5) { - temp_v0_17 = (&D_8011AE74[var_s4])[var_s0_5]->segment.level_entry->animation.nodeSpeed; - if (temp_v0_17 >= 0) { - sp11C = (f32) ((f64) (f32) temp_v0_17 * 0.1); - } else { - sp11C = sp124; - } - } - temp_s3->racer.forwardVel = ((sp11C - sp124) * var_f20) + sp124; - } - } - if (var_s2_2 != 0) { - temp_s3->fish.triangles[2].uv0.v += 1; - if (sp168 == -1) { - temp_v0_18 = temp_s3->fish.triangles[2].uv0.v; - if (temp_v0_18 >= var_s5) { - temp_s3->fish.triangles[2].uv0.v = var_s5 - 1; - } else { - func_8002125C( - arg0, - (LevelObjectEntry_CharacterSelect *) (&D_8011AE74[temp_v0_18])[var_s4]->segment.level_entry, - (Object_CharacterSelect *) temp_s3, var_s4); - } - } else { - if (var_s5 < temp_s3->fish.triangles[2].uv0.v) { - temp_s3->fish.triangles[2].uv0.v = sp168 + 1; - } - var_s2_3 = temp_s3->fish.triangles[2].uv0.v; - if (temp_s3->fish.triangles[2].uv0.v >= var_s5) { - var_s2_3 = (temp_s3->fish.triangles[2].uv0.v - var_s5) + sp168; - } - func_8002125C(arg0, - (LevelObjectEntry_CharacterSelect *) D_8011AE74[var_s2_3 + var_s4]->segment.level_entry, - (Object_CharacterSelect *) temp_s3, var_s4); - } - } - if ((u8) temp_s3->effect_box.unkE[0x20] == 3) { - var_t0_6 = 0; - if (D_8011AE78 > 0) { - temp_v0_19 = temp_s3->effect_box.unkE[0x30]; - if (temp_v0_19 != (*D_8011AE74)->properties.common.unk4) { - loop_240: - var_t0_6 += 1; - if (var_t0_6 < D_8011AE78) { - if (temp_v0_19 != D_8011AE74[var_t0_6]->properties.common.unk4) { - goto loop_240; - } - } - } - } - if (var_t0_6 != D_8011AE78) { - temp_v1_7 = D_8011AE74[var_t0_6]->unk64; - if (temp_v1_7 != NULL) { - // usage of temp_s3 is definetely incorrect here. unkE[2] is probably a f32, unkE[6] as well, - // possibly xy coordinates - sp124 = temp_v1_7->racer.animationSpeed - arg0->segment.trans.x_position; - sp120 = (f32) temp_s3->effect_box.unkE[2] - arg0->segment.trans.y_position; - sp11C = (f32) temp_s3->effect_box.unkE[6] - arg0->segment.trans.z_position; - temp_f0_12 = sqrtf((sp124 * sp124) + (sp120 * sp120) + (sp11C * sp11C)); - if (temp_f0_12 > 0.0f) { - arg0->segment.trans.rotation.s[0] = arctan2_f(sp124, sp11C) - 0x8000; - arg0->segment.trans.rotation.s[1] = arctan2_f(sp120, temp_f0_12); - } - } - } - } - arg0->particleEmittersEnabled = (u32) temp_s3->effect_box.unkE[0x21]; - obj_spawn_particle(arg0, arg1); } -block_247: + + if (obj64->unk4 == 0) { + obj64->unk4 = 0.001; + } + + for (var_s0 = 0, var_s2 = 0; var_s0 < 2; var_s0++) { + var_f20 = obj64->unk0 + (obj64->unk4 * sp114); + if (var_f20 >= 1.0) { + var_s2 = 1; + var_f20 -= 1.0; + } + if (obj64->unk3F == 0) { + sp124 = catmull_rom_interpolation(sp154, var_s2, var_f20); + sp120 = catmull_rom_interpolation(sp140, var_s2, var_f20); + sp11C = catmull_rom_interpolation(sp12C, var_s2, var_f20); + } else { + sp124 = lerp(sp154, var_s2, var_f20); + sp120 = lerp(sp140, var_s2, var_f20); + sp11C = lerp(sp12C, var_s2, var_f20); + } + sp124 -= arg0->trans.x_position; + sp120 -= arg0->trans.y_position; + sp11C -= arg0->trans.z_position; + if (var_s0 != 1) { + var_s2 = 0; + var_f2 = sqrtf((sp124 * sp124) + (sp120 * sp120) + (sp11C * sp11C)) / sp114; + if (var_f2 != 0) { + // exit is probably not correct but we want unk4 to be a f32 + obj64->unk4 *= obj64->unk8 / var_f2; + } + } + } + + arg0->trans.scale = catmull_rom_interpolation(spF4, var_s2, var_f20) * spB4 * arg0->header->scale; + if ((var_s2 != 0) && (sp168 == -1) && (var_s5 == (obj64->unk26 + 2))) { + sp124 = catmull_rom_interpolation(sp154, 0, 1.0f); + sp120 = catmull_rom_interpolation(sp140, 0, 1.0f); + sp11C = catmull_rom_interpolation(sp12C, 0, 1.0f); + sp124 -= arg0->trans.x_position; + sp120 -= arg0->trans.y_position; + sp11C -= arg0->trans.z_position; + } + arg0->x_velocity = sp124 / sp114; + arg0->y_velocity = sp120 / sp114; + arg0->z_velocity = sp11C / sp114; + move_object(arg0, sp124, sp120, sp11C); + switch (obj64->unk2E) { + case 1: + break; + case 2: + if (obj64->unk3F == 0) { + cubic_spline_interpolation(sp154, var_s2, var_f20, &sp124); + cubic_spline_interpolation(sp140, var_s2, var_f20, &sp120); + cubic_spline_interpolation(sp12C, var_s2, var_f20, &sp11C); + } else { + lerp_and_get_derivative(sp154, var_s2, var_f20, &sp124); + lerp_and_get_derivative(sp140, var_s2, var_f20, &sp120); + lerp_and_get_derivative(sp12C, var_s2, var_f20, &sp11C); + } + var_f0 = sqrtf((sp124 * sp124) + (sp120 * sp120) + (sp11C * sp11C)); + if (var_f0 != 0) { + var_f12 = 100.0 / var_f0; + sp124 *= var_f12; + sp120 *= var_f12; + sp11C *= var_f12; + } + arg0->trans.rotation.s[0] = arctan2_f(sp124, sp11C) - 0x8000; + arg0->trans.rotation.s[1] = arctan2_f(sp120, 100.0f); + break; + case 3: + break; + default: + for (var_t0 = 1; var_t0 < 5; var_t0++) { + var_f6 = spE0[var_t0]; + var_f4 = spE0[var_t0 - 1]; + var_f2 = (var_f4 - var_f6); + var_f0 = 0; + if (var_f2 > 32768.0) { + var_f0 -= 65536.0; + } else if (var_f2 < -32768.0) { + var_f0 += 65536.0; + } + for (var_s0 = var_t0; var_s0 < 5; var_s0++) { + spE0[var_s0] += var_f0; + } + var_f4 = spCC[var_t0 - 1]; + var_f6 = spCC[var_t0]; + var_f2 = var_f4 - var_f6; + var_f0 = 0; + if (var_f2 > 32768.0) { + var_f0 -= 65536.0; + } else if (var_f2 < -32768.0) { + var_f0 += 65536.0; + } + for (var_s0 = var_t0; var_s0 < 5; var_s0++) { + spCC[var_s0] += var_f0; + } + var_f2 = spB8[var_t0 - 1] - spB8[var_t0]; + var_f0 = 0; + if (var_f2 > 32768.0) { + var_f0 -= 65536.0; + } else if (var_f2 < -32768.0) { + var_f0 += 65536.0; + } + for (var_s0 = var_t0; var_s0 < 5; var_s0++) { + spB8[var_s0] += var_f0; + } + } + if (obj64->unk3F == 0) { + arg0->trans.rotation.s[0] = catmull_rom_interpolation(spE0, var_s2, var_f20); + arg0->trans.rotation.s[1] = catmull_rom_interpolation(spCC, var_s2, var_f20); + arg0->trans.rotation.s[2] = catmull_rom_interpolation(spB8, var_s2, var_f20); + } else { + arg0->trans.rotation.s[0] = lerp(spE0, var_s2, var_f20); + arg0->trans.rotation.s[1] = lerp(spCC, var_s2, var_f20); + arg0->trans.rotation.s[2] = lerp(spB8, var_s2, var_f20); + } + break; + } + var_t0 = obj64->unk26; + // we need unk0 to be f32 here + obj64->unk0 = var_f20; + if ((sp168 != -1) && (var_t0 >= var_s5)) { + var_t0 = (var_t0 - var_s5) + sp168; + } + temp_s1 = D_8011AE74[var_s4 + var_t0]->level_entry; + var_f0 = (f32) temp_s1->nodeSpeed * 0.1; + sp124 = (f32) temp_s1->nodeSpeed * 0.1; + if (sp124 < 0) { + sp124 = obj64->x; + } else { + obj64->x = sp124; + } + if (sp124 >= 0) { + var_v0_2 = var_t0 + 1; + if (var_s2 == 0) { + var_s0 = var_v0_2; + if ((sp168 != -1) && (var_v0_2 >= var_s5)) { + var_s0 = (var_v0_2 - var_s5) + sp168; + } + if (var_s0 < var_s5) { + temp_s1 = D_8011AE74[var_s4 + var_s0]->level_entry; + var_v0_2 = temp_s1->nodeSpeed; + if (var_v0_2 >= 0) { + sp11C = (f32) var_v0_2 * 0.1; + } else { + sp11C = sp124; + } + } + obj64->unk8 = ((sp11C - sp124) * var_f20) + sp124; + } + } + if (var_s2 != 0) { + obj64->unk26 += 1; + if (sp168 == -1) { + if (obj64->unk26 >= var_s5) { + obj64->unk26 = var_s5 - 1; + } else { + func_8002125C(arg0, &D_8011AE74[obj64->unk26 + var_s4]->level_entry->animation, obj64, var_s4); + } + } else { + if (var_s5 < obj64->unk26) { + obj64->unk26 = sp168 + 1; + } + var_s2 = obj64->unk26; + if (obj64->unk26 >= var_s5) { + var_s2 = (obj64->unk26 - var_s5) + sp168; + } + var_s2 += var_s4; + func_8002125C(arg0, &D_8011AE74[var_s2]->level_entry->animation, obj64, var_s4); + } + } + if (obj64->unk2E == 3) { + var_t0 = 0; + if (D_8011AE78 > 0) { + var_v0 = obj64->unk3E; + if (var_v0 != (*D_8011AE74)->properties.common.unk4) { + loop_240: + var_t0 += 1; + if (var_t0 < D_8011AE78) { + if (var_v0 != D_8011AE74[var_t0]->properties.common.unk4) { + goto loop_240; + } + } + } + } + if (var_t0 != D_8011AE78) { + otherObj64 = D_8011AE74[var_t0]->animTarget; + if (otherObj64 != NULL) { + sp124 = otherObj64->trans.x_position - arg0->trans.x_position; + sp120 = otherObj64->trans.y_position - arg0->trans.y_position; + sp11C = otherObj64->trans.z_position - arg0->trans.z_position; + var_f0 = sqrtf((sp124 * sp124) + (sp120 * sp120) + (sp11C * sp11C)); + if (var_f0 > 0) { + arg0->trans.rotation.s[0] = arctan2_f(sp124, sp11C) - 0x8000; + arg0->trans.rotation.s[1] = arctan2_f(sp120, var_f0); + } + } + } + } + arg0->particleEmittersEnabled = obj64->unk2F; + obj_spawn_particle(arg0, arg1); return 0; } #else @@ -9781,11 +9382,11 @@ s32 func_800210CC(s8 arg0) { return FALSE; } -void func_80021104(Object *obj, Object_Animation *animObj, LevelObjectEntry_Animation *entry) { +void func_80021104(Object *obj, Object_AnimatedObject *animObj, LevelObjectEntry_Animation *entry) { Camera *camera; ObjectTransform *animObjTrans; - animObjTrans = &animObj->unk1C->segment.trans; + animObjTrans = &animObj->unk1C->trans; if (obj->behaviorId == BHV_CAMERA_ANIMATION) { animObj->unk44 = D_8011AD3E; D_8011AD3E++; @@ -9801,7 +9402,7 @@ void func_80021104(Object *obj, Object_Animation *animObj, LevelObjectEntry_Anim animObjTrans->rotation.z_rotation = camera->trans.rotation.z_rotation; } if ((entry->unk22 >= 10) && (entry->unk22 < 18)) { - ObjectSegment *seg = &(*gRacers)[entry->unk22 - 10]->segment; + Object *seg = (*gRacers)[entry->unk22 - 10]; if (seg != NULL) { animObjTrans->x_position = seg->trans.x_position; animObjTrans->y_position = seg->trans.y_position; @@ -9813,34 +9414,33 @@ void func_80021104(Object *obj, Object_Animation *animObj, LevelObjectEntry_Anim } } -void func_8002125C(Object *charSelectObj, LevelObjectEntry_CharacterSelect *entry, Object_CharacterSelect *charSelect, - UNUSED s32 index) { +void func_8002125C(Object *obj, LevelObjectEntry_Animation *entry, Object_AnimatedObject *animObj, UNUSED s32 index) { s32 initialAnimFrame; - initialAnimFrame = entry->unk12; + initialAnimFrame = entry->objAnimIndex; if (initialAnimFrame >= 0) { - if (initialAnimFrame != charSelectObj->segment.object.animationID) { - charSelectObj->segment.animFrame = entry->unk16; + if (initialAnimFrame != obj->animationID) { + obj->animFrame = entry->unk16; } - charSelectObj->segment.object.animationID = entry->unk12; - charSelect->unk14 = entry->unk17; - charSelect->unk2C = entry->unk18; + obj->animationID = entry->objAnimIndex; + animObj->z = entry->objAnimSpeed; + animObj->unk2C = entry->objAnimLoopType; } if (entry->unk13 >= 0) { - charSelect->unk2F = entry->unk13; + animObj->unk2F = entry->unk13; } - charSelect->unk36 = normalise_time(entry->unk24); - charSelect->unk3F = entry->unk2D; - charSelect->unk3A = entry->unk26; - charSelect->unk39 = entry->unk1F; - charSelect->unk43 = entry->unk30; - charSelect->unk38 = entry->unk1E; - charSelect->unk3B = entry->unk29; - charSelect->unk40 = entry->unk2E; - charSelect->unk41 = entry->unk2F; - charSelect->unk3C = entry->unk2B; - if (entry->unk27 != 255) { - set_current_text(entry->unk27); + animObj->pauseCounter = normalise_time(entry->pauseFrameCount); + animObj->unk3F = entry->unk2D; + animObj->unk3A = entry->specialHide; + animObj->unk39 = entry->unk1F; + animObj->unk43 = entry->unk30; + animObj->soundID = entry->unk1E; + animObj->unk3B = entry->unk29; + animObj->unk40 = entry->soundEffect; + animObj->unk41 = entry->fadeOptions; + animObj->unk3C = entry->fadeAlpha; + if (entry->messageId != 255) { + set_current_text(entry->messageId); } if (entry->unk2A >= 0) { func_8001E45C(entry->unk2A); @@ -9858,12 +9458,12 @@ void func_80021400(s32 arg0) { s32 i; arg0 &= 0xFF; //? - for (i = 0; i < D_8011AE78 && (arg0 != (D_8011AE74[i]->properties.common.unk4 & 0xFF)); i++) {} + for (i = 0; i < D_8011AE78 && (arg0 != (D_8011AE74[i]->properties.animation.behaviourID & 0xFF)); i++) {} if (i < D_8011AE78) { - if (D_8011AE74[i]->unk64 != NULL) { - if (D_8011AE74[i]->unk64->obj80021400_64.obj64->unk2A < 0) { - D_8011AE74[i]->unk64->obj80021400_64.obj64->unk2A = 1; + if (D_8011AE74[i]->animTarget != NULL) { + if (D_8011AE74[i]->animTarget->animatedObject->startDelay < 0) { + D_8011AE74[i]->animTarget->animatedObject->startDelay = 1; } } } @@ -9877,32 +9477,32 @@ s8 func_800214E4(Object *obj, s32 updateRate) { s32 i; Object_AnimatedObject *animObj; - animObj = &obj->unk64->animatedObject; + animObj = obj->animatedObject; if (animObj->unk3A != 0) { - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; } - if (animObj->unk36 == -1) { + if (animObj->pauseCounter == -1) { return animObj->unk3A; } - if (animObj->unk36 >= 0) { - animObj->unk36 -= updateRate; + if (animObj->pauseCounter >= 0) { + animObj->pauseCounter -= updateRate; } - if (animObj->unk36 == -1) { - animObj->unk36 = -2; + if (animObj->pauseCounter == -1) { + animObj->pauseCounter = -2; } - if (animObj->unk36 <= 0) { - obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; - for (i = 0; (i < D_8011AE78 && animObj->unk28 != D_8011AE74[i]->properties.common.unk4); i++) { + if (animObj->pauseCounter <= 0) { + obj->trans.flags |= OBJ_FLAGS_INVISIBLE; + for (i = 0; (i < D_8011AE78 && animObj->unk28 != D_8011AE74[i]->properties.animation.behaviourID); i++) { if (FALSE) {} // FAKEMATCH } - obj_init_animcamera(D_8011AE74[i], obj); + obj_init_animobject(D_8011AE74[i], obj); return 1; } return 0; } s32 func_80021600(s32 arg0) { - Object_Animation *objAnim; + Object_AnimatedObject *objAnim; s32 i; Object *sp154; LevelObjectEntry_Animation *levelObjAnim; @@ -9931,27 +9531,27 @@ s32 func_80021600(s32 arg0) { return TRUE; } - for (i = 0; i < D_8011AE78 && arg0 != D_8011AE74[i]->properties.animatedObj.behaviourID; i++) {} + for (i = 0; i < D_8011AE78 && arg0 != D_8011AE74[i]->properties.animation.behaviourID; i++) {} if (i >= D_8011AE78) { return TRUE; } - for (count = 1; i + count < D_8011AE78 && arg0 == D_8011AE74[i + count]->properties.animatedObj.behaviourID; + for (count = 1; i + count < D_8011AE78 && arg0 == D_8011AE74[i + count]->properties.animation.behaviourID; count++) {} if (count < 2) { return TRUE; } - sp154 = (Object *) &D_8011AE74[i]->unk64->obj; + sp154 = D_8011AE74[i]->animTarget; if (sp154 == NULL) { return TRUE; } - objAnim = &sp154->unk64->animation; + objAnim = sp154->animatedObject; sp138 = -1; - sp90 = 1.0 / D_8011AE74[i]->segment.header->scale; + sp90 = 1.0 / D_8011AE74[i]->header->scale; - levelObjAnim = &D_8011AE74[i + count - 1]->segment.level_entry->animation; + levelObjAnim = &D_8011AE74[i + count - 1]->level_entry->animation; if (count > 2) { if (levelObjAnim->goToNode >= 0 && levelObjAnim->goToNode < count - 1) { sp138 = levelObjAnim->goToNode; @@ -9962,77 +9562,80 @@ s32 func_80021600(s32 arg0) { for (j = 0; j < 5; j++, s0++) { if (s0 == -1) { if (sp138 != 0) { - xPositions[j] = D_8011AE74[i]->segment.trans.x_position + - (D_8011AE74[i]->segment.trans.x_position - D_8011AE74[i + 1]->segment.trans.x_position); - yPositions[j] = D_8011AE74[i]->segment.trans.y_position + - (D_8011AE74[i]->segment.trans.y_position - D_8011AE74[i + 1]->segment.trans.y_position); - zPositions[j] = D_8011AE74[i]->segment.trans.z_position + - (D_8011AE74[i]->segment.trans.z_position - D_8011AE74[i + 1]->segment.trans.z_position); - yRotations[j] = D_8011AE74[i]->segment.trans.rotation.y_rotation; - xRotations[j] = D_8011AE74[i]->segment.trans.rotation.x_rotation; - zRotations[j] = D_8011AE74[i]->segment.trans.rotation.z_rotation; - scales[j] = D_8011AE74[i]->segment.trans.scale; + xPositions[j] = D_8011AE74[i]->trans.x_position + + (D_8011AE74[i]->trans.x_position - D_8011AE74[i + 1]->trans.x_position); + yPositions[j] = D_8011AE74[i]->trans.y_position + + (D_8011AE74[i]->trans.y_position - D_8011AE74[i + 1]->trans.y_position); + zPositions[j] = D_8011AE74[i]->trans.z_position + + (D_8011AE74[i]->trans.z_position - D_8011AE74[i + 1]->trans.z_position); + yRotations[j] = D_8011AE74[i]->trans.rotation.y_rotation; + xRotations[j] = D_8011AE74[i]->trans.rotation.x_rotation; + zRotations[j] = D_8011AE74[i]->trans.rotation.z_rotation; + scales[j] = D_8011AE74[i]->trans.scale; } else { q = i + count - 1; - xPositions[j] = D_8011AE74[q]->segment.trans.x_position; - yPositions[j] = D_8011AE74[q]->segment.trans.y_position; - zPositions[j] = D_8011AE74[q]->segment.trans.z_position; - yRotations[j] = D_8011AE74[q]->segment.trans.rotation.y_rotation; - xRotations[j] = D_8011AE74[q]->segment.trans.rotation.x_rotation; - zRotations[j] = D_8011AE74[q]->segment.trans.rotation.z_rotation; - scales[j] = D_8011AE74[q]->segment.trans.scale; + xPositions[j] = D_8011AE74[q]->trans.x_position; + yPositions[j] = D_8011AE74[q]->trans.y_position; + zPositions[j] = D_8011AE74[q]->trans.z_position; + yRotations[j] = D_8011AE74[q]->trans.rotation.y_rotation; + xRotations[j] = D_8011AE74[q]->trans.rotation.x_rotation; + zRotations[j] = D_8011AE74[q]->trans.rotation.z_rotation; + scales[j] = D_8011AE74[q]->trans.scale; } } else if (s0 >= count) { if (sp138 == -1) { s0 = count - 1; q = s0 + i; - levelObjAnim = &D_8011AE74[q]->segment.level_entry->animation; + levelObjAnim = &D_8011AE74[q]->level_entry->animation; if (levelObjAnim->unk22 == 1) { set_active_camera(objAnim->cameraID); objTransform = &cam_get_active_camera_no_cutscenes()->trans; } else { - objTransform = &D_8011AE74[q]->segment.trans; + objTransform = &D_8011AE74[q]->trans; } - xPositions[j] = (objTransform->x_position - D_8011AE74[q - 1]->segment.trans.x_position) + objTransform->x_position; - yPositions[j] = (objTransform->y_position - D_8011AE74[q - 1]->segment.trans.y_position) + objTransform->y_position; - zPositions[j] = (objTransform->z_position - D_8011AE74[q - 1]->segment.trans.z_position) + objTransform->z_position; + xPositions[j] = + (objTransform->x_position - D_8011AE74[q - 1]->trans.x_position) + objTransform->x_position; + yPositions[j] = + (objTransform->y_position - D_8011AE74[q - 1]->trans.y_position) + objTransform->y_position; + zPositions[j] = + (objTransform->z_position - D_8011AE74[q - 1]->trans.z_position) + objTransform->z_position; xRotations[j] = objTransform->rotation.x_rotation; zRotations[j] = objTransform->rotation.z_rotation; - objTransform = &D_8011AE74[q]->segment.trans; + objTransform = &D_8011AE74[q]->trans; yRotations[j] = objTransform->rotation.y_rotation; - scales[j] = D_8011AE74[q]->segment.trans.scale; + scales[j] = D_8011AE74[q]->trans.scale; } else { q = i + sp138 + s0 - count; - xPositions[j] = D_8011AE74[q]->segment.trans.x_position; - yPositions[j] = D_8011AE74[q]->segment.trans.y_position; - zPositions[j] = D_8011AE74[q]->segment.trans.z_position; - yRotations[j] = D_8011AE74[q]->segment.trans.rotation.y_rotation; - xRotations[j] = D_8011AE74[q]->segment.trans.rotation.x_rotation; - zRotations[j] = D_8011AE74[q]->segment.trans.rotation.z_rotation; - scales[j] = D_8011AE74[q]->segment.trans.scale; + xPositions[j] = D_8011AE74[q]->trans.x_position; + yPositions[j] = D_8011AE74[q]->trans.y_position; + zPositions[j] = D_8011AE74[q]->trans.z_position; + yRotations[j] = D_8011AE74[q]->trans.rotation.y_rotation; + xRotations[j] = D_8011AE74[q]->trans.rotation.x_rotation; + zRotations[j] = D_8011AE74[q]->trans.rotation.z_rotation; + scales[j] = D_8011AE74[q]->trans.scale; } } else { q = s0 + i; if (1) {} // Fake - levelObjAnim = &D_8011AE74[q]->segment.level_entry->animation; + levelObjAnim = &D_8011AE74[q]->level_entry->animation; if (levelObjAnim->unk22 == 1) { set_active_camera(objAnim->cameraID); objTransform = &cam_get_active_camera_no_cutscenes()->trans; } else { - objTransform = &D_8011AE74[q]->segment.trans; + objTransform = &D_8011AE74[q]->trans; } xPositions[j] = objTransform->x_position; yPositions[j] = objTransform->y_position; zPositions[j] = objTransform->z_position; xRotations[j] = objTransform->rotation.x_rotation; zRotations[j] = objTransform->rotation.z_rotation; - objTransform = &D_8011AE74[q]->segment.trans; + objTransform = &D_8011AE74[q]->trans; yRotations[j] = objTransform->rotation.y_rotation; if (levelObjAnim->unk22 == 1) { xRotations[j] = -xRotations[j]; } - scales[j] = D_8011AE74[q]->segment.trans.scale; + scales[j] = D_8011AE74[q]->trans.scale; } } @@ -10047,12 +9650,12 @@ s32 func_80021600(s32 arg0) { spF0 = lerp(zPositions, 0, spEC); } - spF8 -= sp154->segment.trans.x_position; - spF4 -= sp154->segment.trans.y_position; - spF0 -= sp154->segment.trans.z_position; + spF8 -= sp154->trans.x_position; + spF4 -= sp154->trans.y_position; + spF0 -= sp154->trans.z_position; move_object(sp154, spF8, spF4, spF0); - sp154->segment.trans.scale = catmull_rom_interpolation(scales, 0, spEC) * sp90 * sp154->segment.header->scale; + sp154->trans.scale = catmull_rom_interpolation(scales, 0, spEC) * sp90 * sp154->header->scale; switch (objAnim->unk2E) { case 1: @@ -10079,22 +9682,22 @@ s32 func_80021600(s32 arg0) { spF0 *= delta; } - sp154->segment.trans.rotation.y_rotation = arctan2_f(spF8, spF0) - 0x8000; - sp154->segment.trans.rotation.x_rotation = arctan2_f(spF4, 100.0f); + sp154->trans.rotation.y_rotation = arctan2_f(spF8, spF0) - 0x8000; + sp154->trans.rotation.x_rotation = arctan2_f(spF4, 100.0f); break; case 3: - for (j = 0; j < D_8011AE78 && objAnim->unk3E != D_8011AE74[j]->properties.animatedObj.behaviourID; j++) {} + for (j = 0; j < D_8011AE78 && objAnim->unk3E != D_8011AE74[j]->properties.animation.behaviourID; j++) {} if (j != D_8011AE78) { - objTransform = &((Object *) &D_8011AE74[j]->unk64->obj)->segment.trans; + objTransform = &D_8011AE74[j]->animTarget->trans; if (objTransform != NULL) { - spF8 = objTransform->x_position - sp154->segment.trans.x_position; - spF4 = objTransform->y_position - sp154->segment.trans.y_position; - spF0 = objTransform->z_position - sp154->segment.trans.z_position; + spF8 = objTransform->x_position - sp154->trans.x_position; + spF4 = objTransform->y_position - sp154->trans.y_position; + spF0 = objTransform->z_position - sp154->trans.z_position; spEC = sqrtf(spF8 * spF8 + spF4 * spF4 + spF0 * spF0); if (spEC > 0.0f) { - sp154->segment.trans.rotation.y_rotation = arctan2_f(spF8, spF0) - 0x8000; - sp154->segment.trans.rotation.x_rotation = arctan2_f(spF4, spEC); + sp154->trans.rotation.y_rotation = arctan2_f(spF8, spF0) - 0x8000; + sp154->trans.rotation.x_rotation = arctan2_f(spF4, spEC); } } } @@ -10109,9 +9712,9 @@ s32 func_80021600(s32 arg0) { f0 += 65536.0; } - // clang-formatter off + // clang-format off for (s0 = j; s0 < 5; s0++) { yRotations[s0] += f0; } - // clang-formatter on + // clang-format on f0 = 0.0f; delta = xRotations[j] - xRotations[j - 1]; @@ -10121,9 +9724,9 @@ s32 func_80021600(s32 arg0) { f0 += 65536.0; } - // clang-formatter off + // clang-format off for (s0 = j; s0 < 5; s0++) { xRotations[s0] += f0; } - // clang-formatter on + // clang-format on f0 = 0.0f; delta = zRotations[j] - zRotations[j - 1]; @@ -10133,19 +9736,19 @@ s32 func_80021600(s32 arg0) { f0 += 65536.0; } - // clang-formatter off + // clang-format off for (s0 = j; s0 < 5; s0++) { zRotations[s0] += f0; } - // clang-formatter on + // clang-format on } if (objAnim->unk3F == 0) { - sp154->segment.trans.rotation.y_rotation = catmull_rom_interpolation(yRotations, 0, spEC); - sp154->segment.trans.rotation.x_rotation = catmull_rom_interpolation(xRotations, 0, spEC); - sp154->segment.trans.rotation.z_rotation = catmull_rom_interpolation(zRotations, 0, spEC); + sp154->trans.rotation.y_rotation = catmull_rom_interpolation(yRotations, 0, spEC); + sp154->trans.rotation.x_rotation = catmull_rom_interpolation(xRotations, 0, spEC); + sp154->trans.rotation.z_rotation = catmull_rom_interpolation(zRotations, 0, spEC); } else { - sp154->segment.trans.rotation.y_rotation = lerp(yRotations, 0, spEC); - sp154->segment.trans.rotation.x_rotation = lerp(xRotations, 0, spEC); - sp154->segment.trans.rotation.z_rotation = lerp(zRotations, 0, spEC); + sp154->trans.rotation.y_rotation = lerp(yRotations, 0, spEC); + sp154->trans.rotation.x_rotation = lerp(xRotations, 0, spEC); + sp154->trans.rotation.z_rotation = lerp(zRotations, 0, spEC); } break; } @@ -10229,7 +9832,7 @@ void init_racer_for_challenge(s32 vehicleID) { Object_Racer *racer; gTajRaceInit = 3; - racer = &get_racer_object(PLAYER_ONE)->unk64->racer; + racer = get_racer_object(PLAYER_ONE)->racer; racer->courseCheckpoint = 0; racer->checkpoint = 0; racer->lap = 0; @@ -10263,7 +9866,7 @@ void mode_init_taj_race(void) { levelHeader->music = SEQUENCE_TAJS_RACES; levelHeader->instruments = 0xFFFF; racerObj = get_racer_object(PLAYER_ONE); - racer = &racerObj->unk64->racer; + racer = racerObj->racer; gIsTajChallenge = racer->vehicleID + 1; checkpointNode = func_800230D0(racerObj, racer); racer->cameraYaw = 0x8000 - racer->steerVisualRotation; @@ -10304,9 +9907,9 @@ void mode_init_taj_race(void) { (*gRacers)[1] = racerObj; gRacersByPosition[1] = racerObj; gRacersByPort[1] = racerObj; - racerObj->segment.level_entry = NULL; + racerObj->level_entry = NULL; gNumRacers = 2; - racer = &racerObj->unk64->racer; + racer = racerObj->racer; i = 0; // Fakematch racer->vehicleID = VEHICLE_CARPET; racer->vehicleIDPrev = racer->vehicleID; @@ -10319,8 +9922,7 @@ void mode_init_taj_race(void) { racerObj->interactObj->pushForce = 2; for (j = gObjectListStart; j < gObjectCount; j++) { - if (!(gObjPtrList[j]->segment.trans.flags & OBJ_FLAGS_PARTICLE) && - gObjPtrList[j]->behaviorId == BHV_PARK_WARDEN) { + if (!(gObjPtrList[j]->trans.flags & OBJ_FLAGS_PARTICLE) && gObjPtrList[j]->behaviorId == BHV_PARK_WARDEN) { racer->unk154 = gObjPtrList[j]; } } @@ -10340,16 +9942,15 @@ void obj_taj_create_balloon(s32 blockID, f32 x, f32 y, f32 z) { for (i = 0; i < gObjectCount; i++) { obj = gObjPtrList[i]; - if (obj->behaviorId == BHV_GOLDEN_BALLOON && obj->segment.level_entry != NULL && - obj->segment.level_entry->goldenBalloon.challengeID > 0) { - if (settings->tajFlags && - settings->tajFlags & (1 << (obj->segment.level_entry->goldenBalloon.challengeID + 2))) { - obj->segment.trans.x_position = x; - obj->segment.trans.y_position = y + 10.0; - obj->segment.trans.z_position = z; - obj->segment.object.segmentID = blockID; + if (obj->behaviorId == BHV_GOLDEN_BALLOON && obj->level_entry != NULL && + obj->level_entry->goldenBalloon.challengeID > 0) { + if (settings->tajFlags && settings->tajFlags & (1 << (obj->level_entry->goldenBalloon.challengeID + 2))) { + obj->trans.x_position = x; + obj->trans.y_position = y + 10.0; + obj->trans.z_position = z; + obj->segmentID = blockID; obj->properties.common.unk0 = 0; - obj->segment.object.opacity = 0; + obj->opacity = 0; } } } @@ -10377,7 +9978,7 @@ void mode_end_taj_race(s32 reason) { // Only works with do {} while? i = 0; do { - racer = &(*gRacers)[i]->unk64->racer; + racer = (*gRacers)[i]->racer; if (!racer) {} racer->raceFinished = 0; racer->lap = 0; @@ -10389,12 +9990,11 @@ void mode_end_taj_race(s32 reason) { gRacersByPosition[0] = (*gRacers)[0]; gNumRacers = 1; for (i = gObjectListStart; i < gObjectCount; i++) { - if (!(gObjPtrList[i]->segment.trans.flags & OBJ_FLAGS_PARTICLE) && - gObjPtrList[i]->behaviorId == BHV_PARK_WARDEN) { + if (!(gObjPtrList[i]->trans.flags & OBJ_FLAGS_PARTICLE) && gObjPtrList[i]->behaviorId == BHV_PARK_WARDEN) { obj = gObjPtrList[i]; } } - racer = &(*gRacers)[0]->unk64->racer; + racer = (*gRacers)[0]->racer; if (racer->challengeMarker != NULL) { free_object(racer->challengeMarker); racer->challengeMarker = NULL; @@ -10446,69 +10046,68 @@ CheckpointNode *func_800230D0(Object *obj, Object_Racer *racer) { lastCheckpointNode = NULL; for (i = 0; i < gObjectCount; i++) { ptrList = gObjPtrList[i]; - if (!(ptrList->segment.trans.flags & OBJ_FLAGS_PARTICLE) && (ptrList->behaviorId == BHV_SETUP_POINT)) { + if (!(ptrList->trans.flags & OBJ_FLAGS_PARTICLE) && (ptrList->behaviorId == BHV_SETUP_POINT)) { if (ptrList->properties.setupPoint.racerIndex == 0) { - obj->segment.trans.x_position = ptrList->segment.trans.x_position; - obj->segment.trans.y_position = ptrList->segment.trans.y_position; - obj->segment.trans.z_position = ptrList->segment.trans.z_position; - obj->segment.object.segmentID = ptrList->segment.object.segmentID; + obj->trans.x_position = ptrList->trans.x_position; + obj->trans.y_position = ptrList->trans.y_position; + obj->trans.z_position = ptrList->trans.z_position; + obj->segmentID = ptrList->segmentID; i = gObjectCount; } } } } else { lastCheckpointNode = &gTrackCheckpoints[gNumberOfCheckpoints - 1]; - obj->segment.trans.x_position = lastCheckpointNode->x - (lastCheckpointNode->rotationZFrac * 35.0f); - obj->segment.trans.y_position = lastCheckpointNode->y; - obj->segment.trans.z_position = lastCheckpointNode->z + (lastCheckpointNode->rotationXFrac * 35.0f); - 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); + obj->trans.x_position = lastCheckpointNode->x - (lastCheckpointNode->rotationZFrac * 35.0f); + obj->trans.y_position = lastCheckpointNode->y; + obj->trans.z_position = lastCheckpointNode->z + (lastCheckpointNode->rotationXFrac * 35.0f); + obj->segmentID = + get_level_segment_index_from_position(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position); } - yOutCount = func_8002BAB0(obj->segment.object.segmentID, obj->segment.trans.x_position, - obj->segment.trans.z_position, yOut); + yOutCount = func_8002BAB0(obj->segmentID, obj->trans.x_position, obj->trans.z_position, yOut); if (yOutCount != 0) { - obj->segment.trans.y_position = yOut[yOutCount - 1]; + obj->trans.y_position = yOut[yOutCount - 1]; } - racer->prev_x_position = obj->segment.trans.x_position; - racer->prev_y_position = obj->segment.trans.y_position; - racer->prev_z_position = obj->segment.trans.z_position; + racer->prev_x_position = obj->trans.x_position; + racer->prev_y_position = obj->trans.y_position; + racer->prev_z_position = obj->trans.z_position; if (lastCheckpointNode != NULL) { racer->steerVisualRotation = arctan2_f(lastCheckpointNode->rotationXFrac, lastCheckpointNode->rotationZFrac); } else { - racer->steerVisualRotation = ptrList->segment.trans.rotation.y_rotation; + racer->steerVisualRotation = ptrList->trans.rotation.y_rotation; } racer->checkpoint = 0; racer->courseCheckpoint = racer->lap * gNumberOfCheckpoints; - obj->segment.trans.rotation.y_rotation = racer->steerVisualRotation; - racer->unkD8.x = obj->segment.trans.x_position; - racer->unkD8.y = obj->segment.trans.y_position + 15.0f; - racer->unkD8.z = obj->segment.trans.z_position; - racer->unkE4.x = obj->segment.trans.x_position; - racer->unkE4.y = obj->segment.trans.y_position + 15.0f; - racer->unkE4.z = obj->segment.trans.z_position; - racer->unkF0.x = obj->segment.trans.x_position; - racer->unkF0.y = obj->segment.trans.y_position + 15.0f; - racer->unkF0.z = obj->segment.trans.z_position; - racer->unkFC.x = obj->segment.trans.x_position; - racer->unkFC.y = obj->segment.trans.y_position + 15.0f; - racer->unkFC.z = obj->segment.trans.z_position; - obj->interactObj->x_position = obj->segment.trans.x_position; - obj->interactObj->y_position = obj->segment.trans.y_position; - obj->interactObj->z_position = obj->segment.trans.z_position; + obj->trans.rotation.y_rotation = racer->steerVisualRotation; + racer->unkD8.x = obj->trans.x_position; + racer->unkD8.y = obj->trans.y_position + 15.0f; + racer->unkD8.z = obj->trans.z_position; + racer->unkE4.x = obj->trans.x_position; + racer->unkE4.y = obj->trans.y_position + 15.0f; + racer->unkE4.z = obj->trans.z_position; + racer->unkF0.x = obj->trans.x_position; + racer->unkF0.y = obj->trans.y_position + 15.0f; + racer->unkF0.z = obj->trans.z_position; + racer->unkFC.x = obj->trans.x_position; + racer->unkFC.y = obj->trans.y_position + 15.0f; + racer->unkFC.z = obj->trans.z_position; + obj->interactObj->x_position = obj->trans.x_position; + obj->interactObj->y_position = obj->trans.y_position; + obj->interactObj->z_position = obj->trans.z_position; // fake if (1) {} if (1) {} racer->velocity = 0.0f; racer->lateral_velocity = 0.0f; - obj->segment.x_velocity = 0.0f; - obj->segment.z_velocity = 0.0f; + obj->x_velocity = 0.0f; + obj->z_velocity = 0.0f; racer->vehicleID = racer->vehicleIDPrev; if (racer->playerIndex != -1) { set_active_camera(racer->playerIndex); activeCameraSegment = cam_get_active_camera_no_cutscenes(); - activeCameraSegment->trans.x_position = obj->segment.trans.x_position; - activeCameraSegment->trans.y_position = obj->segment.trans.y_position; - activeCameraSegment->trans.z_position = obj->segment.trans.z_position; + activeCameraSegment->trans.x_position = obj->trans.x_position; + activeCameraSegment->trans.y_position = obj->trans.y_position; + activeCameraSegment->trans.z_position = obj->trans.z_position; } return lastCheckpointNode; } @@ -10538,9 +10137,9 @@ Object *find_furthest_telepoint(f32 x, f32 z) { if (gObjectCount > 0) { do { tempObj = gObjPtrList[i]; - if (!(tempObj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && tempObj->behaviorId == BHV_TAJ_TELEPOINT) { - diffX = tempObj->segment.trans.x_position - x; - diffZ = tempObj->segment.trans.z_position - z; + if (!(tempObj->trans.flags & OBJ_FLAGS_PARTICLE) && tempObj->behaviorId == BHV_TAJ_TELEPOINT) { + diffX = tempObj->trans.x_position - x; + diffZ = tempObj->trans.z_position - z; tempObj = gObjPtrList[i]; // fakematch distance = sqrtf((diffX * diffX) + (diffZ * diffZ)); if (bestDist < distance) { @@ -10580,13 +10179,13 @@ void obj_door_open(s32 setting) { /** * Return the size of the object property struct intended to be used with the object. */ -s32 get_object_property_size(Object *obj, Object_64 *obj64) { +s32 get_object_property_size(Object *obj, void *obj64) { s32 temp_v0; s32 ret = 0; - obj->unk64 = obj64; + obj->anyBehaviorData = obj64; - switch (obj->segment.header->behaviorId) { + switch (obj->header->behaviorId) { case BHV_RACER: ret = sizeof(Object_Racer); break; @@ -10682,37 +10281,37 @@ s32 get_object_property_size(Object *obj, Object_64 *obj64) { ret = sizeof(Object_MidiFadePoint); break; case BHV_MIDI_CHANNEL_SET: - ret = 0x4; + ret = sizeof(Object_MidiChannelSet); break; case BHV_BUTTERFLY: temp_v0 = 0x10 - ((s32) obj64 & 0xF); - obj->unk64 = (Object_64 *) &obj64->butterfly.triangles[0].verticesArray[temp_v0]; + obj->butterfly = (Object_Butterfly *) ((s32) obj64 + temp_v0); ret = (temp_v0 + sizeof(Object_Butterfly)); break; case BHV_FISH: temp_v0 = 0x10 - ((s32) obj64 & 0xF); - obj->unk64 = (Object_64 *) &obj64->fish.triangles[0].verticesArray[temp_v0]; + obj->fish = (Object_Fish *) ((s32) obj64 + temp_v0); ret = (temp_v0 + sizeof(Object_Fish)); break; case BHV_CHARACTER_FLAG: temp_v0 = 0x10 - ((s32) obj64 & 0xF); - obj->unk64 = (Object_64 *) &obj64->character_flag.triangles[0].verticesArray[temp_v0]; - ret = (temp_v0 + sizeof(Object_CharacterFlag)); + obj->characterFlagModel = (CharacterFlagModel *) ((s32) obj64 + temp_v0); + ret = (temp_v0 + sizeof(CharacterFlagModel)); break; case BHV_UNK_5E: ret = 0x60; break; case BHV_TROPHY_CABINET: - ret = sizeof(Object_TrophyCabinet); + ret = sizeof(JingleState); break; case BHV_FROG: ret = sizeof(Object_Frog); break; case BHV_FIREBALL_OCTOWEAPON_2: - ret = sizeof(Object_Fireball_Octoweapon); + ret = sizeof(Object_Weapon); break; default: - obj->unk64 = NULL; + obj->anyBehaviorData = NULL; break; } @@ -10725,7 +10324,7 @@ s32 get_object_property_size(Object *obj, Object_64 *obj64) { * Arg2 is always zero. Effectively unused. */ void run_object_init_func(Object *obj, void *entry, s32 param) { - obj->behaviorId = obj->segment.header->behaviorId; + obj->behaviorId = obj->header->behaviorId; switch (obj->behaviorId) { case BHV_RACER: obj_init_racer(obj, (LevelObjectEntry_Racer *) entry); diff --git a/src/objects.h b/src/objects.h index 2858a6f5..24adb431 100644 --- a/src/objects.h +++ b/src/objects.h @@ -8,14 +8,14 @@ #include "camera.h" #include "particles.h" - -#define NEW_OBJECT_ENTRY(entryVar, entryId, entrySize, xPos, yPos, zPos) { \ - entryVar.x = (xPos); \ - entryVar.y = (yPos); \ - entryVar.z = (zPos); \ - entryVar.size = ((((entryId) >> 1) & 0x80) | (entrySize)); \ - entryVar.objectID = (s8)(entryId); \ -} +#define NEW_OBJECT_ENTRY(entryVar, entryId, entrySize, xPos, yPos, zPos) \ + { \ + entryVar.x = (xPos); \ + entryVar.y = (yPos); \ + entryVar.z = (zPos); \ + entryVar.size = ((((entryId) >> 1) & 0x80) | (entrySize)); \ + entryVar.objectID = (s8) (entryId); \ + } #define NODE_NONE 255 @@ -174,27 +174,27 @@ enum ObjectInteractionFlags { enum ObjectSpawnFlags { OBJECT_SPAWN_NONE, - OBJECT_SPAWN_UNK01 = (1 << 0), - OBJECT_SPAWN_UNK02 = (1 << 1), - OBJECT_SPAWN_UNK04 = (1 << 2), - OBJECT_SPAWN_UNK08 = (1 << 3), - OBJECT_SPAWN_UNK10 = (1 << 4) + OBJECT_SPAWN_UNK01 = (1 << 0), + OBJECT_SPAWN_UNK02 = (1 << 1), + OBJECT_SPAWN_UNK04 = (1 << 2), + OBJECT_SPAWN_UNK08 = (1 << 3), + OBJECT_SPAWN_UNK10 = (1 << 4) }; enum ObjectBehaviourFlags { OBJECT_BEHAVIOUR_NONE, - OBJECT_BEHAVIOUR_SHADED = (1 << 0), - OBJECT_BEHAVIOUR_SHADOW = (1 << 1), - OBJECT_BEHAVIOUR_WATER_EFFECT = (1 << 2), - OBJECT_BEHAVIOUR_ANIMATION = (1 << 3), - OBJECT_BEHAVIOUR_INTERACTIVE = (1 << 4), - OBJECT_BEHAVIOUR_UNK20 = (1 << 5) + OBJECT_BEHAVIOUR_SHADED = (1 << 0), + OBJECT_BEHAVIOUR_SHADOW = (1 << 1), + OBJECT_BEHAVIOUR_WATER_EFFECT = (1 << 2), + OBJECT_BEHAVIOUR_ANIMATION = (1 << 3), + OBJECT_BEHAVIOUR_INTERACTIVE = (1 << 4), + OBJECT_BEHAVIOUR_UNK20 = (1 << 5) }; enum ContPakErrors { CONTPAK_ERROR_MISSING = -1, CONTPAK_ERROR_NONE, - CONTPAK_ERROR_UNKNOWN, //Time trial ghost has reached its size limit? + CONTPAK_ERROR_UNKNOWN, // Time trial ghost has reached its size limit? CONTPAK_ERROR_FULL, CONTPAK_ERROR_DAMAGED }; @@ -219,38 +219,25 @@ typedef struct BossRaceVehicles { s8 bossVehicle; } BossRaceVehicles; -typedef struct AssetObjectHeaders { - s32 unk0; - s32 unk4; - s32 unk8; - s32 unkC; - s32 unk10; - s32 unk14; - s32 unk18; - s32 unk1C; - s32 unk20; - s32 unk24; -} AssetObjectHeaders; - /* Size: 0x3C bytes */ typedef struct CheckpointNode { -/* 0x00 */ f32 rotationXFrac; -/* 0x04 */ f32 rotationYFrac; -/* 0x08 */ f32 rotationZFrac; -/* 0x0C */ f32 unkC; -/* 0x10 */ f32 x; -/* 0x14 */ f32 y; -/* 0x18 */ f32 z; -/* 0x1C */ f32 scale; -/* 0x20 */ f32 distance; -/* 0x24 */ f32 unk24; // Appears to be exactly the same as distance? -/* 0x28 */ Object *obj; -/* 0x2C */ s16 unk2C; -/* 0x2E */ s8 unk2E[4]; -/* 0x32 */ s8 unk32[4]; -/* 0x36 */ s8 unk36[4]; // Appear to be flags of some sort? -/* 0x3A */ s8 altRouteID; // -1 if there's none to be found. -/* 0x3B */ u8 unk3B; + /* 0x00 */ f32 rotationXFrac; + /* 0x04 */ f32 rotationYFrac; + /* 0x08 */ f32 rotationZFrac; + /* 0x0C */ f32 unkC; + /* 0x10 */ f32 x; + /* 0x14 */ f32 y; + /* 0x18 */ f32 z; + /* 0x1C */ f32 scale; + /* 0x20 */ f32 distance; + /* 0x24 */ f32 unk24; // Appears to be exactly the same as distance? + /* 0x28 */ Object *obj; + /* 0x2C */ s16 unk2C; + /* 0x2E */ s8 unk2E[4]; + /* 0x32 */ s8 unk32[4]; + /* 0x36 */ s8 unk36[4]; // Appear to be flags of some sort? + /* 0x3A */ s8 altRouteID; // -1 if there's none to be found. + /* 0x3B */ u8 unk3B; } CheckpointNode; /* Size: 0x40 bytes */ @@ -262,25 +249,6 @@ typedef struct unk800179D0 { u32 unk3C; } unk800179D0; -typedef struct struct_8000FC6C { - f32 unk0; - TextureHeader *unk4; - s16 unk8; - s16 unkA; - s16 unkC; - s16 unkE; -} struct_8000FC6C; - -typedef struct struct_8000FC6C_2 { - s32 unk0; - s32 unk4; - f32 unk8; - s32 unkC; - u8 unk10[0x26]; - s16 unk36; - s16 unk38; -} struct_8000FC6C_2; - typedef struct TTGhostTable { u8 mapId; u8 defaultVehicleId; @@ -293,41 +261,12 @@ typedef struct ObjectTransformExt { s16 unk1A; } ObjectTransformExt; -typedef struct unk80022CFC_2 { - u8 pad[0xA]; - s8 unkA; -} unk80022CFC_2; - -typedef struct unk80022CFC_1 { - u8 pad[0xC]; - f32 unkC; - f32 unk10; - f32 unk14; - u8 pad18[0x16]; - s16 unk2E; - u8 pad30[0x9]; - s8 unk39; - u8 pad3A[0x2]; - unk80022CFC_2* unk3C; - s32 pad40[2]; - s16 unk48; - u16 pad4A[0x16]; - s32 unk78; -} unk80022CFC_1; - /* Size: 0x1A bytes */ typedef struct ObjectTransform_800135B8 { ObjectTransform trans; s16 unk18; } ObjectTransform_800135B8; -typedef struct unk8001A7D8_arg0 { - u8 pad0[4]; - s32 *unk4; - u8 pad8[0x41]; - u8 unk49; -} unk8001A7D8_arg0; - typedef struct unk800149C0 { u8 pad0[4]; u8 unk4; @@ -342,21 +281,6 @@ typedef struct RacerFXData { u8 unk3; } RacerFXData; -typedef struct unk80017A18_10 { - f32 unk0; - f32 unk4; - f32 unk8; - f32 unkC; -} unk80017A18_10; - -typedef struct unk80017A18 { - u8 pad0[0xC]; - u16 *unkC; - unk80017A18_10 *unk10; - u8 pad14[0x1E]; - s16 unk32; -} unk80017A18; - extern s32 osCicId; // Used for an Anti-Piracy check in render_3d_model Object *racerfx_get_boost(s32 boostID); @@ -410,7 +334,7 @@ s16 race_finish_timer(void); u32 get_balloon_cutscene_timer(void); s32 timetrial_valid_player_ghost(void); Object *timetrial_player_ghost(void); -s32 timetrial_staff_ghost_check(Object* obj); +s32 timetrial_staff_ghost_check(Object *obj); Object *timetrial_ghost_staff(void); s32 timetrial_staff_unbeaten(void); SIDeviceStatus timetrial_save_player_ghost(s32 controllerIndex); @@ -424,7 +348,7 @@ Object **get_racer_objects(s32 *numRacers); Object **get_racer_objects_by_port(s32 *numRacers); Object **get_racer_objects_by_position(s32 *numRacers); Object *get_racer_object(s32 index); -void debug_render_checkpoint_node(s32 checkpointID, s32 pathID, Gfx** dList, Mtx **mtx, Vertex **vtx); +void debug_render_checkpoint_node(s32 checkpointID, s32 pathID, Gfx **dList, Mtx **mtx, Vertex **vtx); Object *spectate_object(s32 cameraIndex); void ainode_enable(void); void ainode_tail_set(s32 nodeID); @@ -493,17 +417,18 @@ s32 init_object_shading(Object *obj, ShadeProperties *shadeData); ObjectHeader *load_object_header(s32 index); s32 obj_init_attachpoint(Object *); void try_free_object_header(s32 index); -s32 get_object_property_size(Object *obj, Object_64 *obj64); +s32 get_object_property_size(Object *obj, void *obj64); void light_setup_light_sources(Object *obj); s32 init_object_interaction_data(Object *obj, ObjectInteraction *interactObj); s32 obj_init_emitter(Object *obj, ParticleEmitter *emitter); s32 obj_init_property_flags(s32 behaviorId); void tt_ghost_beaten(s32 arg0, s16 *playerId); -void obj_init_animcamera(Object *, Object *); +void obj_init_animobject(Object *, Object *); Object *obj_butterfly_node(f32 x, f32 y, f32 z, f32 maxDistCheck, s32 dontCheckYAxis); -void func_8002125C(Object *charSelectObj, LevelObjectEntry_CharacterSelect *entry, Object_CharacterSelect *charSelect, UNUSED s32 index); -void func_80021104(Object *obj, Object_Animation *animObj, LevelObjectEntry_Animation *entry); -s32 func_8001955C(Object *obj, s32 checkpoint, u8 arg2, s32 arg3, s32 arg4, f32 checkpointDist, f32 *outX, f32 *outY, f32 *outZ); +void func_8002125C(Object *obj, LevelObjectEntry_Animation *entry, Object_AnimatedObject *charSelect, UNUSED s32 index); +void func_80021104(Object *obj, Object_AnimatedObject *animObj, LevelObjectEntry_Animation *entry); +s32 func_8001955C(Object *obj, s32 checkpoint, u8 arg2, s32 arg3, s32 arg4, f32 checkpointDist, f32 *outX, f32 *outY, + f32 *outZ); void func_80016500(Object *obj, Object_Racer *racer); void func_8000C8F8(s32, s32); u8 timetrial_init_staff_ghost(s32 trackId); @@ -530,28 +455,29 @@ unk800179D0 *func_8001790C(u32 *arg0, u32 *arg1); unk800179D0 *func_80017978(s32 arg0, s32 arg1); s8 func_800214E4(Object *obj, s32 updateRate); f32 lerp_and_get_derivative(f32 *data, u32 index, f32 t, f32 *derivative); +void race_check_finish(s32 updateRate); /** * Faster variant of the shading function for objects. * Unlike the fancy option, does not calculate envmaps. -*/ -void obj_shade_fast(ObjectModel *model, Object * obj, f32 intensity); + */ +void obj_shade_fast(ObjectModel *model, Object *obj, f32 intensity); /** * Animation function for objects. Does per-vertex transformation. -*/ + */ s32 obj_animate(Object *obj); -//Non Matching +// Non Matching void calc_dynamic_lighting_for_object_1(Object *, ObjectModel *, s16, Object *, f32, f32); void calc_dynamic_lighting_for_object_2(Object *, ObjectModel *, s16, f32); void decrypt_magic_codes(s32 *data, s32 length); s32 get_first_active_object(s32 *); Object *spawn_object(LevelObjectEntryCommon *entry, s32); -s32 func_8001F460(Object*, s32, Object*); +s32 func_8001F460(Object *, s32, Object *); void func_8000B750(Object *racerObj, s32 racerIndex, s32 vehicleIDPrev, s32 boostType, s32 arg4); -void func_80018CE0(Object* racerObj, f32 xPos, f32 yPos, f32 zPos, s32 updateRate); -s32 func_800185E4(s32 checkpointIndex, Object *obj, f32 objX, f32 objY, f32 objZ, f32 *arg5, u8 *arg6); +void func_80018CE0(Object *racerObj, f32 xPos, f32 yPos, f32 zPos, s32 updateRate); +s32 func_800185E4(s32 checkpointIndex, Object *obj, f32 objX, f32 objY, f32 objZ, f32 *checkpointDistance, u8 *arg6); void obj_tex_animate(Object *, s32); Object *find_furthest_telepoint(f32 x, f32 z); void func_8006017C(ObjectModel *); @@ -562,15 +488,16 @@ void func_8000CC7C(Vehicle, u32, s32); void func_80017E98(void); void spectate_update(void); void func_8001E93C(void); -void race_check_finish(s32 updateRate); -void func_80014090(Object*, s32); -void audspat_update_all(Object**, s32, s32); +void func_80019808(s32 updateRate); +void func_80014090(Object *, s32); +void audspat_update_all(Object **, s32, s32); void func_8001E89C(void); -CheckpointNode *func_800230D0(Object*, Object_Racer*); +CheckpointNode *func_800230D0(Object *, Object_Racer *); void obj_update(s32 updateRate); void func_800159C8(Object *, Object *); void obj_door_number(ObjectModel *, Object *); s16 func_8001CD28(s32 arg0, s32 arg1, s32 arg2, s32 arg3); // NON MATCHING f32 func_8001C6C4(Object_NPC *, Object *, f32, f32, s32); -s32 func_80017A18(ObjectModel *, s32, s32*, f32*, f32*, f32*, f32*, f32*, f32*, f32*, s8 *surface, f32); // NON EQUIVALENT +s32 func_80017A18(ObjectModel *, s32, s32 *, f32 *, f32 *, f32 *, f32 *, f32 *, f32 *, f32 *, s8 *surface, + f32); // NON EQUIVALENT #endif diff --git a/src/particles.c b/src/particles.c index aa49969b..21277c9e 100644 --- a/src/particles.c +++ b/src/particles.c @@ -720,9 +720,9 @@ void obj_enable_emitter(Object *obj, s32 emitterIndex) { emitter->timeFromLastSpawn = 0; if (emitter->flags & PARTICLE_LINE) { - emitter->lineRefPoint.x = obj->segment.trans.x_position; - emitter->lineRefPoint.y = obj->segment.trans.y_position; - emitter->lineRefPoint.z = obj->segment.trans.z_position; + emitter->lineRefPoint.x = obj->trans.x_position; + emitter->lineRefPoint.y = obj->trans.y_position; + emitter->lineRefPoint.z = obj->trans.z_position; } else if (emitter->flags & PARTICLE_POINT) { emitter->point_opacity = gParticlesAssetTable[emitter->descriptorID]->colour.a << 8; @@ -756,7 +756,7 @@ void obj_enable_emitter(Object *obj, s32 emitterIndex) { } emitter->flags &= ~PARTICLE_POINT_EMITTER_DISABLED; emitter->flags |= PARTICLE_EMITTER_ENABLED | PARTICLE_EMITTER_AWAITING_SPAWN; - obj->segment.numActiveEmitters++; + obj->numActiveEmitters++; } /** @@ -768,7 +768,7 @@ void obj_disable_emitter(Object *obj, s32 emitterIndex) { emitter = &obj->particleEmitter[emitterIndex]; emitter->flags &= ~PARTICLE_EMITTER_ENABLED; - obj->segment.numActiveEmitters--; + obj->numActiveEmitters--; } /** @@ -790,12 +790,12 @@ void update_vehicle_particles(Object *racerObj, s32 updateRate) { u32 emittersEnabled; u8 *alphaPtr; - racer = &racerObj->unk64->racer; + racer = racerObj->racer; emittersEnabled = racerObj->particleEmittersEnabled; vehicleId = racer->vehicleID; i = 0; object_do_player_tumble(racerObj); - for (; i < racerObj->segment.header->particleCount; i++) { + for (; i < racerObj->header->particleCount; i++) { if (emittersEnabled & OBJ_EMIT_1) { someBool = TRUE; switch (vehicleId) { @@ -938,7 +938,7 @@ void obj_spawn_particle(Object *obj, s32 updateRate) { u32 bits; bits = obj->particleEmittersEnabled; - for (i = 0; i < obj->segment.header->particleCount; i++) { + for (i = 0; i < obj->header->particleCount; i++) { if (bits & 1) { if (!(obj->particleEmitter[i].flags & PARTICLE_EMITTER_ENABLED)) { obj_enable_emitter(obj, i); @@ -1073,14 +1073,14 @@ void setup_particle_velocity(Particle *particle, Object *obj, ParticleEmitter *e switch (behaviour->flags & (PARTICLE_VELOCITY_RELATIVE_TO_PARENT | PARTICLE_VELOCITY_ABSOLUTE | PARTICLE_VELOCITY_SCALED_FROM_PARENT)) { case PARTICLE_VELOCITY_RELATIVE_TO_PARENT: - particle->velocity.x += obj->segment.x_velocity; - particle->velocity.y += obj->segment.y_velocity; - particle->velocity.z += obj->segment.z_velocity; + particle->velocity.x += obj->x_velocity; + particle->velocity.y += obj->y_velocity; + particle->velocity.z += obj->z_velocity; break; case PARTICLE_VELOCITY_SCALED_FROM_PARENT: - particle->velocity.x *= obj->segment.x_velocity; - particle->velocity.y *= obj->segment.y_velocity; - particle->velocity.z *= obj->segment.z_velocity; + particle->velocity.x *= obj->x_velocity; + particle->velocity.y *= obj->y_velocity; + particle->velocity.z *= obj->z_velocity; break; } @@ -1110,7 +1110,7 @@ void setup_particle_velocity(Particle *particle, Object *obj, ParticleEmitter *e } else { vec3f_rotate_py(&emitter->emissionDirection, &sourceVel); } - vec3f_rotate(&particle->parentObj->segment.trans.rotation, &sourceVel); + vec3f_rotate(&particle->parentObj->trans.rotation, &sourceVel); particle->velocity.x += sourceVel.x; particle->velocity.y += sourceVel.y; @@ -1166,18 +1166,18 @@ void setup_particle_position(Particle *particle, Object *obj, ParticleEmitter *e particle->localPos.z += sourcePos.z; } if (particle->movementType != PARTICLE_MOVEMENT_BASIC_PARENT) { - vec3f_rotate(&obj->segment.trans.rotation, &particle->localPos); + vec3f_rotate(&obj->trans.rotation, &particle->localPos); } particle->trans.x_position = particle->localPos.x; particle->trans.y_position = particle->localPos.y; particle->trans.z_position = particle->localPos.z; if (particle->movementType == PARTICLE_MOVEMENT_BASIC_PARENT) { - vec3f_rotate(&obj->segment.trans.rotation, (Vec3f *) &particle->trans.x_position); + vec3f_rotate(&obj->trans.rotation, (Vec3f *) &particle->trans.x_position); } - particle->trans.x_position += obj->segment.trans.x_position; - particle->trans.y_position += obj->segment.trans.y_position; - particle->trans.z_position += obj->segment.trans.z_position; + particle->trans.x_position += obj->trans.x_position; + particle->trans.y_position += obj->trans.y_position; + particle->trans.z_position += obj->trans.z_position; } /** @@ -1199,7 +1199,7 @@ PointParticle *create_point_particle(Object *obj, ParticleEmitter *emitter) { return particle; } - particle->base.segmentID = obj->segment.object.segmentID; + particle->base.segmentID = obj->segmentID; particle->base.trans.flags = OBJ_FLAGS_PARTICLE; particle->base.movementType = descriptor->movementType; particle->base.descFlags = descriptor->flags; @@ -1249,12 +1249,9 @@ PointParticle *create_point_particle(Object *obj, ParticleEmitter *emitter) { particle->base.trans.rotation.x_rotation = behaviour->rotation.x_rotation; particle->base.trans.rotation.z_rotation = behaviour->rotation.z_rotation; } else { - particle->base.trans.rotation.y_rotation = - obj->segment.trans.rotation.y_rotation + behaviour->rotation.y_rotation; - particle->base.trans.rotation.x_rotation = - obj->segment.trans.rotation.x_rotation + behaviour->rotation.x_rotation; - particle->base.trans.rotation.z_rotation = - obj->segment.trans.rotation.z_rotation + behaviour->rotation.z_rotation; + particle->base.trans.rotation.y_rotation = obj->trans.rotation.y_rotation + behaviour->rotation.y_rotation; + particle->base.trans.rotation.x_rotation = obj->trans.rotation.x_rotation + behaviour->rotation.x_rotation; + particle->base.trans.rotation.z_rotation = obj->trans.rotation.z_rotation + behaviour->rotation.z_rotation; } particle->base.angularVelocity.y_rotation = behaviour->angularVelocity.y_rotation; particle->base.angularVelocity.x_rotation = behaviour->angularVelocity.x_rotation; @@ -1333,7 +1330,7 @@ Particle *create_line_particle(Object *obj, ParticleEmitter *emitter) { if (particle == NULL) { return NULL; } - particle->segmentID = obj->segment.object.segmentID; + particle->segmentID = obj->segmentID; particle->trans.flags = OBJ_FLAGS_PARTICLE; particle->movementType = descriptor->movementType; particle->descFlags = descriptor->flags; @@ -1380,10 +1377,10 @@ Particle *create_line_particle(Object *obj, ParticleEmitter *emitter) { emitter->lineRefPoint.x = emitter->position.x; emitter->lineRefPoint.y = emitter->position.y; emitter->lineRefPoint.z = emitter->position.z; - vec3f_rotate(&obj->segment.trans.rotation, &emitter->lineRefPoint); - emitter->lineRefPoint.x += obj->segment.trans.x_position; - emitter->lineRefPoint.y += obj->segment.trans.y_position; - emitter->lineRefPoint.z += obj->segment.trans.z_position; + vec3f_rotate(&obj->trans.rotation, &emitter->lineRefPoint); + emitter->lineRefPoint.x += obj->trans.x_position; + emitter->lineRefPoint.y += obj->trans.y_position; + emitter->lineRefPoint.z += obj->trans.z_position; particle->lineCreationPhase = 0; particle->lineOrientation = 0; @@ -1433,9 +1430,9 @@ Particle *create_line_particle(Object *obj, ParticleEmitter *emitter) { } particle->lineOrientation = descriptor->lineOrientation; particle->line_unused_6B = descriptor->line_unused_B; - particle->trans.x_position = obj->segment.trans.x_position; - particle->trans.y_position = obj->segment.trans.y_position; - particle->trans.z_position = obj->segment.trans.z_position; + particle->trans.x_position = obj->trans.x_position; + particle->trans.y_position = obj->trans.y_position; + particle->trans.z_position = obj->trans.z_position; emitter->line_unused = 0; return particle; } @@ -1465,7 +1462,7 @@ Particle *create_general_particle(Object *obj, ParticleEmitter *emitter) { if (particle == NULL) { return particle; } - particle->segmentID = obj->segment.object.segmentID; + particle->segmentID = obj->segmentID; particle->trans.flags = OBJ_FLAGS_PARTICLE; particle->movementType = descriptor->movementType; particle->descFlags = descriptor->flags; @@ -1487,9 +1484,8 @@ Particle *create_general_particle(Object *obj, ParticleEmitter *emitter) { scale += (f32) rand_range(-behaviour->scaleVelocityRange, behaviour->scaleVelocityRange) * 0.00001525878906; } if (behaviour->flags & PARTICLE_SCALE_VELOCITY_INHERITS_PARENT_SPEED) { - particle->scaleVelocity = 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)) * + particle->scaleVelocity = sqrtf((obj->x_velocity * obj->x_velocity) + (obj->y_velocity * obj->y_velocity) + + (obj->z_velocity * obj->z_velocity)) * scale * 0.1f; } else { particle->scaleVelocity = descriptor->scale * scale; @@ -1627,9 +1623,9 @@ Particle *create_general_particle(Object *obj, ParticleEmitter *emitter) { particle->trans.rotation.x_rotation = behaviour->rotation.x_rotation; particle->trans.rotation.z_rotation = behaviour->rotation.z_rotation; } else { - particle->trans.rotation.y_rotation = obj->segment.trans.rotation.y_rotation + behaviour->rotation.y_rotation; - particle->trans.rotation.x_rotation = obj->segment.trans.rotation.x_rotation + behaviour->rotation.x_rotation; - particle->trans.rotation.z_rotation = obj->segment.trans.rotation.z_rotation + behaviour->rotation.z_rotation; + particle->trans.rotation.y_rotation = obj->trans.rotation.y_rotation + behaviour->rotation.y_rotation; + particle->trans.rotation.x_rotation = obj->trans.rotation.x_rotation + behaviour->rotation.x_rotation; + particle->trans.rotation.z_rotation = obj->trans.rotation.z_rotation + behaviour->rotation.z_rotation; } randomizationFlags = behaviour->randomizationFlags & (PARTICLE_RANDOM_ROLL | PARTICLE_RANDOM_PITCH | PARTICLE_RANDOM_YAW); @@ -2029,9 +2025,8 @@ void update_line_particle(Particle *particle) { if (particle->lineCreationPhase < 2 && obj != NULL) { if (emitter->behaviour->flags & PARTICLE_SCALE_VELOCITY_INHERITS_PARENT_SPEED) { - scale = 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)); + scale = sqrtf((obj->x_velocity * obj->x_velocity) + (obj->y_velocity * obj->y_velocity) + + (obj->z_velocity * obj->z_velocity)); scale = scale * particle->trans.scale * 0.1f; } else { scale = particle->trans.scale; @@ -2051,11 +2046,11 @@ void update_line_particle(Particle *particle) { vtxOffset.y = scale; break; } - vec3f_rotate(&obj->segment.trans.rotation, &vtxOffset); + vec3f_rotate(&obj->trans.rotation, &vtxOffset); } else { - vtxOffset.x = obj->segment.x_velocity; - vtxOffset.y = obj->segment.y_velocity; - vtxOffset.z = obj->segment.z_velocity; + vtxOffset.x = obj->x_velocity; + vtxOffset.y = obj->y_velocity; + vtxOffset.z = obj->z_velocity; tempf = ((vtxOffset.x * vtxOffset.x) + (vtxOffset.y * vtxOffset.y)) + (vtxOffset.z * vtxOffset.f[2]); if (tempf < 0.01f) { tempf = 1.0f; @@ -2245,9 +2240,9 @@ void move_particle_basic_parent(Particle *particle) { particle->trans.z_position = particle->localPos.z; parent = particle->parentObj; if (parent) { - particle->trans.x_position += parent->segment.trans.x_position; - particle->trans.y_position += parent->segment.trans.y_position; - particle->trans.z_position += parent->segment.trans.z_position; + particle->trans.x_position += parent->trans.x_position; + particle->trans.y_position += parent->trans.y_position; + particle->trans.z_position += parent->trans.z_position; } } @@ -2277,9 +2272,9 @@ void move_particle_attached_to_parent(Particle *particle) { parent = particle->parentObj; if (parent != NULL) { - particle->trans.x_position += parent->segment.trans.x_position; - particle->trans.y_position += parent->segment.trans.y_position; - particle->trans.z_position += parent->segment.trans.z_position; + particle->trans.x_position += parent->trans.x_position; + particle->trans.y_position += parent->trans.y_position; + particle->trans.z_position += parent->trans.z_position; } } diff --git a/src/racer.c b/src/racer.c index 031fd22a..41a392f6 100644 --- a/src/racer.c +++ b/src/racer.c @@ -231,7 +231,7 @@ void func_80042D20(Object *obj, Object_Racer *racer, s32 updateRate) { var_t0 = 0; var_t4 = PLAYER_COMPUTER; for (someFlag = TRUE; index < numRacers; index++) { - sp5C = &racerGroup[index]->unk64->racer; + sp5C = racerGroup[index]->racer; if (sp5C == racer) { someFlag = FALSE; racerID = index; @@ -259,27 +259,25 @@ void func_80042D20(Object *obj, Object_Racer *racer, s32 updateRate) { if (gRaceStartTimer == 0 && racer->vehicleID != VEHICLE_LOOPDELOOP) { index = racerID - 1; if (racer->unk20B < racerID && index >= 0 && index < numRacers) { - sp5C = &racerGroup[index]->unk64->racer; + sp5C = racerGroup[index]->racer; if (sp5C->playerIndex != PLAYER_COMPUTER) { if (temp_v0 == 0) { play_random_character_voice(obj, SOUND_VOICE_CHARACTER_NEGATIVE, 8, 3); } else { - racer_boss_sound_spatial(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, 5); + racer_boss_sound_spatial(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, 5); } play_random_character_voice(racerGroup[index], SOUND_VOICE_CHARACTER_POSITIVE, 8, 2); } } tempRacerIndex = racerID + 1; if (racerID < racer->unk20B && tempRacerIndex >= 0 && tempRacerIndex < numRacers) { - sp5C = &racerGroup[tempRacerIndex]->unk64->racer; + sp5C = racerGroup[tempRacerIndex]->racer; if (sp5C->playerIndex != PLAYER_COMPUTER) { play_random_character_voice(racerGroup[(racerID + 1)], SOUND_VOICE_KRUNCH_NEGATIVE1, 8, 2); if (temp_v0 == 0) { play_random_character_voice(obj, SOUND_VOICE_CHARACTER_POSITIVE, 8, 3); } else { - racer_boss_sound_spatial(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, 3); + racer_boss_sound_spatial(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, 3); } } } @@ -290,12 +288,12 @@ void func_80042D20(Object *obj, Object_Racer *racer, s32 updateRate) { sp5C = NULL; obj = func_8001B7A8(racer, 1, &sp94); if (obj != NULL) { - sp5C = &obj->unk64->racer; + sp5C = obj->racer; } sp58 = NULL; obj = func_8001B7A8(racer, -1, &sp90); if (obj != NULL) { - sp58 = &obj->unk64->racer; + sp58 = obj->racer; } racerCharacterId = racer->characterId; if (sp5C != NULL) { @@ -677,7 +675,7 @@ s32 roll_percent_chance(s32 chance) { // Handles the opponent A.I. for battle & banana challenges. void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRate) { Object *sp74; - Object_64 *tempRacer; + Object_Racer *tempRacer; LevelObjectEntry *sp6C; LevelObjectEntry *newvar; f32 xDiff; @@ -711,8 +709,8 @@ void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRat raceType = levelHeader->race_type; sp38 = levelHeader->unk2A; if (aiRacer->unk1CD == 0) { - temp = ainode_find_nearest(aiRacerObj->segment.trans.x_position, aiRacerObj->segment.trans.y_position, - aiRacerObj->segment.trans.z_position, 0); + temp = ainode_find_nearest(aiRacerObj->trans.x_position, aiRacerObj->trans.y_position, + aiRacerObj->trans.z_position, 0); if (temp != 0xFF) { aiRacer->unk154 = ainode_get(temp); aiRacer->unk1CD = 1; @@ -721,9 +719,9 @@ void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRat } sp74 = aiRacer->unk154; if (sp74 != NULL) { - sp6C = sp74->segment.level_entry; - xDiff = sp74->segment.trans.x_position - aiRacerObj->segment.trans.x_position; - zDiff = sp74->segment.trans.z_position - aiRacerObj->segment.trans.z_position; + sp6C = sp74->level_entry; + xDiff = sp74->trans.x_position - aiRacerObj->trans.x_position; + zDiff = sp74->trans.z_position - aiRacerObj->trans.z_position; dist = sqrtf((xDiff * xDiff) + (zDiff * zDiff)); if (dist > 0.0) { temp = ((arctan2_f(xDiff, zDiff)) - 0x8000) & 0xFFFF; @@ -747,7 +745,7 @@ void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRat aiRacer->unk1C6 = 0; } } - aiRacer->elevation = obj_elevation(aiRacerObj->segment.trans.y_position); + aiRacer->elevation = obj_elevation(aiRacerObj->trans.y_position); switch (aiRacer->unk1CD) { case 1: rand_range(0, 9); @@ -789,15 +787,15 @@ void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRat } if ((D_8011D58C[index] == 0) && (index != aiRacer->racerIndex)) { tempRacerObj = get_racer_object(index); - tempRacer = tempRacerObj->unk64; + tempRacer = tempRacerObj->racer; if (sp46 == 0) { - if (sp48 < tempRacer->racer.bananas) { - sp48 = tempRacer->racer.bananas; + if (sp48 < tempRacer->bananas) { + sp48 = tempRacer->bananas; sp4A = index; } } else { - if ((tempRacer->racer.bananas > 0) && (tempRacer->racer.bananas < sp48)) { - sp48 = tempRacer->racer.bananas; + if ((tempRacer->bananas > 0) && (tempRacer->bananas < sp48)) { + sp48 = tempRacer->bananas; sp4A = index; } } @@ -806,8 +804,8 @@ void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRat if (roll_percent_chance(sp38[2]) != 0) { if (cam_get_viewport_layout() == 0) { tempRacerObj = get_racer_object(index); - tempRacer = tempRacerObj->unk64; - if (tempRacer->racer.bananas > 0) { + tempRacer = tempRacerObj->racer; + if (tempRacer->bananas > 0) { sp4A = 0; } } @@ -864,7 +862,7 @@ void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRat sp4E = aiRacer->elevation; tempRacerObj = ainode_get(aiRacer->unk1CE); // I'm assuming this is a Ai Node (Take with a grain of salt!) - newvar = tempRacerObj->segment.level_entry; + newvar = tempRacerObj->level_entry; sp46 = FALSE; if (sp6C->aiNode.elevation < newvar->aiNode.elevation) { if (1) {} // FAKE @@ -898,8 +896,8 @@ void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRat tempRacerObj = aiRacer->nodeCurrent; if (tempRacerObj != NULL) { - xDiff = tempRacerObj->segment.trans.x_position - sp74->segment.trans.x_position; - zDiff = tempRacerObj->segment.trans.z_position - sp74->segment.trans.z_position; + xDiff = tempRacerObj->trans.x_position - sp74->trans.x_position; + zDiff = tempRacerObj->trans.z_position - sp74->trans.z_position; if (sqrtf((xDiff * xDiff) + (zDiff * zDiff)) > 0.0) { temp = (arctan2_f(xDiff, zDiff) - 0x8000) & 0xFFFF; var_v1 = temp - (aiRacer->steerVisualRotation & 0xFFFF); @@ -926,16 +924,16 @@ void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRat break; case 4: tempRacerObj = get_racer_object(aiRacer->eggHudCounter); - tempRacer = tempRacerObj->unk64; - if (tempRacer->racer.playerIndex == -1) { - tempRacerObj = tempRacer->racer.unk154; - newvar = tempRacerObj->segment.level_entry; + tempRacer = tempRacerObj->racer; + if (tempRacer->playerIndex == -1) { + tempRacerObj = tempRacer->unk154; + newvar = tempRacerObj->level_entry; temp = func_8001CD28(sp6C->animation.x_rotation, newvar->animation.x_rotation | 0x100, aiRacer->unk1CE, aiRacer->racerIndex); } else { - temp = ainode_find_nearest(tempRacerObj->segment.trans.x_position, - tempRacerObj->segment.trans.y_position, - tempRacerObj->segment.trans.z_position, 0); + temp = + ainode_find_nearest(tempRacerObj->trans.x_position, tempRacerObj->trans.y_position, + tempRacerObj->trans.z_position, 0); temp = func_8001CD28(sp6C->animation.x_rotation, temp | 0x100, aiRacer->unk1CE, aiRacer->racerIndex); } @@ -973,8 +971,8 @@ void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRat } break; case 6: - temp = ainode_find_nearest(aiRacerObj->segment.trans.x_position, aiRacerObj->segment.trans.y_position, - aiRacerObj->segment.trans.z_position, 2); + temp = ainode_find_nearest(aiRacerObj->trans.x_position, aiRacerObj->trans.y_position, + aiRacerObj->trans.z_position, 2); if (temp != 0xFF) { aiRacer->unk154 = ainode_get(temp); aiRacer->unk1CD = 1; @@ -986,16 +984,16 @@ void racer_ai_challenge(Object *aiRacerObj, Object_Racer *aiRacer, s32 updateRat for (i = 0; i < 4; i++) { if (i != aiRacer->racerIndex) { tempRacerObj = get_racer_object(i); - tempRacer = tempRacerObj->unk64; - if (tempRacer->racer.playerIndex != -1) { - D_8011D5B4[i] = tempRacer->racer.elevation; + tempRacer = tempRacerObj->racer; + if (tempRacer->playerIndex != -1) { + D_8011D5B4[i] = tempRacer->elevation; } if (D_8011D5B4[aiRacer->racerIndex] == D_8011D5B4[i]) { - xDiff = aiRacerObj->segment.trans.x_position - tempRacerObj->segment.trans.x_position; - zDiff = aiRacerObj->segment.trans.z_position - tempRacerObj->segment.trans.z_position; + xDiff = aiRacerObj->trans.x_position - tempRacerObj->trans.x_position; + zDiff = aiRacerObj->trans.z_position - tempRacerObj->trans.z_position; if (sqrtf((xDiff * xDiff) + (zDiff * zDiff)) < 800.0) { temp = arctan2_f(xDiff, zDiff); - temp -= (aiRacerObj->segment.trans.rotation.y_rotation & 0xFFFF); + temp -= (aiRacerObj->trans.rotation.y_rotation & 0xFFFF); if (temp > 0x8000) { temp = -0xFFFF; } @@ -1025,7 +1023,7 @@ void racer_update_eggs(Object **racerObjs) { s32 i; for (i = 0; i < 4; i++) { - racer = &racerObjs[i]->unk64->racer; + racer = racerObjs[i]->racer; gEggChallengeFlags[i] = racer->lap; if (racer->eggHudCounter != 0) { gEggChallengeFlags[i] |= RACER_EGG_HATCHING; @@ -1211,17 +1209,16 @@ void racer_ai_eggs(Object *obj, Object_Racer *racer, s32 updateRate) { for (objStart = 0; objStart < objCount; objStart++) { tickCount = FALSE; curObj = objList[objStart]; - if (!(curObj->segment.trans.flags & OBJ_FLAGS_PARTICLE) && targetBehaviourID == curObj->behaviorId) { + if (!(curObj->trans.flags & OBJ_FLAGS_PARTICLE) && targetBehaviourID == curObj->behaviorId) { switch (targetBehaviourID) { case BHV_UNK_5C: - if (bestTick == curObj->segment.level_entry->bhv_unk_5C.unk8 && - (racerID == PLAYER_COMPUTER || - racerID == curObj->segment.level_entry->bhv_unk_5C.unk9)) { + if (bestTick == curObj->level_entry->bhv_unk_5C.unk8 && + (racerID == PLAYER_COMPUTER || racerID == curObj->level_entry->bhv_unk_5C.unk9)) { tickCount = TRUE; } break; case BHV_COLLECT_EGG: - egg = &curObj->unk64->egg; + egg = curObj->egg; if (bestTick == 0) { if (egg->status == EGG_SPAWNED) { tickCount = TRUE; @@ -1236,9 +1233,9 @@ void racer_ai_eggs(Object *obj, Object_Racer *racer, s32 updateRate) { } } if (tickCount) { - diffX = curObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = curObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = curObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = curObj->trans.x_position - obj->trans.x_position; + diffY = curObj->trans.y_position - obj->trans.y_position; + diffZ = curObj->trans.z_position - obj->trans.z_position; distance = sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)); if (distance < bestDist) { bestDist = distance; @@ -1260,7 +1257,7 @@ void racer_ai_eggs(Object *obj, Object_Racer *racer, s32 updateRate) { distance = 0.0f; if (curObj != NULL) { if (curObj->behaviorId == BHV_COLLECT_EGG) { - egg = &curObj->unk64->egg; + egg = curObj->egg; i = racer->unk1CD; if (i == 1 && egg->status != EGG_SPAWNED) { racer->unk154 = NULL; @@ -1270,9 +1267,9 @@ void racer_ai_eggs(Object *obj, Object_Racer *racer, s32 updateRate) { racer->unk154 = NULL; } } - diffX = curObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = curObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = curObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = curObj->trans.x_position - obj->trans.x_position; + diffY = curObj->trans.y_position - obj->trans.y_position; + diffZ = curObj->trans.z_position - obj->trans.z_position; distance = sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)); if (distance > 0.0) { racerCount = (arctan2_f(diffX, diffZ) - 0x8000) & 0xFFFF; @@ -1347,7 +1344,7 @@ void racer_ai_eggs(Object *obj, Object_Racer *racer, s32 updateRate) { case 7: if (distance < 200.0 && curObj != NULL) { racer->unk1CD = 0; - objEntry = &curObj->segment.level_entry->bhv_unk_5C; + objEntry = &curObj->level_entry->bhv_unk_5C; racer->unk1CE = (objEntry->unk9 & 3) | 0x40; } break; @@ -1513,9 +1510,9 @@ void func_80045C48(Object *obj, Object_Racer *racer, s32 updateRate) { zDerivative *= magnitude; } - xDerivative = sp8C + xDerivative - obj->segment.trans.x_position; - yDirevative = sp88 + yDirevative - obj->segment.trans.y_position; - zDerivative = sp84 + zDerivative - obj->segment.trans.z_position; + xDerivative = sp8C + xDerivative - obj->trans.x_position; + yDirevative = sp88 + yDirevative - obj->trans.y_position; + zDerivative = sp84 + zDerivative - obj->trans.z_position; s0 = (u16) (arctan2_f(xDerivative, zDerivative) - 0x8000); a1 = (u16) arctan2_f(yDirevative, 500.0f); @@ -1523,7 +1520,7 @@ void func_80045C48(Object *obj, Object_Racer *racer, s32 updateRate) { a0 = s0 - (u16) racer->steerVisualRotation; WRAP(a0, -0x8000, 0x8000); a0 = -a0; - v1 = a1 - (obj->segment.trans.rotation.x_rotation & 0xFFFF); + v1 = a1 - (obj->trans.rotation.x_rotation & 0xFFFF); WRAP(v1, -0x8000, 0x8000); v1 = -v1; @@ -1608,9 +1605,9 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r D_8011D550 = 0; gCurrentCarSteerVel = 0; D_8011D558 = 0; - xPos = obj->segment.trans.x_position; - yPos = obj->segment.trans.y_position; - zPos = obj->segment.trans.z_position; + xPos = obj->trans.x_position; + yPos = obj->trans.y_position; + zPos = obj->trans.z_position; spC8 = 1.0 - (gDialogueCameraAngle / 10240.0f); racerOx1 = -racer->ox1 * 10 * spC8; racerOz1 = -racer->oz1 * 10 * spC8; @@ -1686,7 +1683,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->steerAngle = 0; racer->spinout_timer = 0; racer->trickType = 0; - var_v1 = racer->zipperObj->segment.trans.rotation.y_rotation - (racer->steerVisualRotation & 0xFFFF); + var_v1 = racer->zipperObj->trans.rotation.y_rotation - (racer->steerVisualRotation & 0xFFFF); if (var_v1 > 0x8000) { var_v1 -= 0xFFFF; } @@ -1696,8 +1693,8 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->steerVisualRotation += (var_v1 * updateRate) >> 3; if ((var_v1 < 0x400 && var_v1 > -0x400) || (racer->playerIndex == PLAYER_COMPUTER)) { if (racer->playerIndex != PLAYER_COMPUTER) { - sound_play_spatial(SOUND_ZIP_PAD_BOOST, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, NULL); + sound_play_spatial(SOUND_ZIP_PAD_BOOST, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, NULL); play_random_character_voice(obj, SOUND_VOICE_CHARACTER_POSITIVE, 8, 0x80 | 0x2); } racer->boostTimer = normalise_time(45); @@ -1708,9 +1705,9 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->zipperDirCorrection = 0; rumble_set(racer->playerIndex, RUMBLE_TYPE_8); } else { - obj->segment.x_velocity = (obj->segment.x_velocity * 1.0) * 0.75f; - obj->segment.y_velocity = (obj->segment.y_velocity * 1.0) * 0.75f; - obj->segment.z_velocity = (obj->segment.z_velocity * 1.0) * 0.75f; + obj->x_velocity = (obj->x_velocity * 1.0) * 0.75f; + obj->y_velocity = (obj->y_velocity * 1.0) * 0.75f; + obj->z_velocity = (obj->z_velocity * 1.0) * 0.75f; } } var_f2 = -racer->velocity; @@ -1757,7 +1754,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } if (racer->groundedWheels && racer->groundedWheels < 3) { - obj->segment.trans.rotation.x_rotation -= (obj->segment.trans.rotation.x_rotation * updateRate) >> 6; + obj->trans.rotation.x_rotation -= (obj->trans.rotation.x_rotation * updateRate) >> 6; racer->x_rotation_vel -= (racer->x_rotation_vel * updateRate) >> 6; } if (racer->unk1D4 != 0) { @@ -1784,8 +1781,8 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->y_rotation_offset += updateRate * 0x500; racer->x_rotation_offset += updateRate * 0x600; } - gCurrentRacerTransform.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - gCurrentRacerTransform.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; + gCurrentRacerTransform.rotation.y_rotation = obj->trans.rotation.y_rotation; + gCurrentRacerTransform.rotation.x_rotation = obj->trans.rotation.x_rotation; gCurrentRacerTransform.rotation.z_rotation = 0; gCurrentRacerTransform.x_position = 0.0f; gCurrentRacerTransform.y_position = 0.0f; @@ -1796,7 +1793,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r mtxf_transform_point(&transformedMtx, 0.0f, 1.0f, 0.0f, &racer->ox2, &racer->oy2, &racer->oz2); mtxf_transform_point(&transformedMtx, 1.0f, 0.0f, 0.0f, &racer->ox3, &racer->oy3, &racer->oz3); if (racer->approachTarget == NULL) { - obj->segment.object.animationID = 0; + obj->animationID = 0; var_v0 = racer->steerAngle; var_v0 >>= 1; var_v0 = 40 - var_v0; @@ -1806,7 +1803,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (var_v0 > 73) { var_v0 = 73; } - obj->segment.animFrame = var_v0; + obj->animFrame = var_v0; } xVelTemp = racer->velocity; if (xVelTemp < 0.0f) { @@ -1822,13 +1819,13 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r xVelTemp = (gCurrentRacerMiscAssetPtr[var_v0 + 1] * var_f0) + (gCurrentRacerMiscAssetPtr[var_v0] * (1.0 - var_f0)); gCurrentRacerWeightStat *= 0.75; if (racer->groundedWheels >= 3) { - obj->segment.y_velocity -= gCurrentRacerWeightStat * 0.5 * updateRateF; + obj->y_velocity -= gCurrentRacerWeightStat * 0.5 * updateRateF; } else { - obj->segment.y_velocity -= gCurrentRacerWeightStat * updateRateF; + obj->y_velocity -= gCurrentRacerWeightStat * updateRateF; } iTemp = (gCurrentPlayerIndex != PLAYER_COMPUTER && !racer->raceFinished) ? racer->steerAngle : gCurrentStickX; spFC = 0.004; - obj->segment.y_velocity -= (obj->segment.y_velocity * 0.025) * updateRateF; + obj->y_velocity -= (obj->y_velocity * 0.025) * updateRateF; if (gCurrentRacerInput & B_BUTTON && gCurrentStickY >= -40 && racer->velocity >= -0.5) { spFC *= 16.0f; } @@ -1841,7 +1838,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r velocity *= gCurrentRacerHandlingStat; racer->steerVisualRotation -= (((s32) velocity) & 0xffff) & 0xffff; if (racer->groundedWheels == 0 && racer->buoyancy == 0.0) { - if (obj->segment.y_velocity < 0.0f) { + if (obj->y_velocity < 0.0f) { racer->trickType += updateRate; } if (racer->trickType > 25) { @@ -1918,10 +1915,9 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r rumble_set(racer->playerIndex, RUMBLE_TYPE_8); } - var_f2 = sqrtf((obj->segment.z_velocity * obj->segment.z_velocity) + - (obj->segment.x_velocity * obj->segment.x_velocity)); + var_f2 = sqrtf((obj->z_velocity * obj->z_velocity) + (obj->x_velocity * obj->x_velocity)); if (var_f2 > 0.25) { - racer->unk168 = arctan2_f(obj->segment.x_velocity, obj->segment.z_velocity) + 0x8000; + racer->unk168 = arctan2_f(obj->x_velocity, obj->z_velocity) + 0x8000; var_v1 = ((0x8000 - racer->unk168) & 0xFFFF) - (racer->cameraYaw & 0xFFFF); if (var_v1 > 0x8000) { var_v1 -= 0xFFFF; @@ -1975,9 +1971,9 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (0.2 < zVelTemp) { gCurrentRacerInput |= R_TRIG; } - obj->segment.x_velocity += racer->ox1 * zVelTemp; - obj->segment.y_velocity += racer->oy1 * zVelTemp; - obj->segment.z_velocity += racer->oz1 * zVelTemp; + obj->x_velocity += racer->ox1 * zVelTemp; + obj->y_velocity += racer->oy1 * zVelTemp; + obj->z_velocity += racer->oz1 * zVelTemp; } else { temp = racer->lateral_velocity * 0.07; if (gCurrentRacerInput & R_TRIG) { @@ -1993,24 +1989,24 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } if (gCurrentRacerInput) {} } - obj->segment.x_velocity -= racer->ox3 * temp; - obj->segment.y_velocity -= racer->oy3 * temp; - obj->segment.z_velocity -= racer->oz3 * temp; + obj->x_velocity -= racer->ox3 * temp; + obj->y_velocity -= racer->oy3 * temp; + obj->z_velocity -= racer->oz3 * temp; spF4 *= xVelTemp; - obj->segment.x_velocity -= racer->ox1 * spF4; - obj->segment.y_velocity -= racer->oy1 * spF4; - obj->segment.z_velocity -= racer->oz1 * spF4; + obj->x_velocity -= racer->ox1 * spF4; + obj->y_velocity -= racer->oy1 * spF4; + obj->z_velocity -= racer->oz1 * spF4; spF0 *= xVelTemp / 2; - obj->segment.x_velocity += racer->ox1 * spF0; - obj->segment.y_velocity += racer->oy1 * spF0; - obj->segment.z_velocity += racer->oz1 * spF0; + obj->x_velocity += racer->ox1 * spF0; + obj->y_velocity += racer->oy1 * spF0; + obj->z_velocity += racer->oz1 * spF0; if (racer->groundedWheels && !gRacerInputBlocked && gRaceStartTimer == 0) { var_f2 = (gCurrentRacerWeightStat * updateRateF) * 0.25; sp11C = racer->pitch * var_f2; var_f2 *= racer->roll; - obj->segment.x_velocity += (racer->ox1 * sp11C) + (racer->ox3 * var_f2); - obj->segment.y_velocity += (racer->oy1 * sp11C) + (racer->oy3 * var_f2); - obj->segment.z_velocity += (racer->oz1 * sp11C) + (racer->oz3 * var_f2); + obj->x_velocity += (racer->ox1 * sp11C) + (racer->ox3 * var_f2); + obj->y_velocity += (racer->oy1 * sp11C) + (racer->oy3 * var_f2); + obj->z_velocity += (racer->oz1 * sp11C) + (racer->oz3 * var_f2); } zVelTemp = racer->velocity * racer->velocity; if (racer->velocity < 0.0f) { @@ -2021,19 +2017,19 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } else { temp = zVelTemp * spFC; } - obj->segment.x_velocity -= racer->ox1 * temp; - obj->segment.y_velocity -= racer->oy1 * temp; - obj->segment.z_velocity -= racer->oz1 * temp; + obj->x_velocity -= racer->ox1 * temp; + obj->y_velocity -= racer->oy1 * temp; + obj->z_velocity -= racer->oz1 * temp; if (racer->magnetTimer != 0) { - obj->segment.x_velocity = gRacerMagnetVelX; - obj->segment.z_velocity = gRacerMagnetVelZ; + obj->x_velocity = gRacerMagnetVelX; + obj->z_velocity = gRacerMagnetVelZ; } } racer->unk10C = 0; racer->y_rotation_vel += (gCurrentCarSteerVel - racer->y_rotation_vel) >> 3; - obj->segment.trans.rotation.y_rotation = racer->steerVisualRotation + racer->y_rotation_vel; + obj->trans.rotation.y_rotation = racer->steerVisualRotation + racer->y_rotation_vel; racer->z_rotation_vel += (D_8011D558 - racer->z_rotation_vel) >> 3; - obj->segment.trans.rotation.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; + obj->trans.rotation.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; if (racer->unk1D2 > 0) { racer->unk1D2 -= updateRate; } else { @@ -2042,8 +2038,8 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racerOx1 += racer->ox1 * 10 * spC8; racerOz1 += racer->oz1 * 10 * spC8; if (racer->approachTarget == NULL) { - temp = obj->segment.x_velocity; - zVelTemp = obj->segment.z_velocity; + temp = obj->x_velocity; + zVelTemp = obj->z_velocity; if (racer->unk1D2 != 0) { temp += racer->unk11C; zVelTemp += racer->unk120; @@ -2064,7 +2060,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racerOz1 += racer->unk88 * updateRateF; } - objectMoved = move_object(obj, (temp * updateRateF) + racerOx1, obj->segment.y_velocity * updateRateF, + objectMoved = move_object(obj, (temp * updateRateF) + racerOx1, obj->y_velocity * updateRateF, (zVelTemp * updateRateF) + racerOz1); if (objectMoved && gCurrentPlayerIndex != PLAYER_COMPUTER) { @@ -2076,7 +2072,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer_approach_object(obj, racer, updateRateF); } racer->unkD0 -= (racer->unkD0 * 0.125) * updateRateF; - racer->unkD4 = (-obj->segment.y_velocity) * 7.0; + racer->unkD4 = (-obj->y_velocity) * 7.0; if (racer->unkD4 > 35.0) { racer->unkD4 = 35.0; } @@ -2087,7 +2083,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r waterHeight = -10000.0f; // clang-format off // the backslash here is relevant for the match - wave_properties = get_wave_properties(obj->segment.trans.y_position, &waterHeight, &water_rotation); \ + wave_properties = get_wave_properties(obj->trans.y_position, &waterHeight, &water_rotation); \ if (wave_properties != 0) { // clang-format on velocity = racer->velocity; @@ -2098,8 +2094,8 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r velocity = 4.0f; } velocity *= 0.8; - if ((obj->segment.trans.y_position - velocity) < waterHeight) { - racer->buoyancy = waterHeight - (obj->segment.trans.y_position - velocity); + if ((obj->trans.y_position - velocity) < waterHeight) { + racer->buoyancy = waterHeight - (obj->trans.y_position - velocity); racer->waterTimer = 5; } else { racer->buoyancy = 0.0f; @@ -2110,12 +2106,12 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } else { racer->buoyancy = 0.0f; } - if (racer->waterTimer > 0 && obj->segment.trans.y_position < (waterHeight + velocity)) { + if (racer->waterTimer > 0 && obj->trans.y_position < (waterHeight + velocity)) { obj->interactObj->flags |= INTERACT_FLAGS_UNK_0010; } else { obj->interactObj->flags &= ~INTERACT_FLAGS_UNK_0010; } - waterHeight = obj->segment.trans.y_position - (waterHeight + velocity); + waterHeight = obj->trans.y_position - (waterHeight + velocity); if (racer->buoyancy > 0.0) { iTemp = 0; if (gCurrentRacerInput & R_TRIG) { @@ -2124,7 +2120,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r rotate_racer_in_water(obj, racer, &water_rotation, wave_properties, updateRate, iTemp, 1.0f); } if (racer->buoyancy > 0.0) { - obj->segment.trans.y_position += racer->buoyancy * racer->unkC4; + obj->trans.y_position += racer->buoyancy * racer->unkC4; racer->unkC4 += (0.75 - racer->unkC4) * 0.125; } @@ -2140,17 +2136,17 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->unk1D2 = iTemp; // restores unk1D2 var_f2 = 1.0f / updateRateF; - temp = ((obj->segment.trans.x_position - (xPos + racerOx1)) - D_8011D548) * var_f2; - zVelTemp = ((obj->segment.trans.z_position - (zPos + racerOz1)) - D_8011D54C) * var_f2; - obj->segment.z_velocity = zVelTemp; - obj->segment.x_velocity = temp; - obj->segment.y_velocity = (obj->segment.trans.y_position - yPos) * var_f2; + temp = ((obj->trans.x_position - (xPos + racerOx1)) - D_8011D548) * var_f2; + zVelTemp = ((obj->trans.z_position - (zPos + racerOz1)) - D_8011D54C) * var_f2; + obj->z_velocity = zVelTemp; + obj->x_velocity = temp; + obj->y_velocity = (obj->trans.y_position - yPos) * var_f2; racer->forwardVel -= (racer->forwardVel + (racer->velocity * 0.05)) * 0.125; - if (racer->buoyancy > 0.0 && racer->unk1FB == 0 && obj->segment.y_velocity > 4.0) { - obj->segment.y_velocity = 4.0f; + if (racer->buoyancy > 0.0 && racer->unk1FB == 0 && obj->y_velocity > 4.0) { + obj->y_velocity = 4.0f; } - if (gNumViewports < 2 && obj->segment.header->particleCount >= 9) { + if (gNumViewports < 2 && obj->header->particleCount >= 9) { if ((gCurrentRacerInput & (A_BUTTON | R_TRIG)) == (A_BUTTON | R_TRIG) && (gCurrentStickX < -30 || gCurrentStickX > 30)) { increase_emitter_opacity(obj, 8, updateRate << 10, 0x80); @@ -2160,9 +2156,8 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } if (gCurrentPlayerIndex >= PLAYER_ONE && racer->buoyancy > 0.0) { if (gNumViewports < 3) { - var_f2 = ((obj->segment.x_velocity * obj->segment.x_velocity) + - (obj->segment.y_velocity * obj->segment.y_velocity)) + - (obj->segment.z_velocity * obj->segment.z_velocity); + var_f2 = ((obj->x_velocity * obj->x_velocity) + (obj->y_velocity * obj->y_velocity)) + + (obj->z_velocity * obj->z_velocity); if (var_f2 > 16.0f) { if (var_f2 < 80.0f) { obj->particleEmittersEnabled |= OBJ_EMIT_3 | OBJ_EMIT_4; @@ -2202,30 +2197,30 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (racer->unk201 == 0) { obj->particleEmittersEnabled = OBJ_EMIT_NONE; } else { - obj->segment.y_velocity += updateRate * gCurrentRacerWeightStat; + obj->y_velocity += updateRate * gCurrentRacerWeightStat; update_vehicle_particles(obj, updateRate); - obj->segment.y_velocity -= updateRate * gCurrentRacerWeightStat; + obj->y_velocity -= updateRate * gCurrentRacerWeightStat; } - gCurrentRacerTransform.rotation.y_rotation = -obj->segment.trans.rotation.y_rotation; - gCurrentRacerTransform.rotation.x_rotation = -obj->segment.trans.rotation.x_rotation; - gCurrentRacerTransform.rotation.z_rotation = -obj->segment.trans.rotation.z_rotation; + gCurrentRacerTransform.rotation.y_rotation = -obj->trans.rotation.y_rotation; + gCurrentRacerTransform.rotation.x_rotation = -obj->trans.rotation.x_rotation; + gCurrentRacerTransform.rotation.z_rotation = -obj->trans.rotation.z_rotation; gCurrentRacerTransform.scale = 1.0f; gCurrentRacerTransform.x_position = 0.0f; gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; mtxf_from_inverse_transform(&transformedMtx, &gCurrentRacerTransform); - mtxf_transform_point(&transformedMtx, obj->segment.x_velocity, obj->segment.y_velocity, obj->segment.z_velocity, - &racer->lateral_velocity, (f32 *) &racer->unk34, &racer->velocity); + mtxf_transform_point(&transformedMtx, obj->x_velocity, obj->y_velocity, obj->z_velocity, &racer->lateral_velocity, + (f32 *) &racer->unk34, &racer->velocity); if (racer->groundedWheels == 0 && racer->waterTimer == 0) { iTemp = (-gCurrentStickY * 0x40) & 0xFFFF; - var_v1 = iTemp - (obj->segment.trans.rotation.x_rotation & 0xFFFF); + var_v1 = iTemp - (obj->trans.rotation.x_rotation & 0xFFFF); if (var_v1 > 0x8000) { var_v1 -= 0xFFFF; } if (var_v1 < -0x8000) { var_v1 += 0xFFFF; } - obj->segment.trans.rotation.x_rotation += var_v1 >> 2; + obj->trans.rotation.x_rotation += var_v1 >> 2; var_v0 = -(racer->x_rotation_vel & 0xFFFF); if (var_v0 > 0x8000) { var_v0 -= 0xFFFF; @@ -2245,14 +2240,14 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (gCurrentButtonsPressed & R_TRIG && (racer->buoyancy > 0.0f || racer->groundedWheels >= 2) && racer->unk1FB == 0) { if (racer->buoyancy != 0.0f) { - obj->segment.y_velocity += 4.5; - if (obj->segment.y_velocity > 5.5) { - obj->segment.y_velocity = 5.5f; + obj->y_velocity += 4.5; + if (obj->y_velocity > 5.5) { + obj->y_velocity = 5.5f; } } else { - obj->segment.y_velocity += 3.5; + obj->y_velocity += 3.5; } - var_f2 = ((2.0 * obj->segment.y_velocity) / gCurrentRacerWeightStat); + var_f2 = ((2.0 * obj->y_velocity) / gCurrentRacerWeightStat); racer->unk1FB = (s32) (var_f2) + 1; } if (racer->unk1FB > 0) { @@ -2265,9 +2260,9 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } if (obj->attachPoints->count == 1) { vehiclePart = obj->attachPoints->obj[0]; - vehiclePart->segment.trans.rotation.y_rotation = (gCurrentStickX * 20) + 0x4000; - vehiclePart->segment.object.modelIndex++; - vehiclePart->segment.object.modelIndex &= 1; + vehiclePart->trans.rotation.y_rotation = (gCurrentStickX * 20) + 0x4000; + vehiclePart->modelIndex++; + vehiclePart->modelIndex &= 1; } second_racer_camera_update(obj, racer, CAMERA_HOVERCRAFT, updateRateF); if (playerObjectHasMoved) { @@ -2302,13 +2297,13 @@ void racer_attack_handler_hovercraft(Object *obj, Object_Racer *racer) { case ATTACK_SPIN: racer->unk1F1 = 1; if (bananas == 0) { - obj->segment.x_velocity = 0.0f; - obj->segment.z_velocity = 0.0f; - obj->segment.y_velocity = 8.0f; + obj->x_velocity = 0.0f; + obj->z_velocity = 0.0f; + obj->y_velocity = 8.0f; } else { - obj->segment.x_velocity = obj->segment.x_velocity * 0.5; - obj->segment.z_velocity = obj->segment.z_velocity * 0.5; - obj->segment.y_velocity = 6.0f; + obj->x_velocity = obj->x_velocity * 0.5; + obj->z_velocity = obj->z_velocity * 0.5; + obj->y_velocity = 6.0f; } break; // Crushed by something big, like a snowball. @@ -2318,17 +2313,17 @@ void racer_attack_handler_hovercraft(Object *obj, Object_Racer *racer) { // Running into a bubble trap. case ATTACK_BUBBLE: racer->bubbleTrapTimer = 120; - obj->segment.x_velocity *= 0.7; - if (obj->segment.y_velocity > 2.0f) { - obj->segment.y_velocity = 2.0f; + obj->x_velocity *= 0.7; + if (obj->y_velocity > 2.0f) { + obj->y_velocity = 2.0f; } - obj->segment.z_velocity *= 0.7; + obj->z_velocity *= 0.7; break; // This goes unused. case ATTACK_FLUNG: racer->unk1F1 = 1; racer->velocity = 0.0f; - obj->segment.y_velocity += 20.5; + obj->y_velocity += 20.5; racer_play_sound(obj, SOUND_WHEE); break; } @@ -2392,7 +2387,7 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) break; } if (racer->unk1E4 == 0) { - angle = (obj->segment.trans.rotation.x_rotation); + angle = (obj->trans.rotation.x_rotation); if (angle > 0) { angle -= 0x61C; if (angle < 0) { @@ -2444,8 +2439,8 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) yVel = racer->lateral_velocity * 2; racer->unkC8 -= (racer->unkC8 - yVel) * 0.25; yVel = sins_f(racer->cameraYaw + 0x4000) * racer->unkC8; - gCameraObject->trans.x_position = obj->segment.trans.x_position + xVel + yVel; - yVel = gCameraObject->trans.y_position - (obj->segment.trans.y_position + phi_f18); + gCameraObject->trans.x_position = obj->trans.x_position + xVel + yVel; + yVel = gCameraObject->trans.y_position - (obj->trans.y_position + phi_f18); if (yVel > 0.0f) { yVel *= 0.5; } else { @@ -2461,11 +2456,11 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) gCameraObject->trans.y_position -= yVel; gCameraObject->trans.rotation.z_rotation = 0; if (gRaceStartTimer) { - gCameraObject->trans.y_position = obj->segment.trans.y_position + phi_f18; + gCameraObject->trans.y_position = obj->trans.y_position + phi_f18; } coss_f(racer->cameraYaw + 0x4000); // Unused function call that wasn't fully optimised out. - gCameraObject->trans.z_position = obj->segment.trans.z_position + zVel; + gCameraObject->trans.z_position = obj->trans.z_position + zVel; gCameraObject->trans.rotation.y_rotation = racer->cameraYaw; segmentIndex = get_level_segment_index_from_position( gCameraObject->trans.x_position, gCameraObject->trans.y_position, gCameraObject->trans.z_position); @@ -2495,11 +2490,11 @@ f32 rotate_racer_in_water(Object *obj, Object_Racer *racer, Vec3f *pos, s8 arg3, velocity = 0.0f; } } else { - obj->segment.trans.x_position += pos->x * updateRateF * arg6; - obj->segment.trans.z_position += pos->z * updateRateF * arg6; + obj->trans.x_position += pos->x * updateRateF * arg6; + obj->trans.z_position += pos->z * updateRateF * arg6; velocity = 1.0f; } - gCurrentRacerTransform.rotation.y_rotation = -obj->segment.trans.rotation.y_rotation; + gCurrentRacerTransform.rotation.y_rotation = -obj->trans.rotation.y_rotation; gCurrentRacerTransform.rotation.x_rotation = 0; gCurrentRacerTransform.rotation.z_rotation = 0; gCurrentRacerTransform.x_position = 0.0f; @@ -2516,10 +2511,10 @@ f32 rotate_racer_in_water(Object *obj, Object_Racer *racer, Vec3f *pos, s8 arg3, angleVel = ((s16) (u16) arctan2_f(pos->z, pos->y) * velocity); angleVel += -gCurrentStickY * 32; angleVel += 0x3C0; - angle = (u16) angleVel - ((u16) obj->segment.trans.rotation.x_rotation); + angle = (u16) angleVel - ((u16) obj->trans.rotation.x_rotation); angle = angle > 0x8000 ? angle - 0xffff : angle; angle = angle < -0x8000 ? angle + 0xffff : angle; - obj->segment.trans.rotation.x_rotation += (angle * updateRate) >> 4; + obj->trans.rotation.x_rotation += (angle * updateRate) >> 4; return velocity; } @@ -2589,14 +2584,14 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (gCurrentPlayerIndex != PLAYER_COMPUTER && racer->vehicleIDPrev != VEHICLE_WIZPIG && gRacerWaveCount != 0) { // UNMATCHED for (var_a0 = gRacerWaveCount - 1; - var_a0 >= 0 && gRacerCurrentWave[var_a0]->waveHeight < obj->segment.trans.y_position + 5; var_a0--) {} + var_a0 >= 0 && gRacerCurrentWave[var_a0]->waveHeight < obj->trans.y_position + 5; var_a0--) {} if (var_a0 == gRacerWaveCount - 1) { var_a0--; } var_f2 = gRacerCurrentWave[var_a0 + 1]->waveHeight; - var_f2 = (obj->segment.trans.y_position - var_f2) - 10; + var_f2 = (obj->trans.y_position - var_f2) - 10; if (var_f2 > 100.0f) { racer->drift_direction = 0; } @@ -2625,7 +2620,7 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racerVelocity = 4; } racerVelocity /= 4; - obj->segment.trans.y_position += ((38 - var_f2) * updateRateF * racerVelocity) / 8; + obj->trans.y_position += ((38 - var_f2) * updateRateF * racerVelocity) / 8; if (gCurrentStickY > 0) { gCurrentStickY >>= 1; } @@ -2641,9 +2636,9 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r #endif D_8011D558 = 0; - spE8 = obj->segment.trans.x_position; - spE4 = obj->segment.trans.y_position; - spE0 = obj->segment.trans.z_position; + spE8 = obj->trans.x_position; + spE4 = obj->trans.y_position; + spE0 = obj->trans.z_position; if (racer->trickType != 0) { var_f2 = 4.0; } else { @@ -2715,8 +2710,8 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } racerBrake = racer->brake; - gCurrentRacerTransform.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - gCurrentRacerTransform.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; + gCurrentRacerTransform.rotation.y_rotation = obj->trans.rotation.y_rotation; + gCurrentRacerTransform.rotation.x_rotation = obj->trans.rotation.x_rotation; gCurrentRacerTransform.rotation.z_rotation = 0; gCurrentRacerTransform.x_position = 0.0f; gCurrentRacerTransform.y_position = 0.0f; @@ -2733,9 +2728,8 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (var_v0 == PLAYER_COMPUTER && gCurrentPlayerIndex != PLAYER_COMPUTER) { gCurrentRacerHandlingStat = 1.4f; } - var_f20 = sqrtf((obj->segment.x_velocity * obj->segment.x_velocity) + - (obj->segment.z_velocity * obj->segment.z_velocity) + - (obj->segment.y_velocity * obj->segment.y_velocity)) - + var_f20 = sqrtf((obj->x_velocity * obj->x_velocity) + (obj->z_velocity * obj->z_velocity) + + (obj->y_velocity * obj->y_velocity)) - 2.0; if (racer->vehicleID >= VEHICLE_BOSSES) { var_f20 = ((var_f20 - 2.0) / 2.0); @@ -2750,7 +2744,7 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r // This line (or somewhere here about) seems to be culprit as it incorrectly uses $f12 instead of $f2 // This may or may not cause $20 to be swapped with $f2 var_f20 = 1.0 - (var_f20 / 4.0); - var_f2 = (gCurrentCourseHeight - 50.0) - obj->segment.trans.y_position; + var_f2 = (gCurrentCourseHeight - 50.0) - obj->trans.y_position; if (racer->trickType < 2 && racer->trickType >= -1 && var_f2 < 0) { var_f20 += -var_f2 / 25.0; if (gCurrentStickY < -20) { @@ -2860,20 +2854,19 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r var_f20 = 1; } if (racer->vehicleIDPrev == VEHICLE_WIZPIG) { - if (obj->segment.object.animationID < 3) { + if (obj->animationID < 3) { var_f20 = 4.0f; } else { var_f20 = 0.0f; } } var_f20 *= gCurrentRacerWeightStat; - obj->segment.y_velocity -= var_f20; + obj->y_velocity -= var_f20; if (racer->zipperDirCorrection != 0 && racer->spinout_timer == 0) { racer->magnetTimer = 0; racer->spinout_timer = 0; racer->trickType = 0; - steerVisualRotationOffset = - racer->zipperObj->segment.trans.rotation.y_rotation - (racer->steerVisualRotation & 0xFFFF); + steerVisualRotationOffset = racer->zipperObj->trans.rotation.y_rotation - (racer->steerVisualRotation & 0xFFFF); if (steerVisualRotationOffset > 0x8000) { steerVisualRotationOffset -= 0xFFFF; } @@ -2884,8 +2877,8 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (((steerVisualRotationOffset < 0x400) && (steerVisualRotationOffset > -0x400)) || (racer->playerIndex == PLAYER_COMPUTER)) { if (racer->playerIndex != PLAYER_COMPUTER) { - sound_play_spatial(SOUND_ZIP_PAD_BOOST, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, NULL); + sound_play_spatial(SOUND_ZIP_PAD_BOOST, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, NULL); play_random_character_voice(obj, SOUND_VOICE_CHARACTER_POSITIVE, SOUND_NUMBER_OF_RACERS, 0x80 | 0x2); } racer->boostTimer = normalise_time(45); @@ -2896,9 +2889,9 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r rumble_set(racer->playerIndex, 8); racer->zipperDirCorrection = 0; } else { - obj->segment.x_velocity *= 0.75; - obj->segment.y_velocity *= 0.75; - obj->segment.z_velocity *= 0.75; + obj->x_velocity *= 0.75; + obj->y_velocity *= 0.75; + obj->z_velocity *= 0.75; } } if (racer->spinout_timer != 0) { @@ -2940,14 +2933,14 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->spinout_timer = 0; racer->unk1F1 = 0; } - xRotationOffset = 0xD800 - (obj->segment.trans.rotation.x_rotation & 0xFFFF); + xRotationOffset = 0xD800 - (obj->trans.rotation.x_rotation & 0xFFFF); if (xRotationOffset > 0x8000) { xRotationOffset -= 0xFFFF; } if (xRotationOffset < -0x8000) { xRotationOffset += 0xFFFF; } - obj->segment.trans.rotation.x_rotation += (xRotationOffset * updateRate) >> 4; + obj->trans.rotation.x_rotation += (xRotationOffset * updateRate) >> 4; } else { if (racer->trickType == 1 || racer->trickType == -1) { var_v1 = racer->x_rotation_vel; @@ -2971,10 +2964,10 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } } else if (racer->trickType == 2 || racer->trickType == -2) { - var_v1 = obj->segment.trans.rotation.x_rotation; + var_v1 = obj->trans.rotation.x_rotation; var_t0 = var_v1; if (racer->unk1D5 == 0) { - obj->segment.trans.rotation.x_rotation = + obj->trans.rotation.x_rotation = var_v1 + ((racer->trickType * (((0x180 & 0xFFFFFFFF) & 0xFFFFFFFF) & 0xFFFFFFFF)) * updateRate); } if (!(gCurrentRacerInput & R_TRIG)) { @@ -2987,18 +2980,18 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } var_v1 = racer->x_rotation_vel; racer->x_rotation_vel = var_v1 - ((var_v1 * updateRate) >> 4); - obj->segment.x_velocity = racer->velocity * racer->ox1; - obj->segment.y_velocity = racer->oy1 * racer->velocity; - obj->segment.z_velocity = racer->velocity * racer->oz1; + obj->x_velocity = racer->velocity * racer->ox1; + obj->y_velocity = racer->oy1 * racer->velocity; + obj->z_velocity = racer->velocity * racer->oz1; if (racer->trickType == 2) { if (var_t0 > 0) { racer->unk1D4 = 1; } if (var_t0 < 0) { - if (obj->segment.trans.rotation.x_rotation >= 0) { + if (obj->trans.rotation.x_rotation >= 0) { if (racer->unk1D4 != 0) { racer->trickType = 0; - obj->segment.trans.rotation.x_rotation = 0; + obj->trans.rotation.x_rotation = 0; racer->boostTimer = normalise_time(0xA); racer->boostType = BOOST_NONE; if (racer->throttleReleased != 0) { @@ -3007,8 +3000,7 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } } - if (var_t0 > 0x4000 && obj->segment.trans.rotation.x_rotation < -0x4000 && - (gCurrentRacerInput & R_TRIG)) { + if (var_t0 > 0x4000 && obj->trans.rotation.x_rotation < -0x4000 && (gCurrentRacerInput & R_TRIG)) { racer->unk1D5 = 60; } } else { @@ -3016,10 +3008,10 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->unk1D4 = 1; } if (var_t0 > 0) { - if (obj->segment.trans.rotation.x_rotation <= 0) { + if (obj->trans.rotation.x_rotation <= 0) { if (racer->unk1D4 != 0) { racer->trickType = 0; - obj->segment.trans.rotation.x_rotation = 0; + obj->trans.rotation.x_rotation = 0; racer->boostTimer = normalise_time(10); racer->boostType = BOOST_NONE; if (racer->throttleReleased != 0) { @@ -3028,8 +3020,7 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } } - if (var_t0 < -0x4000 && obj->segment.trans.rotation.x_rotation > 0x4000 && - (gCurrentRacerInput & R_TRIG)) { + if (var_t0 < -0x4000 && obj->trans.rotation.x_rotation > 0x4000 && (gCurrentRacerInput & R_TRIG)) { racer->unk1D5 = 60; } } @@ -3043,10 +3034,10 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r gCurrentRacerInput &= ~R_TRIG; } if (racer->groundedWheels < 2) { - var_v1 = obj->segment.trans.rotation.x_rotation; + var_v1 = obj->trans.rotation.x_rotation; xRotationOffset = 0; var_t0 = racerSteerAngle; - if (obj->segment.trans.rotation.x_rotation > 0x3000) { + if (obj->trans.rotation.x_rotation > 0x3000) { xRotationOffset = var_v1 - 0x3000; if (xRotationOffset > 0x1000) { xRotationOffset = 0x1000; @@ -3098,9 +3089,9 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } if (!(gCurrentRacerInput & R_TRIG) || racer->groundedWheels == 0 || racer->zipperDirCorrection != 0) { var_f20 = racer->velocity * var_t0 * 0.00015; - obj->segment.x_velocity -= racer->ox3 * var_f20; - obj->segment.y_velocity -= racer->oy3 * var_f20; - obj->segment.z_velocity -= racer->oz3 * var_f20; + obj->x_velocity -= racer->ox3 * var_f20; + obj->y_velocity -= racer->oy3 * var_f20; + obj->z_velocity -= racer->oz3 * var_f20; } var_t0 = gCurrentStickY; @@ -3120,11 +3111,11 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r // Note: The following if/else has messed up t registers if (!(gCurrentRacerInput & R_TRIG)) { - obj->segment.trans.rotation.x_rotation -= (obj->segment.trans.rotation.x_rotation * updateRate) >> 4; - obj->segment.trans.rotation.x_rotation -= ((var_t0 >> 1) * 19 * updateRate) >> 1; + obj->trans.rotation.x_rotation -= (obj->trans.rotation.x_rotation * updateRate) >> 4; + obj->trans.rotation.x_rotation -= ((var_t0 >> 1) * 19 * updateRate) >> 1; } else { - obj->segment.trans.rotation.x_rotation -= (obj->segment.trans.rotation.x_rotation * updateRate) >> 4; - obj->segment.trans.rotation.x_rotation -= ((var_t0 >> 1) * 30 * updateRate) >> 1; + obj->trans.rotation.x_rotation -= (obj->trans.rotation.x_rotation * updateRate) >> 4; + obj->trans.rotation.x_rotation -= ((var_t0 >> 1) * 30 * updateRate) >> 1; } if (racer->tappedR) { @@ -3169,17 +3160,17 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racerThrottle = 0.4f; } var_f0 = racerThrottle * var_f14; - obj->segment.x_velocity -= racer->ox1 * var_f0; - obj->segment.y_velocity -= racer->oy1 * var_f0; - obj->segment.z_velocity -= racer->oz1 * var_f0; + obj->x_velocity -= racer->ox1 * var_f0; + obj->y_velocity -= racer->oy1 * var_f0; + obj->z_velocity -= racer->oz1 * var_f0; if (racer->groundedWheels >= 3 || racer->velocity < 1.0 || racer->vehicleID == VEHICLE_CARPET) { if (racer->groundedWheels == 0) { racerBrake /= 2; } racerBrake *= var_f14 / 2; - obj->segment.x_velocity += racer->ox1 * racerBrake; - obj->segment.y_velocity += racer->oy1 * racerBrake; - obj->segment.z_velocity += racer->oz1 * racerBrake; + obj->x_velocity += racer->ox1 * racerBrake; + obj->y_velocity += racer->oy1 * racerBrake; + obj->z_velocity += racer->oz1 * racerBrake; } spEC = racer->velocity * racer->velocity; if (racer->velocity < 0.0f) { @@ -3190,55 +3181,55 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } else { var_f20 = spEC * spD8; } - obj->segment.x_velocity -= racer->ox1 * var_f20; - obj->segment.y_velocity -= racer->oy1 * var_f20; - obj->segment.z_velocity -= racer->oz1 * var_f20; + obj->x_velocity -= racer->ox1 * var_f20; + obj->y_velocity -= racer->oy1 * var_f20; + obj->z_velocity -= racer->oz1 * var_f20; var_f20 = racer->lateral_velocity * racer->lateral_velocity * spD4; if (racer->lateral_velocity < 0) { var_f20 = -var_f20; } var_f20 += (racer->lateral_velocity * spD4 * 4.0f); - obj->segment.x_velocity -= racer->ox3 * var_f20; - obj->segment.y_velocity -= racer->oy3 * var_f20; - obj->segment.z_velocity -= racer->oz3 * var_f20; + obj->x_velocity -= racer->ox3 * var_f20; + obj->y_velocity -= racer->oy3 * var_f20; + obj->z_velocity -= racer->oz3 * var_f20; if (racer->trickType == 1 || racer->trickType == -1) { spEC = racer->velocity * 0.0588235 * 1.5; var_f20 = coss_f(racer->x_rotation_vel) * spEC * racer->trickType; if (racer->x_rotation_vel > 0x4000 || racer->x_rotation_vel < -0x4000) { var_f20 *= 2; } - obj->segment.x_velocity -= racer->ox3 * var_f20; - obj->segment.y_velocity -= racer->oy3 * var_f20; - obj->segment.z_velocity -= racer->oz3 * var_f20; + obj->x_velocity -= racer->ox3 * var_f20; + obj->y_velocity -= racer->oy3 * var_f20; + obj->z_velocity -= racer->oz3 * var_f20; var_f20 = sins_f(racer->x_rotation_vel) * spEC * racer->trickType * 1.5; - obj->segment.x_velocity -= racer->ox2 * var_f20; - obj->segment.y_velocity -= racer->oy2 * var_f20; - obj->segment.z_velocity -= racer->oz2 * var_f20; + obj->x_velocity -= racer->ox2 * var_f20; + obj->y_velocity -= racer->oy2 * var_f20; + obj->z_velocity -= racer->oz2 * var_f20; } var_f20 = racer->unk34 * racer->unk34 * spD0; if (racer->unk34 < 0.0f) { var_f20 = -var_f20; } var_f20 += 4.0f * (racer->unk34 * spD0); - obj->segment.x_velocity -= racer->ox2 * var_f20; - obj->segment.y_velocity -= racer->oy2 * var_f20; - obj->segment.z_velocity -= racer->oz2 * var_f20; + obj->x_velocity -= racer->ox2 * var_f20; + obj->y_velocity -= racer->oy2 * var_f20; + obj->z_velocity -= racer->oz2 * var_f20; racer->forwardVel -= (racer->forwardVel + (racer->velocity * 0.05)) * 0.125; } racer->unk10C = 0; racer->y_rotation_vel += (gCurrentCarSteerVel - racer->y_rotation_vel) >> 3; - obj->segment.trans.rotation.y_rotation = racer->steerVisualRotation + racer->y_rotation_vel; + obj->trans.rotation.y_rotation = racer->steerVisualRotation + racer->y_rotation_vel; racer->z_rotation_vel += (D_8011D558 - racer->z_rotation_vel) >> 3; - obj->segment.trans.rotation.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; + obj->trans.rotation.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; if (racer->magnetTimer != 0) { - obj->segment.x_velocity = gRacerMagnetVelX; - obj->segment.z_velocity = gRacerMagnetVelZ; + obj->x_velocity = gRacerMagnetVelX; + obj->z_velocity = gRacerMagnetVelZ; } if (racer->approachTarget == NULL) { - var_f20 = obj->segment.x_velocity; - spEC = obj->segment.z_velocity; + var_f20 = obj->x_velocity; + spEC = obj->z_velocity; if (racer->unk1D2 != 0) { var_f20 += racer->unk11C * 0.5; spEC += racer->unk120 * 0.5; @@ -3258,7 +3249,7 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r var_f20 += racer->unk84; spEC += racer->unk88; } - if (move_object(obj, var_f20 * updateRateF, obj->segment.y_velocity * updateRateF, spEC * updateRateF) && + if (move_object(obj, var_f20 * updateRateF, obj->y_velocity * updateRateF, spEC * updateRateF) && gCurrentPlayerIndex != PLAYER_COMPUTER) { playerObjectMoved = TRUE; } @@ -3289,61 +3280,61 @@ void func_80049794(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } else { var_f0 = 1.0f / updateRateF; - var_f20 = (obj->segment.trans.x_position - spE8 - D_8011D548) * var_f0; - obj->segment.y_velocity = (obj->segment.trans.y_position - spE4) * var_f0; - spEC = (obj->segment.trans.z_position - spE0 - D_8011D54C) * var_f0; + var_f20 = (obj->trans.x_position - spE8 - D_8011D548) * var_f0; + obj->y_velocity = (obj->trans.y_position - spE4) * var_f0; + spEC = (obj->trans.z_position - spE0 - D_8011D54C) * var_f0; } if (gRaceStartTimer == 100) { - obj->segment.y_velocity = -5.0f; + obj->y_velocity = -5.0f; } - obj->segment.x_velocity = var_f20; - obj->segment.z_velocity = spEC; - gCurrentRacerTransform.rotation.y_rotation = -obj->segment.trans.rotation.y_rotation; - gCurrentRacerTransform.rotation.x_rotation = -obj->segment.trans.rotation.x_rotation; + obj->x_velocity = var_f20; + obj->z_velocity = spEC; + gCurrentRacerTransform.rotation.y_rotation = -obj->trans.rotation.y_rotation; + gCurrentRacerTransform.rotation.x_rotation = -obj->trans.rotation.x_rotation; gCurrentRacerTransform.rotation.z_rotation = 0; gCurrentRacerTransform.x_position = 0.0f; gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; mtxf_from_inverse_transform((MtxF *) &sp60, &gCurrentRacerTransform); - mtxf_transform_point((MtxF *) &sp60, obj->segment.x_velocity, obj->segment.y_velocity, obj->segment.z_velocity, - &racer->lateral_velocity, &racer->unk34, &racer->velocity); + mtxf_transform_point((MtxF *) &sp60, obj->x_velocity, obj->y_velocity, obj->z_velocity, &racer->lateral_velocity, + &racer->unk34, &racer->velocity); if (obj->attachPoints != NULL && obj->attachPoints->count >= 3) { temp_v0_obj = obj->attachPoints->obj[2]; - temp_v0_obj->segment.trans.rotation.y_rotation = 0x4000; - temp_v0_obj->segment.object.modelIndex += 1; - if (temp_v0_obj->segment.object.modelIndex == temp_v0_obj->segment.header->numberOfModelIds) { - temp_v0_obj->segment.object.modelIndex = 0; + temp_v0_obj->trans.rotation.y_rotation = 0x4000; + temp_v0_obj->modelIndex += 1; + if (temp_v0_obj->modelIndex == temp_v0_obj->header->numberOfModelIds) { + temp_v0_obj->modelIndex = 0; } } if (obj->attachPoints != NULL && obj->attachPoints->count >= 3) { if (racer->groundedWheels != 0 || spA2 != FALSE) { temp_v0_obj = obj->attachPoints->obj[0]; - if (temp_v0_obj->segment.trans.y_position > 0.0f) { - temp_v0_obj->segment.trans.y_position = temp_v0_obj->segment.trans.y_position - 2.0; + if (temp_v0_obj->trans.y_position > 0.0f) { + temp_v0_obj->trans.y_position = temp_v0_obj->trans.y_position - 2.0; } else { - temp_v0_obj->segment.trans.y_position = 0.0f; + temp_v0_obj->trans.y_position = 0.0f; } - temp_v0_obj->segment.trans.flags &= ~OBJ_FLAGS_INVISIBLE; + temp_v0_obj->trans.flags &= ~OBJ_FLAGS_INVISIBLE; temp_v0_obj = obj->attachPoints->obj[1]; - if (temp_v0_obj->segment.trans.y_position > 0.0f) { - temp_v0_obj->segment.trans.y_position = temp_v0_obj->segment.trans.y_position - 2.0; + if (temp_v0_obj->trans.y_position > 0.0f) { + temp_v0_obj->trans.y_position = temp_v0_obj->trans.y_position - 2.0; } else { - temp_v0_obj->segment.trans.y_position = 0.0f; + temp_v0_obj->trans.y_position = 0.0f; } - temp_v0_obj->segment.trans.flags &= ~OBJ_FLAGS_INVISIBLE; + temp_v0_obj->trans.flags &= ~OBJ_FLAGS_INVISIBLE; } else { temp_v0_obj = obj->attachPoints->obj[0]; - if (temp_v0_obj->segment.trans.y_position < 20.0f) { - temp_v0_obj->segment.trans.y_position = temp_v0_obj->segment.trans.y_position + 1.0f; + if (temp_v0_obj->trans.y_position < 20.0f) { + temp_v0_obj->trans.y_position = temp_v0_obj->trans.y_position + 1.0f; } else { - temp_v0_obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + temp_v0_obj->trans.flags |= OBJ_FLAGS_INVISIBLE; } temp_v0_obj = obj->attachPoints->obj[1]; - if (temp_v0_obj->segment.trans.y_position < 20.0f) { - temp_v0_obj->segment.trans.y_position = temp_v0_obj->segment.trans.y_position + 1.0f; + if (temp_v0_obj->trans.y_position < 20.0f) { + temp_v0_obj->trans.y_position = temp_v0_obj->trans.y_position + 1.0f; } else { - temp_v0_obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + temp_v0_obj->trans.flags |= OBJ_FLAGS_INVISIBLE; } } } @@ -3405,7 +3396,7 @@ void apply_plane_tilt_anim(s32 updateRate, Object *obj, Object_Racer *racer) { if (animAdd > 73) { animAdd = 73; } - animDiff = animAdd - obj->segment.animFrame; + animDiff = animAdd - obj->animFrame; animAdd = 0; if (animDiff > 0) { animAdd = updateRate * 3; @@ -3419,7 +3410,7 @@ void apply_plane_tilt_anim(s32 updateRate, Object *obj, Object_Racer *racer) { animAdd = animDiff; } } - obj->segment.animFrame += animAdd; //!@Delta + obj->animFrame += animAdd; //!@Delta } } @@ -3468,8 +3459,8 @@ void racer_attack_handler_plane(Object *obj, Object_Racer *racer) { break; case ATTACK_BUBBLE: racer->bubbleTrapTimer = 120; - obj->segment.x_velocity *= 0.7; - obj->segment.z_velocity *= 0.7; + obj->x_velocity *= 0.7; + obj->z_velocity *= 0.7; break; } racer->attackType = ATTACK_NONE; @@ -3495,7 +3486,7 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { s32 delta; delta = (s32) updateRate; - var_f16 = gCurrentCourseHeight - obj->segment.trans.y_position; + var_f16 = gCurrentCourseHeight - obj->trans.y_position; var_f16 = 200.0f - (var_f16); if (var_f16 < 0.0f) { var_f16 = 0.0f; @@ -3548,7 +3539,7 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { if (racer->trickType == 2 || racer->trickType == -2) { angle = 0; } else { - angle = obj->segment.trans.rotation.x_rotation; + angle = obj->trans.rotation.x_rotation; if (angle > 0x3000) { angle = 0x3000; } @@ -3614,8 +3605,8 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { xOffset = sins_f(0x8000 - racer->cameraYaw) * var_f16; zOffset = coss_f(0x8000 - racer->cameraYaw) * var_f16; var_f16 = sins_f(racer->cameraYaw + 0x4000) * 3.0f * racer->lateral_velocity; - gCameraObject->trans.x_position = (obj->segment.trans.x_position + xOffset) + var_f16; - yOffset = gCameraObject->trans.y_position - (obj->segment.trans.y_position + baseFloat1); + gCameraObject->trans.x_position = (obj->trans.x_position + xOffset) + var_f16; + yOffset = gCameraObject->trans.y_position - (obj->trans.y_position + baseFloat1); var_f16 = yOffset; if (racer->trickType == 1 || racer->trickType == -1) { racer->unk74 = 8.0; @@ -3637,7 +3628,7 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { } gCameraObject->trans.y_position -= yOffset; var_f16 = (-coss_f(racer->cameraYaw + 0x4000) * 3.0f * racer->lateral_velocity); - gCameraObject->trans.z_position = zOffset + obj->segment.trans.z_position + var_f16; + gCameraObject->trans.z_position = zOffset + obj->trans.z_position + var_f16; gCameraObject->trans.rotation.y_rotation = racer->cameraYaw; if (racer->trickType || gDialogueCameraAngle) { angleVel = -(u16) gCameraObject->trans.rotation.z_rotation; @@ -3713,9 +3704,9 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac D_8011D550 = 0; gCurrentCarSteerVel = 0; D_8011D558 = 0; - prevXPos = racerObj->segment.trans.x_position; - prevYPos = racerObj->segment.trans.y_position; - prevZPos = racerObj->segment.trans.z_position; + prevXPos = racerObj->trans.x_position; + prevYPos = racerObj->trans.y_position; + prevZPos = racerObj->trans.z_position; var_v1 = gCurrentStickX - racer->steerAngle; var_a2 = (var_v1 * updateRate) >> 4; if (var_v1 != 0 && var_a2 == 0) { @@ -3742,9 +3733,9 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac racer->x_rotation_offset = 0; racer->z_rotation_offset = 0; func_800575EC(racerObj, racer); - gCurrentRacerTransform.rotation.y_rotation = racerObj->segment.trans.rotation.y_rotation; - gCurrentRacerTransform.rotation.x_rotation = racerObj->segment.trans.rotation.x_rotation; - gCurrentRacerTransform.rotation.z_rotation = racerObj->segment.trans.rotation.z_rotation; + gCurrentRacerTransform.rotation.y_rotation = racerObj->trans.rotation.y_rotation; + gCurrentRacerTransform.rotation.x_rotation = racerObj->trans.rotation.x_rotation; + gCurrentRacerTransform.rotation.z_rotation = racerObj->trans.rotation.z_rotation; gCurrentRacerTransform.x_position = 0.0f; gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; @@ -3755,7 +3746,7 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac func_800535C4(racerObj, racer); handle_car_velocity_control(racer); func_80053750(racerObj, racer, updateRateF); - racerObj->segment.object.animationID = 0; + racerObj->animationID = 0; animFrame = racer->steerAngle; animFrame = animFrame >> 1; animFrame = 40 - animFrame; @@ -3765,18 +3756,18 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac if (animFrame > 73) { animFrame = 73; } - racerObj->segment.animFrame = animFrame; + racerObj->animFrame = animFrame; steerAngle = 10; if (racer->playerIndex != PLAYER_COMPUTER) { steerAngle = racer->steerAngle; } else { obj = racer->nodeCurrent; if (obj != NULL) { - xDiff = obj->segment.trans.x_position - racerObj->segment.trans.x_position; - yDiff = obj->segment.trans.y_position - racerObj->segment.trans.y_position; - zDiff = obj->segment.trans.z_position - racerObj->segment.trans.z_position; + xDiff = obj->trans.x_position - racerObj->trans.x_position; + yDiff = obj->trans.y_position - racerObj->trans.y_position; + zDiff = obj->trans.z_position - racerObj->trans.z_position; if (sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)) < 200.0) { - nodes = obj->unk64->ai_node.nodeObj; + nodes = obj->ai_node->nodeObj; for (i = 0; i < 4; i++) { if (nodes[i] != NULL && racer->challengeMarker != nodes[i]) { racer->challengeMarker = obj; @@ -3789,9 +3780,8 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac } } else { zDiff = racer->oz3; - temp4 = - -((racer->ox3 * racerObj->segment.trans.x_position) + (zDiff * racerObj->segment.trans.z_position)); - var_f0 = (obj->segment.trans.x_position * racer->ox3) + (obj->segment.trans.z_position * zDiff) + temp4; + temp4 = -((racer->ox3 * racerObj->trans.x_position) + (zDiff * racerObj->trans.z_position)); + var_f0 = (obj->trans.x_position * racer->ox3) + (obj->trans.z_position * zDiff) + temp4; steerAngle = var_f0; steerAngle /= 5; } @@ -3801,16 +3791,16 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac racer->spinout_timer = 0; var_f0 = (steerAngle * racer->velocity) / 360; var_f2 = 1.0f; - racerObj->segment.x_velocity -= (racer->ox3 * var_f0); - racerObj->segment.y_velocity -= (racer->oy3 * var_f0); - racerObj->segment.z_velocity -= (racer->oz3 * var_f0); + racerObj->x_velocity -= (racer->ox3 * var_f0); + racerObj->y_velocity -= (racer->oy3 * var_f0); + racerObj->z_velocity -= (racer->oz3 * var_f0); if (gCurrentPlayerIndex == PLAYER_COMPUTER) { var_f2 = 1.3f; } racer->unk19A += updateRate; if (racer->unk19A > 600) { racer->vehicleID = racer->vehicleIDPrev; - racerObj->segment.trans.rotation.x_rotation = 0; + racerObj->trans.rotation.x_rotation = 0; racer->trickType = 0; if (racer->playerIndex >= 0) { objectMoved = TRUE; @@ -3821,7 +3811,7 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac racer->trickType += updateRate; if (racer->trickType > 60) { racer->vehicleID = racer->vehicleIDPrev; - racerObj->segment.trans.rotation.x_rotation = 0; + racerObj->trans.rotation.x_rotation = 0; racer->trickType = 0; } } else { @@ -3840,46 +3830,45 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac racer->steerVisualRotation += (var_v0 >> 3); racer->x_rotation_vel = 0; - racerObj->segment.x_velocity -= racer->ox1 * var_f2; - racerObj->segment.y_velocity -= racer->oy1 * var_f2; - racerObj->segment.z_velocity -= racer->oz1 * var_f2; - racerObj->segment.x_velocity -= racer->ox2 * 1.5; - racerObj->segment.y_velocity -= racer->oy2 * 1.5; - racerObj->segment.z_velocity -= racer->oz2 * 1.5; + racerObj->x_velocity -= racer->ox1 * var_f2; + racerObj->y_velocity -= racer->oy1 * var_f2; + racerObj->z_velocity -= racer->oz1 * var_f2; + racerObj->x_velocity -= racer->ox2 * 1.5; + racerObj->y_velocity -= racer->oy2 * 1.5; + racerObj->z_velocity -= racer->oz2 * 1.5; var_f0 = racer->velocity * racer->velocity * 0.002f; if (racer->velocity < 0.0f) { var_f0 = -var_f0; } - racerObj->segment.x_velocity -= racer->ox1 * var_f0; - racerObj->segment.y_velocity -= racer->oy1 * var_f0; - racerObj->segment.z_velocity -= racer->oz1 * var_f0; + racerObj->x_velocity -= racer->ox1 * var_f0; + racerObj->y_velocity -= racer->oy1 * var_f0; + racerObj->z_velocity -= racer->oz1 * var_f0; var_f0 = racer->lateral_velocity * racer->lateral_velocity * 0.01f; if (racer->lateral_velocity < 0.0f) { var_f0 = -var_f0; } - racerObj->segment.x_velocity -= racer->ox3 * var_f0; - racerObj->segment.y_velocity -= racer->oy3 * var_f0; - racerObj->segment.z_velocity -= racer->oz3 * var_f0; + racerObj->x_velocity -= racer->ox3 * var_f0; + racerObj->y_velocity -= racer->oy3 * var_f0; + racerObj->z_velocity -= racer->oz3 * var_f0; var_f0 = racer->unk34 * racer->unk34 * 0.01f; if (racer->unk34 < 0.0f) { var_f0 = -var_f0; } - racerObj->segment.x_velocity -= racer->ox2 * var_f0; - racerObj->segment.y_velocity -= racer->oy2 * var_f0; - racerObj->segment.z_velocity -= racer->oz2 * var_f0; + racerObj->x_velocity -= racer->ox2 * var_f0; + racerObj->y_velocity -= racer->oy2 * var_f0; + racerObj->z_velocity -= racer->oz2 * var_f0; racer->unk10C = 0; racer->y_rotation_vel += ((gCurrentCarSteerVel - racer->y_rotation_vel) >> 3); - racerObj->segment.trans.rotation.y_rotation = racer->steerVisualRotation + racer->y_rotation_vel; + racerObj->trans.rotation.y_rotation = racer->steerVisualRotation + racer->y_rotation_vel; racer->z_rotation_vel += ((D_8011D558 - racer->z_rotation_vel) >> 3); - racerObj->segment.trans.rotation.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; - temp2 = racerObj->segment.x_velocity; - temp3 = racerObj->segment.z_velocity; + racerObj->trans.rotation.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; + temp2 = racerObj->x_velocity; + temp3 = racerObj->z_velocity; racer->unk1D2 = 0; - moveObjResult = - move_object(racerObj, temp2 * updateRateF, racerObj->segment.y_velocity * updateRateF, temp3 * updateRateF); + moveObjResult = move_object(racerObj, temp2 * updateRateF, racerObj->y_velocity * updateRateF, temp3 * updateRateF); if ((moveObjResult) && (gCurrentPlayerIndex != -1)) { objectMoved = TRUE; } @@ -3888,13 +3877,13 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac } else { func_80054FD0(racerObj, racer, updateRate); } - var_f0 = (racerObj->segment.trans.x_position - prevXPos) * (1 / updateRateF); - racerObj->segment.y_velocity = (racerObj->segment.trans.y_position - prevYPos) * (1 / updateRateF); - temp3 = (racerObj->segment.trans.z_position - prevZPos) * (1 / updateRateF); - racerObj->segment.z_velocity = temp3; - racerObj->segment.x_velocity = var_f0; - gCurrentRacerTransform.rotation.y_rotation = -racerObj->segment.trans.rotation.y_rotation; - gCurrentRacerTransform.rotation.x_rotation = -racerObj->segment.trans.rotation.x_rotation; + var_f0 = (racerObj->trans.x_position - prevXPos) * (1 / updateRateF); + racerObj->y_velocity = (racerObj->trans.y_position - prevYPos) * (1 / updateRateF); + temp3 = (racerObj->trans.z_position - prevZPos) * (1 / updateRateF); + racerObj->z_velocity = temp3; + racerObj->x_velocity = var_f0; + gCurrentRacerTransform.rotation.y_rotation = -racerObj->trans.rotation.y_rotation; + gCurrentRacerTransform.rotation.x_rotation = -racerObj->trans.rotation.x_rotation; gCurrentRacerTransform.rotation.z_rotation = 0; gCurrentRacerTransform.scale = 1.0f; gCurrentRacerTransform.x_position = 0.0f; @@ -3902,14 +3891,14 @@ void func_8004CC20(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; mtxf_from_inverse_transform(&mtx, &gCurrentRacerTransform); - mtxf_transform_point(&mtx, racerObj->segment.x_velocity, racerObj->segment.y_velocity, racerObj->segment.z_velocity, + mtxf_transform_point(&mtx, racerObj->x_velocity, racerObj->y_velocity, racerObj->z_velocity, &racer->lateral_velocity, &racer->unk34, &racer->velocity); second_racer_camera_update(racerObj, racer, CAMERA_LOOP, updateRateF); if (racerObj->attachPoints != NULL && racer->vehicleIDPrev == VEHICLE_CAR && racerObj->attachPoints->count >= 4) { obj = racerObj->attachPoints->obj[2]; - obj->segment.trans.rotation.y_rotation = 0; + obj->trans.rotation.y_rotation = 0; obj = racerObj->attachPoints->obj[3]; - obj->segment.trans.rotation.y_rotation = 0; + obj->trans.rotation.y_rotation = 0; } if (objectMoved) { racer->vehicleID = racer->vehicleIDPrev; @@ -3962,20 +3951,20 @@ void update_camera_loop(f32 updateRateF, Object *obj, Object_Racer *racer) { mtxf_from_transform(&mtx, &gCurrentRacerTransform); mtxf_transform_point(&mtx, 0.0f, 0.0f, gCameraObject->boomLength, &deltaX, &deltaY, &deltaZ); - gCameraObject->trans.x_position = obj->segment.trans.x_position + deltaX; - gCameraObject->trans.y_position = obj->segment.trans.y_position + deltaY; - gCameraObject->trans.z_position = obj->segment.trans.z_position + deltaZ; + gCameraObject->trans.x_position = obj->trans.x_position + deltaX; + gCameraObject->trans.y_position = obj->trans.y_position + deltaY; + gCameraObject->trans.z_position = obj->trans.z_position + deltaZ; mtxf_transform_point(&mtx, 0.0f, sins_f(0x800) * gCameraObject->boomLength, 0.0f, &deltaX, &deltaY, &deltaZ); gCameraObject->trans.x_position += deltaX; gCameraObject->trans.y_position += deltaY; gCameraObject->trans.z_position += deltaZ; - angleDiff = (u16) (-obj->segment.trans.rotation.z_rotation); + angleDiff = (u16) (-obj->trans.rotation.z_rotation); angle = angleDiff - ((u16) gCameraObject->trans.rotation.z_rotation); WRAP(angle, -0x8000, 0x8000); gCameraObject->trans.rotation.z_rotation += ((angle * UpdateRate) >> 4); - angleDiff = -obj->segment.trans.rotation.x_rotation; + angleDiff = -obj->trans.rotation.x_rotation; angle = angleDiff - (u16) gCameraObject->trans.rotation.x_rotation; WRAP(angle, -0x8000, 0x8000); gCameraObject->trans.rotation.x_rotation += ((angle * UpdateRate) >> 4); @@ -4003,22 +3992,22 @@ void update_carpet(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (is_taj_challenge() && racer->vehicleID == VEHICLE_CARPET) { obj->interactObj->flags = INTERACT_FLAGS_NONE; } - animFrame = obj->segment.animFrame; + animFrame = obj->animFrame; racer->vehicleID = VEHICLE_CARPET; func_80049794(updateRate, updateRateF, obj, racer); racer->vehicleID = racer->vehicleIDPrev; - obj->segment.object.animationID = 0; + obj->animationID = 0; if (racer->vehicleID == VEHICLE_CARPET) { if (racer->unk154 != NULL) { - racer->unk154->segment.trans.x_position = obj->segment.trans.x_position; - racer->unk154->segment.trans.y_position = obj->segment.trans.y_position; - racer->unk154->segment.trans.z_position = obj->segment.trans.z_position; - racer->unk154->segment.object.segmentID = obj->segment.object.segmentID; - racer->unk154->segment.trans.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - racer->unk154->segment.trans.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; - racer->unk154->segment.trans.rotation.z_rotation = obj->segment.trans.rotation.z_rotation; - obj->segment.object.animationID = 0; - obj->segment.animFrame = animFrame + updateRate; + racer->unk154->trans.x_position = obj->trans.x_position; + racer->unk154->trans.y_position = obj->trans.y_position; + racer->unk154->trans.z_position = obj->trans.z_position; + racer->unk154->segmentID = obj->segmentID; + racer->unk154->trans.rotation.y_rotation = obj->trans.rotation.y_rotation; + racer->unk154->trans.rotation.x_rotation = obj->trans.rotation.x_rotation; + racer->unk154->trans.rotation.z_rotation = obj->trans.rotation.z_rotation; + obj->animationID = 0; + obj->animFrame = animFrame + updateRate; func_80061C0C(obj); } } @@ -4034,10 +4023,10 @@ void obj_init_racer(Object *obj, LevelObjectEntry_Racer *racer) { s32 i; unused_8011D53C = 0; - tempRacer = &obj->unk64->racer; - obj->segment.trans.rotation.y_rotation = racer->angleY; - obj->segment.trans.rotation.x_rotation = racer->angleX; - obj->segment.trans.rotation.z_rotation = racer->angleZ; + tempRacer = obj->racer; + obj->trans.rotation.y_rotation = racer->angleY; + obj->trans.rotation.x_rotation = racer->angleX; + obj->trans.rotation.z_rotation = racer->angleZ; player = racer->playerIndex; tempRacer->countLap = 0; tempRacer->stretch_height = 1.0f; @@ -4052,29 +4041,29 @@ void obj_init_racer(Object *obj, LevelObjectEntry_Racer *racer) { } else { tempRacer->playerIndex = PLAYER_COMPUTER; } - tempRacer->steerVisualRotation = obj->segment.trans.rotation.y_rotation; - tempRacer->x_rotation_vel = obj->segment.trans.rotation.z_rotation; + tempRacer->steerVisualRotation = obj->trans.rotation.y_rotation; + tempRacer->x_rotation_vel = obj->trans.rotation.z_rotation; tempRacer->unkC4 = 0.5f; if (1) {} // Fakematch tempRacer->cameraYaw = tempRacer->steerVisualRotation; - tempRacer->unkD8.x = obj->segment.trans.x_position; - tempRacer->unkD8.y = obj->segment.trans.y_position + 30.0f; - tempRacer->unkD8.z = obj->segment.trans.z_position; - tempRacer->unkE4.x = obj->segment.trans.x_position; - tempRacer->unkE4.y = obj->segment.trans.y_position + 30.0f; - tempRacer->unkE4.z = obj->segment.trans.z_position; - tempRacer->unkF0.x = obj->segment.trans.x_position; - tempRacer->unkF0.y = obj->segment.trans.y_position + 30.0f; - tempRacer->unkF0.z = obj->segment.trans.z_position; - tempRacer->unkFC.x = obj->segment.trans.x_position; - tempRacer->unkFC.y = obj->segment.trans.y_position + 30.0f; - tempRacer->unkFC.z = obj->segment.trans.z_position; - tempRacer->prev_x_position = obj->segment.trans.x_position; - tempRacer->prev_y_position = obj->segment.trans.y_position; - tempRacer->prev_z_position = obj->segment.trans.z_position; - obj->interactObj->x_position = obj->segment.trans.x_position; - obj->interactObj->y_position = obj->segment.trans.y_position; - obj->interactObj->z_position = obj->segment.trans.z_position; + tempRacer->unkD8.x = obj->trans.x_position; + tempRacer->unkD8.y = obj->trans.y_position + 30.0f; + tempRacer->unkD8.z = obj->trans.z_position; + tempRacer->unkE4.x = obj->trans.x_position; + tempRacer->unkE4.y = obj->trans.y_position + 30.0f; + tempRacer->unkE4.z = obj->trans.z_position; + tempRacer->unkF0.x = obj->trans.x_position; + tempRacer->unkF0.y = obj->trans.y_position + 30.0f; + tempRacer->unkF0.z = obj->trans.z_position; + tempRacer->unkFC.x = obj->trans.x_position; + tempRacer->unkFC.y = obj->trans.y_position + 30.0f; + tempRacer->unkFC.z = obj->trans.z_position; + tempRacer->prev_x_position = obj->trans.x_position; + tempRacer->prev_y_position = obj->trans.y_position; + tempRacer->prev_z_position = obj->trans.z_position; + obj->interactObj->x_position = obj->trans.x_position; + obj->interactObj->y_position = obj->trans.y_position; + obj->interactObj->z_position = obj->trans.z_position; tempRacer->groundedWheels = 3; tempRacer->racerOrder = 1; tempRacer->racePosition = 1; @@ -4160,26 +4149,26 @@ void update_player_racer(Object *obj, s32 updateRate) { gCurrentSurfaceType = SURFACE_DEFAULT; gRaceStartTimer = get_race_countdown(); updateRateF = updateRate; - tempRacer = &obj->unk64->racer; + tempRacer = obj->racer; // Cap all of the velocities on the different axes. // Unfortunately, Rareware didn't appear to use a clamp macro here, which would've saved a lot of real estate. - if (obj->segment.x_velocity > 50.0) { - obj->segment.x_velocity = 50.0f; + if (obj->x_velocity > 50.0) { + obj->x_velocity = 50.0f; } - if (obj->segment.y_velocity > 50.0) { - obj->segment.y_velocity = 50.0f; + if (obj->y_velocity > 50.0) { + obj->y_velocity = 50.0f; } - if (obj->segment.z_velocity > 50.0) { - obj->segment.z_velocity = 50.0f; + if (obj->z_velocity > 50.0) { + obj->z_velocity = 50.0f; } - if (obj->segment.x_velocity < -50.0) { - obj->segment.x_velocity = -50.0f; + if (obj->x_velocity < -50.0) { + obj->x_velocity = -50.0f; } - if (obj->segment.y_velocity < -50.0) { - obj->segment.y_velocity = -50.0f; + if (obj->y_velocity < -50.0) { + obj->y_velocity = -50.0f; } - if (obj->segment.z_velocity < -50.0) { - obj->segment.z_velocity = -50.0f; + if (obj->z_velocity < -50.0) { + obj->z_velocity = -50.0f; } if (tempRacer->velocity > 50.0) { tempRacer->velocity = 50.0f; @@ -4225,8 +4214,7 @@ void update_player_racer(Object *obj, s32 updateRate) { // Print player 1's coordinates to the screen if the debug cheat is enabled. if (gRaceStartTimer == 0 && tempRacer->playerIndex == PLAYER_ONE) { if (get_filtered_cheats() & CHEAT_PRINT_COORDS) { - render_printf(gRacerDebugCoords, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position); + render_printf(gRacerDebugCoords, obj->trans.x_position, obj->trans.y_position, obj->trans.z_position); } } set_render_printf_background_colour(0, 0, 0, 128); @@ -4273,15 +4261,15 @@ void update_player_racer(Object *obj, s32 updateRate) { tempRacer->unk84 -= tempRacer->unk84 * 0.0625 * updateRateF; tempRacer->unk88 -= tempRacer->unk88 * 0.0625 * updateRateF; } - gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(obj->segment.header->unk5C); - D_8011D568 = (f32 *) get_misc_asset(obj->segment.header->unk5D); + gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(obj->header->unk5C); + D_8011D568 = (f32 *) get_misc_asset(obj->header->unk5D); - if (obj->segment.y_velocity < 4.0 && (tempRacer->groundedWheels > 2 || tempRacer->buoyancy != 0.0)) { + if (obj->y_velocity < 4.0 && (tempRacer->groundedWheels > 2 || tempRacer->buoyancy != 0.0)) { tempRacer->unk1F1 = 0; } - xTemp = obj->segment.trans.x_position; - yTemp = obj->segment.trans.y_position; - zTemp = obj->segment.trans.z_position; + xTemp = obj->trans.x_position; + yTemp = obj->trans.y_position; + zTemp = obj->trans.z_position; if (tempRacer->unk1B2 > 0) { tempRacer->unk1B2 -= updateRate; if (tempRacer->unk1B2 < 0) { @@ -4337,12 +4325,12 @@ void update_player_racer(Object *obj, s32 updateRate) { } if (tempRacer->bubbleTrapTimer > 0) { tempRacer->bubbleTrapTimer -= updateRate; - tempRacer->velocity *= 0.9f; //!@Delta - obj->segment.x_velocity *= 0.87f; //!@Delta - if (obj->segment.y_velocity > 2.0f) { - obj->segment.y_velocity = 2.0f; + tempRacer->velocity *= 0.9f; //!@Delta + obj->x_velocity *= 0.87f; //!@Delta + if (obj->y_velocity > 2.0f) { + obj->y_velocity = 2.0f; } - obj->segment.z_velocity *= 0.87f; //!@Delta + obj->z_velocity *= 0.87f; //!@Delta } if (tempRacer->unk206 > 0) { tempRacer->unk18A = tempRacer->unk206; @@ -4381,8 +4369,8 @@ void update_player_racer(Object *obj, s32 updateRate) { if (gCurrentPlayerIndex != PLAYER_COMPUTER) { gCameraObject = cam_get_active_camera_no_cutscenes(); } - gRacerWaveCount = func_8002B0F4(obj->segment.object.segmentID, obj->segment.trans.x_position, - obj->segment.trans.z_position, &gRacerCurrentWave); + gRacerWaveCount = + func_8002B0F4(obj->segmentID, obj->trans.x_position, obj->trans.z_position, &gRacerCurrentWave); if (gRacerWaveCount) { for (i = 0; i < gRacerWaveCount; i++) { if (gRacerCurrentWave[i]->type == WATER_UNK_F) { @@ -4394,11 +4382,11 @@ void update_player_racer(Object *obj, s32 updateRate) { } if (tempRacer->vehicleID != VEHICLE_HOVERCRAFT) { waterHeight = -10000.0f; - gRacerWaveType = get_wave_properties(obj->segment.trans.y_position, &waterHeight, &gCurrentRacerWaterPos); + gRacerWaveType = get_wave_properties(obj->trans.y_position, &waterHeight, &gCurrentRacerWaterPos); if (gRacerWaveType) { - if (obj->segment.trans.y_position - 5.0f < waterHeight) { + if (obj->trans.y_position - 5.0f < waterHeight) { tempRacer->waterTimer = 5; - tempRacer->buoyancy = waterHeight - (obj->segment.trans.y_position - 5.0f); + tempRacer->buoyancy = waterHeight - (obj->trans.y_position - 5.0f); } else { tempRacer->buoyancy = 0.0f; } @@ -4409,7 +4397,7 @@ void update_player_racer(Object *obj, s32 updateRate) { tempRacer->buoyancy = 0.0f; } } - if (tempRacer->waterTimer > 0 && obj->segment.trans.y_position < waterHeight + 5.0f) { + if (tempRacer->waterTimer > 0 && obj->trans.y_position < waterHeight + 5.0f) { obj->interactObj->flags |= INTERACT_FLAGS_UNK_0010; } else { obj->interactObj->flags &= ~INTERACT_FLAGS_UNK_0010; @@ -4517,26 +4505,22 @@ void update_player_racer(Object *obj, s32 updateRate) { newObject.size = sizeof(LevelObjectEntryCommon); tempRacer->challengeMarker = spawn_object(&newObject, OBJECT_SPAWN_UNK01); if (tempRacer->challengeMarker) { - tempRacer->challengeMarker->segment.level_entry = NULL; - tempRacer->challengeMarker->segment.object.opacity = 128; + tempRacer->challengeMarker->level_entry = NULL; + tempRacer->challengeMarker->opacity = 128; } } if (tempRacer->challengeMarker) { - tempRacer->challengeMarker->segment.trans.x_position = - checkpointNode->obj->segment.trans.x_position; - tempRacer->challengeMarker->segment.trans.y_position = - checkpointNode->obj->segment.trans.y_position; + tempRacer->challengeMarker->trans.x_position = checkpointNode->obj->trans.x_position; + tempRacer->challengeMarker->trans.y_position = checkpointNode->obj->trans.y_position; if (tempRacer->vehicleID == VEHICLE_CAR) { - tempRacer->challengeMarker->segment.trans.y_position -= 30.0; + tempRacer->challengeMarker->trans.y_position -= 30.0; } - tempRacer->challengeMarker->segment.trans.z_position = - checkpointNode->obj->segment.trans.z_position; - tempRacer->challengeMarker->segment.trans.rotation.y_rotation = - checkpointNode->obj->segment.trans.rotation.y_rotation; - tempRacer->challengeMarker->segment.trans.rotation.x_rotation = - checkpointNode->obj->segment.trans.rotation.x_rotation; - tempRacer->challengeMarker->segment.object.segmentID = - checkpointNode->obj->segment.object.segmentID; + tempRacer->challengeMarker->trans.z_position = checkpointNode->obj->trans.z_position; + tempRacer->challengeMarker->trans.rotation.y_rotation = + checkpointNode->obj->trans.rotation.y_rotation; + tempRacer->challengeMarker->trans.rotation.x_rotation = + checkpointNode->obj->trans.rotation.x_rotation; + tempRacer->challengeMarker->segmentID = checkpointNode->obj->segmentID; } } } @@ -4552,7 +4536,7 @@ void update_player_racer(Object *obj, s32 updateRate) { } if (is_taj_challenge()) { if (tempRacer->challengeMarker) { - tempRacer->challengeMarker->segment.animFrame += 8 * updateRate; + tempRacer->challengeMarker->animFrame += 8 * updateRate; } if (tempRacer->unk1BA > 400 || tempRacer->unk1BA < -400) { mode_end_taj_race(CHALLENGE_END_OOB); @@ -4614,12 +4598,12 @@ void update_player_racer(Object *obj, s32 updateRate) { if (tempRacer->shieldTimer > 0) { if (tempRacer->shieldTimer > 60) { if (tempRacer->shieldSoundMask) { - audspat_point_set_position(tempRacer->shieldSoundMask, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position); + audspat_point_set_position(tempRacer->shieldSoundMask, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position); } else if (tempRacer->vehicleSound) { - audspat_play_sound_at_position(SOUND_SHIELD, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_1, &tempRacer->shieldSoundMask); + audspat_play_sound_at_position(SOUND_SHIELD, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_1, + &tempRacer->shieldSoundMask); } } else if (tempRacer->shieldSoundMask) { audspat_point_stop(tempRacer->shieldSoundMask); @@ -4631,32 +4615,31 @@ void update_player_racer(Object *obj, s32 updateRate) { } } if (tempRacer->bananaSoundMask) { - audspat_point_set_position(tempRacer->bananaSoundMask, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position); + audspat_point_set_position(tempRacer->bananaSoundMask, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position); } if (is_in_time_trial() && tempRacer->playerIndex == PLAYER_ONE && gRaceStartTimer == 0) { timetrial_ghost_write(obj, updateRate); } if (tempRacer->soundMask) { - audspat_point_set_position(tempRacer->soundMask, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position); + audspat_point_set_position(tempRacer->soundMask, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position); } gRacerInputBlocked = 0; if (tempRacer->unk150 && gRaceStartTimer == 0) { s8 *yAsset; - tempRacer->unk150->segment.trans.x_position = obj->segment.trans.x_position; + tempRacer->unk150->trans.x_position = obj->trans.x_position; yAsset = (s8 *) get_misc_asset(ASSET_MISC_0); - tempRacer->unk150->segment.trans.y_position = - obj->segment.trans.y_position + yAsset[tempRacer->characterId]; - tempRacer->unk150->segment.trans.z_position = obj->segment.trans.z_position; - tempRacer->unk150->segment.trans.scale = obj->segment.object.distanceToCamera / 265.0f; - if (obj->segment.object.distanceToCamera < 1500.0 || get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) { + tempRacer->unk150->trans.y_position = obj->trans.y_position + yAsset[tempRacer->characterId]; + tempRacer->unk150->trans.z_position = obj->trans.z_position; + tempRacer->unk150->trans.scale = obj->distanceToCamera / 265.0f; + if (obj->distanceToCamera < 1500.0 || get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) { tempObj = tempRacer->unk150; - tempObj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + tempObj->trans.flags |= OBJ_FLAGS_INVISIBLE; } - if (tempRacer->unk150->segment.trans.scale < 1.0) { - tempRacer->unk150->segment.trans.scale = 1.0f; + if (tempRacer->unk150->trans.scale < 1.0) { + tempRacer->unk150->trans.scale = 1.0f; } tempRacer->unk150 = NULL; } @@ -4668,18 +4651,18 @@ void update_player_racer(Object *obj, s32 updateRate) { } else { tempRacer->delaySoundTimer = 0; if (tempRacer->playerIndex == PLAYER_COMPUTER) { - audspat_play_sound_at_position(tempRacer->delaySoundID, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, + audspat_play_sound_at_position(tempRacer->delaySoundID, obj->trans.x_position, + obj->trans.y_position, obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } else { - sound_play_spatial(tempRacer->delaySoundID, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, NULL); + sound_play_spatial(tempRacer->delaySoundID, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, NULL); } tempRacer->delaySoundID = SOUND_NONE; } } if (header->race_type & RACETYPE_CHALLENGE && header->race_type != RACETYPE_CHALLENGE_EGGS) { - tempRacer->elevation = obj_elevation(obj->segment.trans.y_position); + tempRacer->elevation = obj_elevation(obj->trans.y_position); } else { tempRacer->elevation = ELEVATION_LOW; } @@ -4764,9 +4747,9 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac D_8011D550 = 0; gCurrentCarSteerVel = 0; D_8011D558 = 0; - spA8 = racerObj->segment.trans.x_position; - spA4 = racerObj->segment.trans.y_position; - spA0 = racerObj->segment.trans.z_position; + spA8 = racerObj->trans.x_position; + spA4 = racerObj->trans.y_position; + spA0 = racerObj->trans.z_position; if (racer->drift_direction != 0) { if (racer->drift_direction < 0 && gCurrentStickX >= 26) { racer->unk16E += updateRate; @@ -4823,7 +4806,7 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac } if (racer->buoyancy != 0.0f && racer->vehicleIDPrev != VEHICLE_BUBBLER) { spB8 = racer->buoyancy - 10.0; - racerObj->segment.y_velocity += spB8 * 0.065 * updateRateF; + racerObj->y_velocity += spB8 * 0.065 * updateRateF; } currentLevelHeader = get_current_level_header(); if ((racer->buoyancy != 0.0 && currentLevelHeader->unk2 != 0) || gCurrentSurfaceType == SURFACE_FROZEN_WATER) { @@ -4838,14 +4821,14 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac } else { racer->checkpoint_distance += 0.1; } - spB8 -= racerObj->segment.trans.x_position; - spB4 -= racerObj->segment.trans.z_position; + spB8 -= racerObj->trans.x_position; + spB4 -= racerObj->trans.z_position; spB0 = sqrtf((spB8 * spB8) + (spB4 * spB4)); spB8 /= spB0; spB4 /= spB0; - racerObj->segment.x_velocity = spB8 * 4.0f; - racerObj->segment.z_velocity = spB4 * 4.0f; - racerObj->segment.y_velocity = 9.5f; + racerObj->x_velocity = spB8 * 4.0f; + racerObj->z_velocity = spB4 * 4.0f; + racerObj->y_velocity = 9.5f; racer->unk1F0 = 1; } else if (racer->groundedWheels >= 3) { racer->unk1F0 = 0; @@ -4869,13 +4852,13 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac var_v1 = -0x2EE; } racer->y_rotation_vel += (var_v1 * updateRate); - racerObj->segment.trans.rotation.s[0] = racer->steerVisualRotation + racer->y_rotation_vel; + racerObj->trans.rotation.s[0] = racer->steerVisualRotation + racer->y_rotation_vel; racer->z_rotation_vel += (((D_8011D558 - racer->z_rotation_vel) * updateRate) >> 4); - racerObj->segment.trans.rotation.s[2] = racer->x_rotation_vel + racer->z_rotation_vel; + racerObj->trans.rotation.s[2] = racer->x_rotation_vel + racer->z_rotation_vel; if (D_8011D550) { if (gCurrentPlayerIndex != PLAYER_COMPUTER && D_8011D550 != SOUND_STOMP5) { - sound_play_spatial(D_8011D550, racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, - racerObj->segment.trans.z_position, &racer->unk21C); + sound_play_spatial(D_8011D550, racerObj->trans.x_position, racerObj->trans.y_position, + racerObj->trans.z_position, &racer->unk21C); sound_volume_set_relative(D_8011D550, racer->unk21C, D_8011D552); } racer->stretch_height_cap = (1.0 - ((f32) (D_8011D552 - 40) * 0.004)); @@ -4890,16 +4873,16 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; mtxf_from_inverse_transform(&sp60, &gCurrentRacerTransform); - mtxf_transform_point(&sp60, racer->lateral_velocity, 0.0f, racer->velocity, &racerObj->segment.x_velocity, - &spBC, &racerObj->segment.z_velocity); + mtxf_transform_point(&sp60, racer->lateral_velocity, 0.0f, racer->velocity, &racerObj->x_velocity, &spBC, + &racerObj->z_velocity); } if (racer->magnetTimer != 0) { - racerObj->segment.x_velocity = gRacerMagnetVelX; - racerObj->segment.z_velocity = gRacerMagnetVelZ; + racerObj->x_velocity = gRacerMagnetVelX; + racerObj->z_velocity = gRacerMagnetVelZ; } if (racer->approachTarget == NULL) { - spB8 = racerObj->segment.x_velocity; - spB4 = racerObj->segment.z_velocity; + spB8 = racerObj->x_velocity; + spB4 = racerObj->z_velocity; if (racer->unk1D2 != 0) { spB8 += racer->unk11C; spB4 += racer->unk120; @@ -4921,8 +4904,8 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac spB8 += racer->unk84; spB4 += racer->unk88; } - objectMoved = move_object(racerObj, spB8 * updateRateF, racerObj->segment.y_velocity * updateRateF, - spB4 * updateRateF); + objectMoved = + move_object(racerObj, spB8 * updateRateF, racerObj->y_velocity * updateRateF, spB4 * updateRateF); if (objectMoved && gCurrentPlayerIndex != PLAYER_COMPUTER) { playerObjectHasMoved = TRUE; } @@ -4935,12 +4918,12 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac func_80054FD0(racerObj, racer, updateRate); } spBC = 1.0f / updateRateF; - spB8 = (((racerObj->segment.trans.x_position - spA8) - D_8011D548) * spBC) - racer->unk84; - racerObj->segment.y_velocity = (racerObj->segment.trans.y_position - spA4) * spBC; - spB4 = (((racerObj->segment.trans.z_position - spA0) - D_8011D54C) * spBC) - racer->unk88; + spB8 = (((racerObj->trans.x_position - spA8) - D_8011D548) * spBC) - racer->unk84; + racerObj->y_velocity = (racerObj->trans.y_position - spA4) * spBC; + spB4 = (((racerObj->trans.z_position - spA0) - D_8011D54C) * spBC) - racer->unk88; gCurrentRacerTransform.rotation.s[0] = -(racer->steerVisualRotation + racer->unk10C); - gCurrentRacerTransform.rotation.s[1] = -racerObj->segment.trans.rotation.s[1]; - gCurrentRacerTransform.rotation.s[2] = -racerObj->segment.trans.rotation.s[2]; + gCurrentRacerTransform.rotation.s[1] = -racerObj->trans.rotation.s[1]; + gCurrentRacerTransform.rotation.s[2] = -racerObj->trans.rotation.s[2]; gCurrentRacerTransform.x_position = 0.0f; gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; @@ -5018,20 +5001,20 @@ void racer_approach_object(Object *obj, Object_Racer *racer, f32 divisor) { f32 diffY; f32 diffZ; - obj->segment.object.animationID = 0; - obj->segment.animFrame = 40; - diffX = racer->approachTarget->segment.trans.x_position - obj->segment.trans.x_position; - diffY = racer->approachTarget->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = racer->approachTarget->segment.trans.z_position - obj->segment.trans.z_position; + obj->animationID = 0; + obj->animFrame = 40; + diffX = racer->approachTarget->trans.x_position - obj->trans.x_position; + diffY = racer->approachTarget->trans.y_position - obj->trans.y_position; + diffZ = racer->approachTarget->trans.z_position - obj->trans.z_position; move_object(obj, diffX, diffY, diffZ); - obj->segment.trans.rotation.y_rotation = racer->approachTarget->segment.trans.rotation.y_rotation; - obj->segment.trans.rotation.x_rotation = racer->approachTarget->segment.trans.rotation.x_rotation; - obj->segment.trans.rotation.z_rotation = racer->approachTarget->segment.trans.rotation.z_rotation; - racer->x_rotation_vel = obj->segment.trans.rotation.z_rotation; - racer->steerVisualRotation = obj->segment.trans.rotation.y_rotation; - obj->segment.x_velocity = diffX / divisor; - obj->segment.y_velocity = diffY / divisor; - obj->segment.z_velocity = diffZ / divisor; + obj->trans.rotation.y_rotation = racer->approachTarget->trans.rotation.y_rotation; + obj->trans.rotation.x_rotation = racer->approachTarget->trans.rotation.x_rotation; + obj->trans.rotation.z_rotation = racer->approachTarget->trans.rotation.z_rotation; + racer->x_rotation_vel = obj->trans.rotation.z_rotation; + racer->steerVisualRotation = obj->trans.rotation.y_rotation; + obj->x_velocity = diffX / divisor; + obj->y_velocity = diffY / divisor; + obj->z_velocity = diffZ / divisor; racer->velocity = 0.0f; racer->unk1F2 = 0; racer->lateral_velocity = 0.0f; @@ -5133,8 +5116,8 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer->carBobZ = -racer->pitch * tempVel; if (obj->attachPoints != NULL) { for (i = 0; i < obj->attachPoints->count; i++) { - tempVel = 1.0f / obj->segment.trans.scale; - attachmentTrans = &obj->attachPoints->obj[i]->segment.trans; + tempVel = 1.0f / obj->trans.scale; + attachmentTrans = &obj->attachPoints->obj[i]->trans; attachmentTrans->x_position = (f32) (-racer->carBobX * tempVel); attachmentTrans->y_position = (f32) (-racer->carBobY * tempVel); attachmentTrans->z_position = (f32) (-racer->carBobZ * tempVel); @@ -5278,12 +5261,11 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } if (racer->drift_direction != 0 || racer->drifting != 0 || racer->unk1FB != 0) { if (racer->unk10 == 0) { - sound_play_spatial(SOUND_CAR_SLIDE, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, &racer->unk10); + sound_play_spatial(SOUND_CAR_SLIDE, obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, + &racer->unk10); } else { - audspat_calculate_echo((SoundHandle) (s32) racer->unk10, obj->segment.trans.x_position, - obj->segment.trans.y_position, - obj->segment.trans.z_position); // type cast required to match + audspat_calculate_echo((SoundHandle) (s32) racer->unk10, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position); // type cast required to match } if (racer->unk14) { sndp_stop((SoundHandle) (s32) racer->unk14); // type cast required to match @@ -5545,7 +5527,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } } traction = gCurrentRacerWeightStat; - obj->segment.y_velocity -= traction * updateRateF; + obj->y_velocity -= traction * updateRateF; if (gDialogueCameraAngle != 0) { traction = 0.0f; } @@ -5666,18 +5648,18 @@ s32 turn_head_towards_object(Object *obj, Object_Racer *racer, Object *targetObj s32 ret; ret = FALSE; - diffX = targetObj->segment.trans.x_position - obj->segment.trans.x_position; - diffZ = targetObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = targetObj->trans.x_position - obj->trans.x_position; + diffZ = targetObj->trans.z_position - obj->trans.z_position; if ((diffX * diffX) + (diffZ * diffZ) < distance) { - intendedAngle = (arctan2_f(diffX, diffZ) - (obj->segment.trans.rotation.y_rotation & 0xFFFF)) + 0x8000; + intendedAngle = (arctan2_f(diffX, diffZ) - (obj->trans.rotation.y_rotation & 0xFFFF)) + 0x8000; WRAP(intendedAngle, -0x8000, 0x8000); CLAMP(intendedAngle, -0x3000, 0x3000); racer->headAngleTarget = intendedAngle; if ((racer->miscAnimCounter & 0x3F) <= 30) { racer->headAngleTarget = 0; } - racer = &targetObj->unk64->racer; - intendedAngle = arctan2_f(diffX, diffZ) - (obj->segment.trans.rotation.y_rotation & 0xFFFF); + racer = targetObj->racer; + intendedAngle = arctan2_f(diffX, diffZ) - (obj->trans.rotation.y_rotation & 0xFFFF); WRAP(intendedAngle, -0x8000, 0x8000); CLAMP(intendedAngle, -0x3000, 0x3000); racer->headAngleTarget = intendedAngle; @@ -5736,7 +5718,7 @@ void func_8005250C(Object *obj, Object_Racer *racer, s32 updateRate) { if (angleVel > 73) { angleVel = 73; } - newAngle = angleVel - obj->segment.animFrame; + newAngle = angleVel - obj->animFrame; angleVel = 0; if (newAngle > 0) { angleVel = updateRate * 3; @@ -5750,8 +5732,8 @@ void func_8005250C(Object *obj, Object_Racer *racer, s32 updateRate) { angleVel = newAngle; } } - obj->segment.animFrame += angleVel; - obj->segment.object.animationID = 0; + obj->animFrame += angleVel; + obj->animationID = 0; if (angleVel) {} // Fakematch if (racer->unk1F3 & 4) { racer->unk1F2 = 3; @@ -5802,59 +5784,59 @@ void func_80052988(Object *obj, Object_Racer *racer, s32 action, s32 arg3, s32 d arg5 *= arg7; if (gCurrentPlayerIndex == PLAYER_COMPUTER && action >= 3) { - obj->segment.object.animationID = 0; + obj->animationID = 0; racer->unk1F2 = 0; - } else if (obj->segment.object.animationID == 0) { + } else if (obj->animationID == 0) { if (flags & 1) { - if (obj->segment.animFrame > 40) { - obj->segment.animFrame -= arg7 * 4; - if (obj->segment.animFrame <= 40) { - obj->segment.object.animationID = action; - obj->segment.animFrame = arg3; + if (obj->animFrame > 40) { + obj->animFrame -= arg7 * 4; + if (obj->animFrame <= 40) { + obj->animationID = action; + obj->animFrame = arg3; } } else { - obj->segment.animFrame += arg7 * 4; - if (obj->segment.animFrame >= 40) { - obj->segment.object.animationID = action; - obj->segment.animFrame = arg3; + obj->animFrame += arg7 * 4; + if (obj->animFrame >= 40) { + obj->animationID = action; + obj->animFrame = arg3; } } } else { - obj->segment.object.animationID = action; - obj->segment.animFrame = arg3; + obj->animationID = action; + obj->animFrame = arg3; racer->unk1F3 &= ~0x80; } - } else if (obj->segment.object.animationID == action) { + } else if (obj->animationID == action) { if (flags & 2) { if (racer->unk1F3 & 0x80) { - obj->segment.animFrame -= arg5; //!@Delta - if (obj->segment.animFrame <= 0) { - obj->segment.object.animationID = 0; + obj->animFrame -= arg5; //!@Delta + if (obj->animFrame <= 0) { + obj->animationID = 0; racer->unk1F2 = 0; - obj->segment.animFrame = 40; + obj->animFrame = 40; racer->unk1F3 = 0; } } else { - obj->segment.animFrame += arg5; //!@Delta - if (obj->segment.animFrame >= duration) { - obj->segment.animFrame = duration - 1; + obj->animFrame += arg5; //!@Delta + if (obj->animFrame >= duration) { + obj->animFrame = duration - 1; if (!(flags & 4)) { racer->unk1F3 |= 0x80; } } } } else { - obj->segment.animFrame += arg5; //!@Delta - if (obj->segment.animFrame >= duration) { - obj->segment.object.animationID = 0; + obj->animFrame += arg5; //!@Delta + if (obj->animFrame >= duration) { + obj->animationID = 0; racer->unk1F2 = 0; - obj->segment.animFrame = 40; + obj->animFrame = 40; racer->unk1F3 = 0; } } } else { - obj->segment.animFrame = arg3; - obj->segment.object.animationID = action; + obj->animFrame = arg3; + obj->animationID = action; } } @@ -5901,7 +5883,7 @@ void racer_spinout_car(Object *obj, Object_Racer *racer, s32 updateRate, f32 upd } } gCurrentCarSteerVel = racer->y_rotation_vel; - obj->segment.y_velocity -= gCurrentRacerWeightStat * updateRateF; + obj->y_velocity -= gCurrentRacerWeightStat * updateRateF; gCurrentStickX = 0; racer->steerAngle = 0; } @@ -5945,11 +5927,11 @@ void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32 updateR racer->unk1E8 = racer->steerAngle; } if (racer->buoyancy != 0.0) { - if (obj->segment.y_velocity > 2.0) { - obj->segment.y_velocity = 2.0f; + if (obj->y_velocity > 2.0) { + obj->y_velocity = 2.0f; } - if (obj->segment.y_velocity < -2.0) { - obj->segment.y_velocity = -2.0f; + if (obj->y_velocity < -2.0) { + obj->y_velocity = -2.0f; } racer->unk1E8 = racer->steerAngle; if (gCurrentRacerInput & A_BUTTON) { @@ -5961,7 +5943,7 @@ void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32 updateR canSteer = TRUE; racer->lateral_velocity *= 0.87; //!@Delta racer->velocity *= 0.87; //!@Delta - obj->segment.y_velocity *= 0.9; //!@Delta + obj->y_velocity *= 0.9; //!@Delta rotate_racer_in_water(obj, racer, &gCurrentRacerWaterPos, gRacerWaveType, updateRate, gCurrentStickX, 6.0f); } if (racer->playerIndex == PLAYER_COMPUTER) { @@ -5988,7 +5970,7 @@ void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32 updateR if (yStick < 50 && yStick > -50) { yStick = 0; } - obj->segment.y_velocity -= (obj->segment.y_velocity * 0.025) * updateRateF; + obj->y_velocity -= (obj->y_velocity * 0.025) * updateRateF; weight = gCurrentRacerWeightStat; if (racer->unk1F1 || racer->unk1F0) { weight = 0.45f; @@ -6026,13 +6008,13 @@ void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32 updateR yStick = -yStick; yStick *= 64; yStick = (u16) yStick; - angle = yStick - ((u16) obj->segment.trans.rotation.x_rotation); + angle = yStick - ((u16) obj->trans.rotation.x_rotation); angle = angle > 0x8000 ? angle - 0xFFFF : angle; angle = angle < -0x8000 ? angle + 0xFFFF : angle; - obj->segment.trans.rotation.x_rotation += (angle >> 3); //!@Delta - obj->segment.y_velocity -= weight * updateRateF; + obj->trans.rotation.x_rotation += (angle >> 3); //!@Delta + obj->y_velocity -= weight * updateRateF; if (racer->buoyancy == 0.0) { - steerAngle = -obj->segment.y_velocity * 20.0; + steerAngle = -obj->y_velocity * 20.0; if (steerAngle < 50) { steerAngle = 50; } @@ -6080,7 +6062,7 @@ void func_800535C4(Object *obj, Object_Racer *racer) { MtxF mf; gCurrentRacerTransform.rotation.y_rotation = -racer->steerVisualRotation; - gCurrentRacerTransform.rotation.x_rotation = -obj->segment.trans.rotation.x_rotation; + gCurrentRacerTransform.rotation.x_rotation = -obj->trans.rotation.x_rotation; gCurrentRacerTransform.rotation.z_rotation = -racer->x_rotation_vel; gCurrentRacerTransform.x_position = 0; gCurrentRacerTransform.y_position = 0; @@ -6130,9 +6112,9 @@ void func_80053750(Object *objRacer, Object_Racer *racer, f32 updateRateF) { temp_v1 = objRacer->attachPoints->count; if (temp_v1 == 2) { someObj = objRacer->attachPoints->obj[0]; - someObj->segment.trans.rotation.y_rotation = 0x4000; + someObj->trans.rotation.y_rotation = 0x4000; someObj = objRacer->attachPoints->obj[1]; - someObj->segment.trans.rotation.y_rotation = 0x4000; + someObj->trans.rotation.y_rotation = 0x4000; } if (temp_v1 >= 4) { velocity = racer->velocity; @@ -6157,14 +6139,14 @@ void func_80053750(Object *objRacer, Object_Racer *racer, f32 updateRateF) { someObj = objRacer->attachPoints->obj[i]; if ((racer->unk1FB != 0 && i >= 3) || racer->unk1FB == 0) { if (someObj->properties.common.unk0 != 0) { - someObj->segment.object.modelIndex--; - if (someObj->segment.object.modelIndex < 0) { - someObj->segment.object.modelIndex = someObj->segment.header->numberOfModelIds - 1; + someObj->modelIndex--; + if (someObj->modelIndex < 0) { + someObj->modelIndex = someObj->header->numberOfModelIds - 1; } } else { - someObj->segment.object.modelIndex++; - if (someObj->segment.object.modelIndex == someObj->segment.header->numberOfModelIds) { - someObj->segment.object.modelIndex = 0; + someObj->modelIndex++; + if (someObj->modelIndex == someObj->header->numberOfModelIds) { + someObj->modelIndex = 0; } } } @@ -6178,14 +6160,14 @@ void func_80053750(Object *objRacer, Object_Racer *racer, f32 updateRateF) { someObj = objRacer->attachPoints->obj[i]; if ((racer->unk1FB != 0 && i >= 3) || racer->unk1FB == 0) { if (someObj->properties.common.unk0 == 0) { - someObj->segment.object.modelIndex--; - if (someObj->segment.object.modelIndex < 0) { - someObj->segment.object.modelIndex = someObj->segment.header->numberOfModelIds - 1; + someObj->modelIndex--; + if (someObj->modelIndex < 0) { + someObj->modelIndex = someObj->header->numberOfModelIds - 1; } } else { - someObj->segment.object.modelIndex++; - if (someObj->segment.object.modelIndex == someObj->segment.header->numberOfModelIds) { - someObj->segment.object.modelIndex = 0; + someObj->modelIndex++; + if (someObj->modelIndex == someObj->header->numberOfModelIds) { + someObj->modelIndex = 0; } } } @@ -6196,40 +6178,39 @@ void func_80053750(Object *objRacer, Object_Racer *racer, f32 updateRateF) { if (racer->unk1FB != 0) { for (i = 0; i < 2; i++) { someObj = objRacer->attachPoints->obj[i]; - if (someObj->properties.racer.unk0 != 0) { - someObj->segment.object.modelIndex--; - if (someObj->segment.object.modelIndex < 0) { - someObj->segment.object.modelIndex = (s8) (someObj->segment.header->numberOfModelIds - 1); + if (someObj->properties.common.unk0 != 0) { + someObj->modelIndex--; + if (someObj->modelIndex < 0) { + someObj->modelIndex = (s8) (someObj->header->numberOfModelIds - 1); } } else { - someObj->segment.object.modelIndex++; - if (someObj->segment.object.modelIndex == someObj->segment.header->numberOfModelIds) { - someObj->segment.object.modelIndex = 0; + someObj->modelIndex++; + if (someObj->modelIndex == someObj->header->numberOfModelIds) { + someObj->modelIndex = 0; } } } objRacer->particleEmittersEnabled |= OBJ_EMIT_11 | OBJ_EMIT_12; } - temp_f0 = someObj->segment.trans.y_position; // Fake + temp_f0 = someObj->trans.y_position; // Fake for (i = 0; i < 4; i++) { someObj = objRacer->attachPoints->obj[i]; if (!(racer->unk1E3 & flags)) { - someObj->segment.trans.y_position += ((-10.0f - someObj->segment.trans.y_position) * 0.125); + someObj->trans.y_position += ((-10.0f - someObj->trans.y_position) * 0.125); if (racer->waterTimer != 0) { - someObj->segment.trans.scale += - (((someObj->segment.header->scale * 1.4) - someObj->segment.trans.scale) * 0.1); + someObj->trans.scale += (((someObj->header->scale * 1.4) - someObj->trans.scale) * 0.1); } } else { - temp_f0 = someObj->segment.trans.y_position; - 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); + temp_f0 = someObj->trans.y_position; + someObj->trans.y_position = (temp_f0 - (temp_f0 * 0.125)); + someObj->trans.scale += ((someObj->header->scale - someObj->trans.scale) * 0.1); } flags <<= 1; } someObj = objRacer->attachPoints->obj[2]; - someObj->segment.trans.rotation.y_rotation = gCurrentStickX * 100; + someObj->trans.rotation.y_rotation = gCurrentStickX * 100; someObj = objRacer->attachPoints->obj[3]; - someObj->segment.trans.rotation.y_rotation = gCurrentStickX * 100; + someObj->trans.rotation.y_rotation = gCurrentStickX * 100; } } @@ -6275,10 +6256,10 @@ void racer_attack_handler_car(Object *obj, Object_Racer *racer, s32 updateRate) racer->unk1F1 = 1; if (bananas == 0) { racer->velocity = 0.0f; - obj->segment.y_velocity += 10.5; + obj->y_velocity += 10.5; } else { racer->velocity /= 4; - obj->segment.y_velocity += 8.5; + obj->y_velocity += 8.5; } break; // Running into an oil slick. @@ -6300,7 +6281,7 @@ void racer_attack_handler_car(Object *obj, Object_Racer *racer, s32 updateRate) case ATTACK_FLUNG: racer->unk1F1 = 1; racer->velocity = 0.0f; - obj->segment.y_velocity += 20.5; + obj->y_velocity += 20.5; racer_play_sound(obj, SOUND_WHEE); break; } @@ -6329,9 +6310,9 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, s32 angle; s32 steerVel; - xTemp = obj->segment.trans.x_position; - yTemp = obj->segment.trans.y_position; - zTemp = obj->segment.trans.z_position; + xTemp = obj->trans.x_position; + yTemp = obj->trans.y_position; + zTemp = obj->trans.z_position; gCurrentCarSteerVel = 0; D_8011D558 = 0; handle_base_steering(racer, 0, updateRateF); @@ -6360,19 +6341,19 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, } else { racer->checkpoint_distance += 0.1; } - xVel -= obj->segment.trans.x_position; - zVel -= obj->segment.trans.z_position; + xVel -= obj->trans.x_position; + zVel -= obj->trans.z_position; yVel = sqrtf((xVel * xVel) + (zVel * zVel)); xVel /= yVel; zVel /= yVel; - obj->segment.x_velocity = xVel * 4.0f; - obj->segment.z_velocity = zVel * 4.0f; - obj->segment.y_velocity = 9.5f; + obj->x_velocity = xVel * 4.0f; + obj->z_velocity = zVel * 4.0f; + obj->y_velocity = 9.5f; racer->unk1F0 = 1; } else if (racer->groundedWheels > 2) { racer->unk1F0 = 0; } - obj->segment.object.animationID = 0; + obj->animationID = 0; steerVel = ((-racer->y_rotation_vel >> 8) / gCurrentRacerHandlingStat); steerVel = 40 - steerVel; if (steerVel < 0) { @@ -6381,16 +6362,16 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, if (steerVel > 73) { steerVel = 73; } - obj->segment.animFrame = steerVel; + obj->animFrame = steerVel; slowly_reset_head_angle(racer); angle = gCurrentCarSteerVel - (u16) racer->y_rotation_vel; WRAP(angle, -0x8000, 0x8000); angle >>= 2; CLAMP(angle, -0x2EE, 0x2EE); racer->y_rotation_vel += (angle * updateRate); - obj->segment.trans.rotation.y_rotation = racer->steerVisualRotation + racer->y_rotation_vel; + obj->trans.rotation.y_rotation = racer->steerVisualRotation + racer->y_rotation_vel; racer->z_rotation_vel += ((D_8011D558 - racer->z_rotation_vel) * updateRate) >> 4; - obj->segment.trans.rotation.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; + obj->trans.rotation.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; if (!racer->unk1F0) { gCurrentRacerTransform.rotation.y_rotation = racer->steerVisualRotation + racer->unk10C; gCurrentRacerTransform.rotation.x_rotation = 0; @@ -6400,23 +6381,23 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, gCurrentRacerTransform.z_position = 0.0f; gCurrentRacerTransform.scale = 1.0f; mtxf_from_inverse_transform(&mtx, &gCurrentRacerTransform); - mtxf_transform_point(&mtx, racer->lateral_velocity, 0.0f, racer->velocity, &obj->segment.x_velocity, &tempVel, - &obj->segment.z_velocity); + mtxf_transform_point(&mtx, racer->lateral_velocity, 0.0f, racer->velocity, &obj->x_velocity, &tempVel, + &obj->z_velocity); } if (racer->magnetTimer) { - obj->segment.x_velocity = gRacerMagnetVelX; - obj->segment.z_velocity = gRacerMagnetVelZ; + obj->x_velocity = gRacerMagnetVelX; + obj->z_velocity = gRacerMagnetVelZ; } if (!racer->approachTarget) { - xVel = obj->segment.x_velocity; - zVel = obj->segment.z_velocity; + xVel = obj->x_velocity; + zVel = obj->z_velocity; if (racer->unk1D2 != 0) { xVel += racer->unk11C; zVel += racer->unk120; } xVel += racer->unk84; zVel += racer->unk88; - move_object(obj, xVel * updateRateF, obj->segment.y_velocity * updateRateF, zVel * updateRateF); + move_object(obj, xVel * updateRateF, obj->y_velocity * updateRateF, zVel * updateRateF); } else { racer_approach_object(obj, racer, updateRateF); } @@ -6432,12 +6413,12 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, } func_80053750(obj, racer, updateRateF); tempVel = 1.0f / updateRateF; - xVel = (((obj->segment.trans.x_position - xTemp) - D_8011D548) * tempVel) - racer->unk84; - obj->segment.y_velocity = (obj->segment.trans.y_position - yTemp) * tempVel; - zVel = (((obj->segment.trans.z_position - zTemp) - D_8011D54C) * tempVel) - racer->unk88; + xVel = (((obj->trans.x_position - xTemp) - D_8011D548) * tempVel) - racer->unk84; + obj->y_velocity = (obj->trans.y_position - yTemp) * tempVel; + zVel = (((obj->trans.z_position - zTemp) - D_8011D54C) * tempVel) - racer->unk88; gCurrentRacerTransform.rotation.y_rotation = -(racer->steerVisualRotation + racer->unk10C); - gCurrentRacerTransform.rotation.x_rotation = -obj->segment.trans.rotation.x_rotation; - gCurrentRacerTransform.rotation.z_rotation = -obj->segment.trans.rotation.z_rotation; + gCurrentRacerTransform.rotation.x_rotation = -obj->trans.rotation.x_rotation; + gCurrentRacerTransform.rotation.z_rotation = -obj->trans.rotation.z_rotation; gCurrentRacerTransform.x_position = 0.0f; gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; @@ -6619,7 +6600,7 @@ void update_car_velocity_ground(Object *obj, Object_Racer *racer, s32 updateRate if (racer->brake < 0.9 && gRaceStartTimer == 0) { racer->velocity += weight * (racer->pitch / 4) * updateRateF; } - obj->segment.y_velocity -= weight * updateRateF; + obj->y_velocity -= weight * updateRateF; } // Related to ground collision? @@ -6649,18 +6630,18 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { s8 sp5C; s8 sp58[4]; - if (gCurrentCourseHeight < racerObj->segment.trans.y_position) { - racerObj->segment.trans.y_position = gCurrentCourseHeight; + if (gCurrentCourseHeight < racerObj->trans.y_position) { + racerObj->trans.y_position = gCurrentCourseHeight; func_8002ACC8(1); } sp130 = FALSE; - gCurrentRacerTransform.rotation.y_rotation = racerObj->segment.trans.rotation.y_rotation; - gCurrentRacerTransform.rotation.x_rotation = racerObj->segment.trans.rotation.x_rotation; - gCurrentRacerTransform.rotation.z_rotation = racerObj->segment.trans.rotation.z_rotation; + gCurrentRacerTransform.rotation.y_rotation = racerObj->trans.rotation.y_rotation; + gCurrentRacerTransform.rotation.x_rotation = racerObj->trans.rotation.x_rotation; + gCurrentRacerTransform.rotation.z_rotation = racerObj->trans.rotation.z_rotation; gCurrentRacerTransform.scale = 1.0f; - gCurrentRacerTransform.x_position = racerObj->segment.trans.x_position; - gCurrentRacerTransform.y_position = racerObj->segment.trans.y_position; - gCurrentRacerTransform.z_position = racerObj->segment.trans.z_position; + gCurrentRacerTransform.x_position = racerObj->trans.x_position; + gCurrentRacerTransform.y_position = racerObj->trans.y_position; + gCurrentRacerTransform.z_position = racerObj->trans.z_position; mtxf_from_transform(&spA0, &gCurrentRacerTransform); for (i = 0; i < 4; i++) { @@ -6684,8 +6665,8 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { } D_8011D548 = D_8011D548 / 4; D_8011D54C = D_8011D54C / 4; - D_8011D548 = D_8011D548 - racerObj->segment.trans.x_position; - D_8011D54C = D_8011D54C - racerObj->segment.trans.z_position; + D_8011D548 = D_8011D548 - racerObj->trans.x_position; + D_8011D54C = D_8011D54C - racerObj->trans.z_position; sp130 = TRUE; flags &= ~0x80; } @@ -6696,7 +6677,7 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { sp178 += sp134[i * 3 + 1]; } sp178 *= 0.25; - if (sp178 < (racerObj->segment.trans.y_position - 4.0)) { + if (sp178 < (racerObj->trans.y_position - 4.0)) { sp5C = 1; } } @@ -6706,7 +6687,7 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { sp184 = func_8002ACD4(&sp180, &sp178, &sp17C); if (sp184 != 0) { temp_s16 = (u16) arctan2_f(sp180 * 255.0f, sp17C * 255.0f); - temp_s16 -= racerObj->segment.trans.rotation.y_rotation; + temp_s16 -= racerObj->trans.rotation.y_rotation; if ((temp_s16 < 0x2000 && temp_s16 > -0x2000) || racer->vehicleID == VEHICLE_HOVERCRAFT) { sp178 = racer->velocity * 1.075; if (sp178 < 0) { @@ -6764,25 +6745,25 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { for (i = 0; i < 4; i++) { racer->wheel_surfaces[i] = sp58[i]; } - racerObj->segment.trans.x_position = 0; - racerObj->segment.trans.y_position = 0; - racerObj->segment.trans.z_position = 0; + racerObj->trans.x_position = 0; + racerObj->trans.y_position = 0; + racerObj->trans.z_position = 0; for (i = 0; i < 12; i += 3) { - racerObj->segment.trans.x_position = racerObj->segment.trans.x_position + ((f32 *) &racer->unkD8)[i + 0]; - racerObj->segment.trans.y_position = racerObj->segment.trans.y_position + ((f32 *) &racer->unkD8)[i + 1]; - racerObj->segment.trans.z_position = racerObj->segment.trans.z_position + ((f32 *) &racer->unkD8)[i + 2]; + racerObj->trans.x_position = racerObj->trans.x_position + ((f32 *) &racer->unkD8)[i + 0]; + racerObj->trans.y_position = racerObj->trans.y_position + ((f32 *) &racer->unkD8)[i + 1]; + racerObj->trans.z_position = racerObj->trans.z_position + ((f32 *) &racer->unkD8)[i + 2]; } - racerObj->segment.trans.x_position /= 4; - racerObj->segment.trans.y_position /= 4; - racerObj->segment.trans.z_position /= 4; + racerObj->trans.x_position /= 4; + racerObj->trans.y_position /= 4; + racerObj->trans.z_position /= 4; - gCurrentRacerTransform.rotation.y_rotation = -racerObj->segment.trans.rotation.y_rotation; - gCurrentRacerTransform.rotation.x_rotation = -racerObj->segment.trans.rotation.x_rotation; - gCurrentRacerTransform.rotation.z_rotation = -racerObj->segment.trans.rotation.z_rotation; + gCurrentRacerTransform.rotation.y_rotation = -racerObj->trans.rotation.y_rotation; + gCurrentRacerTransform.rotation.x_rotation = -racerObj->trans.rotation.x_rotation; + gCurrentRacerTransform.rotation.z_rotation = -racerObj->trans.rotation.z_rotation; gCurrentRacerTransform.scale = 1.0f; - gCurrentRacerTransform.x_position = -racerObj->segment.trans.x_position; - gCurrentRacerTransform.y_position = -racerObj->segment.trans.y_position; - gCurrentRacerTransform.z_position = -racerObj->segment.trans.z_position; + gCurrentRacerTransform.x_position = -racerObj->trans.x_position; + gCurrentRacerTransform.y_position = -racerObj->trans.y_position; + gCurrentRacerTransform.z_position = -racerObj->trans.z_position; mtxf_from_inverse_transform(&sp60, &gCurrentRacerTransform); for (i = 0; i < 4; i++) { mtxf_transform_point(&sp60, ((f32 *) &racer->unkD8)[i * 3 + 0], ((f32 *) &racer->unkD8)[i * 3 + 1], @@ -6814,15 +6795,15 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { if (sp130) { temp_s16 *= 4; } - racerObj->segment.trans.rotation.y_rotation += temp_s16 >> 2; - racer->steerVisualRotation = racerObj->segment.trans.rotation.y_rotation - racer->y_rotation_vel; + racerObj->trans.rotation.y_rotation += temp_s16 >> 2; + racer->steerVisualRotation = racerObj->trans.rotation.y_rotation - racer->y_rotation_vel; } sp180 = spF4[2] - spF4[0]; sp17C = sp108[2] - sp108[0]; temp_s16 = arctan2_f(sp180, sp17C) & 0xFFFF; temp_s16 -= 0x4000; if (sp184 == 0) { - racerObj->segment.trans.rotation.x_rotation += temp_s16; + racerObj->trans.rotation.x_rotation += temp_s16; } sp180 = (sp11C[1] - sp11C[0]); sp17C = (sp108[1] - sp108[0]); @@ -6833,7 +6814,7 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { if (racer->vehicleID != VEHICLE_LOOPDELOOP && racer->vehicleID != VEHICLE_PLANE && racer->vehicleID != VEHICLE_CARPET && racer->vehicleID != VEHICLE_SMOKEY) { CLAMP(racer->x_rotation_vel, -0x3400, 0x3400); - CLAMP(racerObj->segment.trans.rotation.x_rotation, -0x3400, 0x3400); + CLAMP(racerObj->trans.rotation.x_rotation, -0x3400, 0x3400); } } @@ -6859,15 +6840,15 @@ void onscreen_ai_racer_physics(Object *obj, Object_Racer *racer, UNUSED s32 upda s8 surface; s8 shouldSquish; - if (obj->segment.trans.y_position > gCurrentCourseHeight) { - obj->segment.trans.y_position = gCurrentCourseHeight; + if (obj->trans.y_position > gCurrentCourseHeight) { + obj->trans.y_position = gCurrentCourseHeight; } racerSize = (f32 *) get_misc_asset(ASSET_MISC_RACER_HITBOX_SIZE); surface = SURFACE_NONE; radius = racerSize[racer->vehicleIDPrev]; - tempPos.x = obj->segment.trans.x_position; - tempPos.y = obj->segment.trans.y_position; - tempPos.z = obj->segment.trans.z_position; + tempPos.x = obj->trans.x_position; + tempPos.y = obj->trans.y_position; + tempPos.z = obj->trans.z_position; D_8011D548 = 0.0f; D_8011D54C = 0.0f; hasCollision = FALSE; @@ -6876,12 +6857,12 @@ void onscreen_ai_racer_physics(Object *obj, Object_Racer *racer, UNUSED s32 upda flags = func_80017248(obj, 1, &hasCollision, &racer->unkD8, &tempPos.x, &radius, &surface); } if (flags & 0x80) { - D_8011D548 = tempPos.x - obj->segment.trans.x_position; - D_8011D54C = tempPos.z - obj->segment.trans.z_position; + D_8011D548 = tempPos.x - obj->trans.x_position; + D_8011D54C = tempPos.z - obj->trans.z_position; flags &= ~0x80; } shouldSquish = FALSE; - if (flags && tempPos.y < obj->segment.trans.y_position - 4.0) { + if (flags && tempPos.y < obj->trans.y_position - 4.0) { shouldSquish = TRUE; } func_80031130(1, &racer->unkD8.x, &tempPos.x, racer->vehicleID); @@ -6909,13 +6890,13 @@ void onscreen_ai_racer_physics(Object *obj, Object_Racer *racer, UNUSED s32 upda racer->wheel_surfaces[1] = surface; racer->wheel_surfaces[2] = surface; racer->wheel_surfaces[3] = surface; - obj->segment.trans.x_position = racer->unkD8.x; - obj->segment.trans.y_position = racer->unkD8.y; - obj->segment.trans.z_position = racer->unkD8.z; + obj->trans.x_position = racer->unkD8.x; + obj->trans.y_position = racer->unkD8.y; + obj->trans.z_position = racer->unkD8.z; if (racer->groundedWheels) { func_8002ACD4(&xTemp, &yTemp, &zTemp); - angleX = sins_f(-obj->segment.trans.rotation.y_rotation); - angleZ = coss_f(-obj->segment.trans.rotation.y_rotation); + angleX = sins_f(-obj->trans.rotation.y_rotation); + angleZ = coss_f(-obj->trans.rotation.y_rotation); distance = (xTemp * angleZ) + (zTemp * angleX); zTemp = (xTemp * angleX) - (zTemp * angleZ); temp_v1_2 = -(s16) (u16) arctan2_f(distance, yTemp); @@ -6924,20 +6905,20 @@ void onscreen_ai_racer_physics(Object *obj, Object_Racer *racer, UNUSED s32 upda } xRot = -(s16) (u16) arctan2_f(zTemp, yTemp); if (xRot < 0x2000 && xRot > -0x2000) { - obj->segment.trans.rotation.x_rotation = xRot; + obj->trans.rotation.x_rotation = xRot; } if (racer->vehicleID == VEHICLE_LOOPDELOOP) { if (1) { // Fakematch - xRot -= (u16) obj->segment.trans.rotation.x_rotation; + xRot -= (u16) obj->trans.rotation.x_rotation; } WRAP(xRot, -0x8000, 0x8000); - obj->segment.trans.rotation.x_rotation += xRot >> 2; + obj->trans.rotation.x_rotation += xRot >> 2; } } if (racer->vehicleID != VEHICLE_LOOPDELOOP && racer->vehicleID != VEHICLE_PLANE && racer->vehicleID != VEHICLE_CARPET && racer->vehicleID != VEHICLE_SMOKEY) { CLAMP(racer->x_rotation_vel, -0x3400, 0x3400); - CLAMP(obj->segment.trans.rotation.x_rotation, -0x3400, 0x3400); + CLAMP(obj->trans.rotation.x_rotation, -0x3400, 0x3400); } } @@ -6960,7 +6941,8 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) f32 distance; f32 scaleY; f32 scaleZ; - UNUSED s32 pad[2]; + UNUSED s32 pad; + Object_CollectEgg *egg; s8 *miscAsset; Vertex *heldObjData; u16 soundID = SOUND_NONE; @@ -6970,31 +6952,28 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) if (gCurrentButtonsPressed & Z_TRIG || racer->raceFinished || racer->attackType) { scaleY = 0; scaleZ = 0; - if (obj->modelInstances[obj->segment.object.modelIndex] != NULL) { - model = obj->modelInstances[obj->segment.object.modelIndex]->objModel; - if (obj->segment.header->unk58 > -1 && obj->segment.header->unk58 < model->unk18) { + if (obj->modelInstances[obj->modelIndex] != NULL) { + model = obj->modelInstances[obj->modelIndex]->objModel; + if (obj->header->unk58 > -1 && obj->header->unk58 < model->unk18) { if (obj->curVertData != NULL) { heldObjData = obj->curVertData; - heldObjData += model->unk14[obj->segment.header->unk58]; + heldObjData += model->unk14[obj->header->unk58]; scaleY = heldObjData->y; - scaleY *= obj->segment.trans.scale; + scaleY *= obj->trans.scale; scaleZ = heldObjData->z; - scaleZ *= obj->segment.trans.scale; + scaleZ *= obj->trans.scale; } } } - heldObj->segment.trans.x_position = - obj->segment.trans.x_position + (racer->ox1 * scaleZ) + (racer->ox2 * scaleY); - heldObj->segment.trans.y_position = - obj->segment.trans.y_position + (racer->oy1 * scaleZ) + (racer->oy2 * scaleY); - heldObj->segment.trans.z_position = - obj->segment.trans.z_position + (racer->oz1 * scaleZ) + (racer->oz2 * scaleY); - heldObj->segment.object.segmentID = obj->segment.object.segmentID; - heldObj->segment.x_velocity = obj->segment.x_velocity * 0.7; - heldObj->segment.y_velocity = obj->segment.y_velocity - 2.0; - heldObj->segment.z_velocity = obj->segment.z_velocity * 0.7; - heldObjData = (Vertex *) &heldObj->unk64->egg; - ((Object_64 *) heldObjData)->egg.status = EGG_MOVING; + heldObj->trans.x_position = obj->trans.x_position + (racer->ox1 * scaleZ) + (racer->ox2 * scaleY); + heldObj->trans.y_position = obj->trans.y_position + (racer->oy1 * scaleZ) + (racer->oy2 * scaleY); + heldObj->trans.z_position = obj->trans.z_position + (racer->oz1 * scaleZ) + (racer->oz2 * scaleY); + heldObj->segmentID = obj->segmentID; + heldObj->x_velocity = obj->x_velocity * 0.7; + heldObj->y_velocity = obj->y_velocity - 2.0; + heldObj->z_velocity = obj->z_velocity * 0.7; + egg = heldObj->egg; + egg->status = EGG_MOVING; racer->held_obj = NULL; racer->unk211 = 1; } @@ -7053,7 +7032,7 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) } if (objDist < distance) { if (weaponID == WEAPON_MAGNET_LEVEL_3 && intendedTarget != NULL) { - magnetTarget = &intendedTarget->unk64->racer; + magnetTarget = intendedTarget->racer; } racer->magnetTargetObj = intendedTarget; } else { @@ -7183,26 +7162,26 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) break; } play_random_character_voice(obj, SOUND_VOICE_CHARACTER_POSITIVE, 8, 129); - newObject.x = obj->segment.trans.x_position + (racer->ox1 * objDist); - newObject.y = obj->segment.trans.y_position + (racer->oy1 * objDist) + (10.0f * racer->oy2); - newObject.z = obj->segment.trans.z_position + (racer->oz1 * objDist); + newObject.x = obj->trans.x_position + (racer->ox1 * objDist); + newObject.y = obj->trans.y_position + (racer->oy1 * objDist) + (10.0f * racer->oy2); + newObject.z = obj->trans.z_position + (racer->oz1 * objDist); newObject.size = sizeof(LevelObjectEntryCommon); newObject.objectID = objID; spawnedObj = spawn_object(&newObject, OBJECT_SPAWN_UNK01); if (spawnedObj != NULL) { - spawnedObj->segment.level_entry = NULL; - spawnedObj->segment.x_velocity = obj->segment.x_velocity - (racer->ox1 * velocity); - spawnedObj->segment.y_velocity = obj->segment.y_velocity - (racer->oy1 * velocity); - spawnedObj->segment.z_velocity = obj->segment.z_velocity - (racer->oz1 * velocity); - spawnedObj->segment.trans.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - spawnedObj->segment.trans.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; + spawnedObj->level_entry = NULL; + spawnedObj->x_velocity = obj->x_velocity - (racer->ox1 * velocity); + spawnedObj->y_velocity = obj->y_velocity - (racer->oy1 * velocity); + spawnedObj->z_velocity = obj->z_velocity - (racer->oz1 * velocity); + spawnedObj->trans.rotation.y_rotation = obj->trans.rotation.y_rotation; + spawnedObj->trans.rotation.x_rotation = obj->trans.rotation.x_rotation; if (racer->vehicleID == VEHICLE_HOVERCRAFT && racer->waterTimer) { - if (spawnedObj->segment.trans.rotation.x_rotation > -0x400 && - spawnedObj->segment.trans.rotation.x_rotation < 0x400) { - spawnedObj->segment.trans.rotation.x_rotation = 0; + if (spawnedObj->trans.rotation.x_rotation > -0x400 && + spawnedObj->trans.rotation.x_rotation < 0x400) { + spawnedObj->trans.rotation.x_rotation = 0; } } - weapon = &spawnedObj->unk64->weapon; + weapon = spawnedObj->weapon; weapon->owner = obj; weapon->target = intendedTarget; weapon->checkpoint = racer->checkpoint; @@ -7228,20 +7207,20 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) soundID = SOUND_PLOP; break; case WEAPON_UNK_11: - spawnedObj->segment.animFrame = 0; + spawnedObj->animFrame = 0; break; } if (soundID != SOUND_NONE) { if (racer->playerIndex == PLAYER_COMPUTER) { - audspat_play_sound_at_position(soundID, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + audspat_play_sound_at_position(soundID, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, + NULL); } else { if (racer->weaponSoundMask) { sndp_stop(racer->weaponSoundMask); } - sound_play_spatial(soundID, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, &racer->weaponSoundMask); + sound_play_spatial(soundID, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, &racer->weaponSoundMask); } } } @@ -7303,13 +7282,13 @@ Object *func_8005698C(Object *racerObj, Object_Racer *racer, f32 *outDistance) { racerOx1 = racer->ox1; racerOy1 = racer->oy1; racerOz1 = racer->oz1; - racerO1dist = -((racerObj->segment.trans.x_position * racerOx1) + (racerObj->segment.trans.y_position * racerOy1) + - (racerObj->segment.trans.z_position * racerOz1)); + racerO1dist = -((racerObj->trans.x_position * racerOx1) + (racerObj->trans.y_position * racerOy1) + + (racerObj->trans.z_position * racerOz1)); racerOx3 = racer->ox3; racerOy3 = racer->oy3; racerOz3 = racer->oz3; - racerO3dist = -((racerObj->segment.trans.x_position * racerOx3) + (racerObj->segment.trans.y_position * racerOy1) + - (racerObj->segment.trans.z_position * racerOz3)); + racerO3dist = -((racerObj->trans.x_position * racerOx3) + (racerObj->trans.y_position * racerOy1) + + (racerObj->trans.z_position * racerOz3)); racerObjects = get_racer_objects(&numRacers); // TODO: Need better names for these savedDist2 = 10000.0f; @@ -7318,15 +7297,15 @@ Object *func_8005698C(Object *racerObj, Object_Racer *racer, f32 *outDistance) { for (i = 0; i < numRacers; i++) { if (racerObj != racerObjects[i]) { curRacerObj = racerObjects[i]; - curRacer = &racerObjects[i]->unk64->racer; + curRacer = racerObjects[i]->racer; if ((!isChallengeRace || !curRacer->raceFinished) && curRacer->elevation == racer->elevation) { - curDistance = -((racerOx1 * curRacerObj->segment.trans.x_position) + - (racerOy1 * curRacerObj->segment.trans.y_position) + - (racerOz1 * curRacerObj->segment.trans.z_position) + racerO1dist); + curDistance = + -((racerOx1 * curRacerObj->trans.x_position) + (racerOy1 * curRacerObj->trans.y_position) + + (racerOz1 * curRacerObj->trans.z_position) + racerO1dist); if (curDistance > 0.0f) { - curDistance2 = (racerOx3 * curRacerObj->segment.trans.x_position) + - (racerOy3 * curRacerObj->segment.trans.y_position) + - (racerOz3 * curRacerObj->segment.trans.z_position) + racerO3dist; + curDistance2 = (racerOx3 * curRacerObj->trans.x_position) + + (racerOy3 * curRacerObj->trans.y_position) + + (racerOz3 * curRacerObj->trans.z_position) + racerO3dist; if (curDistance2 < 0.0f) { curDistance2 = -curDistance2; } @@ -7363,8 +7342,8 @@ void racer_activate_magnet(Object *obj, Object_Racer *racer, s32 updateRate) { racer->magnetTimer = 0; return; } - diffX = racer->magnetTargetObj->segment.trans.x_position - obj->segment.trans.x_position; - diffZ = racer->magnetTargetObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = racer->magnetTargetObj->trans.x_position - obj->trans.x_position; + diffZ = racer->magnetTargetObj->trans.z_position - obj->trans.z_position; vel = sqrtf((diffX * diffX) + (diffZ * diffZ)); if (vel > 150.0f && vel < 2000.0f) { if (racer->playerIndex != PLAYER_COMPUTER) { @@ -7383,7 +7362,7 @@ void racer_activate_magnet(Object *obj, Object_Racer *racer, s32 updateRate) { } diffX /= vel; diffZ /= vel; - magnetTarget = &racer->magnetTargetObj->unk64->racer; + magnetTarget = racer->magnetTargetObj->racer; vel = -magnetTarget->velocity; if (vel < 8.0 && racer->magnetLevel3 == FALSE) { vel = 8.0f; @@ -7403,10 +7382,9 @@ void racer_activate_magnet(Object *obj, Object_Racer *racer, s32 updateRate) { * Only affects human players that aren't in the middle of going through an exit. */ void racer_play_sound(Object *obj, s32 soundID) { - Object_Racer *racer = &obj->unk64->racer; + Object_Racer *racer = obj->racer; if (gCurrentPlayerIndex != PLAYER_COMPUTER && racer->exitObj == NULL) { - sound_play_spatial(soundID, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, NULL); + sound_play_spatial(soundID, obj->trans.x_position, obj->trans.y_position, obj->trans.z_position, NULL); } } @@ -7415,7 +7393,7 @@ void racer_play_sound(Object *obj, s32 soundID) { * When that timer counts zero in the racer's update loop, it plays the sound passed through here. */ void racer_play_sound_after_delay(Object *obj, s32 soundID, s32 delay) { - Object_Racer *racer = &obj->unk64->racer; + Object_Racer *racer = obj->racer; racer->delaySoundID = soundID; racer->delaySoundTimer = delay; } @@ -7430,7 +7408,7 @@ void play_random_character_voice(Object *obj, s32 soundID, s32 range, s32 flags) s32 soundIndex; Object_Racer *tempRacer; - tempRacer = &obj->unk64->racer; + tempRacer = obj->racer; if (tempRacer->exitObj == 0 && (!(flags & 0x80) || gCurrentPlayerIndex != PLAYER_COMPUTER)) { if (flags == 2) { if (tempRacer->soundMask != NULL && soundID != tempRacer->unk2A) { @@ -7447,8 +7425,8 @@ void play_random_character_voice(Object *obj, s32 soundID, s32 range, s32 flags) soundIndex = (rand_range(0, range - 1) * 12) + soundID; } } - audspat_play_sound_at_position(soundIndex, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, + audspat_play_sound_at_position(soundIndex, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, &tempRacer->soundMask); tempRacer->lastSoundID = soundIndex; } @@ -7575,8 +7553,8 @@ f32 handle_racer_top_speed(Object *obj, Object_Racer *racer) { void func_800575EC(Object *obj, Object_Racer *racer) { MtxF mtxF; - gCurrentRacerTransform.rotation.y_rotation = obj->segment.trans.rotation.y_rotation; - gCurrentRacerTransform.rotation.x_rotation = obj->segment.trans.rotation.x_rotation; + gCurrentRacerTransform.rotation.y_rotation = obj->trans.rotation.y_rotation; + gCurrentRacerTransform.rotation.x_rotation = obj->trans.rotation.x_rotation; gCurrentRacerTransform.rotation.z_rotation = 0; gCurrentRacerTransform.x_position = 0.0f; gCurrentRacerTransform.y_position = 0.0f; @@ -7608,15 +7586,15 @@ void drop_bananas(Object *obj, Object_Racer *racer, s32 number) { } if (number > 0 && number < 3) { angle.z_rotation = racer->x_rotation_vel; - angle.x_rotation = obj->segment.trans.rotation.x_rotation; + angle.x_rotation = obj->trans.rotation.x_rotation; angle.y_rotation = racer->steerVisualRotation; pos.x = 0; pos.y = 8; pos.z = 12; vec3s_rotate_rpy(&angle, &pos); - newObject.x = pos.x + (s32) obj->segment.trans.x_position; - newObject.y = pos.y + (s32) obj->segment.trans.y_position; - newObject.z = pos.z + (s32) obj->segment.trans.z_position; + newObject.x = pos.x + (s32) obj->trans.x_position; + newObject.y = pos.y + (s32) obj->trans.y_position; + newObject.z = pos.z + (s32) obj->trans.z_position; newObject.size = sizeof(LevelObjectEntryCommon); newObject.objectID = ASSET_OBJECT_ID_COIN; i = number; @@ -7624,20 +7602,20 @@ void drop_bananas(Object *obj, Object_Racer *racer, s32 number) { if (get_current_level_race_type() != RACETYPE_CHALLENGE) { bananaObj = spawn_object(&newObject, OBJECT_SPAWN_UNK01); if (bananaObj != NULL) { - bananaObj->segment.level_entry = NULL; - banana = &bananaObj->unk64->banana; + bananaObj->level_entry = NULL; + banana = bananaObj->banana; banana->droppedVehicleID = racer->vehicleID; - bananaObj->segment.x_velocity = racer->ox1 * 2; - bananaObj->segment.y_velocity = (0.0f - racer->oy1) + 5.0; - bananaObj->segment.z_velocity = racer->oz1 * 2; + bananaObj->x_velocity = racer->ox1 * 2; + bananaObj->y_velocity = (0.0f - racer->oy1) + 5.0; + bananaObj->z_velocity = racer->oz1 * 2; if (i == 2) { variance = -0.5f; if (number == 1) { variance = 0.5f; } - bananaObj->segment.x_velocity -= (racer->ox3 - racer->ox1) * variance; - bananaObj->segment.y_velocity -= racer->oy3 * variance; - bananaObj->segment.z_velocity -= (racer->oz3 - racer->oz1) * variance; + bananaObj->x_velocity -= (racer->ox3 - racer->ox1) * variance; + bananaObj->y_velocity -= racer->oy3 * variance; + bananaObj->z_velocity -= (racer->oz3 - racer->oz1) * variance; } bananaObj->properties.banana.status = BANANA_DROPPED; } @@ -7745,12 +7723,12 @@ void update_player_camera(Object *obj, Object_Racer *racer, f32 updateRateF) { } dialogueAngle = gDialogueCameraAngle / 10240.0f; // Goes between 0-1 - gCameraObject->x_velocity = (((obj->segment.trans.x_position + (91.75 * racer->ox1) + (90.0 * racer->ox3)) - - gCameraObject->trans.x_position) * - dialogueAngle); - gCameraObject->z_velocity = (((obj->segment.trans.z_position + (91.75 * racer->oz1) + (90.0 * racer->oz3)) - - gCameraObject->trans.z_position) * - dialogueAngle); + gCameraObject->x_velocity = + (((obj->trans.x_position + (91.75 * racer->ox1) + (90.0 * racer->ox3)) - gCameraObject->trans.x_position) * + dialogueAngle); + gCameraObject->z_velocity = + (((obj->trans.z_position + (91.75 * racer->oz1) + (90.0 * racer->oz3)) - gCameraObject->trans.z_position) * + dialogueAngle); gCameraObject->y_velocity = (((get_npc_pos_y() + 48.5) - gCameraObject->trans.y_position) * dialogueAngle); gCameraObject->pitch = -gCameraObject->trans.rotation.x_rotation * dialogueAngle; gCameraObject->trans.x_position += gCameraObject->x_velocity; @@ -7890,7 +7868,7 @@ void update_camera_car(f32 updateRate, Object *obj, Object_Racer *racer) { break; } if (racer->groundedWheels > 2 || racer->waterTimer != 0) { - angleVel = (obj->segment.trans.rotation.x_rotation); + angleVel = (obj->trans.rotation.x_rotation); if (angleVel > 0) { angleVel -= 0x71C; if (angleVel < 0) { @@ -7973,9 +7951,9 @@ void update_camera_car(f32 updateRate, Object *obj, Object_Racer *racer) { } else { racer->camera_zoom += (10.0 - racer->camera_zoom) * 0.25; } - xOffset = obj->segment.trans.x_position - (racer->ox1 * racer->camera_zoom); - yOffset = obj->segment.trans.y_position - (racer->oy1 * racer->camera_zoom); - zOffset = obj->segment.trans.z_position - (racer->oz1 * racer->camera_zoom); + xOffset = obj->trans.x_position - (racer->ox1 * racer->camera_zoom); + yOffset = obj->trans.y_position - (racer->oy1 * racer->camera_zoom); + zOffset = obj->trans.z_position - (racer->oz1 * racer->camera_zoom); tempVel = sins_f(racer->cameraYaw + 0x4000) * racer->unkC8; gCameraObject->trans.x_position = xOffset + sineOffset + tempVel; lateralOffset = yOffset + yVel; @@ -7990,7 +7968,7 @@ void update_camera_car(f32 updateRate, Object *obj, Object_Racer *racer) { tempVel = (-coss_f(racer->cameraYaw + 0x4000) * racer->unkC8); gCameraObject->trans.z_position = tempVel + (zOffset + cosOffset); gCameraObject->trans.rotation.y_rotation = racer->cameraYaw; - newAngle = obj->segment.trans.rotation.z_rotation; + newAngle = obj->trans.rotation.z_rotation; if ((racer->drift_direction && racer->brake > 0.0) || gDialogueCameraAngle) { newAngle = 0; } @@ -8029,15 +8007,15 @@ void update_camera_finish_challenge(UNUSED f32 updateRate, Object *obj, Object_R gCameraObject->boomLength = 150.0f; xOffset = sins_f(0x8000 - gCameraObject->trans.rotation.y_rotation) * gCameraObject->boomLength; zOffset = coss_f(0x8000 - gCameraObject->trans.rotation.y_rotation) * gCameraObject->boomLength; - gCameraObject->trans.x_position = obj->segment.trans.x_position + xOffset; - temp_f12 = (gCameraObject->trans.y_position - (obj->segment.trans.y_position + 45.0f)) * 0.25; + gCameraObject->trans.x_position = obj->trans.x_position + xOffset; + temp_f12 = (gCameraObject->trans.y_position - (obj->trans.y_position + 45.0f)) * 0.25; if (temp_f12 < -2.0) { gCameraObject->trans.y_position = (gCameraObject->trans.y_position - (temp_f12 + 2.0)); } if (temp_f12 > 0.0f) { - gCameraObject->trans.y_position = obj->segment.trans.y_position + 45.0f; + gCameraObject->trans.y_position = obj->trans.y_position + 45.0f; } - gCameraObject->trans.z_position = obj->segment.trans.z_position + zOffset; + gCameraObject->trans.z_position = obj->trans.z_position + zOffset; segmentIndex = get_level_segment_index_from_position( gCameraObject->trans.x_position, gCameraObject->trans.y_position, gCameraObject->trans.z_position); if (segmentIndex != SEGMENT_NONE) { @@ -8065,12 +8043,12 @@ void update_camera_finish_race(UNUSED f32 updateRate, Object *obj, Object_Racer return; } racer->spectateCamID = cameraID; - gCameraObject->trans.x_position = cam->segment.trans.x_position; - gCameraObject->trans.y_position = cam->segment.trans.y_position; - gCameraObject->trans.z_position = cam->segment.trans.z_position; - diffX = gCameraObject->trans.x_position - obj->segment.trans.x_position; - diffY = gCameraObject->trans.y_position - obj->segment.trans.y_position; - diffZ = gCameraObject->trans.z_position - obj->segment.trans.z_position; + gCameraObject->trans.x_position = cam->trans.x_position; + gCameraObject->trans.y_position = cam->trans.y_position; + gCameraObject->trans.z_position = cam->trans.z_position; + diffX = gCameraObject->trans.x_position - obj->trans.x_position; + diffY = gCameraObject->trans.y_position - obj->trans.y_position; + diffZ = gCameraObject->trans.z_position - obj->trans.z_position; distance = sqrtf((diffX * diffX) + (diffZ * diffZ)); gCameraObject->trans.rotation.y_rotation = 0x8000 - atan2s(diffX, diffZ); gCameraObject->trans.rotation.x_rotation = atan2s((s32) diffY, (s32) distance); @@ -8088,8 +8066,8 @@ void update_camera_fixed(f32 updateRate, Object *obj, Object_Racer *racer) { f32 diffX; f32 diffZ; updateRateF = (s32) updateRate; - diffX = gCameraObject->trans.x_position - obj->segment.trans.x_position; - diffZ = gCameraObject->trans.z_position - obj->segment.trans.z_position; + diffX = gCameraObject->trans.x_position - obj->trans.x_position; + diffZ = gCameraObject->trans.z_position - obj->trans.z_position; gCameraObject->trans.rotation.y_rotation += ((((-atan2s(diffX, diffZ)) - gCameraObject->trans.rotation.y_rotation) + 0x8000) * updateRateF) >> 4; gCameraObject->trans.rotation.z_rotation -= ((s32) (gCameraObject->trans.rotation.z_rotation * updateRateF)) >> 4; @@ -8261,8 +8239,8 @@ void func_80059208(Object *obj, Object_Racer *racer, s32 updateRate) { diffY = diffX; diffX = diffZ; diffZ = -diffY; - splinePos = obj->segment.trans.x_position; - distance = obj->segment.trans.z_position; + splinePos = obj->trans.x_position; + distance = obj->trans.z_position; diffX = -(((splinePos * diffX) + (diffZ * distance) - ((tempZ * diffZ) + (diffX * tempX))) / divisor); if (diffX > 5.0f) { diffX = 5.0f; @@ -8271,7 +8249,7 @@ void func_80059208(Object *obj, Object_Racer *racer, s32 updateRate) { diffX = -5.0f; } racer->unk1BA += (s32) diffX; - diffY = (obj->segment.trans.y_position - tempY) / divisor; + diffY = (obj->trans.y_position - tempY) / divisor; if (diffY > 100.0f) { diffY = 100.0f; } @@ -8419,7 +8397,7 @@ void timetrial_ghost_write(Object *obj, s32 updateRate) { Object_Racer *racer; GhostNode *ghostNode; - racer = &obj->unk64->racer; + racer = obj->racer; yOffset = coss_f(racer->z_rotation_offset) * coss_f(racer->x_rotation_offset - racer->unk166); if (yOffset < 0) { yOffset *= 0.5; @@ -8438,12 +8416,12 @@ void timetrial_ghost_write(Object *obj, s32 updateRate) { return; } ghostNode = gGhostData[gCurrentGhostIndex] + gGhostNodeCount[gCurrentGhostIndex]; - ghostNode->x = obj->segment.trans.x_position; - ghostNode->y = obj->segment.trans.y_position + yOffset; - ghostNode->z = obj->segment.trans.z_position; - ghostNode->yRotation = obj->segment.trans.rotation.y_rotation + racer->y_rotation_offset; - ghostNode->xRotation = obj->segment.trans.rotation.x_rotation + racer->x_rotation_offset; - ghostNode->zRotation = obj->segment.trans.rotation.z_rotation + racer->z_rotation_offset; + ghostNode->x = obj->trans.x_position; + ghostNode->y = obj->trans.y_position + yOffset; + ghostNode->z = obj->trans.z_position; + ghostNode->yRotation = obj->trans.rotation.y_rotation + racer->y_rotation_offset; + ghostNode->xRotation = obj->trans.rotation.x_rotation + racer->x_rotation_offset; + ghostNode->zRotation = obj->trans.rotation.z_rotation + racer->z_rotation_offset; gGhostNodeCount[gCurrentGhostIndex]++; } } @@ -8470,7 +8448,7 @@ s32 timetrial_ghost_read(Object *obj) { GhostNode *nextGhostNode; s32 ghostNodeCount; GhostNode *curGhostNode; - Object_64 *obj64; + Object_Racer *obj64; s32 i; ghostDataIndex = (gCurrentGhostIndex + 1) & 1; @@ -8487,9 +8465,9 @@ s32 timetrial_ghost_read(Object *obj) { ghostNodeCount = gGhostNodeCount[ghostDataIndex]; if (commonUnk0s32 >= (ghostNodeCount - 2)) { #if VERSION >= VERSION_79 - obj64 = obj->unk64; - if (obj64->racer.transparency > 0) { - obj64->racer.transparency -= 1; + obj64 = obj->racer; + if (obj64->transparency > 0) { + obj64->transparency -= 1; } #endif return FALSE; @@ -8521,9 +8499,9 @@ s32 timetrial_ghost_read(Object *obj) { curGhostNode = &gGhostData[ghostDataIndex][commonUnk0s32]; catmullX -= commonUnk0s32; nextGhostNode = curGhostNode + 1; - obj->segment.trans.x_position = catmull_rom_interpolation(vectorX, 0, catmullX); - obj->segment.trans.y_position = catmull_rom_interpolation(vectorY, 0, catmullX); - obj->segment.trans.z_position = catmull_rom_interpolation(vectorZ, 0, catmullX); + obj->trans.x_position = catmull_rom_interpolation(vectorX, 0, catmullX); + obj->trans.y_position = catmull_rom_interpolation(vectorY, 0, catmullX); + obj->trans.z_position = catmull_rom_interpolation(vectorZ, 0, catmullX); // Y Rotation rotDiff = nextGhostNode->yRotation - (curGhostNode->yRotation & 0xFFFF); @@ -8534,7 +8512,7 @@ s32 timetrial_ghost_read(Object *obj) { rotDiff += 0xFFFF; } - obj->segment.trans.rotation.y_rotation = curGhostNode->yRotation + (s16) (rotDiff * catmullX); + obj->trans.rotation.y_rotation = curGhostNode->yRotation + (s16) (rotDiff * catmullX); // X Rotation rotDiff = nextGhostNode->xRotation - (curGhostNode->xRotation & 0xFFFF); @@ -8544,7 +8522,7 @@ s32 timetrial_ghost_read(Object *obj) { if (rotDiff < -0x8000) { rotDiff += 0xFFFF; } - obj->segment.trans.rotation.x_rotation = curGhostNode->xRotation + (s16) (rotDiff * catmullX); + obj->trans.rotation.x_rotation = curGhostNode->xRotation + (s16) (rotDiff * catmullX); // Z Rotation rotDiff = nextGhostNode->zRotation - (curGhostNode->zRotation & 0xFFFF); @@ -8554,14 +8532,14 @@ s32 timetrial_ghost_read(Object *obj) { if (rotDiff < -0x8000) { rotDiff += 0xFFFF; } - obj->segment.trans.rotation.z_rotation = curGhostNode->zRotation + (s16) (rotDiff * catmullX); + obj->trans.rotation.z_rotation = curGhostNode->zRotation + (s16) (rotDiff * catmullX); 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); + obj->segmentID = + get_level_segment_index_from_position(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position); temp = commonUnk0s32 + 3; if (ghostNodeCount == temp) { - racer = &obj->unk64->racer; + racer = obj->racer; if (catmullX >= 0.8) { racer->transparency = 0; } else { @@ -8617,7 +8595,7 @@ void racer_enter_door(Object_Racer *racer, s32 updateRate) { f32 updateRateF; s32 angle; - exit = &racer->exitObj->unk64->exit; + exit = racer->exitObj->exit; racer->playerIndex = PLAYER_COMPUTER; angle = (u16) arctan2_f(exit->directionX, exit->directionZ) - (racer->steerVisualRotation & 0xFFFF); WRAP(angle, -0x8000, 0x8000); @@ -8662,7 +8640,7 @@ void racer_enter_door(Object_Racer *racer, s32 updateRate) { if (racer->transitionTimer > 0) { racer->transitionTimer -= updateRate; if (racer->transitionTimer <= 0) { - func_8006D968((s8 *) racer->exitObj->segment.level_entry); + func_8006D968((s8 *) racer->exitObj->level_entry); racer->transitionTimer = 0; } } @@ -8717,9 +8695,9 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat gCurrentRacerHandlingStat = gCurrentRacerMiscAssetPtr[racer->characterId]; gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(ASSET_MISC_RACER_UNUSED_11); gCurrentRacerUnusedMiscAsset11 = gCurrentRacerMiscAssetPtr[racer->characterId]; - xPos = obj->segment.trans.x_position; - yPos = obj->segment.trans.y_position; - zPos = obj->segment.trans.z_position; + xPos = obj->trans.x_position; + yPos = obj->trans.y_position; + zPos = obj->trans.z_position; if (racer->unk1B2 > 0) { racer->unk1B2 -= updateRate; @@ -8740,7 +8718,7 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat objects = get_racer_objects(&countOfObjects); playerOneObj = playerTwoObj = NULL; for (var_t2 = 0; var_t2 < countOfObjects; var_t2++) { - tempRacer = &objects[var_t2]->unk64->racer; + tempRacer = objects[var_t2]->racer; if (tempRacer->playerIndex == PLAYER_ONE) { playerOneObj = objects[var_t2]; } @@ -8749,13 +8727,13 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat } } if (playerOneObj != NULL) { - var_fv1 = playerOneObj->segment.trans.x_position - obj->segment.trans.x_position; - temp_f0 = playerOneObj->segment.trans.z_position - obj->segment.trans.z_position; + var_fv1 = playerOneObj->trans.x_position - obj->trans.x_position; + temp_f0 = playerOneObj->trans.z_position - obj->trans.z_position; var_fv1 = (var_fv1 * var_fv1) + (temp_f0 * temp_f0); } if ((playerTwoObj != NULL) && (var_fv1 >= 160000.0)) { - var_fv1 = playerTwoObj->segment.trans.x_position - obj->segment.trans.x_position; - temp_f0 = playerTwoObj->segment.trans.z_position - obj->segment.trans.z_position; + var_fv1 = playerTwoObj->trans.x_position - obj->trans.x_position; + temp_f0 = playerTwoObj->trans.z_position - obj->trans.z_position; var_fv1 = (var_fv1 * var_fv1) + (temp_f0 * temp_f0); } } @@ -8794,8 +8772,8 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat } gCurrentRacerHandlingStat = 1; gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(ASSET_MISC_RACERACCELERATION_UNKNOWN0); - D_8011D568 = (f32 *) get_misc_asset(obj->segment.header->unk5D); - if ((obj->segment.y_velocity < 4.0) && ((racer->groundedWheels >= 3) || (racer->buoyancy != 0.0))) { + D_8011D568 = (f32 *) get_misc_asset(obj->header->unk5D); + if ((obj->y_velocity < 4.0) && ((racer->groundedWheels >= 3) || (racer->buoyancy != 0.0))) { racer->unk1F1 = 0; } if (racer->magnetTimer != 0) { @@ -8806,8 +8784,8 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat racer->buoyancy = 0; gRacerWaveCount = 0; } else { - gRacerWaveCount = func_8002B0F4(obj->segment.object.segmentID, obj->segment.trans.x_position, - obj->segment.trans.z_position, &gRacerCurrentWave); + gRacerWaveCount = + func_8002B0F4(obj->segmentID, obj->trans.x_position, obj->trans.z_position, &gRacerCurrentWave); } func_8002ACC8(0); if (racer->approachTarget != NULL || gRaceStartTimer != 0 || racer->bubbleTrapTimer > 0) { @@ -8885,9 +8863,9 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat } racer->unk1A8 = var_t2; } - racer->unk68 = obj->segment.trans.x_position; - racer->unk6C = obj->segment.trans.y_position; - racer->unk70 = obj->segment.trans.z_position; + racer->unk68 = obj->trans.x_position; + racer->unk6C = obj->trans.y_position; + racer->unk70 = obj->trans.z_position; } else { func_8005B818(obj, racer, updateRate, updateRateF); if (gameMode != GAMEMODE_MENU) { @@ -8936,12 +8914,11 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat if (racer->shieldTimer > 0) { if (racer->shieldTimer > 60) { if (racer->shieldSoundMask) { - audspat_point_set_position(racer->shieldSoundMask, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position); + audspat_point_set_position(racer->shieldSoundMask, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position); } else if (racer->vehicleSound) { - audspat_play_sound_at_position(SOUND_SHIELD, obj->segment.trans.x_position, - obj->segment.trans.y_position, obj->segment.trans.z_position, - AUDIO_POINT_FLAG_1, &racer->shieldSoundMask); + audspat_play_sound_at_position(SOUND_SHIELD, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_1, &racer->shieldSoundMask); } } else { if (racer->shieldSoundMask) { @@ -8955,22 +8932,22 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat } } if (racer->soundMask != NULL) { - audspat_point_set_position(racer->soundMask, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position); + audspat_point_set_position(racer->soundMask, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position); } gRacerInputBlocked = FALSE; if (racer->unk150 != NULL && gRaceStartTimer == 0) { s8 *temp; - racer->unk150->segment.trans.x_position = obj->segment.trans.x_position; + racer->unk150->trans.x_position = obj->trans.x_position; temp = (s8 *) get_misc_asset(ASSET_MISC_0); - racer->unk150->segment.trans.y_position = obj->segment.trans.y_position + temp[racer->characterId]; - racer->unk150->segment.trans.z_position = obj->segment.trans.z_position; - racer->unk150->segment.trans.scale = obj->segment.object.distanceToCamera / 265.0f; - if (obj->segment.object.distanceToCamera < 1500.0) { - racer->unk150->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; + racer->unk150->trans.y_position = obj->trans.y_position + temp[racer->characterId]; + racer->unk150->trans.z_position = obj->trans.z_position; + racer->unk150->trans.scale = obj->distanceToCamera / 265.0f; + if (obj->distanceToCamera < 1500.0) { + racer->unk150->trans.flags |= OBJ_FLAGS_INVISIBLE; } - if (racer->unk150->segment.trans.scale < 1.0) { - racer->unk150->segment.trans.scale = 1.0f; + if (racer->unk150->trans.scale < 1.0) { + racer->unk150->trans.scale = 1.0f; } racer->unk150 = NULL; } @@ -9130,9 +9107,9 @@ void func_8005B818(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer->unk68 += var_f24; racer->unk6C += var_f26; racer->unk70 += var_f28; - var_f24 = racer->unk68 - obj->segment.trans.x_position; - var_f26 = racer->unk6C - obj->segment.trans.y_position; - var_f28 = racer->unk70 - obj->segment.trans.z_position; + var_f24 = racer->unk68 - obj->trans.x_position; + var_f26 = racer->unk6C - obj->trans.y_position; + var_f28 = racer->unk70 - obj->trans.z_position; checkpointPositionOffset = sqrtf((var_f24 * var_f24) + (var_f28 * var_f28)) / updateRateF; if (checkpointPositionOffset > 35.0) { temp_f0 = (35.0 / checkpointPositionOffset); @@ -9171,62 +9148,62 @@ void func_8005B818(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR sp98 /= temp_f0; sp94 /= temp_f0; racer->steerVisualRotation = arctan2_f(sp9C, sp94) - 0x8000; - obj->segment.trans.rotation.y_rotation = racer->steerVisualRotation; - obj->segment.trans.rotation.x_rotation = arctan2_f(sp98, 1.0f); + obj->trans.rotation.y_rotation = racer->steerVisualRotation; + obj->trans.rotation.x_rotation = arctan2_f(sp98, 1.0f); } racer->unk1C2 = racer->unk1BE; racer->unk1C4 = racer->unk1C0; racer->unk1BE = racer->steerVisualRotation; - racer->unk1C0 = obj->segment.trans.rotation.x_rotation; + racer->unk1C0 = obj->trans.rotation.x_rotation; if (move_object(obj, var_f24, var_f26, var_f28)) { if (1) {} #if VERSION < VERSION_80 - obj->segment.trans.x_position += var_f24; - obj->segment.trans.y_position += var_f26; - obj->segment.trans.z_position += var_f28; + obj->trans.x_position += var_f24; + obj->trans.y_position += var_f26; + obj->trans.z_position += var_f28; #else model = get_current_level_model(); - obj->segment.trans.x_position += var_f24; - obj->segment.trans.y_position += var_f26; - obj->segment.trans.z_position += var_f28; + obj->trans.x_position += var_f24; + obj->trans.y_position += var_f26; + obj->trans.z_position += var_f28; // Don't get caught up on this using checkpointDistance var when documenting. It just matched that way. checkpointDistance = model->upperXBounds + 1000.0f; - if (obj->segment.trans.x_position > checkpointDistance) { - obj->segment.trans.x_position = checkpointDistance; + if (obj->trans.x_position > checkpointDistance) { + obj->trans.x_position = checkpointDistance; } checkpointDistance = model->lowerXBounds - 1000.0f; - if (obj->segment.trans.x_position < checkpointDistance) { - obj->segment.trans.x_position = checkpointDistance; + if (obj->trans.x_position < checkpointDistance) { + obj->trans.x_position = checkpointDistance; } checkpointDistance = model->upperYBounds + 3000.0f; - if (obj->segment.trans.y_position > checkpointDistance) { - obj->segment.trans.y_position = checkpointDistance; + if (obj->trans.y_position > checkpointDistance) { + obj->trans.y_position = checkpointDistance; } checkpointDistance = model->lowerYBounds - 500.0f; - if (obj->segment.trans.y_position < checkpointDistance) { - obj->segment.trans.y_position = checkpointDistance; + if (obj->trans.y_position < checkpointDistance) { + obj->trans.y_position = checkpointDistance; } checkpointDistance = model->upperZBounds + 1000.0f; - if (obj->segment.trans.z_position > checkpointDistance) { - obj->segment.trans.z_position = checkpointDistance; + if (obj->trans.z_position > checkpointDistance) { + obj->trans.z_position = checkpointDistance; } checkpointDistance = model->lowerZBounds - 1000.0f; - if (obj->segment.trans.z_position < checkpointDistance) { - obj->segment.trans.z_position = checkpointDistance; + if (obj->trans.z_position < checkpointDistance) { + obj->trans.z_position = checkpointDistance; } #endif } if (checkpointPositionOffset < 20.0) { - obj->segment.x_velocity = var_f24 / updateRateF; - obj->segment.y_velocity = -1.0f; - obj->segment.z_velocity = var_f28 / updateRateF; + obj->x_velocity = var_f24 / updateRateF; + obj->y_velocity = -1.0f; + obj->z_velocity = var_f28 / updateRateF; } func_80042D20(obj, racer, updateRate); handle_racer_items(obj, racer, updateRate); racer->waterTimer = 0; - obj->interactObj->x_position = obj->segment.trans.x_position; - obj->interactObj->y_position = obj->segment.trans.y_position; - obj->interactObj->z_position = obj->segment.trans.z_position; + obj->interactObj->x_position = obj->trans.x_position; + obj->interactObj->y_position = obj->trans.y_position; + obj->interactObj->z_position = obj->trans.z_position; racer->drift_direction = 0; racer->y_rotation_vel = 0; racer->z_rotation_vel = 0; @@ -9234,19 +9211,19 @@ void func_8005B818(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer->carBobX = 0.0f; racer->carBobY = 0.0f; racer->carBobZ = 0.0f; - obj->segment.y_velocity = 0.0f; - racer->unkD8.x = obj->segment.trans.x_position; - racer->unkD8.y = obj->segment.trans.y_position; - racer->unkD8.z = obj->segment.trans.z_position; - racer->unkE4.x = obj->segment.trans.x_position; - racer->unkE4.y = obj->segment.trans.y_position; - racer->unkE4.z = obj->segment.trans.z_position; - racer->unkF0.x = obj->segment.trans.x_position; - racer->unkF0.y = obj->segment.trans.y_position; - racer->unkF0.z = obj->segment.trans.z_position; - 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->y_velocity = 0.0f; + racer->unkD8.x = obj->trans.x_position; + racer->unkD8.y = obj->trans.y_position; + racer->unkD8.z = obj->trans.z_position; + racer->unkE4.x = obj->trans.x_position; + racer->unkE4.y = obj->trans.y_position; + racer->unkE4.z = obj->trans.z_position; + racer->unkF0.x = obj->trans.x_position; + racer->unkF0.y = obj->trans.y_position; + racer->unkF0.z = obj->trans.z_position; + racer->unkFC.x = obj->trans.x_position; + racer->unkFC.y = obj->trans.y_position; + racer->unkFC.z = obj->trans.z_position; obj->particleEmittersEnabled = OBJ_EMIT_NONE; update_vehicle_particles(obj, updateRate); } diff --git a/src/tracks.c b/src/tracks.c index 9ce821b3..65eba36f 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -1102,7 +1102,7 @@ s32 func_80027568(void) { f32 var_f22; f32 var_f24; u16 *var_t2; - Object_64 *obj64; + Object_Racer *racer; f32 camXPos; f32 camYPos; Object **racerGroup; // sp80 @@ -1119,8 +1119,8 @@ s32 func_80027568(void) { curViewport = get_current_viewport(); currentObjRacer = NULL; for (i = 0; i < numRacers; i++) { - obj64 = racerGroup[i]->unk64; - if (curViewport == obj64->racer.playerIndex) { + racer = racerGroup[i]->racer; + if (curViewport == racer->playerIndex) { currentObjRacer = racerGroup[i]; i = numRacers; // Come on! Just use break! } @@ -1128,7 +1128,7 @@ s32 func_80027568(void) { if (currentObjRacer == NULL) { return FALSE; } - func_80031130(1, ¤tObjRacer->segment.trans.x_position, &gSceneActiveCamera->trans.x_position, -1); + func_80031130(1, ¤tObjRacer->trans.x_position, &gSceneActiveCamera->trans.x_position, -1); ret = FALSE; // bug? var_ra can be undefined? for (var_t4 = 0; var_t4 < D_8011D378 && ret == FALSE; var_t4++) { @@ -1147,13 +1147,13 @@ s32 func_80027568(void) { (vector->z * gSceneActiveCamera->trans.z_position) + vector->w) - 14.0); if (projectedCamPos < -0.1) { - projectedRacerPos = (currentObjRacer->segment.trans.x_position * new_var) + - (vector->y * currentObjRacer->segment.trans.y_position) + - (vector->z * currentObjRacer->segment.trans.z_position) + vector->w; + projectedRacerPos = (currentObjRacer->trans.x_position * new_var) + + (vector->y * currentObjRacer->trans.y_position) + + (vector->z * currentObjRacer->trans.z_position) + vector->w; if (projectedRacerPos >= -0.1) { - var_f20 = (camXPos - currentObjRacer->segment.trans.x_position); - var_f22 = (camYPos - currentObjRacer->segment.trans.y_position); - var_f24 = (gSceneActiveCamera->trans.z_position - currentObjRacer->segment.trans.z_position); + var_f20 = (camXPos - currentObjRacer->trans.x_position); + var_f22 = (camYPos - currentObjRacer->trans.y_position); + var_f24 = (gSceneActiveCamera->trans.z_position - currentObjRacer->trans.z_position); if (projectedRacerPos != projectedCamPos) { scalingFactor = projectedRacerPos / (projectedRacerPos - projectedCamPos); @@ -1161,9 +1161,9 @@ s32 func_80027568(void) { scalingFactor = 0.0f; } - var_f20 = currentObjRacer->segment.trans.x_position + (var_f20 * scalingFactor); - var_f22 = currentObjRacer->segment.trans.y_position + (var_f22 * scalingFactor); - var_f24 = currentObjRacer->segment.trans.z_position + (var_f24 * scalingFactor); + var_f20 = currentObjRacer->trans.x_position + (var_f20 * scalingFactor); + var_f22 = currentObjRacer->trans.y_position + (var_f22 * scalingFactor); + var_f24 = currentObjRacer->trans.z_position + (var_f24 * scalingFactor); for (j = 0, ret = TRUE; j < 3 && ret == TRUE; j++) { isNegative = FALSE; @@ -1219,7 +1219,7 @@ void func_800278E8(s32 updateRate) { for (i = 0; i < numRacers; i++) { if (1) {} // fake if (racerGroup[i] != NULL) { - currentRacer = &racerGroup[i]->unk64->racer; + currentRacer = racerGroup[i]->racer; cameraId = currentRacer->cameraIndex; spectate_nearest(racerGroup[i], &cameraId); currentRacer->cameraIndex = cameraId; @@ -1253,12 +1253,12 @@ void func_800278E8(s32 updateRate) { } if (camObj != NULL) { camera = cam_get_active_camera_no_cutscenes(); - camera->trans.x_position = camObj->segment.trans.x_position; - camera->trans.y_position = camObj->segment.trans.y_position; - camera->trans.z_position = camObj->segment.trans.z_position; - xDelta = camera->trans.x_position - thisObject->segment.trans.x_position; - yDelta = camera->trans.y_position - thisObject->segment.trans.y_position; - zDelta = camera->trans.z_position - thisObject->segment.trans.z_position; + camera->trans.x_position = camObj->trans.x_position; + camera->trans.y_position = camObj->trans.y_position; + camera->trans.z_position = camObj->trans.z_position; + xDelta = camera->trans.x_position - thisObject->trans.x_position; + yDelta = camera->trans.y_position - thisObject->trans.y_position; + zDelta = camera->trans.z_position - thisObject->trans.z_position; xzSqr = sqrtf((xDelta * xDelta) + (zDelta * zDelta)); if (D_8011B108 != 0) { angleDiff = ((s32) (-atan2s(xDelta, zDelta) - camera->trans.rotation.y_rotation) + 0x8000); @@ -1345,7 +1345,7 @@ void spawn_skydome(s32 objectID) { spawnObject.objectID = objectID; gSkydomeSegment = spawn_object(&spawnObject, OBJECT_SPAWN_UNK02); if (gSkydomeSegment != NULL) { - gSkydomeSegment->segment.level_entry = NULL; + gSkydomeSegment->level_entry = NULL; gSkydomeSegment->objectID = -1; } } @@ -1658,9 +1658,9 @@ void render_skydome(void) { cam = cam_get_active_camera(); if (gCurrentLevelHeader2->skyDome == 0) { - gSkydomeSegment->segment.trans.x_position = cam->trans.x_position; - gSkydomeSegment->segment.trans.y_position = cam->trans.y_position; - gSkydomeSegment->segment.trans.z_position = cam->trans.z_position; + gSkydomeSegment->trans.x_position = cam->trans.x_position; + gSkydomeSegment->trans.y_position = cam->trans.y_position; + gSkydomeSegment->trans.z_position = cam->trans.z_position; } mtx_world_origin(&gTrackDL, &gTrackMtxPtr); @@ -1702,10 +1702,10 @@ void initialise_player_viewport_vars(s32 updateRate) { i = -1; do { i++; - racer = &racers[i]->unk64->racer; + racer = racers[i]->racer; } while (i < numRacers - 1 && viewportID != racer->playerIndex); - waves_visibility(racers[i]->segment.trans.x_position, racers[i]->segment.trans.y_position, - racers[i]->segment.trans.z_position, get_current_viewport(), updateRate); + waves_visibility(racers[i]->trans.x_position, racers[i]->trans.y_position, racers[i]->trans.z_position, + get_current_viewport(), updateRate); } else { waves_visibility(gSceneActiveCamera->trans.x_position, gSceneActiveCamera->trans.y_position, gSceneActiveCamera->trans.z_position, get_current_viewport(), updateRate); @@ -1780,25 +1780,25 @@ void render_level_geometry_and_objects(void) { for (i = sp160; i < objCount; i++) { obj = get_object(i); visible = 255; - objFlags = obj->segment.trans.flags; + objFlags = obj->trans.flags; if (objFlags & OBJ_FLAGS_UNK_0080) { visible = 0; } else if (!(objFlags & OBJ_FLAGS_PARTICLE)) { - visible = obj->segment.object.opacity; + visible = obj->opacity; } if (objFlags & visibleFlags) { visible = 0; } if (obj != NULL && visible == 255 && check_if_in_draw_range(obj) && - (objectsVisible[obj->segment.object.segmentID + 1] || obj->segment.object.unk34 > 1000.0)) { - if (obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) { + (objectsVisible[obj->segmentID + 1] || obj->unk34 > 1000.0)) { + if (obj->trans.flags & OBJ_FLAGS_PARTICLE) { render_object(&gTrackDL, &gTrackMtxPtr, &gTrackVtxPtr, obj); continue; } else if (obj->shadow != NULL) { shadow_render(obj, obj->shadow); } render_object(&gTrackDL, &gTrackMtxPtr, &gTrackVtxPtr, obj); - if (obj->waterEffect != NULL && obj->segment.header->flags & HEADER_FLAGS_WATER_EFFECT) { + if (obj->waterEffect != NULL && obj->header->flags & HEADER_FLAGS_WATER_EFFECT) { watereffect_render(obj, obj->waterEffect); } } @@ -1806,22 +1806,22 @@ void render_level_geometry_and_objects(void) { for (i = objCount - 1; i >= sp160; i--) { obj = get_object(i); - objFlags = obj->segment.trans.flags; + objFlags = obj->trans.flags; if (objFlags & visibleFlags) { visible = FALSE; } else { visible = TRUE; } - if (obj != NULL && visible && objFlags & OBJ_FLAGS_UNK_0100 && - objectsVisible[obj->segment.object.segmentID + 1] && check_if_in_draw_range(obj)) { - if (obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) { + if (obj != NULL && visible && objFlags & OBJ_FLAGS_UNK_0100 && objectsVisible[obj->segmentID + 1] && + check_if_in_draw_range(obj)) { + if (obj->trans.flags & OBJ_FLAGS_PARTICLE) { render_object(&gTrackDL, &gTrackMtxPtr, &gTrackVtxPtr, obj); continue; } else if (obj->shadow != NULL) { shadow_render(obj, obj->shadow); } render_object(&gTrackDL, &gTrackMtxPtr, &gTrackVtxPtr, obj); - if (obj->waterEffect != NULL && obj->segment.header->flags & HEADER_FLAGS_WATER_EFFECT) { + if (obj->waterEffect != NULL && obj->header->flags & HEADER_FLAGS_WATER_EFFECT) { watereffect_render(obj, obj->waterEffect); } } @@ -1845,11 +1845,11 @@ void render_level_geometry_and_objects(void) { for (i = objCount - 1; i >= sp160; i--) { obj = get_object(i); visible = 255; - objFlags = obj->segment.trans.flags; + objFlags = obj->trans.flags; if (objFlags & OBJ_FLAGS_UNK_0080) { visible = 1; } else if (!(objFlags & OBJ_FLAGS_PARTICLE)) { - visible = obj->segment.object.opacity; + visible = obj->opacity; } if (objFlags & visibleFlags) { visible = 0; @@ -1857,17 +1857,16 @@ void render_level_geometry_and_objects(void) { if (obj->behaviorId == BHV_RACER && visible >= 255) { visible = 0; } - if (obj != NULL && visible < 255 && objectsVisible[obj->segment.object.segmentID + 1] && - check_if_in_draw_range(obj)) { + if (obj != NULL && visible < 255 && objectsVisible[obj->segmentID + 1] && check_if_in_draw_range(obj)) { if (visible > 0) { - if (obj->segment.trans.flags & OBJ_FLAGS_PARTICLE) { + if (obj->trans.flags & OBJ_FLAGS_PARTICLE) { render_object(&gTrackDL, &gTrackMtxPtr, &gTrackVtxPtr, obj); goto skip; } else if (obj->shadow != NULL) { shadow_render(obj, obj->shadow); } render_object(&gTrackDL, &gTrackMtxPtr, &gTrackVtxPtr, obj); - if ((obj->waterEffect != 0) && (obj->segment.header->flags & HEADER_FLAGS_WATER_EFFECT)) { + if ((obj->waterEffect != 0) && (obj->header->flags & HEADER_FLAGS_WATER_EFFECT)) { watereffect_render(obj, obj->waterEffect); } } @@ -2070,9 +2069,9 @@ UNUSED s32 check_if_inside_segment(Object *obj, s32 segmentIndex) { return FALSE; } bb = &gCurrentLevelModel->segmentsBoundingBoxes[segmentIndex]; - x = obj->segment.trans.x_position; - y = obj->segment.trans.y_position; - z = obj->segment.trans.z_position; + x = obj->trans.x_position; + y = obj->trans.y_position; + z = obj->trans.z_position; if ((x < (bb->x2 + 25)) && ((bb->x1 - 25) < x) && (z < (bb->z2 + 25)) && ((bb->z1 - 25) < z) && (y < (bb->y2 + 25)) && ((bb->y1 - 25) < y)) { return TRUE; @@ -2328,21 +2327,21 @@ s32 check_if_in_draw_range(Object *obj) { s32 viewDistance; s32 alpha; s32 i; - Object_64 *obj64; + Object_AnimatedObject *animatedObj; f32 accum; s32 temp2; f32 dist; + Object_Racer *racer; - if (!(obj->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { + if (!(obj->trans.flags & OBJ_FLAGS_PARTICLE)) { alpha = 255; - viewDistance = obj->segment.header->drawDistance; - if (obj->segment.header->drawDistance) { + viewDistance = obj->header->drawDistance; + if (obj->header->drawDistance) { if (gScenePlayerViewports == 3) { viewDistance *= 0.5; } - dist = get_distance_to_active_camera(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position); + dist = get_distance_to_active_camera(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position); if (viewDistance < dist) { return FALSE; @@ -2362,12 +2361,12 @@ s32 check_if_in_draw_range(Object *obj) { } switch (obj->behaviorId) { case BHV_RACER: - obj64 = obj->unk64; - obj->segment.object.opacity = ((obj64->racer.transparency + 1) * alpha) >> 8; + racer = obj->racer; + obj->opacity = ((racer->transparency + 1) * alpha) >> 8; break; case BHV_TIMETRIAL_GHOST: // Ghost Object? - obj64 = obj->unk64; - obj->segment.object.opacity = obj64->racer.transparency; + racer = obj->racer; + obj->opacity = racer->transparency; break; case BHV_ANIMATED_OBJECT: // Cutscene object? case BHV_CAMERA_ANIMATION: @@ -2377,15 +2376,15 @@ s32 check_if_in_draw_range(Object *obj) { case BHV_HIT_TESTER: // hittester case BHV_HIT_TESTER_2: // animated objects? case BHV_ANIMATED_OBJECT_2: // space ships - obj64 = obj->unk64; - obj->segment.object.opacity = obj64->animation.unk42; + animatedObj = obj->animatedObject; + obj->opacity = animatedObj->unk42; break; case BHV_PARK_WARDEN: case BHV_GOLDEN_BALLOON: case BHV_PARK_WARDEN_2: // GBParkwarden break; default: - obj->segment.object.opacity = alpha; + obj->opacity = alpha; break; } for (i = 0; i < 3; i++) { @@ -2393,8 +2392,8 @@ s32 check_if_in_draw_range(Object *obj) { z = D_8011D0F8[i].z; w = D_8011D0F8[i].w; y = D_8011D0F8[i].y; - accum = (x * obj->segment.trans.x_position) + (y * obj->segment.trans.y_position) + - (z * obj->segment.trans.z_position) + w + obj->segment.object.unk34; + accum = (x * obj->trans.x_position) + (y * obj->trans.y_position) + (z * obj->trans.z_position) + w + + obj->unk34; if (accum < 0.0f) { return FALSE; } @@ -2679,14 +2678,12 @@ s32 func_8002B9BC(Object *obj, f32 *arg1, Vec3f *arg2, s32 arg3) { arg2->z = 0.0f; arg2->y = 1.0f; } - if ((obj->segment.object.segmentID < 0) || - (obj->segment.object.segmentID >= gCurrentLevelModel->numberOfSegments)) { + if ((obj->segmentID < 0) || (obj->segmentID >= gCurrentLevelModel->numberOfSegments)) { return FALSE; } - seg = &gCurrentLevelModel->segments[obj->segment.object.segmentID]; + seg = &gCurrentLevelModel->segments[obj->segmentID]; if ((seg->hasWaves != 0) && (gWaveBlockCount != 0) && (arg3 == 1)) { - *arg1 = func_800BB2F4(obj->segment.object.segmentID, obj->segment.trans.x_position, - obj->segment.trans.z_position, arg2); + *arg1 = func_800BB2F4(obj->segmentID, obj->trans.x_position, obj->trans.z_position, arg2); return TRUE; } else { *arg1 = seg->unk38; @@ -3261,10 +3258,10 @@ void shadow_render(Object *obj, ShadowData *shadow) { s32 triCount; s32 alpha; - if (obj->segment.header->shadowGroup) { + if (obj->header->shadowGroup) { if (shadow->meshStart != -1 && gDisableShadows == FALSE) { gShadowIndex = gShadowHeapFlip; - if (obj->segment.header->shadowGroup == SHADOW_SCENERY) { + if (obj->header->shadowGroup == SHADOW_SCENERY) { gShadowIndex += 2; } i = shadow->meshStart; @@ -3273,11 +3270,11 @@ void shadow_render(Object *obj, ShadowData *shadow) { gCurrShadowVerts = gShadowHeapVerts[gShadowIndex]; alpha = gCurrShadowVerts[gCurrShadowHeapData[i].vtxCount].a; flags = RENDER_FOG_ACTIVE | RENDER_Z_COMPARE; - if (alpha == 0 || obj->segment.object.opacity == 0) { + if (alpha == 0 || obj->opacity == 0) { i = shadow->meshEnd; // It'd be easier to just return... - } else if (alpha != 255 || obj->segment.object.opacity != 255) { + } else if (alpha != 255 || obj->opacity != 255) { flags = RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_Z_COMPARE; - alpha = (obj->segment.object.opacity * alpha) >> 8; + alpha = (obj->opacity * alpha) >> 8; gDPSetPrimColor(gTrackDL++, 0, 0, 255, 255, 255, alpha); } while (i < shadow->meshEnd) { @@ -3315,14 +3312,14 @@ void watereffect_render(Object *obj, WaterEffect *effect) { UNUSED s32 triCount; UNUSED s32 vtxCount; - if (obj->segment.header->waterEffectGroup) { + if (obj->header->waterEffectGroup) { if (effect->meshStart != -1 && gDisableShadows == FALSE) { gWaterEffectIndex = gShadowHeapFlip; i = effect->meshStart; - if (obj->segment.header->waterEffectGroup == SHADOW_SCENERY) { + if (obj->header->waterEffectGroup == SHADOW_SCENERY) { gWaterEffectIndex += 2; - if (get_distance_to_active_camera(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position) > 768.0f) { + if (get_distance_to_active_camera(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position) > + 768.0f) { i = effect->meshEnd; // Just return. } } @@ -3380,23 +3377,22 @@ void shadow_update(s32 group, s32 waterGroup, s32 updateRate) { objects = objGetObjList(&objIndex, &objectCount); while (objIndex < objectCount) { obj = objects[objIndex]; - objHeader = obj->segment.header; + objHeader = obj->header; waterEffect = obj->waterEffect; shadow = obj->shadow; objIndex += 1; - if ((obj->segment.trans.flags & OBJ_FLAGS_PARTICLE)) { + if ((obj->trans.flags & OBJ_FLAGS_PARTICLE)) { continue; } if (shadow != NULL && shadow->scale > 0.0f && group == objHeader->shadowGroup) { shadow->meshStart = -1; } - if (obj->segment.trans.flags & OBJ_FLAGS_INVISIBLE) { + if (obj->trans.flags & OBJ_FLAGS_INVISIBLE) { shadow = NULL; } if ((shadow != NULL && objHeader->shadowGroup == SHADOW_ACTORS) || (waterEffect != NULL && objHeader->waterEffectGroup == SHADOW_ACTORS)) { - dist = get_distance_to_active_camera(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position); + dist = get_distance_to_active_camera(obj->trans.x_position, obj->trans.y_position, obj->trans.z_position); } else { dist = 0; } @@ -3408,7 +3404,7 @@ void shadow_update(s32 group, s32 waterGroup, s32 updateRate) { if (objHeader->shadowGroup == SHADOW_ACTORS && numViewports >= TWO_PLAYERS && numViewports <= FOUR_PLAYERS) { if (obj->behaviorId == BHV_RACER) { - playerIndex = obj->unk64->racer.playerIndex; + playerIndex = obj->racer->playerIndex; if (playerIndex != PLAYER_COMPUTER) { shadow_generate(obj, FALSE); skipShading = TRUE; @@ -3446,7 +3442,7 @@ void shadow_update(s32 group, s32 waterGroup, s32 updateRate) { if (objHeader->shadowGroup == SHADOW_ACTORS && numViewports >= TWO_PLAYERS && numViewports <= FOUR_PLAYERS) { if (obj->behaviorId == BHV_RACER) { - playerIndex = obj->unk64->racer.playerIndex; + playerIndex = obj->racer->playerIndex; if (playerIndex != PLAYER_COMPUTER) { shadow_generate(obj, TRUE); } @@ -3484,14 +3480,14 @@ void func_8002DE30(Object *obj) { s32 maxYPos; s32 j; - sp94 = (s32) obj->segment.trans.y_position + obj->segment.header->unk44; - sp90 = (s32) obj->segment.trans.y_position + obj->segment.header->unk42; - blockId = obj->segment.object.segmentID; + sp94 = (s32) obj->trans.y_position + obj->header->unk44; + sp90 = (s32) obj->trans.y_position + obj->header->unk42; + blockId = obj->segmentID; foundResult = FALSE; if (blockId != -1) { - var_t3 = func_800314DC(&gCurrentLevelModel->segmentsBoundingBoxes[blockId], - obj->segment.trans.x_position - 16.0f, obj->segment.trans.z_position - 16.0f, - obj->segment.trans.x_position + 16.0f, obj->segment.trans.z_position + 16.0f); + var_t3 = + func_800314DC(&gCurrentLevelModel->segmentsBoundingBoxes[blockId], obj->trans.x_position - 16.0f, + obj->trans.z_position - 16.0f, obj->trans.x_position + 16.0f, obj->trans.z_position + 16.0f); block = &gCurrentLevelModel->segments[blockId]; for (i = 0; i < block->numberOfBatches && !foundResult; i++) { if (!(block->batches[i].flags & (RENDER_HIDDEN | RENDER_DECAL | RENDER_WATER | RENDER_NO_SHADOW))) { @@ -3513,7 +3509,7 @@ void func_8002DE30(Object *obj) { } } if (maxYPos >= sp90 && sp94 >= minYPos) { - if (tri2d_xz_contains_point(obj->segment.trans.x_position, obj->segment.trans.z_position, + if (tri2d_xz_contains_point(obj->trans.x_position, obj->trans.z_position, (Vec3s *) &vertices[triangle->verticesArray[1]], (Vec3s *) &vertices[triangle->verticesArray[2]], (Vec3s *) &vertices[triangle->verticesArray[3]])) { @@ -3545,7 +3541,7 @@ void shadow_generate(Object *obj, s32 isWater) { f32 character_scale; s32 test; - yPos = obj->segment.trans.y_position; + yPos = obj->trans.y_position; character_scale = 1.0f; if (obj->behaviorId == BHV_RACER) { cheats = get_filtered_cheats(); @@ -3563,8 +3559,8 @@ void shadow_generate(Object *obj, s32 isWater) { D_8011D0B8 = 0; obj->waterEffect->meshStart = gShadowTail; gNewShadowTexture = set_animated_texture_header(obj->waterEffect->texture, obj->waterEffect->textureFrame << 8); - gNewShadowY2 = obj->segment.header->shadowTop + yPos; - gNewShadowY1 = obj->segment.header->shadowBottom + yPos; + gNewShadowY2 = obj->header->shadowTop + yPos; + gNewShadowY1 = obj->header->shadowBottom + yPos; if (gWaveBlockCount == 0 || cam_get_viewport_layout() < VIEWPORT_LAYOUT_2_PLAYERS) { D_8011D0C8 = 0; } @@ -3575,10 +3571,10 @@ void shadow_generate(Object *obj, s32 isWater) { } else { obj->shadow->meshStart = gShadowTail; gNewShadowTexture = obj->shadow->texture; - gNewShadowY2 = obj->segment.header->unk44 + yPos; - gNewShadowY1 = obj->segment.header->unk42 + yPos; + gNewShadowY2 = obj->header->unk44 + yPos; + gNewShadowY1 = obj->header->unk42 + yPos; if (obj->behaviorId != BHV_RACER) { - dist = obj->segment.object.distanceToCamera; + dist = obj->distanceToCamera; if (dist < 0.0) { dist = -dist; } @@ -3595,7 +3591,7 @@ void shadow_generate(Object *obj, s32 isWater) { gNewShadowWidth = gNewShadowScale * 10.0f; gNewShadowLength = gNewShadowScale * 10.0f; D_8011D0E4 = 4.0f * gNewShadowWidth * gNewShadowLength; - D_8011D0F0 = (obj->segment.header->unk42 * 0.125f); + D_8011D0F0 = (obj->header->unk42 * 0.125f); if (D_8011D0F0 < 0.0f) { D_8011D0F0 = -D_8011D0F0; } @@ -3603,8 +3599,8 @@ void shadow_generate(Object *obj, s32 isWater) { D_8011D0D0 = -0x8000; } gNewShadowScale = 144.0f / gNewShadowScale; - xPos = gNewShadowObj->segment.trans.x_position; - zPos = gNewShadowObj->segment.trans.z_position; + xPos = gNewShadowObj->trans.x_position; + zPos = gNewShadowObj->trans.z_position; segs = get_inside_segment_count_xyz(inSegs, (xPos - gNewShadowWidth), gNewShadowY1, (zPos - gNewShadowLength), (xPos + gNewShadowWidth), gNewShadowY2, (zPos + gNewShadowLength)); D_8011C230 = 0; @@ -3620,10 +3616,10 @@ void shadow_generate(Object *obj, s32 isWater) { func_8002EEEC(inSegs[i]); } else { test = func_800314DC(&gCurrentLevelModel->segmentsBoundingBoxes[inSegs[i]], - (obj->segment.trans.x_position - gNewShadowWidth), // x1 - (obj->segment.trans.z_position - gNewShadowLength), // z1 - (obj->segment.trans.x_position + gNewShadowWidth), // x2 - (obj->segment.trans.z_position + gNewShadowLength) // z2 + (obj->trans.x_position - gNewShadowWidth), // x1 + (obj->trans.z_position - gNewShadowLength), // z1 + (obj->trans.x_position + gNewShadowWidth), // x2 + (obj->trans.z_position + gNewShadowLength) // z2 ); func_8002E904(&gCurrentLevelModel->segments[inSegs[i]], test, isWater); } @@ -3661,14 +3657,14 @@ void func_8002E904(LevelModelSegment *arg0, s32 arg1, s32 arg2) { s32 i; s32 curFacesOffset; - spD0[0].x = gNewShadowObj->segment.trans.x_position + gNewShadowWidth; - spD0[0].y = gNewShadowObj->segment.trans.z_position + gNewShadowLength; - spD0[1].x = gNewShadowObj->segment.trans.x_position - gNewShadowWidth; - spD0[1].y = gNewShadowObj->segment.trans.z_position + gNewShadowLength; - spD0[2].x = gNewShadowObj->segment.trans.x_position - gNewShadowWidth; - spD0[2].y = gNewShadowObj->segment.trans.z_position - gNewShadowLength; - spD0[3].x = gNewShadowObj->segment.trans.x_position + gNewShadowWidth; - spD0[3].y = gNewShadowObj->segment.trans.z_position - gNewShadowLength; + spD0[0].x = gNewShadowObj->trans.x_position + gNewShadowWidth; + spD0[0].y = gNewShadowObj->trans.z_position + gNewShadowLength; + spD0[1].x = gNewShadowObj->trans.x_position - gNewShadowWidth; + spD0[1].y = gNewShadowObj->trans.z_position + gNewShadowLength; + spD0[2].x = gNewShadowObj->trans.x_position - gNewShadowWidth; + spD0[2].y = gNewShadowObj->trans.z_position - gNewShadowLength; + spD0[3].x = gNewShadowObj->trans.x_position + gNewShadowWidth; + spD0[3].y = gNewShadowObj->trans.z_position - gNewShadowLength; for (spAC = 0; spAC < arg0->numberOfBatches; spAC++) { if ((arg2 && (arg0->batches[spAC].flags & RENDER_WATER)) || @@ -3764,14 +3760,14 @@ void func_8002EEEC(s32 arg0) { s32 var_v1; s32 tempIdx; - sp88[0].x = gNewShadowObj->segment.trans.x_position + gNewShadowWidth; - sp88[0].y = gNewShadowObj->segment.trans.z_position + gNewShadowLength; - sp88[1].x = gNewShadowObj->segment.trans.x_position - gNewShadowWidth; - sp88[1].y = gNewShadowObj->segment.trans.z_position + gNewShadowLength; - sp88[2].x = gNewShadowObj->segment.trans.x_position - gNewShadowWidth; - sp88[2].y = gNewShadowObj->segment.trans.z_position - gNewShadowLength; - sp88[3].x = gNewShadowObj->segment.trans.x_position + gNewShadowWidth; - sp88[3].y = gNewShadowObj->segment.trans.z_position - gNewShadowLength; + sp88[0].x = gNewShadowObj->trans.x_position + gNewShadowWidth; + sp88[0].y = gNewShadowObj->trans.z_position + gNewShadowLength; + sp88[1].x = gNewShadowObj->trans.x_position - gNewShadowWidth; + sp88[1].y = gNewShadowObj->trans.z_position + gNewShadowLength; + sp88[2].x = gNewShadowObj->trans.x_position - gNewShadowWidth; + sp88[2].y = gNewShadowObj->trans.z_position - gNewShadowLength; + sp88[3].x = gNewShadowObj->trans.x_position + gNewShadowWidth; + sp88[3].y = gNewShadowObj->trans.z_position - gNewShadowLength; // clang-format off temp_v0 = func_800BDC80( arg0, D_8011C3B8, &D_8011C8B8[D_8011D0B8], @@ -3889,13 +3885,13 @@ void func_8002F440(void) { UNUSED s32 pad; alpha = 255; - yRotSin = sins_f(gNewShadowObj->segment.trans.rotation.y_rotation); - yRotCos = coss_f(gNewShadowObj->segment.trans.rotation.y_rotation); + yRotSin = sins_f(gNewShadowObj->trans.rotation.y_rotation); + yRotCos = coss_f(gNewShadowObj->trans.rotation.y_rotation); temp_f18 = gNewShadowTexture->width * 16; scale = ((gNewShadowTexture->width * 16) / gNewShadowWidth); scale *= 1.4142f; if (D_8011D0F0 > 0.0f) { - someY = gNewShadowObj->segment.trans.y_position - D_8011D0D0; + someY = gNewShadowObj->trans.y_position - D_8011D0D0; if (D_8011D0F0 < someY) { alpha = 255; alpha -= (s32) ((255 * (someY - D_8011D0F0)) / D_8011D0F4); @@ -3924,16 +3920,16 @@ void func_8002F440(void) { gNewShadowVtxCount++; if (var_t0 & 1) { vert->x = D_8011B330[D_8011C238[spAC].unk2[i]].x; - xDiff = D_8011B330[D_8011C238[spAC].unk2[i]].x - gNewShadowObj->segment.trans.x_position; + xDiff = D_8011B330[D_8011C238[spAC].unk2[i]].x - gNewShadowObj->trans.x_position; vert->y = (D_8011B330[D_8011C238[spAC].unk2[i]].y + D_8011D0C8); vert->z = D_8011B330[D_8011C238[spAC].unk2[i]].z; - zDiff = D_8011B330[D_8011C238[spAC].unk2[i]].z - gNewShadowObj->segment.trans.z_position; + zDiff = D_8011B330[D_8011C238[spAC].unk2[i]].z - gNewShadowObj->trans.z_position; } else { vert->x = D_8011B120[D_8011C238[spAC].unk2[i]].x; - xDiff = D_8011B120[D_8011C238[spAC].unk2[i]].x - gNewShadowObj->segment.trans.x_position; + xDiff = D_8011B120[D_8011C238[spAC].unk2[i]].x - gNewShadowObj->trans.x_position; vert->y = (D_8011B120[D_8011C238[spAC].unk2[i]].y + D_8011D0C8); vert->z = D_8011B120[D_8011C238[spAC].unk2[i]].z; - zDiff = D_8011B120[D_8011C238[spAC].unk2[i]].z - gNewShadowObj->segment.trans.z_position; + zDiff = D_8011B120[D_8011C238[spAC].unk2[i]].z - gNewShadowObj->trans.z_position; } var_t0 >>= 1; vert->r = 255; @@ -4192,26 +4188,26 @@ void func_800304C8(unk8011C8B8 *arg0) { temp = arg0[0].z; arg00z = temp; compare = 0.0f; - temp = (gNewShadowObj->segment.trans.z_position - arg0[1].z); + temp = (gNewShadowObj->trans.z_position - arg0[1].z); - if ((((gNewShadowObj->segment.trans.x_position - arg0[0].x) * (arg0[1].z - arg00z)) - - ((arg0[1].x - arg0[0].x) * (((0, gNewShadowObj->segment.trans.z_position)) - arg00z))) >= compare) { + if ((((gNewShadowObj->trans.x_position - arg0[0].x) * (arg0[1].z - arg00z)) - + ((arg0[1].x - arg0[0].x) * (((0, gNewShadowObj->trans.z_position)) - arg00z))) >= compare) { found1 = TRUE; } - if ((((gNewShadowObj->segment.trans.x_position - arg0[1].x) * (arg0[2].z - arg0[1].z)) - + if ((((gNewShadowObj->trans.x_position - arg0[1].x) * (arg0[2].z - arg0[1].z)) - (temp * (arg0[2].x - arg0[1].x))) >= compare) { found2 = TRUE; } arg02x = arg0[2].x; if (found1 == found2) { f32 zPosDiff = (arg00z - arg0[2].z); - if ((((gNewShadowObj->segment.trans.x_position - arg02x) * zPosDiff) - - ((arg0[0].x - arg02x) * (arg02x - arg0[2].z))) >= compare) { + if ((((gNewShadowObj->trans.x_position - arg02x) * zPosDiff) - ((arg0[0].x - arg02x) * (arg02x - arg0[2].z))) >= + compare) { found3 = TRUE; } if (found2 == found3) { - f32 test = (-(((D_8011D0BC->x * gNewShadowObj->segment.trans.x_position) + - (D_8011D0BC->z * gNewShadowObj->segment.trans.z_position)) + + f32 test = (-(((D_8011D0BC->x * gNewShadowObj->trans.x_position) + + (D_8011D0BC->z * gNewShadowObj->trans.z_position)) + D_8011D0BC->unkC_union.w)) / D_8011D0BC->y; if (D_8011D0D0 < test) { @@ -4366,7 +4362,7 @@ void obj_loop_fogchanger(Object *obj) { Camera *camera; racers = NULL; - fogChanger = (LevelObjectEntry_FogChanger *) obj->segment.level_entry; + fogChanger = (LevelObjectEntry_FogChanger *) obj->level_entry; camera = NULL; if (check_if_showing_cutscene_camera()) { @@ -4379,12 +4375,12 @@ void obj_loop_fogchanger(Object *obj) { for (i = 0; i < views; i++) { index = PLAYER_COMPUTER; if (racers != NULL) { - racer = &racers[i]->unk64->racer; + racer = racers[i]->racer; playerIndex = racer->playerIndex; if (playerIndex >= PLAYER_ONE && playerIndex <= PLAYER_FOUR && obj != gFogData[playerIndex].fogChanger) { index = playerIndex; - x = racers[i]->segment.trans.x_position; - z = racers[i]->segment.trans.z_position; + x = racers[i]->trans.x_position; + z = racers[i]->trans.z_position; } } else if (i <= PLAYER_FOUR && obj != gFogData[i].fogChanger) { index = i; @@ -4392,8 +4388,8 @@ void obj_loop_fogchanger(Object *obj) { z = camera[i].trans.z_position; } if (index != PLAYER_COMPUTER) { - x -= obj->segment.trans.x_position; - z -= obj->segment.trans.z_position; + x -= obj->trans.x_position; + z -= obj->trans.z_position; if (1) {} // Fakematch if ((x * x) + (z * z) < obj->properties.distance.radius) { fogNear = fogChanger->near; diff --git a/src/vehicle_bluey.c b/src/vehicle_bluey.c index 3e006336..0585d94a 100644 --- a/src/vehicle_bluey.c +++ b/src/vehicle_bluey.c @@ -61,8 +61,8 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra set_boss_voice_clip_offset(gBlueyVoiceTable); *buttonsPressed &= ~R_TRIG; *input &= ~R_TRIG; - animID = obj->segment.object.animationID; - animFrame = obj->segment.animFrame; + animID = obj->animationID; + animFrame = obj->animFrame; tempHeadAngle = racer->headAngle; if (racer->raceFinished == TRUE && func_80023568()) { func_80021400(130); @@ -93,37 +93,37 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra *startTimer = tempStartTimer; racer->lateral_velocity = 0.0f; racer->headAngle = tempHeadAngle; - obj->segment.object.animationID = animID; - obj->segment.animFrame = animFrame; + obj->animationID = animID; + obj->animFrame = animFrame; if (racer->attackType != ATTACK_NONE) { - if (obj->segment.object.animationID != ANIM_BLUEY_DAMAGE) { - racer->unk1CD = obj->segment.object.animationID; - obj->segment.object.animationID = ANIM_BLUEY_DAMAGE; + if (obj->animationID != ANIM_BLUEY_DAMAGE) { + racer->unk1CD = obj->animationID; + obj->animationID = ANIM_BLUEY_DAMAGE; racer->animationSpeed = 0.0f; play_random_boss_sound(BOSS_SOUND_NEGATIVE); sound_play(SOUND_EXPLOSION, NULL); set_camera_shake(12.0f); racer->attackType = ATTACK_NONE; racer->velocity *= 0.3; - obj->segment.y_velocity += 7.5; + obj->y_velocity += 7.5; } } if (racer->approachTarget != NULL) { - diffX = obj->segment.x_velocity * obj->segment.x_velocity; - diffZ = obj->segment.z_velocity * obj->segment.z_velocity; + diffX = obj->x_velocity * obj->x_velocity; + diffZ = obj->z_velocity * obj->z_velocity; racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); } sp3C = FALSE; if ((find_next_checkpoint_node(racer->checkpoint, racer->unk1C8))->unk36[racer->unk1CA] == 1) { sp3C = TRUE; } - if (obj->segment.object.animationID != ANIM_BLUEY_DAMAGE) { + if (obj->animationID != ANIM_BLUEY_DAMAGE) { if (racer->velocity < -2.0) { if (sp3C) { if (racer->unk1CD != 3) { racer->animationSpeed = 40.0f; } - obj->segment.object.animationID = ANIM_BLUEY_TURN; + obj->animationID = ANIM_BLUEY_TURN; steerVel = racer->steerAngle * 2; steerVel = 40 - steerVel; if (steerVel < 0) { @@ -136,16 +136,16 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra racer->animationSpeed += (steerVel - racer->animationSpeed) * 0.25; } else { racer->unk1CD = 0; - obj->segment.object.animationID = ANIM_BLUEY_RUN; + obj->animationID = ANIM_BLUEY_RUN; racer->animationSpeed -= (racer->velocity * updateRateF) * 0.5; } } else if (racer->velocity < -0.1 || 0.1 < racer->velocity) { racer->unk1CD = 1; - obj->segment.object.animationID = ANIM_BLUEY_WALK; + obj->animationID = ANIM_BLUEY_WALK; racer->animationSpeed -= racer->velocity * updateRateF * 2; } else { racer->unk1CD = 2; - obj->segment.object.animationID = ANIM_BLUEY_IDLE; + obj->animationID = ANIM_BLUEY_IDLE; racer->animationSpeed += updateRateF * 1.0; } } else { @@ -153,7 +153,7 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra } modInst = obj->modelInstances[0]; objModel = modInst->objModel; - diffX = (objModel->animations[obj->segment.object.animationID].animLength * 16) - 17; + diffX = (objModel->animations[obj->animationID].animLength * 16) - 17; while (racer->animationSpeed < 0.0f) { racer->animationSpeed += diffX; modInst->animationID = -1; @@ -162,38 +162,38 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra racer->animationSpeed -= diffX; modInst->animationID = -1; } - if (modInst->animationID == -1 && obj->segment.object.animationID == ANIM_BLUEY_DAMAGE) { - obj->segment.object.animationID = racer->unk1CD; + if (modInst->animationID == -1 && obj->animationID == ANIM_BLUEY_DAMAGE) { + obj->animationID = racer->unk1CD; } - animFrame = obj->segment.animFrame; - obj->segment.animFrame = racer->animationSpeed; + animFrame = obj->animFrame; + obj->animFrame = racer->animationSpeed; obj->particleEmittersEnabled = OBJ_EMIT_NONE; - if (obj->segment.object.animationID == ANIM_BLUEY_RUN) { + if (obj->animationID == ANIM_BLUEY_RUN) { play_footstep_sounds(obj, 2, animFrame, SOUND_STOMP2, SOUND_STOMP3); obj->particleEmittersEnabled |= OBJ_EMIT_1 | OBJ_EMIT_2; } obj_spawn_particle(obj, updateRate); fade_when_near_camera(obj, racer, 40); firstRacerObj = get_racer_object(PLAYER_ONE); - diffX = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffZ = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = firstRacerObj->trans.x_position - obj->trans.x_position; + diffZ = firstRacerObj->trans.z_position - obj->trans.z_position; if (sqrtf((diffX * diffX) + (diffZ * diffZ)) < 700.0) { - tempStartTimer = (arctan2_f(diffX, diffZ) - (obj->segment.trans.rotation.y_rotation & 0xFFFF)) + 0x8000; + tempStartTimer = (arctan2_f(diffX, diffZ) - (obj->trans.rotation.y_rotation & 0xFFFF)) + 0x8000; WRAP(tempStartTimer, -0x8000, 0x8000); CLAMP(tempStartTimer, -0xC00, 0xC00); racer->headAngleTarget = tempStartTimer; } - if (obj->segment.object.animationID == ANIM_BLUEY_WALK) { + if (obj->animationID == ANIM_BLUEY_WALK) { if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } - if (obj->segment.object.animationID == ANIM_BLUEY_TURN) { + if (obj->animationID == ANIM_BLUEY_TURN) { racer->headAngleTarget = 0; } - racer = &firstRacerObj->unk64->racer; + racer = firstRacerObj->racer; if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && - obj->segment.object.animationID == ANIM_BLUEY_WALK) { + obj->animationID == ANIM_BLUEY_WALK) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished) { diff --git a/src/vehicle_bubbler.c b/src/vehicle_bubbler.c index 3d31aaab..0d65c44f 100644 --- a/src/vehicle_bubbler.c +++ b/src/vehicle_bubbler.c @@ -64,8 +64,8 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * set_boss_voice_clip_offset(gBubblerVoiceTable); *buttonsPressed &= ~R_TRIG; *input &= ~R_TRIG; - animID = obj->segment.object.animationID; - animFrame = obj->segment.animFrame; + animID = obj->animationID; + animFrame = obj->animFrame; tempHeadAngle = racer->headAngle; if (racer->raceFinished == TRUE) { func_80021400(130); @@ -93,12 +93,12 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * *startTimer = timer; racer->lateral_velocity = 0.0f; racer->headAngle = tempHeadAngle; - obj->segment.object.animationID = animID; - obj->segment.animFrame = animFrame; - if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != ANIM_BUBBLER_DAMAGE) { - racer->unk1CD = obj->segment.object.animationID; - obj->segment.object.animationID = ANIM_BUBBLER_DAMAGE; - obj->segment.y_velocity += 7.5; + obj->animationID = animID; + obj->animFrame = animFrame; + if (racer->attackType != ATTACK_NONE && obj->animationID != ANIM_BUBBLER_DAMAGE) { + racer->unk1CD = obj->animationID; + obj->animationID = ANIM_BUBBLER_DAMAGE; + obj->y_velocity += 7.5; play_random_boss_sound(BOSS_SOUND_NEGATIVE); sound_play(SOUND_EXPLOSION, NULL); set_camera_shake(12.0f); @@ -107,14 +107,14 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * } racer->attackType = ATTACK_NONE; if (racer->approachTarget != 0) { - diffX = obj->segment.x_velocity * obj->segment.x_velocity; - diffZ = obj->segment.z_velocity * obj->segment.z_velocity; + diffX = obj->x_velocity * obj->x_velocity; + diffZ = obj->z_velocity * obj->z_velocity; racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); } modInst = obj->modelInstances[0]; model = modInst->objModel; - diffX = (model->animations[obj->segment.object.animationID].animLength * 16) - 17; - obj->segment.object.animationID = ANIM_BUBBLER_MOVE; + diffX = (model->animations[obj->animationID].animLength * 16) - 17; + obj->animationID = ANIM_BUBBLER_MOVE; racer->animationSpeed += 2.0 * updateRateF; while (racer->animationSpeed < 0.0f) { racer->animationSpeed += diffX; @@ -124,11 +124,11 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * racer->animationSpeed -= diffX; modInst->animationID = -1; } - if (modInst->animationID == -1 && obj->segment.object.animationID == ANIM_BUBBLER_DAMAGE) { - obj->segment.object.animationID = ANIM_BUBBLER_MOVE; + if (modInst->animationID == -1 && obj->animationID == ANIM_BUBBLER_DAMAGE) { + obj->animationID = ANIM_BUBBLER_MOVE; racer->animationSpeed = 0.0f; } - obj->segment.animFrame = racer->animationSpeed; + obj->animFrame = racer->animationSpeed; if (racer->playerIndex == PLAYER_COMPUTER) { temp2 = func_80023568(); if (temp2 != 0) { @@ -142,7 +142,7 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * obj->particleEmittersEnabled = OBJ_EMIT_NONE; obj_spawn_particle(obj, updateRate); fade_when_near_camera(obj, racer, 40); - switch (obj->segment.object.animationID) { + switch (obj->animationID) { case ANIM_BUBBLER_MOVE: headAngleRange = 0x2500; break; @@ -154,22 +154,22 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * break; } firstRacerObj = get_racer_object(PLAYER_ONE); - diffX = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffZ = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = firstRacerObj->trans.x_position - obj->trans.x_position; + diffZ = firstRacerObj->trans.z_position - obj->trans.z_position; if (sqrtf((diffX * diffX) + (diffZ * diffZ)) < 700.0) { - timer = (arctan2_f(diffX, diffZ) - (obj->segment.trans.rotation.y_rotation & 0xFFFF)) + 0x8000; + timer = (arctan2_f(diffX, diffZ) - (obj->trans.rotation.y_rotation & 0xFFFF)) + 0x8000; WRAP(timer, -0x8000, 0x8000); CLAMP(timer, -headAngleRange, headAngleRange); racer->headAngleTarget = timer; } - if (obj->segment.object.animationID == ANIM_BUBBLER_MOVE) { + if (obj->animationID == ANIM_BUBBLER_MOVE) { if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } - racer = &firstRacerObj->unk64->racer; + racer = firstRacerObj->racer; if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && - obj->segment.object.animationID == ANIM_BUBBLER_MOVE) { + obj->animationID == ANIM_BUBBLER_MOVE) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished) { diff --git a/src/vehicle_rocket.c b/src/vehicle_rocket.c index 916b676d..79adfd6d 100644 --- a/src/vehicle_rocket.c +++ b/src/vehicle_rocket.c @@ -45,14 +45,14 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r s32 tempStartTimer; Object *someObj; Object *firstRacerObj; - Object_WizpigRocket *rocket; + Object_Boost *boost; ModelInstance *modInst; ObjectModel *objModel; set_boss_voice_clip_offset((u16 *) gRocketVoiceTable); racer->tappedR = 0; - animID = obj->segment.object.animationID; - animFrame = obj->segment.animFrame; + animID = obj->animationID; + animFrame = obj->animFrame; tempHeadAngle = racer->headAngle; if (racer->velocity < 0.3 && -0.3 < racer->velocity) { *buttonsPressed = 0; @@ -87,34 +87,34 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r *startTimer = tempStartTimer; obj->particleEmittersEnabled = OBJ_EMIT_NONE; racer->headAngle = tempHeadAngle; - obj->segment.object.animationID = animID; - obj->segment.animFrame = animFrame; - if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != ANIM_ROCKET_DAMAGE) { + obj->animationID = animID; + obj->animFrame = animFrame; + if (racer->attackType != ATTACK_NONE && obj->animationID != ANIM_ROCKET_DAMAGE) { play_random_boss_sound(BOSS_SOUND_NEGATIVE); sound_play(SOUND_EXPLOSION, NULL); set_camera_shake(12.0f); - obj->segment.x_velocity *= 0.4; - obj->segment.object.animationID = ANIM_ROCKET_DAMAGE; - obj->segment.z_velocity *= 0.4; + obj->x_velocity *= 0.4; + obj->animationID = ANIM_ROCKET_DAMAGE; + obj->z_velocity *= 0.4; racer->animationSpeed = 0.0f; - obj->segment.y_velocity += 4.0; + obj->y_velocity += 4.0; } racer->attackType = ATTACK_NONE; if (racer->approachTarget != NULL) { - diffX = obj->segment.x_velocity * obj->segment.x_velocity; - diffZ = obj->segment.z_velocity * obj->segment.z_velocity; + diffX = obj->x_velocity * obj->x_velocity; + diffZ = obj->z_velocity * obj->z_velocity; racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); if (racer->velocity > -0.5) { racer->velocity = 0.0f; - obj->segment.x_velocity = 0.0f; - obj->segment.y_velocity = 0.0f; - obj->segment.z_velocity = 0.0f; + obj->x_velocity = 0.0f; + obj->y_velocity = 0.0f; + obj->z_velocity = 0.0f; } } racer->animationSpeed += 2.0 * updateRateF; modInst = obj->modelInstances[0]; objModel = modInst->objModel; - diffX = (objModel->animations[obj->segment.object.animationID].animLength * 16) - 17; + diffX = (objModel->animations[obj->animationID].animLength * 16) - 17; while (diffX <= racer->animationSpeed) { racer->animationSpeed -= diffX; modInst->animationID = -1; @@ -123,31 +123,31 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->animationSpeed += diffX; modInst->animationID = -1; } - if (obj->segment.object.animationID == ANIM_ROCKET_DAMAGE && modInst->animationID == -1) { - obj->segment.object.animationID = ANIM_ROCKET_IDLE; + if (obj->animationID == ANIM_ROCKET_DAMAGE && modInst->animationID == -1) { + obj->animationID = ANIM_ROCKET_IDLE; racer->animationSpeed = 0.0f; } - obj->segment.animFrame = racer->animationSpeed; + obj->animFrame = racer->animationSpeed; obj->particleEmittersEnabled = OBJ_EMIT_NONE; update_vehicle_particles(obj, updateRate); fade_when_near_camera(obj, racer, 40); if (*startTimer != 100) { someObj = racerfx_get_boost(BOOST_DEFAULT); if (someObj != NULL) { - rocket = &someObj->unk64->wizpigRocket; - someObj->properties.racer.unk0 = 0; - if (rocket != NULL) { - rocket->unk72 += updateRate; - rocket->unk70 = 2; - rocket->unk74 = 1.0f; + boost = someObj->boost; + someObj->properties.common.unk0 = 0; + if (boost != NULL) { + boost->unk72 += updateRate; + boost->unk70 = 2; + boost->unk74 = 1.0f; func_8000B750(obj, -1, 2, 1, 1); } } } firstRacerObj = get_racer_object(PLAYER_ONE); - racer = &firstRacerObj->unk64->racer; + racer = firstRacerObj->racer; if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && - obj->segment.object.animationID == ANIM_ROCKET_DAMAGE) { + obj->animationID == ANIM_ROCKET_DAMAGE) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished != 0) { diff --git a/src/vehicle_smokey.c b/src/vehicle_smokey.c index a7de6437..3f07aa52 100644 --- a/src/vehicle_smokey.c +++ b/src/vehicle_smokey.c @@ -68,8 +68,8 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r Object *firstRacerObj; set_boss_voice_clip_offset(gSmokeyVoiceTable); - animID = obj->segment.object.animationID; - animFrame = obj->segment.animFrame; + animID = obj->animationID; + animFrame = obj->animFrame; tempHeadAngle = racer->headAngle; if (racer->velocity < 0.3 && -0.3 < racer->velocity) { *stickMag = 0; @@ -102,33 +102,33 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r *startTimer = headAngleRange; obj->particleEmittersEnabled = OBJ_EMIT_NONE; racer->headAngle = tempHeadAngle; - obj->segment.object.animationID = animID; - obj->segment.animFrame = animFrame; - if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != ANIM_SMOKEY_DAMAGE) { + obj->animationID = animID; + obj->animFrame = animFrame; + if (racer->attackType != ATTACK_NONE && obj->animationID != ANIM_SMOKEY_DAMAGE) { play_random_boss_sound(BOSS_SOUND_NEGATIVE); sound_play(SOUND_EXPLOSION, NULL); set_camera_shake(12.0f); - obj->segment.object.animationID = ANIM_SMOKEY_DAMAGE; - obj->segment.x_velocity *= 0.27; - obj->segment.z_velocity *= 0.27; + obj->animationID = ANIM_SMOKEY_DAMAGE; + obj->x_velocity *= 0.27; + obj->z_velocity *= 0.27; racer->animationSpeed = 0.0f; - obj->segment.y_velocity += 4.0; + obj->y_velocity += 4.0; } racer->attackType = ATTACK_NONE; if (racer->approachTarget != 0) { - diffX = obj->segment.x_velocity * obj->segment.x_velocity; - diffZ = obj->segment.z_velocity * obj->segment.z_velocity; + diffX = obj->x_velocity * obj->x_velocity; + diffZ = obj->z_velocity * obj->z_velocity; racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); if (racer->velocity > -0.5) { racer->velocity = 0.0f; - obj->segment.x_velocity = 0.0f; - obj->segment.y_velocity = 0.0f; - obj->segment.z_velocity = 0.0f; + obj->x_velocity = 0.0f; + obj->y_velocity = 0.0f; + obj->z_velocity = 0.0f; } } modInst = obj->modelInstances[0]; objModel = modInst->objModel; - diffX = (objModel->animations[obj->segment.object.animationID].animLength * 16) - 17; + diffX = (objModel->animations[obj->animationID].animLength * 16) - 17; animVelocity = (racer->velocity * updateRateF) * 0.45; if (animVelocity <= 0.0) { if (animVelocity > -2.0) { @@ -137,7 +137,7 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } else if (animVelocity < 2.0) { animVelocity = 2.0f; } - switch (obj->segment.object.animationID) { + switch (obj->animationID) { case 0: racer->unk1CD = 0; racer->animationSpeed += 1.0 * updateRateF; @@ -178,57 +178,57 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->animationSpeed += diffX; modInst->animationID = -1; } - if (obj->segment.object.animationID == ANIM_SMOKEY_WALK && racer->groundedWheels == 0 && racer->velocity < -6.5) { - obj->segment.object.animationID = ANIM_SMOKEY_LAND; + if (obj->animationID == ANIM_SMOKEY_WALK && racer->groundedWheels == 0 && racer->velocity < -6.5) { + obj->animationID = ANIM_SMOKEY_LAND; racer->animationSpeed = 0.0f; } - if (modInst->animationID == -1 || obj->segment.object.animationID == ANIM_SMOKEY_IDLE) { - if (obj->segment.object.animationID == ANIM_SMOKEY_DAMAGE) { - obj->segment.object.animationID = racer->unk1CD; + if (modInst->animationID == -1 || obj->animationID == ANIM_SMOKEY_IDLE) { + if (obj->animationID == ANIM_SMOKEY_DAMAGE) { + obj->animationID = racer->unk1CD; racer->animationSpeed = 0.0f; - } else if (obj->segment.object.animationID == ANIM_SMOKEY_RUN) { + } else if (obj->animationID == ANIM_SMOKEY_RUN) { if (racer->unk1CD == 0) { - obj->segment.object.animationID = ANIM_SMOKEY_WALK; + obj->animationID = ANIM_SMOKEY_WALK; } else { - obj->segment.object.animationID = ANIM_SMOKEY_IDLE; + obj->animationID = ANIM_SMOKEY_IDLE; } - } else if (obj->segment.object.animationID == ANIM_SMOKEY_LAND) { + } else if (obj->animationID == ANIM_SMOKEY_LAND) { if (racer->unk1CD == 4) { - obj->segment.object.animationID = ANIM_SMOKEY_WALK; + obj->animationID = ANIM_SMOKEY_WALK; } else { - obj->segment.object.animationID = ANIM_SMOKEY_FLY; + obj->animationID = ANIM_SMOKEY_FLY; } } else if (-0.1 < racer->velocity && racer->velocity < 0.1) { - if (obj->segment.object.animationID == ANIM_SMOKEY_WALK) { - obj->segment.object.animationID = ANIM_SMOKEY_RUN; - racer->animationSpeed = (objModel->animations[obj->segment.object.animationID].animLength * 16) - 17; + if (obj->animationID == ANIM_SMOKEY_WALK) { + obj->animationID = ANIM_SMOKEY_RUN; + racer->animationSpeed = (objModel->animations[obj->animationID].animLength * 16) - 17; } else { - obj->segment.object.animationID = ANIM_SMOKEY_IDLE; + obj->animationID = ANIM_SMOKEY_IDLE; } } else { - if (obj->segment.object.animationID == ANIM_SMOKEY_IDLE) { - obj->segment.object.animationID = ANIM_SMOKEY_RUN; + if (obj->animationID == ANIM_SMOKEY_IDLE) { + obj->animationID = ANIM_SMOKEY_RUN; racer->animationSpeed = 0.0f; } - if (obj->segment.object.animationID == ANIM_SMOKEY_FLY && racer->groundedWheels && racer->velocity > -6.0) { - obj->segment.object.animationID = ANIM_SMOKEY_LAND; - racer->animationSpeed = (objModel->animations[obj->segment.object.animationID].animLength * 16) - 17; + if (obj->animationID == ANIM_SMOKEY_FLY && racer->groundedWheels && racer->velocity > -6.0) { + obj->animationID = ANIM_SMOKEY_LAND; + racer->animationSpeed = (objModel->animations[obj->animationID].animLength * 16) - 17; } } } - animFrame = obj->segment.animFrame; - obj->segment.animFrame = racer->animationSpeed; - stepFrame = obj->segment.animFrame >> 4; + animFrame = obj->animFrame; + obj->animFrame = racer->animationSpeed; + stepFrame = obj->animFrame >> 4; obj->particleEmittersEnabled = OBJ_EMIT_NONE; - if (obj->segment.object.animationID != ANIM_SMOKEY_RUN && obj->segment.object.animationID != 2) { + if (obj->animationID != ANIM_SMOKEY_RUN && obj->animationID != 2) { animFrame >>= 4; stepFrame = 1; - if (obj->segment.object.animationID == ANIM_SMOKEY_IDLE) { + if (obj->animationID == ANIM_SMOKEY_IDLE) { stepFrame = 3; } - if (animFrame == stepFrame && stepFrame + 1 == obj->segment.animFrame >> 4) { - audspat_play_sound_at_position(SOUND_UNK_223, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + if (animFrame == stepFrame && stepFrame + 1 == obj->animFrame >> 4) { + audspat_play_sound_at_position(SOUND_UNK_223, obj->trans.x_position, obj->trans.y_position, + obj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); } } if (racer->vehicleIDPrev == VEHICLE_SMOKEY && racer->playerIndex == PLAYER_COMPUTER && func_80023568()) { @@ -237,10 +237,10 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj_spawn_particle(obj, updateRate); fade_when_near_camera(obj, racer, 40); firstRacerObj = get_racer_object(PLAYER_ONE); - diffX = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffZ = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = firstRacerObj->trans.x_position - obj->trans.x_position; + diffZ = firstRacerObj->trans.z_position - obj->trans.z_position; if (sqrtf((diffX * diffX) + (diffZ * diffZ)) < 700.0) { - headAngleRange = (arctan2_f(diffX, diffZ) - (obj->segment.trans.rotation.y_rotation & 0xFFFF)) + 0x8000; + headAngleRange = (arctan2_f(diffX, diffZ) - (obj->trans.rotation.y_rotation & 0xFFFF)) + 0x8000; if (headAngleRange > 0x8000) { headAngleRange -= 0xFFFF; } @@ -255,14 +255,14 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } racer->headAngleTarget = headAngleRange; } - if (obj->segment.object.animationID >= ANIM_SMOKEY_WALK) { + if (obj->animationID >= ANIM_SMOKEY_WALK) { if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } - racer = &firstRacerObj->unk64->racer; + racer = firstRacerObj->racer; if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && - obj->segment.object.animationID == ANIM_SMOKEY_RUN) { + obj->animationID == ANIM_SMOKEY_RUN) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished != FALSE) { @@ -293,34 +293,34 @@ void spawn_boss_hazard(Object *obj, Object_Racer *racer, f32 offset, s32 objectI objList = objGetObjList(&objListID, &objListCount); spawnObj.objectID = objectID; spawnObj.size = (((objectID & 0x100) & 0xFFFF) >> 1) | 8; - spawnObj.x = obj->segment.trans.x_position - (racer->ox1 * offset); - spawnObj.y = obj->segment.trans.y_position - (racer->oy1 * offset); - spawnObj.z = obj->segment.trans.z_position - (racer->oz1 * offset); + spawnObj.x = obj->trans.x_position - (racer->ox1 * offset); + spawnObj.y = obj->trans.y_position - (racer->oy1 * offset); + spawnObj.z = obj->trans.z_position - (racer->oz1 * offset); for (i = 0; i < objListCount; i++) { tempObj = objList[i]; if (tempObj->behaviorId == BHV_BOSS_HAZARD_TRIGGER) { - entry = tempObj->segment.level_entry; + entry = tempObj->level_entry; if ((s8) entry->animation.z_rotation == racer->lap + 1 || (s8) entry->animation.z_rotation == 0) { - diffX = tempObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = tempObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = tempObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = tempObj->trans.x_position - obj->trans.x_position; + diffY = tempObj->trans.y_position - obj->trans.y_position; + diffZ = tempObj->trans.z_position - obj->trans.z_position; if (sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < (f32) ((s8) entry->animation.x_rotation & 0xFF) * 4.0) { if (tempObj->properties.common.unk0 == 0) { tempObj->properties.common.unk0 = 1; newObj = spawn_object(&spawnObj, OBJECT_SPAWN_UNK01); if (newObj != NULL) { - newObj->segment.level_entry = NULL; - newObj->segment.x_velocity = obj->segment.x_velocity; - newObj->segment.y_velocity = obj->segment.y_velocity; - newObj->segment.z_velocity = obj->segment.z_velocity; - newObj->properties.racer.unk0 = tempObj; - newObj->properties.racer.unk4 = (s8) entry->animation.y_rotation * 60; - newObj->segment.animFrame = rand_range(0, 255); - audspat_play_sound_at_position( - soundID, newObj->segment.trans.x_position, newObj->segment.trans.y_position, - newObj->segment.trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, NULL); + newObj->level_entry = NULL; + newObj->x_velocity = obj->x_velocity; + newObj->y_velocity = obj->y_velocity; + newObj->z_velocity = obj->z_velocity; + newObj->properties.common.unk0 = tempObj; + newObj->properties.common.unk4 = (s8) entry->animation.y_rotation * 60; + newObj->animFrame = rand_range(0, 255); + audspat_play_sound_at_position(soundID, newObj->trans.x_position, newObj->trans.y_position, + newObj->trans.z_position, AUDIO_POINT_FLAG_ONE_TIME_TRIGGER, + NULL); } } } else { diff --git a/src/vehicle_tricky.c b/src/vehicle_tricky.c index 5598a74c..bec43d0d 100644 --- a/src/vehicle_tricky.c +++ b/src/vehicle_tricky.c @@ -56,7 +56,7 @@ void racer_special_init(Object *object, Object_Racer *racer) { object->interactObj->hitboxRadius = 30; object->interactObj->pushForce = 0; racer->animationSpeed = 0.0f; - gTrickyRacerPeakHeight = object->segment.trans.y_position; + gTrickyRacerPeakHeight = object->trans.y_position; if (racer->vehicleSound) { racer_sound_free(object); } @@ -83,8 +83,8 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r set_boss_voice_clip_offset(gTrickyVoiceTable); *buttonsPressed &= ~R_TRIG; *input &= ~R_TRIG; - animID = obj->segment.object.animationID; - animFrame = obj->segment.animFrame; + animID = obj->animationID; + animFrame = obj->animFrame; tempHeadAngle = racer->headAngle; if (racer->raceFinished == TRUE) { func_80021400(130); @@ -112,12 +112,12 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r *startTimer = tempStartTimer; racer->lateral_velocity = 0.0f; racer->headAngle = tempHeadAngle; - obj->segment.object.animationID = animID; - obj->segment.animFrame = animFrame; - if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != ANIM_TRICKY_DAMAGE) { - racer->unk1CD = obj->segment.object.animationID; - obj->segment.object.animationID = ANIM_TRICKY_DAMAGE; - obj->segment.y_velocity += 7.5; + obj->animationID = animID; + obj->animFrame = animFrame; + if (racer->attackType != ATTACK_NONE && obj->animationID != ANIM_TRICKY_DAMAGE) { + racer->unk1CD = obj->animationID; + obj->animationID = ANIM_TRICKY_DAMAGE; + obj->y_velocity += 7.5; play_random_boss_sound(BOSS_SOUND_NEGATIVE); sound_play(SOUND_EXPLOSION, NULL); set_camera_shake(12.0f); @@ -126,22 +126,22 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } racer->attackType = ATTACK_NONE; if (racer->approachTarget != NULL) { - diffX = obj->segment.x_velocity * obj->segment.x_velocity; - diffZ = obj->segment.z_velocity * obj->segment.z_velocity; + diffX = obj->x_velocity * obj->x_velocity; + diffZ = obj->z_velocity * obj->z_velocity; racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); } modInst = obj->modelInstances[0]; objModel = modInst->objModel; - diffX = (objModel->animations[obj->segment.object.animationID].animLength * 16) - 17; - if (obj->segment.object.animationID != ANIM_TRICKY_DAMAGE) { + diffX = (objModel->animations[obj->animationID].animLength * 16) - 17; + if (obj->animationID != ANIM_TRICKY_DAMAGE) { if (racer->velocity < -2.0) { - obj->segment.object.animationID = ANIM_TRICKY_RUN; + obj->animationID = ANIM_TRICKY_RUN; racer->animationSpeed -= (racer->velocity * updateRateF) * 0.5; } else if (racer->velocity < -0.1 || racer->velocity > 0.1) { - obj->segment.object.animationID = ANIM_TRICKY_WALK; + obj->animationID = ANIM_TRICKY_WALK; racer->animationSpeed -= (racer->velocity * updateRateF) * 2; } else { - obj->segment.object.animationID = ANIM_TRICKY_IDLE; + obj->animationID = ANIM_TRICKY_IDLE; racer->animationSpeed += 1.0 * updateRateF; } } else { @@ -155,19 +155,19 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->animationSpeed -= diffX; modInst->animationID = -1; } - if (modInst->animationID == -1 && obj->segment.object.animationID == ANIM_TRICKY_DAMAGE) { - obj->segment.object.animationID = racer->unk1CD; + if (modInst->animationID == -1 && obj->animationID == ANIM_TRICKY_DAMAGE) { + obj->animationID = racer->unk1CD; } - animFrame = obj->segment.animFrame; - obj->segment.animFrame = racer->animationSpeed; + animFrame = obj->animFrame; + obj->animFrame = racer->animationSpeed; obj->particleEmittersEnabled = OBJ_EMIT_NONE; - if (obj->segment.object.animationID == ANIM_TRICKY_RUN) { + if (obj->animationID == ANIM_TRICKY_RUN) { play_footstep_sounds(obj, 2, animFrame, SOUND_STOMP2, SOUND_STOMP3); obj->particleEmittersEnabled |= OBJ_EMIT_1 | OBJ_EMIT_2; } obj_spawn_particle(obj, updateRate); fade_when_near_camera(obj, racer, 120); - switch (obj->segment.object.animationID) { + switch (obj->animationID) { case ANIM_TRICKY_RUN: headAngleRange = 0x2500; break; @@ -179,32 +179,32 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r break; } firstRacerObj = get_racer_object(PLAYER_ONE); - diffX = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffZ = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = firstRacerObj->trans.x_position - obj->trans.x_position; + diffZ = firstRacerObj->trans.z_position - obj->trans.z_position; if (sqrtf((diffX * diffX) + (diffZ * diffZ)) < 700.0) { - tempStartTimer = (arctan2_f(diffX, diffZ) - (obj->segment.trans.rotation.y_rotation & 0xFFFF)) + 0x8000; + tempStartTimer = (arctan2_f(diffX, diffZ) - (obj->trans.rotation.y_rotation & 0xFFFF)) + 0x8000; WRAP(tempStartTimer, -0x8000, 0x8000); CLAMP(tempStartTimer, -headAngleRange, headAngleRange); racer->headAngleTarget = tempStartTimer; } - if (obj->segment.object.animationID == ANIM_TRICKY_RUN) { + if (obj->animationID == ANIM_TRICKY_RUN) { if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } // Record the players height record. Falling 400 units below that will trigger a warp. - racer = &firstRacerObj->unk64->racer; - if (gTrickyRacerPeakHeight < firstRacerObj->segment.trans.y_position) { - gTrickyRacerPeakHeight = firstRacerObj->segment.trans.y_position; + racer = firstRacerObj->racer; + if (gTrickyRacerPeakHeight < firstRacerObj->trans.y_position) { + gTrickyRacerPeakHeight = firstRacerObj->trans.y_position; } - if (firstRacerObj->segment.trans.y_position + 400.0 < gTrickyRacerPeakHeight) { + if (firstRacerObj->trans.y_position + 400.0 < gTrickyRacerPeakHeight) { if (check_fadeout_transition() == 0 && is_in_two_player_adventure()) { swap_lead_player(); } level_transition_begin(1); } if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && - obj->segment.object.animationID == ANIM_TRICKY_RUN) { + obj->animationID == ANIM_TRICKY_RUN) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished != FALSE) { @@ -392,7 +392,7 @@ void fade_when_near_camera(Object *object, Object_Racer *racer, s32 distance) { Object *player = get_racer_object(PLAYER_ONE); racer->transparency = 255; if (!get_race_countdown()) { - if ((object->segment.object.distanceToCamera + distance) < player->segment.object.distanceToCamera) { + if ((object->distanceToCamera + distance) < player->distanceToCamera) { racer->transparency = 64; } } diff --git a/src/vehicle_wizpig.c b/src/vehicle_wizpig.c index aff78474..f36d3eb1 100644 --- a/src/vehicle_wizpig.c +++ b/src/vehicle_wizpig.c @@ -56,8 +56,8 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r set_boss_voice_clip_offset((u16 *) gWizpigVoiceTable); racer->tappedR = 0; - animID = obj->segment.object.animationID; - animFrame = obj->segment.animFrame; + animID = obj->animationID; + animFrame = obj->animFrame; tempHeadAngle = racer->headAngle; if (racer->velocity < 0.3 && -0.3 < racer->velocity) { *buttonsPressed = 0; @@ -93,39 +93,39 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r *startTimer = tempStartTimer; obj->particleEmittersEnabled = OBJ_EMIT_NONE; racer->headAngle = tempHeadAngle; - obj->segment.object.animationID = animID; - obj->segment.animFrame = animFrame; + obj->animationID = animID; + obj->animFrame = animFrame; // Unused, since there are no weapon balloons in Wizpig 1. - if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != ANIM_WIZPIG_DAMAGE) { + if (racer->attackType != ATTACK_NONE && obj->animationID != ANIM_WIZPIG_DAMAGE) { play_random_boss_sound(BOSS_SOUND_NEGATIVE); sound_play(SOUND_EXPLOSION, NULL); set_camera_shake(12.0f); - obj->segment.object.animationID = ANIM_WIZPIG_DAMAGE; - obj->segment.x_velocity *= 0.4; - obj->segment.z_velocity *= 0.4; + obj->animationID = ANIM_WIZPIG_DAMAGE; + obj->x_velocity *= 0.4; + obj->z_velocity *= 0.4; racer->animationSpeed = 0.0f; - obj->segment.y_velocity += 4.0; + obj->y_velocity += 4.0; } racer->attackType = ATTACK_NONE; if (racer->approachTarget != NULL) { - diffX = obj->segment.x_velocity * obj->segment.x_velocity; - diffZ = (obj->segment.z_velocity * obj->segment.z_velocity); + diffX = obj->x_velocity * obj->x_velocity; + diffZ = (obj->z_velocity * obj->z_velocity); racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); if (racer->velocity > -0.5) { racer->velocity = 0.0f; - obj->segment.x_velocity = 0.0f; - obj->segment.y_velocity = 0.0f; - obj->segment.z_velocity = 0.0f; + obj->x_velocity = 0.0f; + obj->y_velocity = 0.0f; + obj->z_velocity = 0.0f; } } nextCheckpoint = FALSE; if (find_next_checkpoint_node(racer->checkpoint, racer->unk1C8)->unk36[racer->unk1CA] == 1) { nextCheckpoint = TRUE; } - racer->x_rotation_offset = -obj->segment.trans.rotation.x_rotation; + racer->x_rotation_offset = -obj->trans.rotation.x_rotation; modInst = obj->modelInstances[0]; objModel = modInst->objModel; - diffX = (objModel->animations[obj->segment.object.animationID].animLength * 16) - 17; + diffX = (objModel->animations[obj->animationID].animLength * 16) - 17; animVelocity = (racer->velocity * updateRateF) * 0.45; if (animVelocity <= 0.0) { if (animVelocity > -2.0) { @@ -134,7 +134,7 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } else if (animVelocity < 2.0) { animVelocity = 2.0f; } - switch (obj->segment.object.animationID) { + switch (obj->animationID) { case ANIM_WIZPIG_IDLE: racer->unk1CD = 0; racer->animationSpeed += 1.0 * updateRateF; @@ -176,52 +176,50 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->animationSpeed += diffX; modInst->animationID = -1; } - if (obj->segment.object.animationID == ANIM_WIZPIG_RUN && nextCheckpoint) { - obj->segment.object.animationID = ANIM_WIZPIG_JUMP; + if (obj->animationID == ANIM_WIZPIG_RUN && nextCheckpoint) { + obj->animationID = ANIM_WIZPIG_JUMP; racer->animationSpeed = 0.0f; } - if (modInst->animationID == -1 || obj->segment.object.animationID == ANIM_WIZPIG_IDLE) { - if (obj->segment.object.animationID == ANIM_WIZPIG_DAMAGE) { - obj->segment.object.animationID = racer->unk1CD; + if (modInst->animationID == -1 || obj->animationID == ANIM_WIZPIG_IDLE) { + if (obj->animationID == ANIM_WIZPIG_DAMAGE) { + obj->animationID = racer->unk1CD; racer->animationSpeed = 0.0f; - } else if (obj->segment.object.animationID == ANIM_WIZPIG_WALK) { + } else if (obj->animationID == ANIM_WIZPIG_WALK) { if (racer->unk1CD == 0) { - obj->segment.object.animationID = ANIM_WIZPIG_RUN; + obj->animationID = ANIM_WIZPIG_RUN; } else { - obj->segment.object.animationID = ANIM_WIZPIG_IDLE; + obj->animationID = ANIM_WIZPIG_IDLE; } - } else if (obj->segment.object.animationID == ANIM_WIZPIG_JUMP) { + } else if (obj->animationID == ANIM_WIZPIG_JUMP) { if (racer->unk1CD == 4) { - obj->segment.object.animationID = ANIM_WIZPIG_RUN; + obj->animationID = ANIM_WIZPIG_RUN; } else { - obj->segment.object.animationID = ANIM_WIZPIG_FLY; + obj->animationID = ANIM_WIZPIG_FLY; } } else { if (-0.1 < racer->velocity && racer->velocity < 0.1) { - if (obj->segment.object.animationID == ANIM_WIZPIG_RUN) { - obj->segment.object.animationID = ANIM_WIZPIG_WALK; - racer->animationSpeed = - (objModel->animations[obj->segment.object.animationID].animLength * 16) - 17; + if (obj->animationID == ANIM_WIZPIG_RUN) { + obj->animationID = ANIM_WIZPIG_WALK; + racer->animationSpeed = (objModel->animations[obj->animationID].animLength * 16) - 17; } else { - obj->segment.object.animationID = ANIM_WIZPIG_IDLE; + obj->animationID = ANIM_WIZPIG_IDLE; } } else { - if (obj->segment.object.animationID == ANIM_WIZPIG_IDLE) { - obj->segment.object.animationID = ANIM_WIZPIG_WALK; + if (obj->animationID == ANIM_WIZPIG_IDLE) { + obj->animationID = ANIM_WIZPIG_WALK; racer->animationSpeed = 0.0f; } - if ((obj->segment.object.animationID == ANIM_WIZPIG_FLY) && nextCheckpoint == FALSE) { - obj->segment.object.animationID = ANIM_WIZPIG_JUMP; - racer->animationSpeed = - (objModel->animations[obj->segment.object.animationID].animLength * 16) - 17; + if ((obj->animationID == ANIM_WIZPIG_FLY) && nextCheckpoint == FALSE) { + obj->animationID = ANIM_WIZPIG_JUMP; + racer->animationSpeed = (objModel->animations[obj->animationID].animLength * 16) - 17; } } } } - animFrame = obj->segment.animFrame; - obj->segment.animFrame = racer->animationSpeed; + animFrame = obj->animFrame; + obj->animFrame = racer->animationSpeed; obj->particleEmittersEnabled = OBJ_EMIT_NONE; - if (obj->segment.object.animationID == ANIM_WIZPIG_RUN) { + if (obj->animationID == ANIM_WIZPIG_RUN) { play_footstep_sounds(obj, 2, animFrame, SOUND_STOMP2, SOUND_STOMP3); } if (racer->playerIndex == PLAYER_COMPUTER) { @@ -232,9 +230,9 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj_spawn_particle(obj, updateRate); fade_when_near_camera(obj, racer, 40); firstRacerObj = get_racer_object(PLAYER_ONE); - racer = &firstRacerObj->unk64->racer; + racer = firstRacerObj->racer; if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && - obj->segment.object.animationID == ANIM_WIZPIG_WALK) { + obj->animationID == ANIM_WIZPIG_WALK) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished) { diff --git a/src/waves.c b/src/waves.c index e9213bf1..1c487f33 100644 --- a/src/waves.c +++ b/src/waves.c @@ -2410,7 +2410,7 @@ void wavegen_add(Object *obj) { LevelObjectEntry_WaveGenerator *temp_v0; s32 flags; - temp_v0 = &obj->segment.level_entry->waveGenerator; + temp_v0 = &obj->level_entry->waveGenerator; flags = 0; if (temp_v0->unk10 != 0) { flags = 1; @@ -2420,9 +2420,8 @@ void wavegen_add(Object *obj) { flags |= 2; } - wavegen_register(obj, obj->segment.trans.x_position, obj->segment.trans.z_position, (f32) temp_v0->waveSize, - temp_v0->unk9 << 8, (f32) temp_v0->unk8 / 16.0, (f32) temp_v0->unkE, (f32) temp_v0->unkC / 16.0, - flags); + wavegen_register(obj, obj->trans.x_position, obj->trans.z_position, (f32) temp_v0->waveSize, temp_v0->unk9 << 8, + (f32) temp_v0->unk8 / 16.0, (f32) temp_v0->unkE, (f32) temp_v0->unkC / 16.0, flags); } const char D_800E9228[] = "\nError :: more than eight swells overlap on column %d."; @@ -2655,7 +2654,7 @@ void obj_loop_wavepower(Object *obj) { racerObj = NULL; for (i = 0; i < numRacers && racerObj == NULL; i++) { - racer = &racers[i]->unk64->racer; + racer = racers[i]->racer; if (racer->playerIndex == PLAYER_ONE) { racerObj = racers[i]; } @@ -2665,12 +2664,12 @@ void obj_loop_wavepower(Object *obj) { return; } - entry = &obj->segment.level_entry->wavePower; + entry = &obj->level_entry->wavePower; distance = entry->radius; distance *= distance; - diffX = racerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; + diffX = racerObj->trans.x_position - obj->trans.x_position; + diffY = racerObj->trans.y_position - obj->trans.y_position; + diffZ = racerObj->trans.z_position - obj->trans.z_position; if ((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ) < distance) { gWavePowerBase = entry->power / 256.0f; gWaveMagnitude = (gWavePowerBase - gWaveController.magnitude) / (f32) entry->divisor; diff --git a/src/weather.c b/src/weather.c index b1c5442e..95c46ad9 100644 --- a/src/weather.c +++ b/src/weather.c @@ -580,7 +580,7 @@ void lensflare_init(Object *obj) { gLensFlare = obj; gLensFlareOff = FALSE; - entry = &gLensFlare->segment.level_entry->lensFlare; + entry = &gLensFlare->level_entry->lensFlare; switch (entry->set1) { default: @@ -651,7 +651,7 @@ void lensflare_render(Gfx **dList, Mtx **mats, Vertex **verts, Camera *camera) { if (gLensFlare != NULL && gLensFlareOff == 0) { if (cam_get_viewport_layout() == 0) { - lensFlareEntry = &gLensFlare->segment.level_entry->lensFlare; + lensFlareEntry = &gLensFlare->level_entry->lensFlare; pos[1].x = 0.0f; pos[1].y = 0.0f; pos[1].z = -1.0f; @@ -777,10 +777,10 @@ void lensflare_override(Camera *cameraSegment) { if (gLensFlareOverrideObjs > 0 && gLensFlare != 0) { if (gLensFlareSwitches[0]) {} // Fakematch for (i = 0; i < gLensFlareOverrideObjs; i++) { - xDiff = cameraSegment->trans.x_position - gLensFlareSwitches[i]->segment.trans.x_position; - yDiff = cameraSegment->trans.y_position - gLensFlareSwitches[i]->segment.trans.y_position; - zDiff = cameraSegment->trans.z_position - gLensFlareSwitches[i]->segment.trans.z_position; - lensFlare = &gLensFlareSwitches[i]->segment.level_entry->lensFlareSwitch; + xDiff = cameraSegment->trans.x_position - gLensFlareSwitches[i]->trans.x_position; + yDiff = cameraSegment->trans.y_position - gLensFlareSwitches[i]->trans.y_position; + zDiff = cameraSegment->trans.z_position - gLensFlareSwitches[i]->trans.z_position; + lensFlare = &gLensFlareSwitches[i]->level_entry->lensFlareSwitch; if (sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)) < lensFlare->radius) { gLensFlareOff = TRUE; } @@ -941,30 +941,29 @@ void rain_render_splashes(s32 updateRate) { } } if (firstIndexWithoutFlags >= 0) { - randYRot = rand_range(-0x2000, 0x2000) + racer->segment.trans.rotation.y_rotation + 0x8000; + randYRot = rand_range(-0x2000, 0x2000) + racer->trans.rotation.y_rotation + 0x8000; randFloat = (f32) rand_range(50, 500); - xPos = (sins_f(randYRot) * randFloat) + racer->segment.trans.x_position; - zPos = (coss_f(randYRot) * randFloat) + racer->segment.trans.z_position; - i = func_8002B0F4( - get_level_segment_index_from_position(xPos, racer->segment.trans.y_position, zPos), xPos, - zPos, &waterProps); + xPos = (sins_f(randYRot) * randFloat) + racer->trans.x_position; + zPos = (coss_f(randYRot) * randFloat) + racer->trans.z_position; + i = func_8002B0F4(get_level_segment_index_from_position(xPos, racer->trans.y_position, zPos), + xPos, zPos, &waterProps); if (i != 0) { var_f2 = 1000.0f; waveIndex = 0; if (i >= 2) { while (waveIndex < (i - 1) && - racer->segment.trans.y_position < waterProps[waveIndex]->waveHeight) { + racer->trans.y_position < waterProps[waveIndex]->waveHeight) { waveIndex++; } if (waveIndex > 0) { - var_f2 = racer->segment.trans.y_position - waterProps[waveIndex]->waveHeight; + var_f2 = racer->trans.y_position - waterProps[waveIndex]->waveHeight; if (var_f2 < 0.0f) { var_f2 = -var_f2; } waveIndex--; } } - var_f0 = racer->segment.trans.y_position - waterProps[waveIndex]->waveHeight; + var_f0 = racer->trans.y_position - waterProps[waveIndex]->waveHeight; if (var_f0 < 0.0f) { var_f0 = -var_f0; } diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index 73f7fc68..06c0e2f4 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -358,7 +358,7 @@ func_8001E6EC = 0x8001E6EC; func_8001E89C = 0x8001E89C; func_8001E93C = 0x8001E93C; func_8001EE74 = 0x8001EE74; -obj_init_animcamera = 0x8001EFA4; +obj_init_animobject = 0x8001EFA4; func_8001F23C = 0x8001F23C; func_8001F3B8 = 0x8001F3B8; func_8001F3C8 = 0x8001F3C8; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index f7370f92..269106ad 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -358,7 +358,7 @@ func_8001E6EC = 0x8001E6EC; func_8001E89C = 0x8001E89C; func_8001E93C = 0x8001E93C; func_8001EE74 = 0x8001EE74; -obj_init_animcamera = 0x8001EFA4; +obj_init_animobject = 0x8001EFA4; func_8001F23C = 0x8001F23C; func_8001F3B8 = 0x8001F3B8; func_8001F3C8 = 0x8001F3C8; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index b91b2a68..8c8530c5 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -358,7 +358,7 @@ func_8001E6EC = 0x8001E720; func_8001E89C = 0x8001E8D0; func_8001E93C = 0x8001E970; func_8001EE74 = 0x8001EEA8; -obj_init_animcamera = 0x8001EFD8; +obj_init_animobject = 0x8001EFD8; func_8001F23C = 0x8001F270; func_8001F3B8 = 0x8001F3EC; func_8001F3C8 = 0x8001F3FC; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index d2f83eca..75bcbbc9 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -358,7 +358,7 @@ func_8001E6EC = 0x8001E6EC; func_8001E89C = 0x8001E89C; func_8001E93C = 0x8001E93C; func_8001EE74 = 0x8001EE74; -obj_init_animcamera = 0x8001EFA4; +obj_init_animobject = 0x8001EFA4; func_8001F23C = 0x8001F23C; func_8001F3B8 = 0x8001F3B8; func_8001F3C8 = 0x8001F3C8; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index 2553d2ab..4db6d1e3 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -358,7 +358,7 @@ func_8001E6EC = 0x8001E720; func_8001E89C = 0x8001E8D0; func_8001E93C = 0x8001E970; func_8001EE74 = 0x8001EEA8; -obj_init_animcamera = 0x8001EFD8; +obj_init_animobject = 0x8001EFD8; func_8001F23C = 0x8001F270; func_8001F3B8 = 0x8001F3EC; func_8001F3C8 = 0x8001F3FC;