diff --git a/TR5Main/Game/Lara/lara.cpp b/TR5Main/Game/Lara/lara.cpp index 250b997d6..eced08666 100644 --- a/TR5Main/Game/Lara/lara.cpp +++ b/TR5Main/Game/Lara/lara.cpp @@ -437,15 +437,15 @@ void LaraControl(ITEM_INFO* item, COLL_INFO* coll) // Set hands free failsafe. if (lara->Control.HandStatus == HandStatus::Busy && - item->ActiveState == LS_IDLE && - item->TargetState == LS_IDLE && - item->AnimNumber == LA_STAND_IDLE && - !item->Airborne) + item->Animation.ActiveState == LS_IDLE && + item->Animation.TargetState == LS_IDLE && + item->Animation.AnimNumber == LA_STAND_IDLE && + !item->Animation.Airborne) { lara->Control.HandStatus = HandStatus::Free; } - if (item->ActiveState != LS_SPRINT && lara->SprintEnergy < LARA_SPRINT_MAX) + if (item->Animation.ActiveState != LS_SPRINT && lara->SprintEnergy < LARA_SPRINT_MAX) lara->SprintEnergy++; lara->Control.IsLow = false; @@ -484,33 +484,33 @@ void LaraControl(ITEM_INFO* item, COLL_INFO* coll) { lara->Air = LARA_AIR_MAX; lara->Control.WaterStatus = WaterStatus::Underwater; - item->Airborne = false; + item->Animation.Airborne = false; item->Position.yPos += 100; UpdateItemRoom(item, 0); StopSoundEffect(SFX_TR4_LARA_FALL); - if (item->ActiveState == LS_SWAN_DIVE) + if (item->Animation.ActiveState == LS_SWAN_DIVE) { lara->Control.HandStatus = HandStatus::Free; item->Position.xRot = -ANGLE(45.0f); - item->TargetState = LS_FREEFALL_DIVE; + item->Animation.TargetState = LS_FREEFALL_DIVE; AnimateLara(item); - item->VerticalVelocity *= 2; + item->Animation.VerticalVelocity *= 2; } - else if (item->ActiveState == LS_FREEFALL_DIVE) + else if (item->Animation.ActiveState == LS_FREEFALL_DIVE) { lara->Control.HandStatus = HandStatus::Free; item->Position.xRot = -ANGLE(85.0f); - item->TargetState = LS_FREEFALL_DIVE; + item->Animation.TargetState = LS_FREEFALL_DIVE; AnimateLara(item); - item->VerticalVelocity *= 2; + item->Animation.VerticalVelocity *= 2; } else { item->Position.xRot = -ANGLE(45.0f); SetAnimation(item, LA_FREEFALL_DIVE); - item->VerticalVelocity = 3 * item->VerticalVelocity / 2; + item->Animation.VerticalVelocity = 3 * item->Animation.VerticalVelocity / 2; } ResetLaraFlex(item); @@ -525,18 +525,18 @@ void LaraControl(ITEM_INFO* item, COLL_INFO* coll) // Make splash ONLY within this particular threshold before swim depth while airborne (WadeSplash() above interferes otherwise). if (waterDepth > (SWIM_DEPTH - CLICK(1)) && !isSwamp && - item->Airborne) + item->Animation.Airborne) { Splash(item); - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // Lara is grounded; don't splash again. - else if (!item->Airborne) - item->TargetState = LS_IDLE; + else if (!item->Animation.Airborne) + item->Animation.TargetState = LS_IDLE; else if (isSwamp) { - if (item->ActiveState == LS_SWAN_DIVE || - item->ActiveState == LS_FREEFALL_DIVE) + if (item->Animation.ActiveState == LS_SWAN_DIVE || + item->Animation.ActiveState == LS_FREEFALL_DIVE) { item->Position.yPos = waterHeight + (WALL_SIZE - 24); } @@ -551,17 +551,17 @@ void LaraControl(ITEM_INFO* item, COLL_INFO* coll) if (isWater || waterDepth == DEEP_WATER || abs(heightFromWater) >= CLICK(1) || - item->AnimNumber == LA_UNDERWATER_RESURFACE || - item->AnimNumber == LA_ONWATER_DIVE) + item->Animation.AnimNumber == LA_UNDERWATER_RESURFACE || + item->Animation.AnimNumber == LA_ONWATER_DIVE) { if (!isWater) { if (waterDepth == DEEP_WATER || abs(heightFromWater) >= CLICK(1)) { SetAnimation(item, LA_FALL_START); - item->Velocity = item->VerticalVelocity / 4; - item->VerticalVelocity = 0; - item->Airborne = true; + item->Animation.Velocity = item->Animation.VerticalVelocity / 4; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = true; lara->Control.WaterStatus = WaterStatus::Dry; ResetLaraLean(item); ResetLaraFlex(item); @@ -570,7 +570,7 @@ void LaraControl(ITEM_INFO* item, COLL_INFO* coll) { SetAnimation(item, LA_UNDERWATER_RESURFACE); item->Position.yPos = waterHeight; - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; lara->Control.WaterStatus = WaterStatus::TreadWater; lara->Control.Count.Dive = 11; ResetLaraLean(item); @@ -585,7 +585,7 @@ void LaraControl(ITEM_INFO* item, COLL_INFO* coll) { SetAnimation(item, LA_UNDERWATER_RESURFACE); item->Position.yPos = waterHeight + 1; - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; lara->Control.WaterStatus = WaterStatus::TreadWater; lara->Control.Count.Dive = 11; ResetLaraLean(item); @@ -603,20 +603,20 @@ void LaraControl(ITEM_INFO* item, COLL_INFO* coll) if (heightFromWater <= WADE_DEPTH) { SetAnimation(item, LA_FALL_START); - item->Velocity = item->VerticalVelocity / 4; - item->Airborne = true; + item->Animation.Velocity = item->Animation.VerticalVelocity / 4; + item->Animation.Airborne = true; lara->Control.WaterStatus = WaterStatus::Dry; } else { SetAnimation(item, LA_STAND_IDLE); - item->TargetState = LS_WADE_FORWARD; // TODO: Check if really needed? -- Lwmte, 10.11.21 + item->Animation.TargetState = LS_WADE_FORWARD; // TODO: Check if really needed? -- Lwmte, 10.11.21 lara->Control.WaterStatus = WaterStatus::Wade; AnimateItem(item); } - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; ResetLaraLean(item); ResetLaraFlex(item); } @@ -633,8 +633,8 @@ void LaraControl(ITEM_INFO* item, COLL_INFO* coll) SetAnimation(item, LA_ONWATER_IDLE); item->Position.yPos += 1 - heightFromWater; - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; lara->Control.WaterStatus = WaterStatus::TreadWater; lara->Control.Count.Dive = 0; ResetLaraLean(item); @@ -647,8 +647,8 @@ void LaraControl(ITEM_INFO* item, COLL_INFO* coll) { lara->Control.WaterStatus = WaterStatus::Dry; - if (item->ActiveState == LS_WADE_FORWARD) - item->TargetState = LS_RUN_FORWARD; + if (item->Animation.ActiveState == LS_WADE_FORWARD) + item->Animation.TargetState = LS_RUN_FORWARD; } break; @@ -749,9 +749,9 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.OldPosition.x = item->Position.xPos; coll->Setup.OldPosition.y = item->Position.yPos; coll->Setup.OldPosition.z = item->Position.zPos; - coll->Setup.OldState = item->ActiveState; - coll->Setup.OldAnimNumber = item->AnimNumber; - coll->Setup.OldFrameNumber = item->FrameNumber; + coll->Setup.OldState = item->Animation.ActiveState; + coll->Setup.OldAnimNumber = item->Animation.AnimNumber; + coll->Setup.OldFrameNumber = item->Animation.FrameNumber; coll->Setup.EnableObjectPush = true; coll->Setup.EnableSpasm = true; @@ -760,7 +760,7 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.CeilingSlopeIsWall = false; coll->Setup.DeathFlagIsPit = false; coll->Setup.NoMonkeyFlagIsWall = false; - coll->Setup.Mode = CollProbeMode::Quadrants; + coll->Setup.Mode = CollisionProbeMode::Quadrants; if (TrInput & IN_LOOK && lara->Control.CanLook && lara->ExtraAnim == NO_ITEM) @@ -840,7 +840,7 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) if (doRoutines || KeyMap[DIK_U] && !dbU) { // Handle current Lara status. - lara_control_routines[item->ActiveState](item, coll); + lara_control_routines[item->Animation.ActiveState](item, coll); HandleLaraMovementParameters(item, coll); // Animate Lara. @@ -853,7 +853,7 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) // Handle Lara collision. if (lara->Vehicle == NO_ITEM) - lara_collision_routines[item->ActiveState](item, coll); + lara_collision_routines[item->Animation.ActiveState](item, coll); } lara->ExtraVelocity = PHD_VECTOR(); @@ -895,7 +895,7 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.NoMonkeyFlagIsWall = false; coll->Setup.EnableObjectPush = true; coll->Setup.EnableSpasm = false; - coll->Setup.Mode = CollProbeMode::Quadrants; + coll->Setup.Mode = CollisionProbeMode::Quadrants; coll->Setup.Radius = LARA_RAD_UNDERWATER; coll->Setup.Height = LARA_HEIGHT; @@ -908,7 +908,7 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll) lara->Control.CanLook = true; lara->Control.Count.Pose = 0; - lara_control_routines[item->ActiveState](item, coll); + lara_control_routines[item->Animation.ActiveState](item, coll); auto level = g_GameFlow->GetLevel(CurrentLevel); @@ -961,14 +961,14 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll) AnimateLara(item); - item->Position.xPos += phd_cos(item->Position.xRot) * item->VerticalVelocity * phd_sin(item->Position.yRot) / 4; - item->Position.yPos -= item->VerticalVelocity * phd_sin(item->Position.xRot) / 4; - item->Position.zPos += phd_cos(item->Position.xRot) * item->VerticalVelocity * phd_cos(item->Position.yRot) / 4; + item->Position.xPos += phd_cos(item->Position.xRot) * item->Animation.VerticalVelocity * phd_sin(item->Position.yRot) / 4; + item->Position.yPos -= item->Animation.VerticalVelocity * phd_sin(item->Position.xRot) / 4; + item->Position.zPos += phd_cos(item->Position.xRot) * item->Animation.VerticalVelocity * phd_cos(item->Position.yRot) / 4; DoObjectCollision(item, coll); if (/*lara->ExtraAnim == -1 &&*/ lara->Vehicle == NO_ITEM) - lara_collision_routines[item->ActiveState](item, coll); + lara_collision_routines[item->Animation.ActiveState](item, coll); lara->ExtraVelocity = PHD_VECTOR(); @@ -1003,7 +1003,7 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.NoMonkeyFlagIsWall = false; coll->Setup.EnableObjectPush = false; coll->Setup.EnableSpasm = false; - coll->Setup.Mode = CollProbeMode::FreeForward; + coll->Setup.Mode = CollisionProbeMode::FreeForward; coll->Setup.Radius = LARA_RAD; coll->Setup.Height = LARA_HEIGHT_SURFACE; @@ -1016,7 +1016,7 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll) lara->Control.CanLook = true; lara->Control.Count.Pose = 0; - lara_control_routines[item->ActiveState](item, coll); + lara_control_routines[item->Animation.ActiveState](item, coll); if (!lara->Control.IsMoving && !(TrInput & (IN_LEFT | IN_RIGHT))) { @@ -1029,13 +1029,13 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll) AnimateLara(item); - item->Position.xPos += item->VerticalVelocity * phd_sin(lara->Control.MoveAngle) / 4; - item->Position.zPos += item->VerticalVelocity * phd_cos(lara->Control.MoveAngle) / 4; + item->Position.xPos += item->Animation.VerticalVelocity * phd_sin(lara->Control.MoveAngle) / 4; + item->Position.zPos += item->Animation.VerticalVelocity * phd_cos(lara->Control.MoveAngle) / 4; DoObjectCollision(item, coll); if (lara->Vehicle == NO_ITEM) - lara_collision_routines[item->ActiveState](item, coll); + lara_collision_routines[item->Animation.ActiveState](item, coll); lara->ExtraVelocity = PHD_VECTOR(); diff --git a/TR5Main/Game/Lara/lara_basic.cpp b/TR5Main/Game/Lara/lara_basic.cpp index 87bb3ab79..a0370be7a 100644 --- a/TR5Main/Game/Lara/lara_basic.cpp +++ b/TR5Main/Game/Lara/lara_basic.cpp @@ -69,7 +69,7 @@ void lara_as_controlled(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.EnableObjectPush = false; coll->Setup.EnableSpasm = false; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd - 1) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd - 1) { lara->Control.HandStatus = HandStatus::Free; @@ -101,7 +101,7 @@ void lara_as_vault(ITEM_INFO* item, COLL_INFO* coll) EaseOutLaraHeight(item, lara->ProjectedFloorHeight - item->Position.yPos); ApproachLaraTargetAngle(item, lara->TargetFacingAngle, 2.5f); - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_AUTO_JUMP (62) @@ -133,7 +133,7 @@ void lara_as_walk_forward(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -165,21 +165,21 @@ void lara_as_walk_forward(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else if (lara->Control.WaterStatus == WaterStatus::Wade) - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; else if (TrInput & IN_WALK) [[likely]] - item->TargetState = LS_WALK_FORWARD; + item->Animation.TargetState = LS_WALK_FORWARD; else - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LA_WALK_FORWARD (0) @@ -189,8 +189,8 @@ void lara_col_walk_forward(ITEM_INFO* item, COLL_INFO* coll) auto* lara = GetLaraInfo(item); lara->Control.MoveAngle = item->Position.yRot; - item->Airborne = false; - item->VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.VerticalVelocity = 0; coll->Setup.LowerFloorBound = STEPUP_HEIGHT; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; coll->Setup.LowerCeilingBound = 0; @@ -223,10 +223,10 @@ void lara_col_walk_forward(ITEM_INFO* item, COLL_INFO* coll) if (LaraDeflectEdge(item, coll)) { - item->TargetState = LS_SOFT_SPLAT; - if (GetChange(item, &g_Level.Anims[item->AnimNumber])) + item->Animation.TargetState = LS_SOFT_SPLAT; + if (GetChange(item, &g_Level.Anims[item->Animation.AnimNumber])) { - item->ActiveState = LS_SOFT_SPLAT; + item->Animation.ActiveState = LS_SOFT_SPLAT; return; } @@ -252,7 +252,7 @@ void lara_as_run_forward(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -279,7 +279,7 @@ void lara_as_run_forward(ITEM_INFO* item, COLL_INFO* coll) if (lara->Control.Count.RunJump >= LARA_RUN_JUMP_TIME && TestLaraRunJumpForward(item, coll)) { - item->TargetState = LS_JUMP_FORWARD; + item->Animation.TargetState = LS_JUMP_FORWARD; return; } @@ -289,14 +289,14 @@ void lara_as_run_forward(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_SPRINT && lara->SprintEnergy && lara->Control.WaterStatus != WaterStatus::Wade) { - item->TargetState = LS_SPRINT; + item->Animation.TargetState = LS_SPRINT; return; } if ((TrInput & (IN_ROLL | IN_FORWARD & IN_BACK)) && !lara->Control.RunJumpQueued && lara->Control.WaterStatus != WaterStatus::Wade) { - item->TargetState = LS_ROLL_FORWARD; + item->Animation.TargetState = LS_ROLL_FORWARD; return; } @@ -304,7 +304,7 @@ void lara_as_run_forward(ITEM_INFO* item, COLL_INFO* coll) (lara->Control.HandStatus == HandStatus::Free || !IsStandingWeapon(lara->Control.Weapon.GunType)) && lara->Control.WaterStatus != WaterStatus::Wade) { - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; return; } @@ -315,21 +315,21 @@ void lara_as_run_forward(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else if (lara->Control.WaterStatus == WaterStatus::Wade) - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; else if (TrInput & IN_WALK) - item->TargetState = LS_WALK_FORWARD; + item->Animation.TargetState = LS_WALK_FORWARD; else [[likely]] - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_RUN_FORWARD (1) @@ -339,8 +339,8 @@ void lara_col_run_forward(ITEM_INFO* item, COLL_INFO* coll) auto* lara = GetLaraInfo(item); lara->Control.MoveAngle = item->Position.yRot; - item->Airborne = false; - item->VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.VerticalVelocity = 0; coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; coll->Setup.LowerCeilingBound = 0; @@ -377,18 +377,18 @@ void lara_col_run_forward(ITEM_INFO* item, COLL_INFO* coll) if (TestLaraSplat(item, OFFSET_RADIUS(coll->Setup.Radius), -CLICK(2.5f)) || coll->HitTallObject) { - item->TargetState = LS_SPLAT; - if (GetChange(item, &g_Level.Anims[item->AnimNumber])) + item->Animation.TargetState = LS_SPLAT; + if (GetChange(item, &g_Level.Anims[item->Animation.AnimNumber])) { - item->ActiveState = LS_SPLAT; + item->Animation.ActiveState = LS_SPLAT; return; } } - item->TargetState = LS_SOFT_SPLAT; - if (GetChange(item, &g_Level.Anims[item->AnimNumber])) + item->Animation.TargetState = LS_SOFT_SPLAT; + if (GetChange(item, &g_Level.Anims[item->Animation.AnimNumber])) { - item->ActiveState = LS_SOFT_SPLAT; + item->Animation.ActiveState = LS_SOFT_SPLAT; return; } @@ -410,11 +410,11 @@ void lara_as_idle(ITEM_INFO* item, COLL_INFO* coll) bool isSwamp = TestEnvironment(ENV_FLAG_SWAMP, item); - lara->Control.CanLook = ((isSwamp && lara->Control.WaterStatus == WaterStatus::Wade) || item->AnimNumber == LA_SWANDIVE_ROLL) ? false : true; + lara->Control.CanLook = ((isSwamp && lara->Control.WaterStatus == WaterStatus::Wade) || item->Animation.AnimNumber == LA_SWANDIVE_ROLL) ? false : true; if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -455,21 +455,21 @@ void lara_as_idle(ITEM_INFO* item, COLL_INFO* coll) { SetLaraJumpDirection(item, coll); if (lara->Control.JumpDirection != JumpDirection::None) - item->TargetState = LS_JUMP_PREPARE; + item->Animation.TargetState = LS_JUMP_PREPARE; return; } if (TrInput & IN_ROLL) { - item->TargetState = LS_ROLL_FORWARD; + item->Animation.TargetState = LS_ROLL_FORWARD; return; } if (TrInput & IN_CROUCH && (lara->Control.HandStatus == HandStatus::Free || !IsStandingWeapon(lara->Control.Weapon.GunType))) { - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; return; } @@ -480,7 +480,7 @@ void lara_as_idle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } @@ -488,18 +488,18 @@ void lara_as_idle(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraWalkForward(item, coll)) { - item->TargetState = LS_WALK_FORWARD; + item->Animation.TargetState = LS_WALK_FORWARD; return; } } else if (TrInput & IN_SPRINT && TestLaraRunForward(item, coll)) { - item->TargetState = LS_SPRINT; + item->Animation.TargetState = LS_SPRINT; return; } else if (TestLaraRunForward(item, coll)) [[likely]] { - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; return; } } @@ -509,25 +509,25 @@ void lara_as_idle(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraWalkBack(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } } else if (TestLaraRunBack(item, coll)) [[likely]] { - item->TargetState = LS_RUN_BACK; + item->Animation.TargetState = LS_RUN_BACK; return; } } if (TrInput & IN_LSTEP && TestLaraStepLeft(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRight(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } @@ -536,12 +536,12 @@ void lara_as_idle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_SPRINT || lara->Control.TurnRate <= -LARA_SLOW_TURN_MAX || (lara->Control.HandStatus == HandStatus::WeaponReady && lara->Control.Weapon.GunType != LaraWeaponType::Torch) || - (lara->Control.HandStatus == HandStatus::DrawWeapon && lara->Control.Weapon.GunType != LaraWeaponType::Flare)) + (lara->Control.HandStatus == HandStatus::WeaponDraw && lara->Control.Weapon.GunType != LaraWeaponType::Flare)) { - item->TargetState = LS_TURN_LEFT_FAST; + item->Animation.TargetState = LS_TURN_LEFT_FAST; } else [[likely]] - item->TargetState = LS_TURN_LEFT_SLOW; + item->Animation.TargetState = LS_TURN_LEFT_SLOW; return; } @@ -550,12 +550,12 @@ void lara_as_idle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_SPRINT || lara->Control.TurnRate >= LARA_SLOW_TURN_MAX || (lara->Control.HandStatus == HandStatus::WeaponReady && lara->Control.Weapon.GunType != LaraWeaponType::Torch) || - (lara->Control.HandStatus == HandStatus::DrawWeapon && lara->Control.Weapon.GunType != LaraWeaponType::Flare)) + (lara->Control.HandStatus == HandStatus::WeaponDraw && lara->Control.Weapon.GunType != LaraWeaponType::Flare)) { - item->TargetState = LS_TURN_RIGHT_FAST; + item->Animation.TargetState = LS_TURN_RIGHT_FAST; } else [[likely]] - item->TargetState = LS_TURN_RIGHT_SLOW; + item->Animation.TargetState = LS_TURN_RIGHT_SLOW; return; } @@ -566,11 +566,11 @@ void lara_as_idle(ITEM_INFO* item, COLL_INFO* coll) if (lara->Control.Count.Pose >= LARA_POSE_TIME && TestLaraPose(item, coll) && g_GameFlow->Animations.HasPose) { - item->TargetState = LS_POSE; + item->Animation.TargetState = LS_POSE; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // TODO: Future-proof for rising water. @@ -582,7 +582,7 @@ void PseudoLaraAsWadeIdle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_JUMP && TestLaraJumpUp(item, coll)) { - item->TargetState = LS_JUMP_PREPARE; + item->Animation.TargetState = LS_JUMP_PREPARE; lara->Control.JumpDirection = JumpDirection::Up; return; } @@ -594,46 +594,46 @@ void PseudoLaraAsWadeIdle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else if (TestLaraRunForward(item, coll)) [[likely]] { - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; return; } } if (TrInput & IN_BACK && TestLaraWalkBack(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_TURN_LEFT_SLOW; + item->Animation.TargetState = LS_TURN_LEFT_SLOW; return; } else if (TrInput & IN_RIGHT) { - item->TargetState = LS_TURN_RIGHT_SLOW; + item->Animation.TargetState = LS_TURN_RIGHT_SLOW; return; } if (TrInput & IN_LSTEP && TestLaraStepLeft(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRight(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // Pseudo-state for idling in swamps. @@ -648,46 +648,46 @@ void PseudoLaraAsSwampIdle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else if (TestLaraWadeForwardSwamp(item, coll)) { - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; return; } } if (TrInput & IN_BACK && TestLaraWalkBackSwamp(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_TURN_LEFT_SLOW; + item->Animation.TargetState = LS_TURN_LEFT_SLOW; return; } else if (TrInput & IN_RIGHT) { - item->TargetState = LS_TURN_RIGHT_SLOW; + item->Animation.TargetState = LS_TURN_RIGHT_SLOW; return; } if (TrInput & IN_LSTEP && TestLaraStepLeftSwamp(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRightSwamp(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_IDLE (2), LS_POSE (4), LS_SPLAT_SOFT (170) @@ -698,9 +698,9 @@ void lara_col_idle(ITEM_INFO* item, COLL_INFO* coll) bool isSwamp = TestEnvironment(ENV_FLAG_SWAMP, item); - item->Airborne = false; - item->VerticalVelocity = 0; - lara->Control.MoveAngle = (item->Velocity >= 0) ? item->Position.yRot : (item->Position.yRot + ANGLE(180.0f)); + item->Animation.Airborne = false; + item->Animation.VerticalVelocity = 0; + lara->Control.MoveAngle = (item->Animation.Velocity >= 0) ? item->Position.yRot : (item->Position.yRot + ANGLE(180.0f)); coll->Setup.LowerFloorBound = isSwamp ? NO_LOWER_BOUND : STEPUP_HEIGHT; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; coll->Setup.LowerCeilingBound = 0; @@ -745,7 +745,7 @@ void lara_as_pose(ITEM_INFO* item, COLL_INFO* coll) { if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -756,21 +756,21 @@ void lara_as_pose(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_ROLL) { - item->TargetState = LS_ROLL_FORWARD; + item->Animation.TargetState = LS_ROLL_FORWARD; return; } if (TrInput & IN_WAKE) { - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; return; } - item->TargetState = LS_POSE; + item->Animation.TargetState = LS_POSE; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_RUN_BACK (5) @@ -798,11 +798,11 @@ void lara_as_run_back(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ROLL) { - item->TargetState = LS_ROLL_FORWARD; + item->Animation.TargetState = LS_ROLL_FORWARD; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_RUN_BACK (5) @@ -812,8 +812,8 @@ void lara_col_run_back(ITEM_INFO* item, COLL_INFO* coll) auto* lara = GetLaraInfo(item); lara->Control.MoveAngle = item->Position.yRot + ANGLE(180.0f); - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; coll->Setup.FloorSlopeIsPit = true; coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; @@ -861,7 +861,7 @@ void lara_as_turn_right_slow(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -886,21 +886,21 @@ void lara_as_turn_right_slow(ITEM_INFO* item, COLL_INFO* coll) SetLaraJumpDirection(item, coll); if (lara->Control.JumpDirection != JumpDirection::None) { - item->TargetState = LS_JUMP_PREPARE; + item->Animation.TargetState = LS_JUMP_PREPARE; return; } } if (TrInput & IN_ROLL) { - item->TargetState = LS_ROLL_FORWARD; + item->Animation.TargetState = LS_ROLL_FORWARD; return; } if (TrInput & IN_CROUCH && (lara->Control.HandStatus == HandStatus::Free || !IsStandingWeapon(lara->Control.Weapon.GunType))) { - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; return; } @@ -911,7 +911,7 @@ void lara_as_turn_right_slow(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } @@ -919,18 +919,18 @@ void lara_as_turn_right_slow(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraWalkForward(item, coll)) { - item->TargetState = LS_WALK_FORWARD; + item->Animation.TargetState = LS_WALK_FORWARD; return; } } else if (TrInput & IN_SPRINT && TestLaraRunForward(item, coll)) { - item->TargetState = LS_SPRINT; + item->Animation.TargetState = LS_SPRINT; return; } else if (TestLaraRunForward(item, coll)) [[likely]] { - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; return; } } @@ -940,25 +940,25 @@ void lara_as_turn_right_slow(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraWalkBack(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } } else if (TestLaraRunBack(item, coll)) [[likely]] { - item->TargetState = LS_RUN_BACK; + item->Animation.TargetState = LS_RUN_BACK; return; } } if (TrInput & IN_LSTEP && TestLaraStepLeft(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRight(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } @@ -966,20 +966,20 @@ void lara_as_turn_right_slow(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_WALK) // TODO: This hasn't worked since TR1. { - item->TargetState = LS_TURN_RIGHT_SLOW; + item->Animation.TargetState = LS_TURN_RIGHT_SLOW; if (lara->Control.TurnRate > LARA_SLOW_TURN_MAX) lara->Control.TurnRate = LARA_SLOW_TURN_MAX; } else if (lara->Control.TurnRate > LARA_SLOW_MED_TURN_MAX) - item->TargetState = LS_TURN_RIGHT_FAST; + item->Animation.TargetState = LS_TURN_RIGHT_FAST; else [[likely]] - item->TargetState = LS_TURN_RIGHT_SLOW; + item->Animation.TargetState = LS_TURN_RIGHT_SLOW; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // Pseudo-state for turning right slowly in wade-height water. @@ -992,7 +992,7 @@ void PsuedoLaraAsWadeTurnRightSlow(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_JUMP && TestLaraJumpUp(item, coll)) { - item->TargetState = LS_JUMP_PREPARE; + item->Animation.TargetState = LS_JUMP_PREPARE; lara->Control.JumpDirection = JumpDirection::Up; return; } @@ -1004,39 +1004,39 @@ void PsuedoLaraAsWadeTurnRightSlow(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else if (TestLaraRunForward(item, coll)) [[likely]] - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; return; } else if (TrInput & IN_BACK && TestLaraWalkBack(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } if (TrInput & IN_LSTEP && TestLaraStepLeft(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRight(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } if (TrInput & IN_RIGHT) { - item->TargetState = LS_TURN_RIGHT_SLOW; + item->Animation.TargetState = LS_TURN_RIGHT_SLOW; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // Pseudo-state for turning right slowly in swamps. @@ -1054,39 +1054,39 @@ void PsuedoLaraAsSwampTurnRightSlow(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else if (TestLaraWadeForwardSwamp(item, coll)) [[likely]] - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; return; } else if (TrInput & IN_BACK && TestLaraWalkBackSwamp(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } if (TrInput & IN_LSTEP && TestLaraStepLeftSwamp(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRightSwamp(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } if (TrInput & IN_RIGHT) { - item->TargetState = LS_TURN_RIGHT_SLOW; + item->Animation.TargetState = LS_TURN_RIGHT_SLOW; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_TURN_RIGHT_SLOW (6) @@ -1108,7 +1108,7 @@ void lara_as_turn_left_slow(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -1133,21 +1133,21 @@ void lara_as_turn_left_slow(ITEM_INFO* item, COLL_INFO* coll) SetLaraJumpDirection(item, coll); if (lara->Control.JumpDirection != JumpDirection::None) { - item->TargetState = LS_JUMP_PREPARE; + item->Animation.TargetState = LS_JUMP_PREPARE; return; } } if (TrInput & IN_ROLL) { - item->TargetState = LS_ROLL_FORWARD; + item->Animation.TargetState = LS_ROLL_FORWARD; return; } if (TrInput & IN_CROUCH && (lara->Control.HandStatus == HandStatus::Free || !IsStandingWeapon(lara->Control.Weapon.GunType))) { - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; return; } @@ -1158,7 +1158,7 @@ void lara_as_turn_left_slow(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } @@ -1166,18 +1166,18 @@ void lara_as_turn_left_slow(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraWalkForward(item, coll)) { - item->TargetState = LS_WALK_FORWARD; + item->Animation.TargetState = LS_WALK_FORWARD; return; } } else if (TrInput & IN_SPRINT && TestLaraRunForward(item, coll)) { - item->TargetState = LS_SPRINT; + item->Animation.TargetState = LS_SPRINT; return; } else if (TestLaraRunForward(item, coll)) [[likely]] { - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; return; } } @@ -1187,25 +1187,25 @@ void lara_as_turn_left_slow(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraWalkBack(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } } else if (TestLaraRunBack(item, coll)) [[likely]] { - item->TargetState = LS_RUN_BACK; + item->Animation.TargetState = LS_RUN_BACK; return; } } if (TrInput & IN_LSTEP && TestLaraStepLeft(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRight(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } @@ -1213,20 +1213,20 @@ void lara_as_turn_left_slow(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_WALK) { - item->TargetState = LS_TURN_LEFT_SLOW; + item->Animation.TargetState = LS_TURN_LEFT_SLOW; if (lara->Control.TurnRate < -LARA_SLOW_TURN_MAX) lara->Control.TurnRate = -LARA_SLOW_TURN_MAX; } else if (lara->Control.TurnRate < -LARA_SLOW_MED_TURN_MAX) - item->TargetState = LS_TURN_LEFT_FAST; + item->Animation.TargetState = LS_TURN_LEFT_FAST; else [[likely]] - item->TargetState = LS_TURN_LEFT_SLOW; + item->Animation.TargetState = LS_TURN_LEFT_SLOW; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // Pseudo-state for turning left slowly in wade-height water. @@ -1239,7 +1239,7 @@ void PsuedoLaraAsWadeTurnLeftSlow(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_JUMP && TestLaraJumpUp(item, coll)) { - item->TargetState = LS_JUMP_PREPARE; + item->Animation.TargetState = LS_JUMP_PREPARE; lara->Control.JumpDirection = JumpDirection::Up; return; } @@ -1251,39 +1251,39 @@ void PsuedoLaraAsWadeTurnLeftSlow(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else if (TestLaraRunForward(item, coll)) [[likely]] - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; return; } else if (TrInput & IN_BACK && TestLaraWalkBack(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } if (TrInput & IN_LSTEP && TestLaraStepLeft(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRight(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_TURN_LEFT_SLOW; + item->Animation.TargetState = LS_TURN_LEFT_SLOW; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // Pseudo-state for turning left slowly in swamps. @@ -1301,39 +1301,39 @@ void PsuedoLaraAsSwampTurnLeftSlow(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else if (TestLaraRunForward(item, coll)) [[likely]] - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; return; } else if (TrInput & IN_BACK && TestLaraWalkBack(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } if (TrInput & IN_LSTEP && TestLaraStepLeft(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRight(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_TURN_LEFT_SLOW; + item->Animation.TargetState = LS_TURN_LEFT_SLOW; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_TURN_LEFT_SLOW (7) @@ -1369,7 +1369,7 @@ void lara_col_death(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->Airborne = false; + item->Animation.Airborne = false; lara->Control.MoveAngle = item->Position.yRot; coll->Setup.LowerFloorBound = STEPUP_HEIGHT; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; @@ -1433,7 +1433,7 @@ void lara_as_walk_back(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -1468,11 +1468,11 @@ void lara_as_walk_back(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_BACK && (TrInput & IN_WALK || lara->Control.WaterStatus == WaterStatus::Wade)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // Pseudo-state for walking back in swamps. @@ -1500,11 +1500,11 @@ void PseudoLaraAsSwampWalkBack(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_BACK) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_WALK_BACK (16) @@ -1516,8 +1516,8 @@ void lara_col_walk_back(ITEM_INFO* item, COLL_INFO* coll) bool isSwamp = TestEnvironment(ENV_FLAG_SWAMP, item); lara->Control.MoveAngle = item->Position.yRot + ANGLE(180.0f); - item->Airborne = false; - item->VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.VerticalVelocity = 0; coll->Setup.LowerFloorBound = (lara->Control.WaterStatus == WaterStatus::Wade) ? NO_LOWER_BOUND : STEPUP_HEIGHT; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; coll->Setup.LowerCeilingBound = 0; @@ -1563,7 +1563,7 @@ void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -1578,7 +1578,7 @@ void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll) SetLaraJumpDirection(item, coll); if (lara->Control.JumpDirection != JumpDirection::None) { - item->TargetState = LS_JUMP_PREPARE; + item->Animation.TargetState = LS_JUMP_PREPARE; return; } } @@ -1586,7 +1586,7 @@ void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ROLL && lara->Control.WaterStatus != WaterStatus::Wade) { - item->TargetState = LS_ROLL_FORWARD; + item->Animation.TargetState = LS_ROLL_FORWARD; return; } @@ -1594,7 +1594,7 @@ void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll) (lara->Control.HandStatus == HandStatus::Free || !IsStandingWeapon(lara->Control.Weapon.GunType)) && lara->Control.WaterStatus != WaterStatus::Wade) { - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; return; } @@ -1605,7 +1605,7 @@ void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } @@ -1613,7 +1613,7 @@ void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraRunForward(item, coll)) { - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; return; } } @@ -1621,18 +1621,18 @@ void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraWalkForward(item, coll)) { - item->TargetState = LS_WALK_FORWARD; + item->Animation.TargetState = LS_WALK_FORWARD; return; } } else if (TrInput & IN_SPRINT && TestLaraRunForward(item, coll)) { - item->TargetState = LS_SPRINT; + item->Animation.TargetState = LS_SPRINT; return; } else if (TestLaraRunForward(item, coll)) [[likely]] { - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; return; } } @@ -1642,36 +1642,36 @@ void lara_as_turn_right_fast(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraWalkBack(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } } else if (TestLaraRunBack(item, coll)) [[likely]] { - item->TargetState = LS_RUN_BACK; + item->Animation.TargetState = LS_RUN_BACK; return; } } if (TrInput & IN_LSTEP && TestLaraStepLeft(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRight(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } // TODO: Hold WALK to slow down again. if (TrInput & IN_RIGHT) { - item->TargetState = LS_TURN_RIGHT_FAST; + item->Animation.TargetState = LS_TURN_RIGHT_FAST; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_TURN_RIGHT_FAST (20) @@ -1689,7 +1689,7 @@ void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -1704,7 +1704,7 @@ void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll) SetLaraJumpDirection(item, coll); if (lara->Control.JumpDirection != JumpDirection::None) { - item->TargetState = LS_JUMP_PREPARE; + item->Animation.TargetState = LS_JUMP_PREPARE; return; } } @@ -1712,7 +1712,7 @@ void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ROLL && lara->Control.WaterStatus != WaterStatus::Wade) { - item->TargetState = LS_ROLL_FORWARD; + item->Animation.TargetState = LS_ROLL_FORWARD; return; } @@ -1720,7 +1720,7 @@ void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll) (lara->Control.HandStatus == HandStatus::Free || !IsStandingWeapon(lara->Control.Weapon.GunType)) && lara->Control.WaterStatus != WaterStatus::Wade) { - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; return; } @@ -1731,7 +1731,7 @@ void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } @@ -1739,7 +1739,7 @@ void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraRunForward(item, coll)) { - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; return; } } @@ -1747,18 +1747,18 @@ void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraWalkForward(item, coll)) { - item->TargetState = LS_WALK_FORWARD; + item->Animation.TargetState = LS_WALK_FORWARD; return; } } else if (TrInput & IN_SPRINT && TestLaraRunForward(item, coll)) { - item->TargetState = LS_SPRINT; + item->Animation.TargetState = LS_SPRINT; return; } else if (TestLaraRunForward(item, coll)) [[likely]] { - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; return; } } @@ -1768,35 +1768,35 @@ void lara_as_turn_left_fast(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraWalkBack(item, coll)) { - item->TargetState = LS_WALK_BACK; + item->Animation.TargetState = LS_WALK_BACK; return; } } else if (TestLaraRunBack(item, coll)) [[likely]] { - item->TargetState = LS_RUN_BACK; + item->Animation.TargetState = LS_RUN_BACK; return; } } if (TrInput & IN_LSTEP && TestLaraStepLeft(item, coll)) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraStepRight(item, coll)) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_TURN_LEFT_FAST; + item->Animation.TargetState = LS_TURN_LEFT_FAST; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_TURN_LEFT_FAST (152) @@ -1816,7 +1816,7 @@ void lara_as_step_right(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -1838,11 +1838,11 @@ void lara_as_step_right(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_RSTEP) { - item->TargetState = LS_STEP_RIGHT; + item->Animation.TargetState = LS_STEP_RIGHT; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_STEP_RIGHT (21) @@ -1854,8 +1854,8 @@ void lara_col_step_right(ITEM_INFO* item, COLL_INFO* coll) bool isSwamp = TestEnvironment(ENV_FLAG_SWAMP, item); lara->Control.MoveAngle = item->Position.yRot + ANGLE(90.0f); - item->Airborne = false; - item->VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.VerticalVelocity = 0; coll->Setup.LowerFloorBound = (lara->Control.WaterStatus == WaterStatus::Wade) ? NO_LOWER_BOUND : CLICK(0.8f); coll->Setup.UpperFloorBound = -CLICK(0.8f); coll->Setup.LowerCeilingBound = 0; @@ -1885,10 +1885,10 @@ void lara_col_step_right(ITEM_INFO* item, COLL_INFO* coll) if (LaraDeflectEdge(item, coll)) { - item->TargetState = LS_SOFT_SPLAT; - if (GetChange(item, &g_Level.Anims[item->AnimNumber])) + item->Animation.TargetState = LS_SOFT_SPLAT; + if (GetChange(item, &g_Level.Anims[item->Animation.AnimNumber])) { - item->ActiveState = LS_SOFT_SPLAT; + item->Animation.ActiveState = LS_SOFT_SPLAT; return; } @@ -1912,7 +1912,7 @@ void lara_as_step_left(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -1934,11 +1934,11 @@ void lara_as_step_left(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_LSTEP) { - item->TargetState = LS_STEP_LEFT; + item->Animation.TargetState = LS_STEP_LEFT; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_STEP_LEFT (22) @@ -1950,8 +1950,8 @@ void lara_col_step_left(ITEM_INFO* item, COLL_INFO* coll) bool isSwamp = TestEnvironment(ENV_FLAG_SWAMP, item); lara->Control.MoveAngle = item->Position.yRot - ANGLE(90.0f); - item->Airborne = false; - item->VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.VerticalVelocity = 0; coll->Setup.LowerFloorBound = (lara->Control.WaterStatus == WaterStatus::Wade) ? NO_LOWER_BOUND : CLICK(0.8f); coll->Setup.UpperFloorBound = -CLICK(0.8f); coll->Setup.LowerCeilingBound = 0; @@ -1981,10 +1981,10 @@ void lara_col_step_left(ITEM_INFO* item, COLL_INFO* coll) if (LaraDeflectEdge(item, coll)) { - item->TargetState = LS_SOFT_SPLAT; - if (GetChange(item, &g_Level.Anims[item->AnimNumber])) + item->Animation.TargetState = LS_SOFT_SPLAT; + if (GetChange(item, &g_Level.Anims[item->Animation.AnimNumber])) { - item->ActiveState = LS_SOFT_SPLAT; + item->Animation.ActiveState = LS_SOFT_SPLAT; return; } @@ -2008,11 +2008,11 @@ void lara_as_roll_back(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ROLL) { - item->TargetState = LS_ROLL_BACK; + item->Animation.TargetState = LS_ROLL_BACK; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_ROLL_BACK (23) @@ -2022,8 +2022,8 @@ void lara_col_roll_back(ITEM_INFO* item, COLL_INFO* coll) auto* lara = GetLaraInfo(item); lara->Control.MoveAngle = item->Position.yRot + ANGLE(180.0f); - item->Airborne = false; - item->VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.VerticalVelocity = 0; coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; coll->Setup.LowerCeilingBound = 0; @@ -2069,19 +2069,19 @@ void lara_as_roll_forward(ITEM_INFO* item, COLL_INFO* coll) // TODO: Change swandive roll anim state to something sensible. if (TrInput & IN_FORWARD && - item->AnimNumber == LA_SWANDIVE_ROLL) // Hack. + item->Animation.AnimNumber == LA_SWANDIVE_ROLL) // Hack. { - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; return; } if (TrInput & IN_ROLL) { - item->TargetState = LS_ROLL_FORWARD; + item->Animation.TargetState = LS_ROLL_FORWARD; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_ROLL_FORWARD (45) @@ -2091,8 +2091,8 @@ void lara_col_roll_forward(ITEM_INFO* item, COLL_INFO* coll) auto* lara = GetLaraInfo(item); lara->Control.MoveAngle = item->Position.yRot; - item->Airborne = false; - item->VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.VerticalVelocity = 0; coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; coll->Setup.LowerCeilingBound = 0; @@ -2140,7 +2140,7 @@ void lara_as_wade_forward(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; return; } @@ -2174,19 +2174,19 @@ void lara_as_wade_forward(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else if (lara->Control.WaterStatus == WaterStatus::Dry) - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; else [[likely]] - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // Pseudo-state for wading in swamps. @@ -2218,17 +2218,17 @@ void PseudoLaraAsSwampWadeForward(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free && vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else [[likely]] - item->TargetState = LS_WADE_FORWARD; + item->Animation.TargetState = LS_WADE_FORWARD; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_WADE_FORWARD (65) @@ -2260,10 +2260,10 @@ void lara_col_wade_forward(ITEM_INFO* item, COLL_INFO* coll) { item->Position.zRot = 0; - item->TargetState = LS_SOFT_SPLAT; - if (GetChange(item, &g_Level.Anims[item->AnimNumber])) + item->Animation.TargetState = LS_SOFT_SPLAT; + if (GetChange(item, &g_Level.Anims[item->Animation.AnimNumber])) { - item->ActiveState = LS_SOFT_SPLAT; + item->Animation.ActiveState = LS_SOFT_SPLAT; return; } @@ -2291,7 +2291,7 @@ void lara_as_sprint(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -2314,14 +2314,14 @@ void lara_as_sprint(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_JUMP) { - item->TargetState = LS_SPRINT_DIVE; + item->Animation.TargetState = LS_SPRINT_DIVE; return; } if (TrInput & IN_CROUCH && (lara->Control.HandStatus == HandStatus::Free || !IsStandingWeapon(lara->Control.Weapon.GunType))) { - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; return; } @@ -2335,23 +2335,23 @@ void lara_as_sprint(ITEM_INFO* item, COLL_INFO* coll) !TestLaraSplat(item, OFFSET_RADIUS(coll->Setup.Radius), -CLICK(2.5f)) && // HACK: Allow immediate vault only in the case of a soft splat. vaultResult.Success) { - item->TargetState = vaultResult.TargetState; + item->Animation.TargetState = vaultResult.TargetState; SetLaraVault(item, coll, vaultResult); return; } else if (lara->Control.WaterStatus == WaterStatus::Wade) - item->TargetState = LS_RUN_FORWARD; // TODO: Dispatch to wade forward state directly. @Sezz 2021.09.29 + item->Animation.TargetState = LS_RUN_FORWARD; // TODO: Dispatch to wade forward state directly. @Sezz 2021.09.29 else if (TrInput & IN_WALK) - item->TargetState = LS_WALK_FORWARD; + item->Animation.TargetState = LS_WALK_FORWARD; else if (TrInput & IN_SPRINT && lara->SprintEnergy > 0) [[likely]] - item->TargetState = LS_SPRINT; + item->Animation.TargetState = LS_SPRINT; else - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_SPRINT (73) @@ -2393,18 +2393,18 @@ void lara_col_sprint(ITEM_INFO* item, COLL_INFO* coll) if (TestLaraSplat(item, OFFSET_RADIUS(coll->Setup.Radius), -CLICK(2.5f)) || coll->HitTallObject) { - item->TargetState = LS_SPLAT; - if (GetChange(item, &g_Level.Anims[item->AnimNumber])) + item->Animation.TargetState = LS_SPLAT; + if (GetChange(item, &g_Level.Anims[item->Animation.AnimNumber])) { - item->ActiveState = LS_SPLAT; + item->Animation.ActiveState = LS_SPLAT; return; } } - item->TargetState = LS_SOFT_SPLAT; - if (GetChange(item, &g_Level.Anims[item->AnimNumber])) + item->Animation.TargetState = LS_SOFT_SPLAT; + if (GetChange(item, &g_Level.Anims[item->Animation.AnimNumber])) { - item->ActiveState = LS_SOFT_SPLAT; + item->Animation.ActiveState = LS_SOFT_SPLAT; return; } @@ -2448,7 +2448,7 @@ void lara_as_sprint_dive(ITEM_INFO* item, COLL_INFO* coll) DoLaraLean(item, coll, (LARA_LEAN_MAX * 3) / 5, LARA_LEAN_RATE); } - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; } // State: LS_SPRINT_DIVE (74) @@ -2457,7 +2457,7 @@ void lara_col_sprint_dive(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - lara->Control.MoveAngle = (item->Velocity >= 0) ? item->Position.yRot : item->Position.yRot + ANGLE(180.0f); + lara->Control.MoveAngle = (item->Animation.Velocity >= 0) ? item->Position.yRot : item->Position.yRot + ANGLE(180.0f); coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; coll->Setup.LowerCeilingBound = BAD_JUMP_CEILING; @@ -2473,24 +2473,24 @@ void lara_col_sprint_dive(ITEM_INFO* item, COLL_INFO* coll) return; } - if (item->Velocity < 0) + if (item->Animation.Velocity < 0) lara->Control.MoveAngle = item->Position.yRot; // ??? - if (coll->Middle.Floor <= 0 && item->VerticalVelocity > 0) + if (coll->Middle.Floor <= 0 && item->Animation.VerticalVelocity > 0) { DoLaraFallDamage(item); if (item->HitPoints <= 0) // TODO: It seems Core wanted to make the sprint dive a true jump. - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; else if (!(TrInput & IN_FORWARD) || TrInput & IN_WALK || lara->Control.WaterStatus == WaterStatus::Wade) - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; else - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; - item->Airborne = false; - item->VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.VerticalVelocity = 0; item->Position.yPos += coll->Middle.Floor; - item->Velocity = 0; + item->Animation.Velocity = 0; AnimateLara(item); } diff --git a/TR5Main/Game/Lara/lara_basic.h b/TR5Main/Game/Lara/lara_basic.h index 52f754a78..db2b5871e 100644 --- a/TR5Main/Game/Lara/lara_basic.h +++ b/TR5Main/Game/Lara/lara_basic.h @@ -2,7 +2,7 @@ struct ITEM_INFO; struct COLL_INFO; -struct COLL_RESULT; +struct CollisionResult; // ------------------------------ // BASIC MOVEMENT & MISCELLANEOUS diff --git a/TR5Main/Game/Lara/lara_cheat.cpp b/TR5Main/Game/Lara/lara_cheat.cpp index 93d324897..68daba71c 100644 --- a/TR5Main/Game/Lara/lara_cheat.cpp +++ b/TR5Main/Game/Lara/lara_cheat.cpp @@ -42,16 +42,16 @@ void lara_as_swimcheat(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_JUMP) { - item->VerticalVelocity += 16; - if (item->VerticalVelocity > 400) - item->VerticalVelocity = 400; + item->Animation.VerticalVelocity += 16; + if (item->Animation.VerticalVelocity > 400) + item->Animation.VerticalVelocity = 400; } else { - if (item->VerticalVelocity >= 8) - item->VerticalVelocity -= item->VerticalVelocity >> 3; + if (item->Animation.VerticalVelocity >= 8) + item->Animation.VerticalVelocity -= item->Animation.VerticalVelocity >> 3; else - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } } @@ -74,8 +74,8 @@ void LaraCheatyBits(ITEM_INFO* item) { SetAnimation(item, LA_DOZY); item->Position.xRot = ANGLE(30.0f); - item->VerticalVelocity = 30; - item->Airborne = false; + item->Animation.VerticalVelocity = 30; + item->Animation.Airborne = false; item->HitPoints = 1000; ResetLaraFlex(item); diff --git a/TR5Main/Game/Lara/lara_climb.cpp b/TR5Main/Game/Lara/lara_climb.cpp index fc4044c61..898f5d227 100644 --- a/TR5Main/Game/Lara/lara_climb.cpp +++ b/TR5Main/Game/Lara/lara_climb.cpp @@ -27,10 +27,10 @@ void lara_as_climb_end(ITEM_INFO* item, COLL_INFO* coll) void lara_col_climb_down(ITEM_INFO* item, COLL_INFO* coll) { - if (LaraCheckForLetGo(item, coll) || item->AnimNumber != LA_LADDER_DOWN) + if (LaraCheckForLetGo(item, coll) || item->Animation.AnimNumber != LA_LADDER_DOWN) return; - int frame = item->FrameNumber - g_Level.Anims[LA_LADDER_DOWN].frameBase; + int frame = item->Animation.FrameNumber - g_Level.Anims[LA_LADDER_DOWN].frameBase; int xShift; int yShift; @@ -70,7 +70,7 @@ void lara_col_climb_down(ITEM_INFO* item, COLL_INFO* coll) { if (shiftRight < 0 != shiftLeft < 0) { - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; AnimateLara(item); return; } @@ -85,20 +85,20 @@ void lara_col_climb_down(ITEM_INFO* item, COLL_INFO* coll) if (resultRight == -1 || resultLeft == -1) { SetAnimation(item, LA_LADDER_IDLE); - item->TargetState = LS_HANG; + item->Animation.TargetState = LS_HANG; AnimateLara(item); } else { - item->TargetState = LS_LADDER_DOWN; + item->Animation.TargetState = LS_LADDER_DOWN; item->Position.yPos -= yShift; } return; } - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; if (yShift != 0) AnimateLara(item); @@ -115,9 +115,9 @@ void lara_as_climb_down(ITEM_INFO* item, COLL_INFO* coll) void lara_col_climb_up(ITEM_INFO* item, COLL_INFO* coll) { - if (!LaraCheckForLetGo(item, coll) && item->AnimNumber == LA_LADDER_UP) + if (!LaraCheckForLetGo(item, coll) && item->Animation.AnimNumber == LA_LADDER_UP) { - int frame = item->FrameNumber - g_Level.Anims[LA_LADDER_UP].frameBase; + int frame = item->Animation.FrameNumber - g_Level.Anims[LA_LADDER_UP].frameBase; int yShift; int resultRight, resultLeft; int shiftRight, shiftLeft; @@ -144,7 +144,7 @@ void lara_col_climb_up(ITEM_INFO* item, COLL_INFO* coll) { if (resultRight < 0 || resultLeft < 0) { - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; AnimateLara(item); @@ -152,25 +152,25 @@ void lara_col_climb_up(ITEM_INFO* item, COLL_INFO* coll) { if (resultRight != -1 || resultLeft != -1) { - item->TargetState = LS_LADDER_TO_CROUCH; - item->RequiredState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_LADDER_TO_CROUCH; + item->Animation.RequiredState = LS_CROUCH_IDLE; } else { - item->TargetState = LS_GRABBING; + item->Animation.TargetState = LS_GRABBING; item->Position.yPos += (ledgeRight + ledgeLeft) / 2 - CLICK(1); } } } else { - item->TargetState = LS_LADDER_UP; + item->Animation.TargetState = LS_LADDER_UP; item->Position.yPos -= yShift; } } else { - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; if (yShift != 0) AnimateLara(item); @@ -205,7 +205,7 @@ void lara_as_climb_right(ITEM_INFO* item, COLL_INFO* coll) Camera.targetElevation = -ANGLE(15.0f); if (!(TrInput & (IN_RIGHT | IN_RSTEP))) - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; } void lara_col_climb_left(ITEM_INFO* item, COLL_INFO* coll) @@ -228,7 +228,7 @@ void lara_as_climb_left(ITEM_INFO* item, COLL_INFO* coll) Camera.targetElevation = -ANGLE(15.0f); if (!(TrInput & (IN_LEFT | IN_LSTEP))) - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; } void lara_col_climb_idle(ITEM_INFO* item, COLL_INFO* coll) @@ -237,7 +237,7 @@ void lara_col_climb_idle(ITEM_INFO* item, COLL_INFO* coll) int resultRight, resultLeft; int ledgeRight, ledgeLeft; - if (LaraCheckForLetGo(item, coll) || item->AnimNumber != LA_LADDER_IDLE) + if (LaraCheckForLetGo(item, coll) || item->Animation.AnimNumber != LA_LADDER_IDLE) return; if (!(TrInput & IN_FORWARD)) @@ -245,10 +245,10 @@ void lara_col_climb_idle(ITEM_INFO* item, COLL_INFO* coll) if (!(TrInput & IN_BACK)) return; - if (item->TargetState == LS_HANG) + if (item->Animation.TargetState == LS_HANG) return; - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; item->Position.yPos += CLICK(1); resultRight = LaraTestClimbPos(item, coll->Setup.Radius, coll->Setup.Radius + CLICK(0.5f), -CLICK(2), CLICK(2), &ledgeRight); @@ -271,17 +271,17 @@ void lara_col_climb_idle(ITEM_INFO* item, COLL_INFO* coll) if (resultRight == 1 && resultLeft == 1) { - item->TargetState = LS_LADDER_DOWN; + item->Animation.TargetState = LS_LADDER_DOWN; item->Position.yPos += yShift; } else - item->TargetState = LS_HANG; + item->Animation.TargetState = LS_HANG; } - else if (item->TargetState != LS_GRABBING) + else if (item->Animation.TargetState != LS_GRABBING) { int shiftRight, shiftLeft; - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; resultRight = LaraTestClimbUpPos(item, coll->Setup.Radius, coll->Setup.Radius + CLICK(0.5f), &shiftRight, &ledgeRight); resultLeft = LaraTestClimbUpPos(item, coll->Setup.Radius, -CLICK(0.5f) - coll->Setup.Radius, &shiftLeft, &ledgeLeft); @@ -308,20 +308,20 @@ void lara_col_climb_idle(ITEM_INFO* item, COLL_INFO* coll) yShift = shiftRight; } - item->TargetState = LS_LADDER_UP; + item->Animation.TargetState = LS_LADDER_UP; item->Position.yPos += yShift; } else if (abs(ledgeLeft - ledgeRight) <= CLICK(0.5f)) { if (resultRight == -1 && resultLeft == -1) { - item->TargetState = LS_GRABBING; + item->Animation.TargetState = LS_GRABBING; item->Position.yPos += (ledgeRight + ledgeLeft) / 2 - CLICK(1); } else { - item->TargetState = LS_LADDER_TO_CROUCH; - item->RequiredState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_LADDER_TO_CROUCH; + item->Animation.RequiredState = LS_CROUCH_IDLE; } } } @@ -336,9 +336,9 @@ void lara_as_climb_idle(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.EnableObjectPush = false; Camera.targetElevation = -ANGLE(20.0f); - if (item->AnimNumber == LA_LADDER_DISMOUNT_LEFT_START) + if (item->Animation.AnimNumber == LA_LADDER_DISMOUNT_LEFT_START) Camera.targetAngle = -ANGLE(60.0f); - if (item->AnimNumber == LA_LADDER_DISMOUNT_RIGHT_START) + if (item->Animation.AnimNumber == LA_LADDER_DISMOUNT_RIGHT_START) Camera.targetAngle = ANGLE(60.0f); if (TrInput & IN_LOOK) @@ -346,19 +346,19 @@ void lara_as_climb_idle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_LEFT || TrInput & IN_LSTEP) { - item->TargetState = LS_LADDER_LEFT; + item->Animation.TargetState = LS_LADDER_LEFT; lara->Control.MoveAngle = item->Position.yRot - ANGLE(90.0f); } else if (TrInput & IN_RIGHT || TrInput & IN_RSTEP) { - item->TargetState = LS_LADDER_RIGHT; + item->Animation.TargetState = LS_LADDER_RIGHT; lara->Control.MoveAngle = item->Position.yRot + ANGLE(90.0f); } else if (TrInput & IN_JUMP) { - if (item->AnimNumber == LA_LADDER_IDLE) + if (item->Animation.AnimNumber == LA_LADDER_IDLE) { - item->TargetState = LS_JUMP_BACK; + item->Animation.TargetState = LS_JUMP_BACK; lara->Control.HandStatus = HandStatus::Free; lara->Control.MoveAngle = item->Position.yRot + ANGLE(180.0f); } @@ -477,11 +477,11 @@ void LaraDoClimbLeftRight(ITEM_INFO* item, COLL_INFO* coll, int result, int shif if (result == 1) { if (TrInput & IN_LEFT) - item->TargetState = LS_LADDER_LEFT; + item->Animation.TargetState = LS_LADDER_LEFT; else if (TrInput & IN_RIGHT) - item->TargetState = LS_LADDER_RIGHT; + item->Animation.TargetState = LS_LADDER_RIGHT; else - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; item->Position.yPos += shift; return; @@ -489,12 +489,12 @@ void LaraDoClimbLeftRight(ITEM_INFO* item, COLL_INFO* coll, int result, int shif if (result != 0) { - item->TargetState = LS_HANG; + item->Animation.TargetState = LS_HANG; do { AnimateItem(item); - } while (item->ActiveState != LS_HANG); + } while (item->Animation.ActiveState != LS_HANG); item->Position.xPos = coll->Setup.OldPosition.x; item->Position.zPos = coll->Setup.OldPosition.z; @@ -505,8 +505,8 @@ void LaraDoClimbLeftRight(ITEM_INFO* item, COLL_INFO* coll, int result, int shif item->Position.xPos = coll->Setup.OldPosition.x; item->Position.zPos = coll->Setup.OldPosition.z; - item->TargetState = LS_LADDER_IDLE; - item->ActiveState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; + item->Animation.ActiveState = LS_LADDER_IDLE; if (coll->Setup.OldState != LS_LADDER_IDLE) { @@ -523,8 +523,8 @@ void LaraDoClimbLeftRight(ITEM_INFO* item, COLL_INFO* coll, int result, int shif item->Position.xPos, item->Position.yPos, item->Position.zPos) - item->Position.yPos; if (height < CLICK(1.5f)) // LADDER dismounts (left/right) { - item->TargetState = LS_LADDER_DISMOUNT_LEFT; - item->ActiveState = LS_MISC_CONTROL; + item->Animation.TargetState = LS_LADDER_DISMOUNT_LEFT; + item->Animation.ActiveState = LS_MISC_CONTROL; } } else if (TrInput & IN_RIGHT) @@ -537,8 +537,8 @@ void LaraDoClimbLeftRight(ITEM_INFO* item, COLL_INFO* coll, int result, int shif if (height < CLICK(1.5f)) // LADDER dismounts (left/right) { - item->TargetState = LS_LADDER_DISMOUNT_RIGHT; - item->ActiveState = LS_MISC_CONTROL; + item->Animation.TargetState = LS_LADDER_DISMOUNT_RIGHT; + item->Animation.ActiveState = LS_MISC_CONTROL; } } @@ -571,8 +571,8 @@ void LaraDoClimbLeftRight(ITEM_INFO* item, COLL_INFO* coll, int result, int shif } } - item->AnimNumber = coll->Setup.OldAnimNumber; - item->FrameNumber = coll->Setup.OldFrameNumber; + item->Animation.AnimNumber = coll->Setup.OldAnimNumber; + item->Animation.FrameNumber = coll->Setup.OldFrameNumber; AnimateLara(item); } @@ -583,7 +583,7 @@ int LaraClimbRightCornerTest(ITEM_INFO* item, COLL_INFO* coll) int result = 0; - if (item->AnimNumber != LA_LADDER_RIGHT) + if (item->Animation.AnimNumber != LA_LADDER_RIGHT) return 0; auto oldPos = item->Position; @@ -672,7 +672,7 @@ int LaraClimbLeftCornerTest(ITEM_INFO* item, COLL_INFO* coll) int result = 0; - if (item->AnimNumber != LA_LADDER_LEFT) + if (item->Animation.AnimNumber != LA_LADDER_LEFT) return 0; auto oldPos = item->Position; @@ -964,19 +964,19 @@ bool LaraCheckForLetGo(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; - if (TrInput & IN_ACTION && item->HitPoints > 0 || item->AnimNumber == LA_ONWATER_TO_LADDER) // Can't let go on this anim + if (TrInput & IN_ACTION && item->HitPoints > 0 || item->Animation.AnimNumber == LA_ONWATER_TO_LADDER) // Can't let go on this anim return false; ResetLaraFlex(item); SetAnimation(item, LA_FALL_START); - item->Velocity = 2; - item->VerticalVelocity = 1; - item->Airborne = true; + item->Animation.Velocity = 2; + item->Animation.VerticalVelocity = 1; + item->Animation.Airborne = true; lara->Control.HandStatus = HandStatus::Free; return true; } diff --git a/TR5Main/Game/Lara/lara_collide.cpp b/TR5Main/Game/Lara/lara_collide.cpp index 3bf146305..d883bda4b 100644 --- a/TR5Main/Game/Lara/lara_collide.cpp +++ b/TR5Main/Game/Lara/lara_collide.cpp @@ -28,9 +28,9 @@ bool LaraDeflectEdge(ITEM_INFO* item, COLL_INFO* coll) { ShiftItem(item, coll); - item->TargetState = LS_IDLE; - item->Velocity = 0; - item->Airborne = false; + item->Animation.TargetState = LS_IDLE; + item->Animation.Velocity = 0; + item->Animation.Airborne = false; return true; } @@ -57,21 +57,21 @@ bool LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll) if (coll->CollisionType == CT_FRONT || coll->CollisionType == CT_TOP_FRONT) { - if (!lara->Control.CanClimbLadder || item->Velocity != 2) + if (!lara->Control.CanClimbLadder || item->Animation.Velocity != 2) { if (coll->Middle.Floor <= CLICK(1)) { SetAnimation(item, LA_LAND); LaraSnapToHeight(item, coll); } - else if (abs(item->Velocity) > 50) // TODO: Tune and demagic this value. + else if (abs(item->Animation.Velocity) > 50) // TODO: Tune and demagic this value. SetAnimation(item, LA_JUMP_WALL_SMASH_START, 1); - item->Velocity /= 4; + item->Animation.Velocity /= 4; lara->Control.MoveAngle += ANGLE(180.0f); - if (item->VerticalVelocity <= 0) - item->VerticalVelocity = 1; + if (item->Animation.VerticalVelocity <= 0) + item->Animation.VerticalVelocity = 1; } return true; @@ -79,8 +79,8 @@ bool LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll) if (coll->CollisionType == CT_TOP || coll->Middle.Ceiling >= 0) { - if (item->VerticalVelocity <= 0) - item->VerticalVelocity = 1; + if (item->Animation.VerticalVelocity <= 0) + item->Animation.VerticalVelocity = 1; } else if (coll->CollisionType == CT_LEFT) item->Position.yRot += ANGLE(DEFLECT_STRAIGHT_ANGLE); @@ -90,11 +90,11 @@ bool LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll) { item->Position.xPos -= 400 * phd_sin(coll->Setup.ForwardAngle); item->Position.zPos -= 400 * phd_cos(coll->Setup.ForwardAngle); - item->Velocity = 0; + item->Animation.Velocity = 0; coll->Middle.Floor = 0; - if (item->VerticalVelocity <= 0) - item->VerticalVelocity = 16; + if (item->Animation.VerticalVelocity <= 0) + item->Animation.VerticalVelocity = 16; } return false; @@ -116,19 +116,19 @@ void LaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll) case CT_TOP: case CT_TOP_FRONT: - if (item->VerticalVelocity <= 0) - item->VerticalVelocity = 1; + if (item->Animation.VerticalVelocity <= 0) + item->Animation.VerticalVelocity = 1; break; case CT_CLAMP: item->Position.zPos -= 400 * phd_cos(coll->Setup.ForwardAngle); item->Position.xPos -= 400 * phd_sin(coll->Setup.ForwardAngle); - item->Velocity = 0; + item->Animation.Velocity = 0; coll->Middle.Floor = 0; - if (item->VerticalVelocity <= 0) - item->VerticalVelocity = 16; + if (item->Animation.VerticalVelocity <= 0) + item->Animation.VerticalVelocity = 16; break; } @@ -141,8 +141,8 @@ bool LaraDeflectEdgeCrawl(ITEM_INFO* item, COLL_INFO* coll) { ShiftItem(item, coll); - item->Velocity = 0; - item->Airborne = false; + item->Animation.Velocity = 0; + item->Animation.Airborne = false; return true; } @@ -167,9 +167,9 @@ bool LaraDeflectEdgeMonkey(ITEM_INFO* item, COLL_INFO* coll) { ShiftItem(item, coll); - item->TargetState = LS_MONKEY_IDLE; - item->Velocity = 0; - item->Airborne = false; + item->Animation.TargetState = LS_MONKEY_IDLE; + item->Animation.Velocity = 0; + item->Animation.Airborne = false; return true; } @@ -204,9 +204,9 @@ void SetLaraHitCeiling(ITEM_INFO* item, COLL_INFO* coll) item->Position.yPos = coll->Setup.OldPosition.y; item->Position.zPos = coll->Setup.OldPosition.z; - item->Velocity = 0; - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; } void LaraCollideStop(ITEM_INFO* item, COLL_INFO* coll) @@ -218,42 +218,42 @@ void LaraCollideStop(ITEM_INFO* item, COLL_INFO* coll) case LS_TURN_LEFT_SLOW: case LS_TURN_RIGHT_FAST: case LS_TURN_LEFT_FAST: - item->ActiveState = coll->Setup.OldState; - item->AnimNumber = coll->Setup.OldAnimNumber; - item->FrameNumber = coll->Setup.OldFrameNumber; + item->Animation.ActiveState = coll->Setup.OldState; + item->Animation.AnimNumber = coll->Setup.OldAnimNumber; + item->Animation.FrameNumber = coll->Setup.OldFrameNumber; if (TrInput & IN_LEFT) { // Prevent turn lock against walls. - if (item->ActiveState == LS_TURN_RIGHT_SLOW || - item->ActiveState == LS_TURN_RIGHT_FAST) + if (item->Animation.ActiveState == LS_TURN_RIGHT_SLOW || + item->Animation.ActiveState == LS_TURN_RIGHT_FAST) { - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } else - item->TargetState = LS_TURN_LEFT_SLOW; + item->Animation.TargetState = LS_TURN_LEFT_SLOW; } else if (TrInput & IN_RIGHT) { - if (item->ActiveState == LS_TURN_LEFT_SLOW || - item->ActiveState == LS_TURN_LEFT_FAST) + if (item->Animation.ActiveState == LS_TURN_LEFT_SLOW || + item->Animation.ActiveState == LS_TURN_LEFT_FAST) { - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } else - item->TargetState = LS_TURN_RIGHT_SLOW; + item->Animation.TargetState = LS_TURN_RIGHT_SLOW; } else - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; AnimateLara(item); break; default: - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; - if (item->AnimNumber != LA_STAND_SOLID) + if (item->Animation.AnimNumber != LA_STAND_SOLID) SetAnimation(item, LA_STAND_SOLID); break; @@ -267,28 +267,28 @@ void LaraCollideStopCrawl(ITEM_INFO* item, COLL_INFO* coll) case LS_CRAWL_IDLE: case LS_CRAWL_TURN_LEFT: case LS_CRAWL_TURN_RIGHT: - item->ActiveState = coll->Setup.OldState; - item->AnimNumber = coll->Setup.OldAnimNumber; - item->FrameNumber = coll->Setup.OldFrameNumber; + item->Animation.ActiveState = coll->Setup.OldState; + item->Animation.AnimNumber = coll->Setup.OldAnimNumber; + item->Animation.FrameNumber = coll->Setup.OldFrameNumber; if (TrInput & IN_LEFT) - item->TargetState = LS_CRAWL_TURN_LEFT; + item->Animation.TargetState = LS_CRAWL_TURN_LEFT; else if (TrInput & IN_RIGHT) - item->TargetState = LS_CRAWL_TURN_RIGHT; + item->Animation.TargetState = LS_CRAWL_TURN_RIGHT; else - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; AnimateLara(item); break; default: - item->ActiveState = LS_CRAWL_IDLE; - item->TargetState = LS_CRAWL_IDLE; + item->Animation.ActiveState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; - if (item->AnimNumber != LA_CRAWL_IDLE) + if (item->Animation.AnimNumber != LA_CRAWL_IDLE) { - item->AnimNumber = LA_CRAWL_IDLE; - item->FrameNumber = GetFrameNumber(item, 0); + item->Animation.AnimNumber = LA_CRAWL_IDLE; + item->Animation.FrameNumber = GetFrameNumber(item, 0); } break; @@ -302,28 +302,28 @@ void LaraCollideStopMonkey(ITEM_INFO* item, COLL_INFO* coll) case LS_MONKEY_IDLE: case LS_MONKEY_TURN_LEFT: case LS_MONKEY_TURN_RIGHT: - item->ActiveState = coll->Setup.OldState; - item->AnimNumber = coll->Setup.OldAnimNumber; - item->FrameNumber = coll->Setup.OldFrameNumber; + item->Animation.ActiveState = coll->Setup.OldState; + item->Animation.AnimNumber = coll->Setup.OldAnimNumber; + item->Animation.FrameNumber = coll->Setup.OldFrameNumber; if (TrInput & IN_LEFT) - item->TargetState = LS_MONKEY_TURN_LEFT; + item->Animation.TargetState = LS_MONKEY_TURN_LEFT; else if (TrInput & IN_RIGHT) - item->TargetState = LS_MONKEY_TURN_RIGHT; + item->Animation.TargetState = LS_MONKEY_TURN_RIGHT; else - item->TargetState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; AnimateLara(item); break; default: - item->ActiveState = LS_MONKEY_IDLE; - item->TargetState = LS_MONKEY_IDLE; + item->Animation.ActiveState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; - if (item->AnimNumber != LA_MONKEY_IDLE) + if (item->Animation.AnimNumber != LA_MONKEY_IDLE) { - item->AnimNumber = LA_MONKEY_IDLE; - item->FrameNumber = GetFrameNumber(item, 0); + item->Animation.AnimNumber = LA_MONKEY_IDLE; + item->Animation.FrameNumber = GetFrameNumber(item, 0); } break; @@ -332,7 +332,7 @@ void LaraCollideStopMonkey(ITEM_INFO* item, COLL_INFO* coll) void LaraSnapToEdgeOfBlock(ITEM_INFO* item, COLL_INFO* coll, short angle) { - if (item->ActiveState == LS_SHIMMY_RIGHT) + if (item->Animation.ActiveState == LS_SHIMMY_RIGHT) { switch (angle) { @@ -355,7 +355,7 @@ void LaraSnapToEdgeOfBlock(ITEM_INFO* item, COLL_INFO* coll, short angle) } } - if (item->ActiveState == LS_SHIMMY_LEFT) + if (item->Animation.ActiveState == LS_SHIMMY_LEFT) { switch (angle) { @@ -386,8 +386,8 @@ void LaraResetGravityStatus(ITEM_INFO* item, COLL_INFO* coll) if (coll->Middle.Floor <= STEPUP_HEIGHT) { - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; } } @@ -439,7 +439,7 @@ void LaraSurfaceCollision(ITEM_INFO* item, COLL_INFO* coll) if (coll->CollisionType & (CT_FRONT | CT_TOP | CT_TOP_FRONT | CT_CLAMP) || coll->Middle.Floor < 0 && coll->Middle.FloorSlope) { - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; item->Position.xPos = coll->Setup.OldPosition.x; item->Position.yPos = coll->Setup.OldPosition.y; item->Position.zPos = coll->Setup.OldPosition.z; @@ -519,7 +519,7 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll) item->Position.xRot -= 45; else { - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; flag = 1; } } @@ -556,7 +556,7 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll) break; case CT_TOP_FRONT: - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; flag = 1; break; @@ -574,7 +574,7 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll) item->Position.xPos = coll->Setup.OldPosition.x; item->Position.yPos = coll->Setup.OldPosition.y; item->Position.zPos = coll->Setup.OldPosition.z; - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; flag = 2; break; } diff --git a/TR5Main/Game/Lara/lara_crawl.cpp b/TR5Main/Game/Lara/lara_crawl.cpp index d8fd4f206..8ea083a58 100644 --- a/TR5Main/Game/Lara/lara_crawl.cpp +++ b/TR5Main/Game/Lara/lara_crawl.cpp @@ -41,12 +41,12 @@ void lara_as_crouch_idle(ITEM_INFO* item, COLL_INFO* coll) Camera.targetDistance = SECTOR(1); // TODO: Dispatch pickups from within states. - if (item->TargetState == LS_PICKUP) + if (item->Animation.TargetState == LS_PICKUP) return; if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -65,32 +65,32 @@ void lara_as_crouch_idle(ITEM_INFO* item, COLL_INFO* coll) lara->Control.HandStatus == HandStatus::Free && g_GameFlow->Animations.HasCrouchRoll) { - item->TargetState = LS_CROUCH_ROLL; + item->Animation.TargetState = LS_CROUCH_ROLL; return; } if (TrInput & (IN_FORWARD | IN_BACK) && TestLaraCrouchToCrawl(item)) { - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_CROUCH_TURN_LEFT; + item->Animation.TargetState = LS_CROUCH_TURN_LEFT; return; } else if (TrInput & IN_RIGHT) { - item->TargetState = LS_CROUCH_TURN_RIGHT; + item->Animation.TargetState = LS_CROUCH_TURN_RIGHT; return; } - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_CROUCH_IDLE (71) @@ -99,8 +99,8 @@ void lara_col_crouch_idle(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; lara->Control.KeepLow = TestLaraKeepLow(item, coll); lara->Control.IsLow = true; lara->Control.MoveAngle = item->Position.yRot; @@ -164,7 +164,7 @@ void lara_as_crouch_roll(ITEM_INFO* item, COLL_INFO* coll) DoLaraLean(item, coll, LARA_LEAN_MAX, LARA_LEAN_RATE); } - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; } // State: LS_CROUCH_ROLL (72) @@ -173,8 +173,8 @@ void lara_col_crouch_roll(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; lara->Control.KeepLow = TestLaraKeepLow(item, coll); lara->Control.IsLow = true; lara->Control.MoveAngle = item->Position.yRot; @@ -199,7 +199,7 @@ void lara_col_crouch_roll(ITEM_INFO* item, COLL_INFO* coll) { SetLaraFallAnimation(item); lara->Control.HandStatus = HandStatus::Free; - item->Velocity /= 3; // Truncate speed to prevent flying off. + item->Animation.Velocity /= 3; // Truncate speed to prevent flying off. return; } @@ -235,7 +235,7 @@ void lara_as_crouch_turn_left(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -250,27 +250,27 @@ void lara_as_crouch_turn_left(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_SPRINT && TestLaraCrouchRoll(item, coll) && g_GameFlow->Animations.HasCrouchRoll) { - item->TargetState = LS_CROUCH_ROLL; + item->Animation.TargetState = LS_CROUCH_ROLL; return; } if (TrInput & (IN_FORWARD | IN_BACK) && TestLaraCrouchToCrawl(item)) { - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_CROUCH_TURN_LEFT; + item->Animation.TargetState = LS_CROUCH_TURN_LEFT; return; } - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_CRAWL_TURN_LEFT (105) @@ -291,7 +291,7 @@ void lara_as_crouch_turn_right(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -306,27 +306,27 @@ void lara_as_crouch_turn_right(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_SPRINT && TestLaraCrouchRoll(item, coll) && g_GameFlow->Animations.HasCrouchRoll) { - item->TargetState = LS_CROUCH_ROLL; + item->Animation.TargetState = LS_CROUCH_ROLL; return; } if (TrInput & (IN_FORWARD | IN_BACK) && TestLaraCrouchToCrawl(item)) { - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } if (TrInput & IN_RIGHT) { - item->TargetState = LS_CROUCH_TURN_RIGHT; + item->Animation.TargetState = LS_CROUCH_TURN_RIGHT; return; } - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // State: LS_CRAWL_TURN_RIGHT (106) @@ -352,12 +352,12 @@ void lara_as_crawl_idle(ITEM_INFO* item, COLL_INFO* coll) Camera.targetDistance = SECTOR(1); // TODO: Dispatch pickups from within states. - if (item->TargetState == LS_PICKUP) + if (item->Animation.TargetState == LS_PICKUP) return; if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -376,9 +376,9 @@ void lara_as_crawl_idle(ITEM_INFO* item, COLL_INFO* coll) if ((TrInput & IN_SPRINT && TestLaraCrouchRoll(item, coll)) || (TrInput & (IN_DRAW | IN_FLARE) && !IsStandingWeapon(lara->Control.Weapon.GunType) && - item->AnimNumber != LA_CROUCH_TO_CRAWL_START)) // Hack. + item->Animation.AnimNumber != LA_CROUCH_TO_CRAWL_START)) // Hack. { - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; lara->Control.HandStatus = HandStatus::Free; return; } @@ -391,13 +391,13 @@ void lara_as_crawl_idle(ITEM_INFO* item, COLL_INFO* coll) crawlVaultResult.Success && g_GameFlow->Animations.HasCrawlExtended) { - item->TargetState = crawlVaultResult.TargetState; + item->Animation.TargetState = crawlVaultResult.TargetState; ResetLaraFlex(item); return; } else if (TestLaraCrawlForward(item, coll)) [[likely]] { - item->TargetState = LS_CRAWL_FORWARD; + item->Animation.TargetState = LS_CRAWL_FORWARD; return; } } @@ -405,33 +405,33 @@ void lara_as_crawl_idle(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & (IN_ACTION | IN_JUMP) && TestLaraCrawlToHang(item, coll)) { - item->TargetState = LS_CRAWL_TO_HANG; + item->Animation.TargetState = LS_CRAWL_TO_HANG; DoLaraCrawlToHangSnap(item, coll); return; } else if (TestLaraCrawlBack(item, coll)) [[likely]] { - item->TargetState = LS_CRAWL_BACK; + item->Animation.TargetState = LS_CRAWL_BACK; return; } } if (TrInput & IN_LEFT) { - item->TargetState = LS_CRAWL_TURN_LEFT; + item->Animation.TargetState = LS_CRAWL_TURN_LEFT; return; } else if (TrInput & IN_RIGHT) { - item->TargetState = LS_CRAWL_TURN_RIGHT; + item->Animation.TargetState = LS_CRAWL_TURN_RIGHT; return; } - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; lara->Control.HandStatus = HandStatus::Free; } @@ -441,8 +441,8 @@ void lara_col_crawl_idle(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; lara->Control.KeepLow = TestLaraKeepLow(item, coll); lara->Control.IsLow = true; lara->Control.MoveAngle = item->Position.yRot; @@ -492,7 +492,7 @@ void lara_as_crawl_forward(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -518,21 +518,21 @@ void lara_as_crawl_forward(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_SPRINT && TestLaraCrouchRoll(item, coll)) { - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } if (TrInput & IN_FORWARD) { - item->TargetState = LS_CRAWL_FORWARD; + item->Animation.TargetState = LS_CRAWL_FORWARD; return; } - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; } // State: LS_CRAWL_FORWARD (81) @@ -541,8 +541,8 @@ void lara_col_crawl_forward(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; lara->Control.KeepLow = TestLaraKeepLow(item, coll); lara->Control.IsLow = true; lara->Control.MoveAngle = item->Position.yRot; @@ -597,7 +597,7 @@ void lara_as_crawl_back(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -623,15 +623,15 @@ void lara_as_crawl_back(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_BACK) { - item->TargetState = LS_CRAWL_BACK; + item->Animation.TargetState = LS_CRAWL_BACK; return; } - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; } // State: LS_CRAWL_BACK (86) @@ -640,8 +640,8 @@ void lara_col_crawl_back(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; lara->Control.KeepLow = TestLaraKeepLow(item, coll); lara->Control.IsLow = true; lara->Control.MoveAngle = item->Position.yRot + ANGLE(180.0f); @@ -693,7 +693,7 @@ void lara_as_crawl_turn_left(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -704,33 +704,33 @@ void lara_as_crawl_turn_left(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_SPRINT && TestLaraCrouchRoll(item, coll)) { - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } if (TrInput & IN_FORWARD && TestLaraCrawlForward(item, coll)) { - item->TargetState = LS_CRAWL_FORWARD; + item->Animation.TargetState = LS_CRAWL_FORWARD; return; } if (TrInput & IN_BACK && TestLaraCrawlBack(item, coll)) { - item->TargetState = LS_CRAWL_BACK; + item->Animation.TargetState = LS_CRAWL_BACK; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_CRAWL_TURN_LEFT; + item->Animation.TargetState = LS_CRAWL_TURN_LEFT; return; } - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; } // State: LS_CRAWL_TURN_LEFT (84) @@ -753,7 +753,7 @@ void lara_as_crawl_turn_right(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -764,33 +764,33 @@ void lara_as_crawl_turn_right(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_SPRINT && TestLaraCrouchRoll(item, coll)) { - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } if (TrInput & IN_FORWARD && TestLaraCrawlForward(item, coll)) { - item->TargetState = LS_CRAWL_FORWARD; + item->Animation.TargetState = LS_CRAWL_FORWARD; return; } if (TrInput & IN_BACK && TestLaraCrawlBack(item, coll)) { - item->TargetState = LS_CRAWL_BACK; + item->Animation.TargetState = LS_CRAWL_BACK; return; } if (TrInput & IN_RIGHT) { - item->TargetState = LS_CRAWL_TURN_RIGHT; + item->Animation.TargetState = LS_CRAWL_TURN_RIGHT; return; } - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; return; } - item->TargetState = LS_CRAWL_IDLE; + item->Animation.TargetState = LS_CRAWL_IDLE; } // State: LS_CRAWL_TURN_RIGHT (85) @@ -809,7 +809,7 @@ void lara_col_crawl_to_hang(ITEM_INFO* item, COLL_INFO* coll) Camera.targetAngle = 0; Camera.targetDistance = SECTOR(1); - if (item->AnimNumber == LA_CRAWL_TO_HANG_END) + if (item->Animation.AnimNumber == LA_CRAWL_TO_HANG_END) { lara->Control.MoveAngle = item->Position.yRot; coll->Setup.Height = LARA_HEIGHT_STRETCH; @@ -826,8 +826,8 @@ void lara_col_crawl_to_hang(ITEM_INFO* item, COLL_INFO* coll) GetCollisionInfo(coll, item); lara->Control.HandStatus = HandStatus::Busy; item->Position.yPos += coll->Front.Floor - GetBoundsAccurate(item)->Y1 - 20; - item->Airborne = true; - item->Velocity = 2; - item->VerticalVelocity = 1; + item->Animation.Airborne = true; + item->Animation.Velocity = 2; + item->Animation.VerticalVelocity = 1; } } diff --git a/TR5Main/Game/Lara/lara_fire.cpp b/TR5Main/Game/Lara/lara_fire.cpp index c3afdba70..6c1abbbec 100644 --- a/TR5Main/Game/Lara/lara_fire.cpp +++ b/TR5Main/Game/Lara/lara_fire.cpp @@ -401,7 +401,7 @@ void LaraGun(ITEM_INFO* laraItem) { // if (!laraInfo->leftArm.frameNumber) // NO { - laraInfo->Control.HandStatus = HandStatus::UndrawWeapon; + laraInfo->Control.HandStatus = HandStatus::WeaponUndraw; } } else if (laraInfo->Inventory.TotalFlares) @@ -416,9 +416,9 @@ void LaraGun(ITEM_INFO* laraItem) if (TrInput & IN_DRAW || laraInfo->Control.Weapon.RequestGunType != laraInfo->Control.Weapon.GunType) { - if ((laraItem->ActiveState == LS_CROUCH_IDLE || - laraItem->ActiveState == LS_CROUCH_TURN_LEFT || - laraItem->ActiveState == LS_CROUCH_TURN_RIGHT) && + if ((laraItem->Animation.ActiveState == LS_CROUCH_IDLE || + laraItem->Animation.ActiveState == LS_CROUCH_TURN_LEFT || + laraItem->Animation.ActiveState == LS_CROUCH_TURN_RIGHT) && (laraInfo->Control.Weapon.RequestGunType == LaraWeaponType::HK || laraInfo->Control.Weapon.RequestGunType == LaraWeaponType::Crossbow || laraInfo->Control.Weapon.RequestGunType == LaraWeaponType::Shotgun || @@ -446,7 +446,7 @@ void LaraGun(ITEM_INFO* laraItem) InitialiseNewWeapon(laraItem); laraInfo->RightArm.FrameNumber = 0; laraInfo->LeftArm.FrameNumber = 0; - laraInfo->Control.HandStatus = HandStatus::DrawWeapon; + laraInfo->Control.HandStatus = HandStatus::WeaponDraw; } else { @@ -464,27 +464,27 @@ void LaraGun(ITEM_INFO* laraItem) if (TrInput & IN_DRAW || laraInfo->Control.Weapon.RequestGunType != laraInfo->Control.Weapon.GunType) { - laraInfo->Control.HandStatus = HandStatus::UndrawWeapon; + laraInfo->Control.HandStatus = HandStatus::WeaponUndraw; } else if (laraInfo->Control.Weapon.GunType != LaraWeaponType::HarpoonGun && laraInfo->Control.WaterStatus != WaterStatus::Dry && (laraInfo->Control.WaterStatus != WaterStatus::Wade || laraInfo->WaterSurfaceDist < -Weapons[(int)laraInfo->Control.Weapon.GunType].GunHeight)) { - laraInfo->Control.HandStatus = HandStatus::UndrawWeapon; + laraInfo->Control.HandStatus = HandStatus::WeaponUndraw; } } else if (TrInput & IN_FLARE && laraInfo->Control.HandStatus == HandStatus::Busy && - laraItem->ActiveState == LS_CRAWL_IDLE && - laraItem->AnimNumber == LA_CRAWL_IDLE) + laraItem->Animation.ActiveState == LS_CRAWL_IDLE && + laraItem->Animation.AnimNumber == LA_CRAWL_IDLE) { laraInfo->Control.Weapon.RequestGunType = LaraWeaponType::Flare; } switch (laraInfo->Control.HandStatus) { - case HandStatus::DrawWeapon: + case HandStatus::WeaponDraw: if (laraInfo->Control.Weapon.GunType != LaraWeaponType::Flare && laraInfo->Control.Weapon.GunType != LaraWeaponType::None) { @@ -529,7 +529,7 @@ void LaraGun(ITEM_INFO* laraItem) DrawFlare(laraItem); break; - case HandStatus::UndrawWeapon: + case HandStatus::WeaponUndraw: laraInfo->MeshPtrs[LM_HEAD] = Objects[ID_LARA_SKIN].meshIndex + LM_HEAD; switch (laraInfo->Control.Weapon.GunType) @@ -608,7 +608,7 @@ void LaraGun(ITEM_INFO* laraItem) if (laraInfo->Control.Weapon.GunType == LaraWeaponType::Flare) { if (laraInfo->Vehicle != NO_ITEM || - CheckForHoldingState((LaraState)laraItem->ActiveState)) + CheckForHoldingState((LaraState)laraItem->Animation.ActiveState)) { if (laraInfo->Flare.ControlLeft) { @@ -638,7 +638,7 @@ void LaraGun(ITEM_INFO* laraItem) { if (laraInfo->MeshPtrs[LM_LHAND] == Objects[ID_LARA_FLARE_ANIM].meshIndex + LM_LHAND) { - laraInfo->Flare.ControlLeft = (laraInfo->Vehicle != NO_ITEM || CheckForHoldingState((LaraState)laraItem->ActiveState)); + laraInfo->Flare.ControlLeft = (laraInfo->Vehicle != NO_ITEM || CheckForHoldingState((LaraState)laraItem->Animation.ActiveState)); DoFlareInHand(laraItem, laraInfo->Flare.Life); SetFlareArm(laraItem, laraInfo->LeftArm.FrameNumber); } @@ -705,8 +705,8 @@ void InitialiseNewWeapon(ITEM_INFO* laraItem) break; default: - laraInfo->RightArm.FrameBase = g_Level.Anims[laraItem->AnimNumber].framePtr; - laraInfo->LeftArm.FrameBase = g_Level.Anims[laraItem->AnimNumber].framePtr; + laraInfo->RightArm.FrameBase = g_Level.Anims[laraItem->Animation.AnimNumber].framePtr; + laraInfo->LeftArm.FrameBase = g_Level.Anims[laraItem->Animation.AnimNumber].framePtr; break; } } @@ -765,7 +765,7 @@ void HitTarget(ITEM_INFO* laraItem, ITEM_INFO* target, GAME_VECTOR* hitPos, int { case HIT_BLOOD: if (target->ObjectNumber == ID_BADDY2 && - (target->ActiveState == 8 || GetRandomControl() & 1) && + (target->Animation.ActiveState == 8 || GetRandomControl() & 1) && (laraInfo->Control.Weapon.GunType == LaraWeaponType::Pistol || laraInfo->Control.Weapon.GunType == LaraWeaponType::Shotgun || laraInfo->Control.Weapon.GunType == LaraWeaponType::Uzi)) diff --git a/TR5Main/Game/Lara/lara_flare.cpp b/TR5Main/Game/Lara/lara_flare.cpp index 1ff5f02a5..4a5eee73f 100644 --- a/TR5Main/Game/Lara/lara_flare.cpp +++ b/TR5Main/Game/Lara/lara_flare.cpp @@ -29,7 +29,7 @@ void FlareControl(short itemNumber) return; } - if (flareItem->VerticalVelocity) + if (flareItem->Animation.VerticalVelocity) { flareItem->Position.xRot += ANGLE(3.0f); flareItem->Position.zRot += ANGLE(5.0f); @@ -42,8 +42,8 @@ void FlareControl(short itemNumber) PHD_VECTOR oldPos = { flareItem->Position.xPos , flareItem->Position.yPos , flareItem->Position.zPos }; - int xVel = flareItem->Velocity * phd_sin(flareItem->Position.yRot); - int zVel = flareItem->Velocity * phd_cos(flareItem->Position.yRot); + int xVel = flareItem->Animation.Velocity * phd_sin(flareItem->Position.yRot); + int zVel = flareItem->Animation.Velocity * phd_cos(flareItem->Position.yRot); flareItem->Position.xPos += xVel; flareItem->Position.zPos += zVel; @@ -51,21 +51,21 @@ void FlareControl(short itemNumber) if (TestEnvironment(ENV_FLAG_WATER, flareItem) || TestEnvironment(ENV_FLAG_SWAMP, flareItem)) { - flareItem->VerticalVelocity += (5 - flareItem->VerticalVelocity) / 2; - flareItem->Velocity += (5 - flareItem->Velocity) / 2; + flareItem->Animation.VerticalVelocity += (5 - flareItem->Animation.VerticalVelocity) / 2; + flareItem->Animation.Velocity += (5 - flareItem->Animation.Velocity) / 2; } else - flareItem->VerticalVelocity += 6; + flareItem->Animation.VerticalVelocity += 6; - flareItem->Position.yPos += flareItem->VerticalVelocity; + flareItem->Position.yPos += flareItem->Animation.VerticalVelocity; - DoProjectileDynamics(itemNumber, oldPos.x, oldPos.y, oldPos.z, xVel, flareItem->VerticalVelocity, zVel); + DoProjectileDynamics(itemNumber, oldPos.x, oldPos.y, oldPos.z, xVel, flareItem->Animation.VerticalVelocity, zVel); int& life = flareItem->Data; life &= 0x7FFF; if (life >= FLARE_LIFE_MAX) { - if (!flareItem->VerticalVelocity && !flareItem->Velocity) + if (!flareItem->Animation.VerticalVelocity && !flareItem->Animation.Velocity) { KillItem(itemNumber); return; @@ -117,22 +117,22 @@ void UndrawFlare(ITEM_INFO* laraItem) lara->Flare.ControlLeft = true; - if (laraItem->TargetState == LS_IDLE && + if (laraItem->Animation.TargetState == LS_IDLE && lara->Vehicle == NO_ITEM) { - if (laraItem->AnimNumber == LA_STAND_IDLE) + if (laraItem->Animation.AnimNumber == LA_STAND_IDLE) { - laraItem->AnimNumber = LA_DISCARD_FLARE; - flareFrame = armFrame + g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->FrameNumber = flareFrame; + laraItem->Animation.AnimNumber = LA_DISCARD_FLARE; + flareFrame = armFrame + g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.FrameNumber = flareFrame; lara->Flare.Frame = flareFrame; } - if (laraItem->AnimNumber == LA_DISCARD_FLARE) + if (laraItem->Animation.AnimNumber == LA_DISCARD_FLARE) { lara->Flare.ControlLeft = false; - if (flareFrame >= g_Level.Anims[laraItem->AnimNumber].frameBase + 31) // Last frame. + if (flareFrame >= g_Level.Anims[laraItem->Animation.AnimNumber].frameBase + 31) // Last frame. { lara->Control.Weapon.RequestGunType = lara->Control.Weapon.LastGunType; lara->Control.Weapon.GunType = lara->Control.Weapon.LastGunType; @@ -144,14 +144,14 @@ void UndrawFlare(ITEM_INFO* laraItem) lara->RightArm.Locked = false; lara->LeftArm.Locked = false; SetAnimation(laraItem, LA_STAND_IDLE); - lara->Flare.Frame = g_Level.Anims[laraItem->AnimNumber].frameBase; + lara->Flare.Frame = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; return; } lara->Flare.Frame++; } } - else if (laraItem->AnimNumber == LA_DISCARD_FLARE) + else if (laraItem->Animation.AnimNumber == LA_DISCARD_FLARE) SetAnimation(laraItem, LA_STAND_IDLE); if (armFrame >= 33 && armFrame < 72) @@ -222,8 +222,8 @@ void DrawFlare(ITEM_INFO* laraItem) { auto* lara = GetLaraInfo(laraItem); - if (laraItem->ActiveState == LS_PICKUP_FLARE || - laraItem->ActiveState == LS_PICKUP) + if (laraItem->Animation.ActiveState == LS_PICKUP_FLARE || + laraItem->Animation.ActiveState == LS_PICKUP) { DoFlareInHand(laraItem, lara->Flare.Life); lara->Flare.ControlLeft = false; @@ -330,17 +330,17 @@ void CreateFlare(ITEM_INFO* laraItem, GAME_OBJECT_ID objectNumber, bool thrown) if (thrown) { - flareItem->Velocity = laraItem->Velocity + 50; - flareItem->VerticalVelocity = laraItem->VerticalVelocity - 50; + flareItem->Animation.Velocity = laraItem->Animation.Velocity + 50; + flareItem->Animation.VerticalVelocity = laraItem->Animation.VerticalVelocity - 50; } else { - flareItem->Velocity = laraItem->Velocity + 10; - flareItem->VerticalVelocity = laraItem->VerticalVelocity + 50; + flareItem->Animation.Velocity = laraItem->Animation.Velocity + 10; + flareItem->Animation.VerticalVelocity = laraItem->Animation.VerticalVelocity + 50; } if (flag) - flareItem->Velocity /= 2; + flareItem->Animation.Velocity /= 2; if (objectNumber == ID_FLARE_ITEM) { @@ -379,7 +379,7 @@ void DoFlareInHand(ITEM_INFO* laraItem, int flareLife) if (lara->Flare.Life >= FLARE_LIFE_MAX) { if (lara->Control.HandStatus == HandStatus::Free) - lara->Control.HandStatus = HandStatus::UndrawWeapon; + lara->Control.HandStatus = HandStatus::WeaponUndraw; } else if (lara->Flare.Life != 0) lara->Flare.Life++; diff --git a/TR5Main/Game/Lara/lara_hang.cpp b/TR5Main/Game/Lara/lara_hang.cpp index f5697f853..44319a2a1 100644 --- a/TR5Main/Game/Lara/lara_hang.cpp +++ b/TR5Main/Game/Lara/lara_hang.cpp @@ -25,7 +25,7 @@ void lara_as_hang(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; return; } @@ -34,7 +34,7 @@ void lara_as_hang(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.EnableObjectPush = false; coll->Setup.EnableSpasm = false; - coll->Setup.Mode = CollProbeMode::FreeFlat; + coll->Setup.Mode = CollisionProbeMode::FreeFlat; Camera.targetAngle = 0; Camera.targetElevation = -ANGLE(45.0f); @@ -47,28 +47,28 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll) /*state 10*/ /*state code: lara_as_hang*/ - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; - if (item->AnimNumber == LA_REACH_TO_HANG || - item->AnimNumber == LA_HANG_IDLE) + if (item->Animation.AnimNumber == LA_REACH_TO_HANG || + item->Animation.AnimNumber == LA_HANG_IDLE) { if (TrInput & IN_LEFT || TrInput & IN_LSTEP) { if (TestLaraHangSideways(item, coll, -ANGLE(90.0f))) { - item->TargetState = LS_SHIMMY_LEFT; + item->Animation.TargetState = LS_SHIMMY_LEFT; return; } switch (TestLaraHangCorner(item, coll, -90.0f)) { case CornerResult::Inner: - item->TargetState = LS_SHIMMY_INNER_LEFT; + item->Animation.TargetState = LS_SHIMMY_INNER_LEFT; return; case CornerResult::Outer: - item->TargetState = LS_SHIMMY_OUTER_LEFT; + item->Animation.TargetState = LS_SHIMMY_OUTER_LEFT; return; default: @@ -78,11 +78,11 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll) switch (TestLaraHangCorner(item, coll, -45.0f)) { case CornerResult::Inner: - item->TargetState = LS_SHIMMY_45_INNER_LEFT; + item->Animation.TargetState = LS_SHIMMY_45_INNER_LEFT; return; case CornerResult::Outer: - item->TargetState = LS_SHIMMY_45_OUTER_LEFT; + item->Animation.TargetState = LS_SHIMMY_45_OUTER_LEFT; return; default: @@ -94,18 +94,18 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraHangSideways(item, coll, ANGLE(90.0f))) { - item->TargetState = LS_SHIMMY_RIGHT; + item->Animation.TargetState = LS_SHIMMY_RIGHT; return; } switch (TestLaraHangCorner(item, coll, 90.0f)) { case CornerResult::Inner: - item->TargetState = LS_SHIMMY_INNER_RIGHT; + item->Animation.TargetState = LS_SHIMMY_INNER_RIGHT; return; case CornerResult::Outer: - item->TargetState = LS_SHIMMY_OUTER_RIGHT; + item->Animation.TargetState = LS_SHIMMY_OUTER_RIGHT; return; default: @@ -115,11 +115,11 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll) switch (TestLaraHangCorner(item, coll, 45.0f)) { case CornerResult::Inner: - item->TargetState = LS_SHIMMY_45_INNER_RIGHT; + item->Animation.TargetState = LS_SHIMMY_45_INNER_RIGHT; return; case CornerResult::Outer: - item->TargetState = LS_SHIMMY_45_OUTER_RIGHT; + item->Animation.TargetState = LS_SHIMMY_45_OUTER_RIGHT; return; default: @@ -132,8 +132,8 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll) TestLaraHang(item, coll); - if (item->AnimNumber == LA_REACH_TO_HANG || - item->AnimNumber == LA_HANG_IDLE) + if (item->Animation.AnimNumber == LA_REACH_TO_HANG || + item->Animation.AnimNumber == LA_HANG_IDLE) { TestForObjectOnLedge(item, coll); @@ -148,14 +148,14 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll) coll->FrontRight.Floor >= coll->FrontRight.Ceiling) { if (TrInput & IN_WALK) - item->TargetState = LS_HANDSTAND; + item->Animation.TargetState = LS_HANDSTAND; else if (TrInput & IN_CROUCH) { - item->TargetState = LS_HANG_TO_CRAWL; - item->RequiredState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_HANG_TO_CRAWL; + item->Animation.RequiredState = LS_CROUCH_IDLE; } else - item->TargetState = LS_GRABBING; + item->Animation.TargetState = LS_GRABBING; return; } @@ -165,8 +165,8 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll) coll->FrontLeft.Floor - coll->FrontLeft.Ceiling >= -CLICK(1) && coll->FrontRight.Floor - coll->FrontRight.Ceiling >= -CLICK(1)) { - item->TargetState = LS_HANG_TO_CRAWL; - item->RequiredState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_HANG_TO_CRAWL; + item->Animation.RequiredState = LS_CROUCH_IDLE; return; } } @@ -176,7 +176,7 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll) abs(coll->FrontLeft.Ceiling - coll->FrontRight.Ceiling) < SLOPE_DIFFERENCE) { if (TestLaraClimbStance(item, coll)) - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; else if (TestLastFrame(item)) SetAnimation(item, LA_LADDER_SHIMMY_UP); } @@ -187,11 +187,11 @@ void lara_col_hang(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_BACK && lara->Control.CanClimbLadder && coll->Middle.Floor > (CLICK(1.5f) - 40) && - (item->AnimNumber == LA_REACH_TO_HANG || - item->AnimNumber == LA_HANG_IDLE)) + (item->Animation.AnimNumber == LA_REACH_TO_HANG || + item->Animation.AnimNumber == LA_HANG_IDLE)) { if (TestLaraClimbStance(item, coll)) - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; else if (TestLastFrame(item)) SetAnimation(item, LA_LADDER_SHIMMY_DOWN); } @@ -204,12 +204,12 @@ void lara_as_shimmy_left(ITEM_INFO* item, COLL_INFO* coll) /*collision: lara_col_hangleft*/ coll->Setup.EnableObjectPush = false; coll->Setup.EnableSpasm = false; - coll->Setup.Mode = CollProbeMode::FreeFlat; + coll->Setup.Mode = CollisionProbeMode::FreeFlat; Camera.targetAngle = 0; Camera.targetElevation = -ANGLE(45.0f); if (!(TrInput & (IN_LEFT | IN_LSTEP))) - item->TargetState = LS_HANG; + item->Animation.TargetState = LS_HANG; } void lara_col_shimmy_left(ITEM_INFO* item, COLL_INFO* coll) @@ -231,12 +231,12 @@ void lara_as_shimmy_right(ITEM_INFO* item, COLL_INFO* coll) /*collision: lara_col_hangright*/ coll->Setup.EnableObjectPush = false; coll->Setup.EnableSpasm = false; - coll->Setup.Mode = CollProbeMode::FreeFlat; + coll->Setup.Mode = CollisionProbeMode::FreeFlat; Camera.targetAngle = 0; Camera.targetElevation = -ANGLE(45.0f); if (!(TrInput & (IN_RIGHT | IN_RSTEP))) - item->TargetState = LS_HANG; + item->Animation.TargetState = LS_HANG; } void lara_col_shimmy_right(ITEM_INFO* item, COLL_INFO* coll) diff --git a/TR5Main/Game/Lara/lara_helpers.cpp b/TR5Main/Game/Lara/lara_helpers.cpp index dcc63816c..1646b5fd8 100644 --- a/TR5Main/Game/Lara/lara_helpers.cpp +++ b/TR5Main/Game/Lara/lara_helpers.cpp @@ -42,11 +42,11 @@ void HandleLaraMovementParameters(ITEM_INFO* item, COLL_INFO* coll) lara->Control.Count.Pose = 0; // Reset running jump timer. - if (!IsRunJumpCountableState((LaraState)item->ActiveState)) + if (!IsRunJumpCountableState((LaraState)item->Animation.ActiveState)) lara->Control.Count.RunJump = 0; // Reset running jump action queue. - if (!IsRunJumpQueueableState((LaraState)item->ActiveState)) + if (!IsRunJumpQueueableState((LaraState)item->Animation.ActiveState)) lara->Control.RunJumpQueued = false; // Reset lean. @@ -55,7 +55,7 @@ void HandleLaraMovementParameters(ITEM_INFO* item, COLL_INFO* coll) // Reset crawl flex. if (!(TrInput & IN_LOOK) && coll->Setup.Height > LARA_HEIGHT - LARA_HEADROOM && // HACK - (!item->Velocity || (item->Velocity && !(TrInput & (IN_LEFT | IN_RIGHT))))) + (!item->Animation.Velocity || (item->Animation.Velocity && !(TrInput & (IN_LEFT | IN_RIGHT))))) { ResetLaraFlex(item, 12); } @@ -149,7 +149,7 @@ void EaseOutLaraHeight(ITEM_INFO* item, int height) // Translate Lara to new height. // TODO: This approach may cause undesirable artefacts where an object pushes Lara rapidly up/down a slope or a platform rapidly ascends/descends. static constexpr int rate = 50; - int threshold = std::max(abs(item->Velocity) * 1.5f, CLICK(0.25f) / 4); + int threshold = std::max(abs(item->Animation.Velocity) * 1.5f, CLICK(0.25f) / 4); int sign = std::copysign(1, height); if (TestEnvironment(ENV_FLAG_SWAMP, item) && height > 0) @@ -168,7 +168,7 @@ void EaseOutLaraHeight(ITEM_INFO* item, int height) // TODO: Make lean rate proportional to the turn rate, allowing for nicer aesthetics with future analog stick input. void DoLaraLean(ITEM_INFO* item, COLL_INFO* coll, short maxAngle, short rate) { - if (!item->Velocity) + if (!item->Animation.Velocity) return; rate = abs(rate); @@ -188,8 +188,8 @@ void DoLaraStep(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraStepUp(item, coll)) { - item->TargetState = LS_STEP_UP; - if (GetChange(item, &g_Level.Anims[item->AnimNumber])) + item->Animation.TargetState = LS_STEP_UP; + if (GetChange(item, &g_Level.Anims[item->Animation.AnimNumber])) { item->Position.yPos += coll->Middle.Floor; return; @@ -197,8 +197,8 @@ void DoLaraStep(ITEM_INFO* item, COLL_INFO* coll) } else if (TestLaraStepDown(item, coll)) { - item->TargetState = LS_STEP_DOWN; - if (GetChange(item, &g_Level.Anims[item->AnimNumber])) + item->Animation.TargetState = LS_STEP_DOWN; + if (GetChange(item, &g_Level.Anims[item->Animation.AnimNumber])) { item->Position.yPos += coll->Middle.Floor; return; @@ -229,7 +229,7 @@ void DoLaraCrawlFlex(ITEM_INFO* item, COLL_INFO* coll, short maxAngle, short rat { auto* lara = GetLaraInfo(item); - if (!item->Velocity) + if (!item->Animation.Velocity) return; int sign = copysign(1, maxAngle); @@ -238,7 +238,7 @@ void DoLaraCrawlFlex(ITEM_INFO* item, COLL_INFO* coll, short maxAngle, short rat lara->ExtraTorsoRot.zRot += std::min(abs(rate), abs(maxAngle - lara->ExtraTorsoRot.zRot) / 6) * sign; if (!(TrInput & IN_LOOK) && - item->ActiveState != LS_CRAWL_BACK) + item->Animation.ActiveState != LS_CRAWL_BACK) { lara->ExtraHeadRot.zRot = lara->ExtraTorsoRot.zRot / 2; lara->ExtraHeadRot.yRot = lara->ExtraHeadRot.zRot; @@ -308,13 +308,13 @@ void DoLaraTightropeBalanceRegen(ITEM_INFO* item) void DoLaraFallDamage(ITEM_INFO* item) { - if (item->VerticalVelocity >= LARA_DAMAGE_VELOCITY) + if (item->Animation.VerticalVelocity >= LARA_DAMAGE_VELOCITY) { - if (item->VerticalVelocity >= LARA_DEATH_VELOCITY) + if (item->Animation.VerticalVelocity >= LARA_DEATH_VELOCITY) item->HitPoints = 0; else [[likely]] { - int base = item->VerticalVelocity - (LARA_DAMAGE_VELOCITY - 1); + int base = item->Animation.VerticalVelocity - (LARA_DAMAGE_VELOCITY - 1); item->HitPoints -= LARA_HEALTH_MAX * (pow(base, 2) / 196); } } @@ -424,7 +424,7 @@ void SetLaraRunJumpQueue(ITEM_INFO* item, COLL_INFO* coll) (probe.Position.Floor - y) >= CLICK(0.5f)) && // OR there is a drop below far ahead. probe.Position.Floor != NO_HEIGHT) { - lara->Control.RunJumpQueued = IsRunJumpQueueableState((LaraState)item->TargetState); + lara->Control.RunJumpQueued = IsRunJumpQueueableState((LaraState)item->Animation.TargetState); } else lara->Control.RunJumpQueued = false; @@ -450,8 +450,8 @@ void SetLaraVault(ITEM_INFO* item, COLL_INFO* coll, VaultTestResult vaultResult) void SetLaraLand(ITEM_INFO* item, COLL_INFO* coll) { - item->Velocity = 0; - item->VerticalVelocity = 0; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; //item->Airborne = false; // TODO: Removing this avoids an unusual landing bug Core had worked around in an obscure way. I hope to find a proper solution. @Sezz 2022.02.18 LaraSnapToHeight(item, coll); @@ -460,21 +460,21 @@ void SetLaraLand(ITEM_INFO* item, COLL_INFO* coll) void SetLaraFallAnimation(ITEM_INFO* item) { SetAnimation(item, LA_FALL_START); - item->VerticalVelocity = 0; - item->Airborne = true; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = true; } void SetLaraFallBackAnimation(ITEM_INFO* item) { SetAnimation(item, LA_FALL_BACK); - item->VerticalVelocity = 0; - item->Airborne = true; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = true; } void SetLaraMonkeyFallAnimation(ITEM_INFO* item) { // HACK: Disallow release during 180 turn action. - if (item->ActiveState == LS_MONKEY_TURN_180) + if (item->Animation.ActiveState == LS_MONKEY_TURN_180) return; SetAnimation(item, LA_MONKEY_TO_FREEFALL); @@ -485,9 +485,9 @@ void SetLaraMonkeyRelease(ITEM_INFO* item) { auto* lara = GetLaraInfo(item); - item->Velocity = 2; - item->VerticalVelocity = 1; - item->Airborne = true; + item->Animation.Velocity = 2; + item->Animation.VerticalVelocity = 1; + item->Animation.Airborne = true; lara->Control.HandStatus = HandStatus::Free; } @@ -501,7 +501,7 @@ void SetLaraSlideAnimation(ITEM_INFO* item, COLL_INFO* coll) // Slide forward. if (deltaAngle <= ANGLE(90.0f)) { - if (item->ActiveState == LS_SLIDE_FORWARD && deltaAngle <= ANGLE(90.0f)) + if (item->Animation.ActiveState == LS_SLIDE_FORWARD && deltaAngle <= ANGLE(90.0f)) return; SetAnimation(item, LA_SLIDE_FORWARD); @@ -509,7 +509,7 @@ void SetLaraSlideAnimation(ITEM_INFO* item, COLL_INFO* coll) // Slide back. else { - if (item->ActiveState == LS_SLIDE_BACK && deltaAngle > ANGLE(90.0f)) + if (item->Animation.ActiveState == LS_SLIDE_BACK && deltaAngle > ANGLE(90.0f)) return; SetAnimation(item, LA_SLIDE_BACK_START); @@ -525,9 +525,9 @@ void SetLaraCornerAnimation(ITEM_INFO* item, COLL_INFO* coll, bool flip) SetAnimation(item, LA_FALL_START); item->Position.yPos += CLICK(1); item->Position.yRot += lara->NextCornerPos.yRot / 2; - item->Velocity = 2; - item->VerticalVelocity = 1; - item->Airborne = true; + item->Animation.Velocity = 2; + item->Animation.VerticalVelocity = 1; + item->Animation.Airborne = true; lara->Control.HandStatus = HandStatus::Free; return; } diff --git a/TR5Main/Game/Lara/lara_initialise.cpp b/TR5Main/Game/Lara/lara_initialise.cpp index 360e20ff2..122e7f5ff 100644 --- a/TR5Main/Game/Lara/lara_initialise.cpp +++ b/TR5Main/Game/Lara/lara_initialise.cpp @@ -142,7 +142,7 @@ void InitialiseLaraAnims(ITEM_INFO* item) if (TestEnvironment(ENV_FLAG_WATER, item)) { lara->Control.WaterStatus = WaterStatus::Underwater; - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; SetAnimation(item, LA_UNDERWATER_IDLE); } else diff --git a/TR5Main/Game/Lara/lara_jump.cpp b/TR5Main/Game/Lara/lara_jump.cpp index 2412f5fc4..43c11e067 100644 --- a/TR5Main/Game/Lara/lara_jump.cpp +++ b/TR5Main/Game/Lara/lara_jump.cpp @@ -44,7 +44,7 @@ void lara_as_jump_forward(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraLand(item, coll)) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraLand(item, coll); } @@ -69,16 +69,16 @@ void lara_as_jump_forward(ITEM_INFO* item, COLL_INFO* coll) DoLaraFallDamage(item); if (item->HitPoints <= 0) [[unlikely]] - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; else if (TestLaraSlide(item, coll)) SetLaraSlideAnimation(item, coll); else if (TrInput & IN_FORWARD && !(TrInput & IN_WALK) && lara->Control.WaterStatus != WaterStatus::Wade) { - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; } else - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; SetLaraLand(item, coll); return; @@ -87,30 +87,30 @@ void lara_as_jump_forward(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free) { - item->TargetState = LS_REACH; + item->Animation.TargetState = LS_REACH; return; } if (TrInput & (IN_ROLL | IN_BACK)) { - item->TargetState = LS_JUMP_ROLL_180; + item->Animation.TargetState = LS_JUMP_ROLL_180; return; } if (TrInput & IN_WALK && lara->Control.HandStatus == HandStatus::Free) { - item->TargetState = LS_SWAN_DIVE; + item->Animation.TargetState = LS_SWAN_DIVE; return; } - if (item->VerticalVelocity >= LARA_FREEFALL_VELOCITY) + if (item->Animation.VerticalVelocity >= LARA_FREEFALL_VELOCITY) { - item->TargetState = LS_FREEFALL; + item->Animation.TargetState = LS_FREEFALL; return; } - item->TargetState = LS_JUMP_FORWARD; + item->Animation.TargetState = LS_JUMP_FORWARD; } // State: LS_JUMP_FORWARD (3) @@ -119,7 +119,7 @@ void lara_col_jump_forward(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - lara->Control.MoveAngle = (item->Velocity > 0) ? item->Position.yRot : item->Position.yRot + ANGLE(180.0f); + lara->Control.MoveAngle = (item->Animation.Velocity > 0) ? item->Position.yRot : item->Position.yRot + ANGLE(180.0f); coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; coll->Setup.LowerCeilingBound = BAD_JUMP_CEILING; @@ -129,16 +129,16 @@ void lara_col_jump_forward(ITEM_INFO* item, COLL_INFO* coll) LaraDeflectEdgeJump(item, coll); // TODO: Why?? - lara->Control.MoveAngle = (item->Velocity < 0) ? item->Position.yRot : lara->Control.MoveAngle; + lara->Control.MoveAngle = (item->Animation.Velocity < 0) ? item->Position.yRot : lara->Control.MoveAngle; } // State: LS_FREEFALL (9) // Collision: lara_col_freefall() void lara_as_freefall(ITEM_INFO* item, COLL_INFO* coll) { - item->Velocity = item->Velocity * 0.95f; + item->Animation.Velocity = item->Animation.Velocity * 0.95f; - if (item->VerticalVelocity == LARA_DEATH_VELOCITY && + if (item->Animation.VerticalVelocity == LARA_DEATH_VELOCITY && item->HitPoints > 0) { SoundEffect(SFX_TR4_LARA_FALL, &item->Position, 0); @@ -149,18 +149,18 @@ void lara_as_freefall(ITEM_INFO* item, COLL_INFO* coll) DoLaraFallDamage(item); if (item->HitPoints <= 0) - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; else if (TestLaraSlide(item, coll)) SetLaraSlideAnimation(item, coll); else [[likely]] - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; SetLaraLand(item, coll); StopSoundEffect(SFX_TR4_LARA_FALL); return; } - item->TargetState = LS_FREEFALL; + item->Animation.TargetState = LS_FREEFALL; } // State: LS_FREEFALL (9) @@ -169,7 +169,7 @@ void lara_col_freefall(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->Airborne = true; + item->Animation.Airborne = true; coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; coll->Setup.LowerCeilingBound = BAD_JUMP_CEILING; @@ -191,7 +191,7 @@ void lara_as_reach(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraLand(item, coll)) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraLand(item, coll); } @@ -216,23 +216,23 @@ void lara_as_reach(ITEM_INFO* item, COLL_INFO* coll) DoLaraFallDamage(item); if (item->HitPoints <= 0) - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; else if (TestLaraSlide(item, coll)) SetLaraSlideAnimation(item, coll); else [[likely]] - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; SetLaraLand(item, coll); return; } - if (item->VerticalVelocity >= LARA_FREEFALL_VELOCITY) + if (item->Animation.VerticalVelocity >= LARA_FREEFALL_VELOCITY) { - item->TargetState = LS_FREEFALL; + item->Animation.TargetState = LS_FREEFALL; return; } - item->TargetState = LS_REACH; + item->Animation.TargetState = LS_REACH; // TODO: overhang //SlopeReachExtra(item, coll); } @@ -244,7 +244,7 @@ void lara_col_reach(ITEM_INFO* item, COLL_INFO* coll) auto* lara = GetLaraInfo(item); if (lara->Control.Rope.Ptr == -1) - item->Airborne = true; + item->Animation.Airborne = true; lara->Control.MoveAngle = item->Position.yRot; @@ -252,13 +252,13 @@ void lara_col_reach(ITEM_INFO* item, COLL_INFO* coll) // 6-click high ceiling running jumps. While TEN model is physically correct, original engines // allowed certain margin of deflection due to bug caused by hacky inclusion of headroom in coll checks. - coll->Setup.Height = item->VerticalVelocity > 0 ? LARA_HEIGHT_REACH : LARA_HEIGHT; + coll->Setup.Height = item->Animation.VerticalVelocity > 0 ? LARA_HEIGHT_REACH : LARA_HEIGHT; coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = 0; coll->Setup.LowerCeilingBound = BAD_JUMP_CEILING; coll->Setup.ForwardAngle = lara->Control.MoveAngle; coll->Setup.Radius = coll->Setup.Radius * 1.2f; - coll->Setup.Mode = CollProbeMode::FreeForward; + coll->Setup.Mode = CollisionProbeMode::FreeForward; GetCollisionInfo(coll, item); if (TestLaraHangJump(item, coll)) @@ -278,7 +278,7 @@ void lara_as_jump_prepare(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; return; } @@ -306,7 +306,7 @@ void lara_as_jump_prepare(ITEM_INFO* item, COLL_INFO* coll) !(TrInput & IN_DIRECTION) && lara->Control.JumpDirection == JumpDirection::Forward) && TestLaraJumpForward(item, coll)) { - item->TargetState = LS_JUMP_FORWARD; + item->Animation.TargetState = LS_JUMP_FORWARD; lara->Control.JumpDirection = JumpDirection::Forward; return; } @@ -314,7 +314,7 @@ void lara_as_jump_prepare(ITEM_INFO* item, COLL_INFO* coll) !(TrInput & IN_DIRECTION) && lara->Control.JumpDirection == JumpDirection::Back) && TestLaraJumpBack(item, coll)) { - item->TargetState = LS_JUMP_BACK; + item->Animation.TargetState = LS_JUMP_BACK; lara->Control.JumpDirection = JumpDirection::Back; return; } @@ -323,7 +323,7 @@ void lara_as_jump_prepare(ITEM_INFO* item, COLL_INFO* coll) !(TrInput & IN_DIRECTION) && lara->Control.JumpDirection == JumpDirection::Left) && TestLaraJumpLeft(item, coll)) { - item->TargetState = LS_JUMP_LEFT; + item->Animation.TargetState = LS_JUMP_LEFT; lara->Control.JumpDirection = JumpDirection::Left; return; } @@ -331,7 +331,7 @@ void lara_as_jump_prepare(ITEM_INFO* item, COLL_INFO* coll) !(TrInput & IN_DIRECTION) && lara->Control.JumpDirection == JumpDirection::Right) && TestLaraJumpRight(item, coll)) { - item->TargetState = LS_JUMP_RIGHT; + item->Animation.TargetState = LS_JUMP_RIGHT; lara->Control.JumpDirection = JumpDirection::Right; return; } @@ -339,12 +339,12 @@ void lara_as_jump_prepare(ITEM_INFO* item, COLL_INFO* coll) // No directional key pressed AND no directional lock; commit to jump up. if (TestLaraJumpUp(item, coll)) { - item->TargetState = LS_JUMP_UP; + item->Animation.TargetState = LS_JUMP_UP; lara->Control.JumpDirection = JumpDirection::Up; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; lara->Control.JumpDirection = JumpDirection::None; } @@ -424,7 +424,7 @@ void lara_as_jump_back(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraLand(item, coll)) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraLand(item, coll); } @@ -449,11 +449,11 @@ void lara_as_jump_back(ITEM_INFO* item, COLL_INFO* coll) DoLaraFallDamage(item); if (item->HitPoints <= 0) - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; else if (TestLaraSlide(item, coll)) SetLaraSlideAnimation(item, coll); else [[likely]] - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; SetLaraLand(item, coll); return; @@ -461,17 +461,17 @@ void lara_as_jump_back(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & (IN_ROLL | IN_FORWARD)) { - item->TargetState = LS_JUMP_ROLL_180; + item->Animation.TargetState = LS_JUMP_ROLL_180; return; } - if (item->VerticalVelocity >= LARA_FREEFALL_VELOCITY) + if (item->Animation.VerticalVelocity >= LARA_FREEFALL_VELOCITY) { - item->TargetState = LS_FREEFALL; + item->Animation.TargetState = LS_FREEFALL; return; } - item->TargetState = LS_JUMP_BACK; + item->Animation.TargetState = LS_JUMP_BACK; } // State: LS_JUMP_BACK (25) @@ -493,7 +493,7 @@ void lara_as_jump_right(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraLand(item, coll)) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraLand(item, coll); } @@ -505,11 +505,11 @@ void lara_as_jump_right(ITEM_INFO* item, COLL_INFO* coll) DoLaraFallDamage(item); if (item->HitPoints <= 0) - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; else if (TestLaraSlide(item, coll)) SetLaraSlideAnimation(item, coll); else [[likely]] - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; SetLaraLand(item, coll); return; @@ -522,13 +522,13 @@ void lara_as_jump_right(ITEM_INFO* item, COLL_INFO* coll) return; }*/ - if (item->VerticalVelocity >= LARA_FREEFALL_VELOCITY) + if (item->Animation.VerticalVelocity >= LARA_FREEFALL_VELOCITY) { - item->TargetState = LS_FREEFALL; + item->Animation.TargetState = LS_FREEFALL; return; } - item->TargetState = LS_JUMP_RIGHT; + item->Animation.TargetState = LS_JUMP_RIGHT; } // State: LS_JUMP_RIGHT (26) @@ -550,7 +550,7 @@ void lara_as_jump_left(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraLand(item, coll)) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraLand(item, coll); } @@ -562,11 +562,11 @@ void lara_as_jump_left(ITEM_INFO* item, COLL_INFO* coll) DoLaraFallDamage(item); if (item->HitPoints <= 0) - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; else if (TestLaraSlide(item, coll)) SetLaraSlideAnimation(item, coll); else [[likely]] - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; SetLaraLand(item, coll); return; @@ -579,13 +579,13 @@ void lara_as_jump_left(ITEM_INFO* item, COLL_INFO* coll) return; }*/ - if (item->VerticalVelocity >= LARA_FREEFALL_VELOCITY) + if (item->Animation.VerticalVelocity >= LARA_FREEFALL_VELOCITY) { - item->TargetState = LS_FREEFALL; + item->Animation.TargetState = LS_FREEFALL; return; } - item->TargetState = LS_JUMP_LEFT; + item->Animation.TargetState = LS_JUMP_LEFT; } // State: LS_JUMP_LEFT (27) @@ -607,7 +607,7 @@ void lara_as_jump_up(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraLand(item, coll)) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraLand(item, coll); } @@ -617,11 +617,11 @@ void lara_as_jump_up(ITEM_INFO* item, COLL_INFO* coll) if (TestLaraLand(item, coll)) { if (item->HitPoints <= 0) - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; else if (TestLaraSlide(item, coll)) SetLaraSlideAnimation(item, coll); else [[likely]] - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; SetLaraLand(item, coll); return; @@ -629,33 +629,33 @@ void lara_as_jump_up(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_FORWARD) { - item->Velocity += 2; - if (item->Velocity > 5) - item->Velocity = 5; + item->Animation.Velocity += 2; + if (item->Animation.Velocity > 5) + item->Animation.Velocity = 5; } else if (TrInput & IN_BACK) { - item->Velocity -= 2; - if (item->Velocity < -5) - item->Velocity = -5; + item->Animation.Velocity -= 2; + if (item->Animation.Velocity < -5) + item->Animation.Velocity = -5; } else - item->Velocity = (item->Velocity < 0) ? -2 : 2; + item->Animation.Velocity = (item->Animation.Velocity < 0) ? -2 : 2; - if (item->Velocity < 0) + if (item->Animation.Velocity < 0) { // TODO: Holding BACK + LEFT/RIGHT results in Lara flexing more. - item->Position.xRot += std::min(LARA_LEAN_RATE / 3, abs(ANGLE(item->Velocity) - item->Position.xRot) / 3); + item->Position.xRot += std::min(LARA_LEAN_RATE / 3, abs(ANGLE(item->Animation.Velocity) - item->Position.xRot) / 3); lara->ExtraHeadRot.yRot += (ANGLE(10.0f) - item->Position.zRot) / 3; } - if (item->VerticalVelocity >= LARA_FREEFALL_VELOCITY) + if (item->Animation.VerticalVelocity >= LARA_FREEFALL_VELOCITY) { - item->TargetState = LS_FREEFALL; + item->Animation.TargetState = LS_FREEFALL; return; } - item->TargetState = LS_JUMP_UP; + item->Animation.TargetState = LS_JUMP_UP; } // State: LS_JUMP_UP (28) @@ -669,8 +669,8 @@ void lara_col_jump_up(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; coll->Setup.LowerCeilingBound = BAD_JUMP_CEILING; - coll->Setup.ForwardAngle = (item->Velocity >= 0) ? lara->Control.MoveAngle : lara->Control.MoveAngle + ANGLE(180.0f); - coll->Setup.Mode = CollProbeMode::FreeForward; + coll->Setup.ForwardAngle = (item->Animation.Velocity >= 0) ? lara->Control.MoveAngle : lara->Control.MoveAngle + ANGLE(180.0f); + coll->Setup.Mode = CollisionProbeMode::FreeForward; GetCollisionInfo(coll, item); if (TestLaraHangJumpUp(item, coll)) @@ -681,7 +681,7 @@ void lara_col_jump_up(ITEM_INFO* item, COLL_INFO* coll) coll->CollisionType == CT_TOP_FRONT || coll->CollisionType == CT_CLAMP) { - item->VerticalVelocity = 1; + item->Animation.VerticalVelocity = 1; } ShiftItem(item, coll); @@ -697,7 +697,7 @@ void lara_as_fall_back(ITEM_INFO* item, COLL_INFO* coll) { if (TestLaraLand(item, coll)) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraLand(item, coll); } @@ -722,11 +722,11 @@ void lara_as_fall_back(ITEM_INFO* item, COLL_INFO* coll) DoLaraFallDamage(item); if (item->HitPoints <= 0) - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; else if (TestLaraSlide(item, coll)) SetLaraSlideAnimation(item, coll); else [[likely]] - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; SetLaraLand(item, coll); return; @@ -735,17 +735,17 @@ void lara_as_fall_back(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION && lara->Control.HandStatus == HandStatus::Free) { - item->TargetState = LS_REACH; + item->Animation.TargetState = LS_REACH; return; } - if (item->VerticalVelocity >= LARA_FREEFALL_VELOCITY) + if (item->Animation.VerticalVelocity >= LARA_FREEFALL_VELOCITY) { - item->TargetState = LS_FREEFALL; + item->Animation.TargetState = LS_FREEFALL; return; } - item->TargetState = LS_FALL_BACK; + item->Animation.TargetState = LS_FALL_BACK; } // State: LS_FALL_BACK (29) @@ -788,32 +788,32 @@ void lara_as_swan_dive(ITEM_INFO* item, COLL_INFO* coll) DoLaraFallDamage(item); if (item->HitPoints <= 0) - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; else if (TestLaraSlide(item, coll)) SetLaraSlideAnimation(item, coll); else if ((TrInput & IN_CROUCH || TestLaraCrawlspaceDive(item, coll)) && g_GameFlow->Animations.HasCrawlspaceDive) { - item->TargetState = LS_CROUCH_IDLE; + item->Animation.TargetState = LS_CROUCH_IDLE; // HACK: Move Lara forward to avoid standing up or falling out when landing on an edge. MoveItem(item, coll->Setup.ForwardAngle, CLICK(0.5f)); } else [[likely]] - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; SetLaraLand(item, coll); lara->Control.HandStatus = HandStatus::Free; return; } - if (item->VerticalVelocity >= LARA_FREEFALL_VELOCITY) + if (item->Animation.VerticalVelocity >= LARA_FREEFALL_VELOCITY) { - item->TargetState = LS_FREEFALL_DIVE; + item->Animation.TargetState = LS_FREEFALL_DIVE; return; } - item->TargetState = LS_SWAN_DIVE; + item->Animation.TargetState = LS_SWAN_DIVE; } // State: LS_SWAN_DIVE (52) @@ -847,21 +847,21 @@ void lara_col_swan_dive(ITEM_INFO* item, COLL_INFO* coll) // Collision: lara_col_freefall_dive() void lara_as_freefall_dive(ITEM_INFO* item, COLL_INFO* coll) { - item->Velocity = item->Velocity * 0.95f; + item->Animation.Velocity = item->Animation.Velocity * 0.95f; coll->Setup.EnableObjectPush = true; coll->Setup.EnableSpasm = false; if (TestLaraLand(item, coll)) { - if (item->VerticalVelocity >= LARA_DIVE_DEATH_VELOCITY || + if (item->Animation.VerticalVelocity >= LARA_DIVE_DEATH_VELOCITY || item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; } else if (TestLaraSlide(item, coll)) SetLaraSlideAnimation(item, coll); else [[likely]] - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; SetLaraLand(item, coll); return; @@ -869,11 +869,11 @@ void lara_as_freefall_dive(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ROLL) { - item->TargetState = LS_JUMP_ROLL_180; + item->Animation.TargetState = LS_JUMP_ROLL_180; return; } - item->TargetState = LS_FREEFALL_DIVE; + item->Animation.TargetState = LS_FREEFALL_DIVE; } // State: LS_FREEFALL_DIVE (53) diff --git a/TR5Main/Game/Lara/lara_monkey.cpp b/TR5Main/Game/Lara/lara_monkey.cpp index 6691ecd44..923bd62f9 100644 --- a/TR5Main/Game/Lara/lara_monkey.cpp +++ b/TR5Main/Game/Lara/lara_monkey.cpp @@ -34,7 +34,7 @@ void lara_as_monkey_idle(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraMonkeyRelease(item); return; } @@ -66,48 +66,48 @@ void lara_as_monkey_idle(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_ROLL) { - item->TargetState = LS_MONKEY_TURN_180; + item->Animation.TargetState = LS_MONKEY_TURN_180; return; } if (TrInput & IN_FORWARD && TestLaraMonkeyForward(item, coll)) { - item->TargetState = LS_MONKEY_FORWARD; + item->Animation.TargetState = LS_MONKEY_FORWARD; return; } else if (TrInput & IN_BACK && TestLaraMonkeyBack(item, coll)) { - item->TargetState = LS_MONKEY_BACK; + item->Animation.TargetState = LS_MONKEY_BACK; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_MONKEY_TURN_LEFT; + item->Animation.TargetState = LS_MONKEY_TURN_LEFT; return; } else if (TrInput & IN_RIGHT) { - item->TargetState = LS_MONKEY_TURN_RIGHT; + item->Animation.TargetState = LS_MONKEY_TURN_RIGHT; return; } if (TrInput & IN_LSTEP && TestLaraMonkeyShimmyLeft(item, coll)) { - item->TargetState = LS_MONKEY_SHIMMY_LEFT; + item->Animation.TargetState = LS_MONKEY_SHIMMY_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraMonkeyShimmyRight(item, coll)) { - item->TargetState = LS_MONKEY_SHIMMY_RIGHT; + item->Animation.TargetState = LS_MONKEY_SHIMMY_RIGHT; return; } - item->TargetState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; return; } - item->TargetState = LS_JUMP_UP; + item->Animation.TargetState = LS_JUMP_UP; SetLaraMonkeyRelease(item); } @@ -118,7 +118,7 @@ void lara_col_monkey_idle(ITEM_INFO* item, COLL_INFO* coll) auto* lara = GetLaraInfo(item); lara->Control.MoveAngle = item->Position.yRot; - item->Airborne = false; + item->Animation.Airborne = false; coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = 0; coll->Setup.LowerCeilingBound = CLICK(1.25f); @@ -161,7 +161,7 @@ void lara_as_monkey_forward(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraMonkeyRelease(item); return; } @@ -190,15 +190,15 @@ void lara_as_monkey_forward(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_FORWARD) { - item->TargetState = LS_MONKEY_FORWARD; + item->Animation.TargetState = LS_MONKEY_FORWARD; return; } - item->TargetState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; return; } - item->TargetState = LS_JUMP_UP; + item->Animation.TargetState = LS_JUMP_UP; SetLaraMonkeyRelease(item); } @@ -249,7 +249,7 @@ void lara_as_monkey_back(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraMonkeyRelease(item); return; } @@ -271,15 +271,15 @@ void lara_as_monkey_back(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_BACK) { - item->TargetState = LS_MONKEY_BACK; + item->Animation.TargetState = LS_MONKEY_BACK; return; } - item->TargetState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; return; } - item->TargetState = LS_JUMP_UP; + item->Animation.TargetState = LS_JUMP_UP; SetLaraMonkeyRelease(item); } @@ -330,7 +330,7 @@ void lara_as_monkey_shimmy_left(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraMonkeyRelease(item); return; } @@ -352,15 +352,15 @@ void lara_as_monkey_shimmy_left(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_LSTEP) { - item->TargetState = LS_MONKEY_SHIMMY_LEFT; + item->Animation.TargetState = LS_MONKEY_SHIMMY_LEFT; return; } - item->TargetState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; return; } - item->TargetState = LS_JUMP_UP; + item->Animation.TargetState = LS_JUMP_UP; SetLaraMonkeyRelease(item); } @@ -411,7 +411,7 @@ void lara_as_monkey_shimmy_right(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraMonkeyRelease(item); return; } @@ -433,15 +433,15 @@ void lara_as_monkey_shimmy_right(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_RSTEP) { - item->TargetState = LS_MONKEY_SHIMMY_RIGHT; + item->Animation.TargetState = LS_MONKEY_SHIMMY_RIGHT; return; } - item->TargetState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; return; } - item->TargetState = LS_JUMP_UP; + item->Animation.TargetState = LS_JUMP_UP; SetLaraMonkeyRelease(item); } @@ -487,7 +487,7 @@ void lara_as_monkey_turn_180(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.EnableSpasm = false; Camera.targetElevation = -ANGLE(5.0f); - item->TargetState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; } // State: LS_MONKEY_TURN_180 (79) @@ -510,7 +510,7 @@ void lara_as_monkey_turn_left(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraMonkeyRelease(item); return; } @@ -519,29 +519,29 @@ void lara_as_monkey_turn_left(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_FORWARD && TestLaraMonkeyForward(item, coll)) { - item->TargetState = LS_MONKEY_FORWARD; + item->Animation.TargetState = LS_MONKEY_FORWARD; return; } else if (TrInput & IN_BACK && TestLaraMonkeyBack(item, coll)) { - item->TargetState = LS_MONKEY_BACK; + item->Animation.TargetState = LS_MONKEY_BACK; return; } if (TrInput & IN_LSTEP && TestLaraMonkeyShimmyLeft(item, coll)) { - item->TargetState = LS_MONKEY_SHIMMY_LEFT; + item->Animation.TargetState = LS_MONKEY_SHIMMY_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraMonkeyShimmyRight(item, coll)) { - item->TargetState = LS_MONKEY_SHIMMY_RIGHT; + item->Animation.TargetState = LS_MONKEY_SHIMMY_RIGHT; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_MONKEY_TURN_LEFT; + item->Animation.TargetState = LS_MONKEY_TURN_LEFT; lara->Control.TurnRate -= LARA_TURN_RATE; if (lara->Control.TurnRate < -LARA_SLOW_TURN_MAX) @@ -550,11 +550,11 @@ void lara_as_monkey_turn_left(ITEM_INFO* item, COLL_INFO* coll) return; } - item->TargetState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; return; } - item->TargetState = LS_JUMP_UP; + item->Animation.TargetState = LS_JUMP_UP; SetLaraMonkeyRelease(item); } @@ -578,7 +578,7 @@ void lara_as_monkey_turn_right(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; SetLaraMonkeyRelease(item); return; } @@ -587,29 +587,29 @@ void lara_as_monkey_turn_right(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_FORWARD && TestLaraMonkeyForward(item, coll)) { - item->TargetState = LS_MONKEY_FORWARD; + item->Animation.TargetState = LS_MONKEY_FORWARD; return; } else if (TrInput & IN_BACK && TestLaraMonkeyBack(item, coll)) { - item->TargetState = LS_MONKEY_BACK; + item->Animation.TargetState = LS_MONKEY_BACK; return; } if (TrInput & IN_LSTEP && TestLaraMonkeyShimmyLeft(item, coll)) { - item->TargetState = LS_MONKEY_SHIMMY_LEFT; + item->Animation.TargetState = LS_MONKEY_SHIMMY_LEFT; return; } else if (TrInput & IN_RSTEP && TestLaraMonkeyShimmyRight(item, coll)) { - item->TargetState = LS_MONKEY_SHIMMY_RIGHT; + item->Animation.TargetState = LS_MONKEY_SHIMMY_RIGHT; return; } if (TrInput & IN_RIGHT) { - item->TargetState = LS_MONKEY_TURN_RIGHT; + item->Animation.TargetState = LS_MONKEY_TURN_RIGHT; lara->Control.TurnRate += LARA_TURN_RATE; if (lara->Control.TurnRate > LARA_SLOW_TURN_MAX) @@ -618,11 +618,11 @@ void lara_as_monkey_turn_right(ITEM_INFO* item, COLL_INFO* coll) return; } - item->TargetState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; return; } - item->TargetState = LS_JUMP_UP; + item->Animation.TargetState = LS_JUMP_UP; SetLaraMonkeyRelease(item); } diff --git a/TR5Main/Game/Lara/lara_objects.cpp b/TR5Main/Game/Lara/lara_objects.cpp index 59671e634..49531308e 100644 --- a/TR5Main/Game/Lara/lara_objects.cpp +++ b/TR5Main/Game/Lara/lara_objects.cpp @@ -39,7 +39,7 @@ void lara_as_pickup(ITEM_INFO* item, COLL_INFO* coll) Camera.targetDistance = SECTOR(1); if (TestLastFrame(item)) - item->TargetState = GetNextAnimState(item); + item->Animation.TargetState = GetNextAnimState(item); } // State: LS_PICKUP_FLARE (67) @@ -55,7 +55,7 @@ void lara_as_pickup_flare(ITEM_INFO* item, COLL_INFO* coll) Camera.targetElevation = -ANGLE(15.0f); Camera.targetDistance = SECTOR(1); - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd - 1) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd - 1) lara->Control.HandStatus = HandStatus::Free; } @@ -99,18 +99,18 @@ void lara_col_turn_switch(ITEM_INFO* item, COLL_INFO* coll) { if (coll->Setup.OldPosition.x != item->Position.xPos || coll->Setup.OldPosition.z != item->Position.zPos) { - if (item->AnimNumber == LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_CONTINUE) + if (item->Animation.AnimNumber == LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_CONTINUE) { item->Position.yRot -= ANGLE(90.0f); - item->AnimNumber = LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } - if (item->AnimNumber == LA_TURNSWITCH_PUSH_CLOCKWISE_CONTINUE) + if (item->Animation.AnimNumber == LA_TURNSWITCH_PUSH_CLOCKWISE_CONTINUE) { item->Position.yRot += ANGLE(90.0f); - item->AnimNumber = LA_TURNSWITCH_PUSH_CLOCKWISE_END; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = LA_TURNSWITCH_PUSH_CLOCKWISE_END; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } } @@ -148,9 +148,9 @@ void lara_as_use_puzzle(ITEM_INFO* item, COLL_INFO* coll) if (TestLastFrame(item) && item->ItemFlags[0]) { - item->ActiveState = LS_MISC_CONTROL; - item->AnimNumber = item->ItemFlags[0]; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.ActiveState = LS_MISC_CONTROL; + item->Animation.AnimNumber = item->ItemFlags[0]; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } @@ -197,7 +197,7 @@ void lara_as_pushable_grab(ITEM_INFO* item, COLL_INFO* coll) Camera.targetAngle = ANGLE(75.0f); if (!(TrInput & IN_ACTION)) - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } // ------ @@ -216,12 +216,12 @@ void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.EnableObjectPush = false; if (TrInput & IN_ACTION && pulleyItem->TriggerFlags) - item->TargetState = LS_PULLEY; + item->Animation.TargetState = LS_PULLEY; else - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; - if (item->AnimNumber == LA_PULLEY_PULL && - item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 44) + if (item->Animation.AnimNumber == LA_PULLEY_PULL && + item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 44) { if (pulleyItem->TriggerFlags) { @@ -250,8 +250,8 @@ void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll) } } - if (item->AnimNumber == LA_PULLEY_RELEASE && - item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd - 1) + if (item->Animation.AnimNumber == LA_PULLEY_RELEASE && + item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd - 1) { lara->Control.HandStatus = HandStatus::Free; } @@ -266,7 +266,7 @@ void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll) void lara_as_horizontal_bar_swing(ITEM_INFO* item, COLL_INFO* coll) { if (!(TrInput & IN_ACTION) || TrInput & IN_JUMP) - item->TargetState = LS_HORIZONTAL_BAR_LEAP; + item->Animation.TargetState = LS_HORIZONTAL_BAR_LEAP; } // State: LS_HORIZONTAL_BAR_LEAP (129) @@ -276,9 +276,9 @@ void lara_as_horizontal_bar_leap(ITEM_INFO* item, COLL_INFO* coll) auto* lara = GetLaraInfo(item); auto* barItem = &g_Level.Items[lara->InteractedItem]; - item->Airborne = true; + item->Animation.Airborne = true; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { int distance; if (item->Position.yRot == barItem->Position.yRot) @@ -286,8 +286,8 @@ void lara_as_horizontal_bar_leap(ITEM_INFO* item, COLL_INFO* coll) else distance = (barItem->TriggerFlags % 100) - 2; - item->Velocity = (20 * distance) + 58; - item->VerticalVelocity = -(20 * distance + 64); + item->Animation.Velocity = (20 * distance) + 58; + item->Animation.VerticalVelocity = -(20 * distance + 64); } if (TestLastFrame(item)) @@ -316,17 +316,17 @@ void lara_as_tightrope_idle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_FORWARD) { - item->TargetState = LS_TIGHTROPE_WALK; + item->Animation.TargetState = LS_TIGHTROPE_WALK; return; } if (TrInput & (IN_ROLL | IN_BACK)) { - item->TargetState = LS_TIGHTROPE_TURN_180; + item->Animation.TargetState = LS_TIGHTROPE_TURN_180; return; } - item->TargetState = LS_TIGHTROPE_IDLE; + item->Animation.TargetState = LS_TIGHTROPE_IDLE; } // State: LS_TIGHTROPE_DISMOUNT (125) @@ -341,7 +341,7 @@ void lara_as_tightrope_dismount(ITEM_INFO* item, COLL_INFO* coll) DoLaraTightropeBalanceRegen(item); DoLaraTightropeLean(item); - if (item->AnimNumber == LA_TIGHTROPE_END && + if (item->Animation.AnimNumber == LA_TIGHTROPE_END && TestLastFrame(item)) { item->Position.zRot = 0; @@ -357,7 +357,7 @@ void lara_as_tightrope_walk(ITEM_INFO* item, COLL_INFO* coll) if (TestLaraTightropeDismount(item, coll)) { - item->TargetState = LS_TIGHTROPE_DISMOUNT; + item->Animation.TargetState = LS_TIGHTROPE_DISMOUNT; DoLaraTightropeBalanceRegen(item); return; } @@ -368,22 +368,22 @@ void lara_as_tightrope_walk(ITEM_INFO* item, COLL_INFO* coll) if (lara->Control.Tightrope.Balance >= 8000) { - item->TargetState = LS_TIGHTROPE_UNBALANCE_RIGHT; + item->Animation.TargetState = LS_TIGHTROPE_UNBALANCE_RIGHT; return; } else if (lara->Control.Tightrope.Balance <= -8000) { - item->TargetState = LS_TIGHTROPE_UNBALANCE_LEFT; + item->Animation.TargetState = LS_TIGHTROPE_UNBALANCE_LEFT; return; } if (TrInput & IN_FORWARD) { - item->TargetState = LS_TIGHTROPE_WALK; + item->Animation.TargetState = LS_TIGHTROPE_WALK; return; } - item->TargetState = LS_TIGHTROPE_IDLE; + item->Animation.TargetState = LS_TIGHTROPE_IDLE; } // State: TIGHTROPE_UNBALANCE_LEFT (122), TIGHTROPE_UNBALANCE_RIGHT (123) @@ -396,12 +396,12 @@ void lara_as_tightrope_fall(ITEM_INFO* item, COLL_INFO* coll) if (TestLastFrame(item)) { // HACK: Set position command can't move Lara laterally? - if (item->AnimNumber == LA_TIGHTROPE_FALL_LEFT) + if (item->Animation.AnimNumber == LA_TIGHTROPE_FALL_LEFT) MoveItem(item, coll->Setup.ForwardAngle - ANGLE(90.0f), CLICK(1)); - else if (item->AnimNumber == LA_TIGHTROPE_FALL_RIGHT) + else if (item->Animation.AnimNumber == LA_TIGHTROPE_FALL_RIGHT) MoveItem(item, coll->Setup.ForwardAngle + ANGLE(90.0f), CLICK(1)); - item->VerticalVelocity = 10; + item->Animation.VerticalVelocity = 10; } } @@ -415,22 +415,22 @@ void lara_as_tightrope_idle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_LOOK) LookUpDown(item); - if (item->ActiveState != LS_TIGHTROPE_UNBALANCE_LEFT) + if (item->Animation.ActiveState != LS_TIGHTROPE_UNBALANCE_LEFT) { if (lara->Control.TightropeControl.Fall) { if (GetRandomControl() & 1) - item->TargetState = LS_TIGHTROPE_UNBALANCE_RIGHT; + item->Animation.TargetState = LS_TIGHTROPE_UNBALANCE_RIGHT; else - item->TargetState = LS_TIGHTROPE_UNBALANCE_LEFT; + item->Animation.TargetState = LS_TIGHTROPE_UNBALANCE_LEFT; } else { if (TrInput & IN_FORWARD) - item->TargetState = LS_TIGHTROPE_WALK; + item->Animation.TargetState = LS_TIGHTROPE_WALK; else if (TrInput & (IN_ROLL | IN_BACK)) { - item->TargetState = LS_TIGHTROPE_TURN_180; + item->Animation.TargetState = LS_TIGHTROPE_TURN_180; GetTightropeFallOff(item, 1); } } @@ -450,14 +450,14 @@ void lara_as_tightrope_walk(ITEM_INFO* item, COLL_INFO* coll) if (GetFloorHeight(GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &roomNumber), item->Position.xPos, item->Position.yPos, item->Position.zPos) == item->Position.yPos) { - item->TargetState = LS_TIGHTROPE_DISMOUNT; + item->Animation.TargetState = LS_TIGHTROPE_DISMOUNT; lara->Control.TightropeControl.Off = 0; } } else GetTightropeFallOff(item, 127); - if (item->ActiveState != LS_TIGHTROPE_UNBALANCE_LEFT) + if (item->Animation.ActiveState != LS_TIGHTROPE_UNBALANCE_LEFT) { if (TrInput & IN_LOOK) LookUpDown(item); @@ -465,9 +465,9 @@ void lara_as_tightrope_walk(ITEM_INFO* item, COLL_INFO* coll) if (((TrInput & (IN_BACK | IN_ROLL) || !(TrInput & IN_FORWARD) || lara->Control.TightropeControl.Fall) && !lara->Control.TightropeControl.OnCount && !lara->Control.TightropeControl.Off) && - item->TargetState != LS_TIGHTROPE_DISMOUNT) + item->Animation.TargetState != LS_TIGHTROPE_DISMOUNT) { - item->TargetState = LS_TIGHTROPE_IDLE; + item->Animation.TargetState = LS_TIGHTROPE_IDLE; } } } @@ -476,9 +476,9 @@ void lara_as_tightrope_walk(ITEM_INFO* item, COLL_INFO* coll) // Collision: lara_default_col() void lara_as_tightrope_fall(ITEM_INFO* item, COLL_INFO* coll) { - if (item->AnimNumber == LA_TIGHTROPE_FALL_LEFT || item->AnimNumber == LA_TIGHTROPE_FALL_RIGHT) + if (item->Animation.AnimNumber == LA_TIGHTROPE_FALL_LEFT || item->Animation.AnimNumber == LA_TIGHTROPE_FALL_RIGHT) { - if (TestLastFrame(item, item->AnimNumber)) + if (TestLastFrame(item, item->Animation.AnimNumber)) { PHD_VECTOR pos = { 0, 0, 0 }; GetLaraJointPosition(&pos, LM_RFOOT); @@ -487,12 +487,12 @@ void lara_as_tightrope_fall(ITEM_INFO* item, COLL_INFO* coll) item->Position.yPos = pos.y + 75; item->Position.zPos = pos.z; - item->TargetState = LS_FREEFALL; - item->ActiveState = LS_FREEFALL; - item->AnimNumber = LA_FREEFALL; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.TargetState = LS_FREEFALL; + item->Animation.ActiveState = LS_FREEFALL; + item->Animation.AnimNumber = LA_FREEFALL; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; - item->VerticalVelocity = 81; + item->Animation.VerticalVelocity = 81; Camera.targetspeed = 16; } } @@ -504,13 +504,13 @@ void lara_as_tightrope_fall(ITEM_INFO* item, COLL_INFO* coll) if (lara->Control.TightropeControl.OnCount > 0) lara->Control.TightropeControl.OnCount--; - if (item->AnimNumber == LA_TIGHTROPE_UNBALANCE_LEFT) + if (item->Animation.AnimNumber == LA_TIGHTROPE_UNBALANCE_LEFT) { undoInput = IN_RIGHT; wrongInput = IN_LEFT; undoAnim = LA_TIGHTROPE_RECOVER_LEFT; } - else if (item->AnimNumber == LA_TIGHTROPE_UNBALANCE_RIGHT) + else if (item->Animation.AnimNumber == LA_TIGHTROPE_UNBALANCE_RIGHT) { undoInput = IN_LEFT; wrongInput = IN_RIGHT; @@ -519,14 +519,14 @@ void lara_as_tightrope_fall(ITEM_INFO* item, COLL_INFO* coll) else return; - undoFrame = g_Level.Anims[item->AnimNumber].frameEnd + g_Level.Anims[undoAnim].frameBase - item->FrameNumber; + undoFrame = g_Level.Anims[item->Animation.AnimNumber].frameEnd + g_Level.Anims[undoAnim].frameBase - item->Animation.FrameNumber; if (TrInput & undoInput && lara->Control.TightropeControl.OnCount == 0) { - item->ActiveState = LS_TIGHTROPE_RECOVER_BALANCE; - item->TargetState = LS_TIGHTROPE_IDLE; - item->AnimNumber = undoAnim; - item->FrameNumber = undoFrame; + item->Animation.ActiveState = LS_TIGHTROPE_RECOVER_BALANCE; + item->Animation.TargetState = LS_TIGHTROPE_IDLE; + item->Animation.AnimNumber = undoAnim; + item->Animation.FrameNumber = undoFrame; lara->Control.TightropeControl.Fall--; } else @@ -556,7 +556,7 @@ void lara_as_rope_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_LEFT) lara->Control.Rope.Y += ANGLE(1.4f); else - item->TargetState = LS_ROPE_IDLE; + item->Animation.TargetState = LS_ROPE_IDLE; } else FallFromRope(item); @@ -573,7 +573,7 @@ void lara_as_rope_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_RIGHT) lara->Control.Rope.Y -= ANGLE(1.4f); else - item->TargetState = LS_ROPE_IDLE; + item->Animation.TargetState = LS_ROPE_IDLE; } else FallFromRope(item); @@ -602,22 +602,22 @@ void lara_col_rope_idle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_SPRINT) { - item->TargetState = LS_ROPE_SWING; + item->Animation.TargetState = LS_ROPE_SWING; lara->Control.Rope.DFrame = (g_Level.Anims[LA_ROPE_SWING].frameBase + 32) << 8; lara->Control.Rope.Frame = lara->Control.Rope.DFrame; } else if (TrInput & IN_FORWARD && lara->Control.Rope.Segment > 4) - item->TargetState = LS_ROPE_UP; + item->Animation.TargetState = LS_ROPE_UP; else if (TrInput & IN_BACK && lara->Control.Rope.Segment < 21) { - item->TargetState = LS_ROPE_DOWN; + item->Animation.TargetState = LS_ROPE_DOWN; lara->Control.Rope.Flag = 0; lara->Control.Rope.Count = 0; } else if (TrInput & IN_LEFT) - item->TargetState = LS_ROPE_TURN_CLOCKWISE; + item->Animation.TargetState = LS_ROPE_TURN_CLOCKWISE; else if (TrInput & IN_RIGHT) - item->TargetState = LS_ROPE_TURN_COUNTER_CLOCKWISE; + item->Animation.TargetState = LS_ROPE_TURN_COUNTER_CLOCKWISE; } else FallFromRope(item); @@ -633,7 +633,7 @@ void lara_col_rope_swing(ITEM_INFO* item, COLL_INFO* coll) UpdateRopeSwing(item); - if (item->AnimNumber == LA_ROPE_SWING) + if (item->Animation.AnimNumber == LA_ROPE_SWING) { if (TrInput & IN_SPRINT) { @@ -663,23 +663,23 @@ void lara_col_rope_swing(ITEM_INFO* item, COLL_INFO* coll) lara->Control.Rope.Frame = lara->Control.Rope.DFrame; } - item->FrameNumber = lara->Control.Rope.Frame >> 8; + item->Animation.FrameNumber = lara->Control.Rope.Frame >> 8; if (!(TrInput & IN_SPRINT) && - item->FrameNumber == g_Level.Anims[LA_ROPE_SWING].frameBase + 32 && + item->Animation.FrameNumber == g_Level.Anims[LA_ROPE_SWING].frameBase + 32 && lara->Control.Rope.MaxXBackward < 6750 && lara->Control.Rope.MaxXForward < 6750) { - item->TargetState = LS_ROPE_IDLE; - item->ActiveState = LS_ROPE_IDLE; - item->AnimNumber = LA_JUMP_UP_TO_ROPE_END; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.TargetState = LS_ROPE_IDLE; + item->Animation.ActiveState = LS_ROPE_IDLE; + item->Animation.AnimNumber = LA_JUMP_UP_TO_ROPE_END; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } if (TrInput & IN_JUMP) JumpOffRope(item); } - else if (item->FrameNumber == g_Level.Anims[LA_ROPE_IDLE_TO_SWING].frameBase + 15) + else if (item->Animation.FrameNumber == g_Level.Anims[LA_ROPE_IDLE_TO_SWING].frameBase + 15) ApplyVelocityToRope(lara->Control.Rope.Segment, item->Position.yRot, 128); } @@ -695,14 +695,14 @@ void lara_as_rope_up(ITEM_INFO* item, COLL_INFO* coll) { Camera.targetAngle = ANGLE(30.0f); - if (g_Level.Anims[item->AnimNumber].frameEnd == item->FrameNumber) + if (g_Level.Anims[item->Animation.AnimNumber].frameEnd == item->Animation.FrameNumber) { - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; lara->Control.Rope.Segment -= 2; } if (!(TrInput & IN_FORWARD) || lara->Control.Rope.Segment <= 4) - item->TargetState = LS_ROPE_IDLE; + item->Animation.TargetState = LS_ROPE_IDLE; } } @@ -728,7 +728,7 @@ void lara_as_pole_idle(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_FREEFALL; // TODO: Death state dispatch. + item->Animation.TargetState = LS_FREEFALL; // TODO: Death state dispatch. return; } @@ -737,7 +737,7 @@ void lara_as_pole_idle(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_ACTION) { - if (item->ActiveState == LA_POLE_IDLE) // Hack. + if (item->Animation.ActiveState == LA_POLE_IDLE) // Hack. { if (TrInput & IN_LEFT) { @@ -756,46 +756,46 @@ void lara_as_pole_idle(ITEM_INFO* item, COLL_INFO* coll) // TODO: Add forward jump. if (TrInput & IN_JUMP) { - item->TargetState = LS_JUMP_BACK; + item->Animation.TargetState = LS_JUMP_BACK; return; } if (TrInput & IN_FORWARD && TestLaraPoleUp(item, coll)) { - item->TargetState = LS_POLE_UP; + item->Animation.TargetState = LS_POLE_UP; return; } else if (TrInput & IN_BACK && TestLaraPoleDown(item, coll)) { - item->TargetState = LS_POLE_DOWN; + item->Animation.TargetState = LS_POLE_DOWN; return; } if (TrInput & IN_LEFT) { - item->TargetState = LS_POLE_TURN_CLOCKWISE; + item->Animation.TargetState = LS_POLE_TURN_CLOCKWISE; return; } else if (TrInput & IN_RIGHT) { - item->TargetState = LS_POLE_TURN_COUNTER_CLOCKWISE; + item->Animation.TargetState = LS_POLE_TURN_COUNTER_CLOCKWISE; return; } - item->TargetState = LS_POLE_IDLE; + item->Animation.TargetState = LS_POLE_IDLE; return; } GetCollisionInfo(coll, item); // HACK: Lara may step off poles in mid-air upon reload without this. if (coll->Middle.Floor <= 0 && - item->AnimNumber != LA_POLE_JUMP_BACK) // Hack. + item->Animation.AnimNumber != LA_POLE_JUMP_BACK) // Hack. { - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; return; } - else if (item->AnimNumber == LA_POLE_IDLE) + else if (item->Animation.AnimNumber == LA_POLE_IDLE) { - item->TargetState = LS_FREEFALL; + item->Animation.TargetState = LS_FREEFALL; // TODO: This shouldn't be required, but the set position command doesn't move Lara correctly. item->Position.xPos -= phd_sin(item->Position.yRot) * 64; @@ -834,7 +834,7 @@ void lara_as_pole_up(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_POLE_IDLE; // TODO: Death state dispatch. + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Death state dispatch. return; } @@ -855,21 +855,21 @@ void lara_as_pole_up(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_JUMP) { - item->TargetState = LS_POLE_IDLE; + item->Animation.TargetState = LS_POLE_IDLE; return; } if (TrInput & IN_FORWARD && TestLaraPoleUp(item, coll)) { - item->TargetState = LS_POLE_UP; + item->Animation.TargetState = LS_POLE_UP; return; } - item->TargetState = LS_POLE_IDLE; + item->Animation.TargetState = LS_POLE_IDLE; return; } - item->TargetState = LS_POLE_IDLE; // TODO: Dispatch to freefall? + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Dispatch to freefall? } // State: LS_POLE_UP (100) @@ -890,7 +890,7 @@ void lara_as_pole_down(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_POLE_IDLE; // TODO: Death state dispatch. + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Death state dispatch. return; } @@ -914,22 +914,22 @@ void lara_as_pole_down(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_JUMP) { - item->TargetState = LS_POLE_IDLE; + item->Animation.TargetState = LS_POLE_IDLE; return; } if (TrInput & IN_BACK && TestLaraPoleDown(item, coll)) { - item->TargetState = LS_POLE_DOWN; + item->Animation.TargetState = LS_POLE_DOWN; return; } - item->TargetState = LS_POLE_IDLE; - item->VerticalVelocity = 0; + item->Animation.TargetState = LS_POLE_IDLE; + item->Animation.VerticalVelocity = 0; return; } - item->TargetState = LS_POLE_IDLE; // TODO: Dispatch to freefall? + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Dispatch to freefall? } // State: LS_POLE_DOWN (101) @@ -949,21 +949,21 @@ void lara_col_pole_down(ITEM_INFO* item, COLL_INFO* coll) // TODO: Pitch modulation might be a fun idea. - if (item->AnimNumber == LA_POLE_DOWN_END) - item->VerticalVelocity -= 8; + if (item->Animation.AnimNumber == LA_POLE_DOWN_END) + item->Animation.VerticalVelocity -= 8; else - item->VerticalVelocity += 1; + item->Animation.VerticalVelocity += 1; - if (item->VerticalVelocity < 0) - item->VerticalVelocity = 0; - else if (item->VerticalVelocity > 64) - item->VerticalVelocity = 64; + if (item->Animation.VerticalVelocity < 0) + item->Animation.VerticalVelocity = 0; + else if (item->Animation.VerticalVelocity > 64) + item->Animation.VerticalVelocity = 64; // TODO: Do something about that ugly snap at the bottom. - if ((coll->Middle.Floor + item->VerticalVelocity) < 0) + if ((coll->Middle.Floor + item->Animation.VerticalVelocity) < 0) item->Position.yPos += coll->Middle.Floor; else if (TestLaraPoleCollision(item, coll, false)) - item->Position.yPos += item->VerticalVelocity; + item->Position.yPos += item->Animation.VerticalVelocity; } // State: LS_POLE_TURN_CLOCKWISE (102) @@ -977,7 +977,7 @@ void lara_as_pole_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_POLE_IDLE; // TODO: Death state dispatch. + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Death state dispatch. return; } @@ -988,12 +988,12 @@ void lara_as_pole_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_FORWARD && TestLaraPoleUp(item, coll)) { - item->TargetState = LS_POLE_IDLE; // TODO: Dispatch to climp up. + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Dispatch to climp up. return; } else if (TrInput & IN_BACK && TestLaraPoleDown(item, coll)) { - item->TargetState = LS_POLE_IDLE; // TODO: Dispatch to climb down. + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Dispatch to climb down. return; } @@ -1003,15 +1003,15 @@ void lara_as_pole_turn_clockwise(ITEM_INFO* item, COLL_INFO* coll) if (lara->Control.TurnRate > LARA_POLE_TURN_MAX) lara->Control.TurnRate = LARA_POLE_TURN_MAX; - item->TargetState = LS_POLE_TURN_CLOCKWISE; + item->Animation.TargetState = LS_POLE_TURN_CLOCKWISE; return; } - item->TargetState = LS_POLE_IDLE; + item->Animation.TargetState = LS_POLE_IDLE; return; } - item->TargetState = LS_POLE_IDLE; // TODO: Dispatch to freefall. + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Dispatch to freefall. } // State: LS_POLE_TURN_CLOCKWISE (102) @@ -1032,7 +1032,7 @@ void lara_as_pole_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_POLE_IDLE; // TODO: Death state dispatch. + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Death state dispatch. return; } @@ -1043,12 +1043,12 @@ void lara_as_pole_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll) { if (TrInput & IN_FORWARD && TestLaraPoleUp(item, coll)) { - item->TargetState = LS_POLE_IDLE; // TODO: Dispatch to climb up. + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Dispatch to climb up. return; } else if (TrInput & IN_BACK && TestLaraPoleDown(item, coll)) { - item->TargetState = LS_POLE_IDLE; // TODO: Dispatch to climb down. + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Dispatch to climb down. return; } @@ -1058,15 +1058,15 @@ void lara_as_pole_turn_counter_clockwise(ITEM_INFO* item, COLL_INFO* coll) if (lara->Control.TurnRate < -LARA_POLE_TURN_MAX) lara->Control.TurnRate = -LARA_POLE_TURN_MAX; - item->TargetState = LS_POLE_TURN_COUNTER_CLOCKWISE; + item->Animation.TargetState = LS_POLE_TURN_COUNTER_CLOCKWISE; return; } - item->TargetState = LS_POLE_IDLE; + item->Animation.TargetState = LS_POLE_IDLE; return; } - item->TargetState = LS_POLE_IDLE; // TODO: Dispatch to freefall. + item->Animation.TargetState = LS_POLE_IDLE; // TODO: Dispatch to freefall. } // State: LS_POLE_TURN_COUNTER_CLOCKWISE (103) @@ -1090,12 +1090,12 @@ void lara_as_zip_line(ITEM_INFO* item, COLL_INFO* coll) if (!(TrInput & IN_ACTION)) { - item->TargetState = LS_JUMP_FORWARD; + item->Animation.TargetState = LS_JUMP_FORWARD; AnimateLara(item); - item->Velocity = 100; - item->VerticalVelocity = 40; - item->Airborne = true; + item->Animation.Velocity = 100; + item->Animation.VerticalVelocity = 40; + item->Animation.Airborne = true; lara->Control.MoveAngle = item->Position.yRot; } } diff --git a/TR5Main/Game/Lara/lara_one_gun.cpp b/TR5Main/Game/Lara/lara_one_gun.cpp index e8bc9cdcf..efb247b40 100644 --- a/TR5Main/Game/Lara/lara_one_gun.cpp +++ b/TR5Main/Game/Lara/lara_one_gun.cpp @@ -72,10 +72,10 @@ void AnimateShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) } auto* item = &g_Level.Items[lara->Control.Weapon.WeaponItem]; - bool running = (weaponType == LaraWeaponType::HK && laraItem->Velocity != 0); + bool running = (weaponType == LaraWeaponType::HK && laraItem->Animation.Velocity != 0); bool harpoonFired = false; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case WEAPON_STATE_AIM: // HKFlag = 0; @@ -83,11 +83,11 @@ void AnimateShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) // HKFlag2 = 0; if (lara->Control.WaterStatus == WaterStatus::Underwater || running) - item->TargetState = WEAPON_STATE_UNDERWATER_AIM; + item->Animation.TargetState = WEAPON_STATE_UNDERWATER_AIM; else if ((!(TrInput & IN_ACTION) || lara->TargetEntity) && lara->LeftArm.Locked == false) - item->TargetState = WEAPON_STATE_UNAIM; + item->Animation.TargetState = WEAPON_STATE_UNAIM; else - item->TargetState = WEAPON_STATE_RECOIL; + item->Animation.TargetState = WEAPON_STATE_RECOIL; break; @@ -99,19 +99,19 @@ void AnimateShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) if (lara->Control.WaterStatus == WaterStatus::Underwater || running) { if ((!(TrInput & IN_ACTION) || lara->TargetEntity) && lara->LeftArm.Locked == false) - item->TargetState = WEAPON_STATE_UNDERWATER_UNAIM; + item->Animation.TargetState = WEAPON_STATE_UNDERWATER_UNAIM; else - item->TargetState = WEAPON_STATE_UNDERWATER_RECOIL; + item->Animation.TargetState = WEAPON_STATE_UNDERWATER_RECOIL; } else - item->TargetState = WEAPON_STATE_AIM; + item->Animation.TargetState = WEAPON_STATE_AIM; break; case WEAPON_STATE_RECOIL: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { - item->TargetState = WEAPON_STATE_UNAIM; + item->Animation.TargetState = WEAPON_STATE_UNAIM; if (lara->Control.WaterStatus != WaterStatus::Underwater && !running && !harpoonFired) { @@ -146,13 +146,13 @@ void AnimateShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) else FireShotgun(laraItem); - item->TargetState = WEAPON_STATE_RECOIL; + item->Animation.TargetState = WEAPON_STATE_RECOIL; } else if (lara->LeftArm.Locked) - item->TargetState = 0; + item->Animation.TargetState = 0; } - if (item->TargetState != WEAPON_STATE_RECOIL && + if (item->Animation.TargetState != WEAPON_STATE_RECOIL && // HKFlag && !(lara->Weapons[(int)LaraWeaponType::HK].HasSilencer)) { @@ -172,9 +172,9 @@ void AnimateShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) } }*/ else if (weaponType == LaraWeaponType::Shotgun && !(TrInput & IN_ACTION) && !lara->LeftArm.Locked) - item->TargetState = WEAPON_STATE_UNAIM; + item->Animation.TargetState = WEAPON_STATE_UNAIM; - if (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase == 12 && + if (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase == 12 && weaponType == LaraWeaponType::Shotgun) { TriggerGunShell(1, ID_SHOTGUNSHELL, LaraWeaponType::Shotgun); @@ -183,9 +183,9 @@ void AnimateShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) break; case WEAPON_STATE_UNDERWATER_RECOIL: - if (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase == 0) + if (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase == 0) { - item->TargetState = WEAPON_STATE_UNDERWATER_UNAIM; + item->Animation.TargetState = WEAPON_STATE_UNDERWATER_UNAIM; if ((lara->Control.WaterStatus == WaterStatus::Underwater || running) && !harpoonFired) @@ -204,7 +204,7 @@ void AnimateShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) { FireHK(laraItem, 1); // HKFlag = 1; - item->TargetState = 8; + item->Animation.TargetState = 8; if (lara->Weapons[(int)LaraWeaponType::HK].HasSilencer) SoundEffect(14, 0, 0); @@ -215,14 +215,14 @@ void AnimateShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) } } else - item->TargetState = WEAPON_STATE_UNDERWATER_AIM; + item->Animation.TargetState = WEAPON_STATE_UNDERWATER_AIM; - item->TargetState = WEAPON_STATE_UNDERWATER_RECOIL; + item->Animation.TargetState = WEAPON_STATE_UNDERWATER_RECOIL; } else if (lara->LeftArm.Locked) - item->TargetState = WEAPON_STATE_UNDERWATER_AIM; + item->Animation.TargetState = WEAPON_STATE_UNDERWATER_AIM; } - else if (item->TargetState != WEAPON_STATE_UNDERWATER_RECOIL && + else if (item->Animation.TargetState != WEAPON_STATE_UNDERWATER_RECOIL && // HKFlag && !(lara->Weapons[(int)LaraWeaponType::HK].HasSilencer)) { @@ -250,9 +250,9 @@ void AnimateShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) AnimateItem(item); - lara->LeftArm.FrameBase = lara->RightArm.FrameBase = g_Level.Anims[item->AnimNumber].framePtr; - lara->LeftArm.FrameNumber = lara->RightArm.FrameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; - lara->LeftArm.AnimNumber = lara->RightArm.AnimNumber = item->AnimNumber; + lara->LeftArm.FrameBase = lara->RightArm.FrameBase = g_Level.Anims[item->Animation.AnimNumber].framePtr; + lara->LeftArm.FrameNumber = lara->RightArm.FrameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + lara->LeftArm.AnimNumber = lara->RightArm.AnimNumber = item->Animation.AnimNumber; } void ReadyShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) @@ -339,15 +339,15 @@ void DrawShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) item->ObjectNumber = WeaponObject(weaponType); if (weaponType == LaraWeaponType::RocketLauncher) - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; else if (weaponType == LaraWeaponType::GrenadeLauncher) - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 0; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 0; else - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = WEAPON_STATE_DRAW; - item->ActiveState = WEAPON_STATE_DRAW; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = WEAPON_STATE_DRAW; + item->Animation.ActiveState = WEAPON_STATE_DRAW; item->Status = ITEM_ACTIVE; item->RoomNumber = NO_ROOM; @@ -359,19 +359,19 @@ void DrawShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) AnimateItem(item); - if (item->ActiveState != 0 && item->ActiveState != 6) + if (item->Animation.ActiveState != 0 && item->Animation.ActiveState != 6) { - if (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase == Weapons[(int)weaponType].DrawFrame) + if (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase == Weapons[(int)weaponType].DrawFrame) DrawShotgunMeshes(laraItem, weaponType); else if (lara->Control.WaterStatus == WaterStatus::Underwater) - item->TargetState = 6; + item->Animation.TargetState = 6; } else ReadyShotgun(laraItem, weaponType); - lara->LeftArm.FrameBase = lara->RightArm.FrameBase = g_Level.Anims[item->AnimNumber].framePtr; - lara->LeftArm.FrameNumber = lara->RightArm.FrameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; - lara->LeftArm.AnimNumber = lara->RightArm.AnimNumber = item->AnimNumber; + lara->LeftArm.FrameBase = lara->RightArm.FrameBase = g_Level.Anims[item->Animation.AnimNumber].framePtr; + lara->LeftArm.FrameNumber = lara->RightArm.FrameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + lara->LeftArm.AnimNumber = lara->RightArm.AnimNumber = item->Animation.AnimNumber; } void UndrawShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) @@ -379,7 +379,7 @@ void UndrawShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) auto* lara = GetLaraInfo(laraItem); auto* item = &g_Level.Items[lara->Control.Weapon.WeaponItem]; - item->TargetState = 3; + item->Animation.TargetState = 3; AnimateItem(item); @@ -394,14 +394,14 @@ void UndrawShotgun(ITEM_INFO* laraItem, LaraWeaponType weaponType) lara->RightArm.FrameNumber = 0; lara->LeftArm.FrameNumber = 0; } - else if (item->ActiveState == 3 && item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase == 21) + else if (item->Animation.ActiveState == 3 && item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase == 21) UndrawShotgunMeshes(laraItem, weaponType); - lara->RightArm.FrameBase = g_Level.Anims[item->AnimNumber].framePtr; - lara->LeftArm.FrameBase = g_Level.Anims[item->AnimNumber].framePtr; - lara->RightArm.FrameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; - lara->LeftArm.FrameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; - lara->RightArm.AnimNumber = item->AnimNumber; + lara->RightArm.FrameBase = g_Level.Anims[item->Animation.AnimNumber].framePtr; + lara->LeftArm.FrameBase = g_Level.Anims[item->Animation.AnimNumber].framePtr; + lara->RightArm.FrameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + lara->LeftArm.FrameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + lara->RightArm.AnimNumber = item->Animation.AnimNumber; lara->LeftArm.AnimNumber = lara->RightArm.AnimNumber; } @@ -475,8 +475,8 @@ void FireHarpoon(ITEM_INFO* laraItem) } item->Position.zRot = 0; - item->Velocity = HARPOON_VELOCITY * phd_cos(item->Position.xRot); - item->VerticalVelocity = -HARPOON_VELOCITY * phd_sin(item->Position.xRot); + item->Animation.Velocity = HARPOON_VELOCITY * phd_cos(item->Position.xRot); + item->Animation.VerticalVelocity = -HARPOON_VELOCITY * phd_sin(item->Position.xRot); item->HitPoints = HARPOON_TIME; AddActiveItem(itemNumber); @@ -508,8 +508,8 @@ void HarpoonBoltControl(short itemNumber) if (item->Position.xRot < -ANGLE(90.0f)) item->Position.xRot = -ANGLE(90.0f); - item->VerticalVelocity = -HARPOON_VELOCITY * phd_sin(item->Position.xRot); - item->Velocity = HARPOON_VELOCITY * phd_cos(item->Position.xRot); + item->Animation.VerticalVelocity = -HARPOON_VELOCITY * phd_sin(item->Position.xRot); + item->Animation.Velocity = HARPOON_VELOCITY * phd_cos(item->Position.xRot); aboveWater = true; } else @@ -519,15 +519,15 @@ void HarpoonBoltControl(short itemNumber) CreateBubble((PHD_VECTOR*)&item->Position, item->RoomNumber, 0, 0, BUBBLE_FLAG_CLUMP | BUBBLE_FLAG_HIGH_AMPLITUDE, 0, 0, 0); // CHECK TriggerRocketSmoke(item->Position.xPos, item->Position.yPos, item->Position.zPos, 64); - item->VerticalVelocity = -HARPOON_VELOCITY * phd_sin(item->Position.xRot) / 2; - item->Velocity = HARPOON_VELOCITY * phd_cos(item->Position.xRot) / 2; + item->Animation.VerticalVelocity = -HARPOON_VELOCITY * phd_sin(item->Position.xRot) / 2; + item->Animation.Velocity = HARPOON_VELOCITY * phd_cos(item->Position.xRot) / 2; aboveWater = false; } // Update bolt's position - item->Position.xPos += item->Velocity * phd_cos(item->Position.xRot) * phd_sin(item->Position.yRot); - item->Position.yPos += item->Velocity * phd_sin(-item->Position.xRot); - item->Position.zPos += item->Velocity * phd_cos(item->Position.xRot) * phd_cos(item->Position.yRot); + item->Position.xPos += item->Animation.Velocity * phd_cos(item->Position.xRot) * phd_sin(item->Position.yRot); + item->Position.yPos += item->Animation.Velocity * phd_sin(-item->Position.xRot); + item->Position.zPos += item->Animation.Velocity * phd_cos(item->Position.xRot) * phd_cos(item->Position.yRot); } else { @@ -698,11 +698,11 @@ void FireGrenade(ITEM_INFO* laraItem) item->Position.yRot += lara->ExtraTorsoRot.yRot; } - item->Velocity = GRENADE_VELOCITY; - item->VerticalVelocity = -CLICK(2) * phd_sin(item->Position.xRot); - item->ActiveState = item->Position.xRot; - item->TargetState = item->Position.yRot; - item->RequiredState = 0; + item->Animation.Velocity = GRENADE_VELOCITY; + item->Animation.VerticalVelocity = -CLICK(2) * phd_sin(item->Position.xRot); + item->Animation.ActiveState = item->Position.xRot; + item->Animation.TargetState = item->Position.yRot; + item->Animation.RequiredState = 0; item->HitPoints = 120; item->ItemFlags[0] = (int)WeaponAmmoType::Ammo2; @@ -770,11 +770,11 @@ void GrenadeControl(short itemNumber) newGrenade->Position.xRot = (GetRandomControl() & 0x3FFF) + ANGLE(45); newGrenade->Position.yRot = GetRandomControl() * 2; newGrenade->Position.zRot = 0; - newGrenade->Velocity = 64; - newGrenade->VerticalVelocity = -64 * phd_sin(newGrenade->Position.xRot); - newGrenade->ActiveState = newGrenade->Position.xRot; - newGrenade->TargetState = newGrenade->Position.yRot; - newGrenade->RequiredState = 0; + newGrenade->Animation.Velocity = 64; + newGrenade->Animation.VerticalVelocity = -64 * phd_sin(newGrenade->Position.xRot); + newGrenade->Animation.ActiveState = newGrenade->Position.xRot; + newGrenade->Animation.TargetState = newGrenade->Position.yRot; + newGrenade->Animation.RequiredState = 0; AddActiveItem(newGrenadeItemNumber); @@ -814,36 +814,36 @@ void GrenadeControl(short itemNumber) { aboveWater = false; someFlag = false; - item->VerticalVelocity += (5 - item->VerticalVelocity) >> 1; - item->Velocity -= item->Velocity >> 2; + item->Animation.VerticalVelocity += (5 - item->Animation.VerticalVelocity) >> 1; + item->Animation.Velocity -= item->Animation.Velocity >> 2; - if (item->Velocity) + if (item->Animation.Velocity) { - item->Position.zRot += (((item->Velocity >> 4) + 3) * ANGLE(1.0f)); - if (item->RequiredState) - item->Position.yRot += (((item->Velocity >> 2) + 3) * ANGLE(1.0f)); + item->Position.zRot += (((item->Animation.Velocity >> 4) + 3) * ANGLE(1.0f)); + if (item->Animation.RequiredState) + item->Position.yRot += (((item->Animation.Velocity >> 2) + 3) * ANGLE(1.0f)); else - item->Position.xRot += (((item->Velocity >> 2) + 3) * ANGLE(1.0f)); + item->Position.xRot += (((item->Animation.Velocity >> 2) + 3) * ANGLE(1.0f)); } } else { aboveWater = true; someFlag = true; - item->VerticalVelocity += 3; + item->Animation.VerticalVelocity += 3; - if (item->Velocity) + if (item->Animation.Velocity) { - item->Position.zRot += (((item->Velocity >> 2) + 7) * ANGLE(1.0f)); - if (item->RequiredState) - item->Position.yRot += (((item->Velocity >> 1) + 7) * ANGLE(1.0f)); + item->Position.zRot += (((item->Animation.Velocity >> 2) + 7) * ANGLE(1.0f)); + if (item->Animation.RequiredState) + item->Position.yRot += (((item->Animation.Velocity >> 1) + 7) * ANGLE(1.0f)); else - item->Position.xRot += (((item->Velocity >> 1) + 7) * ANGLE(1.0f)); + item->Position.xRot += (((item->Animation.Velocity >> 1) + 7) * ANGLE(1.0f)); } } // Trigger fire and smoke sparks in the direction of motion - if (item->Velocity && aboveWater) + if (item->Animation.Velocity && aboveWater) { Matrix world = Matrix::CreateFromYawPitchRoll( TO_RAD(item->Position.yRot - ANGLE(180.0f)), @@ -860,9 +860,9 @@ void GrenadeControl(short itemNumber) } // Update grenade position - xv = item->Velocity * phd_sin(item->TargetState); - yv = item->VerticalVelocity; - zv = item->Velocity * phd_cos(item->TargetState); + xv = item->Animation.Velocity * phd_sin(item->Animation.TargetState); + yv = item->Animation.VerticalVelocity; + zv = item->Animation.Velocity * phd_cos(item->Animation.TargetState); item->Position.xPos += xv; item->Position.yPos += yv; @@ -882,11 +882,11 @@ void GrenadeControl(short itemNumber) { // Do grenade's physics short sYrot = item->Position.yRot; - item->Position.yRot = item->TargetState; + item->Position.yRot = item->Animation.TargetState; DoProjectileDynamics(itemNumber, oldX, oldY, oldZ, xv, yv, zv); - item->TargetState = item->Position.yRot; + item->Animation.TargetState = item->Position.yRot; item->Position.yRot = sYrot; } @@ -1155,7 +1155,7 @@ void FireRocket(ITEM_INFO* laraItem) item->Position.yRot += lara->ExtraTorsoRot.yRot; } - item->Velocity = 512 >> 5; + item->Animation.Velocity = 512 >> 5; item->ItemFlags[0] = 0; AddActiveItem(itemNumber); @@ -1181,25 +1181,25 @@ void RocketControl(short itemNumber) bool abovewater = false; if (TestEnvironment(ENV_FLAG_WATER, item->RoomNumber)) { - if (item->Velocity > (ROCKET_VELOCITY / 4)) - item->Velocity -= item->Velocity / 4; + if (item->Animation.Velocity > (ROCKET_VELOCITY / 4)) + item->Animation.Velocity -= item->Animation.Velocity / 4; else { - item->Velocity += (item->Velocity / 4) + 4; + item->Animation.Velocity += (item->Animation.Velocity / 4) + 4; - if (item->Velocity > (ROCKET_VELOCITY / 4)) - item->Velocity = ROCKET_VELOCITY / 4; + if (item->Animation.Velocity > (ROCKET_VELOCITY / 4)) + item->Animation.Velocity = ROCKET_VELOCITY / 4; } - item->Position.zRot += (((item->Velocity / 8) + 3) * ANGLE(1.0f)); + item->Position.zRot += (((item->Animation.Velocity / 8) + 3) * ANGLE(1.0f)); abovewater = false; } else { - if (item->Velocity < ROCKET_VELOCITY) - item->Velocity += (item->Velocity / 4) + 4; + if (item->Animation.Velocity < ROCKET_VELOCITY) + item->Animation.Velocity += (item->Animation.Velocity / 4) + 4; - item->Position.zRot += (((item->Velocity / 4) + 7) * ANGLE(1.0f)); + item->Position.zRot += (((item->Animation.Velocity / 4) + 7) * ANGLE(1.0f)); abovewater = true; } @@ -1229,9 +1229,9 @@ void RocketControl(short itemNumber) } // Update rocket's position - short speed = item->Velocity * phd_cos(item->Position.xRot); + short speed = item->Animation.Velocity * phd_cos(item->Position.xRot); item->Position.xPos += speed * phd_sin(item->Position.yRot); - item->Position.yPos += -item->Velocity * phd_sin(item->Position.xRot); + item->Position.yPos += -item->Animation.Velocity * phd_sin(item->Position.xRot); item->Position.zPos += speed * phd_cos(item->Position.yRot); bool explode = false; @@ -1442,7 +1442,7 @@ void FireCrossbow(ITEM_INFO* laraItem, PHD_3DPOS* pos) } } - item->Velocity = 512; + item->Animation.Velocity = 512; AddActiveItem(itemNumber); @@ -1495,8 +1495,8 @@ void CrossbowBoltControl(short itemNumber) { PHD_VECTOR bubblePos = { item->Position.xPos, item->Position.yPos, item->Position.zPos }; - if (item->Velocity > 64) - item->Velocity -= (item->Velocity >> 4); + if (item->Animation.Velocity > 64) + item->Animation.Velocity -= (item->Animation.Velocity >> 4); if (GlobalCounter & 1) CreateBubble(&bubblePos, item->RoomNumber, 4, 7, 0, 0, 0, 0); @@ -1507,9 +1507,9 @@ void CrossbowBoltControl(short itemNumber) aboveWater = true; // Update bolt's position - item->Position.xPos += item->Velocity * phd_cos(item->Position.xRot) * phd_sin(item->Position.yRot); - item->Position.yPos += item->Velocity * phd_sin(-item->Position.xRot); - item->Position.zPos += item->Velocity * phd_cos(item->Position.xRot) * phd_cos(item->Position.yRot); + item->Position.xPos += item->Animation.Velocity * phd_cos(item->Position.xRot) * phd_sin(item->Position.yRot); + item->Position.yPos += item->Animation.Velocity * phd_sin(-item->Position.xRot); + item->Position.zPos += item->Animation.Velocity * phd_cos(item->Position.xRot) * phd_cos(item->Position.yRot); auto probe = GetCollisionResult(item); diff --git a/TR5Main/Game/Lara/lara_overhang.cpp b/TR5Main/Game/Lara/lara_overhang.cpp index 8d8bc09f0..d5d2b3b1b 100644 --- a/TR5Main/Game/Lara/lara_overhang.cpp +++ b/TR5Main/Game/Lara/lara_overhang.cpp @@ -310,7 +310,7 @@ void lara_col_slopeclimb(ITEM_INFO* item, COLL_INFO* coll) short tempRoom = 0; - if (item->AnimNumber == LA_OVERHANG_LADDER_SLOPE_CONCAVE) + if (item->Animation.AnimNumber == LA_OVERHANG_LADDER_SLOPE_CONCAVE) return; auto floorNow = GetFloor(now.x, now.y, now.z, &(tempRoom = item->RoomNumber)); @@ -320,7 +320,7 @@ void lara_col_slopeclimb(ITEM_INFO* item, COLL_INFO* coll) // Drop down if action not pressed if (!(TrInput & IN_ACTION)) { - SetAnimation(item, item->AnimNumber == LA_OVERHANG_IDLE_LEFT ? LA_OVERHANG_DROP_LEFT : LA_OVERHANG_DROP_RIGHT); + SetAnimation(item, item->Animation.AnimNumber == LA_OVERHANG_IDLE_LEFT ? LA_OVERHANG_DROP_LEFT : LA_OVERHANG_DROP_RIGHT); return; } @@ -328,8 +328,8 @@ void lara_col_slopeclimb(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_LEFT || TrInput & IN_RIGHT) { auto* lara = GetLaraInfo(item); - lara->NextCornerPos.zRot = (item->AnimNumber == LA_OVERHANG_IDLE_LEFT) ? true : false; // HACK! - SetAnimation(item, item->AnimNumber == LA_OVERHANG_IDLE_LEFT ? LA_OVERHANG_IDLE_2_HANG_LEFT : LA_OVERHANG_IDLE_2_HANG_RIGHT); + lara->NextCornerPos.zRot = (item->Animation.AnimNumber == LA_OVERHANG_IDLE_LEFT) ? true : false; // HACK! + SetAnimation(item, item->Animation.AnimNumber == LA_OVERHANG_IDLE_LEFT ? LA_OVERHANG_IDLE_2_HANG_LEFT : LA_OVERHANG_IDLE_2_HANG_RIGHT); return; } @@ -385,7 +385,7 @@ void lara_col_slopeclimb(ITEM_INFO* item, COLL_INFO* coll) if (!testWall->IsWall((up.x - offset.x), (up.z - offset.z)) && (ceiling - testCeiling) > CLICK(0.5f)) // No wall or downwards ceiling step { TranslateItem(item, 0, -CLICK(1), -CLICK(1)); - SetAnimation(item, item->AnimNumber == LA_OVERHANG_IDLE_LEFT ? LA_OVERHANG_CLIMB_UP_LEFT : LA_OVERHANG_CLIMB_UP_RIGHT); + SetAnimation(item, item->Animation.AnimNumber == LA_OVERHANG_IDLE_LEFT ? LA_OVERHANG_CLIMB_UP_LEFT : LA_OVERHANG_CLIMB_UP_RIGHT); //item->TargetState = 62; } } @@ -433,7 +433,7 @@ void lara_col_slopeclimb(ITEM_INFO* item, COLL_INFO* coll) bridge1 = FindBridge(4, goalOrient, down, &height, -CLICK(5) / 2, -CLICK(3) / 2); if (yDiff >= CLICK(3) / 4 && yDiff <= CLICK(5) / 4 && (SlopeCheck(slope, goal) || bridge1 >= 0)) { - SetAnimation(item, item->AnimNumber == LA_OVERHANG_IDLE_LEFT ? LA_OVERHANG_CLIMB_DOWN_LEFT : LA_OVERHANG_CLIMB_DOWN_RIGHT); + SetAnimation(item, item->Animation.AnimNumber == LA_OVERHANG_IDLE_LEFT ? LA_OVERHANG_CLIMB_DOWN_LEFT : LA_OVERHANG_CLIMB_DOWN_RIGHT); return; } } @@ -459,7 +459,7 @@ void lara_as_slopeclimb(ITEM_INFO* item, COLL_INFO* coll) void lara_as_slopefall(ITEM_INFO* item, COLL_INFO* coll) { - item->Airborne = true; + item->Animation.Airborne = true; if (GlobalCounter % 2) item->Position.xRot--; @@ -502,7 +502,7 @@ void lara_col_slopehang(ITEM_INFO* item, COLL_INFO* coll) return; } - if (item->AnimNumber != LA_OVERHANG_HANG_SWING) + if (item->Animation.AnimNumber != LA_OVERHANG_HANG_SWING) { // Return to climbing mode if (TrInput & IN_FORWARD || TrInput & IN_BACK) @@ -583,7 +583,7 @@ void lara_col_slopeshimmy(ITEM_INFO* item, COLL_INFO* coll) item->Position.yPos = ceiling + HEIGHT_ADJUST; PHD_VECTOR shimmy = { item->Position.xPos, item->Position.yPos, item->Position.zPos }; - if (item->AnimNumber == LA_OVERHANG_SHIMMY_LEFT) + if (item->Animation.AnimNumber == LA_OVERHANG_SHIMMY_LEFT) { shimmy.x -= offset.z / 2; shimmy.z += offset.x / 2; @@ -611,7 +611,7 @@ void lara_col_slopeshimmy(ITEM_INFO* item, COLL_INFO* coll) } if (cancelShimmy) - SetAnimation(item, (item->AnimNumber == LA_OVERHANG_SHIMMY_LEFT) ? LA_OVERHANG_SHIMMY_LEFT_STOP : LA_OVERHANG_SHIMMY_RIGHT_STOP); + SetAnimation(item, (item->Animation.AnimNumber == LA_OVERHANG_SHIMMY_LEFT) ? LA_OVERHANG_SHIMMY_LEFT_STOP : LA_OVERHANG_SHIMMY_RIGHT_STOP); } void lara_as_slopeshimmy(ITEM_INFO* item, COLL_INFO* coll) @@ -630,7 +630,7 @@ void lara_as_slopeshimmy(ITEM_INFO* item, COLL_INFO* coll) auto* lara = GetLaraInfo(item); - if (item->AnimNumber == LA_OVERHANG_SHIMMY_LEFT) + if (item->Animation.AnimNumber == LA_OVERHANG_SHIMMY_LEFT) { lara->Control.MoveAngle = item->Position.yRot - ANGLE(90.0f); Camera.targetAngle = -ANGLE(22.5f); @@ -662,11 +662,11 @@ void lara_as_slopeclimbup(ITEM_INFO* item, COLL_INFO* coll) if (!(TrInput & IN_ACTION)) { int frame = GetCurrentRelativeFrameNumber(item); - int length = GetFrameCount(item->AnimNumber); + int length = GetFrameCount(item->Animation.AnimNumber); int dPos = CLICK(1) - (frame * CLICK(1) / length); TranslateItem(item, 0, dPos, dPos); - if (item->AnimNumber == LA_OVERHANG_CLIMB_UP_LEFT) + if (item->Animation.AnimNumber == LA_OVERHANG_CLIMB_UP_LEFT) SetAnimation(item, frame <= 2 * length / 3 ? LA_OVERHANG_DROP_LEFT : LA_OVERHANG_DROP_RIGHT); else SetAnimation(item, frame <= 2 * length / 3 ? LA_OVERHANG_DROP_RIGHT : LA_OVERHANG_DROP_LEFT); @@ -692,11 +692,11 @@ void lara_as_slopeclimbdown(ITEM_INFO* item, COLL_INFO* coll) if (!(TrInput & IN_ACTION)) { int frame = GetCurrentRelativeFrameNumber(item); - int length = GetFrameCount(item->AnimNumber); + int length = GetFrameCount(item->Animation.AnimNumber); int dPos = frame * CLICK(1) / length; TranslateItem(item, 0, dPos, dPos); - if (item->AnimNumber == LA_OVERHANG_CLIMB_DOWN_LEFT) + if (item->Animation.AnimNumber == LA_OVERHANG_CLIMB_DOWN_LEFT) SetAnimation(item, frame <= length / 2 ? LA_OVERHANG_DROP_LEFT : LA_OVERHANG_DROP_RIGHT); else SetAnimation(item, frame <= length / 2 ? LA_OVERHANG_DROP_RIGHT : LA_OVERHANG_DROP_LEFT); @@ -706,10 +706,10 @@ void lara_as_slopeclimbdown(ITEM_INFO* item, COLL_INFO* coll) void lara_as_sclimbstart(ITEM_INFO* item, COLL_INFO* coll) { // Rotating camera effect during monkey to overhead slope transition - if (item->AnimNumber == LA_OVERHANG_MONKEY_SLOPE_CONVEX) + if (item->Animation.AnimNumber == LA_OVERHANG_MONKEY_SLOPE_CONVEX) { int frame = GetCurrentRelativeFrameNumber(item); - int numFrames = GetFrameCount(item->AnimNumber); + int numFrames = GetFrameCount(item->Animation.AnimNumber); float frac = (frame * 1.5f) / (float)(numFrames); if (frac > 1.0f) @@ -723,7 +723,7 @@ void lara_as_sclimbstart(ITEM_INFO* item, COLL_INFO* coll) distance = 1024; } - if (item->FrameNumber < g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameEnd) { Camera.targetDistance = distance; Camera.targetElevation = int(3072 * frac); @@ -758,7 +758,7 @@ void lara_as_sclimbstop(ITEM_INFO* item, COLL_INFO* coll) // Rotating camera effect during monkey to overhead slope transition // Following camera effect during the slope to underlying monkey transition - if (item->AnimNumber == LA_OVERHANG_SLOPE_MONKEY_CONVEX) + if (item->Animation.AnimNumber == LA_OVERHANG_SLOPE_MONKEY_CONVEX) { Camera.flags = 1; Camera.targetDistance = 1664; @@ -766,10 +766,10 @@ void lara_as_sclimbstop(ITEM_INFO* item, COLL_INFO* coll) Camera.targetspeed = 15; } // Rotating camera effect during concave slope to monkey transition - else if (item->AnimNumber == LA_OVERHANG_SLOPE_MONKEY_CONCAVE) + else if (item->Animation.AnimNumber == LA_OVERHANG_SLOPE_MONKEY_CONCAVE) { int frame = GetCurrentRelativeFrameNumber(item); - int numFrames = GetFrameCount(item->AnimNumber); + int numFrames = GetFrameCount(item->Animation.AnimNumber); float frac = (frame * 1.25f) / (float)(numFrames); if (frac > 1.0f) @@ -777,7 +777,7 @@ void lara_as_sclimbstop(ITEM_INFO* item, COLL_INFO* coll) Camera.flags = 1; - if (item->FrameNumber < g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameEnd) { Camera.targetAngle = (short)(-16384 * frac); @@ -807,7 +807,7 @@ void lara_as_sclimbstop(ITEM_INFO* item, COLL_INFO* coll) void lara_as_sclimbend(ITEM_INFO* item, COLL_INFO* coll) { - switch (item->AnimNumber) + switch (item->Animation.AnimNumber) { case LA_OVERHANG_EXIT_MONKEY_FORWARD: SetAnimation(item, LA_MONKEY_FORWARD); @@ -853,7 +853,7 @@ void SlopeHangExtra(ITEM_INFO* item, COLL_INFO* coll) auto floorNext = GetFloor(down.x, down.y, down.z, &(tempRoom = item->RoomNumber)); int ceilDist = item->Position.yPos - GetCeiling(floorNext, down.x, down.y, down.z); - if (item->TargetState == LS_LADDER_IDLE) // Prevent going from hang to climb mode if slope is under ladder + if (item->Animation.TargetState == LS_LADDER_IDLE) // Prevent going from hang to climb mode if slope is under ladder { if (ceilDist >= CLICK(1) && ceilDist < CLICK(2)) { @@ -861,7 +861,7 @@ void SlopeHangExtra(ITEM_INFO* item, COLL_INFO* coll) if ((slope.x / 3) == (goal.x / 3) || (slope.y / 3) == (goal.y / 3)) { - item->TargetState = LS_HANG; + item->Animation.TargetState = LS_HANG; if (TrInput & IN_FORWARD) SetAnimation(item, LA_LADDER_SHIMMY_UP); /*else if (TrInput & IN_BACK) @@ -948,7 +948,7 @@ void SlopeClimbExtra(ITEM_INFO* item, COLL_INFO* coll) int ceiling = GetCeiling(floorNow, now.x, now.y, now.z); // Block for ladder to overhead slope transition - if (item->AnimNumber == LA_LADDER_IDLE) + if (item->Animation.AnimNumber == LA_LADDER_IDLE) { if (TrInput & IN_FORWARD) { @@ -1013,7 +1013,7 @@ void LadderMonkeyExtra(ITEM_INFO* item, COLL_INFO* coll) return; if (result.BottomBlock->Flags.Monkeyswing && (item->Position.yPos - coll->Setup.Height - CLICK(0.5f) <= result.Position.Ceiling)) - item->TargetState = LS_MONKEY_IDLE; + item->Animation.TargetState = LS_MONKEY_IDLE; } // Extends state 61 (AS_CLIMBDOWN) @@ -1037,7 +1037,7 @@ void SlopeClimbDownExtra(ITEM_INFO* item, COLL_INFO* coll) auto floorNow = GetFloor(now.x, now.y, now.z, &(tempRoom = item->RoomNumber)); int ceiling = GetCeiling(floorNow, now.x, now.y, now.z); - if (item->AnimNumber == LA_LADDER_DOWN) // Make Lara stop before underlying slope ceiling at correct height + if (item->Animation.AnimNumber == LA_LADDER_DOWN) // Make Lara stop before underlying slope ceiling at correct height { if (TrInput & IN_BACK) { @@ -1057,7 +1057,7 @@ void SlopeClimbDownExtra(ITEM_INFO* item, COLL_INFO* coll) { short bridge1 = FindBridge(4, goalOrient, down, &height, -CLICK(3), CLICK(4)); if (ceilDist < CLICK(1) && (bridge1 >= 0 || SlopeCheck(slope, goal))) - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; } else if (GetFrameNumber(item, 0) == midpoint) { @@ -1065,7 +1065,7 @@ void SlopeClimbDownExtra(ITEM_INFO* item, COLL_INFO* coll) if (ceilDist < CLICK(1) * 2 && (bridge1 >= 0 || SlopeCheck(slope, goal))) { item->Position.yPos += CLICK(1); // Do midpoint Y translation - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; } } } @@ -1096,7 +1096,7 @@ void SlopeMonkeyExtra(ITEM_INFO* item, COLL_INFO* coll) auto floorNow = GetFloor(now.x, now.y, now.z, &(tempRoom = item->RoomNumber)); int ceiling = GetCeiling(floorNow, now.x, now.y, now.z); - if (item->AnimNumber == LA_REACH_TO_MONKEY && !GetFrameNumber(item, 0)) // Manage proper grabbing of monkey slope on forward jump + if (item->Animation.AnimNumber == LA_REACH_TO_MONKEY && !GetFrameNumber(item, 0)) // Manage proper grabbing of monkey slope on forward jump { int ceiling = GetCeiling(floorNow, now.x, now.y, now.z); int ceilDist = item->Position.yPos - ceiling; @@ -1126,7 +1126,7 @@ void SlopeMonkeyExtra(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_FORWARD) // Monkey to slope transitions { - if (TestMonkey(floorNow, now.x, now.y, now.z) && ((item->AnimNumber == LA_REACH_TO_MONKEY && GetFrameNumber(item, 0) >= 54) || item->AnimNumber == LA_MONKEY_IDLE)) + if (TestMonkey(floorNow, now.x, now.y, now.z) && ((item->Animation.AnimNumber == LA_REACH_TO_MONKEY && GetFrameNumber(item, 0) >= 54) || item->Animation.AnimNumber == LA_MONKEY_IDLE)) { if (abs(DirOrientDiff(goalOrient, item->Position.yRot)) <= ANGLE(30) && InStrip(item->Position.xPos, item->Position.zPos, item->Position.yRot, 0, CLICK(1) / 2)) @@ -1182,10 +1182,10 @@ void SlopeMonkeyExtra(ITEM_INFO* item, COLL_INFO* coll) if ((collResult.Position.Floor <= topSide - CLICK(1)) || (collResult.Position.Ceiling >= topSide - CLICK(1))) { - if (item->TargetState != LS_LADDER_IDLE) + if (item->Animation.TargetState != LS_LADDER_IDLE) { SnapItemToLedge(item, coll); - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; } } } diff --git a/TR5Main/Game/Lara/lara_slide.cpp b/TR5Main/Game/Lara/lara_slide.cpp index acf39b04e..b26935107 100644 --- a/TR5Main/Game/Lara/lara_slide.cpp +++ b/TR5Main/Game/Lara/lara_slide.cpp @@ -28,7 +28,7 @@ void lara_as_slide_forward(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -64,19 +64,19 @@ void lara_as_slide_forward(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_JUMP && TestLaraSlideJump(item, coll)) { - item->TargetState = LS_JUMP_FORWARD; + item->Animation.TargetState = LS_JUMP_FORWARD; StopSoundEffect(SFX_TR4_LARA_SLIPPING); return; } - item->TargetState = LS_SLIDE_FORWARD; + item->Animation.TargetState = LS_SLIDE_FORWARD; return; } if (TrInput & IN_FORWARD) - item->TargetState = LS_RUN_FORWARD; + item->Animation.TargetState = LS_RUN_FORWARD; else - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; StopSoundEffect(SFX_TR4_LARA_SLIPPING); return; @@ -88,7 +88,7 @@ void lara_col_slide_forward(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->Airborne = false; + item->Animation.Airborne = false; lara->Control.MoveAngle = item->Position.yRot; coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; @@ -132,7 +132,7 @@ void lara_as_slide_back(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_DEATH; + item->Animation.TargetState = LS_DEATH; return; } @@ -168,16 +168,16 @@ void lara_as_slide_back(ITEM_INFO* item, COLL_INFO* coll) if (TrInput & IN_JUMP && TestLaraSlideJump(item, coll)) { - item->TargetState = LS_JUMP_BACK; + item->Animation.TargetState = LS_JUMP_BACK; StopSoundEffect(SFX_TR4_LARA_SLIPPING); return; } - item->TargetState = LS_SLIDE_BACK; + item->Animation.TargetState = LS_SLIDE_BACK; return; } - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; StopSoundEffect(SFX_TR4_LARA_SLIPPING); return; } @@ -188,7 +188,7 @@ void lara_col_slide_back(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->Airborne = false; + item->Animation.Airborne = false; lara->Control.MoveAngle = item->Position.yRot + ANGLE(180.0f); coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -STEPUP_HEIGHT; diff --git a/TR5Main/Game/Lara/lara_struct.h b/TR5Main/Game/Lara/lara_struct.h index 614160b75..cde5e0da4 100644 --- a/TR5Main/Game/Lara/lara_struct.h +++ b/TR5Main/Game/Lara/lara_struct.h @@ -903,8 +903,8 @@ enum class HandStatus { Free, Busy, - DrawWeapon, - UndrawWeapon, + WeaponDraw, + WeaponUndraw, WeaponReady, Special }; diff --git a/TR5Main/Game/Lara/lara_surface.cpp b/TR5Main/Game/Lara/lara_surface.cpp index e6587076f..14bf40b2b 100644 --- a/TR5Main/Game/Lara/lara_surface.cpp +++ b/TR5Main/Game/Lara/lara_surface.cpp @@ -60,13 +60,13 @@ void lara_as_surftread(ITEM_INFO* item, COLL_INFO* coll) { auto* lara = GetLaraInfo(item); - item->VerticalVelocity -= 4; - if (item->VerticalVelocity < 0) - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity -= 4; + if (item->Animation.VerticalVelocity < 0) + item->Animation.VerticalVelocity = 0; if (item->HitPoints <= 0) { - item->TargetState = LS_WATER_DEATH; + item->Animation.TargetState = LS_WATER_DEATH; return; } @@ -91,31 +91,31 @@ void lara_as_surftread(ITEM_INFO* item, COLL_INFO* coll) } else if (TrInput & IN_FORWARD) { - item->TargetState = LS_ONWATER_FORWARD; + item->Animation.TargetState = LS_ONWATER_FORWARD; return; } else if (TrInput & IN_BACK) { - item->TargetState = LS_ONWATER_BACK; + item->Animation.TargetState = LS_ONWATER_BACK; return; } else if (TrInput & IN_ROLL) { - item->TargetState = LS_ROLL_FORWARD; + item->Animation.TargetState = LS_ROLL_FORWARD; return; } else if (TrInput & IN_LSTEP) { - item->TargetState = LS_ONWATER_LEFT; + item->Animation.TargetState = LS_ONWATER_LEFT; return; } else if (TrInput & IN_RSTEP) { - item->TargetState = LS_ONWATER_RIGHT; + item->Animation.TargetState = LS_ONWATER_RIGHT; return; } - item->TargetState = LS_ONWATER_STOP; + item->Animation.TargetState = LS_ONWATER_STOP; lara->Control.Count.Dive = 0; } @@ -125,7 +125,7 @@ void lara_as_surfright(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_WATER_DEATH; + item->Animation.TargetState = LS_WATER_DEATH; return; } @@ -137,11 +137,11 @@ void lara_as_surfright(ITEM_INFO* item, COLL_INFO* coll) item->Position.yRot += ANGLE(2.0f); if (!(TrInput & IN_RSTEP)) - item->TargetState = LS_ONWATER_STOP; + item->Animation.TargetState = LS_ONWATER_STOP; - item->VerticalVelocity += 8; - if (item->VerticalVelocity > 60) - item->VerticalVelocity = 60; + item->Animation.VerticalVelocity += 8; + if (item->Animation.VerticalVelocity > 60) + item->Animation.VerticalVelocity = 60; } void lara_as_surfleft(ITEM_INFO* item, COLL_INFO* coll) @@ -150,7 +150,7 @@ void lara_as_surfleft(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_WATER_DEATH; + item->Animation.TargetState = LS_WATER_DEATH; return; } @@ -162,11 +162,11 @@ void lara_as_surfleft(ITEM_INFO* item, COLL_INFO* coll) item->Position.yRot += ANGLE(2.0f); if (!(TrInput & IN_LSTEP)) - item->TargetState = LS_ONWATER_STOP; + item->Animation.TargetState = LS_ONWATER_STOP; - item->VerticalVelocity += 8; - if (item->VerticalVelocity > 60) - item->VerticalVelocity = 60; + item->Animation.VerticalVelocity += 8; + if (item->Animation.VerticalVelocity > 60) + item->Animation.VerticalVelocity = 60; } void lara_as_surfback(ITEM_INFO* item, COLL_INFO* coll) @@ -175,7 +175,7 @@ void lara_as_surfback(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_WATER_DEATH; + item->Animation.TargetState = LS_WATER_DEATH; return; } @@ -187,11 +187,11 @@ void lara_as_surfback(ITEM_INFO* item, COLL_INFO* coll) item->Position.yRot += ANGLE(2.0f); if (!(TrInput & IN_BACK)) - item->TargetState = LS_ONWATER_STOP; + item->Animation.TargetState = LS_ONWATER_STOP; - item->VerticalVelocity += 8; - if (item->VerticalVelocity > 60) - item->VerticalVelocity = 60; + item->Animation.VerticalVelocity += 8; + if (item->Animation.VerticalVelocity > 60) + item->Animation.VerticalVelocity = 60; } void lara_as_surfswim(ITEM_INFO* item, COLL_INFO* coll) @@ -200,7 +200,7 @@ void lara_as_surfswim(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_WATER_DEATH; + item->Animation.TargetState = LS_WATER_DEATH; return; } @@ -212,13 +212,13 @@ void lara_as_surfswim(ITEM_INFO* item, COLL_INFO* coll) item->Position.yRot += ANGLE(4.0f); if (!(TrInput & IN_FORWARD)) - item->TargetState = LS_ONWATER_STOP; + item->Animation.TargetState = LS_ONWATER_STOP; if (TrInput & IN_JUMP) - item->TargetState = LS_ONWATER_STOP; + item->Animation.TargetState = LS_ONWATER_STOP; - item->VerticalVelocity += 8; - if (item->VerticalVelocity > 60) - item->VerticalVelocity = 60; + item->Animation.VerticalVelocity += 8; + if (item->Animation.VerticalVelocity > 60) + item->Animation.VerticalVelocity = 60; } void lara_as_waterout(ITEM_INFO* item, COLL_INFO* coll) diff --git a/TR5Main/Game/Lara/lara_swim.cpp b/TR5Main/Game/Lara/lara_swim.cpp index 661263a05..9885105fa 100644 --- a/TR5Main/Game/Lara/lara_swim.cpp +++ b/TR5Main/Game/Lara/lara_swim.cpp @@ -58,7 +58,7 @@ void lara_col_swim(ITEM_INFO* item, COLL_INFO* coll) void lara_as_waterroll(ITEM_INFO* item, COLL_INFO* coll) { - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } void lara_as_uwdeath(ITEM_INFO* item, COLL_INFO* coll) @@ -67,9 +67,9 @@ void lara_as_uwdeath(ITEM_INFO* item, COLL_INFO* coll) lara->Control.CanLook = false; - item->VerticalVelocity -= 8; - if (item->VerticalVelocity <= 0) - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity -= 8; + if (item->Animation.VerticalVelocity <= 0) + item->Animation.VerticalVelocity = 0; if (item->Position.xRot < -ANGLE(2.0f) || item->Position.xRot > ANGLE(2.0f)) @@ -97,7 +97,7 @@ void lara_as_tread(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_WATER_DEATH; + item->Animation.TargetState = LS_WATER_DEATH; return; } @@ -116,11 +116,11 @@ void lara_as_tread(ITEM_INFO* item, COLL_INFO* coll) SwimTurn(item, coll); if (TrInput & IN_JUMP) - item->TargetState = LS_UNDERWATER_FORWARD; + item->Animation.TargetState = LS_UNDERWATER_FORWARD; - item->VerticalVelocity -= 6; - if (item->VerticalVelocity < 0) - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity -= 6; + if (item->Animation.VerticalVelocity < 0) + item->Animation.VerticalVelocity = 0; if (lara->Control.HandStatus == HandStatus::Busy) lara->Control.HandStatus = HandStatus::Free; @@ -132,7 +132,7 @@ void lara_as_glide(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_WATER_DEATH; + item->Animation.TargetState = LS_WATER_DEATH; return; } @@ -148,14 +148,14 @@ void lara_as_glide(ITEM_INFO* item, COLL_INFO* coll) SwimTurnSubsuit(item); if (TrInput & IN_JUMP) - item->TargetState = LS_UNDERWATER_FORWARD; + item->Animation.TargetState = LS_UNDERWATER_FORWARD; - item->VerticalVelocity -= 6; - if (item->VerticalVelocity < 0) - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity -= 6; + if (item->Animation.VerticalVelocity < 0) + item->Animation.VerticalVelocity = 0; - if (item->VerticalVelocity <= 133) - item->TargetState = LS_UNDERWATER_STOP; + if (item->Animation.VerticalVelocity <= 133) + item->Animation.TargetState = LS_UNDERWATER_STOP; } void lara_as_swim(ITEM_INFO* item, COLL_INFO* coll) @@ -164,7 +164,7 @@ void lara_as_swim(ITEM_INFO* item, COLL_INFO* coll) if (item->HitPoints <= 0) { - item->TargetState = LS_WATER_DEATH; + item->Animation.TargetState = LS_WATER_DEATH; return; } @@ -179,12 +179,12 @@ void lara_as_swim(ITEM_INFO* item, COLL_INFO* coll) else SwimTurnSubsuit(item); - item->VerticalVelocity += 8; - if (item->VerticalVelocity > 200) - item->VerticalVelocity = 200; + item->Animation.VerticalVelocity += 8; + if (item->Animation.VerticalVelocity > 200) + item->Animation.VerticalVelocity = 200; if (!(TrInput & IN_JUMP)) - item->TargetState = LS_UNDERWATER_INERTIA; + item->Animation.TargetState = LS_UNDERWATER_INERTIA; } void UpdateSubsuitAngles(ITEM_INFO* item) @@ -197,8 +197,8 @@ void UpdateSubsuitAngles(ITEM_INFO* item) lara->Control.Subsuit.VerticalVelocity = ceil((15 / 16) * lara->Control.Subsuit.VerticalVelocity - 1); } - lara->Control.Subsuit.Velocity[0] = -4 * item->VerticalVelocity; - lara->Control.Subsuit.Velocity[1] = -4 * item->VerticalVelocity; + lara->Control.Subsuit.Velocity[0] = -4 * item->Animation.VerticalVelocity; + lara->Control.Subsuit.Velocity[1] = -4 * item->Animation.VerticalVelocity; if (lara->Control.Subsuit.XRot >= lara->Control.Subsuit.DXRot) { @@ -315,9 +315,9 @@ void SwimDive(ITEM_INFO* item) auto* lara = GetLaraInfo(item); SetAnimation(item, LA_ONWATER_DIVE); - item->TargetState = LS_UNDERWATER_FORWARD; + item->Animation.TargetState = LS_UNDERWATER_FORWARD; item->Position.xRot = ANGLE(-45.0f); - item->VerticalVelocity = 80; + item->Animation.VerticalVelocity = 80; lara->Control.WaterStatus = WaterStatus::Underwater; } @@ -376,12 +376,12 @@ void LaraWaterCurrent(ITEM_INFO* item, COLL_INFO* coll) else if (item->Position.xRot < -ANGLE(35.0f)) item->Position.xRot -= ANGLE(1.0f); else - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } else if (coll->CollisionType == CT_TOP) item->Position.xRot -= ANGLE(1.0f); else if (coll->CollisionType == CT_TOP_FRONT) - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; else if (coll->CollisionType == CT_LEFT) item->Position.yRot += ANGLE(5.0f); else if (coll->CollisionType == CT_RIGHT) diff --git a/TR5Main/Game/Lara/lara_tests.cpp b/TR5Main/Game/Lara/lara_tests.cpp index 36c285e2a..abc72b719 100644 --- a/TR5Main/Game/Lara/lara_tests.cpp +++ b/TR5Main/Game/Lara/lara_tests.cpp @@ -101,9 +101,9 @@ bool TestLaraKeepLow(ITEM_INFO* item, COLL_INFO* coll) // HACK: coll->Setup.Radius is currently only set to // LARA_RAD_CRAWL in the collision function, then reset by LaraAboveWater(). // For tests called in control functions, then, it will store the wrong radius. @Sezz 2021.11.05 - auto radius = (item->ActiveState == LS_CROUCH_IDLE || - item->ActiveState == LS_CROUCH_TURN_LEFT || - item->ActiveState == LS_CROUCH_TURN_RIGHT) + auto radius = (item->Animation.ActiveState == LS_CROUCH_IDLE || + item->Animation.ActiveState == LS_CROUCH_TURN_LEFT || + item->Animation.ActiveState == LS_CROUCH_TURN_RIGHT) ? LARA_RAD : LARA_RAD_CRAWL; auto y = item->Position.yPos; @@ -149,9 +149,9 @@ bool TestLaraHangJumpUp(ITEM_INFO* item, COLL_INFO* coll) if (TestLaraMonkeyGrab(item, coll)) { SetAnimation(item, LA_JUMP_UP_TO_MONKEY); - item->Velocity = 0; - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; item->Position.yPos += coll->Middle.Ceiling + (LARA_HEIGHT_MONKEY - coll->Setup.Height); lara->Control.HandStatus = HandStatus::Busy; return true; @@ -185,9 +185,9 @@ bool TestLaraHangJumpUp(ITEM_INFO* item, COLL_INFO* coll) else SnapItemToLedge(item, coll); - item->Velocity = 0; - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; lara->Control.HandStatus = HandStatus::Busy; lara->ExtraTorsoRot = PHD_3DPOS(); return true; @@ -204,9 +204,9 @@ bool TestLaraHangJump(ITEM_INFO* item, COLL_INFO* coll) { SetAnimation(item, LA_REACH_TO_MONKEY); ResetLaraFlex(item); - item->Velocity = 0; - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; item->Position.yPos += coll->Middle.Ceiling + (LARA_HEIGHT_MONKEY - coll->Setup.Height); lara->Control.HandStatus = HandStatus::Busy; return true; @@ -253,9 +253,9 @@ bool TestLaraHangJump(ITEM_INFO* item, COLL_INFO* coll) else SnapItemToLedge(item, coll, 0.2f); - item->Velocity = 2; - item->VerticalVelocity = 1; - item->Airborne = true; + item->Animation.Velocity = 2; + item->Animation.VerticalVelocity = 1; + item->Animation.Airborne = true; lara->Control.HandStatus = HandStatus::Busy; return true; } @@ -317,8 +317,8 @@ bool TestLaraHang(ITEM_INFO* item, COLL_INFO* coll) if (!TestLaraHangOnClimbWall(item, coll)) { - if (item->AnimNumber != LA_LADDER_TO_HANG_RIGHT && - item->AnimNumber != LA_LADDER_TO_HANG_LEFT) + if (item->Animation.AnimNumber != LA_LADDER_TO_HANG_RIGHT && + item->Animation.AnimNumber != LA_LADDER_TO_HANG_LEFT) { LaraSnapToEdgeOfBlock(item, coll, GetQuadrant(item->Position.yRot)); item->Position.yPos = coll->Setup.OldPosition.y; @@ -329,10 +329,10 @@ bool TestLaraHang(ITEM_INFO* item, COLL_INFO* coll) } else { - if (item->AnimNumber == LA_REACH_TO_HANG && item->FrameNumber == GetFrameNumber(item, 21) && + if (item->Animation.AnimNumber == LA_REACH_TO_HANG && item->Animation.FrameNumber == GetFrameNumber(item, 21) && TestLaraClimbStance(item, coll)) { - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; } } } @@ -340,9 +340,9 @@ bool TestLaraHang(ITEM_INFO* item, COLL_INFO* coll) { SetAnimation(item, LA_FALL_START); item->Position.yPos += 256; - item->Airborne = true; - item->Velocity = 2; - item->VerticalVelocity = 1; + item->Animation.Airborne = true; + item->Animation.Velocity = 2; + item->Animation.VerticalVelocity = 1; lara->Control.HandStatus = HandStatus::Free; } } @@ -387,7 +387,7 @@ bool TestLaraHang(ITEM_INFO* item, COLL_INFO* coll) coll->Middle.Ceiling < 0 && coll->CollisionType == CT_FRONT && !coll->HitStatic && abs(verticalShift) < SLOPE_DIFFERENCE && TestValidLedgeAngle(item, coll)) { - if (item->Velocity != 0) + if (item->Animation.Velocity != 0) SnapItemToLedge(item, coll); item->Position.yPos += verticalShift; @@ -398,8 +398,8 @@ bool TestLaraHang(ITEM_INFO* item, COLL_INFO* coll) item->Position.yPos = coll->Setup.OldPosition.y; item->Position.zPos = coll->Setup.OldPosition.z; - if (item->ActiveState == LS_SHIMMY_LEFT || - item->ActiveState == LS_SHIMMY_RIGHT) + if (item->Animation.ActiveState == LS_SHIMMY_LEFT || + item->Animation.ActiveState == LS_SHIMMY_RIGHT) { SetAnimation(item, LA_REACH_TO_HANG, 21); } @@ -413,9 +413,9 @@ bool TestLaraHang(ITEM_INFO* item, COLL_INFO* coll) item->Position.xPos += coll->Shift.x; item->Position.yPos += GetBoundsAccurate(item)->Y2 * 1.8f; item->Position.zPos += coll->Shift.z; - item->Airborne = true; - item->Velocity = 2; - item->VerticalVelocity = 1; + item->Animation.Airborne = true; + item->Animation.Velocity = 2; + item->Animation.VerticalVelocity = 1; lara->Control.HandStatus = HandStatus::Free; } } @@ -495,7 +495,7 @@ CornerResult TestLaraHangCorner(ITEM_INFO* item, COLL_INFO* coll, float testAngl auto* lara = GetLaraInfo(item); // Lara isn't in stop state yet, bypass test - if (item->AnimNumber != LA_REACH_TO_HANG) + if (item->Animation.AnimNumber != LA_REACH_TO_HANG) return CornerResult::None; // Static is in the way, bypass test @@ -632,7 +632,7 @@ bool TestLaraValidHangPos(ITEM_INFO* item, COLL_INFO* coll) coll->Setup.LowerFloorBound = NO_LOWER_BOUND; coll->Setup.UpperFloorBound = -CLICK(2); coll->Setup.LowerCeilingBound = 0; - coll->Setup.Mode = CollProbeMode::FreeFlat; + coll->Setup.Mode = CollisionProbeMode::FreeFlat; coll->Setup.ForwardAngle = lara->Control.MoveAngle; GetCollisionInfo(coll, item); @@ -686,14 +686,14 @@ bool TestLaraHangOnClimbWall(ITEM_INFO* item, COLL_INFO* coll) if (!lara->Control.CanClimbLadder) return false; - if (item->VerticalVelocity < 0) + if (item->Animation.VerticalVelocity < 0) return false; // HACK: Climb wall tests are highly fragile and depend on quadrant shifts. // Until climb wall tests are fully refactored, we need to recalculate COLL_INFO. auto coll2 = *coll; - coll2.Setup.Mode = CollProbeMode::Quadrants; + coll2.Setup.Mode = CollisionProbeMode::Quadrants; GetCollisionInfo(&coll2, item); switch (GetQuadrant(item->Position.yRot)) @@ -744,14 +744,14 @@ int TestLaraEdgeCatch(ITEM_INFO* item, COLL_INFO* coll, int* edge) BOUNDING_BOX* bounds = GetBoundsAccurate(item); int hdif = coll->Front.Floor - bounds->Y1; - if (hdif < 0 == hdif + item->VerticalVelocity < 0) + if (hdif < 0 == hdif + item->Animation.VerticalVelocity < 0) { hdif = item->Position.yPos + bounds->Y1; - if ((hdif + item->VerticalVelocity & 0xFFFFFF00) != (hdif & 0xFFFFFF00)) + if ((hdif + item->Animation.VerticalVelocity & 0xFFFFFF00) != (hdif & 0xFFFFFF00)) { - if (item->VerticalVelocity > 0) - *edge = (hdif + item->VerticalVelocity) & 0xFFFFFF00; + if (item->Animation.VerticalVelocity > 0) + *edge = (hdif + item->Animation.VerticalVelocity) & 0xFFFFFF00; else *edge = hdif & 0xFFFFFF00; @@ -870,7 +870,7 @@ int LaraFloorFront(ITEM_INFO* item, short angle, int distance) return LaraCollisionFront(item, angle, distance).Position.Floor; } -COLL_RESULT LaraCollisionFront(ITEM_INFO* item, short angle, int distance) +CollisionResult LaraCollisionFront(ITEM_INFO* item, short angle, int distance) { auto probe = GetCollisionResult(item, angle, distance, -LARA_HEIGHT); @@ -880,7 +880,7 @@ COLL_RESULT LaraCollisionFront(ITEM_INFO* item, short angle, int distance) return probe; } -COLL_RESULT LaraCollisionAboveFront(ITEM_INFO* item, short angle, int distance, int height) +CollisionResult LaraCollisionAboveFront(ITEM_INFO* item, short angle, int distance, int height) { int x = item->Position.xPos + distance * phd_sin(angle); int y = item->Position.yPos - height; @@ -894,7 +894,7 @@ int LaraCeilingFront(ITEM_INFO* item, short angle, int distance, int height) return LaraCeilingCollisionFront(item, angle, distance, height).Position.Ceiling; } -COLL_RESULT LaraCeilingCollisionFront(ITEM_INFO* item, short angle, int distance, int height) +CollisionResult LaraCeilingCollisionFront(ITEM_INFO* item, short angle, int distance, int height) { auto probe = GetCollisionResult(item, angle, distance, -height); @@ -956,8 +956,8 @@ bool TestLaraLand(ITEM_INFO* item, COLL_INFO* coll) //int heightFromFloor = GetCollisionResult(item).Position.Floor - item->Position.yPos; //if (item->VerticalVelocity >= 0 && - if (item->Airborne && item->VerticalVelocity > 0 && - (coll->Middle.Floor <= item->VerticalVelocity || + if (item->Animation.Airborne && item->Animation.VerticalVelocity > 0 && + (coll->Middle.Floor <= item->Animation.VerticalVelocity || TestEnvironment(ENV_FLAG_SWAMP, item))) { return true; @@ -982,7 +982,7 @@ bool TestLaraWaterStepOut(ITEM_INFO* item, COLL_INFO* coll) else { SetAnimation(item, LA_ONWATER_TO_WADE_1_STEP); - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; } item->Position.yPos += coll->Middle.Floor + CLICK(2.75f) - 9; @@ -990,9 +990,9 @@ bool TestLaraWaterStepOut(ITEM_INFO* item, COLL_INFO* coll) item->Position.xRot = 0; item->Position.zRot = 0; - item->Velocity = 0; - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; lara->Control.WaterStatus = WaterStatus::Wade; return true; @@ -1069,10 +1069,10 @@ bool TestLaraWaterClimbOut(ITEM_INFO* item, COLL_INFO* coll) SnapItemToLedge(item, coll, 1.7f); item->Position.yPos += frontFloor - 5; - item->ActiveState = LS_ONWATER_EXIT; - item->Airborne = false; - item->Velocity = 0; - item->VerticalVelocity = 0; + item->Animation.ActiveState = LS_ONWATER_EXIT; + item->Animation.Airborne = false; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; lara->Control.HandStatus = HandStatus::Busy; lara->Control.WaterStatus = WaterStatus::Dry; @@ -1133,16 +1133,16 @@ bool TestLaraLadderClimbOut(ITEM_INFO* item, COLL_INFO* coll) // NEW function fo } SetAnimation(item, LA_ONWATER_IDLE); - item->TargetState = LS_LADDER_IDLE; + item->Animation.TargetState = LS_LADDER_IDLE; AnimateLara(item); item->Position.yRot = rot; item->Position.yPos -= 10;//otherwise she falls back into the water item->Position.xRot = 0; item->Position.zRot = 0; - item->Velocity = 0; - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; lara->Control.TurnRate = 0; lara->Control.HandStatus = HandStatus::Busy; lara->Control.WaterStatus = WaterStatus::Dry; @@ -1159,7 +1159,7 @@ void TestLaraWaterDepth(ITEM_INFO* item, COLL_INFO* coll) if (waterDepth == NO_HEIGHT) { - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; item->Position.xPos = coll->Setup.OldPosition.x; item->Position.yPos = coll->Setup.OldPosition.y; item->Position.zPos = coll->Setup.OldPosition.z; @@ -1169,12 +1169,12 @@ void TestLaraWaterDepth(ITEM_INFO* item, COLL_INFO* coll) else if (waterDepth <= LARA_HEIGHT - LARA_HEADROOM / 2) { SetAnimation(item, LA_UNDERWATER_TO_STAND); - item->TargetState = LS_IDLE; + item->Animation.TargetState = LS_IDLE; item->Position.zRot = 0; item->Position.xRot = 0; - item->Velocity = 0; - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; item->Position.yPos = GetFloorHeight(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos); lara->Control.WaterStatus = WaterStatus::Wade; } @@ -2115,10 +2115,10 @@ bool TestAndDoLaraLadderClimb(ITEM_INFO* item, COLL_INFO* coll) { // TODO: Somehow harmonise CalculatedJumpVelocity to work for both ledge and ladder auto jumps, because otherwise there will be a need for an odd workaround in the future. lara->Control.CalculatedJumpVelocity = -3 - sqrt(-9600 - 12 * std::max((vaultResult.Height - item->Position.yPos + CLICK(0.2f)), -CLICK(7.1f))); - item->AnimNumber = LA_STAND_SOLID; - item->FrameNumber = GetFrameNumber(item, 0); - item->TargetState = LS_JUMP_UP; - item->ActiveState = LS_IDLE; + item->Animation.AnimNumber = LA_STAND_SOLID; + item->Animation.FrameNumber = GetFrameNumber(item, 0); + item->Animation.TargetState = LS_JUMP_UP; + item->Animation.ActiveState = LS_IDLE; lara->Control.HandStatus = HandStatus::Busy; lara->Control.TurnRate = 0; @@ -2135,10 +2135,10 @@ bool TestAndDoLaraLadderClimb(ITEM_INFO* item, COLL_INFO* coll) if (vaultResult.Success && TestLaraClimbStance(item, coll)) { - item->AnimNumber = LA_STAND_SOLID; - item->FrameNumber = GetFrameNumber(item, 0); - item->TargetState = LS_LADDER_IDLE; - item->ActiveState = LS_IDLE; + item->Animation.AnimNumber = LA_STAND_SOLID; + item->Animation.FrameNumber = GetFrameNumber(item, 0); + item->Animation.TargetState = LS_LADDER_IDLE; + item->Animation.ActiveState = LS_IDLE; lara->Control.HandStatus = HandStatus::Busy; lara->Control.TurnRate = 0; diff --git a/TR5Main/Game/Lara/lara_tests.h b/TR5Main/Game/Lara/lara_tests.h index 28db310ca..f0875f1a1 100644 --- a/TR5Main/Game/Lara/lara_tests.h +++ b/TR5Main/Game/Lara/lara_tests.h @@ -30,9 +30,9 @@ bool TestLaraFacingCorner(ITEM_INFO* item, short angle, int distance); int LaraFloorFront(ITEM_INFO* item, short angle, int distance); int LaraCeilingFront(ITEM_INFO* item, short angle, int distance, int height); -COLL_RESULT LaraCollisionFront(ITEM_INFO* item, short angle, int distance); -COLL_RESULT LaraCeilingCollisionFront(ITEM_INFO* item, short angle, int distance, int height); -COLL_RESULT LaraCollisionAboveFront(ITEM_INFO* item, short angle, int distance, int height); +CollisionResult LaraCollisionFront(ITEM_INFO* item, short angle, int distance); +CollisionResult LaraCeilingCollisionFront(ITEM_INFO* item, short angle, int distance, int height); +CollisionResult LaraCollisionAboveFront(ITEM_INFO* item, short angle, int distance, int height); bool TestLaraFall(ITEM_INFO* item, COLL_INFO* coll); bool TestLaraMonkeyGrab(ITEM_INFO* item, COLL_INFO* coll); diff --git a/TR5Main/Game/animation.cpp b/TR5Main/Game/animation.cpp index 19d9b568d..0256e900d 100644 --- a/TR5Main/Game/animation.cpp +++ b/TR5Main/Game/animation.cpp @@ -24,16 +24,16 @@ void AnimateLara(ITEM_INFO* item) { auto* lara = GetLaraInfo(item); - item->FrameNumber++; + item->Animation.FrameNumber++; - auto* anim = &g_Level.Anims[item->AnimNumber]; + auto* anim = &g_Level.Anims[item->Animation.AnimNumber]; if (anim->numberChanges > 0 && GetChange(item, anim)) { - anim = &g_Level.Anims[item->AnimNumber]; - item->ActiveState = anim->ActiveState; + anim = &g_Level.Anims[item->Animation.AnimNumber]; + item->Animation.ActiveState = anim->ActiveState; } - if (item->FrameNumber > anim->frameEnd) + if (item->Animation.FrameNumber > anim->frameEnd) { if (anim->numberCommands > 0) { @@ -49,12 +49,12 @@ void AnimateLara(ITEM_INFO* item) break; case COMMAND_JUMP_VELOCITY: - item->VerticalVelocity = *(cmd++); - item->Velocity = *(cmd++); - item->Airborne = true; + item->Animation.VerticalVelocity = *(cmd++); + item->Animation.Velocity = *(cmd++); + item->Animation.Airborne = true; if (lara->Control.CalculatedJumpVelocity) { - item->VerticalVelocity = lara->Control.CalculatedJumpVelocity; + item->Animation.VerticalVelocity = lara->Control.CalculatedJumpVelocity; lara->Control.CalculatedJumpVelocity = 0; } break; @@ -75,11 +75,11 @@ void AnimateLara(ITEM_INFO* item) } } - item->AnimNumber = anim->jumpAnimNum; - item->FrameNumber = anim->jumpFrameNum; + item->Animation.AnimNumber = anim->jumpAnimNum; + item->Animation.FrameNumber = anim->jumpFrameNum; - anim = &g_Level.Anims[item->AnimNumber]; - item->ActiveState = anim->ActiveState; + anim = &g_Level.Anims[item->Animation.AnimNumber]; + item->Animation.ActiveState = anim->ActiveState; } if (anim->numberCommands > 0) @@ -101,7 +101,7 @@ void AnimateLara(ITEM_INFO* item) break; case COMMAND_SOUND_FX: - if (item->FrameNumber != *cmd) + if (item->Animation.FrameNumber != *cmd) { cmd += 2; break; @@ -119,7 +119,7 @@ void AnimateLara(ITEM_INFO* item) break; case COMMAND_EFFECT: - if (item->FrameNumber != *cmd) + if (item->Animation.FrameNumber != *cmd) { cmd += 2; break; @@ -140,33 +140,33 @@ void AnimateLara(ITEM_INFO* item) int lateral = anim->Xvelocity; if (anim->Xacceleration) - lateral += anim->Xacceleration * (item->FrameNumber - anim->frameBase); - item->LateralVelocity = lateral >>= 16; + lateral += anim->Xacceleration * (item->Animation.FrameNumber - anim->frameBase); + item->Animation.LateralVelocity = lateral >>= 16; - if (item->Airborne) + if (item->Animation.Airborne) { if (TestEnvironment(ENV_FLAG_SWAMP, item)) { - item->Velocity -= item->Velocity >> 3; - if (abs(item->Velocity) < 8) + item->Animation.Velocity -= item->Animation.Velocity >> 3; + if (abs(item->Animation.Velocity) < 8) { - item->Velocity = 0; - item->Airborne = false; + item->Animation.Velocity = 0; + item->Animation.Airborne = false; } - if (item->VerticalVelocity > 128) - item->VerticalVelocity /= 2; - item->VerticalVelocity -= item->VerticalVelocity / 4; - if (item->VerticalVelocity < 4) - item->VerticalVelocity = 4; - item->Position.yPos += item->VerticalVelocity; + if (item->Animation.VerticalVelocity > 128) + item->Animation.VerticalVelocity /= 2; + item->Animation.VerticalVelocity -= item->Animation.VerticalVelocity / 4; + if (item->Animation.VerticalVelocity < 4) + item->Animation.VerticalVelocity = 4; + item->Position.yPos += item->Animation.VerticalVelocity; } else { - int velocity = (anim->velocity + anim->acceleration * (item->FrameNumber - anim->frameBase - 1)); - item->Velocity -= velocity >> 16; - item->Velocity += (velocity + anim->acceleration) >> 16; - item->VerticalVelocity += (item->VerticalVelocity >= 128 ? 1 : GRAVITY); - item->Position.yPos += item->VerticalVelocity; + int velocity = (anim->velocity + anim->acceleration * (item->Animation.FrameNumber - anim->frameBase - 1)); + item->Animation.Velocity -= velocity >> 16; + item->Animation.Velocity += (velocity + anim->acceleration) >> 16; + item->Animation.VerticalVelocity += (item->Animation.VerticalVelocity >= 128 ? 1 : GRAVITY); + item->Position.yPos += item->Animation.VerticalVelocity; } } else @@ -177,28 +177,28 @@ void AnimateLara(ITEM_INFO* item) { velocity = (anim->velocity >> 1); if (anim->acceleration) - velocity += (anim->acceleration * (item->FrameNumber - anim->frameBase)) >> 2; + velocity += (anim->acceleration * (item->Animation.FrameNumber - anim->frameBase)) >> 2; } else { velocity = anim->velocity; if (anim->acceleration) - velocity += anim->acceleration * (item->FrameNumber - anim->frameBase); + velocity += anim->acceleration * (item->Animation.FrameNumber - anim->frameBase); } - item->Velocity = velocity >> 16; + item->Animation.Velocity = velocity >> 16; } // Apply extra velocity. - item->Velocity += lara->ExtraVelocity.x; - item->VerticalVelocity += lara->ExtraVelocity.y; - item->LateralVelocity += lara->ExtraVelocity.z; // TODO + item->Animation.Velocity += lara->ExtraVelocity.x; + item->Animation.VerticalVelocity += lara->ExtraVelocity.y; + item->Animation.LateralVelocity += lara->ExtraVelocity.z; // TODO if (lara->Control.Rope.Ptr != -1) DelAlignLaraToRope(item); if (!lara->Control.IsMoving) - MoveItem(item, lara->Control.MoveAngle, item->Velocity, item->LateralVelocity); + MoveItem(item, lara->Control.MoveAngle, item->Animation.Velocity, item->Animation.LateralVelocity); // Update matrices g_Renderer.updateLaraAnimations(true); @@ -209,19 +209,19 @@ void AnimateItem(ITEM_INFO* item) item->TouchBits = 0; item->HitStatus = false; - item->FrameNumber++; + item->Animation.FrameNumber++; - auto* anim = &g_Level.Anims[item->AnimNumber]; + auto* anim = &g_Level.Anims[item->Animation.AnimNumber]; if (anim->numberChanges > 0 && GetChange(item, anim)) { - anim = &g_Level.Anims[item->AnimNumber]; + anim = &g_Level.Anims[item->Animation.AnimNumber]; - item->ActiveState = anim->ActiveState; - if (item->RequiredState == item->ActiveState) - item->RequiredState = 0; + item->Animation.ActiveState = anim->ActiveState; + if (item->Animation.RequiredState == item->Animation.ActiveState) + item->Animation.RequiredState = 0; } - if (item->FrameNumber > anim->frameEnd) + if (item->Animation.FrameNumber > anim->frameEnd) { if (anim->numberCommands > 0) { @@ -236,9 +236,9 @@ void AnimateItem(ITEM_INFO* item) break; case COMMAND_JUMP_VELOCITY: - item->VerticalVelocity = *(cmd++); - item->Velocity = *(cmd++); - item->Airborne = true; + item->Animation.VerticalVelocity = *(cmd++); + item->Animation.Velocity = *(cmd++); + item->Animation.Airborne = true; break; case COMMAND_DEACTIVATE: @@ -259,18 +259,18 @@ void AnimateItem(ITEM_INFO* item) } } - item->AnimNumber = anim->jumpAnimNum; - item->FrameNumber = anim->jumpFrameNum; + item->Animation.AnimNumber = anim->jumpAnimNum; + item->Animation.FrameNumber = anim->jumpFrameNum; - anim = &g_Level.Anims[item->AnimNumber]; - if (item->ActiveState != anim->ActiveState) + anim = &g_Level.Anims[item->Animation.AnimNumber]; + if (item->Animation.ActiveState != anim->ActiveState) { - item->ActiveState = anim->ActiveState; - item->TargetState = anim->ActiveState; + item->Animation.ActiveState = anim->ActiveState; + item->Animation.TargetState = anim->ActiveState; } - if (item->RequiredState == item->ActiveState) - item->RequiredState = 0; + if (item->Animation.RequiredState == item->Animation.ActiveState) + item->Animation.RequiredState = 0; } if (anim->numberCommands > 0) @@ -292,7 +292,7 @@ void AnimateItem(ITEM_INFO* item) break; case COMMAND_SOUND_FX: - if (item->FrameNumber != *cmd) + if (item->Animation.FrameNumber != *cmd) { cmd += 2; break; @@ -329,7 +329,7 @@ void AnimateItem(ITEM_INFO* item) break; case COMMAND_EFFECT: - if (item->FrameNumber != *cmd) + if (item->Animation.FrameNumber != *cmd) { cmd += 2; break; @@ -349,27 +349,27 @@ void AnimateItem(ITEM_INFO* item) int lateral = 0; - if (item->Airborne) + if (item->Animation.Airborne) { - item->VerticalVelocity += (item->VerticalVelocity >= 128 ? 1 : 6); - item->Position.yPos += item->VerticalVelocity; + item->Animation.VerticalVelocity += (item->Animation.VerticalVelocity >= 128 ? 1 : 6); + item->Position.yPos += item->Animation.VerticalVelocity; } else { int velocity = anim->velocity; if (anim->acceleration) - velocity += anim->acceleration * (item->FrameNumber - anim->frameBase); + velocity += anim->acceleration * (item->Animation.FrameNumber - anim->frameBase); - item->Velocity = velocity >> 16; + item->Animation.Velocity = velocity >> 16; lateral = anim->Xvelocity; if (anim->Xacceleration) - lateral += anim->Xacceleration * (item->FrameNumber - anim->frameBase); + lateral += anim->Xacceleration * (item->Animation.FrameNumber - anim->frameBase); lateral >>= 16; } - MoveItem(item, item->Position.yRot, item->Velocity, lateral); + MoveItem(item, item->Position.yRot, item->Animation.Velocity, lateral); // Update matrices. short itemNumber = item - g_Level.Items.data(); @@ -388,7 +388,7 @@ void TranslateItem(ITEM_INFO* item, int x, int y, int z) bool GetChange(ITEM_INFO* item, ANIM_STRUCT* anim) { - if (item->ActiveState == item->TargetState) + if (item->Animation.ActiveState == item->Animation.TargetState) return false; if (anim->numberChanges <= 0) @@ -397,15 +397,15 @@ bool GetChange(ITEM_INFO* item, ANIM_STRUCT* anim) for (int i = 0; i < anim->numberChanges; i++) { auto* change = &g_Level.Changes[anim->changeIndex + i]; - if (change->TargetState == item->TargetState) + if (change->TargetState == item->Animation.TargetState) { for (int j = 0; j < change->numberRanges; j++) { auto* range = &g_Level.Ranges[change->rangeIndex + j]; - if (item->FrameNumber >= range->startFrame && item->FrameNumber <= range->endFrame) + if (item->Animation.FrameNumber >= range->startFrame && item->Animation.FrameNumber <= range->endFrame) { - item->AnimNumber = range->linkAnimNum; - item->FrameNumber = range->linkFrameNum; + item->Animation.AnimNumber = range->linkAnimNum; + item->Animation.FrameNumber = range->linkFrameNum; return true; } } @@ -451,8 +451,8 @@ ANIM_FRAME* GetBestFrame(ITEM_INFO* item) int GetFrame(ITEM_INFO* item, ANIM_FRAME* framePtr[], int* rate) { - int frame = item->FrameNumber; - auto* anim = &g_Level.Anims[item->AnimNumber]; + int frame = item->Animation.FrameNumber; + auto* anim = &g_Level.Anims[item->Animation.AnimNumber]; framePtr[0] = framePtr[1] = &g_Level.Frames[anim->framePtr]; int rate2 = *rate = anim->interpolation & 0x00ff; frame -= anim->frameBase; @@ -475,12 +475,12 @@ int GetFrame(ITEM_INFO* item, ANIM_FRAME* framePtr[], int* rate) int GetCurrentRelativeFrameNumber(ITEM_INFO* item) { - return item->FrameNumber - GetFrameNumber(item, 0); + return item->Animation.FrameNumber - GetFrameNumber(item, 0); } int GetFrameNumber(ITEM_INFO* item, int frameToStart) { - return GetFrameNumber(item->ObjectNumber, item->AnimNumber, frameToStart); + return GetFrameNumber(item->ObjectNumber, item->Animation.AnimNumber, frameToStart); } int GetFrameNumber(int objectID, int animNumber, int frameToStart) @@ -500,7 +500,7 @@ int GetFrameCount(int animNumber) int GetNextAnimState(ITEM_INFO* item) { - return GetNextAnimState(item->ObjectNumber, item->AnimNumber); + return GetNextAnimState(item->ObjectNumber, item->Animation.AnimNumber); } int GetNextAnimState(int objectID, int animNumber) @@ -519,25 +519,25 @@ void SetAnimation(ITEM_INFO* item, int animIndex, int frameToStart) return; } - if (item->AnimNumber == animIndex) + if (item->Animation.AnimNumber == animIndex) return; - item->AnimNumber = index; - item->FrameNumber = g_Level.Anims[index].frameBase + frameToStart; - item->ActiveState = g_Level.Anims[index].ActiveState; - item->TargetState = item->ActiveState; + item->Animation.AnimNumber = index; + item->Animation.FrameNumber = g_Level.Anims[index].frameBase + frameToStart; + item->Animation.ActiveState = g_Level.Anims[index].ActiveState; + item->Animation.TargetState = item->Animation.ActiveState; } bool TestLastFrame(ITEM_INFO* item, int animNumber) { if (animNumber < 0) - animNumber = item->AnimNumber; + animNumber = item->Animation.AnimNumber; - if (item->AnimNumber != animNumber) + if (item->Animation.AnimNumber != animNumber) return false; auto* anim = &g_Level.Anims[animNumber]; - return (item->FrameNumber >= anim->frameEnd); + return (item->Animation.FrameNumber >= anim->frameEnd); } void DrawAnimatingItem(ITEM_INFO* item) diff --git a/TR5Main/Game/camera.cpp b/TR5Main/Game/camera.cpp index d15b52b85..c29a51ad6 100644 --- a/TR5Main/Game/camera.cpp +++ b/TR5Main/Game/camera.cpp @@ -156,8 +156,8 @@ void MoveCamera(GAME_VECTOR* ideal, int speed) OldCam.pos.xPos != LaraItem->Position.xPos || OldCam.pos.yPos != LaraItem->Position.yPos || OldCam.pos.zPos != LaraItem->Position.zPos || - OldCam.ActiveState != LaraItem->ActiveState || - OldCam.TargetState != LaraItem->TargetState || + OldCam.ActiveState != LaraItem->Animation.ActiveState || + OldCam.TargetState != LaraItem->Animation.TargetState || OldCam.targetDistance != Camera.targetDistance || OldCam.targetElevation != Camera.targetElevation || OldCam.actualElevation != Camera.actualElevation || @@ -178,8 +178,8 @@ void MoveCamera(GAME_VECTOR* ideal, int speed) OldCam.pos.xPos = LaraItem->Position.xPos; OldCam.pos.yPos = LaraItem->Position.yPos; OldCam.pos.zPos = LaraItem->Position.zPos; - OldCam.ActiveState = LaraItem->ActiveState; - OldCam.TargetState = LaraItem->TargetState; + OldCam.ActiveState = LaraItem->Animation.ActiveState; + OldCam.TargetState = LaraItem->Animation.TargetState; OldCam.targetDistance = Camera.targetDistance; OldCam.targetElevation = Camera.targetElevation; OldCam.actualElevation = Camera.actualElevation; @@ -618,7 +618,7 @@ bool CameraCollisionBounds(GAME_VECTOR* ideal, int push, int yFirst) int y = ideal->y; int z = ideal->z; - COLL_RESULT probe; + CollisionResult probe; if (yFirst) { @@ -904,8 +904,8 @@ void LookCamera(ITEM_INFO* item) OldCam.pos.xPos == item->Position.xPos && OldCam.pos.yPos == item->Position.yPos && OldCam.pos.zPos == item->Position.zPos && - OldCam.ActiveState == item->ActiveState && - OldCam.TargetState == item->TargetState && + OldCam.ActiveState == item->Animation.ActiveState && + OldCam.TargetState == item->Animation.TargetState && Camera.oldType == CameraType::Look) { ideal.x = LookCamPosition.x; @@ -923,8 +923,8 @@ void LookCamera(ITEM_INFO* item) OldCam.pos.xPos = item->Position.xPos; OldCam.pos.yPos = item->Position.yPos; OldCam.pos.zPos = item->Position.zPos; - OldCam.ActiveState = item->ActiveState; - OldCam.TargetState = item->TargetState; + OldCam.ActiveState = item->Animation.ActiveState; + OldCam.TargetState = item->Animation.TargetState; LookCamPosition.x = ideal.x; LookCamPosition.y = ideal.y; LookCamPosition.z = ideal.z; diff --git a/TR5Main/Game/collision/collide_item.cpp b/TR5Main/Game/collision/collide_item.cpp index 218c854af..82a90fae4 100644 --- a/TR5Main/Game/collision/collide_item.cpp +++ b/TR5Main/Game/collision/collide_item.cpp @@ -1244,7 +1244,7 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, else // Z crossed boundary. item->Position.yRot = 0x8000 - item->Position.yRot; - item->Velocity /= 2; + item->Animation.Velocity /= 2; /* Put item back in its last position */ item->Position.xPos = x; @@ -1255,21 +1255,21 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, { // Need to know which direction the slope is. - item->Velocity -= (item->Velocity / 4); + item->Animation.Velocity -= (item->Animation.Velocity / 4); if (collResult.FloorTilt.x < 0 && ((abs(collResult.FloorTilt.x)) - (abs(collResult.FloorTilt.y)) >= 2)) // Hit angle = 0x4000 { if (((unsigned short)item->Position.yRot) > 0x8000) { item->Position.yRot = 0x4000 + (0xc000 - (unsigned short)item->Position.yRot - 1); - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); } else { - if (item->Velocity < 32) + if (item->Animation.Velocity < 32) { - item->Velocity -= collResult.FloorTilt.x * 2; + item->Animation.Velocity -= collResult.FloorTilt.x * 2; if ((unsigned short)item->Position.yRot > 0x4000 && (unsigned short)item->Position.yRot < 0xc000) { item->Position.yRot -= 4096; @@ -1284,10 +1284,10 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, } } - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); else - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } } else if (collResult.FloorTilt.x > 0 && ((abs(collResult.FloorTilt.x)) - (abs(collResult.FloorTilt.y)) >= 2)) // Hit angle = 0xc000 @@ -1295,14 +1295,14 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, if (((unsigned short)item->Position.yRot) < 0x8000) { item->Position.yRot = 0xc000 + (0x4000 - (unsigned short)item->Position.yRot - 1); - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); } else { - if (item->Velocity < 32) + if (item->Animation.Velocity < 32) { - item->Velocity += collResult.FloorTilt.x * 2; + item->Animation.Velocity += collResult.FloorTilt.x * 2; if ((unsigned short)item->Position.yRot > 0xc000 || (unsigned short)item->Position.yRot < 0x4000) { item->Position.yRot -= 4096; @@ -1317,10 +1317,10 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, } } - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); else - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } } else if (collResult.FloorTilt.y < 0 && ((abs(collResult.FloorTilt.y)) - (abs(collResult.FloorTilt.x)) >= 2)) // Hit angle = 0 @@ -1328,14 +1328,14 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, if (((unsigned short)item->Position.yRot) > 0x4000 && ((unsigned short)item->Position.yRot) < 0xc000) { item->Position.yRot = (0x8000 - item->Position.yRot - 1); - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); } else { - if (item->Velocity < 32) + if (item->Animation.Velocity < 32) { - item->Velocity -= collResult.FloorTilt.y * 2; + item->Animation.Velocity -= collResult.FloorTilt.y * 2; if ((unsigned short)item->Position.yRot < 0x8000) { @@ -1351,10 +1351,10 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, } } - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); else - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } } else if (collResult.FloorTilt.y > 0 && ((abs(collResult.FloorTilt.y)) - (abs(collResult.FloorTilt.x)) >= 2)) // Hit angle = 0x8000 @@ -1362,14 +1362,14 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, if (((unsigned short)item->Position.yRot) > 0xc000 || ((unsigned short)item->Position.yRot) < 0x4000) { item->Position.yRot = (0x8000 - item->Position.yRot - 1); - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); } else { - if (item->Velocity < 32) + if (item->Animation.Velocity < 32) { - item->Velocity += collResult.FloorTilt.y * 2; + item->Animation.Velocity += collResult.FloorTilt.y * 2; if ((unsigned short)item->Position.yRot > 0x8000) { @@ -1385,10 +1385,10 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, } } - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); else - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } } else if (collResult.FloorTilt.x < 0 && collResult.FloorTilt.y < 0) // Hit angle = 0x2000 @@ -1396,14 +1396,14 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, if (((unsigned short)item->Position.yRot) > 0x6000 && ((unsigned short)item->Position.yRot) < 0xe000) { item->Position.yRot = 0x2000 + (0xa000 - (unsigned short)item->Position.yRot - 1); - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); } else { - if (item->Velocity < 32) + if (item->Animation.Velocity < 32) { - item->Velocity += (-collResult.FloorTilt.x) + (-collResult.FloorTilt.y); + item->Animation.Velocity += (-collResult.FloorTilt.x) + (-collResult.FloorTilt.y); if ((unsigned short)item->Position.yRot > 0x2000 && (unsigned short)item->Position.yRot < 0xa000) { item->Position.yRot -= 4096; @@ -1418,10 +1418,10 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, } } - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); else - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } } else if (collResult.FloorTilt.x < 0 && collResult.FloorTilt.y > 0) // Hit angle = 0x6000 @@ -1429,14 +1429,14 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, if (((unsigned short)item->Position.yRot) > 0xa000 || ((unsigned short)item->Position.yRot) < 0x2000) { item->Position.yRot = 0x6000 + (0xe000 - (unsigned short)item->Position.yRot - 1); - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); } else { - if (item->Velocity < 32) + if (item->Animation.Velocity < 32) { - item->Velocity += (-collResult.FloorTilt.x) + collResult.FloorTilt.y; + item->Animation.Velocity += (-collResult.FloorTilt.x) + collResult.FloorTilt.y; if ((unsigned short)item->Position.yRot < 0xe000 && (unsigned short)item->Position.yRot > 0x6000) { item->Position.yRot -= 4096; @@ -1451,10 +1451,10 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, } } - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); else - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } } else if (collResult.FloorTilt.x > 0 && collResult.FloorTilt.y > 0) // Hit angle = 0xa000 @@ -1462,14 +1462,14 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, if (((unsigned short)item->Position.yRot) > 0xe000 || ((unsigned short)item->Position.yRot) < 0x6000) { item->Position.yRot = 0xa000 + (0x2000 - (unsigned short)item->Position.yRot - 1); - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); } else { - if (item->Velocity < 32) + if (item->Animation.Velocity < 32) { - item->Velocity += collResult.FloorTilt.x + collResult.FloorTilt.y; + item->Animation.Velocity += collResult.FloorTilt.x + collResult.FloorTilt.y; if ((unsigned short)item->Position.yRot < 0x2000 || (unsigned short)item->Position.yRot > 0xa000) { item->Position.yRot -= 4096; @@ -1484,10 +1484,10 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, } } - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); else - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } } else if (collResult.FloorTilt.x > 0 && collResult.FloorTilt.y < 0) // Hit angle = 0xe000 @@ -1495,14 +1495,14 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, if (((unsigned short)item->Position.yRot) > 0x2000 && ((unsigned short)item->Position.yRot) < 0xa000) { item->Position.yRot = 0xe000 + (0x6000 - (unsigned short)item->Position.yRot - 1); - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); } else { - if (item->Velocity < 32) + if (item->Animation.Velocity < 32) { - item->Velocity += collResult.FloorTilt.x + (-collResult.FloorTilt.y); + item->Animation.Velocity += collResult.FloorTilt.x + (-collResult.FloorTilt.y); if ((unsigned short)item->Position.yRot < 0x6000 || (unsigned short)item->Position.yRot > 0xe000) { item->Position.yRot -= 4096; @@ -1517,10 +1517,10 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, } } - if (item->VerticalVelocity > 0) - item->VerticalVelocity = -(item->VerticalVelocity / 2); + if (item->Animation.VerticalVelocity > 0) + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); else - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } } @@ -1532,34 +1532,34 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, else { /* Hit the floor; bounce and slow down */ - if (item->VerticalVelocity > 0) + if (item->Animation.VerticalVelocity > 0) { - if (item->VerticalVelocity > 16) + if (item->Animation.VerticalVelocity > 16) { if (item->ObjectNumber == ID_GRENADE) - item->VerticalVelocity = -(item->VerticalVelocity - (item->VerticalVelocity / 2)); + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity - (item->Animation.VerticalVelocity / 2)); else { - item->VerticalVelocity = -(item->VerticalVelocity / 2); - if (item->VerticalVelocity < -100) - item->VerticalVelocity = -100; + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 2); + if (item->Animation.VerticalVelocity < -100) + item->Animation.VerticalVelocity = -100; } } else { /* Roll on floor */ - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; if (item->ObjectNumber == ID_GRENADE) { - item->RequiredState = 1; + item->Animation.RequiredState = 1; item->Position.xRot = 0; - item->Velocity--; + item->Animation.Velocity--; } else - item->Velocity -= 3; + item->Animation.Velocity -= 3; - if (item->Velocity < 0) - item->Velocity = 0; + if (item->Animation.Velocity < 0) + item->Animation.Velocity = 0; } } item->Position.yPos = collResult.Position.Floor; @@ -1581,34 +1581,34 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, if (item->Position.yPos >= oldCollResult.Position.Floor) { /* Hit the floor; bounce and slow down */ - if (item->VerticalVelocity > 0) + if (item->Animation.VerticalVelocity > 0) { - if (item->VerticalVelocity > 16) + if (item->Animation.VerticalVelocity > 16) { if (item->ObjectNumber == ID_GRENADE) - item->VerticalVelocity = -(item->VerticalVelocity - (item->VerticalVelocity / 2)); + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity - (item->Animation.VerticalVelocity / 2)); else { - item->VerticalVelocity = -(item->VerticalVelocity / 4); - if (item->VerticalVelocity < -100) - item->VerticalVelocity = -100; + item->Animation.VerticalVelocity = -(item->Animation.VerticalVelocity / 4); + if (item->Animation.VerticalVelocity < -100) + item->Animation.VerticalVelocity = -100; } } else { /* Roll on floor */ - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; if (item->ObjectNumber == ID_GRENADE) { - item->RequiredState = 1; + item->Animation.RequiredState = 1; item->Position.xRot = 0; - item->Velocity--; + item->Animation.Velocity--; } else - item->Velocity -= 3; + item->Animation.Velocity -= 3; - if (item->Velocity < 0) - item->Velocity = 0; + if (item->Animation.Velocity < 0) + item->Animation.Velocity = 0; } } item->Position.yPos = oldCollResult.Position.Floor; @@ -1640,9 +1640,9 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, } if (item->ObjectNumber == ID_GRENADE) - item->Velocity -= item->Velocity / 8; + item->Animation.Velocity -= item->Animation.Velocity / 8; else - item->Velocity /= 2; + item->Animation.Velocity /= 2; /* Put item back in its last position */ item->Position.xPos = x; @@ -1652,8 +1652,8 @@ void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, else item->Position.yPos = collResult.Position.Ceiling; - if (item->VerticalVelocity < 0) - item->VerticalVelocity = -item->VerticalVelocity; + if (item->Animation.VerticalVelocity < 0) + item->Animation.VerticalVelocity = -item->Animation.VerticalVelocity; } } } @@ -1751,7 +1751,7 @@ void CreatureCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) int x, z, rx, rz; ANIM_FRAME* frame; - if (item->ObjectNumber != ID_HITMAN || item->ActiveState != LS_INSERT_PUZZLE) + if (item->ObjectNumber != ID_HITMAN || item->Animation.ActiveState != LS_INSERT_PUZZLE) { if (TestBoundsCollide(item, l, coll->Setup.Radius)) { diff --git a/TR5Main/Game/collision/collide_item.h b/TR5Main/Game/collision/collide_item.h index 8d0f0bc39..cb7dd3aa4 100644 --- a/TR5Main/Game/collision/collide_item.h +++ b/TR5Main/Game/collision/collide_item.h @@ -53,4 +53,4 @@ void CreatureCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll); void TrapCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c); void DoProjectileDynamics(short itemNumber, int x, int y, int z, int xv, int yv, int zv); -void DoObjectCollision(ITEM_INFO* item, COLL_INFO* coll); \ No newline at end of file +void DoObjectCollision(ITEM_INFO* item, COLL_INFO* coll); diff --git a/TR5Main/Game/collision/collide_room.cpp b/TR5Main/Game/collision/collide_room.cpp index 6267d6912..a7c4c0d36 100644 --- a/TR5Main/Game/collision/collide_room.cpp +++ b/TR5Main/Game/collision/collide_room.cpp @@ -114,7 +114,7 @@ int FindGridShift(int x, int z) // Overload of GetCollisionResult which can be used to probe collision parameters // from a given item. -COLL_RESULT GetCollisionResult(ITEM_INFO* item, short angle, int distance, int height, int side) +CollisionResult GetCollisionResult(ITEM_INFO* item, short angle, int distance, int height, int side) { float s = phd_sin(angle); float c = phd_cos(angle); @@ -129,7 +129,7 @@ COLL_RESULT GetCollisionResult(ITEM_INFO* item, short angle, int distance, int h // A handy overload of GetCollisionResult which can be used to quickly get collision parameters // such as floor height under specific item. -COLL_RESULT GetCollisionResult(ITEM_INFO* item) +CollisionResult GetCollisionResult(ITEM_INFO* item) { auto room = item->RoomNumber; auto floor = GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &room); @@ -145,7 +145,7 @@ COLL_RESULT GetCollisionResult(ITEM_INFO* item) // instead putting modified one returned by GetFloor into return COLL_RESULT structure. // This way, function never modifies any external variables. -COLL_RESULT GetCollisionResult(int x, int y, int z, short roomNumber) +CollisionResult GetCollisionResult(int x, int y, int z, short roomNumber) { auto room = roomNumber; auto floor = GetFloor(x, y, z, &room); @@ -161,9 +161,9 @@ COLL_RESULT GetCollisionResult(int x, int y, int z, short roomNumber) // may be reused instead both GetFloorHeight and GetCeilingHeight calls to increase // readability. -COLL_RESULT GetCollisionResult(FLOOR_INFO* floor, int x, int y, int z) +CollisionResult GetCollisionResult(FLOOR_INFO* floor, int x, int y, int z) { - COLL_RESULT result = {}; + CollisionResult result = {}; // Record coordinates. result.Coordinates.x = x; @@ -241,7 +241,7 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool // Get side probe offsets depending on quadrant. // If unconstrained mode is specified, don't use quadrant. - switch (coll->Setup.Mode == CollProbeMode::Quadrants ? quadrant : -1) + switch (coll->Setup.Mode == CollisionProbeMode::Quadrants ? quadrant : -1) { case 0: xfront = phd_sin(coll->Setup.ForwardAngle) * coll->Setup.Radius; @@ -283,10 +283,10 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool // No valid quadrant, return true probe offsets from object rotation. xfront = phd_sin(coll->Setup.ForwardAngle) * coll->Setup.Radius; zfront = phd_cos(coll->Setup.ForwardAngle) * coll->Setup.Radius; - xleft = (xfront * (coll->Setup.Mode == CollProbeMode::FreeForward ? 0.5f : 1.0f)) + phd_sin(coll->Setup.ForwardAngle - ANGLE(90)) * coll->Setup.Radius; - zleft = (zfront * (coll->Setup.Mode == CollProbeMode::FreeForward ? 0.5f : 1.0f)) + phd_cos(coll->Setup.ForwardAngle - ANGLE(90)) * coll->Setup.Radius; - xright = (xfront * (coll->Setup.Mode == CollProbeMode::FreeForward ? 0.5f : 1.0f)) + phd_sin(coll->Setup.ForwardAngle + ANGLE(90)) * coll->Setup.Radius; - zright = (zfront * (coll->Setup.Mode == CollProbeMode::FreeForward ? 0.5f : 1.0f)) + phd_cos(coll->Setup.ForwardAngle + ANGLE(90)) * coll->Setup.Radius; + xleft = (xfront * (coll->Setup.Mode == CollisionProbeMode::FreeForward ? 0.5f : 1.0f)) + phd_sin(coll->Setup.ForwardAngle - ANGLE(90)) * coll->Setup.Radius; + zleft = (zfront * (coll->Setup.Mode == CollisionProbeMode::FreeForward ? 0.5f : 1.0f)) + phd_cos(coll->Setup.ForwardAngle - ANGLE(90)) * coll->Setup.Radius; + xright = (xfront * (coll->Setup.Mode == CollisionProbeMode::FreeForward ? 0.5f : 1.0f)) + phd_sin(coll->Setup.ForwardAngle + ANGLE(90)) * coll->Setup.Radius; + zright = (zfront * (coll->Setup.Mode == CollisionProbeMode::FreeForward ? 0.5f : 1.0f)) + phd_cos(coll->Setup.ForwardAngle + ANGLE(90)) * coll->Setup.Radius; break; } @@ -299,10 +299,8 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool // TEST 1: TILT AND NEAREST LEDGE CALCULATION auto collResult = GetCollisionResult(x, item->Position.yPos, z, item->RoomNumber); - coll->FloorTiltX = (int)collResult.FloorTilt.x; - coll->FloorTiltZ = (int)collResult.FloorTilt.y; - coll->CeilingTiltX = (int)collResult.CeilingTilt.x; - coll->CeilingTiltZ = (int)collResult.CeilingTilt.y; + coll->FloorTilt = collResult.FloorTilt; + coll->CeilingTilt = collResult.CeilingTilt; coll->NearestLedgeAngle = GetNearestLedgeAngle(item, coll, coll->NearestLedgeDistance); // Debug angle and distance @@ -319,13 +317,13 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool tfLocation = GetRoom(item->Location, x, y, z); height = GetFloorHeight(tfLocation, x, z).value_or(NO_HEIGHT); - tcLocation = GetRoom(item->Location, x, y - item->VerticalVelocity, z); + tcLocation = GetRoom(item->Location, x, y - item->Animation.VerticalVelocity, z); ceiling = GetCeilingHeight(tcLocation, x, z).value_or(NO_HEIGHT); } else { height = collResult.Position.Floor; - ceiling = GetCeiling(collResult.Block, x, y - item->VerticalVelocity, z); + ceiling = GetCeiling(collResult.Block, x, y - item->Animation.VerticalVelocity, z); } if (height != NO_HEIGHT) height -= (playerCollision ? yPos : y); if (ceiling != NO_HEIGHT) ceiling -= y; @@ -355,13 +353,13 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool tfLocation = GetRoom(tfLocation, x, y, z); height = GetFloorHeight(tfLocation, x, z).value_or(NO_HEIGHT); - tcLocation = GetRoom(tcLocation, x, y - item->VerticalVelocity, z); + tcLocation = GetRoom(tcLocation, x, y - item->Animation.VerticalVelocity, z); ceiling = GetCeilingHeight(tcLocation, x, z).value_or(NO_HEIGHT); } else { height = collResult.Position.Floor; - ceiling = GetCeiling(collResult.Block, x, y - item->VerticalVelocity, z); + ceiling = GetCeiling(collResult.Block, x, y - item->Animation.VerticalVelocity, z); } if (height != NO_HEIGHT) height -= (playerCollision ? yPos : y); if (ceiling != NO_HEIGHT) ceiling -= y; @@ -426,13 +424,13 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool lrfLocation = GetRoom(item->Location, x, y, z); height = GetFloorHeight(lrfLocation, x, z).value_or(NO_HEIGHT); - lrcLocation = GetRoom(item->Location, x, y - item->VerticalVelocity, z); + lrcLocation = GetRoom(item->Location, x, y - item->Animation.VerticalVelocity, z); ceiling = GetCeilingHeight(lrcLocation, x, z).value_or(NO_HEIGHT); } else { height = collResult.Position.Floor; - ceiling = GetCeiling(collResult.Block, x, y - item->VerticalVelocity, z); + ceiling = GetCeiling(collResult.Block, x, y - item->Animation.VerticalVelocity, z); } if (height != NO_HEIGHT) height -= (playerCollision ? yPos : y); if (ceiling != NO_HEIGHT) ceiling -= y; @@ -479,13 +477,13 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool tfLocation = GetRoom(tfLocation, x, y, z); height = GetFloorHeight(tfLocation, x, z).value_or(NO_HEIGHT); - tcLocation = GetRoom(tcLocation, x, y - item->VerticalVelocity, z); + tcLocation = GetRoom(tcLocation, x, y - item->Animation.VerticalVelocity, z); ceiling = GetCeilingHeight(tcLocation, x, z).value_or(NO_HEIGHT); } else { height = collResult.Position.Floor; - ceiling = GetCeiling(collResult.Block, x, y - item->VerticalVelocity, z); + ceiling = GetCeiling(collResult.Block, x, y - item->Animation.VerticalVelocity, z); } if (height != NO_HEIGHT) height -= (playerCollision ? yPos : y); if (ceiling != NO_HEIGHT) ceiling -= y; @@ -537,13 +535,13 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool lrfLocation = GetRoom(item->Location, x, y, z); height = GetFloorHeight(lrfLocation, x, z).value_or(NO_HEIGHT); - lrcLocation = GetRoom(item->Location, x, y - item->VerticalVelocity, z); + lrcLocation = GetRoom(item->Location, x, y - item->Animation.VerticalVelocity, z); ceiling = GetCeilingHeight(lrcLocation, x, z).value_or(NO_HEIGHT); } else { height = collResult.Position.Floor; - ceiling = GetCeiling(collResult.Block, x, y - item->VerticalVelocity, z); + ceiling = GetCeiling(collResult.Block, x, y - item->Animation.VerticalVelocity, z); } if (height != NO_HEIGHT) height -= (playerCollision ? yPos : y); if (ceiling != NO_HEIGHT) ceiling -= y; @@ -590,13 +588,13 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool tfLocation = GetRoom(tfLocation, x, y, z); height = GetFloorHeight(tfLocation, x, z).value_or(NO_HEIGHT); - tcLocation = GetRoom(tcLocation, x, y - item->VerticalVelocity, z); + tcLocation = GetRoom(tcLocation, x, y - item->Animation.VerticalVelocity, z); ceiling = GetCeilingHeight(tcLocation, x, z).value_or(NO_HEIGHT); } else { height = collResult.Position.Floor; - ceiling = GetCeiling(collResult.Block, x, y - item->VerticalVelocity, z); + ceiling = GetCeiling(collResult.Block, x, y - item->Animation.VerticalVelocity, z); } if (height != NO_HEIGHT) height -= (playerCollision ? yPos : y); if (ceiling != NO_HEIGHT) ceiling -= y; @@ -717,7 +715,7 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool if (coll->TriangleAtLeft() && !coll->MiddleLeft.FloorSlope) { // HACK: Force slight push-out to the left side to avoid stucking - MoveItem(item, coll->Setup.ForwardAngle + ANGLE(8), item->Velocity); + MoveItem(item, coll->Setup.ForwardAngle + ANGLE(8), item->Animation.Velocity); coll->Shift.x = coll->Setup.OldPosition.x - xPos; coll->Shift.z = coll->Setup.OldPosition.z - zPos; @@ -769,7 +767,7 @@ void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool if (coll->TriangleAtRight() && !coll->MiddleRight.FloorSlope) { // HACK: Force slight push-out to the right side to avoid stucking - MoveItem(item, coll->Setup.ForwardAngle - ANGLE(8), item->Velocity); + MoveItem(item, coll->Setup.ForwardAngle - ANGLE(8), item->Animation.Velocity); coll->Shift.x = coll->Setup.OldPosition.x - xPos; coll->Shift.z = coll->Setup.OldPosition.z - zPos; diff --git a/TR5Main/Game/collision/collide_room.h b/TR5Main/Game/collision/collide_room.h index 8978ab7a8..2caa1a0d6 100644 --- a/TR5Main/Game/collision/collide_room.h +++ b/TR5Main/Game/collision/collide_room.h @@ -13,7 +13,7 @@ constexpr auto NO_LOWER_BOUND = -NO_HEIGHT; // used by coll->Setup.LowerFloorBou constexpr auto NO_UPPER_BOUND = NO_HEIGHT; // used by coll->Setup.UpperFloorBound constexpr auto COLLISION_CHECK_DISTANCE = SECTOR(8); -enum COLL_TYPE +enum CollisionType { CT_NONE = 0, // 0x00 CT_FRONT = (1 << 0), // 0x01 @@ -24,7 +24,7 @@ enum COLL_TYPE CT_CLAMP = (1 << 5) // 0x20 }; -enum class CollProbeMode +enum class CollisionProbeMode { Quadrants, FreeForward, @@ -38,7 +38,7 @@ enum class CornerResult Outer }; -struct COLL_POSITION +struct CollisionPosition { int Floor; int Ceiling; @@ -52,7 +52,7 @@ struct COLL_POSITION bool HasFlippedDiagonalSplit() { return HasDiagonalSplit() && SplitAngle != 45.0f * RADIAN; } }; -struct COLL_RESULT +struct CollisionResult { PHD_VECTOR Coordinates; int RoomNumber; @@ -60,14 +60,14 @@ struct COLL_RESULT FLOOR_INFO* Block; FLOOR_INFO* BottomBlock; - COLL_POSITION Position; - Vector2 FloorTilt; - Vector2 CeilingTilt; + CollisionPosition Position; + Vector2 FloorTilt; // x = x, y = z + Vector2 CeilingTilt; // x = x, y = z }; -struct COLL_SETUP +struct CollisionSetup { - CollProbeMode Mode; // Probe rotation mode + CollisionProbeMode Mode; // Probe rotation mode bool CeilingSlopeIsWall; // Treat steep slopes on ceilings as walls bool FloorSlopeIsWall; // Treat steep slopes as walls @@ -93,37 +93,35 @@ struct COLL_SETUP struct COLL_INFO { - COLL_SETUP Setup; // In parameters + CollisionSetup Setup; // In parameters - COLL_POSITION Middle; - COLL_POSITION MiddleLeft; - COLL_POSITION MiddleRight; - COLL_POSITION Front; - COLL_POSITION FrontLeft; - COLL_POSITION FrontRight; + CollisionPosition Middle; + CollisionPosition MiddleLeft; + CollisionPosition MiddleRight; + CollisionPosition Front; + CollisionPosition FrontLeft; + CollisionPosition FrontRight; PHD_VECTOR Shift; - COLL_TYPE CollisionType; + CollisionType CollisionType; + Vector2 FloorTilt; // x = x, y = z + Vector2 CeilingTilt; // x = x, y = z short NearestLedgeAngle; float NearestLedgeDistance; - int FloorTiltX; - int FloorTiltZ; - int CeilingTiltX; - int CeilingTiltZ; bool HitStatic; bool HitTallObject; bool TriangleAtRight() { return MiddleRight.SplitAngle != 0.0f && MiddleRight.SplitAngle == Middle.SplitAngle; } bool TriangleAtLeft() { return MiddleLeft.SplitAngle != 0.0f && MiddleLeft.SplitAngle == Middle.SplitAngle; } - bool DiagonalStepAtRight() { return MiddleRight.DiagonalStep && TriangleAtRight() && (NearestLedgeAngle % ANGLE(90)); } - bool DiagonalStepAtLeft() { return MiddleLeft.DiagonalStep && TriangleAtLeft() && (NearestLedgeAngle % ANGLE(90)); } + bool DiagonalStepAtRight() { return MiddleRight.DiagonalStep && TriangleAtRight() && (NearestLedgeAngle % ANGLE(90.0f)); } + bool DiagonalStepAtLeft() { return MiddleLeft.DiagonalStep && TriangleAtLeft() && (NearestLedgeAngle % ANGLE(90.0f)); } }; -COLL_RESULT GetCollisionResult(ITEM_INFO* item, short angle, int distance, int height = 0, int side = 0); -COLL_RESULT GetCollisionResult(FLOOR_INFO* floor, int x, int y, int z); -COLL_RESULT GetCollisionResult(int x, int y, int z, short roomNumber); -COLL_RESULT GetCollisionResult(ITEM_INFO* item); +CollisionResult GetCollisionResult(ITEM_INFO* item, short angle, int distance, int height = 0, int side = 0); +CollisionResult GetCollisionResult(FLOOR_INFO* floor, int x, int y, int z); +CollisionResult GetCollisionResult(int x, int y, int z, short roomNumber); +CollisionResult GetCollisionResult(ITEM_INFO* item); void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, PHD_VECTOR offset, bool resetRoom = false); void GetCollisionInfo(COLL_INFO* coll, ITEM_INFO* item, bool resetRoom = false); diff --git a/TR5Main/Game/control/box.cpp b/TR5Main/Game/control/box.cpp index 52d638b00..e09425ca0 100644 --- a/TR5Main/Game/control/box.cpp +++ b/TR5Main/Game/control/box.cpp @@ -216,14 +216,14 @@ void AlertAllGuards(short itemNumber) void CreatureKill(ITEM_INFO* item, int killAnim, int killState, int laraKillState) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + killAnim; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = killState; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + killAnim; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = killState; - LaraItem->AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; - LaraItem->ActiveState = 0; - LaraItem->TargetState = laraKillState; + LaraItem->Animation.AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; + LaraItem->Animation.ActiveState = 0; + LaraItem->Animation.TargetState = laraKillState; LaraItem->Position.xPos = item->Position.xPos; LaraItem->Position.yPos = item->Position.yPos; @@ -231,9 +231,9 @@ void CreatureKill(ITEM_INFO* item, int killAnim, int killState, int laraKillStat LaraItem->Position.yRot = item->Position.yRot; LaraItem->Position.xRot = item->Position.xRot; LaraItem->Position.zRot = item->Position.zRot; - LaraItem->VerticalVelocity = 0; - LaraItem->Airborne = false; - LaraItem->VerticalVelocity = 0; + LaraItem->Animation.VerticalVelocity = 0; + LaraItem->Animation.Airborne = false; + LaraItem->Animation.VerticalVelocity = 0; if (item->RoomNumber != LaraItem->RoomNumber) ItemNewRoom(Lara.ItemNumber, item->RoomNumber); @@ -275,7 +275,7 @@ short CreatureEffect(ITEM_INFO* item, BITE_INFO* bite, std::functionx, bite->y, bite->z }; GetJointAbsPosition(item, &pos, bite->meshNum); - return func(pos.x, pos.y, pos.z, item->VerticalVelocity, item->Position.yRot, item->RoomNumber); + return func(pos.x, pos.y, pos.z, item->Animation.VerticalVelocity, item->Position.yRot, item->RoomNumber); } void CreatureUnderwater(ITEM_INFO* item, int depth) @@ -335,7 +335,7 @@ void CreatureFloat(short itemNumber) if (item->Position.yPos <= waterLevel) { - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { item->Position.yPos = waterLevel; item->Collidable = false; @@ -397,7 +397,7 @@ short CreatureTurn(ITEM_INFO* item, short maxTurn) int x = creature->Target.x - item->Position.xPos; int z = creature->Target.z - item->Position.zPos; angle = phd_atan(z, x) - item->Position.yRot; - int range = item->VerticalVelocity * (16384 / maxTurn); + int range = item->Animation.VerticalVelocity * (16384 / maxTurn); int distance = pow(x, 2) + pow(z, 2); if (angle > FRONT_ARC || angle < -FRONT_ARC && distance < pow(range, 2)) @@ -604,7 +604,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt) } short biffAngle; - if (item->ObjectNumber != ID_TYRANNOSAUR && item->VerticalVelocity && item->HitPoints > 0) + if (item->ObjectNumber != ID_TYRANNOSAUR && item->Animation.VerticalVelocity && item->HitPoints > 0) biffAngle = CreatureCreature(itemNumber); else biffAngle = 0; @@ -679,7 +679,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt) floor = GetFloor(item->Position.xPos, y, item->Position.zPos, &roomNumber); item->Floor = GetFloorHeight(floor, item->Position.xPos, y, item->Position.zPos); - angle = (item->VerticalVelocity) ? phd_atan(item->VerticalVelocity, -dy) : 0; + angle = (item->Animation.VerticalVelocity) ? phd_atan(item->Animation.VerticalVelocity, -dy) : 0; if (angle < -ANGLE(20.0f)) angle = -ANGLE(20.0f); else if (angle > ANGLE(20.0f)) @@ -1437,13 +1437,13 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info) if (enemy == LaraItem) { - x = enemy->Position.xPos + enemy->VerticalVelocity * PREDICTIVE_SCALE_FACTOR * phd_sin(Lara.Control.MoveAngle) - item->Position.xPos - object->pivotLength * phd_sin(item->Position.yRot); - z = enemy->Position.zPos + enemy->VerticalVelocity * PREDICTIVE_SCALE_FACTOR * phd_cos(Lara.Control.MoveAngle) - item->Position.zPos - object->pivotLength * phd_cos(item->Position.yRot); + x = enemy->Position.xPos + enemy->Animation.VerticalVelocity * PREDICTIVE_SCALE_FACTOR * phd_sin(Lara.Control.MoveAngle) - item->Position.xPos - object->pivotLength * phd_sin(item->Position.yRot); + z = enemy->Position.zPos + enemy->Animation.VerticalVelocity * PREDICTIVE_SCALE_FACTOR * phd_cos(Lara.Control.MoveAngle) - item->Position.zPos - object->pivotLength * phd_cos(item->Position.yRot); } else { - x = enemy->Position.xPos + enemy->VerticalVelocity * PREDICTIVE_SCALE_FACTOR * phd_sin(enemy->Position.yRot) - item->Position.xPos - object->pivotLength * phd_sin(item->Position.yRot); - z = enemy->Position.zPos + enemy->VerticalVelocity * PREDICTIVE_SCALE_FACTOR * phd_cos(enemy->Position.yRot) - item->Position.zPos - object->pivotLength * phd_cos(item->Position.yRot); + x = enemy->Position.xPos + enemy->Animation.VerticalVelocity * PREDICTIVE_SCALE_FACTOR * phd_sin(enemy->Position.yRot) - item->Position.xPos - object->pivotLength * phd_sin(item->Position.yRot); + z = enemy->Position.zPos + enemy->Animation.VerticalVelocity * PREDICTIVE_SCALE_FACTOR * phd_cos(enemy->Position.yRot) - item->Position.zPos - object->pivotLength * phd_cos(item->Position.yRot); } y = item->Position.yPos - enemy->Position.yPos; diff --git a/TR5Main/Game/control/control.cpp b/TR5Main/Game/control/control.cpp index d068e39e8..4ee8a0b67 100644 --- a/TR5Main/Game/control/control.cpp +++ b/TR5Main/Game/control/control.cpp @@ -213,7 +213,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode) if (CurrentLevel != 0) { if (!(TrInput & IN_LOOK) || UseSpotCam || TrackCameraInit || - ((LaraItem->ActiveState != LS_IDLE || LaraItem->AnimNumber != LA_STAND_IDLE) && (!Lara.Control.IsLow || TrInput & IN_CROUCH || LaraItem->AnimNumber != LA_CROUCH_IDLE || LaraItem->TargetState != LS_CROUCH_IDLE))) + ((LaraItem->Animation.ActiveState != LS_IDLE || LaraItem->Animation.AnimNumber != LA_STAND_IDLE) && (!Lara.Control.IsLow || TrInput & IN_CROUCH || LaraItem->Animation.AnimNumber != LA_CROUCH_IDLE || LaraItem->Animation.TargetState != LS_CROUCH_IDLE))) { if (BinocularRange == 0) { diff --git a/TR5Main/Game/control/trigger.cpp b/TR5Main/Game/control/trigger.cpp index d0f069eff..23e9025bb 100644 --- a/TR5Main/Game/control/trigger.cpp +++ b/TR5Main/Game/control/trigger.cpp @@ -119,7 +119,7 @@ int SwitchTrigger(short itemNumber, short timer) if (item->Status == ITEM_DEACTIVATED) { - if ((!item->ActiveState && item->ObjectNumber != ID_JUMP_SWITCH || item->ActiveState == 1 && item->ObjectNumber == ID_JUMP_SWITCH) && timer > 0) + if ((!item->Animation.ActiveState && item->ObjectNumber != ID_JUMP_SWITCH || item->Animation.ActiveState == 1 && item->ObjectNumber == ID_JUMP_SWITCH) && timer > 0) { item->Timer = timer; item->Status = ITEM_ACTIVE; @@ -127,14 +127,14 @@ int SwitchTrigger(short itemNumber, short timer) item->Timer = 30 * timer; return 1; } - if (item->TriggerFlags != 6 || item->ActiveState) + if (item->TriggerFlags != 6 || item->Animation.ActiveState) { RemoveActiveItem(itemNumber); item->Status = ITEM_NOT_ACTIVE; if (!item->ItemFlags[0] == 0) item->Flags |= ONESHOT; - if (item->ActiveState != 1) + if (item->Animation.ActiveState != 1) return 1; if (item->TriggerFlags != 5 && item->TriggerFlags != 6) return 1; @@ -333,46 +333,46 @@ void TestTriggers(FLOOR_INFO* floor, int x, int y, int z, bool heavy, int heavyF if (objectNumber >= ID_SWITCH_TYPE1 && objectNumber <= ID_SWITCH_TYPE6 && g_Level.Items[value].TriggerFlags == 5) switchFlag = 1; - switchOff = (g_Level.Items[value].ActiveState == 1); + switchOff = (g_Level.Items[value].Animation.ActiveState == 1); break; case TRIGGER_TYPES::MONKEY: - if (LaraItem->ActiveState >= LS_MONKEY_IDLE && - (LaraItem->ActiveState <= LS_MONKEY_TURN_180 || - LaraItem->ActiveState == LS_MONKEY_TURN_LEFT || - LaraItem->ActiveState == LS_MONKEY_TURN_RIGHT)) + if (LaraItem->Animation.ActiveState >= LS_MONKEY_IDLE && + (LaraItem->Animation.ActiveState <= LS_MONKEY_TURN_180 || + LaraItem->Animation.ActiveState == LS_MONKEY_TURN_LEFT || + LaraItem->Animation.ActiveState == LS_MONKEY_TURN_RIGHT)) break; return; case TRIGGER_TYPES::TIGHTROPE_T: - if (LaraItem->ActiveState >= LS_TIGHTROPE_IDLE && - LaraItem->ActiveState <= LS_TIGHTROPE_RECOVER_BALANCE && - LaraItem->ActiveState != LS_DOVE_SWITCH) + if (LaraItem->Animation.ActiveState >= LS_TIGHTROPE_IDLE && + LaraItem->Animation.ActiveState <= LS_TIGHTROPE_RECOVER_BALANCE && + LaraItem->Animation.ActiveState != LS_DOVE_SWITCH) break; return; case TRIGGER_TYPES::CRAWLDUCK_T: - if (LaraItem->ActiveState == LS_DOVE_SWITCH || - LaraItem->ActiveState == LS_CRAWL_IDLE || - LaraItem->ActiveState == LS_CRAWL_TURN_LEFT || - LaraItem->ActiveState == LS_CRAWL_TURN_RIGHT || - LaraItem->ActiveState == LS_CRAWL_BACK || - LaraItem->ActiveState == LS_CROUCH_IDLE || - LaraItem->ActiveState == LS_CROUCH_ROLL || - LaraItem->ActiveState == LS_CROUCH_TURN_LEFT || - LaraItem->ActiveState == LS_CROUCH_TURN_RIGHT) + if (LaraItem->Animation.ActiveState == LS_DOVE_SWITCH || + LaraItem->Animation.ActiveState == LS_CRAWL_IDLE || + LaraItem->Animation.ActiveState == LS_CRAWL_TURN_LEFT || + LaraItem->Animation.ActiveState == LS_CRAWL_TURN_RIGHT || + LaraItem->Animation.ActiveState == LS_CRAWL_BACK || + LaraItem->Animation.ActiveState == LS_CROUCH_IDLE || + LaraItem->Animation.ActiveState == LS_CROUCH_ROLL || + LaraItem->Animation.ActiveState == LS_CROUCH_TURN_LEFT || + LaraItem->Animation.ActiveState == LS_CROUCH_TURN_RIGHT) break; return; case TRIGGER_TYPES::CLIMB_T: - if (LaraItem->ActiveState == LS_HANG || - LaraItem->ActiveState == LS_LADDER_IDLE || - LaraItem->ActiveState == LS_LADDER_UP || - LaraItem->ActiveState == LS_LADDER_LEFT || - LaraItem->ActiveState == LS_LADDER_STOP || - LaraItem->ActiveState == LS_LADDER_RIGHT || - LaraItem->ActiveState == LS_LADDER_DOWN) + if (LaraItem->Animation.ActiveState == LS_HANG || + LaraItem->Animation.ActiveState == LS_LADDER_IDLE || + LaraItem->Animation.ActiveState == LS_LADDER_UP || + LaraItem->Animation.ActiveState == LS_LADDER_LEFT || + LaraItem->Animation.ActiveState == LS_LADDER_STOP || + LaraItem->Animation.ActiveState == LS_LADDER_RIGHT || + LaraItem->Animation.ActiveState == LS_LADDER_DOWN) break; return; @@ -729,7 +729,7 @@ void ProcessSectorFlags(FLOOR_INFO* floor) // Burn Lara if (floor->Flags.Death && - (LaraItem->Position.yPos == LaraItem->Floor && !IsJumpState((LaraState)LaraItem->ActiveState) || + (LaraItem->Position.yPos == LaraItem->Floor && !IsJumpState((LaraState)LaraItem->Animation.ActiveState) || Lara.Control.WaterStatus != WaterStatus::Dry)) { LavaBurn(LaraItem); diff --git a/TR5Main/Game/effects/chaffFX.cpp b/TR5Main/Game/effects/chaffFX.cpp index ce75fe508..5a9fc0e0f 100644 --- a/TR5Main/Game/effects/chaffFX.cpp +++ b/TR5Main/Game/effects/chaffFX.cpp @@ -38,7 +38,7 @@ void TriggerChaffEffects(int flareAge) vel.y = vect.y - pos.y; vel.z = vect.z - pos.z; - TriggerChaffEffects(LaraItem, &pos, &vel, LaraItem->Velocity, (bool)(g_Level.Rooms[LaraItem->RoomNumber].flags & ENV_FLAG_WATER), flareAge); + TriggerChaffEffects(LaraItem, &pos, &vel, LaraItem->Animation.Velocity, (bool)(g_Level.Rooms[LaraItem->RoomNumber].flags & ENV_FLAG_WATER), flareAge); } void TriggerChaffEffects(ITEM_INFO* Item,int age) @@ -62,7 +62,7 @@ void TriggerChaffEffects(ITEM_INFO* Item,int age) vel.y = world.Translation().y; vel.z = world.Translation().z; - TriggerChaffEffects(Item, &pos, &vel, Item->Velocity, (bool)(g_Level.Rooms[Item->RoomNumber].flags & ENV_FLAG_WATER),age); + TriggerChaffEffects(Item, &pos, &vel, Item->Animation.Velocity, (bool)(g_Level.Rooms[Item->RoomNumber].flags & ENV_FLAG_WATER),age); } void TriggerChaffEffects(ITEM_INFO* item, PHD_VECTOR* pos, PHD_VECTOR* vel, int speed, bool isUnderwater,int age) diff --git a/TR5Main/Game/effects/effects.cpp b/TR5Main/Game/effects/effects.cpp index 9bf416942..5752b72d4 100644 --- a/TR5Main/Game/effects/effects.cpp +++ b/TR5Main/Game/effects/effects.cpp @@ -1254,13 +1254,13 @@ void WadeSplash(ITEM_INFO* item, int wh, int wd) if (item->Position.yPos + frame->boundingBox.Y2 < wh) return; - if (item->VerticalVelocity <= 0 || wd >= 474 || SplashCount != 0) + if (item->Animation.VerticalVelocity <= 0 || wd >= 474 || SplashCount != 0) { if (!(Wibble & 0xF)) { - if (!(GetRandomControl() & 0xF) || item->ActiveState != LS_IDLE) + if (!(GetRandomControl() & 0xF) || item->Animation.ActiveState != LS_IDLE) { - if (item->ActiveState == LS_IDLE) + if (item->Animation.ActiveState == LS_IDLE) SetupRipple(item->Position.xPos, wh - 1, item->Position.zPos, (GetRandomControl() & 0xF) + 112, RIPPLE_FLAG_RAND_ROT | RIPPLE_FLAG_RAND_POS, Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_RIPPLES); else SetupRipple(item->Position.xPos, wh - 1, item->Position.zPos, (GetRandomControl() & 0xF) + 112, RIPPLE_FLAG_RAND_ROT | RIPPLE_FLAG_RAND_POS, Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_RIPPLES); @@ -1273,7 +1273,7 @@ void WadeSplash(ITEM_INFO* item, int wh, int wd) SplashSetup.x = item->Position.xPos; SplashSetup.z = item->Position.zPos; SplashSetup.innerRadius = 16; - SplashSetup.splashPower = item->Velocity; + SplashSetup.splashPower = item->Animation.Velocity; SetupSplash(&SplashSetup, roomNumber); SplashCount = 16; } @@ -1291,7 +1291,7 @@ void Splash(ITEM_INFO* item) SplashSetup.y = waterHeight - 1; SplashSetup.x = item->Position.xPos; SplashSetup.z = item->Position.zPos; - SplashSetup.splashPower = item->VerticalVelocity; + SplashSetup.splashPower = item->Animation.VerticalVelocity; SplashSetup.innerRadius = 64; SetupSplash(&SplashSetup, roomNumber); } diff --git a/TR5Main/Game/effects/lara_fx.cpp b/TR5Main/Game/effects/lara_fx.cpp index 8eb15fb4e..6920ef6ff 100644 --- a/TR5Main/Game/effects/lara_fx.cpp +++ b/TR5Main/Game/effects/lara_fx.cpp @@ -70,20 +70,20 @@ namespace TEN::Effects::Lara if (!TestEnvironment(ENV_FLAG_COLD, item)) return; - switch (item->AnimNumber) + switch (item->Animation.AnimNumber) { case LA_STAND_IDLE: - if (item->FrameNumber < GetFrameNumber((short)ID_LARA, LA_STAND_IDLE, 30)) + if (item->Animation.FrameNumber < GetFrameNumber((short)ID_LARA, LA_STAND_IDLE, 30)) return; break; case LA_CROUCH_IDLE: - if (item->FrameNumber < GetFrameNumber((short)ID_LARA, LA_CROUCH_IDLE, 30)) + if (item->Animation.FrameNumber < GetFrameNumber((short)ID_LARA, LA_CROUCH_IDLE, 30)) return; break; case LA_CRAWL_IDLE: - if (item->FrameNumber < GetFrameNumber((short)ID_LARA, LA_CRAWL_IDLE, 30)) + if (item->Animation.FrameNumber < GetFrameNumber((short)ID_LARA, LA_CRAWL_IDLE, 30)) return; break; diff --git a/TR5Main/Game/effects/weather.cpp b/TR5Main/Game/effects/weather.cpp index b1bd1cf35..68c3ceaeb 100644 --- a/TR5Main/Game/effects/weather.cpp +++ b/TR5Main/Game/effects/weather.cpp @@ -243,7 +243,7 @@ namespace Environment p.Position.y += ((int)p.Velocity.y & (~7)) >> 1; p.Position.z += p.Velocity.z; - COLL_RESULT coll; + CollisionResult coll; bool collisionCalculated = false; if (p.CollisionCheckDelay <= 0) diff --git a/TR5Main/Game/gui.cpp b/TR5Main/Game/gui.cpp index 1a496996c..8dbb51a91 100644 --- a/TR5Main/Game/gui.cpp +++ b/TR5Main/Game/gui.cpp @@ -2014,7 +2014,7 @@ void GuiController::UseCurrentItem() return; if (Lara.Control.Weapon.GunType == LaraWeaponType::Pistol) - Lara.Control.HandStatus = HandStatus::DrawWeapon; + Lara.Control.HandStatus = HandStatus::WeaponDraw; return; } @@ -2027,7 +2027,7 @@ void GuiController::UseCurrentItem() return; if (Lara.Control.Weapon.GunType == LaraWeaponType::Uzi) - Lara.Control.HandStatus = HandStatus::DrawWeapon; + Lara.Control.HandStatus = HandStatus::WeaponDraw; return; } @@ -2040,12 +2040,12 @@ void GuiController::UseCurrentItem() { if (Lara.Control.HandStatus == HandStatus::Free) { - if (LaraItem->ActiveState != LS_CRAWL_IDLE && - LaraItem->ActiveState != LS_CRAWL_FORWARD && - LaraItem->ActiveState != LS_CRAWL_TURN_LEFT && - LaraItem->ActiveState != LS_CRAWL_TURN_RIGHT && - LaraItem->ActiveState != LS_CRAWL_BACK && - LaraItem->ActiveState != LS_CRAWL_TO_HANG) + if (LaraItem->Animation.ActiveState != LS_CRAWL_IDLE && + LaraItem->Animation.ActiveState != LS_CRAWL_FORWARD && + LaraItem->Animation.ActiveState != LS_CRAWL_TURN_LEFT && + LaraItem->Animation.ActiveState != LS_CRAWL_TURN_RIGHT && + LaraItem->Animation.ActiveState != LS_CRAWL_BACK && + LaraItem->Animation.ActiveState != LS_CRAWL_TO_HANG) { if (Lara.Control.Weapon.GunType != LaraWeaponType::Flare) { @@ -2066,7 +2066,7 @@ void GuiController::UseCurrentItem() { case INV_OBJECT_BINOCULARS: - if (((LaraItem->ActiveState == LS_IDLE && LaraItem->AnimNumber == LA_STAND_IDLE) + if (((LaraItem->Animation.ActiveState == LS_IDLE && LaraItem->Animation.AnimNumber == LA_STAND_IDLE) || (Lara.Control.IsLow && !(TrInput & IN_CROUCH))) && !UseSpotCam && !TrackCameraInit) @@ -2075,7 +2075,7 @@ void GuiController::UseCurrentItem() BinocularRange = 128; if (Lara.Control.HandStatus != HandStatus::Free) - Lara.Control.HandStatus = HandStatus::UndrawWeapon; + Lara.Control.HandStatus = HandStatus::WeaponUndraw; } if (OldBinocular) @@ -2150,15 +2150,15 @@ void GuiController::UseCurrentItem() return; } - if (LaraItem->ActiveState == LS_CRAWL_IDLE || - LaraItem->ActiveState == LS_CRAWL_FORWARD || - LaraItem->ActiveState == LS_CRAWL_TURN_LEFT || - LaraItem->ActiveState == LS_CRAWL_TURN_RIGHT || - LaraItem->ActiveState == LS_CRAWL_BACK || - LaraItem->ActiveState == LS_CRAWL_TO_HANG || - LaraItem->ActiveState == LS_CROUCH_IDLE || - LaraItem->ActiveState == LS_CROUCH_TURN_LEFT || - LaraItem->ActiveState == LS_CROUCH_TURN_RIGHT) + if (LaraItem->Animation.ActiveState == LS_CRAWL_IDLE || + LaraItem->Animation.ActiveState == LS_CRAWL_FORWARD || + LaraItem->Animation.ActiveState == LS_CRAWL_TURN_LEFT || + LaraItem->Animation.ActiveState == LS_CRAWL_TURN_RIGHT || + LaraItem->Animation.ActiveState == LS_CRAWL_BACK || + LaraItem->Animation.ActiveState == LS_CRAWL_TO_HANG || + LaraItem->Animation.ActiveState == LS_CROUCH_IDLE || + LaraItem->Animation.ActiveState == LS_CROUCH_TURN_LEFT || + LaraItem->Animation.ActiveState == LS_CROUCH_TURN_RIGHT) { SayNo(); return; @@ -2172,7 +2172,7 @@ void GuiController::UseCurrentItem() return; if (Lara.Control.Weapon.GunType == LaraWeaponType::Shotgun) - Lara.Control.HandStatus = HandStatus::DrawWeapon; + Lara.Control.HandStatus = HandStatus::WeaponDraw; return; } @@ -2185,7 +2185,7 @@ void GuiController::UseCurrentItem() return; if (Lara.Control.Weapon.GunType == LaraWeaponType::Revolver) - Lara.Control.HandStatus = HandStatus::DrawWeapon; + Lara.Control.HandStatus = HandStatus::WeaponDraw; return; } @@ -2197,7 +2197,7 @@ void GuiController::UseCurrentItem() return; if (Lara.Control.Weapon.GunType == LaraWeaponType::HK) - Lara.Control.HandStatus = HandStatus::DrawWeapon; + Lara.Control.HandStatus = HandStatus::WeaponDraw; return; } @@ -2209,7 +2209,7 @@ void GuiController::UseCurrentItem() return; if (Lara.Control.Weapon.GunType == LaraWeaponType::Crossbow) - Lara.Control.HandStatus = HandStatus::DrawWeapon; + Lara.Control.HandStatus = HandStatus::WeaponDraw; return; } @@ -2221,7 +2221,7 @@ void GuiController::UseCurrentItem() return; if (Lara.Control.Weapon.GunType == LaraWeaponType::GrenadeLauncher) - Lara.Control.HandStatus = HandStatus::DrawWeapon; + Lara.Control.HandStatus = HandStatus::WeaponDraw; return; } @@ -2233,7 +2233,7 @@ void GuiController::UseCurrentItem() return; if (Lara.Control.Weapon.GunType == LaraWeaponType::HarpoonGun) - Lara.Control.HandStatus = HandStatus::DrawWeapon; + Lara.Control.HandStatus = HandStatus::WeaponDraw; return; } @@ -2245,7 +2245,7 @@ void GuiController::UseCurrentItem() return; if (Lara.Control.Weapon.GunType == LaraWeaponType::RocketLauncher) - Lara.Control.HandStatus = HandStatus::DrawWeapon; + Lara.Control.HandStatus = HandStatus::WeaponDraw; return; } diff --git a/TR5Main/Game/itemdata/creature_info.h b/TR5Main/Game/itemdata/creature_info.h index fa05030d7..e72968690 100644 --- a/TR5Main/Game/itemdata/creature_info.h +++ b/TR5Main/Game/itemdata/creature_info.h @@ -34,6 +34,8 @@ enum ZoneType : char struct LOTInfo { + bool Initialised; + std::vector Node; int Head; int Tail; @@ -47,12 +49,11 @@ struct LOTInfo int RequiredBox; short Fly; - bool Initialised; bool CanJump; bool CanMonkey; - bool IsAmphibious; bool IsJumping; bool IsMonkeying; + bool IsAmphibious; PHD_VECTOR Target; ZoneType Zone; @@ -85,24 +86,24 @@ struct CreatureInfo bool Patrol; // Unused? bool Alerted; - bool ReachedGoal; + bool Friendly; + bool HurtByLara; + bool Poisoned; bool JumpAhead; bool MonkeySwingAhead; - bool Friendly; - bool Poisoned; - bool HurtByLara; + bool ReachedGoal; short Tosspad; short LocationAI; short FiredWeapon; + LOTInfo LOT; MoodType Mood; ITEM_INFO* Enemy; short AITargetNumber; ITEM_INFO* AITarget; short Pad; // Unused? PHD_VECTOR Target; - LOTInfo LOT; #ifdef CREATURE_AI_PRIORITY_OPTIMIZATION CreatureAIPriority Priority; diff --git a/TR5Main/Game/items.cpp b/TR5Main/Game/items.cpp index a64351145..6abcd9347 100644 --- a/TR5Main/Game/items.cpp +++ b/TR5Main/Game/items.cpp @@ -319,18 +319,18 @@ void InitialiseItem(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; - item->RequiredState = 0; - item->TargetState = g_Level.Anims[item->AnimNumber].ActiveState; - item->ActiveState = g_Level.Anims[item->AnimNumber].ActiveState; + item->Animation.RequiredState = 0; + item->Animation.TargetState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; + item->Animation.ActiveState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; item->Position.zRot = 0; item->Position.xRot = 0; - item->VerticalVelocity = 0; - item->Velocity = 0; + item->Animation.VerticalVelocity = 0; + item->Animation.Velocity = 0; item->ItemFlags[3] = 0; item->ItemFlags[2] = 0; @@ -339,7 +339,7 @@ void InitialiseItem(short itemNumber) item->Active = false; item->Status = ITEM_NOT_ACTIVE; - item->Airborne = false; + item->Animation.Airborne = false; item->HitStatus = false; item->Collidable = true; item->LookedAt = false; @@ -389,12 +389,12 @@ void InitialiseItem(short itemNumber) if (Objects[item->ObjectNumber].nmeshes > 0) { - item->Mutator.resize(Objects[item->ObjectNumber].nmeshes); - for (int i = 0; i < item->Mutator.size(); i++) - item->Mutator[i] = {}; + item->Animation.Mutator.resize(Objects[item->ObjectNumber].nmeshes); + for (int i = 0; i < item->Animation.Mutator.size(); i++) + item->Animation.Mutator[i] = {}; } else - item->Mutator.clear(); + item->Animation.Mutator.clear(); if (Objects[item->ObjectNumber].initialise != NULL) Objects[item->ObjectNumber].initialise(itemNumber); diff --git a/TR5Main/Game/items.h b/TR5Main/Game/items.h index bc0202089..c96dc1a3e 100644 --- a/TR5Main/Game/items.h +++ b/TR5Main/Game/items.h @@ -9,8 +9,19 @@ enum GAME_OBJECT_ID : short; +// used by fx->shade ! +#define RGB555(r, g, b) ((r << 7) & 0x7C00 | (g << 2) & 0x3E0 | (b >> 3) & 0x1F) +#define WHITE555 RGB555(255, 255, 255) +#define GRAY555 RGB555(128, 128, 128) +#define BLACK555 RGB555( 0, 0, 0) + constexpr unsigned int NO_MESH_BITS = UINT_MAX; +constexpr auto NO_ITEM = -1; +constexpr auto ALL_MESHBITS = -1; +constexpr auto NOT_TARGETABLE = -16384; +constexpr auto NUM_ITEMS = 1024; + enum AIObjectType { NO_AI = 0x0000, @@ -40,36 +51,47 @@ enum ItemFlags IFLAG_ACTIVATION_MASK = 0x3E00 // bits 9-13 }; +struct EntityAnimationData +{ + int AnimNumber; + int FrameNumber; + int ActiveState; + int TargetState; + int RequiredState; // TODO: Phase out this weird feature. + + bool Airborne; + int Velocity; + int VerticalVelocity; + int LateralVelocity; + std::vector Mutator; +}; + struct ITEM_INFO { std::string LuaName; GAME_OBJECT_ID ObjectNumber; - int BoxNumber; - ITEM_DATA Data; - bool Active; short NextItem; short NextActive; + int BoxNumber; + int Status; // ItemStatus enum - PHD_3DPOS StartPosition; + bool Active; + bool HitStatus; + bool Collidable; + bool LookedAt; + bool InDrawRoom; + short DrawRoom; // Unused? + + ITEM_DATA Data; + EntityAnimationData Animation; PHD_3DPOS Position; + PHD_3DPOS StartPosition; ROOM_VECTOR Location; short RoomNumber; int Floor; - std::vector Mutator; - int ActiveState; - int TargetState; - int RequiredState; // TODO: Phase out this weird feature. - int AnimNumber; - int FrameNumber; - - int Velocity; - int LateralVelocity; - int VerticalVelocity; - bool Airborne; - - short HitPoints; - short Timer; + int HitPoints; + int Timer; short Shade; uint32_t MeshBits; @@ -79,14 +101,6 @@ struct ITEM_INFO uint16_t Flags; // ItemFlags enum uint32_t SwapMeshFlags; - short Status; // ItemStatus enum - bool HitStatus; - bool Collidable; - bool LookedAt; - bool InDrawRoom; - - short DrawRoom; // Unused? - // TODO: Move to CreatureInfo? uint32_t TouchBits; uint8_t AIBits; // AIObjectType enum. @@ -94,17 +108,6 @@ struct ITEM_INFO short CarriedItem; }; -// used by fx->shade ! -#define RGB555(r, g, b) ((r << 7) & 0x7C00 | (g << 2) & 0x3E0 | (b >> 3) & 0x1F) -#define WHITE555 RGB555(255, 255, 255) -#define GRAY555 RGB555(128, 128, 128) -#define BLACK555 RGB555( 0, 0, 0) - -constexpr auto NO_ITEM = -1; -constexpr auto ALL_MESHBITS = -1; -constexpr auto NOT_TARGETABLE = -16384; -constexpr auto NUM_ITEMS = 1024; - void EffectNewRoom(short fxNumber, short roomNumber); void ItemNewRoom(short itemNumber, short roomNumber); void AddActiveItem(short itemNumber); diff --git a/TR5Main/Game/missile.cpp b/TR5Main/Game/missile.cpp index 7b6d5192c..d888e389c 100644 --- a/TR5Main/Game/missile.cpp +++ b/TR5Main/Game/missile.cpp @@ -109,7 +109,7 @@ void ControlMissile(short fxNumber) LaraItem->HitStatus = 1; fx->pos.yRot = LaraItem->Position.yRot; - fx->speed = LaraItem->Velocity; + fx->speed = LaraItem->Animation.Velocity; fx->frameNumber = fx->counter = 0; } diff --git a/TR5Main/Game/people.cpp b/TR5Main/Game/people.cpp index 0ef01ea81..e97de0895 100644 --- a/TR5Main/Game/people.cpp +++ b/TR5Main/Game/people.cpp @@ -22,7 +22,7 @@ bool ShotLara(ITEM_INFO* item, AI_INFO* info, BITE_INFO* gun, short extra_rotati if (info->distance <= pow(MAX_VISIBILITY_DISTANCE, 2) && Targetable(item, info)) { - int distance = phd_sin(info->enemyFacing) * enemy->Velocity * pow(MAX_VISIBILITY_DISTANCE, 2) / 300; + int distance = phd_sin(info->enemyFacing) * enemy->Animation.Velocity * pow(MAX_VISIBILITY_DISTANCE, 2) / 300; distance = pow(distance, 2) + info->distance; if (distance <= pow(MAX_VISIBILITY_DISTANCE, 2)) { diff --git a/TR5Main/Game/pickup/pickup.cpp b/TR5Main/Game/pickup/pickup.cpp index 5ed384934..721525ce0 100644 --- a/TR5Main/Game/pickup/pickup.cpp +++ b/TR5Main/Game/pickup/pickup.cpp @@ -223,7 +223,7 @@ void DoPickup(ITEM_INFO* laraItem) } else if (pickupItem->ObjectNumber == ID_FLARE_ITEM) { - if (laraItem->ActiveState == LA_UNDERWATER_PICKUP_FLARE) + if (laraItem->Animation.ActiveState == LA_UNDERWATER_PICKUP_FLARE) { lara->Control.Weapon.RequestGunType = LaraWeaponType::Flare; lara->Control.Weapon.GunType = LaraWeaponType::Flare; @@ -239,7 +239,7 @@ void DoPickup(ITEM_INFO* laraItem) getThisItemPlease = NO_ITEM; return; } - else if (laraItem->ActiveState == LS_PICKUP_FLARE) + else if (laraItem->Animation.ActiveState == LS_PICKUP_FLARE) { lara->Control.Weapon.RequestGunType = LaraWeaponType::Flare; lara->Control.Weapon.GunType = LaraWeaponType::Flare; @@ -253,7 +253,7 @@ void DoPickup(ITEM_INFO* laraItem) } else { - if (laraItem->AnimNumber == LA_UNDERWATER_PICKUP) //dirty but what can I do, it uses the same state + if (laraItem->Animation.AnimNumber == LA_UNDERWATER_PICKUP) //dirty but what can I do, it uses the same state { AddDisplayPickup(pickupItem->ObjectNumber); if (!(pickupItem->TriggerFlags & 0xC0)) @@ -273,13 +273,13 @@ void DoPickup(ITEM_INFO* laraItem) } else { - if (laraItem->AnimNumber == LA_CROWBAR_PRY_WALL_SLOW) + if (laraItem->Animation.AnimNumber == LA_CROWBAR_PRY_WALL_SLOW) { AddDisplayPickup(ID_CROWBAR_ITEM); Lara.Inventory.HasCrowbar = true; KillItem(pickupItemNumber); } - else if (laraItem->ActiveState == LS_PICKUP || laraItem->ActiveState == LS_PICKUP_FROM_CHEST || laraItem->ActiveState == LS_HOLE) + else if (laraItem->Animation.ActiveState == LS_PICKUP || laraItem->Animation.ActiveState == LS_PICKUP_FROM_CHEST || laraItem->Animation.ActiveState == LS_HOLE) { AddDisplayPickup(pickupItem->ObjectNumber); if (pickupItem->TriggerFlags & 0x100) @@ -343,7 +343,7 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (TrInput & IN_ACTION && item->ObjectNumber != ID_BURNING_TORCH_ITEM && - laraItem->ActiveState == LS_UNDERWATER_STOP && + laraItem->Animation.ActiveState == LS_UNDERWATER_STOP && lara->Control.HandStatus == HandStatus::Free && TestLaraPosition(&PickUpBoundsUW, item, laraItem) || lara->Control.IsMoving && lara->InteractedItem == itemNumber) { @@ -354,19 +354,19 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (item->ObjectNumber == ID_FLARE_ITEM) { getThisItemPlease = itemNumber; - laraItem->AnimNumber = LA_UNDERWATER_PICKUP_FLARE; - laraItem->ActiveState = LS_PICKUP_FLARE; - laraItem->VerticalVelocity = 0; + laraItem->Animation.AnimNumber = LA_UNDERWATER_PICKUP_FLARE; + laraItem->Animation.ActiveState = LS_PICKUP_FLARE; + laraItem->Animation.VerticalVelocity = 0; } else { getThisItemPlease = itemNumber; - laraItem->AnimNumber = LA_UNDERWATER_PICKUP; - laraItem->ActiveState = LS_PICKUP; + laraItem->Animation.AnimNumber = LA_UNDERWATER_PICKUP; + laraItem->Animation.ActiveState = LS_PICKUP; } - laraItem->TargetState = LS_UNDERWATER_STOP; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.TargetState = LS_UNDERWATER_STOP; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; lara->Control.IsMoving = false; lara->Control.HandStatus = HandStatus::Busy; } @@ -402,15 +402,15 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (!(TrInput & IN_ACTION) && (g_Gui.GetInventoryItemChosen() == NO_ITEM || triggerFlags != 2) || BinocularRange || - (laraItem->ActiveState != LS_IDLE || laraItem->AnimNumber != LA_STAND_IDLE || lara->Control.HandStatus != HandStatus::Free) && - (laraItem->ActiveState != LS_CROUCH_IDLE || laraItem->AnimNumber != LA_CROUCH_IDLE || lara->Control.HandStatus != HandStatus::Free) && - (laraItem->ActiveState != LS_CRAWL_IDLE || laraItem->AnimNumber != LA_CRAWL_IDLE)) + (laraItem->Animation.ActiveState != LS_IDLE || laraItem->Animation.AnimNumber != LA_STAND_IDLE || lara->Control.HandStatus != HandStatus::Free) && + (laraItem->Animation.ActiveState != LS_CROUCH_IDLE || laraItem->Animation.AnimNumber != LA_CROUCH_IDLE || lara->Control.HandStatus != HandStatus::Free) && + (laraItem->Animation.ActiveState != LS_CRAWL_IDLE || laraItem->Animation.AnimNumber != LA_CRAWL_IDLE)) { if (!lara->Control.IsMoving) { if (lara->InteractedItem == itemNumber) { - if (laraItem->ActiveState != LS_PICKUP && laraItem->ActiveState != LS_HOLE) + if (laraItem->Animation.ActiveState != LS_PICKUP && laraItem->Animation.ActiveState != LS_HOLE) { item->Position.xRot = oldXrot; item->Position.yRot = oldYrot; @@ -461,8 +461,8 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) else if (MoveLaraPosition(&HiddenPickUpPosition, item, laraItem)) { getThisItemPlease = itemNumber; - laraItem->AnimNumber = LA_HOLESWITCH_ACTIVATE; - laraItem->ActiveState = LS_HOLE; + laraItem->Animation.AnimNumber = LA_HOLESWITCH_ACTIVATE; + laraItem->Animation.ActiveState = LS_HOLE; flag = true; } @@ -518,8 +518,8 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (MoveLaraPosition(&CrowbarPickUpPosition, item, laraItem)) { getThisItemPlease = itemNumber; - laraItem->AnimNumber = LA_CROWBAR_PRY_WALL_FAST; - laraItem->ActiveState = LS_PICKUP; + laraItem->Animation.AnimNumber = LA_CROWBAR_PRY_WALL_FAST; + laraItem->Animation.ActiveState = LS_PICKUP; item->Status = ITEM_ACTIVE; AddActiveItem(itemNumber); AnimateItem(item); @@ -560,14 +560,14 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (triggerFlags == 3 || triggerFlags == 7) { getThisItemPlease = itemNumber; - laraItem->AnimNumber = LA_PICKUP_PEDESTAL_HIGH; - laraItem->ActiveState = LS_PICKUP; + laraItem->Animation.AnimNumber = LA_PICKUP_PEDESTAL_HIGH; + laraItem->Animation.ActiveState = LS_PICKUP; } else { getThisItemPlease = itemNumber; - laraItem->AnimNumber = LA_PICKUP_PEDESTAL_LOW; - laraItem->ActiveState = LS_PICKUP; + laraItem->Animation.AnimNumber = LA_PICKUP_PEDESTAL_LOW; + laraItem->Animation.ActiveState = LS_PICKUP; } flag = true; @@ -610,8 +610,8 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (MoveLaraPosition(&JobyCrowPickUpPosition, item, laraItem)) { getThisItemPlease = itemNumber; - laraItem->AnimNumber = LA_CROWBAR_PRY_WALL_SLOW; - laraItem->ActiveState = LS_PICKUP; + laraItem->Animation.AnimNumber = LA_CROWBAR_PRY_WALL_SLOW; + laraItem->Animation.ActiveState = LS_PICKUP; item->Status = ITEM_ACTIVE; AddActiveItem(itemNumber); flag = true; @@ -645,7 +645,7 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) PickUpPosition.y = laraItem->Position.yPos - item->Position.yPos; - if (laraItem->ActiveState == LS_CROUCH_IDLE) + if (laraItem->Animation.ActiveState == LS_CROUCH_IDLE) { if (item->ObjectNumber == ID_BURNING_TORCH_ITEM) break; @@ -655,19 +655,19 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (item->ObjectNumber == ID_FLARE_ITEM) { getThisItemPlease = itemNumber; - laraItem->AnimNumber = LA_CROUCH_PICKUP_FLARE; - laraItem->ActiveState = LS_PICKUP_FLARE; + laraItem->Animation.AnimNumber = LA_CROUCH_PICKUP_FLARE; + laraItem->Animation.ActiveState = LS_PICKUP_FLARE; lara->InteractedItem = itemNumber; flag = true; break; } getThisItemPlease = itemNumber; - laraItem->TargetState = LS_PICKUP; + laraItem->Animation.TargetState = LS_PICKUP; } else { - if (laraItem->ActiveState == LS_CRAWL_IDLE) + if (laraItem->Animation.ActiveState == LS_CRAWL_IDLE) { if (item->ObjectNumber == ID_BURNING_TORCH_ITEM) break; @@ -676,13 +676,13 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (item->ObjectNumber == ID_FLARE_ITEM) { - laraItem->TargetState = LS_CROUCH_IDLE; + laraItem->Animation.TargetState = LS_CROUCH_IDLE; lara->InteractedItem = itemNumber; } else { getThisItemPlease = itemNumber; - laraItem->TargetState = LS_PICKUP; + laraItem->Animation.TargetState = LS_PICKUP; } break; @@ -699,8 +699,8 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (item->ObjectNumber == ID_FLARE_ITEM) { - laraItem->AnimNumber = LA_PICKUP; - laraItem->ActiveState = LS_PICKUP_FLARE; + laraItem->Animation.AnimNumber = LA_PICKUP; + laraItem->Animation.ActiveState = LS_PICKUP_FLARE; lara->InteractedItem = itemNumber; flag = true; break; @@ -708,8 +708,8 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) else { // HACK: because of MoveLaraPosition(), we can't properly dispatch. Must be fixed later. - laraItem->AnimNumber = LA_PICKUP; - laraItem->ActiveState = LS_PICKUP; + laraItem->Animation.AnimNumber = LA_PICKUP; + laraItem->Animation.ActiveState = LS_PICKUP; } } } @@ -720,7 +720,7 @@ void PickupCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (flag) { - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; ResetLaraFlex(laraItem); lara->Control.IsMoving = false; lara->Control.HandStatus = HandStatus::Busy; @@ -783,8 +783,8 @@ void PickupControl(short itemNumber) switch (triggerFlags) { case 5: - item->VerticalVelocity += 6; - item->Position.yPos += item->VerticalVelocity; + item->Animation.VerticalVelocity += 6; + item->Position.yPos += item->Animation.VerticalVelocity; roomNumber = item->RoomNumber; GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &roomNumber); @@ -792,10 +792,10 @@ void PickupControl(short itemNumber) if (item->Position.yPos > item->ItemFlags[0]) { item->Position.yPos = item->ItemFlags[0]; - if (item->VerticalVelocity <= 64) + if (item->Animation.VerticalVelocity <= 64) item->TriggerFlags &= 0xC0; else - item->VerticalVelocity = -item->VerticalVelocity >> 2; + item->Animation.VerticalVelocity = -item->Animation.VerticalVelocity >> 2; } if (item->RoomNumber != roomNumber) @@ -954,8 +954,8 @@ void SearchObjectCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* col int objectNumber = (item->ObjectNumber - ID_SEARCH_OBJECT1) / 2; if (TrInput & IN_ACTION && - laraitem->ActiveState == LS_IDLE && - laraitem->AnimNumber == LA_STAND_IDLE && + laraitem->Animation.ActiveState == LS_IDLE && + laraitem->Animation.AnimNumber == LA_STAND_IDLE && Lara.Control.HandStatus == HandStatus::Free && (item->Status == ITEM_NOT_ACTIVE && item->ObjectNumber != ID_SEARCH_OBJECT4 || !item->ItemFlags[0]) || @@ -981,9 +981,9 @@ void SearchObjectCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* col { if (MoveLaraPosition(&SOPos, item, laraitem)) { - laraitem->ActiveState = LS_MISC_CONTROL; - laraitem->AnimNumber = SearchAnims[objectNumber]; - laraitem->FrameNumber = g_Level.Anims[laraitem->AnimNumber].frameBase; + laraitem->Animation.ActiveState = LS_MISC_CONTROL; + laraitem->Animation.AnimNumber = SearchAnims[objectNumber]; + laraitem->Animation.FrameNumber = g_Level.Anims[laraitem->Animation.AnimNumber].frameBase; ResetLaraFlex(laraitem); Lara.Control.IsMoving = false; Lara.Control.HandStatus = HandStatus::Busy; @@ -996,8 +996,8 @@ void SearchObjectCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* col item->Status = ITEM_ACTIVE; } - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; AnimateItem(item); } else @@ -1009,7 +1009,7 @@ void SearchObjectCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* col Lara.Control.HandStatus = HandStatus::Free; } } - else if (laraitem->ActiveState != LS_MISC_CONTROL) + else if (laraitem->Animation.ActiveState != LS_MISC_CONTROL) ObjectCollision(itemNumber, laraitem, coll); } @@ -1023,7 +1023,7 @@ void SearchObjectControl(short itemNumber) ITEM_INFO* item2; - int frameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if (item->ObjectNumber == ID_SEARCH_OBJECT1) { if (frameNumber > 0) @@ -1113,7 +1113,7 @@ bool UseSpecialItem(ITEM_INFO* item) int flag = 0; int use = g_Gui.GetInventoryItemChosen(); - if (item->AnimNumber == LA_STAND_IDLE && Lara.Control.HandStatus == HandStatus::Free && use != NO_ITEM) + if (item->Animation.AnimNumber == LA_STAND_IDLE && Lara.Control.HandStatus == HandStatus::Free && use != NO_ITEM) { if ((use >= ID_WATERSKIN1_EMPTY) && (use <= ID_WATERSKIN2_5)) { @@ -1123,7 +1123,7 @@ bool UseSpecialItem(ITEM_INFO* item) else if (use == ID_CLOCKWORK_BEETLE) { flag = 4; - item->AnimNumber = LA_MECHANICAL_BEETLE_USE; + item->Animation.AnimNumber = LA_MECHANICAL_BEETLE_USE; UseClockworkBeetle(1); } @@ -1160,13 +1160,13 @@ bool UseSpecialItem(ITEM_INFO* item) if (flag) { if (flag == 1) - item->AnimNumber = LA_WATERSKIN_FILL; + item->Animation.AnimNumber = LA_WATERSKIN_FILL; else if (flag == 2) - item->AnimNumber = LA_WATERSKIN_POUR_LOW; + item->Animation.AnimNumber = LA_WATERSKIN_POUR_LOW; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = LS_MISC_CONTROL; - item->ActiveState = LS_MISC_CONTROL; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = LS_MISC_CONTROL; + item->Animation.ActiveState = LS_MISC_CONTROL; Lara.Control.HandStatus = HandStatus::Busy; g_Gui.SetInventoryItemChosen(NO_ITEM); diff --git a/TR5Main/Game/savegame.cpp b/TR5Main/Game/savegame.cpp index 2e2b7717a..047818a75 100644 --- a/TR5Main/Game/savegame.cpp +++ b/TR5Main/Game/savegame.cpp @@ -459,31 +459,31 @@ bool SaveGame::Save(int slot) Save::ItemBuilder serializedItem{ fbb }; - serializedItem.add_anim_number(itemToSerialize.AnimNumber - obj->animIndex); + serializedItem.add_anim_number(itemToSerialize.Animation.AnimNumber - obj->animIndex); serializedItem.add_after_death(itemToSerialize.AfterDeath); serializedItem.add_box_number(itemToSerialize.BoxNumber); serializedItem.add_carried_item(itemToSerialize.CarriedItem); - serializedItem.add_active_state(itemToSerialize.ActiveState); - serializedItem.add_vertical_velocity(itemToSerialize.VerticalVelocity); + serializedItem.add_active_state(itemToSerialize.Animation.ActiveState); + serializedItem.add_vertical_velocity(itemToSerialize.Animation.VerticalVelocity); serializedItem.add_flags(itemToSerialize.Flags); serializedItem.add_floor(itemToSerialize.Floor); - serializedItem.add_frame_number(itemToSerialize.FrameNumber); - serializedItem.add_target_state(itemToSerialize.TargetState); + serializedItem.add_frame_number(itemToSerialize.Animation.FrameNumber); + serializedItem.add_target_state(itemToSerialize.Animation.TargetState); serializedItem.add_hit_points(itemToSerialize.HitPoints); serializedItem.add_item_flags(itemFlagsOffset); serializedItem.add_mesh_bits(itemToSerialize.MeshBits); serializedItem.add_object_id(itemToSerialize.ObjectNumber); serializedItem.add_position(&position); - serializedItem.add_required_state(itemToSerialize.RequiredState); + serializedItem.add_required_state(itemToSerialize.Animation.RequiredState); serializedItem.add_room_number(itemToSerialize.RoomNumber); - serializedItem.add_velocity(itemToSerialize.Velocity); + serializedItem.add_velocity(itemToSerialize.Animation.Velocity); serializedItem.add_timer(itemToSerialize.Timer); serializedItem.add_touch_bits(itemToSerialize.TouchBits); serializedItem.add_trigger_flags(itemToSerialize.TriggerFlags); serializedItem.add_triggered((itemToSerialize.Flags & (TRIGGERED | CODE_BITS | ONESHOT)) != 0); serializedItem.add_active(itemToSerialize.Active); serializedItem.add_status(itemToSerialize.Status); - serializedItem.add_airborne(itemToSerialize.Airborne); + serializedItem.add_airborne(itemToSerialize.Animation.Airborne); serializedItem.add_hit_stauts(itemToSerialize.HitStatus); serializedItem.add_ai_bits(itemToSerialize.AIBits); serializedItem.add_collidable(itemToSerialize.Collidable); @@ -957,8 +957,8 @@ bool SaveGame::Load(int slot) item->Position.zRot = savedItem->position()->z_rot(); } - item->Velocity = savedItem->velocity(); - item->VerticalVelocity = savedItem->vertical_velocity(); + item->Animation.Velocity = savedItem->velocity(); + item->Animation.VerticalVelocity = savedItem->vertical_velocity(); // Do the correct way for assigning new room number if (item->ObjectNumber == ID_LARA) @@ -983,11 +983,11 @@ bool SaveGame::Load(int slot) } // Animations - item->ActiveState = savedItem->active_state(); - item->RequiredState = savedItem->required_state(); - item->TargetState = savedItem->target_state(); - item->AnimNumber = obj->animIndex + savedItem->anim_number(); - item->FrameNumber = savedItem->frame_number(); + item->Animation.ActiveState = savedItem->active_state(); + item->Animation.RequiredState = savedItem->required_state(); + item->Animation.TargetState = savedItem->target_state(); + item->Animation.AnimNumber = obj->animIndex + savedItem->anim_number(); + item->Animation.FrameNumber = savedItem->frame_number(); // Hit points item->HitPoints = savedItem->hit_points(); @@ -1010,7 +1010,7 @@ bool SaveGame::Load(int slot) item->HitStatus = savedItem->hit_stauts(); item->Status = savedItem->status(); item->AIBits = savedItem->ai_bits(); - item->Airborne = savedItem->airborne(); + item->Animation.Airborne = savedItem->airborne(); item->Collidable = savedItem->collidable(); item->LookedAt = savedItem->looked_at(); @@ -1070,7 +1070,7 @@ bool SaveGame::Load(int slot) || item->Status == ITEM_DEACTIVATED)) { item->ObjectNumber = (GAME_OBJECT_ID)((int)item->ObjectNumber + ID_PUZZLE_DONE1 - ID_PUZZLE_HOLE1); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + savedItem->anim_number(); + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + savedItem->anim_number(); } if ((item->ObjectNumber >= ID_SMASH_OBJECT1) diff --git a/TR5Main/Objects/Effects/flame_emitters.cpp b/TR5Main/Objects/Effects/flame_emitters.cpp index 2b6ec4479..7cfa4d039 100644 --- a/TR5Main/Objects/Effects/flame_emitters.cpp +++ b/TR5Main/Objects/Effects/flame_emitters.cpp @@ -646,9 +646,9 @@ namespace TEN::Entities::Effects || Lara.LitTorch == (item->Status & 1) || item->Timer == -1 || !(TrInput & IN_ACTION) - || l->ActiveState != LS_IDLE - || l->AnimNumber != LA_STAND_IDLE - || l->Airborne) + || l->Animation.ActiveState != LS_IDLE + || l->Animation.AnimNumber != LA_STAND_IDLE + || l->Animation.Airborne) { if (item->ObjectNumber == ID_BURNING_ROOTS) ObjectCollision(itemNumber, l, coll); @@ -693,17 +693,17 @@ namespace TEN::Entities::Effects { if (item->ObjectNumber == ID_BURNING_ROOTS) { - l->AnimNumber = LA_TORCH_LIGHT_5; + l->Animation.AnimNumber = LA_TORCH_LIGHT_5; } else { int dy = abs(l->Position.yPos - item->Position.yPos); l->ItemFlags[3] = 1; - l->AnimNumber = (dy >> 8) + LA_TORCH_LIGHT_1; + l->Animation.AnimNumber = (dy >> 8) + LA_TORCH_LIGHT_1; } - l->ActiveState = LS_MISC_CONTROL; - l->FrameNumber = g_Level.Anims[l->AnimNumber].frameBase; + l->Animation.ActiveState = LS_MISC_CONTROL; + l->Animation.FrameNumber = g_Level.Anims[l->Animation.AnimNumber].frameBase; Lara.Flare.ControlLeft = false; Lara.LeftArm.Locked = true; Lara.InteractedItem = itemNumber; @@ -714,11 +714,11 @@ namespace TEN::Entities::Effects if (Lara.InteractedItem == itemNumber && item->Status != ITEM_ACTIVE - && l->ActiveState == LS_MISC_CONTROL) + && l->Animation.ActiveState == LS_MISC_CONTROL) { - if (l->AnimNumber >= LA_TORCH_LIGHT_1 && l->AnimNumber <= LA_TORCH_LIGHT_5) + if (l->Animation.AnimNumber >= LA_TORCH_LIGHT_1 && l->Animation.AnimNumber <= LA_TORCH_LIGHT_5) { - if (l->FrameNumber - g_Level.Anims[l->AnimNumber].frameBase == 40) + if (l->Animation.FrameNumber - g_Level.Anims[l->Animation.AnimNumber].frameBase == 40) { TestTriggers(item, true, item->Flags & IFLAG_ACTIVATION_MASK); diff --git a/TR5Main/Objects/Generic/Doors/double_doors.cpp b/TR5Main/Objects/Generic/Doors/double_doors.cpp index a647a0486..4ca74f8eb 100644 --- a/TR5Main/Objects/Generic/Doors/double_doors.cpp +++ b/TR5Main/Objects/Generic/Doors/double_doors.cpp @@ -39,10 +39,10 @@ namespace TEN::Entities::Doors auto* doorItem = &g_Level.Items[itemNumber]; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && !laraItem->HitStatus && - !(doorItem->Status && doorItem->Airborne) && + !(doorItem->Status && doorItem->Animation.Airborne) && laraInfo->Control.HandStatus == HandStatus::Free || laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber) { diff --git a/TR5Main/Objects/Generic/Doors/generic_doors.cpp b/TR5Main/Objects/Generic/Doors/generic_doors.cpp index 46fafe158..35ad03bff 100644 --- a/TR5Main/Objects/Generic/Doors/generic_doors.cpp +++ b/TR5Main/Objects/Generic/Doors/generic_doors.cpp @@ -168,10 +168,10 @@ namespace TEN::Entities::Doors auto* doorItem = &g_Level.Items[itemNumber]; if (doorItem->TriggerFlags == 2 && - doorItem->Status == ITEM_NOT_ACTIVE && !doorItem->Airborne && // CHECK + doorItem->Status == ITEM_NOT_ACTIVE && !doorItem->Animation.Airborne && // CHECK ((TrInput & IN_ACTION || g_Gui.GetInventoryItemChosen() == ID_CROWBAR_ITEM) && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && !laraItem->HitStatus && laraInfo->Control.HandStatus == HandStatus::Free || laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber)) @@ -224,7 +224,7 @@ namespace TEN::Entities::Doors laraInfo->Control.HandStatus = HandStatus::Busy; doorItem->Flags |= IFLAG_ACTIVATION_MASK; doorItem->Status = ITEM_ACTIVE; - doorItem->TargetState = LS_RUN_FORWARD; + doorItem->Animation.TargetState = LS_RUN_FORWARD; return; } @@ -310,8 +310,8 @@ namespace TEN::Entities::Doors { if (TriggerActive(doorItem)) { - if (doorItem->ActiveState == 0) - doorItem->TargetState = 1; + if (doorItem->Animation.ActiveState == 0) + doorItem->Animation.TargetState = 1; else if (!doorData->opened) { OpenThatDoor(&doorData->d1, doorData); @@ -325,8 +325,8 @@ namespace TEN::Entities::Doors { doorItem->Status = ITEM_ACTIVE; - if (doorItem->ActiveState == 1) - doorItem->TargetState = 0; + if (doorItem->Animation.ActiveState == 1) + doorItem->Animation.TargetState = 0; else if (doorData->opened) { ShutThatDoor(&doorData->d1, doorData); diff --git a/TR5Main/Objects/Generic/Doors/pushpull_kick_door.cpp b/TR5Main/Objects/Generic/Doors/pushpull_kick_door.cpp index fe81fff29..8074ce0fd 100644 --- a/TR5Main/Objects/Generic/Doors/pushpull_kick_door.cpp +++ b/TR5Main/Objects/Generic/Doors/pushpull_kick_door.cpp @@ -50,8 +50,8 @@ namespace TEN::Entities::Doors auto* doorItem = &g_Level.Items[itemNumber]; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && !laraItem->HitStatus && doorItem->Status != ITEM_ACTIVE && laraInfo->Control.HandStatus == HandStatus::Free || @@ -74,7 +74,7 @@ namespace TEN::Entities::Doors if (MoveLaraPosition(&PullDoorPos, doorItem, laraItem)) { SetAnimation(laraItem, LA_DOOR_OPEN_PULL); - doorItem->TargetState = STATE_PUSHPULL_KICK_DOOR_PULL; + doorItem->Animation.TargetState = STATE_PUSHPULL_KICK_DOOR_PULL; openTheDoor = true; } else @@ -87,7 +87,7 @@ namespace TEN::Entities::Doors if (MoveLaraPosition(&KickDoorPos, doorItem, laraItem)) { SetAnimation(laraItem, LA_DOOR_OPEN_KICK); - doorItem->TargetState = STATE_PUSHPULL_KICK_DOOR_PUSH; + doorItem->Animation.TargetState = STATE_PUSHPULL_KICK_DOOR_PUSH; openTheDoor = true; } else @@ -98,7 +98,7 @@ namespace TEN::Entities::Doors if (MoveLaraPosition(&PushDoorPos, doorItem, laraItem)) { SetAnimation(laraItem, LA_DOOR_OPEN_PUSH); - doorItem->TargetState = STATE_PUSHPULL_KICK_DOOR_PUSH; + doorItem->Animation.TargetState = STATE_PUSHPULL_KICK_DOOR_PUSH; openTheDoor = true; } else @@ -110,8 +110,8 @@ namespace TEN::Entities::Doors { AddActiveItem(itemNumber); - laraItem->ActiveState = LS_MISC_CONTROL; - laraItem->TargetState = LS_IDLE; + laraItem->Animation.ActiveState = LS_MISC_CONTROL; + laraItem->Animation.TargetState = LS_IDLE; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; doorItem->Status = ITEM_ACTIVE; @@ -127,7 +127,7 @@ namespace TEN::Entities::Doors if (pull) doorItem->Position.yRot ^= ANGLE(180.0f); } - else if (doorItem->ActiveState <= STATE_PUSHPULL_KICK_DOOR_CLOSED) + else if (doorItem->Animation.ActiveState <= STATE_PUSHPULL_KICK_DOOR_CLOSED) DoorCollision(itemNumber, laraItem, coll); } diff --git a/TR5Main/Objects/Generic/Doors/sequence_door.cpp b/TR5Main/Objects/Generic/Doors/sequence_door.cpp index 4a31e5005..6b6d1df1d 100644 --- a/TR5Main/Objects/Generic/Doors/sequence_door.cpp +++ b/TR5Main/Objects/Generic/Doors/sequence_door.cpp @@ -32,10 +32,10 @@ namespace TEN::Entities::Doors { if (SequenceResults[Sequences[0]][Sequences[1]][Sequences[2]] == doorItem->TriggerFlags) { - if (doorItem->ActiveState == 1) - doorItem->TargetState = 1; + if (doorItem->Animation.ActiveState == 1) + doorItem->Animation.TargetState = 1; else - doorItem->TargetState = 0; + doorItem->Animation.TargetState = 0; TestTriggers(doorItem, true); } @@ -43,9 +43,9 @@ namespace TEN::Entities::Doors CurrentSequence = 4; } - if (doorItem->ActiveState == doorItem->TargetState) + if (doorItem->Animation.ActiveState == doorItem->Animation.TargetState) { - if (doorItem->ActiveState == 1) + if (doorItem->Animation.ActiveState == 1) { if (!doorData->opened) { diff --git a/TR5Main/Objects/Generic/Doors/underwater_door.cpp b/TR5Main/Objects/Generic/Doors/underwater_door.cpp index d898e92cc..f45871de6 100644 --- a/TR5Main/Objects/Generic/Doors/underwater_door.cpp +++ b/TR5Main/Objects/Generic/Doors/underwater_door.cpp @@ -39,9 +39,9 @@ namespace TEN::Entities::Doors auto* doorItem = &g_Level.Items[itemNumber]; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_UNDERWATER_STOP && + laraItem->Animation.ActiveState == LS_UNDERWATER_STOP && laraInfo->Control.WaterStatus == WaterStatus::Underwater && - !(doorItem->Status && doorItem->Airborne) && + !(doorItem->Status && doorItem->Animation.Airborne) && laraInfo->Control.HandStatus == HandStatus::Free || laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber) { @@ -52,12 +52,12 @@ namespace TEN::Entities::Doors if (MoveLaraPosition(&UnderwaterDoorPos, doorItem, laraItem)) { SetAnimation(laraItem, LA_UNDERWATER_DOOR_OPEN); - laraItem->VerticalVelocity = 0; + laraItem->Animation.VerticalVelocity = 0; doorItem->Status = ITEM_ACTIVE; AddActiveItem(itemNumber); - doorItem->TargetState = LS_RUN_FORWARD; + doorItem->Animation.TargetState = LS_RUN_FORWARD; AnimateItem(doorItem); diff --git a/TR5Main/Objects/Generic/Object/burning_torch.cpp b/TR5Main/Objects/Generic/Object/burning_torch.cpp index fa14dbec3..b24e9ae0d 100644 --- a/TR5Main/Objects/Generic/Object/burning_torch.cpp +++ b/TR5Main/Objects/Generic/Object/burning_torch.cpp @@ -77,14 +77,14 @@ namespace TEN::Entities::Generic } if (TrInput & IN_DRAW && - !LaraItem->VerticalVelocity && - !LaraItem->Airborne && - LaraItem->ActiveState != LS_JUMP_PREPARE && - LaraItem->ActiveState != LS_JUMP_UP && - LaraItem->ActiveState != LS_JUMP_FORWARD && - LaraItem->ActiveState != LS_JUMP_BACK && - LaraItem->ActiveState != LS_JUMP_LEFT && - LaraItem->ActiveState != LS_JUMP_RIGHT || + !LaraItem->Animation.VerticalVelocity && + !LaraItem->Animation.Airborne && + LaraItem->Animation.ActiveState != LS_JUMP_PREPARE && + LaraItem->Animation.ActiveState != LS_JUMP_UP && + LaraItem->Animation.ActiveState != LS_JUMP_FORWARD && + LaraItem->Animation.ActiveState != LS_JUMP_BACK && + LaraItem->Animation.ActiveState != LS_JUMP_LEFT && + LaraItem->Animation.ActiveState != LS_JUMP_RIGHT || Lara.Control.WaterStatus == WaterStatus::Underwater) { Lara.LeftArm.Locked = true; @@ -98,7 +98,7 @@ namespace TEN::Entities::Generic break; case 1: - if (Lara.LeftArm.FrameNumber < 12 && LaraItem->Airborne) + if (Lara.LeftArm.FrameNumber < 12 && LaraItem->Animation.Airborne) { Lara.LeftArm.Locked = false; Lara.LeftArm.FrameNumber = 0; @@ -145,7 +145,7 @@ namespace TEN::Entities::Generic break; case 3: - if (LaraItem->ActiveState != LS_MISC_CONTROL) + if (LaraItem->Animation.ActiveState != LS_MISC_CONTROL) { Lara.LeftArm.Locked = false; Lara.LeftArm.FrameNumber = 0; @@ -204,35 +204,35 @@ namespace TEN::Entities::Generic int oldY = item->Position.yPos; int oldZ = item->Position.zPos; - if (item->VerticalVelocity) + if (item->Animation.VerticalVelocity) item->Position.zRot += ANGLE(5); - else if (!item->Velocity) + else if (!item->Animation.Velocity) { item->Position.xRot = 0; item->Position.zRot = 0; } - int xv = item->Velocity * phd_sin(item->Position.yRot); - int zv = item->Velocity * phd_cos(item->Position.yRot); + int xv = item->Animation.Velocity * phd_sin(item->Position.yRot); + int zv = item->Animation.Velocity * phd_cos(item->Position.yRot); item->Position.xPos += xv; item->Position.zPos += zv; if (g_Level.Rooms[item->RoomNumber].flags & ENV_FLAG_WATER) { - item->VerticalVelocity += (5 - item->VerticalVelocity) / 2; - item->Velocity += (5 - item->Velocity) / 2; + item->Animation.VerticalVelocity += (5 - item->Animation.VerticalVelocity) / 2; + item->Animation.Velocity += (5 - item->Animation.Velocity) / 2; if (item->ItemFlags[3] != 0) item->ItemFlags[3] = 0; } else { - item->VerticalVelocity += 6; + item->Animation.VerticalVelocity += 6; } - item->Position.yPos += item->VerticalVelocity; + item->Position.yPos += item->Animation.VerticalVelocity; - DoProjectileDynamics(itemNumber, oldX, oldY, oldZ, xv, item->VerticalVelocity, zv); + DoProjectileDynamics(itemNumber, oldX, oldY, oldZ, xv, item->Animation.VerticalVelocity, zv); if (GetCollidedObjects(item, 0, true, CollidedItems, CollidedMeshes, 0)) { @@ -247,7 +247,7 @@ namespace TEN::Entities::Generic { ItemPushStatic(item, CollidedMeshes[0], &LaraCollision); } - item->Velocity >>= 1; + item->Animation.Velocity >>= 1; } if (item->ItemFlags[3]) { @@ -292,9 +292,9 @@ namespace TEN::Entities::Generic if ( !(TrInput & IN_ACTION) || - laraItem->ActiveState != LS_IDLE || - laraItem->AnimNumber != LA_STAND_IDLE || - laraItem->Airborne || + laraItem->Animation.ActiveState != LS_IDLE || + laraItem->Animation.AnimNumber != LA_STAND_IDLE || + laraItem->Animation.Airborne || laraInfo->Control.Weapon.GunType != LaraWeaponType::Torch || laraInfo->Control.HandStatus != HandStatus::WeaponReady || laraInfo->LeftArm.Locked || @@ -343,16 +343,16 @@ namespace TEN::Entities::Generic if (TestLaraPosition(&FireBounds, torchItem, laraItem)) { if (torchItem->ObjectNumber == ID_BURNING_ROOTS) - laraItem->AnimNumber = LA_TORCH_LIGHT_5; + laraItem->Animation.AnimNumber = LA_TORCH_LIGHT_5; else { int dy = abs(laraItem->Position.yPos - torchItem->Position.yPos); laraItem->ItemFlags[3] = 1; - laraItem->AnimNumber = (dy >> 8) + LA_TORCH_LIGHT_1; + laraItem->Animation.AnimNumber = (dy >> 8) + LA_TORCH_LIGHT_1; } - laraItem->ActiveState = LS_MISC_CONTROL; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.ActiveState = LS_MISC_CONTROL; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; laraInfo->Flare.ControlLeft = false; laraInfo->LeftArm.Locked = true; laraInfo->InteractedItem = itemNumber; @@ -360,14 +360,14 @@ namespace TEN::Entities::Generic torchItem->Position.yRot = rot; } - if (laraItem->ActiveState == LS_MISC_CONTROL && + if (laraItem->Animation.ActiveState == LS_MISC_CONTROL && laraInfo->InteractedItem == itemNumber && torchItem->Status != ITEM_ACTIVE) { - if (laraItem->AnimNumber >= LA_TORCH_LIGHT_1 && - laraItem->AnimNumber <= LA_TORCH_LIGHT_5) + if (laraItem->Animation.AnimNumber >= LA_TORCH_LIGHT_1 && + laraItem->Animation.AnimNumber <= LA_TORCH_LIGHT_5) { - if (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase == 40) + if (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase == 40) { TestTriggers(torchItem, true, torchItem->Flags & IFLAG_ACTIVATION_MASK); torchItem->Flags |= 0x3E00; diff --git a/TR5Main/Objects/Generic/Object/generic_trapdoor.cpp b/TR5Main/Objects/Generic/Object/generic_trapdoor.cpp index d95d97d98..3fe0bd2aa 100644 --- a/TR5Main/Objects/Generic/Object/generic_trapdoor.cpp +++ b/TR5Main/Objects/Generic/Object/generic_trapdoor.cpp @@ -49,8 +49,8 @@ void TrapDoorCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) { auto* trapDoorItem = &g_Level.Items[itemNumber]; - if (trapDoorItem->ActiveState == 1 && - trapDoorItem->FrameNumber == g_Level.Anims[trapDoorItem->AnimNumber].frameEnd) + if (trapDoorItem->Animation.ActiveState == 1 && + trapDoorItem->Animation.FrameNumber == g_Level.Anims[trapDoorItem->Animation.AnimNumber].frameEnd) { ObjectCollision(itemNumber, laraItem, coll); } @@ -70,8 +70,8 @@ void CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* if (TrInput & IN_ACTION && trapDoorItem->Status != ITEM_ACTIVE && - laraItem->ActiveState == LS_JUMP_UP && - laraItem->Airborne && + laraItem->Animation.ActiveState == LS_JUMP_UP && + laraItem->Animation.Airborne && laraInfo->Control.HandStatus == HandStatus::Free && itemIsAbove && (result || result2)) @@ -81,15 +81,15 @@ void CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* laraItem->Position.yRot += ANGLE(180.0f); ResetLaraFlex(laraItem); - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; - laraItem->AnimNumber = LA_TRAPDOOR_CEILING_OPEN; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = LS_FREEFALL_BIS; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; + laraItem->Animation.AnimNumber = LA_TRAPDOOR_CEILING_OPEN; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = LS_FREEFALL_BIS; laraInfo->Control.HandStatus = HandStatus::Busy; AddActiveItem(itemNumber); trapDoorItem->Status = ITEM_ACTIVE; - trapDoorItem->TargetState = 1; + trapDoorItem->Animation.TargetState = 1; UseForcedFixedCamera = 1; ForcedFixedCamera.x = trapDoorItem->Position.xPos - phd_sin(trapDoorItem->Position.yRot) * 1024; @@ -99,12 +99,12 @@ void CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* } else { - if (trapDoorItem->ActiveState == 1) + if (trapDoorItem->Animation.ActiveState == 1) UseForcedFixedCamera = 0; } - if (trapDoorItem->ActiveState == 1 && - trapDoorItem->FrameNumber == g_Level.Anims[trapDoorItem->AnimNumber].frameEnd) + if (trapDoorItem->Animation.ActiveState == 1 && + trapDoorItem->Animation.FrameNumber == g_Level.Anims[trapDoorItem->Animation.AnimNumber].frameEnd) { ObjectCollision(itemNumber, laraItem, coll); } @@ -116,8 +116,8 @@ void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* co auto* trapDoorItem = &g_Level.Items[itemNumber]; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && laraInfo->Control.HandStatus == HandStatus::Free && trapDoorItem->Status != ITEM_ACTIVE || laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber) @@ -127,14 +127,14 @@ void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* co if (MoveLaraPosition(&FloorTrapDoorPos, trapDoorItem, laraItem)) { ResetLaraFlex(laraItem); - laraItem->AnimNumber = LA_TRAPDOOR_FLOOR_OPEN; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = LS_TRAPDOOR_FLOOR_OPEN; + laraItem->Animation.AnimNumber = LA_TRAPDOOR_FLOOR_OPEN; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = LS_TRAPDOOR_FLOOR_OPEN; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; AddActiveItem(itemNumber); trapDoorItem->Status = ITEM_ACTIVE; - trapDoorItem->TargetState = 1; + trapDoorItem->Animation.TargetState = 1; UseForcedFixedCamera = 1; ForcedFixedCamera.x = trapDoorItem->Position.xPos - phd_sin(trapDoorItem->Position.yRot) * 2048; @@ -152,11 +152,11 @@ void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* co } else { - if (trapDoorItem->ActiveState == 1) + if (trapDoorItem->Animation.ActiveState == 1) UseForcedFixedCamera = 0; } - if (trapDoorItem->ActiveState == 1 && trapDoorItem->FrameNumber == g_Level.Anims[trapDoorItem->AnimNumber].frameEnd) + if (trapDoorItem->Animation.ActiveState == 1 && trapDoorItem->Animation.FrameNumber == g_Level.Anims[trapDoorItem->Animation.AnimNumber].frameEnd) ObjectCollision(itemNumber, laraItem, coll); } @@ -166,24 +166,24 @@ void TrapDoorControl(short itemNumber) if (TriggerActive(trapDoorItem)) { - if (!trapDoorItem->ActiveState && trapDoorItem->TriggerFlags >= 0) - trapDoorItem->TargetState = 1; - else if (trapDoorItem->FrameNumber == g_Level.Anims[trapDoorItem->AnimNumber].frameEnd && CurrentLevel == 14 && trapDoorItem->ObjectNumber == ID_TRAPDOOR1) + if (!trapDoorItem->Animation.ActiveState && trapDoorItem->TriggerFlags >= 0) + trapDoorItem->Animation.TargetState = 1; + else if (trapDoorItem->Animation.FrameNumber == g_Level.Anims[trapDoorItem->Animation.AnimNumber].frameEnd && CurrentLevel == 14 && trapDoorItem->ObjectNumber == ID_TRAPDOOR1) trapDoorItem->Status = ITEM_INVISIBLE; } else { trapDoorItem->Status = ITEM_ACTIVE; - if (trapDoorItem->ActiveState == 1) - trapDoorItem->TargetState = 0; + if (trapDoorItem->Animation.ActiveState == 1) + trapDoorItem->Animation.TargetState = 0; } AnimateItem(trapDoorItem); - if (trapDoorItem->ActiveState == 1 && (trapDoorItem->ItemFlags[2] || JustLoaded)) + if (trapDoorItem->Animation.ActiveState == 1 && (trapDoorItem->ItemFlags[2] || JustLoaded)) OpenTrapDoor(itemNumber); - else if (!trapDoorItem->ActiveState && !trapDoorItem->ItemFlags[2]) + else if (!trapDoorItem->Animation.ActiveState && !trapDoorItem->ItemFlags[2]) CloseTrapDoor(itemNumber); } diff --git a/TR5Main/Objects/Generic/Object/objects.cpp b/TR5Main/Objects/Generic/Object/objects.cpp index 2f236261a..26736aad4 100644 --- a/TR5Main/Objects/Generic/Object/objects.cpp +++ b/TR5Main/Objects/Generic/Object/objects.cpp @@ -122,15 +122,15 @@ void TightropeCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) auto* tightropeItem = &g_Level.Items[itemNumber]; if ((!(TrInput & IN_ACTION) || - laraItem->ActiveState != LS_IDLE || - laraItem->AnimNumber != LA_STAND_IDLE || + laraItem->Animation.ActiveState != LS_IDLE || + laraItem->Animation.AnimNumber != LA_STAND_IDLE || laraItem->Status == ITEM_INVISIBLE || laraInfo->Control.HandStatus != HandStatus::Free) && (!laraInfo->Control.IsMoving || laraInfo->InteractedItem !=itemNumber)) { #ifdef NEW_TIGHTROPE - if (laraItem->ActiveState == LS_TIGHTROPE_WALK && - laraItem->TargetState != LS_TIGHTROPE_DISMOUNT && + if (laraItem->Animation.ActiveState == LS_TIGHTROPE_WALK && + laraItem->Animation.TargetState != LS_TIGHTROPE_DISMOUNT && !laraInfo->Control.Tightrope.CanDismount) { if (tightropeItem->Position.yRot == laraItem->Position.yRot) @@ -141,8 +141,8 @@ void TightropeCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) } #else // !NEW_TIGHTROPE - if (laraItem->ActiveState == LS_TIGHTROPE_WALK && - laraItem->TargetState != LS_TIGHTROPE_DISMOUNT && + if (laraItem->Animation.ActiveState == LS_TIGHTROPE_WALK && + laraItem->Animation.TargetState != LS_TIGHTROPE_DISMOUNT && !laraInfo->Control.Tightrope.Off) { if (item->Position.yRot == laraItem->Position.yRot) @@ -161,9 +161,9 @@ void TightropeCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) { if (MoveLaraPosition(&TightRopePos, tightropeItem, laraItem)) { - laraItem->ActiveState = LS_TIGHTROPE_ENTER; - laraItem->AnimNumber = LA_TIGHTROPE_START; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.ActiveState = LS_TIGHTROPE_ENTER; + laraItem->Animation.AnimNumber = LA_TIGHTROPE_START; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; laraInfo->Control.IsMoving = false; ResetLaraFlex(laraItem); #ifdef NEW_TIGHTROPE @@ -198,8 +198,8 @@ void HorizontalBarCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* co auto* barItem = &g_Level.Items[itemNumber]; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_REACH && - laraItem->AnimNumber == LA_REACH) + laraItem->Animation.ActiveState == LS_REACH && + laraItem->Animation.AnimNumber == LA_REACH) { int test1 = TestLaraPosition(&ParallelBarsBounds, barItem, laraItem); int test2 = 0; @@ -212,11 +212,11 @@ void HorizontalBarCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* co if (test1 || test2) { - laraItem->ActiveState = LS_MISC_CONTROL; - laraItem->AnimNumber = LA_SWINGBAR_GRAB; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->VerticalVelocity = false; - laraItem->Airborne = false; + laraItem->Animation.ActiveState = LS_MISC_CONTROL; + laraItem->Animation.AnimNumber = LA_SWINGBAR_GRAB; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.VerticalVelocity = false; + laraItem->Animation.Airborne = false; ResetLaraFlex(barItem); @@ -242,7 +242,7 @@ void HorizontalBarCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* co else ObjectCollision(itemNumber, laraItem, coll); } - else if (laraItem->ActiveState != LS_HORIZONTAL_BAR_SWING) + else if (laraItem->Animation.ActiveState != LS_HORIZONTAL_BAR_SWING) ObjectCollision(itemNumber, laraItem, coll); } diff --git a/TR5Main/Objects/Generic/Object/polerope.cpp b/TR5Main/Objects/Generic/Object/polerope.cpp index 0ca07f16c..3a0610cde 100644 --- a/TR5Main/Objects/Generic/Object/polerope.cpp +++ b/TR5Main/Objects/Generic/Object/polerope.cpp @@ -37,8 +37,8 @@ namespace TEN::Entities::Generic if (TrInput & IN_ACTION && isLara && laraInfo->Control.HandStatus == HandStatus::Free && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE || laraInfo->Control.IsMoving && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE || laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber) { short rot = poleItem->Position.yRot; @@ -48,9 +48,9 @@ namespace TEN::Entities::Generic { if (MoveLaraPosition(&PolePos, poleItem, laraItem)) { - laraItem->AnimNumber = LA_STAND_TO_POLE; - laraItem->ActiveState = LS_POLE_IDLE; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_STAND_TO_POLE; + laraItem->Animation.ActiveState = LS_POLE_IDLE; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; } @@ -72,9 +72,9 @@ namespace TEN::Entities::Generic } else if (TrInput & IN_ACTION && isLara && laraInfo->Control.HandStatus == HandStatus::Free && - laraItem->Airborne && - laraItem->VerticalVelocity > (int)laraInfo->Control.HandStatus && // ????? - laraItem->ActiveState == LS_REACH || laraItem->ActiveState == LS_JUMP_UP) + laraItem->Animation.Airborne && + laraItem->Animation.VerticalVelocity > (int)laraInfo->Control.HandStatus && // ????? + laraItem->Animation.ActiveState == LS_REACH || laraItem->Animation.ActiveState == LS_JUMP_UP) { if (TestBoundsCollide(poleItem, laraItem, 100) && TestLaraPoleCollision(laraItem, coll, true, -CLICK(1)) && @@ -84,24 +84,24 @@ namespace TEN::Entities::Generic { short rot = poleItem->Position.yRot; poleItem->Position.yRot = laraItem->Position.yRot; - if (laraItem->ActiveState == LS_REACH) + if (laraItem->Animation.ActiveState == LS_REACH) { PolePosR.y = laraItem->Position.yPos - poleItem->Position.yPos + 10; AlignLaraPosition(&PolePosR, poleItem, laraItem); - laraItem->AnimNumber = LA_REACH_TO_POLE; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_REACH_TO_POLE; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; } else { PolePosR.y = laraItem->Position.yPos - poleItem->Position.yPos + 66; AlignLaraPosition(&PolePosR, poleItem, laraItem); - laraItem->AnimNumber = LA_JUMP_UP_TO_POLE; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_JUMP_UP_TO_POLE; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; } - laraItem->ActiveState = LS_POLE_IDLE; - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; + laraItem->Animation.ActiveState = LS_POLE_IDLE; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; laraInfo->Control.HandStatus = HandStatus::Busy; poleItem->Position.yRot = rot; } @@ -109,9 +109,9 @@ namespace TEN::Entities::Generic } else { - if (!isLara || ((laraItem->ActiveState < LS_POLE_IDLE || - laraItem->ActiveState > LS_POLE_TURN_COUNTER_CLOCKWISE) && - laraItem->ActiveState != LS_JUMP_BACK)) + if (!isLara || ((laraItem->Animation.ActiveState < LS_POLE_IDLE || + laraItem->Animation.ActiveState > LS_POLE_TURN_COUNTER_CLOCKWISE) && + laraItem->Animation.ActiveState != LS_JUMP_BACK)) { ObjectCollision(itemNumber, laraItem, coll); } diff --git a/TR5Main/Objects/Generic/Object/rope.cpp b/TR5Main/Objects/Generic/Object/rope.cpp index e8916d632..8b9e88283 100644 --- a/TR5Main/Objects/Generic/Object/rope.cpp +++ b/TR5Main/Objects/Generic/Object/rope.cpp @@ -177,9 +177,9 @@ namespace TEN::Entities::Generic if (TrInput & IN_ACTION && laraInfo->Control.HandStatus == HandStatus::Free && - (laraItem->ActiveState == LS_REACH || laraItem->ActiveState == LS_JUMP_UP) && - laraItem->Airborne && - laraItem->VerticalVelocity > 0&& + (laraItem->Animation.ActiveState == LS_REACH || laraItem->Animation.ActiveState == LS_JUMP_UP) && + laraItem->Animation.Airborne && + laraItem->Animation.VerticalVelocity > 0&& rope->active) { auto* frame = GetBoundsAccurate(laraItem); @@ -189,26 +189,26 @@ namespace TEN::Entities::Generic laraItem->Position.xPos, laraItem->Position.yPos + frame->Y1 + 512, laraItem->Position.zPos + frame->Z2 * phd_cos(laraItem->Position.yRot), - laraItem->ActiveState == LS_REACH ? 128 : 320); + laraItem->Animation.ActiveState == LS_REACH ? 128 : 320); if (segment >= 0) { - if (laraItem->ActiveState == LS_REACH) + if (laraItem->Animation.ActiveState == LS_REACH) { - laraItem->AnimNumber = LA_REACH_TO_ROPE_SWING; - laraItem->ActiveState = LS_ROPE_SWING; + laraItem->Animation.AnimNumber = LA_REACH_TO_ROPE_SWING; + laraItem->Animation.ActiveState = LS_ROPE_SWING; laraInfo->Control.Rope.Frame = g_Level.Anims[LA_ROPE_SWING].frameBase + 32 << 8; laraInfo->Control.Rope.DFrame = g_Level.Anims[LA_ROPE_SWING].frameBase + 60 << 8; } else { - laraItem->AnimNumber = LA_JUMP_UP_TO_ROPE_START; - laraItem->ActiveState = LS_ROPE_IDLE; + laraItem->Animation.AnimNumber = LA_JUMP_UP_TO_ROPE_START; + laraItem->Animation.ActiveState = LS_ROPE_IDLE; } - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; laraInfo->Control.HandStatus = HandStatus::Busy; laraInfo->Control.Rope.Ptr = ropeItem->TriggerFlags; @@ -221,7 +221,7 @@ namespace TEN::Entities::Generic CurrentPendulum.velocity.y = 0; CurrentPendulum.velocity.z = 0; - ApplyVelocityToRope(segment, laraItem->Position.yRot, 16 * laraItem->Velocity); + ApplyVelocityToRope(segment, laraItem->Position.yRot, 16 * laraItem->Animation.Velocity); } } } @@ -609,47 +609,47 @@ namespace TEN::Entities::Generic { if (item->Position.xRot >= 0) { - item->VerticalVelocity = -112; - item->Velocity = item->Position.xRot / 128; + item->Animation.VerticalVelocity = -112; + item->Animation.Velocity = item->Position.xRot / 128; } else { - item->Velocity = 0; - item->VerticalVelocity = -20; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = -20; } item->Position.xRot = 0; - item->Airborne = true; + item->Animation.Airborne = true; Lara.Control.HandStatus = HandStatus::Free; - if (item->FrameNumber - g_Level.Anims[LA_ROPE_SWING].frameBase > 42) - item->AnimNumber = LA_ROPE_SWING_TO_REACH_1; - else if (item->FrameNumber - g_Level.Anims[LA_ROPE_SWING].frameBase > 21) - item->AnimNumber = LA_ROPE_SWING_TO_REACH_2; + if (item->Animation.FrameNumber - g_Level.Anims[LA_ROPE_SWING].frameBase > 42) + item->Animation.AnimNumber = LA_ROPE_SWING_TO_REACH_1; + else if (item->Animation.FrameNumber - g_Level.Anims[LA_ROPE_SWING].frameBase > 21) + item->Animation.AnimNumber = LA_ROPE_SWING_TO_REACH_2; else - item->AnimNumber = LA_ROPE_SWING_TO_REACH_3; + item->Animation.AnimNumber = LA_ROPE_SWING_TO_REACH_3; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = LS_REACH; - item->TargetState = LS_REACH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = LS_REACH; + item->Animation.TargetState = LS_REACH; Lara.Control.Rope.Ptr = -1; } } void FallFromRope(ITEM_INFO* item) { - item->Velocity = abs(CurrentPendulum.velocity.x >> FP_SHIFT) + abs(CurrentPendulum.velocity.z >> FP_SHIFT) >> 1; + item->Animation.Velocity = abs(CurrentPendulum.velocity.x >> FP_SHIFT) + abs(CurrentPendulum.velocity.z >> FP_SHIFT) >> 1; item->Position.xRot = 0; item->Position.yPos += 320; - item->AnimNumber = LA_FALL_START; - item->FrameNumber = g_Level.Anims[LA_FALL_START].frameBase; - item->ActiveState = LS_JUMP_FORWARD; - item->TargetState = LS_JUMP_FORWARD; + item->Animation.AnimNumber = LA_FALL_START; + item->Animation.FrameNumber = g_Level.Anims[LA_FALL_START].frameBase; + item->Animation.ActiveState = LS_JUMP_FORWARD; + item->Animation.TargetState = LS_JUMP_FORWARD; - item->VerticalVelocity = 0; - item->Airborne = true; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = true; Lara.Control.HandStatus = HandStatus::Free; Lara.Control.Rope.Ptr = -1; @@ -690,17 +690,17 @@ namespace TEN::Entities::Generic } } - if (item->AnimNumber == LA_ROPE_DOWN && item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.AnimNumber == LA_ROPE_DOWN && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) { SoundEffect(SFX_TR4_LARA_POLE_LOOP, &LaraItem->Position, 0); - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; Lara.Control.Rope.Flag = 0; ++Lara.Control.Rope.Segment; Lara.Control.Rope.Offset = 0; } if (!(TrInput & IN_BACK) || Lara.Control.Rope.Segment >= 21) - item->TargetState = LS_ROPE_IDLE; + item->Animation.TargetState = LS_ROPE_IDLE; } } diff --git a/TR5Main/Objects/Generic/Switches/cog_switch.cpp b/TR5Main/Objects/Generic/Switches/cog_switch.cpp index 433491831..d499a04e8 100644 --- a/TR5Main/Objects/Generic/Switches/cog_switch.cpp +++ b/TR5Main/Objects/Generic/Switches/cog_switch.cpp @@ -68,10 +68,10 @@ namespace TEN::Entities::Switches { if (!(switchItem->Flags & ONESHOT) && (TrInput & IN_ACTION && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && laraInfo->Control.HandStatus == HandStatus::Free && - !switchItem->Airborne || + !switchItem->Animation.Airborne || laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNum)) { @@ -80,16 +80,16 @@ namespace TEN::Entities::Switches if (MoveLaraPosition(&CogSwitchPos, switchItem, laraItem)) { ResetLaraFlex(laraItem); - laraItem->AnimNumber = LA_COGWHEEL_GRAB; - laraItem->TargetState = LS_COGWHEEL; - laraItem->ActiveState = LS_COGWHEEL; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_COGWHEEL_GRAB; + laraItem->Animation.TargetState = LS_COGWHEEL; + laraItem->Animation.ActiveState = LS_COGWHEEL; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; laraInfo->InteractedItem = targetItemNum; AddActiveItem(itemNum); - switchItem->TargetState = SWITCH_ON; + switchItem->Animation.TargetState = SWITCH_ON; switchItem->Status = ITEM_ACTIVE; if (door != NULL) @@ -123,17 +123,17 @@ namespace TEN::Entities::Switches AnimateItem(switchItem); - if (switchItem->ActiveState == SWITCH_ON) + if (switchItem->Animation.ActiveState == SWITCH_ON) { - if (switchItem->TargetState == SWITCH_ON && !(TrInput & IN_ACTION)) + if (switchItem->Animation.TargetState == SWITCH_ON && !(TrInput & IN_ACTION)) { - LaraItem->TargetState = LS_IDLE; - switchItem->TargetState = SWITCH_OFF; + LaraItem->Animation.TargetState = LS_IDLE; + switchItem->Animation.TargetState = SWITCH_OFF; } - if (LaraItem->AnimNumber == LA_COGWHEEL_PULL) + if (LaraItem->Animation.AnimNumber == LA_COGWHEEL_PULL) { - if (LaraItem->FrameNumber == g_Level.Anims[LaraItem->AnimNumber].frameBase + 10) + if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase + 10) { auto* doorItem = &g_Level.Items[Lara.InteractedItem]; doorItem->ItemFlags[0] = COG_DOOR_TURN; @@ -142,17 +142,17 @@ namespace TEN::Entities::Switches } else { - if (switchItem->FrameNumber == g_Level.Anims[switchItem->AnimNumber].frameEnd) + if (switchItem->Animation.FrameNumber == g_Level.Anims[switchItem->Animation.AnimNumber].frameEnd) { - switchItem->ActiveState = SWITCH_OFF; + switchItem->Animation.ActiveState = SWITCH_OFF; switchItem->Status = ITEM_NOT_ACTIVE; RemoveActiveItem(itemNumber); - LaraItem->AnimNumber = LA_STAND_SOLID; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; - LaraItem->TargetState = LS_IDLE; - LaraItem->ActiveState = LS_IDLE; + LaraItem->Animation.AnimNumber = LA_STAND_SOLID; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; + LaraItem->Animation.TargetState = LS_IDLE; + LaraItem->Animation.ActiveState = LS_IDLE; Lara.Control.HandStatus = HandStatus::Free; } } diff --git a/TR5Main/Objects/Generic/Switches/crowbar_switch.cpp b/TR5Main/Objects/Generic/Switches/crowbar_switch.cpp index e3f52eb94..278a03a41 100644 --- a/TR5Main/Objects/Generic/Switches/crowbar_switch.cpp +++ b/TR5Main/Objects/Generic/Switches/crowbar_switch.cpp @@ -46,13 +46,13 @@ namespace TEN::Entities::Switches int doSwitch = 0; if (((TrInput & IN_ACTION || g_Gui.GetInventoryItemChosen() == ID_CROWBAR_ITEM) && - laraitem->ActiveState == LS_IDLE && - laraitem->AnimNumber == LA_STAND_IDLE && + laraitem->Animation.ActiveState == LS_IDLE && + laraitem->Animation.AnimNumber == LA_STAND_IDLE && laraInfo->Control.HandStatus == HandStatus::Free && switchItem->ItemFlags[0] == 0) || (laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber)) { - if (switchItem->ActiveState == SWITCH_ON) + if (switchItem->Animation.ActiveState == SWITCH_ON) { laraitem->Position.yRot ^= (short)ANGLE(180.0f); @@ -63,9 +63,9 @@ namespace TEN::Entities::Switches if (MoveLaraPosition(&CrowbarPos2, switchItem, laraitem)) { doSwitch = 1; - laraitem->AnimNumber = LA_CROWBAR_USE_ON_FLOOR; - laraitem->FrameNumber = g_Level.Anims[laraitem->AnimNumber].frameBase; - switchItem->TargetState = SWITCH_OFF; + laraitem->Animation.AnimNumber = LA_CROWBAR_USE_ON_FLOOR; + laraitem->Animation.FrameNumber = g_Level.Anims[laraitem->Animation.AnimNumber].frameBase; + switchItem->Animation.TargetState = SWITCH_OFF; } else laraInfo->InteractedItem = itemNumber; @@ -92,9 +92,9 @@ namespace TEN::Entities::Switches if (MoveLaraPosition(&CrowbarPos, switchItem, laraitem)) { doSwitch = 1; - laraitem->AnimNumber = LA_CROWBAR_USE_ON_FLOOR; - laraitem->FrameNumber = g_Level.Anims[laraitem->AnimNumber].frameBase; - switchItem->TargetState = SWITCH_ON; + laraitem->Animation.AnimNumber = LA_CROWBAR_USE_ON_FLOOR; + laraitem->Animation.FrameNumber = g_Level.Anims[laraitem->Animation.AnimNumber].frameBase; + switchItem->Animation.TargetState = SWITCH_ON; } else laraInfo->InteractedItem = itemNumber; @@ -132,8 +132,8 @@ namespace TEN::Entities::Switches else { ResetLaraFlex(laraitem); - laraitem->TargetState = LS_SWITCH_DOWN; - laraitem->ActiveState = LS_SWITCH_DOWN; + laraitem->Animation.TargetState = LS_SWITCH_DOWN; + laraitem->Animation.ActiveState = LS_SWITCH_DOWN; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; switchItem->Status = ITEM_ACTIVE; diff --git a/TR5Main/Objects/Generic/Switches/fullblock_switch.cpp b/TR5Main/Objects/Generic/Switches/fullblock_switch.cpp index 523dc1ac9..4298c6bdc 100644 --- a/TR5Main/Objects/Generic/Switches/fullblock_switch.cpp +++ b/TR5Main/Objects/Generic/Switches/fullblock_switch.cpp @@ -35,8 +35,8 @@ namespace TEN::Entities::Switches auto* switchItem = &g_Level.Items[itemNumber]; if ((!(TrInput & IN_ACTION) || - laraItem->ActiveState != LS_IDLE || - laraItem->AnimNumber != LA_STAND_IDLE || + laraItem->Animation.ActiveState != LS_IDLE || + laraItem->Animation.AnimNumber != LA_STAND_IDLE || laraInfo->Control.HandStatus != HandStatus::Free || switchItem->Status || switchItem->Flags & 0x100 || @@ -51,15 +51,15 @@ namespace TEN::Entities::Switches { if (MoveLaraPosition(&FullBlockSwitchPos, switchItem, laraItem)) { - if (switchItem->ActiveState == 1) + if (switchItem->Animation.ActiveState == 1) { - laraItem->ActiveState = LS_SWITCH_DOWN; - laraItem->AnimNumber = LA_BUTTON_GIANT_PUSH; - switchItem->TargetState = 0; + laraItem->Animation.ActiveState = LS_SWITCH_DOWN; + laraItem->Animation.AnimNumber = LA_BUTTON_GIANT_PUSH; + switchItem->Animation.TargetState = 0; } - laraItem->TargetState = LS_IDLE; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.TargetState = LS_IDLE; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; switchItem->Status = ITEM_ACTIVE; AddActiveItem(itemNumber); @@ -83,14 +83,14 @@ namespace TEN::Entities::Switches { ITEM_INFO* switchItem = &g_Level.Items[itemNumber]; - if (switchItem->AnimNumber != Objects[switchItem->ObjectNumber].animIndex + 2 || + if (switchItem->Animation.AnimNumber != Objects[switchItem->ObjectNumber].animIndex + 2 || CurrentSequence >= 3 || switchItem->ItemFlags[0]) { if (CurrentSequence >= 4) { switchItem->ItemFlags[0] = 0; - switchItem->TargetState = SWITCH_ON; + switchItem->Animation.TargetState = SWITCH_ON; switchItem->Status = ITEM_NOT_ACTIVE; if (++CurrentSequence >= 7) diff --git a/TR5Main/Objects/Generic/Switches/generic_switch.cpp b/TR5Main/Objects/Generic/Switches/generic_switch.cpp index c4de513f5..462aecf77 100644 --- a/TR5Main/Objects/Generic/Switches/generic_switch.cpp +++ b/TR5Main/Objects/Generic/Switches/generic_switch.cpp @@ -33,13 +33,13 @@ namespace TEN::Entities::Switches { if (switchItem->ObjectNumber == ID_JUMP_SWITCH) { - switchItem->TargetState = SWITCH_OFF; + switchItem->Animation.TargetState = SWITCH_OFF; switchItem->Timer = 0; AnimateItem(switchItem); } else { - switchItem->TargetState = SWITCH_ON; + switchItem->Animation.TargetState = SWITCH_ON; switchItem->Timer = 0; } } @@ -53,8 +53,8 @@ namespace TEN::Entities::Switches auto* switchItem = &g_Level.Items[itemNumber]; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && laraInfo->Control.HandStatus == HandStatus::Free && switchItem->Status == ITEM_NOT_ACTIVE && !(switchItem->Flags & 0x100) && @@ -63,9 +63,9 @@ namespace TEN::Entities::Switches { auto* bounds = GetBoundsAccurate(switchItem); - if (switchItem->TriggerFlags == 3 && switchItem->ActiveState == SWITCH_ON || + if (switchItem->TriggerFlags == 3 && switchItem->Animation.ActiveState == SWITCH_ON || switchItem->TriggerFlags >= 5 && switchItem->TriggerFlags <= 7 && - switchItem->ActiveState == SWITCH_OFF) + switchItem->Animation.ActiveState == SWITCH_OFF) { return; } @@ -94,44 +94,44 @@ namespace TEN::Entities::Switches { if (MoveLaraPosition(&SwitchPos, switchItem, laraItem)) { - if (switchItem->ActiveState == SWITCH_ON) /* Switch down */ + if (switchItem->Animation.ActiveState == SWITCH_ON) /* Switch down */ { if (switchItem->TriggerFlags) { - laraItem->AnimNumber = LA_HOLESWITCH_ACTIVATE; - laraItem->ActiveState = LS_HOLE; + laraItem->Animation.AnimNumber = LA_HOLESWITCH_ACTIVATE; + laraItem->Animation.ActiveState = LS_HOLE; } else { - laraItem->ActiveState = LS_SWITCH_UP; - laraItem->AnimNumber = LA_WALLSWITCH_DOWN; + laraItem->Animation.ActiveState = LS_SWITCH_UP; + laraItem->Animation.AnimNumber = LA_WALLSWITCH_DOWN; } - switchItem->TargetState = SWITCH_OFF; + switchItem->Animation.TargetState = SWITCH_OFF; } else /* Switch up */ { if (switchItem->TriggerFlags) { if (switchItem->TriggerFlags == 3) - laraItem->AnimNumber = LA_BUTTON_LARGE_PUSH; + laraItem->Animation.AnimNumber = LA_BUTTON_LARGE_PUSH; else { - laraItem->AnimNumber = LA_HOLESWITCH_ACTIVATE; - laraItem->ActiveState = LS_HOLE; + laraItem->Animation.AnimNumber = LA_HOLESWITCH_ACTIVATE; + laraItem->Animation.ActiveState = LS_HOLE; } } else { - laraItem->ActiveState = LS_SWITCH_DOWN; - laraItem->AnimNumber = LA_WALLSWITCH_UP; + laraItem->Animation.ActiveState = LS_SWITCH_DOWN; + laraItem->Animation.AnimNumber = LA_WALLSWITCH_UP; } - switchItem->TargetState = SWITCH_ON; + switchItem->Animation.TargetState = SWITCH_ON; } ResetLaraFlex(laraItem); - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; @@ -151,7 +151,7 @@ namespace TEN::Entities::Switches return; } - if (laraItem->ActiveState != LS_SWITCH_DOWN && laraItem->ActiveState != LS_SWITCH_UP) + if (laraItem->Animation.ActiveState != LS_SWITCH_DOWN && laraItem->Animation.ActiveState != LS_SWITCH_UP) ObjectCollision(itemNumber, laraItem, coll); } } diff --git a/TR5Main/Objects/Generic/Switches/jump_switch.cpp b/TR5Main/Objects/Generic/Switches/jump_switch.cpp index 10aad5e48..60eae0fe4 100644 --- a/TR5Main/Objects/Generic/Switches/jump_switch.cpp +++ b/TR5Main/Objects/Generic/Switches/jump_switch.cpp @@ -29,23 +29,23 @@ namespace TEN::Entities::Switches auto* switchItem = &g_Level.Items[itemNumber]; if (TrInput & IN_ACTION && - (laraItem->ActiveState == LS_REACH || laraItem->ActiveState == LS_JUMP_UP) && - (laraItem->Status || laraItem->Airborne) && - laraItem->VerticalVelocity > 0 && + (laraItem->Animation.ActiveState == LS_REACH || laraItem->Animation.ActiveState == LS_JUMP_UP) && + (laraItem->Status || laraItem->Animation.Airborne) && + laraItem->Animation.VerticalVelocity > 0 && laraInfo->Control.HandStatus == HandStatus::Free && - !switchItem->ActiveState) + !switchItem->Animation.ActiveState) { if (TestLaraPosition(&JumpSwitchBounds, switchItem, laraItem)) { AlignLaraPosition(&JumpSwitchPos, switchItem, laraItem); - laraItem->ActiveState = LS_SWITCH_DOWN; - laraItem->AnimNumber = LA_JUMPSWITCH_PULL; - laraItem->VerticalVelocity = 0; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->Airborne = false; + laraItem->Animation.ActiveState = LS_SWITCH_DOWN; + laraItem->Animation.AnimNumber = LA_JUMPSWITCH_PULL; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.Airborne = false; laraInfo->Control.HandStatus = HandStatus::Busy; - switchItem->TargetState = SWITCH_ON; + switchItem->Animation.TargetState = SWITCH_ON; switchItem->Status = ITEM_ACTIVE; AddActiveItem(itemNumber); diff --git a/TR5Main/Objects/Generic/Switches/pulley_switch.cpp b/TR5Main/Objects/Generic/Switches/pulley_switch.cpp index f343535de..c5b39b6d0 100644 --- a/TR5Main/Objects/Generic/Switches/pulley_switch.cpp +++ b/TR5Main/Objects/Generic/Switches/pulley_switch.cpp @@ -45,9 +45,9 @@ namespace TEN::Entities::Switches auto* switchItem = &g_Level.Items[itemNumber]; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && - laraItem->Airborne == false && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && + laraItem->Animation.Airborne == false && laraInfo->Control.HandStatus == HandStatus::Free || laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber) { @@ -67,9 +67,9 @@ namespace TEN::Entities::Switches } else if (MoveLaraPosition(&PulleyPos, switchItem, laraItem)) { - laraItem->AnimNumber = LA_PULLEY_GRAB; - laraItem->ActiveState = LS_PULLEY; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_PULLEY_GRAB; + laraItem->Animation.ActiveState = LS_PULLEY; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; AddActiveItem(itemNumber); @@ -97,7 +97,7 @@ namespace TEN::Entities::Switches switchItem->Position.yRot = oldYrot; } } - else if (laraItem->ActiveState != LS_PULLEY) + else if (laraItem->Animation.ActiveState != LS_PULLEY) ObjectCollision(itemNumber, laraItem, coll); } } diff --git a/TR5Main/Objects/Generic/Switches/rail_switch.cpp b/TR5Main/Objects/Generic/Switches/rail_switch.cpp index 285f91bd5..f52eeaad4 100644 --- a/TR5Main/Objects/Generic/Switches/rail_switch.cpp +++ b/TR5Main/Objects/Generic/Switches/rail_switch.cpp @@ -43,17 +43,17 @@ namespace TEN::Entities::Switches int flag = 0; if ((!(TrInput & IN_ACTION) || - laraItem->ActiveState != LS_IDLE || - laraItem->AnimNumber != LA_STAND_IDLE || + laraItem->Animation.ActiveState != LS_IDLE || + laraItem->Animation.AnimNumber != LA_STAND_IDLE || laraInfo->Control.HandStatus != HandStatus::Free) && (!laraInfo->Control.IsMoving || laraInfo->InteractedItem != itemNumber)) { ObjectCollision(itemNumber, laraItem, coll); } - else if (switchItem->ActiveState) + else if (switchItem->Animation.ActiveState) { - if (switchItem->ActiveState == SWITCH_ON) + if (switchItem->Animation.ActiveState == SWITCH_ON) { laraItem->Position.yRot ^= (short)ANGLE(180.0f); @@ -61,7 +61,7 @@ namespace TEN::Entities::Switches { if (MoveLaraPosition(&RailSwitchPos2, switchItem, laraItem)) { - switchItem->TargetState = SWITCH_OFF; + switchItem->Animation.TargetState = SWITCH_OFF; flag = 1; } else @@ -78,10 +78,10 @@ namespace TEN::Entities::Switches if (flag) { ResetLaraFlex(laraItem); - laraItem->AnimNumber = LA_LEVER_PUSH; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->TargetState = LS_LEVERSWITCH_PUSH; - laraItem->ActiveState = LS_LEVERSWITCH_PUSH; + laraItem->Animation.AnimNumber = LA_LEVER_PUSH; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.TargetState = LS_LEVERSWITCH_PUSH; + laraItem->Animation.ActiveState = LS_LEVERSWITCH_PUSH; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; switchItem->Status = ITEM_ACTIVE; @@ -101,13 +101,13 @@ namespace TEN::Entities::Switches if (MoveLaraPosition(&RailSwitchPos, switchItem, laraItem)) { ResetLaraFlex(laraItem); - laraItem->AnimNumber = LA_LEVER_PUSH; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->TargetState = LS_LEVERSWITCH_PUSH; - laraItem->ActiveState = LS_LEVERSWITCH_PUSH; + laraItem->Animation.AnimNumber = LA_LEVER_PUSH; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.TargetState = LS_LEVERSWITCH_PUSH; + laraItem->Animation.ActiveState = LS_LEVERSWITCH_PUSH; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; - switchItem->TargetState = SWITCH_ON; + switchItem->Animation.TargetState = SWITCH_ON; switchItem->Status = ITEM_ACTIVE; AddActiveItem(itemNumber); diff --git a/TR5Main/Objects/Generic/Switches/turn_switch.cpp b/TR5Main/Objects/Generic/Switches/turn_switch.cpp index a6736048e..92f5ebbe2 100644 --- a/TR5Main/Objects/Generic/Switches/turn_switch.cpp +++ b/TR5Main/Objects/Generic/Switches/turn_switch.cpp @@ -54,21 +54,21 @@ namespace TEN::Entities::Switches int doSwitch = 0; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && - laraItem->Airborne == false && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && + laraItem->Animation.Airborne == false && laraInfo->Control.HandStatus == HandStatus::Free && - switchItem->ActiveState == TURN_SWITCH_STOP || + switchItem->Animation.ActiveState == TURN_SWITCH_STOP || laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber) { if (TestLaraPosition(&TurnSwitchBoundsA, switchItem, laraItem)) { if (MoveLaraPosition(&TurnSwitchPosA, switchItem, laraItem)) { - laraItem->AnimNumber = LA_TURNSWITCH_GRAB_COUNTER_CLOCKWISE; - laraItem->FrameNumber = g_Level.Anims[LA_TURNSWITCH_GRAB_COUNTER_CLOCKWISE].frameBase; - switchItem->AnimNumber = Objects[switchItem->ObjectNumber].animIndex + 4; - switchItem->FrameNumber = g_Level.Anims[switchItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_TURNSWITCH_GRAB_COUNTER_CLOCKWISE; + laraItem->Animation.FrameNumber = g_Level.Anims[LA_TURNSWITCH_GRAB_COUNTER_CLOCKWISE].frameBase; + switchItem->Animation.AnimNumber = Objects[switchItem->ObjectNumber].animIndex + 4; + switchItem->Animation.FrameNumber = g_Level.Anims[switchItem->Animation.AnimNumber].frameBase; switchItem->ItemFlags[0] = TURN_SWITCH_ANTICLOCKWISE; ForcedFixedCamera.x = switchItem->Position.xPos - 1024 * phd_sin(switchItem->Position.yRot); ForcedFixedCamera.z = switchItem->Position.zPos - 1024 * phd_cos(switchItem->Position.yRot); @@ -85,8 +85,8 @@ namespace TEN::Entities::Switches { if (MoveLaraPosition(&TurnSwitchPos, switchItem, laraItem)) { - laraItem->AnimNumber = LA_TURNSWITCH_GRAB_CLOCKWISE; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_TURNSWITCH_GRAB_CLOCKWISE; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; switchItem->ItemFlags[0] = TURN_SWITCH_CLOCKWISE; ForcedFixedCamera.x = switchItem->Position.xPos + 1024 * phd_sin(switchItem->Position.yRot); ForcedFixedCamera.z = switchItem->Position.zPos + 1024 * phd_cos(switchItem->Position.yRot); @@ -112,7 +112,7 @@ namespace TEN::Entities::Switches laraInfo->Control.IsMoving = false; ResetLaraFlex(laraItem); laraInfo->Control.HandStatus = HandStatus::Busy; - laraItem->ActiveState = LA_REACH; + laraItem->Animation.ActiveState = LA_REACH; UseForcedFixedCamera = true; ForcedFixedCamera.y = switchItem->Position.yPos - 2048; @@ -127,8 +127,8 @@ namespace TEN::Entities::Switches { if (!TriggerActive(&g_Level.Items[ItemNos[0]])) { - g_Level.Items[ItemNos[0]].AnimNumber = Objects[g_Level.Items[ItemNos[0]].ObjectNumber].animIndex; - g_Level.Items[ItemNos[0]].FrameNumber = g_Level.Anims[g_Level.Items[ItemNos[0]].AnimNumber].frameBase; + g_Level.Items[ItemNos[0]].Animation.AnimNumber = Objects[g_Level.Items[ItemNos[0]].ObjectNumber].animIndex; + g_Level.Items[ItemNos[0]].Animation.FrameNumber = g_Level.Anims[g_Level.Items[ItemNos[0]].Animation.AnimNumber].frameBase; } } } @@ -162,54 +162,54 @@ namespace TEN::Entities::Switches if (g_Level.Items[itemNumber].ItemFlags[0] == TURN_SWITCH_CLOCKWISE) { - if (switchItem->AnimNumber == Objects[switchItem->ObjectNumber].animIndex + 2) + if (switchItem->Animation.AnimNumber == Objects[switchItem->ObjectNumber].animIndex + 2) { switchItem->Position.yRot += ANGLE(90.0f); if (TrInput & IN_ACTION) { - laraItem->AnimNumber = LA_TURNSWITCH_PUSH_CLOCKWISE_START; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_TURNSWITCH_PUSH_CLOCKWISE_START; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; - switchItem->AnimNumber = Objects[switchItem->ObjectNumber].animIndex + 1; - switchItem->FrameNumber = g_Level.Anims[switchItem->AnimNumber].frameBase; + switchItem->Animation.AnimNumber = Objects[switchItem->ObjectNumber].animIndex + 1; + switchItem->Animation.FrameNumber = g_Level.Anims[switchItem->Animation.AnimNumber].frameBase; } } - if (laraItem->AnimNumber == LA_TURNSWITCH_PUSH_CLOCKWISE_END && - laraItem->FrameNumber == g_Level.Anims[laraItem->AnimNumber].frameEnd && + if (laraItem->Animation.AnimNumber == LA_TURNSWITCH_PUSH_CLOCKWISE_END && + laraItem->Animation.FrameNumber == g_Level.Anims[laraItem->Animation.AnimNumber].frameEnd && !switchItem->ItemFlags[1]) switchItem->ItemFlags[1] = 1; - if (laraItem->FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase && - laraItem->FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 43 || - laraItem->FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 58 && - laraItem->FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 115) + if (laraItem->Animation.FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase && + laraItem->Animation.FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 43 || + laraItem->Animation.FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 58 && + laraItem->Animation.FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_CLOCKWISE_START].frameBase + 115) { SoundEffect(SFX_TR4_PUSHABLE_SOUND, &switchItem->Position, 2); } } else { - if (switchItem->AnimNumber == Objects[ID_TURN_SWITCH].animIndex + 6) + if (switchItem->Animation.AnimNumber == Objects[ID_TURN_SWITCH].animIndex + 6) { switchItem->Position.yRot -= ANGLE(90.0f); if (TrInput & IN_ACTION) { - laraItem->AnimNumber = LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - switchItem->AnimNumber = Objects[switchItem->ObjectNumber].animIndex + 5; - switchItem->FrameNumber = g_Level.Anims[switchItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + switchItem->Animation.AnimNumber = Objects[switchItem->ObjectNumber].animIndex + 5; + switchItem->Animation.FrameNumber = g_Level.Anims[switchItem->Animation.AnimNumber].frameBase; } } - if (laraItem->AnimNumber == LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END && laraItem->FrameNumber == g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END].frameEnd && + if (laraItem->Animation.AnimNumber == LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END && laraItem->Animation.FrameNumber == g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_END].frameEnd && !switchItem->ItemFlags[1]) switchItem->ItemFlags[1] = 1; - if (laraItem->FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase && - laraItem->FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 43 || - laraItem->FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 58 && - laraItem->FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 115) + if (laraItem->Animation.FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase && + laraItem->Animation.FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 43 || + laraItem->Animation.FrameNumber >= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 58 && + laraItem->Animation.FrameNumber <= g_Level.Anims[LA_TURNSWITCH_PUSH_COUNTER_CLOCKWISE_START].frameBase + 115) { SoundEffect(SFX_TR4_PUSHABLE_SOUND, &switchItem->Position, 2); } @@ -219,11 +219,11 @@ namespace TEN::Entities::Switches if (switchItem->ItemFlags[1] == 1) { - laraItem->AnimNumber = LA_STAND_IDLE; - laraItem->ActiveState = LS_IDLE; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - switchItem->AnimNumber = Objects[switchItem->ObjectNumber].animIndex; - switchItem->FrameNumber = g_Level.Anims[switchItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_STAND_IDLE; + laraItem->Animation.ActiveState = LS_IDLE; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + switchItem->Animation.AnimNumber = Objects[switchItem->ObjectNumber].animIndex; + switchItem->Animation.FrameNumber = g_Level.Anims[switchItem->Animation.AnimNumber].frameBase; switchItem->Status = ITEM_NOT_ACTIVE; RemoveActiveItem(itemNumber); diff --git a/TR5Main/Objects/Generic/Switches/underwater_switch.cpp b/TR5Main/Objects/Generic/Switches/underwater_switch.cpp index 319714991..2b21bb79d 100644 --- a/TR5Main/Objects/Generic/Switches/underwater_switch.cpp +++ b/TR5Main/Objects/Generic/Switches/underwater_switch.cpp @@ -66,26 +66,26 @@ namespace TEN::Entities::Switches if (switchItem->Status == ITEM_NOT_ACTIVE && laraInfo->Control.WaterStatus == WaterStatus::Underwater && laraInfo->Control.HandStatus == HandStatus::Free && - laraItem->ActiveState == LS_UNDERWATER_STOP) + laraItem->Animation.ActiveState == LS_UNDERWATER_STOP) { if (TestLaraPosition(&UnderwaterSwitchBounds, switchItem, laraItem)) { - if (switchItem->ActiveState == SWITCH_ON || - switchItem->ActiveState == SWITCH_OFF) + if (switchItem->Animation.ActiveState == SWITCH_ON || + switchItem->Animation.ActiveState == SWITCH_OFF) { if (MoveLaraPosition(&UnderwaterSwitchPos, switchItem, laraItem)) { - laraItem->VerticalVelocity = 0; - laraItem->TargetState = LS_SWITCH_DOWN; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.TargetState = LS_SWITCH_DOWN; do { AnimateLara(laraItem); - } while (laraItem->TargetState != LS_SWITCH_DOWN); + } while (laraItem->Animation.TargetState != LS_SWITCH_DOWN); - laraItem->TargetState = LS_UNDERWATER_STOP; + laraItem->Animation.TargetState = LS_UNDERWATER_STOP; laraInfo->Control.HandStatus = HandStatus::Busy; - switchItem->TargetState = switchItem->ActiveState != SWITCH_ON; + switchItem->Animation.TargetState = switchItem->Animation.ActiveState != SWITCH_ON; switchItem->Status = ITEM_ACTIVE; AddActiveItem(itemNumber); AnimateItem(switchItem); @@ -104,11 +104,11 @@ namespace TEN::Entities::Switches int flag = 0; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_UNDERWATER_STOP && - laraItem->AnimNumber == LA_UNDERWATER_IDLE && + laraItem->Animation.ActiveState == LS_UNDERWATER_STOP && + laraItem->Animation.AnimNumber == LA_UNDERWATER_IDLE && laraInfo->Control.WaterStatus == WaterStatus::Underwater && laraInfo->Control.HandStatus == HandStatus::Free && - switchItem->ActiveState == SWITCH_OFF || + switchItem->Animation.ActiveState == SWITCH_OFF || laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber) { if (TestLaraPosition(&CeilingUnderwaterSwitchBounds1, switchItem, laraItem)) @@ -135,13 +135,13 @@ namespace TEN::Entities::Switches if (flag) { - laraItem->ActiveState = LS_SWITCH_DOWN; - laraItem->AnimNumber = LA_UNDERWATER_CEILING_SWITCH_PULL; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->VerticalVelocity = 0; + laraItem->Animation.ActiveState = LS_SWITCH_DOWN; + laraItem->Animation.AnimNumber = LA_UNDERWATER_CEILING_SWITCH_PULL; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.VerticalVelocity = 0; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; - switchItem->TargetState = SWITCH_ON; + switchItem->Animation.TargetState = SWITCH_ON; switchItem->Status = ITEM_ACTIVE; AddActiveItem(itemNumber); diff --git a/TR5Main/Objects/Generic/Traps/dart_emitter.cpp b/TR5Main/Objects/Generic/Traps/dart_emitter.cpp index 6c74058a5..633c4dd8f 100644 --- a/TR5Main/Objects/Generic/Traps/dart_emitter.cpp +++ b/TR5Main/Objects/Generic/Traps/dart_emitter.cpp @@ -25,10 +25,10 @@ namespace TEN::Entities::Traps int oldX = item->Position.xPos; int oldZ = item->Position.zPos - 1000; - int velocity = item->Velocity * phd_cos(item->Position.xRot); + int velocity = item->Animation.Velocity * phd_cos(item->Position.xRot); item->Position.xPos += velocity * phd_sin(item->Position.yRot); - item->Position.yPos -= item->Velocity * phd_sin(item->Position.xRot); + item->Position.yPos -= item->Animation.Velocity * phd_sin(item->Position.xRot); item->Position.zPos += velocity * phd_cos(item->Position.yRot); short roomNumber = item->RoomNumber; @@ -104,7 +104,7 @@ namespace TEN::Entities::Traps dartItem->Position.xRot = 0; dartItem->Position.yRot = item->Position.yRot + -ANGLE(180); - dartItem->Velocity = 256; + dartItem->Animation.Velocity = 256; int xf = 0; int zf = 0; diff --git a/TR5Main/Objects/Generic/Traps/falling_block.cpp b/TR5Main/Objects/Generic/Traps/falling_block.cpp index ccebb9c54..633f95d60 100644 --- a/TR5Main/Objects/Generic/Traps/falling_block.cpp +++ b/TR5Main/Objects/Generic/Traps/falling_block.cpp @@ -29,8 +29,8 @@ void InitialiseFallingBlock(short itemNumber) TEN::Floordata::UpdateBridgeItem(itemNumber); // Set mutators to 0 by default - for (int i = 0; i < item->Mutator.size(); i++) - item->Mutator[i].Rotation = Vector3::Zero; + for (int i = 0; i < item->Animation.Mutator.size(); i++) + item->Animation.Mutator[i].Rotation = Vector3::Zero; } void FallingBlockCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) @@ -65,23 +65,23 @@ void FallingBlockControl(short itemNumber) if (item->ItemFlags[0] < FALLINGBLOCK_DELAY) { // Subtly shake all meshes separately - for (int i = 0; i < item->Mutator.size(); i++) + for (int i = 0; i < item->Animation.Mutator.size(); i++) { - item->Mutator[i].Rotation.x = RADIAN * GenerateFloat(-FALLINGBLOCK_WIBBLE, FALLINGBLOCK_WIBBLE); - item->Mutator[i].Rotation.y = RADIAN * GenerateFloat(-FALLINGBLOCK_WIBBLE, FALLINGBLOCK_WIBBLE); - item->Mutator[i].Rotation.z = RADIAN * GenerateFloat(-FALLINGBLOCK_WIBBLE, FALLINGBLOCK_WIBBLE); + item->Animation.Mutator[i].Rotation.x = RADIAN * GenerateFloat(-FALLINGBLOCK_WIBBLE, FALLINGBLOCK_WIBBLE); + item->Animation.Mutator[i].Rotation.y = RADIAN * GenerateFloat(-FALLINGBLOCK_WIBBLE, FALLINGBLOCK_WIBBLE); + item->Animation.Mutator[i].Rotation.z = RADIAN * GenerateFloat(-FALLINGBLOCK_WIBBLE, FALLINGBLOCK_WIBBLE); } } else { // Make rotational falling movement with some random seed - for (int i = 0; i < item->Mutator.size(); i++) + for (int i = 0; i < item->Animation.Mutator.size(); i++) { auto rotSpeed = i % 2 ? FALLINGBLOCK_FALL_ROTATION_SPEED : -FALLINGBLOCK_FALL_ROTATION_SPEED; rotSpeed += i % 3 ? rotSpeed / 2 : rotSpeed; - item->Mutator[i].Rotation.x += RADIAN * rotSpeed + (RADIAN * GenerateFloat(-1, 1)); - item->Mutator[i].Rotation.y += RADIAN * rotSpeed + (RADIAN * GenerateFloat(-1, 1)); - item->Mutator[i].Rotation.z += RADIAN * rotSpeed + (RADIAN * GenerateFloat(-1, 1)); + item->Animation.Mutator[i].Rotation.x += RADIAN * rotSpeed + (RADIAN * GenerateFloat(-1, 1)); + item->Animation.Mutator[i].Rotation.y += RADIAN * rotSpeed + (RADIAN * GenerateFloat(-1, 1)); + item->Animation.Mutator[i].Rotation.z += RADIAN * rotSpeed + (RADIAN * GenerateFloat(-1, 1)); } if (item->ItemFlags[0] == FALLINGBLOCK_DELAY) diff --git a/TR5Main/Objects/Generic/Traps/traps.cpp b/TR5Main/Objects/Generic/Traps/traps.cpp index 8a5e6b0fb..41a2b2d78 100644 --- a/TR5Main/Objects/Generic/Traps/traps.cpp +++ b/TR5Main/Objects/Generic/Traps/traps.cpp @@ -47,7 +47,7 @@ void WreckingBallCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) y = l->Position.yPos; z = l->Position.zPos; test = (x & 1023) > 256 && (x & 1023) < 768 && (z & 1023) > 256 && (z & 1023) < 768; - damage = item->VerticalVelocity > 0 ? 96 : 0; + damage = item->Animation.VerticalVelocity > 0 ? 96 : 0; if (ItemPushItem(item, l, coll, coll->Setup.EnableSpasm, 1)) { if (test) @@ -216,62 +216,62 @@ void WreckingBallControl(short itemNumber) { --item->TriggerFlags; } - else if (!item->ActiveState) + else if (!item->Animation.ActiveState) { - item->TargetState = 1; + item->Animation.TargetState = 1; } - else if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) { SoundEffect(SFX_TR5_J_GRAB_DROP, &item->Position, 0); ++item->ItemFlags[1]; - item->VerticalVelocity = 6; - item->Position.yPos += item->VerticalVelocity; + item->Animation.VerticalVelocity = 6; + item->Position.yPos += item->Animation.VerticalVelocity; } } else if (item->ItemFlags[1] == 2) { - item->VerticalVelocity += 24; - item->Position.yPos += item->VerticalVelocity; + item->Animation.VerticalVelocity += 24; + item->Position.yPos += item->Animation.VerticalVelocity; room = item->RoomNumber; height = GetFloorHeight(GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &room), item->Position.xPos, item->Position.yPos, item->Position.zPos); if (height < item->Position.yPos) { item->Position.yPos = height; - if (item->VerticalVelocity > 48) + if (item->Animation.VerticalVelocity > 48) { BounceCamera(item, 64, 8192); - item->VerticalVelocity = -item->VerticalVelocity >> 3; + item->Animation.VerticalVelocity = -item->Animation.VerticalVelocity >> 3; } else { ++item->ItemFlags[1]; - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; } } - else if (height - item->Position.yPos < 1536 && item->ActiveState) + else if (height - item->Position.yPos < 1536 && item->Animation.ActiveState) { - item->TargetState = 0; + item->Animation.TargetState = 0; } } else if (item->ItemFlags[1] == 3) { - item->VerticalVelocity -= 3; - item->Position.yPos += item->VerticalVelocity; + item->Animation.VerticalVelocity -= 3; + item->Position.yPos += item->Animation.VerticalVelocity; if (item->Position.yPos < item2->Position.yPos + 1644) { StopSoundEffect(SFX_TR5_J_GRAB_WINCH_UP_LP); item->ItemFlags[0] = 1; item->Position.yPos = item2->Position.yPos + 1644; - if (item->VerticalVelocity < -32) + if (item->Animation.VerticalVelocity < -32) { SoundEffect(SFX_TR5_J_GRAB_IMPACT, &item->Position, 4104); - item->VerticalVelocity = -item->VerticalVelocity >> 3; + item->Animation.VerticalVelocity = -item->Animation.VerticalVelocity >> 3; BounceCamera(item, 16, 8192); } else { item->ItemFlags[1] = -1; - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; item->ItemFlags[0] = 0; } } diff --git a/TR5Main/Objects/Generic/puzzles_keys.cpp b/TR5Main/Objects/Generic/puzzles_keys.cpp index d89975af7..e6b072290 100644 --- a/TR5Main/Objects/Generic/puzzles_keys.cpp +++ b/TR5Main/Objects/Generic/puzzles_keys.cpp @@ -75,8 +75,8 @@ void PuzzleHoleCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (((TrInput & IN_ACTION || g_Gui.GetInventoryItemChosen() != NO_ITEM) && !BinocularRange && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && laraInfo->Control.HandStatus == HandStatus::Free && GetKeyTrigger(&g_Level.Items[itemNumber])) || (laraInfo->Control.IsMoving && @@ -126,20 +126,20 @@ void PuzzleHoleCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (flag == PUZZLETYPE_SPECIFIC) { - laraItem->ActiveState = LS_MISC_CONTROL; - laraItem->AnimNumber = -receptableItem->TriggerFlags; + laraItem->Animation.ActiveState = LS_MISC_CONTROL; + laraItem->Animation.AnimNumber = -receptableItem->TriggerFlags; - if (laraItem->AnimNumber != LA_TRIDENT_SET) + if (laraItem->Animation.AnimNumber != LA_TRIDENT_SET) PuzzleDone(receptableItem, itemNumber); } else { - laraItem->AnimNumber = LA_USE_PUZZLE; - laraItem->ActiveState = LS_INSERT_PUZZLE; + laraItem->Animation.AnimNumber = LA_USE_PUZZLE; + laraItem->Animation.ActiveState = LS_INSERT_PUZZLE; receptableItem->ItemFlags[0] = 1; } - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; laraInfo->Control.IsMoving = false; ResetLaraFlex(laraItem); laraInfo->Control.HandStatus = HandStatus::Busy; @@ -167,7 +167,7 @@ void PuzzleHoleCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) { if (laraInfo->InteractedItem == itemNumber) { - if (laraItem->ActiveState != LS_MISC_CONTROL) + if (laraItem->Animation.ActiveState != LS_MISC_CONTROL) { if (flag != PUZZLETYPE_CUTSCENE) ObjectCollision(itemNumber, laraItem, coll); @@ -175,7 +175,7 @@ void PuzzleHoleCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) } } - if (laraItem->ActiveState == LS_MISC_CONTROL) + if (laraItem->Animation.ActiveState == LS_MISC_CONTROL) return; if (flag != PUZZLETYPE_CUTSCENE) @@ -195,11 +195,11 @@ void PuzzleDoneCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) void PuzzleDone(ITEM_INFO* item, short itemNumber) { item->ObjectNumber += GAME_OBJECT_ID{ ID_PUZZLE_DONE1 - ID_PUZZLE_HOLE1 }; - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->RequiredState = 0; - item->TargetState = g_Level.Anims[item->AnimNumber].ActiveState; - item->ActiveState = g_Level.Anims[item->AnimNumber].ActiveState; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.RequiredState = 0; + item->Animation.TargetState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; + item->Animation.ActiveState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; AddActiveItem(itemNumber); @@ -227,7 +227,7 @@ void DoPuzzle() else flag = 1; - if (LaraItem->ActiveState == LS_INSERT_PUZZLE) + if (LaraItem->Animation.ActiveState == LS_INSERT_PUZZLE) { if (item->ItemFlags[0]) { @@ -240,7 +240,7 @@ void DoPuzzle() item->ItemFlags[0] = 0; } } - if (LaraItem->AnimNumber == LA_TRIDENT_SET) + if (LaraItem->Animation.AnimNumber == LA_TRIDENT_SET) PuzzleDone(item, puzzleItem); } } @@ -264,8 +264,8 @@ void KeyHoleCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (!((TrInput & IN_ACTION || g_Gui.GetInventoryItemChosen() != NO_ITEM) && !BinocularRange && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE) && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE) && laraInfo->Control.HandStatus == HandStatus::Free && (!laraInfo->Control.IsMoving || laraInfo->InteractedItem != itemNumber)) { @@ -296,15 +296,15 @@ void KeyHoleCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (MoveLaraPosition(&KeyHolePosition, keyHoleItem, laraItem)) { if (keyHoleItem->ObjectNumber == ID_KEY_HOLE8) - laraItem->AnimNumber = LA_KEYCARD_USE; + laraItem->Animation.AnimNumber = LA_KEYCARD_USE; else { RemoveObjectFromInventory(static_cast(keyHoleItem->ObjectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1)), 1); - laraItem->AnimNumber = LA_USE_KEY; + laraItem->Animation.AnimNumber = LA_USE_KEY; } - laraItem->ActiveState = LS_INSERT_KEY; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.ActiveState = LS_INSERT_KEY; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; laraInfo->Control.IsMoving = false; ResetLaraFlex(laraItem); laraInfo->Control.HandStatus = HandStatus::Busy; diff --git a/TR5Main/Objects/TR1/Entity/tr1_ape.cpp b/TR5Main/Objects/TR1/Entity/tr1_ape.cpp index 59fc4444d..3362dcdb4 100644 --- a/TR5Main/Objects/TR1/Entity/tr1_ape.cpp +++ b/TR5Main/Objects/TR1/Entity/tr1_ape.cpp @@ -126,9 +126,9 @@ void ApeVault(short itemNumber, short angle) { case 2: item->Position.yPos = y; - item->AnimNumber = Objects[ID_APE].animIndex + APE_ANIM_VAULT; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = APE_STATE_VAULT; + item->Animation.AnimNumber = Objects[ID_APE].animIndex + APE_ANIM_VAULT; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = APE_STATE_VAULT; break; default: @@ -149,11 +149,11 @@ void ApeControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != APE_STATE_DEATH) + if (item->Animation.ActiveState != APE_STATE_DEATH) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + APE_ANIM_DEATH + (short)(GetRandomControl() / 0x4000); - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = APE_STATE_DEATH; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + APE_ANIM_DEATH + (short)(GetRandomControl() / 0x4000); + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = APE_STATE_DEATH; } } else @@ -174,7 +174,7 @@ void ApeControl(short itemNumber) short random; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case APE_STATE_IDLE: if (creatureInfo->Flags & APE_FLAG_TURN_LEFT) @@ -188,33 +188,33 @@ void ApeControl(short itemNumber) creatureInfo->Flags -= APE_FLAG_TURN_RIGHT; } - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.bite && AI.distance < ATTACK_RANGE) - item->TargetState = APE_STATE_ATTACK; + item->Animation.TargetState = APE_STATE_ATTACK; else if (!(creatureInfo->Flags & APE_FLAG_ATTACK) && AI.zoneNumber == AI.enemyZone && AI.ahead) { random = (short)(GetRandomControl() / 32); if (random < JUMP_CHANCE) - item->TargetState = APE_STATE_JUMP; + item->Animation.TargetState = APE_STATE_JUMP; else if (random < WARNING_1_CHANCE) - item->TargetState = APE_STATE_WARNING_1; + item->Animation.TargetState = APE_STATE_WARNING_1; else if (random < WARNING_2_CHANCE) - item->TargetState = APE_STATE_WARNING_2; + item->Animation.TargetState = APE_STATE_WARNING_2; else if (random < RUNLEFT_CHANCE) { - item->TargetState = APE_STATE_RUN_LEFT; + item->Animation.TargetState = APE_STATE_RUN_LEFT; creatureInfo->MaxTurn = 0; } else { - item->TargetState = APE_STATE_RUN_RIGHT; + item->Animation.TargetState = APE_STATE_RUN_RIGHT; creatureInfo->MaxTurn = 0; } } else - item->TargetState = APE_STATE_RUN; + item->Animation.TargetState = APE_STATE_RUN; break; @@ -225,30 +225,30 @@ void ApeControl(short itemNumber) AI.angle > -DISPLAY_ANGLE && AI.angle < DISPLAY_ANGLE) { - item->TargetState = APE_STATE_IDLE; + item->Animation.TargetState = APE_STATE_IDLE; } else if (AI.ahead && item->TouchBits & TOUCH) { - item->RequiredState = APE_STATE_ATTACK; - item->TargetState = APE_STATE_IDLE; + item->Animation.RequiredState = APE_STATE_ATTACK; + item->Animation.TargetState = APE_STATE_IDLE; } else if (creatureInfo->Mood != MoodType::Escape) { random = (short)GetRandomControl(); if (random < JUMP_CHANCE) { - item->RequiredState = APE_STATE_JUMP; - item->TargetState = APE_STATE_IDLE; + item->Animation.RequiredState = APE_STATE_JUMP; + item->Animation.TargetState = APE_STATE_IDLE; } else if (random < WARNING_1_CHANCE) { - item->RequiredState = APE_STATE_WARNING_1; - item->TargetState = APE_STATE_IDLE; + item->Animation.RequiredState = APE_STATE_WARNING_1; + item->Animation.TargetState = APE_STATE_IDLE; } else if (random < WARNING_2_CHANCE) { - item->RequiredState = APE_STATE_WARNING_2; - item->TargetState = APE_STATE_IDLE; + item->Animation.RequiredState = APE_STATE_WARNING_2; + item->Animation.TargetState = APE_STATE_IDLE; } } @@ -261,7 +261,7 @@ void ApeControl(short itemNumber) creatureInfo->Flags |= APE_FLAG_TURN_RIGHT; } - item->TargetState = APE_STATE_IDLE; + item->Animation.TargetState = APE_STATE_IDLE; break; case APE_STATE_RUN_RIGHT: @@ -271,14 +271,14 @@ void ApeControl(short itemNumber) creatureInfo->Flags |= APE_FLAG_TURN_LEFT; } - item->TargetState = APE_STATE_IDLE; + item->Animation.TargetState = APE_STATE_IDLE; break; case APE_STATE_ATTACK: - if (!item->RequiredState && item->TouchBits & TOUCH) + if (!item->Animation.RequiredState && item->TouchBits & TOUCH) { CreatureEffect(item, &ApeBite, DoBloodSplat); - item->RequiredState = APE_STATE_IDLE; + item->Animation.RequiredState = APE_STATE_IDLE; LaraItem->HitPoints -= ATTACK_DAMAGE; LaraItem->HitStatus = true; @@ -290,7 +290,7 @@ void ApeControl(short itemNumber) CreatureJoint(item, 0, head); - if (item->ActiveState != APE_STATE_VAULT) + if (item->Animation.ActiveState != APE_STATE_VAULT) ApeVault(itemNumber, angle); else CreatureAnimation(itemNumber, angle, 0); diff --git a/TR5Main/Objects/TR1/Entity/tr1_bear.cpp b/TR5Main/Objects/TR1/Entity/tr1_bear.cpp index 23c394803..30e8af80f 100644 --- a/TR5Main/Objects/TR1/Entity/tr1_bear.cpp +++ b/TR5Main/Objects/TR1/Entity/tr1_bear.cpp @@ -63,28 +63,28 @@ void BearControl(short itemNumber) { angle = CreatureTurn(item, ANGLE(1.0f)); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case BEAR_STATE_WALK: { - item->TargetState = BEAR_STATE_REAR; + item->Animation.TargetState = BEAR_STATE_REAR; break; } case BEAR_STATE_RUN: case BEAR_STATE_STROLL: { - item->TargetState = BEAR_STATE_IDLE; + item->Animation.TargetState = BEAR_STATE_IDLE; break; } case BEAR_STATE_REAR: { - item->TargetState = BEAR_STATE_DEATH; + item->Animation.TargetState = BEAR_STATE_DEATH; creature->Flags = 1; break; } case BEAR_STATE_IDLE: { - item->TargetState = BEAR_STATE_DEATH; + item->Animation.TargetState = BEAR_STATE_DEATH; creature->Flags = 0; break; } @@ -120,22 +120,22 @@ void BearControl(short itemNumber) const bool laraDead = LaraItem->HitPoints <= 0; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case BEAR_STATE_IDLE: if (laraDead) { if (AI.bite && AI.distance < EAT_RANGE) - item->TargetState = BEAR_STATE_CHOMP; + item->Animation.TargetState = BEAR_STATE_CHOMP; else - item->TargetState = BEAR_STATE_STROLL; + item->Animation.TargetState = BEAR_STATE_STROLL; } - else if (item->RequiredState) - item->TargetState = item->RequiredState; + else if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (creature->Mood == MoodType::Bored) - item->TargetState = BEAR_STATE_STROLL; + item->Animation.TargetState = BEAR_STATE_STROLL; else - item->TargetState = BEAR_STATE_RUN; + item->Animation.TargetState = BEAR_STATE_RUN; break; @@ -143,18 +143,18 @@ void BearControl(short itemNumber) creature->MaxTurn = WALK_TURN; if (laraDead && item->TouchBits & TOUCH && AI.ahead) - item->TargetState = BEAR_STATE_IDLE; + item->Animation.TargetState = BEAR_STATE_IDLE; else if (creature->Mood != MoodType::Bored) { - item->TargetState = BEAR_STATE_IDLE; + item->Animation.TargetState = BEAR_STATE_IDLE; if (creature->Mood == MoodType::Escape) - item->RequiredState = BEAR_STATE_STROLL; + item->Animation.RequiredState = BEAR_STATE_STROLL; } else if (GetRandomControl() < ROAR_CHANCE) { - item->RequiredState = BEAR_STATE_ROAR; - item->TargetState = BEAR_STATE_IDLE; + item->Animation.RequiredState = BEAR_STATE_ROAR; + item->Animation.TargetState = BEAR_STATE_IDLE; } break; @@ -169,16 +169,16 @@ void BearControl(short itemNumber) } if (creature->Mood == MoodType::Bored || laraDead) - item->TargetState = BEAR_STATE_IDLE; - else if (AI.ahead && !item->RequiredState) + item->Animation.TargetState = BEAR_STATE_IDLE; + else if (AI.ahead && !item->Animation.RequiredState) { if (!creature->Flags && AI.distance < REAR_RANGE && GetRandomControl() < REAR_CHANCE) { - item->RequiredState = BEAR_STATE_REAR; - item->TargetState = BEAR_STATE_IDLE; + item->Animation.RequiredState = BEAR_STATE_REAR; + item->Animation.TargetState = BEAR_STATE_IDLE; } else if (AI.distance < ATTACK_RANGE) - item->TargetState = BEAR_STATE_ATTACK_1; + item->Animation.TargetState = BEAR_STATE_ATTACK_1; } break; @@ -186,50 +186,50 @@ void BearControl(short itemNumber) case BEAR_STATE_REAR: if (creature->Flags) { - item->RequiredState = BEAR_STATE_STROLL; - item->TargetState = BEAR_STATE_IDLE; + item->Animation.RequiredState = BEAR_STATE_STROLL; + item->Animation.TargetState = BEAR_STATE_IDLE; } - else if (item->RequiredState) - item->TargetState = item->RequiredState; + else if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (creature->Mood == MoodType::Bored || creature->Mood == MoodType::Escape) - item->TargetState = BEAR_STATE_IDLE; + item->Animation.TargetState = BEAR_STATE_IDLE; else if (AI.bite && AI.distance < PAT_RANGE) - item->TargetState = BEAR_STATE_ATTACK_2; + item->Animation.TargetState = BEAR_STATE_ATTACK_2; else - item->TargetState = BEAR_STATE_WALK; + item->Animation.TargetState = BEAR_STATE_WALK; break; case BEAR_STATE_WALK: if (creature->Flags) { - item->RequiredState = BEAR_STATE_STROLL; - item->TargetState = BEAR_STATE_REAR; + item->Animation.RequiredState = BEAR_STATE_STROLL; + item->Animation.TargetState = BEAR_STATE_REAR; } else if (AI.ahead && (item->TouchBits & TOUCH)) - item->TargetState = BEAR_STATE_REAR; + item->Animation.TargetState = BEAR_STATE_REAR; else if (creature->Mood == MoodType::Escape) { - item->TargetState = BEAR_STATE_REAR; - item->RequiredState = BEAR_STATE_STROLL; + item->Animation.TargetState = BEAR_STATE_REAR; + item->Animation.RequiredState = BEAR_STATE_STROLL; } else if (creature->Mood == MoodType::Bored || GetRandomControl() < ROAR_CHANCE) { - item->RequiredState = BEAR_STATE_ROAR; - item->TargetState = BEAR_STATE_REAR; + item->Animation.RequiredState = BEAR_STATE_ROAR; + item->Animation.TargetState = BEAR_STATE_REAR; } else if (AI.distance > REAR_RANGE || GetRandomControl() < DROP_CHANCE) { - item->RequiredState = BEAR_STATE_IDLE; - item->TargetState = BEAR_STATE_REAR; + item->Animation.RequiredState = BEAR_STATE_IDLE; + item->Animation.TargetState = BEAR_STATE_REAR; } break; case BEAR_STATE_ATTACK_2: - if (!item->RequiredState && item->TouchBits & TOUCH) + if (!item->Animation.RequiredState && item->TouchBits & TOUCH) { - item->RequiredState = BEAR_STATE_REAR; + item->Animation.RequiredState = BEAR_STATE_REAR; LaraItem->HitPoints -= PAT_DAMAGE; LaraItem->HitStatus = true; @@ -238,10 +238,10 @@ void BearControl(short itemNumber) break; case BEAR_STATE_ATTACK_1: - if (!item->RequiredState && (item->TouchBits & TOUCH)) + if (!item->Animation.RequiredState && (item->TouchBits & TOUCH)) { CreatureEffect(item, &BearBite, DoBloodSplat); - item->RequiredState = BEAR_STATE_IDLE; + item->Animation.RequiredState = BEAR_STATE_IDLE; LaraItem->HitPoints -= ATTACK_DAMAGE; LaraItem->HitStatus = true; diff --git a/TR5Main/Objects/TR1/Entity/tr1_bigrat.cpp b/TR5Main/Objects/TR1/Entity/tr1_bigrat.cpp index 81893f35a..eb1e2a59b 100644 --- a/TR5Main/Objects/TR1/Entity/tr1_bigrat.cpp +++ b/TR5Main/Objects/TR1/Entity/tr1_bigrat.cpp @@ -67,17 +67,17 @@ void InitialiseBigRat(short itemNumber) if (TestEnvironment(ENV_FLAG_WATER, item)) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + BIG_RAT_ANIM_SWIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BIG_RAT_STATE_SWIM; - item->TargetState = BIG_RAT_STATE_SWIM; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + BIG_RAT_ANIM_SWIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BIG_RAT_STATE_SWIM; + item->Animation.TargetState = BIG_RAT_STATE_SWIM; } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + BIG_RAT_ANIM_EMPTY; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BIG_RAT_STATE_IDLE; - item->TargetState = BIG_RAT_STATE_IDLE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + BIG_RAT_ANIM_EMPTY; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BIG_RAT_STATE_IDLE; + item->Animation.TargetState = BIG_RAT_STATE_IDLE; } } @@ -125,22 +125,22 @@ void BigRatControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != BIG_RAT_STATE_LAND_DEATH && - item->ActiveState != BIG_RAT_STATE_WATER_DEATH) + if (item->Animation.ActiveState != BIG_RAT_STATE_LAND_DEATH && + item->Animation.ActiveState != BIG_RAT_STATE_WATER_DEATH) { if (TestEnvironment(ENV_FLAG_WATER, item)) { - item->AnimNumber = objectInfo->animIndex + BIG_RAT_ANIM_WATER_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BIG_RAT_STATE_WATER_DEATH; - item->TargetState = BIG_RAT_STATE_WATER_DEATH; + item->Animation.AnimNumber = objectInfo->animIndex + BIG_RAT_ANIM_WATER_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BIG_RAT_STATE_WATER_DEATH; + item->Animation.TargetState = BIG_RAT_STATE_WATER_DEATH; } else { - item->AnimNumber = objectInfo->animIndex + BIG_RAT_ANIM_LAND_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BIG_RAT_STATE_LAND_DEATH; - item->TargetState = BIG_RAT_STATE_LAND_DEATH; + item->Animation.AnimNumber = objectInfo->animIndex + BIG_RAT_ANIM_LAND_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BIG_RAT_STATE_LAND_DEATH; + item->Animation.TargetState = BIG_RAT_STATE_LAND_DEATH; } } @@ -173,15 +173,15 @@ void BigRatControl(short itemNumber) AlertAllGuards(itemNumber); } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case BIG_RAT_STATE_IDLE: - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.bite && AI.distance < BIG_RAT_BITE_RANGE) - item->TargetState = BIG_RAT_STATE_BITE_ATTACK; + item->Animation.TargetState = BIG_RAT_STATE_BITE_ATTACK; else - item->TargetState = BIG_RAT_STATE_RUN; + item->Animation.TargetState = BIG_RAT_STATE_RUN; break; @@ -190,29 +190,29 @@ void BigRatControl(short itemNumber) if (RatIsInWater(item)) { - item->RequiredState = BIG_RAT_STATE_SWIM; - item->TargetState = BIG_RAT_STATE_SWIM; + item->Animation.RequiredState = BIG_RAT_STATE_SWIM; + item->Animation.TargetState = BIG_RAT_STATE_SWIM; break; } if (AI.ahead && (item->TouchBits & BIG_RAT_TOUCH)) - item->TargetState = BIG_RAT_STATE_IDLE; + item->Animation.TargetState = BIG_RAT_STATE_IDLE; else if (AI.bite && AI.distance < BIG_RAT_CHARGE_RANGE) - item->TargetState = BIG_RAT_STATE_CHARGE_ATTACK; + item->Animation.TargetState = BIG_RAT_STATE_CHARGE_ATTACK; else if (AI.ahead && GetRandomControl() < BIG_RAT_POSE_CHANCE) { - item->RequiredState = BIG_RAT_STATE_POSE; - item->TargetState = BIG_RAT_STATE_IDLE; + item->Animation.RequiredState = BIG_RAT_STATE_POSE; + item->Animation.TargetState = BIG_RAT_STATE_IDLE; } break; case BIG_RAT_STATE_BITE_ATTACK: - if (!item->RequiredState && AI.ahead && (item->TouchBits & BIG_RAT_TOUCH)) + if (!item->Animation.RequiredState && AI.ahead && (item->TouchBits & BIG_RAT_TOUCH)) { CreatureEffect(item, &BigRatBite, DoBloodSplat); - item->RequiredState = BIG_RAT_STATE_IDLE; + item->Animation.RequiredState = BIG_RAT_STATE_IDLE; LaraItem->HitPoints -= BIG_RAT_BITE_DAMAGE; LaraItem->HitStatus = true; @@ -221,10 +221,10 @@ void BigRatControl(short itemNumber) break; case BIG_RAT_STATE_CHARGE_ATTACK: - if (!item->RequiredState && AI.ahead && (item->TouchBits & BIG_RAT_TOUCH)) + if (!item->Animation.RequiredState && AI.ahead && (item->TouchBits & BIG_RAT_TOUCH)) { CreatureEffect(item, &BigRatBite, DoBloodSplat); - item->RequiredState = BIG_RAT_STATE_RUN; + item->Animation.RequiredState = BIG_RAT_STATE_RUN; LaraItem->HitPoints -= BIG_RAT_CHARGE_DAMAGE; LaraItem->HitStatus = true; @@ -234,7 +234,7 @@ void BigRatControl(short itemNumber) case BIG_RAT_STATE_POSE: if (creature->Mood != MoodType::Bored || GetRandomControl() < BIG_RAT_POSE_CHANCE) - item->TargetState = BIG_RAT_STATE_IDLE; + item->Animation.TargetState = BIG_RAT_STATE_IDLE; break; @@ -243,18 +243,18 @@ void BigRatControl(short itemNumber) if (!RatIsInWater(item)) { - item->RequiredState = BIG_RAT_STATE_RUN; - item->TargetState = BIG_RAT_STATE_RUN; + item->Animation.RequiredState = BIG_RAT_STATE_RUN; + item->Animation.TargetState = BIG_RAT_STATE_RUN; break; } if (AI.ahead && item->TouchBits & BIG_RAT_TOUCH) - item->TargetState = BIG_RAT_STATE_SWIM_ATTACK; + item->Animation.TargetState = BIG_RAT_STATE_SWIM_ATTACK; break; case BIG_RAT_STATE_SWIM_ATTACK: - if (!item->RequiredState && AI.ahead && item->TouchBits & BIG_RAT_TOUCH) + if (!item->Animation.RequiredState && AI.ahead && item->TouchBits & BIG_RAT_TOUCH) { CreatureEffect(item, &BigRatBite, DoBloodSplat); @@ -262,7 +262,7 @@ void BigRatControl(short itemNumber) LaraItem->HitStatus = true; } - item->TargetState = BIG_RAT_STATE_SWIM; + item->Animation.TargetState = BIG_RAT_STATE_SWIM; break; } diff --git a/TR5Main/Objects/TR1/Entity/tr1_centaur.cpp b/TR5Main/Objects/TR1/Entity/tr1_centaur.cpp index d9acc2940..7802b1a96 100644 --- a/TR5Main/Objects/TR1/Entity/tr1_centaur.cpp +++ b/TR5Main/Objects/TR1/Entity/tr1_centaur.cpp @@ -59,29 +59,29 @@ void ControlCentaurBomb(short itemNumber) item->Position.xRot = -ANGLE(90.0f); aboveWater = true; - item->Velocity = BOMB_SPEED * phd_cos(item->Position.xRot); - item->VerticalVelocity = -BOMB_SPEED * phd_sin(item->Position.xRot); + item->Animation.Velocity = BOMB_SPEED * phd_cos(item->Position.xRot); + item->Animation.VerticalVelocity = -BOMB_SPEED * phd_sin(item->Position.xRot); } else { aboveWater = true; - item->VerticalVelocity += 3; + item->Animation.VerticalVelocity += 3; - if (item->Velocity) + if (item->Animation.Velocity) { - item->Position.zRot += ((item->Velocity / 4) + 7) * ANGLE(1.0f); + item->Position.zRot += ((item->Animation.Velocity / 4) + 7) * ANGLE(1.0f); - if (item->RequiredState) - item->Position.yRot += ((item->Velocity / 2) + 7) * ANGLE(1.0f); + if (item->Animation.RequiredState) + item->Position.yRot += ((item->Animation.Velocity / 2) + 7) * ANGLE(1.0f); else - item->Position.xRot += ((item->Velocity / 2) + 7) * ANGLE(1.0f); + item->Position.xRot += ((item->Animation.Velocity / 2) + 7) * ANGLE(1.0f); } } - item->Position.xPos += item->Velocity * phd_cos(item->Position.xRot) * phd_sin(item->Position.yRot); - item->Position.yPos += item->Velocity * phd_sin(-item->Position.xRot); - item->Position.zPos += item->Velocity * phd_cos(item->Position.xRot) * phd_cos(item->Position.yRot); + item->Position.xPos += item->Animation.Velocity * phd_cos(item->Position.xRot) * phd_sin(item->Position.yRot); + item->Position.yPos += item->Animation.Velocity * phd_sin(-item->Position.xRot); + item->Position.zPos += item->Animation.Velocity * phd_cos(item->Position.xRot) * phd_cos(item->Position.yRot); auto probe = GetCollisionResult(item); @@ -166,8 +166,8 @@ static void RocketGun(ITEM_INFO* centaurItem) projectileItem->Position.yRot = centaurItem->Position.yRot; projectileItem->Position.zRot = 0; - projectileItem->Velocity = BOMB_SPEED * phd_cos(projectileItem->Position.xRot); - projectileItem->VerticalVelocity = -BOMB_SPEED * phd_cos(projectileItem->Position.xRot); + projectileItem->Animation.Velocity = BOMB_SPEED * phd_cos(projectileItem->Position.xRot); + projectileItem->Animation.VerticalVelocity = -BOMB_SPEED * phd_cos(projectileItem->Position.xRot); projectileItem->ItemFlags[0] = 1; AddActiveItem(itemNumber); @@ -187,11 +187,11 @@ void CentaurControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != CENTAUR_STATE_DEATH) + if (item->Animation.ActiveState != CENTAUR_STATE_DEATH) { - item->AnimNumber = Objects[ID_CENTAUR_MUTANT].animIndex + CENTAUR_ANIM_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = CENTAUR_STATE_DEATH; + item->Animation.AnimNumber = Objects[ID_CENTAUR_MUTANT].animIndex + CENTAUR_ANIM_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = CENTAUR_STATE_DEATH; } } else @@ -206,64 +206,64 @@ void CentaurControl(short itemNumber) angle = CreatureTurn(item, CENTAUR_TURN); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case CENTAUR_STATE_IDLE: CreatureJoint(item, 17, 0); - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.bite && AI.distance < CENTAUR_REAR_RANGE) - item->TargetState = CENTAUR_STATE_RUN; + item->Animation.TargetState = CENTAUR_STATE_RUN; else if (Targetable(item, &AI)) - item->TargetState = CENTAUR_STATE_AIM; + item->Animation.TargetState = CENTAUR_STATE_AIM; else - item->TargetState = CENTAUR_STATE_RUN; + item->Animation.TargetState = CENTAUR_STATE_RUN; break; case CENTAUR_STATE_RUN: if (AI.bite && AI.distance < CENTAUR_REAR_RANGE) { - item->RequiredState = CENTAUR_STATE_WARNING; - item->TargetState = CENTAUR_STATE_IDLE; + item->Animation.RequiredState = CENTAUR_STATE_WARNING; + item->Animation.TargetState = CENTAUR_STATE_IDLE; } else if (Targetable(item, &AI)) { - item->RequiredState = CENTAUR_STATE_AIM; - item->TargetState = CENTAUR_STATE_IDLE; + item->Animation.RequiredState = CENTAUR_STATE_AIM; + item->Animation.TargetState = CENTAUR_STATE_IDLE; } else if (GetRandomControl() < CENTAUR_REAR_CHANCE) { - item->RequiredState = CENTAUR_STATE_WARNING; - item->TargetState = CENTAUR_STATE_IDLE; + item->Animation.RequiredState = CENTAUR_STATE_WARNING; + item->Animation.TargetState = CENTAUR_STATE_IDLE; } break; case CENTAUR_STATE_AIM: - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (Targetable(item, &AI)) - item->TargetState = CENTAUR_STATE_SHOOT; + item->Animation.TargetState = CENTAUR_STATE_SHOOT; else - item->TargetState = CENTAUR_STATE_IDLE; + item->Animation.TargetState = CENTAUR_STATE_IDLE; break; case CENTAUR_STATE_SHOOT: - if (!item->RequiredState) + if (!item->Animation.RequiredState) { - item->RequiredState = CENTAUR_STATE_AIM; + item->Animation.RequiredState = CENTAUR_STATE_AIM; RocketGun(item); } break; case CENTAUR_STATE_WARNING: - if (!item->RequiredState && item->TouchBits & CENTAUR_TOUCH) + if (!item->Animation.RequiredState && item->TouchBits & CENTAUR_TOUCH) { CreatureEffect(item, &CentaurRearBite, DoBloodSplat); - item->RequiredState = CENTAUR_STATE_IDLE; + item->Animation.RequiredState = CENTAUR_STATE_IDLE; LaraItem->HitPoints -= CENTAUR_REAR_DAMAGE; LaraItem->HitStatus = 1; diff --git a/TR5Main/Objects/TR1/Entity/tr1_doppelganger.cpp b/TR5Main/Objects/TR1/Entity/tr1_doppelganger.cpp index 4d4750630..037e52745 100644 --- a/TR5Main/Objects/TR1/Entity/tr1_doppelganger.cpp +++ b/TR5Main/Objects/TR1/Entity/tr1_doppelganger.cpp @@ -78,8 +78,8 @@ void DoppelgangerControl(short itemNumber) int laraFloorHeight = GetCollisionResult(LaraItem).Position.Floor; // Animate bacon Lara, mirroring Lara's position. - item->FrameNumber = LaraItem->FrameNumber; - item->AnimNumber = LaraItem->AnimNumber; + item->Animation.FrameNumber = LaraItem->Animation.FrameNumber; + item->Animation.AnimNumber = LaraItem->Animation.AnimNumber; item->Position.xPos = pos.x; item->Position.yPos = pos.y; item->Position.zPos = pos.z; @@ -90,12 +90,12 @@ void DoppelgangerControl(short itemNumber) // Compare floor heights. if (item->Floor >= laraFloorHeight + SECTOR(1) + 1 && // Add 1 to avoid bacon Lara dying when exiting water. - !LaraItem->Airborne) + !LaraItem->Animation.Airborne) { SetAnimation(item, LA_JUMP_WALL_SMASH_START); - item->Velocity = 0; - item->VerticalVelocity = 0; - item->Airborne = true; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = true; item->Data = -1; item->Position.yPos += 50; } @@ -112,10 +112,10 @@ void DoppelgangerControl(short itemNumber) item->Position.yPos = item->Floor; TestTriggers(item, true); - item->VerticalVelocity = 0; - item->Airborne = false; - item->TargetState = LS_DEATH; - item->RequiredState = LS_DEATH; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.TargetState = LS_DEATH; + item->Animation.RequiredState = LS_DEATH; } } } diff --git a/TR5Main/Objects/TR1/Entity/tr1_giant_mutant.cpp b/TR5Main/Objects/TR1/Entity/tr1_giant_mutant.cpp index 818fdf8d9..824cee913 100644 --- a/TR5Main/Objects/TR1/Entity/tr1_giant_mutant.cpp +++ b/TR5Main/Objects/TR1/Entity/tr1_giant_mutant.cpp @@ -62,11 +62,11 @@ void GiantMutantControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != MUTANT_STATE_DEATH) + if (item->Animation.ActiveState != MUTANT_STATE_DEATH) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + MUTANT_ANIM_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = MUTANT_STATE_DEATH; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + MUTANT_ANIM_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = MUTANT_STATE_DEATH; } } else @@ -88,11 +88,11 @@ void GiantMutantControl(short itemNumber) LaraItem->HitStatus = true; } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case MUTANT_STATE_SET: - item->TargetState = MUTANT_STATE_FALL; - item->Airborne = true; + item->Animation.TargetState = MUTANT_STATE_FALL; + item->Animation.Airborne = true; break; case MUTANT_STATE_IDLE: @@ -102,68 +102,68 @@ void GiantMutantControl(short itemNumber) creature->Flags = 0; if (angle > MUTANT_NEED_TURN) - item->TargetState = MUTANT_STATE_TURN_RIGHT; + item->Animation.TargetState = MUTANT_STATE_TURN_RIGHT; else if (angle < -MUTANT_NEED_TURN) - item->TargetState = MUTANT_STATE_TURN_LEFT; + item->Animation.TargetState = MUTANT_STATE_TURN_LEFT; else if (AI.distance < MUTANT_ATTACK_RANGE) { if (LaraItem->HitPoints <= MUTANT_ATTACK_DAMAGE) { if (AI.distance < MUTANT_CLOSE_RANGE) - item->TargetState = MUTANT_STATE_ATTACK_3; + item->Animation.TargetState = MUTANT_STATE_ATTACK_3; else - item->TargetState = MUTANT_STATE_FORWARD; + item->Animation.TargetState = MUTANT_STATE_FORWARD; } else if (GetRandomControl() < 0x4000) - item->TargetState = MUTANT_STATE_ATTACK_1; + item->Animation.TargetState = MUTANT_STATE_ATTACK_1; else - item->TargetState = MUTANT_STATE_ATTACK_2; + item->Animation.TargetState = MUTANT_STATE_ATTACK_2; } else - item->TargetState = MUTANT_STATE_FORWARD; + item->Animation.TargetState = MUTANT_STATE_FORWARD; break; case MUTANT_STATE_FORWARD: if (angle < -MUTANT_TURN) - item->TargetState -= MUTANT_TURN; + item->Animation.TargetState -= MUTANT_TURN; else if (angle > MUTANT_TURN) - item->TargetState += MUTANT_TURN; + item->Animation.TargetState += MUTANT_TURN; else - item->TargetState += angle; + item->Animation.TargetState += angle; if (angle > MUTANT_NEED_TURN || angle < -MUTANT_NEED_TURN) - item->TargetState = MUTANT_STATE_IDLE; + item->Animation.TargetState = MUTANT_STATE_IDLE; else if (AI.distance < MUTANT_ATTACK_RANGE) - item->TargetState = MUTANT_STATE_IDLE; + item->Animation.TargetState = MUTANT_STATE_IDLE; break; case MUTANT_STATE_TURN_RIGHT: if (!creature->Flags) - creature->Flags = item->FrameNumber; - else if (item->FrameNumber - creature->Flags > 16 && - item->FrameNumber - creature->Flags < 23) + creature->Flags = item->Animation.FrameNumber; + else if (item->Animation.FrameNumber - creature->Flags > 16 && + item->Animation.FrameNumber - creature->Flags < 23) { item->Position.yRot += ANGLE(14.0f); } if (angle < MUTANT_NEED_TURN) - item->TargetState = MUTANT_STATE_IDLE; + item->Animation.TargetState = MUTANT_STATE_IDLE; break; case MUTANT_STATE_TURN_LEFT: if (!creature->Flags) - creature->Flags = item->FrameNumber; - else if (item->FrameNumber - creature->Flags > 13 && - item->FrameNumber - creature->Flags < 23) + creature->Flags = item->Animation.FrameNumber; + else if (item->Animation.FrameNumber - creature->Flags > 13 && + item->Animation.FrameNumber - creature->Flags < 23) { item->Position.yRot -= ANGLE(9.0f); } if (angle > -MUTANT_NEED_TURN) - item->TargetState = MUTANT_STATE_IDLE; + item->Animation.TargetState = MUTANT_STATE_IDLE; break; @@ -192,20 +192,20 @@ void GiantMutantControl(short itemNumber) case MUTANT_STATE_ATTACK_3: if (item->TouchBits & MUTANT_TRIGHT || LaraItem->HitPoints <= 0) { - item->TargetState = MUTANT_STATE_KILL; + item->Animation.TargetState = MUTANT_STATE_KILL; Camera.targetDistance = SECTOR(2); Camera.flags = CF_FOLLOW_CENTER; - LaraItem->AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; - LaraItem->ActiveState = LaraItem->TargetState = 46; + LaraItem->Animation.AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; + LaraItem->Animation.ActiveState = LaraItem->Animation.TargetState = 46; LaraItem->RoomNumber = item->RoomNumber; LaraItem->Position.xPos = item->Position.xPos; LaraItem->Position.yPos = item->Position.yPos; LaraItem->Position.zPos = item->Position.zPos; LaraItem->Position.yRot = item->Position.yRot; LaraItem->Position.xRot = LaraItem->Position.zRot = 0; - LaraItem->Airborne = false; + LaraItem->Animation.Airborne = false; LaraItem->HitPoints = -1; Lara.Air = -1; Lara.Control.HandStatus = HandStatus::Busy; @@ -223,14 +223,14 @@ void GiantMutantControl(short itemNumber) CreatureJoint(item, 0, head); - if (item->ActiveState == MUTANT_STATE_FALL) + if (item->Animation.ActiveState == MUTANT_STATE_FALL) { AnimateItem(item); if (item->Position.yPos > item->Floor) { - item->TargetState = MUTANT_STATE_IDLE; - item->Airborne = false; + item->Animation.TargetState = MUTANT_STATE_IDLE; + item->Animation.Airborne = false; item->Position.yPos = item->Floor; Camera.bounce = 500; } diff --git a/TR5Main/Objects/TR1/Entity/tr1_natla.cpp b/TR5Main/Objects/TR1/Entity/tr1_natla.cpp index d0665bc55..7b56fb303 100644 --- a/TR5Main/Objects/TR1/Entity/tr1_natla.cpp +++ b/TR5Main/Objects/TR1/Entity/tr1_natla.cpp @@ -58,7 +58,7 @@ void NatlaControl(short itemNumber) AI_INFO AI; if (item->HitPoints <= 0 && item->HitPoints > -16384) - item->TargetState = NATLA_STATE_DEATH; + item->Animation.TargetState = NATLA_STATE_DEATH; else if (item->HitPoints <= NATLA_NEAR_DEATH) { creature->LOT.Step = CLICK(1); @@ -81,18 +81,18 @@ void NatlaControl(short itemNumber) facing = 0; } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case NATLA_STATE_FALL: if (item->Position.yPos < item->Floor) { - item->Velocity = 0; - item->Airborne = true; + item->Animation.Velocity = 0; + item->Animation.Airborne = true; } else { - item->Airborne = 0; - item->TargetState = NATLA_STATE_SEMI_DEATH; + item->Animation.Airborne = 0; + item->Animation.TargetState = NATLA_STATE_SEMI_DEATH; item->Position.yPos = item->Floor; timer = 0; } @@ -101,7 +101,7 @@ void NatlaControl(short itemNumber) case NATLA_STATE_STAND: if (!shoot) - item->TargetState = NATLA_STATE_RUN; + item->Animation.TargetState = NATLA_STATE_RUN; if (timer >= 20) { @@ -135,14 +135,14 @@ void NatlaControl(short itemNumber) } if (shoot) - item->TargetState = NATLA_STATE_STAND; + item->Animation.TargetState = NATLA_STATE_STAND; break; case NATLA_STATE_SEMI_DEATH: if (timer == NATLA_DEATH_TIME) { - item->TargetState = NATLA_STATE_STAND; + item->Animation.TargetState = NATLA_STATE_STAND; creature->Flags = 0; timer = 0; item->HitPoints = NATLA_NEAR_DEATH; @@ -153,14 +153,14 @@ void NatlaControl(short itemNumber) break; case NATLA_STATE_FLY: - item->TargetState = NATLA_STATE_FALL; + item->Animation.TargetState = NATLA_STATE_FALL; timer = 0; break; case NATLA_STATE_IDLE: case NATLA_STATE_SHOOT: case NATLA_STATE_AIM: - item->TargetState = NATLA_STATE_SEMI_DEATH; + item->Animation.TargetState = NATLA_STATE_SEMI_DEATH; item->Flags = 0; timer = 0; break; @@ -175,7 +175,7 @@ void NatlaControl(short itemNumber) shoot = (AI.angle > -NATLA_FIRE_ARC && AI.angle < NATLA_FIRE_ARC && Targetable(item, &AI)); - if (item->ActiveState == NATLA_STATE_FLY && (creature->Flags & NATLA_FLYMODE)) + if (item->Animation.ActiveState == NATLA_STATE_FLY && (creature->Flags & NATLA_FLYMODE)) { if (creature->Flags & NATLA_FLYMODE && shoot && GetRandomControl() < NATLA_LAND_CHANCE) creature->Flags -= NATLA_FLYMODE; @@ -195,13 +195,13 @@ void NatlaControl(short itemNumber) if (AI.ahead) head = AI.angle; - if (item->ActiveState != NATLA_STATE_FLY || (creature->Flags & NATLA_FLYMODE)) + if (item->Animation.ActiveState != NATLA_STATE_FLY || (creature->Flags & NATLA_FLYMODE)) CreatureMood(item, &AI, TIMID); item->Position.yRot -= facing; angle = CreatureTurn(item, NATLA_FLY_TURN); - if (item->ActiveState == NATLA_STATE_FLY) + if (item->Animation.ActiveState == NATLA_STATE_FLY) { if (AI.angle > NATLA_FLY_TURN) facing += NATLA_FLY_TURN; @@ -218,21 +218,21 @@ void NatlaControl(short itemNumber) facing = 0; } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case NATLA_STATE_IDLE: timer = 0; if (creature->Flags & NATLA_FLYMODE) - item->TargetState = NATLA_STATE_FLY; + item->Animation.TargetState = NATLA_STATE_FLY; else - item->TargetState = NATLA_STATE_AIM; + item->Animation.TargetState = NATLA_STATE_AIM; break; case NATLA_STATE_FLY: if (!(creature->Flags & NATLA_FLYMODE) && item->Position.yPos == item->Floor) - item->TargetState = NATLA_STATE_IDLE; + item->Animation.TargetState = NATLA_STATE_IDLE; if (timer >= 30) { @@ -250,17 +250,17 @@ void NatlaControl(short itemNumber) break; case NATLA_STATE_AIM: - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (shoot) - item->TargetState = NATLA_STATE_SHOOT; + item->Animation.TargetState = NATLA_STATE_SHOOT; else - item->TargetState = NATLA_STATE_IDLE; + item->Animation.TargetState = NATLA_STATE_IDLE; break; case NATLA_STATE_SHOOT: - if (!item->RequiredState) + if (!item->Animation.RequiredState) { short FXNumber = CreatureEffect(item, &NatlaGunBite, BombGun); if (FXNumber != NO_ITEM) @@ -274,7 +274,7 @@ void NatlaControl(short itemNumber) if (FXNumber != NO_ITEM) EffectList[FXNumber].pos.yRot += (short)((GetRandomControl() - 0x4000) / 4); - item->RequiredState = NATLA_STATE_IDLE; + item->Animation.RequiredState = NATLA_STATE_IDLE; } break; diff --git a/TR5Main/Objects/TR1/Entity/tr1_wolf.cpp b/TR5Main/Objects/TR1/Entity/tr1_wolf.cpp index 910dcc6d3..207d379d5 100644 --- a/TR5Main/Objects/TR1/Entity/tr1_wolf.cpp +++ b/TR5Main/Objects/TR1/Entity/tr1_wolf.cpp @@ -59,7 +59,7 @@ void InitialiseWolf(short itemNumber) auto* item = &g_Level.Items[itemNumber]; ClearItem(itemNumber); - item->FrameNumber = SLEEP_FRAME; + item->Animation.FrameNumber = SLEEP_FRAME; } void WolfControl(short itemNumber) @@ -76,11 +76,11 @@ void WolfControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != WOLF_STATE_DEATH) + if (item->Animation.ActiveState != WOLF_STATE_DEATH) { - item->AnimNumber = Objects[ID_WOLF].animIndex + WOLF_ANIM_DEATH + (short)(GetRandomControl() / 11000); - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = WOLF_STATE_DEATH; + item->Animation.AnimNumber = Objects[ID_WOLF].animIndex + WOLF_ANIM_DEATH + (short)(GetRandomControl() / 11000); + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = WOLF_STATE_DEATH; } } else @@ -96,29 +96,29 @@ void WolfControl(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case WOLF_STATE_SLEEP: head = 0; if (creature->Mood == MoodType::Escape || AI.zoneNumber == AI.enemyZone) { - item->RequiredState = WOLF_STATE_CROUCH; - item->TargetState = WOLF_STATE_IDLE; + item->Animation.RequiredState = WOLF_STATE_CROUCH; + item->Animation.TargetState = WOLF_STATE_IDLE; } else if (GetRandomControl() < WAKE_CHANCE) { - item->RequiredState = WOLF_STATE_WALK; - item->TargetState = WOLF_STATE_IDLE; + item->Animation.RequiredState = WOLF_STATE_WALK; + item->Animation.TargetState = WOLF_STATE_IDLE; } break; case WOLF_STATE_IDLE: - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else - item->TargetState = WOLF_STATE_WALK; + item->Animation.TargetState = WOLF_STATE_WALK; break; case WOLF_STATE_WALK: @@ -126,30 +126,30 @@ void WolfControl(short itemNumber) if (creature->Mood != MoodType::Bored) { - item->TargetState = WOLF_STATE_STALK; - item->RequiredState = WOLF_STATE_NONE; + item->Animation.TargetState = WOLF_STATE_STALK; + item->Animation.RequiredState = WOLF_STATE_NONE; } else if (GetRandomControl() < SLEEP_CHANCE) { - item->RequiredState = WOLF_STATE_SLEEP; - item->TargetState = WOLF_STATE_IDLE; + item->Animation.RequiredState = WOLF_STATE_SLEEP; + item->Animation.TargetState = WOLF_STATE_IDLE; } break; case WOLF_STATE_CROUCH: - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (creature->Mood == MoodType::Escape) - item->TargetState = WOLF_STATE_RUN; + item->Animation.TargetState = WOLF_STATE_RUN; else if (AI.distance < pow(345, 2) && AI.bite) - item->TargetState = WOLF_STATE_BITE; + item->Animation.TargetState = WOLF_STATE_BITE; else if (creature->Mood == MoodType::Stalk) - item->TargetState = WOLF_STATE_STALK; + item->Animation.TargetState = WOLF_STATE_STALK; else if (creature->Mood == MoodType::Bored) - item->TargetState = WOLF_STATE_IDLE; + item->Animation.TargetState = WOLF_STATE_IDLE; else - item->TargetState = WOLF_STATE_RUN; + item->Animation.TargetState = WOLF_STATE_RUN; break; @@ -157,26 +157,26 @@ void WolfControl(short itemNumber) creature->MaxTurn = STALK_TURN; if (creature->Mood == MoodType::Escape) - item->TargetState = WOLF_STATE_RUN; + item->Animation.TargetState = WOLF_STATE_RUN; else if (AI.distance < pow(345, 2) && AI.bite) - item->TargetState = WOLF_STATE_BITE; + item->Animation.TargetState = WOLF_STATE_BITE; else if (AI.distance > pow(SECTOR(3), 2)) - item->TargetState = WOLF_STATE_RUN; + item->Animation.TargetState = WOLF_STATE_RUN; else if (creature->Mood == MoodType::Attack) { if (!AI.ahead || AI.distance > pow(SECTOR(1.5f), 2) || (AI.enemyFacing < FRONT_ARC && AI.enemyFacing > -FRONT_ARC)) { - item->TargetState = WOLF_STATE_RUN; + item->Animation.TargetState = WOLF_STATE_RUN; } } else if (GetRandomControl() < HOWL_CHANCE) { - item->RequiredState = WOLF_STATE_HOWL; - item->TargetState = WOLF_STATE_CROUCH; + item->Animation.RequiredState = WOLF_STATE_HOWL; + item->Animation.TargetState = WOLF_STATE_CROUCH; } else if (creature->Mood == MoodType::Bored) - item->TargetState = WOLF_STATE_CROUCH; + item->Animation.TargetState = WOLF_STATE_CROUCH; break; @@ -189,47 +189,47 @@ void WolfControl(short itemNumber) if (AI.distance > (ATTACK_RANGE / 2) && (AI.enemyFacing > FRONT_ARC || AI.enemyFacing < -FRONT_ARC)) { - item->RequiredState = WOLF_STATE_STALK; - item->TargetState = WOLF_STATE_CROUCH; + item->Animation.RequiredState = WOLF_STATE_STALK; + item->Animation.TargetState = WOLF_STATE_CROUCH; } else { - item->TargetState = WOLF_STATE_ATTACK; - item->RequiredState = WOLF_STATE_NONE; + item->Animation.TargetState = WOLF_STATE_ATTACK; + item->Animation.RequiredState = WOLF_STATE_NONE; } } else if (creature->Mood == MoodType::Stalk && AI.distance < STALK_RANGE) { - item->RequiredState = WOLF_STATE_STALK; - item->TargetState = WOLF_STATE_CROUCH; + item->Animation.RequiredState = WOLF_STATE_STALK; + item->Animation.TargetState = WOLF_STATE_CROUCH; } else if (creature->Mood == MoodType::Bored) - item->TargetState = WOLF_STATE_CROUCH; + item->Animation.TargetState = WOLF_STATE_CROUCH; break; case WOLF_STATE_ATTACK: tilt = angle; - if (!item->RequiredState && item->TouchBits & TOUCH) + if (!item->Animation.RequiredState && item->TouchBits & TOUCH) { CreatureEffect(item, &WolfBite, DoBloodSplat); LaraItem->HitPoints -= LUNGE_DAMAGE; LaraItem->HitStatus = true; - item->RequiredState = WOLF_STATE_RUN; + item->Animation.RequiredState = WOLF_STATE_RUN; } - item->TargetState = WOLF_STATE_RUN; + item->Animation.TargetState = WOLF_STATE_RUN; break; case WOLF_STATE_BITE: - if (!item->RequiredState && + if (!item->Animation.RequiredState && item->TouchBits & TOUCH && AI.ahead) { CreatureEffect(item, &WolfBite, DoBloodSplat); LaraItem->HitPoints -= BITE_DAMAGE; LaraItem->HitStatus = true; - item->RequiredState = WOLF_STATE_CROUCH; + item->Animation.RequiredState = WOLF_STATE_CROUCH; } break; diff --git a/TR5Main/Objects/TR2/Entity/tr2_barracuda.cpp b/TR5Main/Objects/TR2/Entity/tr2_barracuda.cpp index 1e5dc9539..6915da4f8 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_barracuda.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_barracuda.cpp @@ -37,11 +37,11 @@ void BarracudaControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 6) + if (item->Animation.ActiveState != 6) { - item->AnimNumber = Objects[ID_BARRACUDA].animIndex + 6; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 6; + item->Animation.AnimNumber = Objects[ID_BARRACUDA].animIndex + 6; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 6; } CreatureFloat(itemNumber); @@ -57,19 +57,19 @@ void BarracudaControl(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->Flags = 0; if (creature->Mood == MoodType::Bored) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (AI.ahead && AI.distance < 680) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (creature->Mood == MoodType::Stalk) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -79,9 +79,9 @@ void BarracudaControl(short itemNumber) if (creature->Mood == MoodType::Bored) break; else if (AI.ahead && (item->TouchBits & 0xE0)) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (creature->Mood != MoodType::Stalk) - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -90,13 +90,13 @@ void BarracudaControl(short itemNumber) creature->Flags = 0; if (creature->Mood == MoodType::Bored) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (AI.ahead && AI.distance < 340) - item->TargetState = 5; + item->Animation.TargetState = 5; else if (AI.ahead && AI.distance < 680) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (creature->Mood == MoodType::Stalk) - item->TargetState = 2; + item->Animation.TargetState = 2; break; diff --git a/TR5Main/Objects/TR2/Entity/tr2_birdmonster.cpp b/TR5Main/Objects/TR2/Entity/tr2_birdmonster.cpp index e0fedbf4a..e81909aab 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_birdmonster.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_birdmonster.cpp @@ -38,11 +38,11 @@ void BirdMonsterControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 9) + if (item->Animation.ActiveState != 9) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 20; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 9; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 20; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 9; } } else @@ -57,7 +57,7 @@ void BirdMonsterControl(short itemNumber) CreatureMood(item, &AI, VIOLENT); angle = CreatureTurn(item, creature->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->MaxTurn = 0; @@ -65,22 +65,22 @@ void BirdMonsterControl(short itemNumber) if (AI.ahead && AI.distance < pow(SECTOR(1), 2)) { if (GetRandomControl() < 0x4000) - item->TargetState = 3; + item->Animation.TargetState = 3; else - item->TargetState = 10; + item->Animation.TargetState = 10; } else if (AI.ahead && (creature->Mood == MoodType::Bored || creature->Mood == MoodType::Stalk)) { if (AI.zoneNumber != AI.enemyZone) { - item->TargetState = 2; + item->Animation.TargetState = 2; creature->Mood = MoodType::Escape; } else - item->TargetState = 8; + item->Animation.TargetState = 8; } else - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -88,7 +88,7 @@ void BirdMonsterControl(short itemNumber) creature->MaxTurn = 0; if (creature->Mood != MoodType::Bored || !AI.ahead) - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -96,9 +96,9 @@ void BirdMonsterControl(short itemNumber) creature->MaxTurn = ANGLE(4.0f); if (AI.ahead && AI.distance < pow(SECTOR(2), 2)) - item->TargetState = 5; + item->Animation.TargetState = 5; else if ((creature->Mood == MoodType::Bored || creature->Mood == MoodType::Stalk) && AI.ahead) - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -106,9 +106,9 @@ void BirdMonsterControl(short itemNumber) creature->Flags = 0; if (AI.ahead && AI.distance < pow(SECTOR(1), 2)) - item->TargetState = 4; + item->Animation.TargetState = 4; else - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -116,9 +116,9 @@ void BirdMonsterControl(short itemNumber) creature->Flags = 0; if (AI.ahead && AI.distance < pow(SECTOR(2), 2)) - item->TargetState = 6; + item->Animation.TargetState = 6; else - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -126,9 +126,9 @@ void BirdMonsterControl(short itemNumber) creature->Flags = 0; if (AI.ahead && AI.distance < pow(SECTOR(1), 2)) - item->TargetState = 11; + item->Animation.TargetState = 11; else - item->TargetState = 1; + item->Animation.TargetState = 1; break; diff --git a/TR5Main/Objects/TR2/Entity/tr2_dragon.cpp b/TR5Main/Objects/TR2/Entity/tr2_dragon.cpp index c334daf3c..33a4c5108 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_dragon.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_dragon.cpp @@ -105,8 +105,8 @@ static void createExplosion(ITEM_INFO* item) explosionItem->Position.yRot = 0; explosionItem->Position.xRot = 0; explosionItem->Position.zRot = 0; - explosionItem->Velocity = 0; - explosionItem->VerticalVelocity = 0; + explosionItem->Animation.Velocity = 0; + explosionItem->Animation.VerticalVelocity = 0; InitialiseItem(ExplosionIndex); AddActiveItem(ExplosionIndex); @@ -160,7 +160,7 @@ void DragonCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (!TestCollision(item, laraItem)) return; - if (item->ActiveState == DRAGON_STATE_DEATH) + if (item->Animation.ActiveState == DRAGON_STATE_DEATH) { int rx = laraItem->Position.xPos - item->Position.xPos; int rz = laraItem->Position.zPos - item->Position.zPos; @@ -176,13 +176,13 @@ void DragonCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) int angle = laraItem->Position.yRot - item->Position.yRot; - int anim = item->AnimNumber - Objects[ID_DRAGON_BACK].animIndex; - int frame = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int anim = item->Animation.AnimNumber - Objects[ID_DRAGON_BACK].animIndex; + int frame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if ((anim == DRAGON_ANIM_DEAD || (anim == DRAGON_ANIM_DEAD + 1 && frame <= DRAGON_ALMOST_LIVE)) && TrInput & IN_ACTION && item->ObjectNumber == ID_DRAGON_BACK && - !laraItem->Airborne && + !laraItem->Animation.Airborne && shift <= DRAGON_MID && shift > (DRAGON_CLOSE - 350) && sideShift > -350 && @@ -190,10 +190,10 @@ void DragonCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) angle > (ANGLE(45.0f) - ANGLE(30.0f)) && angle < (ANGLE(45.0f) + ANGLE(30.0f))) { - laraItem->AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = 0; - laraItem->TargetState = 7; + laraItem->Animation.AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = 0; + laraItem->Animation.TargetState = 7; laraItem->Position.xPos = item->Position.xPos; laraItem->Position.yPos = item->Position.yPos; @@ -201,9 +201,9 @@ void DragonCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) laraItem->Position.yRot = item->Position.yRot; laraItem->Position.xRot = item->Position.xRot; laraItem->Position.zRot = item->Position.zRot; - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; - laraItem->Velocity = 0; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; + laraItem->Animation.Velocity = 0; if (item->RoomNumber != laraItem->RoomNumber) ItemNewRoom(Lara.ItemNumber, item->RoomNumber); @@ -256,12 +256,12 @@ void DragonControl(short backItemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != DRAGON_STATE_DEATH) + if (item->Animation.ActiveState != DRAGON_STATE_DEATH) { - item->AnimNumber = Objects[ID_DRAGON_FRONT].animIndex + 21; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = DRAGON_STATE_DEATH; - item->TargetState = DRAGON_STATE_DEATH; + item->Animation.AnimNumber = Objects[ID_DRAGON_FRONT].animIndex + 21; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = DRAGON_STATE_DEATH; + item->Animation.TargetState = DRAGON_STATE_DEATH; creature->Flags = 0; } else if (creature->Flags >= 0) @@ -270,7 +270,7 @@ void DragonControl(short backItemNumber) creature->Flags++; if (creature->Flags == DRAGON_LIVE_TIME) - item->TargetState = DRAGON_STATE_IDLE; + item->Animation.TargetState = DRAGON_STATE_IDLE; if (creature->Flags == DRAGON_LIVE_TIME + DRAGON_ALMOST_LIVE) item->HitPoints = Objects[ID_DRAGON_FRONT].HitPoints / 2; } @@ -317,7 +317,7 @@ void DragonControl(short backItemNumber) LaraItem->HitPoints -= DRAGON_TOUCH_DAMAGE; } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case DRAGON_STATE_IDLE: item->Position.yRot -= angle; @@ -325,22 +325,22 @@ void DragonControl(short backItemNumber) if (!ahead) { if (AI.distance > DRAGON_STATE_IDLE_RANGE || !AI.ahead) - item->TargetState = DRAGON_STATE_WALK; + item->Animation.TargetState = DRAGON_STATE_WALK; else if (AI.ahead && AI.distance < DRAGON_CLOSE_RANGE && !creature->Flags) { creature->Flags = 1; if (AI.angle < 0) - item->TargetState = DRAGON_STATE_SWIPE_LEFT; + item->Animation.TargetState = DRAGON_STATE_SWIPE_LEFT; else - item->TargetState = DRAGON_STATE_SWIPE_RIGHT; + item->Animation.TargetState = DRAGON_STATE_SWIPE_RIGHT; } else if (AI.angle < 0) - item->TargetState = DRAGON_STATE_TURN_LEFT; + item->Animation.TargetState = DRAGON_STATE_TURN_LEFT; else - item->TargetState = DRAGON_STATE_TURN_RIGHT; + item->Animation.TargetState = DRAGON_STATE_TURN_RIGHT; } else - item->TargetState = DRAGON_STATE_AIM_1; + item->Animation.TargetState = DRAGON_STATE_AIM_1; break; @@ -370,33 +370,33 @@ void DragonControl(short backItemNumber) creature->Flags = 0; if (ahead) - item->TargetState = DRAGON_STATE_IDLE; + item->Animation.TargetState = DRAGON_STATE_IDLE; else if (angle < -DRAGON_NEED_TURN) { if (AI.distance < DRAGON_STATE_IDLE_RANGE && AI.ahead) - item->TargetState = DRAGON_STATE_IDLE; + item->Animation.TargetState = DRAGON_STATE_IDLE; else - item->TargetState = DRAGON_STATE_LEFT; + item->Animation.TargetState = DRAGON_STATE_LEFT; } else if (angle > DRAGON_NEED_TURN) { if (AI.distance < DRAGON_STATE_IDLE_RANGE && AI.ahead) - item->TargetState = DRAGON_STATE_IDLE; + item->Animation.TargetState = DRAGON_STATE_IDLE; else - item->TargetState = DRAGON_STATE_RIGHT; + item->Animation.TargetState = DRAGON_STATE_RIGHT; } break; case DRAGON_STATE_LEFT: if (angle > -DRAGON_NEED_TURN || ahead) - item->TargetState = DRAGON_STATE_WALK; + item->Animation.TargetState = DRAGON_STATE_WALK; break; case DRAGON_STATE_RIGHT: if (angle < DRAGON_NEED_TURN || ahead) - item->TargetState = DRAGON_STATE_WALK; + item->Animation.TargetState = DRAGON_STATE_WALK; break; @@ -421,12 +421,12 @@ void DragonControl(short backItemNumber) if (ahead) { creature->Flags = 30; - item->TargetState = DRAGON_STATE_FIRE_1; + item->Animation.TargetState = DRAGON_STATE_FIRE_1; } else { creature->Flags = 0; - item->TargetState = DRAGON_STATE_AIM_1; + item->Animation.TargetState = DRAGON_STATE_AIM_1; } break; @@ -446,7 +446,7 @@ void DragonControl(short backItemNumber) creature->Flags--; } else - item->TargetState = DRAGON_STATE_IDLE; + item->Animation.TargetState = DRAGON_STATE_IDLE; break; } @@ -455,9 +455,9 @@ void DragonControl(short backItemNumber) CreatureJoint(item, 0, head); CreatureAnimation(itemNumber, angle, 0); - back->ActiveState = item->ActiveState; - back->AnimNumber = Objects[ID_DRAGON_BACK].animIndex + (item->AnimNumber - Objects[ID_DRAGON_FRONT].animIndex); - back->FrameNumber = g_Level.Anims[back->AnimNumber].frameBase + (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase); + back->Animation.ActiveState = item->Animation.ActiveState; + back->Animation.AnimNumber = Objects[ID_DRAGON_BACK].animIndex + (item->Animation.AnimNumber - Objects[ID_DRAGON_FRONT].animIndex); + back->Animation.FrameNumber = g_Level.Anims[back->Animation.AnimNumber].frameBase + (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase); back->Position.xPos = item->Position.xPos; back->Position.yPos = item->Position.yPos; back->Position.zPos = item->Position.zPos; diff --git a/TR5Main/Objects/TR2/Entity/tr2_eagle_or_crow.cpp b/TR5Main/Objects/TR2/Entity/tr2_eagle_or_crow.cpp index 4f720bd0a..f1e1711bf 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_eagle_or_crow.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_eagle_or_crow.cpp @@ -33,15 +33,15 @@ void InitialiseEagle(short itemNumber) if (item->ObjectNumber == ID_CROW) { - item->AnimNumber = Objects[ID_CROW].animIndex + 14; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = item->TargetState = 7; + item->Animation.AnimNumber = Objects[ID_CROW].animIndex + 14; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = item->Animation.TargetState = 7; } else { - item->AnimNumber = Objects[ID_EAGLE].animIndex + 5; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = item->TargetState = 2; + item->Animation.AnimNumber = Objects[ID_EAGLE].animIndex + 5; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = item->Animation.TargetState = 2; } } @@ -57,15 +57,15 @@ void EagleControl(short itemNumber) if (item->HitPoints <= 0) { - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 4: if (item->Position.yPos > item->Floor) { item->Position.yPos = item->Floor; - item->VerticalVelocity = 0; - item->Airborne = false; - item->TargetState = 5; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.TargetState = 5; } break; @@ -76,14 +76,14 @@ void EagleControl(short itemNumber) default: if (item->ObjectNumber == ID_CROW) - item->AnimNumber = Objects[ID_CROW].animIndex + 1; + item->Animation.AnimNumber = Objects[ID_CROW].animIndex + 1; else - item->AnimNumber = Objects[ID_EAGLE].animIndex + 8; + item->Animation.AnimNumber = Objects[ID_EAGLE].animIndex + 8; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 4; - item->Velocity = 0; - item->Airborne = true; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 4; + item->Animation.Velocity = 0; + item->Animation.Airborne = true; break; } item->Position.xRot = 0; @@ -98,13 +98,13 @@ void EagleControl(short itemNumber) angle = CreatureTurn(item, ANGLE(3.0f)); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 7: item->Position.yPos = item->Floor; if (creature->Mood != MoodType::Bored) - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -114,32 +114,32 @@ void EagleControl(short itemNumber) if (creature->Mood == MoodType::Bored) break; else - item->TargetState = 1; + item->Animation.TargetState = 1; break; case 1: creature->Flags = 0; - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; if (creature->Mood == MoodType::Bored) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(0.5f), 2)) - item->TargetState = 6; + item->Animation.TargetState = 6; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; case 3: if (creature->Mood == MoodType::Bored) { - item->RequiredState = 2; - item->TargetState = 1; + item->Animation.RequiredState = 2; + item->Animation.TargetState = 1; } else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(0.5f), 2)) - item->TargetState = 6; + item->Animation.TargetState = 6; break; diff --git a/TR5Main/Objects/TR2/Entity/tr2_knifethrower.cpp b/TR5Main/Objects/TR2/Entity/tr2_knifethrower.cpp index 7f8f24d18..b1d49753e 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_knifethrower.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_knifethrower.cpp @@ -67,7 +67,7 @@ void KnifeControl(short fxNumber) LaraItem->HitStatus = true; fx->pos.yRot = LaraItem->Position.yRot; - fx->speed = LaraItem->Velocity; + fx->speed = LaraItem->Animation.Velocity; fx->frameNumber = fx->counter = 0; SoundEffect(SFX_TR2_CRUNCH2, &fx->pos, 0); @@ -95,11 +95,11 @@ void KnifeThrowerControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 10) + if (item->Animation.ActiveState != 10) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 23; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 10; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 23; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 10; } } else @@ -112,7 +112,7 @@ void KnifeThrowerControl(short itemNumber) angle = CreatureTurn(item, info->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: info->MaxTurn = 0; @@ -121,18 +121,18 @@ void KnifeThrowerControl(short itemNumber) head = aiInfo.angle; if (info->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (Targetable(item, &aiInfo)) - item->TargetState = 8; + item->Animation.TargetState = 8; else if (info->Mood == MoodType::Bored) { if (!aiInfo.ahead || aiInfo.distance > pow(SECTOR(6), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(4), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -143,23 +143,23 @@ void KnifeThrowerControl(short itemNumber) head = aiInfo.angle; if (info->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (Targetable(item, &aiInfo)) { if (aiInfo.distance < pow(SECTOR(2.5f), 2) || aiInfo.zoneNumber != aiInfo.enemyZone) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (GetRandomControl() < 0x4000) - item->TargetState = 4; + item->Animation.TargetState = 4; else - item->TargetState = 6; + item->Animation.TargetState = 6; } else if (info->Mood == MoodType::Bored) { if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(6), 2)) - item->TargetState = 1; + item->Animation.TargetState = 1; } else if (!aiInfo.ahead || aiInfo.distance > pow(SECTOR(4), 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -172,17 +172,17 @@ void KnifeThrowerControl(short itemNumber) if (Targetable(item, &aiInfo)) { - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (info->Mood == MoodType::Bored) { if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(6), 2)) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(4), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -193,9 +193,9 @@ void KnifeThrowerControl(short itemNumber) torso = aiInfo.angle; if (Targetable(item, &aiInfo)) - item->TargetState = 5; + item->Animation.TargetState = 5; else - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -206,9 +206,9 @@ void KnifeThrowerControl(short itemNumber) torso = aiInfo.angle; if (Targetable(item, &aiInfo)) - item->TargetState = 7; + item->Animation.TargetState = 7; else - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -219,9 +219,9 @@ void KnifeThrowerControl(short itemNumber) torso = aiInfo.angle; if (Targetable(item, &aiInfo)) - item->TargetState = 9; + item->Animation.TargetState = 9; else - item->TargetState = 1; + item->Animation.TargetState = 1; break; diff --git a/TR5Main/Objects/TR2/Entity/tr2_mercenary.cpp b/TR5Main/Objects/TR2/Entity/tr2_mercenary.cpp index 3ec57b3c4..3dc6c16f5 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_mercenary.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_mercenary.cpp @@ -43,11 +43,11 @@ void MercenaryUziControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 13) + if (item->Animation.ActiveState != 13) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 14; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 13; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 14; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 13; } } else @@ -60,7 +60,7 @@ void MercenaryUziControl(short itemNumber) angle = CreatureTurn(item, info->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: if (aiInfo.ahead) @@ -72,30 +72,30 @@ void MercenaryUziControl(short itemNumber) info->MaxTurn = 0; if (info->Mood == MoodType::Escape) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (Targetable(item, &aiInfo)) { if (aiInfo.distance > 0x400000) - item->TargetState = 2; + item->Animation.TargetState = 2; if (GetRandomControl() >= 0x2000) { if (GetRandomControl() >= 0x4000) - item->TargetState = 11; + item->Animation.TargetState = 11; else - item->TargetState = 7; + item->Animation.TargetState = 7; } else - item->TargetState = 5; + item->Animation.TargetState = 5; } else { if (info->Mood == MoodType::Attack) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (!aiInfo.ahead) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 1; + item->Animation.TargetState = 1; } break; @@ -110,22 +110,22 @@ void MercenaryUziControl(short itemNumber) info->MaxTurn = ANGLE(7.0f); if (info->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (Targetable(item, &aiInfo)) { if (aiInfo.distance <= 0x400000 || aiInfo.zoneNumber != aiInfo.enemyZone) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 12; + item->Animation.TargetState = 12; } else if (info->Mood == MoodType::Attack) - item->TargetState = 3; + item->Animation.TargetState = 3; else { if (aiInfo.ahead) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 1; + item->Animation.TargetState = 1; } @@ -144,9 +144,9 @@ void MercenaryUziControl(short itemNumber) if (info->Mood != MoodType::Escape) { if (Targetable(item, &aiInfo)) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (info->Mood == MoodType::Bored) - item->TargetState = 2; + item->Animation.TargetState = 2; } break; @@ -164,10 +164,10 @@ void MercenaryUziControl(short itemNumber) } if (!ShotLara(item, &aiInfo, &MercenaryUziBite, torsoY, 8)) - item->TargetState = 1; + item->Animation.TargetState = 1; if (aiInfo.distance < 0x400000) - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -180,10 +180,10 @@ void MercenaryUziControl(short itemNumber) } if (!ShotLara(item, &aiInfo, &MercenaryUziBite, torsoY, 8)) - item->TargetState = 1; + item->Animation.TargetState = 1; if (aiInfo.distance < 0x400000) - item->TargetState = 2; + item->Animation.TargetState = 2; break; } @@ -214,11 +214,11 @@ void MercenaryAutoPistolControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 11) + if (item->Animation.ActiveState != 11) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 9; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 11; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 9; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 11; } } else @@ -231,7 +231,7 @@ void MercenaryAutoPistolControl(short itemNumber) angle = CreatureTurn(item, info->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 2: info->MaxTurn = 0; @@ -243,7 +243,7 @@ void MercenaryAutoPistolControl(short itemNumber) } if (info->Mood == MoodType::Escape) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (Targetable(item, &aiInfo)) { if (aiInfo.distance <= 0x400000) @@ -251,22 +251,22 @@ void MercenaryAutoPistolControl(short itemNumber) if (GetRandomControl() >= 0x2000) { if (GetRandomControl() >= 0x4000) - item->TargetState = 5; + item->Animation.TargetState = 5; else - item->TargetState = 8; + item->Animation.TargetState = 8; } else - item->TargetState = 7; + item->Animation.TargetState = 7; } else - item->TargetState = 3; + item->Animation.TargetState = 3; } else { if (info->Mood == MoodType::Attack) - item->TargetState = 4; + item->Animation.TargetState = 4; if (!aiInfo.ahead || GetRandomControl() < 0x100) - item->TargetState = 3; + item->Animation.TargetState = 3; } break; @@ -281,18 +281,18 @@ void MercenaryAutoPistolControl(short itemNumber) } if (info->Mood == MoodType::Escape) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (Targetable(item, &aiInfo)) { if (aiInfo.distance < 0x400000 || aiInfo.zoneNumber == aiInfo.enemyZone || GetRandomControl() < 1024) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 1; + item->Animation.TargetState = 1; } else if (info->Mood == MoodType::Escape) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (aiInfo.ahead && GetRandomControl() < 1024) - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -307,7 +307,7 @@ void MercenaryAutoPistolControl(short itemNumber) } if (info->Mood != MoodType::Escape && (info->Mood == MoodType::Escape || Targetable(item, &aiInfo))) - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -335,14 +335,14 @@ void MercenaryAutoPistolControl(short itemNumber) if (!info->Flags) { if (GetRandomControl() < 0x2000) - item->TargetState = 2; + item->Animation.TargetState = 2; ShotLara(item, &aiInfo, &MercenaryAutoPistolBite, torsoY, 50); info->Flags = 1; } } else - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -353,17 +353,17 @@ void MercenaryAutoPistolControl(short itemNumber) torsoY = aiInfo.angle; if (aiInfo.distance < 0x400000) - item->TargetState = 3; + item->Animation.TargetState = 3; if (info->Flags != 1) { if (!ShotLara(item, &aiInfo, &MercenaryAutoPistolBite, torsoY, 50)) - item->TargetState = 3; + item->Animation.TargetState = 3; info->Flags = 1; } } else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -377,9 +377,9 @@ void MercenaryAutoPistolControl(short itemNumber) } if (Targetable(item, &aiInfo)) - item->TargetState = 13; + item->Animation.TargetState = 13; else - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -390,18 +390,18 @@ void MercenaryAutoPistolControl(short itemNumber) torsoY = aiInfo.angle; if (aiInfo.distance < 0x400000) - item->TargetState = 3; + item->Animation.TargetState = 3; if (info->Flags != 2) { if (!ShotLara(item, &aiInfo, &MercenaryAutoPistolBite, torsoY, 50)) - item->TargetState = 3; + item->Animation.TargetState = 3; info->Flags = 2; } } else - item->TargetState = 3; + item->Animation.TargetState = 3; break; } diff --git a/TR5Main/Objects/TR2/Entity/tr2_monk.cpp b/TR5Main/Objects/TR2/Entity/tr2_monk.cpp index c49fd4c82..83538c319 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_monk.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_monk.cpp @@ -41,11 +41,11 @@ void MonkControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 9) + if (item->Animation.ActiveState != 9) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 20 + (GetRandomControl() / 0x4000); - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 9; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 20 + (GetRandomControl() / 0x4000); + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 9; } } else @@ -66,7 +66,7 @@ void MonkControl(short itemNumber) if (aiInfo.ahead) torso = aiInfo.angle; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: info->Flags &= 0x0FFF; @@ -74,22 +74,22 @@ void MonkControl(short itemNumber) if (!MonksAttackLara && aiInfo.ahead && Lara.TargetEntity == item) break; else if (info->Mood == MoodType::Bored) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (info->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(0.5f), 2)) { if (GetRandomControl() < 0x7000) - item->TargetState = 4; + item->Animation.TargetState = 4; else - item->TargetState = 11; + item->Animation.TargetState = 11; } else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(1), 2)) - item->TargetState = 7; + item->Animation.TargetState = 7; else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(2), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -99,23 +99,23 @@ void MonkControl(short itemNumber) if (!MonksAttackLara && aiInfo.ahead && Lara.TargetEntity == item) break; else if (info->Mood == MoodType::Bored) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (info->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(0.5f), 2)) { auto random = GetRandomControl(); if (random < 0x3000) - item->TargetState = 5; + item->Animation.TargetState = 5; else if (random < 0x6000) - item->TargetState = 8; + item->Animation.TargetState = 8; else - item->TargetState = 1; + item->Animation.TargetState = 1; } else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(2), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -127,22 +127,22 @@ void MonkControl(short itemNumber) if (!MonksAttackLara && aiInfo.ahead && Lara.TargetEntity == item) { if (GetRandomControl() < 0x4000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 11; + item->Animation.TargetState = 11; } } else if (info->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(0.5f), 2)) { if (GetRandomControl() < 0x4000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 11; + item->Animation.TargetState = 11; } else if (!aiInfo.ahead || aiInfo.distance > pow(SECTOR(2), 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -156,33 +156,33 @@ void MonkControl(short itemNumber) tilt = angle / 4; if (info->Mood == MoodType::Bored) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (info->Mood == MoodType::Escape) break; else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(0.5f), 2)) { if (GetRandomControl() < 0x4000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 11; + item->Animation.TargetState = 11; } else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(3), 2)) - item->TargetState = 10; + item->Animation.TargetState = 10; else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(2), 2)) { if (GetRandomControl() < 0x4000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 11; + item->Animation.TargetState = 11; } break; case 8: if (!aiInfo.ahead || aiInfo.distance > pow(SECTOR(0.5f), 2)) - item->TargetState = 11; + item->Animation.TargetState = 11; else - item->TargetState = 6; + item->Animation.TargetState = 6; break; diff --git a/TR5Main/Objects/TR2/Entity/tr2_rat.cpp b/TR5Main/Objects/TR2/Entity/tr2_rat.cpp index a3c2a1800..8587e3a3f 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_rat.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_rat.cpp @@ -39,11 +39,11 @@ void RatControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 6) + if (item->Animation.ActiveState != 6) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 9; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 6; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 9; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 6; } } else @@ -59,32 +59,32 @@ void RatControl(short itemNumber) angle = CreatureTurn(item, ANGLE(6.0f)); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 4: if (info->Mood == MoodType::Bored || info->Mood == MoodType::Stalk) { short random = (short)GetRandomControl(); if (random < 0x500) - item->RequiredState = 3; + item->Animation.RequiredState = 3; else if (random > 0xA00) - item->RequiredState = 1; + item->Animation.RequiredState = 1; } else if (aiInfo.distance < pow(340, 2)) - item->RequiredState = 5; + item->Animation.RequiredState = 5; else - item->RequiredState = 1; + item->Animation.RequiredState = 1; - if (item->RequiredState) - item->TargetState = 2; + if (item->Animation.RequiredState) + item->Animation.TargetState = 2; break; case 2: info->MaxTurn = 0; - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; break; @@ -96,22 +96,22 @@ void RatControl(short itemNumber) random = (short)GetRandomControl(); if (random < 0x500) { - item->RequiredState = 3; - item->TargetState = 2; + item->Animation.RequiredState = 3; + item->Animation.TargetState = 2; } else if (random < 0xA00) - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (aiInfo.ahead && aiInfo.distance < pow(340, 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; break; case 5: - if (!item->RequiredState && item->TouchBits & 0x7F) + if (!item->Animation.RequiredState && item->TouchBits & 0x7F) { CreatureEffect(item, &RatBite, DoBloodSplat); - item->RequiredState = 2; + item->Animation.RequiredState = 2; LaraItem->HitPoints -= 20; LaraItem->HitStatus = true; @@ -121,7 +121,7 @@ void RatControl(short itemNumber) case 3: if (GetRandomControl() < 0x500) - item->TargetState = 2; + item->Animation.TargetState = 2; break; } diff --git a/TR5Main/Objects/TR2/Entity/tr2_shark.cpp b/TR5Main/Objects/TR2/Entity/tr2_shark.cpp index 6eb911596..5f187e600 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_shark.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_shark.cpp @@ -26,11 +26,11 @@ void SharkControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 5) + if (item->Animation.ActiveState != 5) { - item->AnimNumber = Objects[ID_SHARK].animIndex + 4; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 5; + item->Animation.AnimNumber = Objects[ID_SHARK].animIndex + 4; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 5; } CreatureFloat(itemNumber); @@ -46,16 +46,16 @@ void SharkControl(short itemNumber) angle = CreatureTurn(item, info->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 0: info->Flags = 0; info->MaxTurn = 0; if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(0.75f), 2) && aiInfo.zoneNumber == aiInfo.enemyZone) - item->TargetState = 3; + item->Animation.TargetState = 3; else - item->TargetState = 1; + item->Animation.TargetState = 1; break; case 1: @@ -64,9 +64,9 @@ void SharkControl(short itemNumber) if (info->Mood == MoodType::Bored) break; else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(0.75f), 2)) - item->TargetState = 0; + item->Animation.TargetState = 0; else if (info->Mood == MoodType::Escape || aiInfo.distance > pow(SECTOR(3), 2) || !aiInfo.ahead) - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -75,15 +75,15 @@ void SharkControl(short itemNumber) info->Flags = 0; if (info->Mood == MoodType::Bored) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (info->Mood == MoodType::Escape) break; else if (aiInfo.ahead && aiInfo.distance < pow(1365, 2) && aiInfo.zoneNumber == aiInfo.enemyZone) { if (GetRandomControl() < 0x800) - item->TargetState = 0; + item->Animation.TargetState = 0; else if (aiInfo.distance < pow(SECTOR(0.75f), 2)) - item->TargetState = 4; + item->Animation.TargetState = 4; } break; @@ -106,7 +106,7 @@ void SharkControl(short itemNumber) } } - if (item->ActiveState != 6) + if (item->Animation.ActiveState != 6) { CreatureJoint(item, 0, head); CreatureAnimation(itemNumber, angle, 0); diff --git a/TR5Main/Objects/TR2/Entity/tr2_silencer.cpp b/TR5Main/Objects/TR2/Entity/tr2_silencer.cpp index 479e4f8b8..c9d89bca6 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_silencer.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_silencer.cpp @@ -40,11 +40,11 @@ void SilencerControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 12 && item->ActiveState != 13) + if (item->Animation.ActiveState != 12 && item->Animation.ActiveState != 13) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 20; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 13; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 20; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 13; } } else @@ -57,15 +57,15 @@ void SilencerControl(short itemNumber) angle = CreatureTurn(item, info->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 3: if (aiInfo.ahead) head = aiInfo.angle; info->MaxTurn = 0; - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; break; @@ -76,28 +76,28 @@ void SilencerControl(short itemNumber) if (info->Mood == MoodType::Escape) { - item->RequiredState = 2; - item->TargetState = 3; + item->Animation.RequiredState = 2; + item->Animation.TargetState = 3; } else { if (Targetable(item, &aiInfo)) { - item->RequiredState = (GetRandomControl() >= 0x4000 ? 10 : 6); - item->TargetState = 3; + item->Animation.RequiredState = (GetRandomControl() >= 0x4000 ? 10 : 6); + item->Animation.TargetState = 3; } if (info->Mood == MoodType::Attack || !aiInfo.ahead) { if (aiInfo.distance >= 0x400000) { - item->RequiredState = 2; - item->TargetState = 3; + item->Animation.RequiredState = 2; + item->Animation.TargetState = 3; } else { - item->RequiredState = 1; - item->TargetState = 3; + item->Animation.RequiredState = 1; + item->Animation.TargetState = 3; } } else @@ -106,14 +106,14 @@ void SilencerControl(short itemNumber) { if (GetRandomControl() < 2560) { - item->RequiredState = 1; - item->TargetState = 3; + item->Animation.RequiredState = 1; + item->Animation.TargetState = 3; } } else { - item->RequiredState = 5; - item->TargetState = 3; + item->Animation.RequiredState = 5; + item->Animation.TargetState = 3; } } } @@ -127,18 +127,18 @@ void SilencerControl(short itemNumber) info->MaxTurn = 910; if (info->Mood == MoodType::Escape) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (Targetable(item, &aiInfo)) { - item->RequiredState = (GetRandomControl() >= 0x4000 ? 10 : 6); - item->TargetState = 3; + item->Animation.RequiredState = (GetRandomControl() >= 0x4000 ? 10 : 6); + item->Animation.TargetState = 3; } else { if (aiInfo.distance > 0x400000 || !aiInfo.ahead) - item->TargetState = 2; + item->Animation.TargetState = 2; if (info->Mood == MoodType::Bored && GetRandomControl() < 0x300) - item->TargetState = 3; + item->Animation.TargetState = 3; } break; @@ -154,7 +154,7 @@ void SilencerControl(short itemNumber) if (info->Mood == MoodType::Escape) { if (Targetable(item, &aiInfo)) - item->TargetState = 9; + item->Animation.TargetState = 9; break; @@ -163,14 +163,14 @@ void SilencerControl(short itemNumber) if (Targetable(item, &aiInfo)) { if (aiInfo.distance >= 0x400000 && aiInfo.zoneNumber == aiInfo.enemyZone) - item->TargetState = 9; + item->Animation.TargetState = 9; break; } else if (info->Mood == MoodType::Attack) - item->TargetState = (GetRandomControl() >= 0x4000) ? 3 : 2; + item->Animation.TargetState = (GetRandomControl() >= 0x4000) ? 3 : 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -182,15 +182,15 @@ void SilencerControl(short itemNumber) if (Targetable(item, &aiInfo)) { - item->RequiredState = 6; - item->TargetState = 3; + item->Animation.RequiredState = 6; + item->Animation.TargetState = 3; } else { if (info->Mood == MoodType::Attack || GetRandomControl() < 0x100) - item->TargetState = 3; + item->Animation.TargetState = 3; if (!aiInfo.ahead) - item->TargetState = 3; + item->Animation.TargetState = 3; } break; @@ -209,11 +209,11 @@ void SilencerControl(short itemNumber) head = aiInfo.angle; if (info->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (Targetable(item, &aiInfo)) - item->TargetState = item->ActiveState != 6 ? 11 : 7; + item->Animation.TargetState = item->Animation.ActiveState != 6 ? 11 : 7; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -248,12 +248,12 @@ void SilencerControl(short itemNumber) else head = aiInfo.angle; - if (!item->RequiredState) + if (!item->Animation.RequiredState) { if (!ShotLara(item, &aiInfo, &SilencerGunBite, torsoY, 50)) - item->TargetState = 2; + item->Animation.TargetState = 2; - item->RequiredState = 9; + item->Animation.RequiredState = 9; } break; diff --git a/TR5Main/Objects/TR2/Entity/tr2_skidman.cpp b/TR5Main/Objects/TR2/Entity/tr2_skidman.cpp index d902b60e6..31a6e7a11 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_skidman.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_skidman.cpp @@ -78,13 +78,13 @@ void SkidManCollision(short itemNum, ITEM_INFO* laraitem, COLL_INFO* coll) if (coll->Setup.EnableObjectPush) { - if (item->Velocity > 0) + if (item->Animation.Velocity > 0) ItemPushItem(item, laraitem, coll, coll->Setup.EnableSpasm, 0); else ItemPushItem(item, laraitem, coll, 0, 0); } - if (Lara.Vehicle == NO_ITEM && item->Velocity > 0) + if (Lara.Vehicle == NO_ITEM && item->Animation.Velocity > 0) { laraitem->HitStatus = true; laraitem->HitPoints -= 100; @@ -120,7 +120,7 @@ void SkidManControl(short riderNum) if (item->HitPoints <= 0) { - if (rider->ActiveState != SMAN_DEATH) + if (rider->Animation.ActiveState != SMAN_DEATH) { rider->Position.xPos = item->Position.xPos; rider->Position.yPos = item->Position.yPos; @@ -128,9 +128,9 @@ void SkidManControl(short riderNum) rider->Position.yRot = item->Position.yRot; rider->RoomNumber = item->RoomNumber; - rider->AnimNumber = Objects[ID_SNOWMOBILE_DRIVER].animIndex + SMAN_DEATH_ANIM; - rider->FrameNumber = g_Level.Anims[rider->AnimNumber].frameBase; - rider->ActiveState = SMAN_DEATH; + rider->Animation.AnimNumber = Objects[ID_SNOWMOBILE_DRIVER].animIndex + SMAN_DEATH_ANIM; + rider->Animation.FrameNumber = g_Level.Anims[rider->Animation.AnimNumber].frameBase; + rider->Animation.ActiveState = SMAN_DEATH; if (Lara.TargetEntity == item) Lara.TargetEntity = NULL; @@ -138,10 +138,10 @@ void SkidManControl(short riderNum) else AnimateItem(rider); - if (item->ActiveState == SMAN_MOVING || item->ActiveState == SMAN_WAIT) - item->TargetState = SMAN_WAIT; + if (item->Animation.ActiveState == SMAN_MOVING || item->Animation.ActiveState == SMAN_WAIT) + item->Animation.TargetState = SMAN_WAIT; else - item->TargetState = SMAN_MOVING; + item->Animation.TargetState = SMAN_MOVING; } else { @@ -152,46 +152,46 @@ void SkidManControl(short riderNum) angle = CreatureTurn(item, ANGLE(6)/2); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case SMAN_WAIT: if (skidman->Mood == MoodType::Bored) break; else if (abs(info.angle) < SMAN_TARGET_ANGLE && info.distance < SMAN_WAIT_RANGE) break; - item->TargetState = SMAN_MOVING; + item->Animation.TargetState = SMAN_MOVING; break; case SMAN_MOVING: if (skidman->Mood == MoodType::Bored) - item->TargetState = SMAN_WAIT; + item->Animation.TargetState = SMAN_WAIT; else if (abs(info.angle) < SMAN_TARGET_ANGLE && info.distance < SMAN_WAIT_RANGE) - item->TargetState = SMAN_WAIT; + item->Animation.TargetState = SMAN_WAIT; else if (angle < -SMAN_MIN_TURN) - item->TargetState = SMAN_STARTLEFT; + item->Animation.TargetState = SMAN_STARTLEFT; else if (angle > SMAN_MIN_TURN) - item->TargetState = SMAN_STARTRIGHT; + item->Animation.TargetState = SMAN_STARTRIGHT; break; case SMAN_STARTLEFT: case SMAN_LEFT: if (angle < -SMAN_MIN_TURN) - item->TargetState = SMAN_LEFT; + item->Animation.TargetState = SMAN_LEFT; else - item->TargetState = SMAN_MOVING; + item->Animation.TargetState = SMAN_MOVING; break; case SMAN_STARTRIGHT: case SMAN_RIGHT: if (angle < -SMAN_MIN_TURN) - item->TargetState = SMAN_LEFT; + item->Animation.TargetState = SMAN_LEFT; else - item->TargetState = SMAN_MOVING; + item->Animation.TargetState = SMAN_MOVING; break; } } - if (rider->ActiveState != SMAN_DEATH) + if (rider->Animation.ActiveState != SMAN_DEATH) { if (!skidman->Flags && abs(info.angle) < SMAN_TARGET_ANGLE && LaraItem->HitPoints > 0) { @@ -208,7 +208,7 @@ void SkidManControl(short riderNum) } } - if (item->ActiveState == SMAN_WAIT) + if (item->Animation.ActiveState == SMAN_WAIT) { SoundEffect(153, &item->Position, 0); skidman->JointRotation[0] = 0; @@ -217,12 +217,12 @@ void SkidManControl(short riderNum) { skidman->JointRotation[0] = (skidman->JointRotation[0] == 1) ? 2 : 1; DoSnowEffect(item); - SoundEffect(155, &item->Position, 4 + ((0x10000 - (100 - item->Velocity) * 100) << 8)); + SoundEffect(155, &item->Position, 4 + ((0x10000 - (100 - item->Animation.Velocity) * 100) << 8)); } CreatureAnimation(item_number, angle, 0); - if (rider->ActiveState != SMAN_DEATH) + if (rider->Animation.ActiveState != SMAN_DEATH) { rider->Position.xPos = item->Position.xPos; rider->Position.yPos = item->Position.yPos; @@ -231,10 +231,10 @@ void SkidManControl(short riderNum) if (item->RoomNumber != rider->RoomNumber) ItemNewRoom(riderNum, item->RoomNumber); - rider->AnimNumber = item->AnimNumber + (Objects[ID_SNOWMOBILE_DRIVER].animIndex - Objects[ID_SNOWMOBILE_GUN].animIndex); - rider->FrameNumber = item->FrameNumber + (g_Level.Anims[rider->AnimNumber].frameBase - g_Level.Anims[item->AnimNumber].frameBase); + rider->Animation.AnimNumber = item->Animation.AnimNumber + (Objects[ID_SNOWMOBILE_DRIVER].animIndex - Objects[ID_SNOWMOBILE_GUN].animIndex); + rider->Animation.FrameNumber = item->Animation.FrameNumber + (g_Level.Anims[rider->Animation.AnimNumber].frameBase - g_Level.Anims[item->Animation.AnimNumber].frameBase); } - else if (rider->Status == ITEM_DEACTIVATED && item->Velocity == 0 && item->VerticalVelocity == 0) + else if (rider->Status == ITEM_DEACTIVATED && item->Animation.Velocity == 0 && item->Animation.VerticalVelocity == 0) { RemoveActiveItem(riderNum); rider->Collidable = false; diff --git a/TR5Main/Objects/TR2/Entity/tr2_spear_guardian.cpp b/TR5Main/Objects/TR2/Entity/tr2_spear_guardian.cpp index fdc7e44f8..eda333666 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_spear_guardian.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_spear_guardian.cpp @@ -43,12 +43,12 @@ void InitialiseSpearGuardian(short itemNum) ClearItem(itemNum); item = &g_Level.Items[itemNum]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 48; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 48; - anim = &g_Level.Anims[item->AnimNumber]; + anim = &g_Level.Anims[item->Animation.AnimNumber]; - item->FrameNumber = anim->frameBase; - item->ActiveState = anim->ActiveState; + item->Animation.FrameNumber = anim->frameBase; + item->Animation.ActiveState = anim->ActiveState; } void SpearGuardianControl(short itemNum) @@ -69,7 +69,7 @@ void SpearGuardianControl(short itemNum) if (item->HitPoints <= 0) { - item->ActiveState = 17; + item->Animation.ActiveState = 17; item->MeshBits /= 2; if (!item->MeshBits) @@ -88,10 +88,10 @@ void SpearGuardianControl(short itemNum) angle = CreatureTurn(item, xian->MaxTurn); - if (item->ActiveState != 18) + if (item->Animation.ActiveState != 18) item->MeshBits = 0xFFFFFFFF; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 18: if (!xian->Flags) @@ -113,14 +113,14 @@ void SpearGuardianControl(short itemNum) { random = GetRandomControl(); if (random < 0x200) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (random < 0x400) - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (info.ahead && info.distance < SQUARE(WALL_SIZE)) - item->TargetState = 5; + item->Animation.TargetState = 5; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; case 2: @@ -130,19 +130,19 @@ void SpearGuardianControl(short itemNum) xian->MaxTurn = 0; if (xian->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (xian->Mood == MoodType::Bored) { random = GetRandomControl(); if (random < 0x200) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (random < 0x400) - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (info.ahead && info.distance < SQUARE(WALL_SIZE)) - item->TargetState = 13; + item->Animation.TargetState = 13; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; case 3: @@ -152,26 +152,26 @@ void SpearGuardianControl(short itemNum) xian->MaxTurn = ANGLE(3); if (xian->Mood == MoodType::Escape) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (xian->Mood == MoodType::Bored) { random = GetRandomControl(); if (random < 0x200) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (random < 0x400) - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (info.ahead && info.distance < SQUARE(WALL_SIZE * 2)) { if (info.distance < SQUARE(WALL_SIZE * 3 / 2)) - item->TargetState = 7; + item->Animation.TargetState = 7; else if (GetRandomControl() < 0x4000) - item->TargetState = 9; + item->Animation.TargetState = 9; else - item->TargetState = 11; + item->Animation.TargetState = 11; } else if (!info.ahead || info.distance > SQUARE(WALL_SIZE * 3)) - item->TargetState = 4; + item->Animation.TargetState = 4; break; case 4: @@ -185,12 +185,12 @@ void SpearGuardianControl(short itemNum) else if (xian->Mood == MoodType::Bored) { if (GetRandomControl() < 0x4000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (info.ahead && info.distance < SQUARE(WALL_SIZE * 2)) - item->TargetState = 15; + item->Animation.TargetState = 15; break; case 5: @@ -199,9 +199,9 @@ void SpearGuardianControl(short itemNum) xian->Flags = 0; if (!info.ahead || info.distance > SQUARE(WALL_SIZE)) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 6; + item->Animation.TargetState = 6; break; case 7: @@ -210,9 +210,9 @@ void SpearGuardianControl(short itemNum) xian->Flags = 0; if (!info.ahead || info.distance > SQUARE(WALL_SIZE * 3 / 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; else - item->TargetState = 8; + item->Animation.TargetState = 8; break; case 9: @@ -221,9 +221,9 @@ void SpearGuardianControl(short itemNum) xian->Flags = 0; if (!info.ahead || info.distance > SQUARE(WALL_SIZE * 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; else - item->TargetState = 8; + item->Animation.TargetState = 8; break; case 11: @@ -232,9 +232,9 @@ void SpearGuardianControl(short itemNum) xian->Flags = 0; if (!info.ahead || info.distance > SQUARE(WALL_SIZE * 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; else - item->TargetState = 8; + item->Animation.TargetState = 8; break; case 13: @@ -243,9 +243,9 @@ void SpearGuardianControl(short itemNum) xian->Flags = 0; if (!info.ahead || info.distance > SQUARE(WALL_SIZE)) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 14; + item->Animation.TargetState = 14; break; case 15: @@ -254,9 +254,9 @@ void SpearGuardianControl(short itemNum) xian->Flags = 0; if (!info.ahead || info.distance > SQUARE(WALL_SIZE * 2)) - item->TargetState = 4; + item->Animation.TargetState = 4; else - item->TargetState = 16; + item->Animation.TargetState = 16; break; case 6: @@ -274,12 +274,12 @@ void SpearGuardianControl(short itemNum) if (info.ahead && info.distance < SQUARE(WALL_SIZE)) { if (GetRandomControl() < 0x4000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 2; + item->Animation.TargetState = 2; } else - item->TargetState = 3; + item->Animation.TargetState = 3; break; case 14: @@ -289,9 +289,9 @@ void SpearGuardianControl(short itemNum) XianDamage(item, xian, 75); if (info.ahead && info.distance < SQUARE(WALL_SIZE)) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 2; + item->Animation.TargetState = 2; break; case 16: @@ -303,14 +303,14 @@ void SpearGuardianControl(short itemNum) if (info.ahead && info.distance < SQUARE(WALL_SIZE)) { if (GetRandomControl() < 0x4000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (info.ahead && info.distance < SQUARE(WALL_SIZE * 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; else - item->TargetState = 4; + item->Animation.TargetState = 4; break; } } diff --git a/TR5Main/Objects/TR2/Entity/tr2_spider.cpp b/TR5Main/Objects/TR2/Entity/tr2_spider.cpp index 32d8a7d68..d03415fae 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_spider.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_spider.cpp @@ -45,9 +45,9 @@ static void SpiderLeap(short itemNum, ITEM_INFO* item, short angle) if (item->RoomNumber != vec.roomNumber) ItemNewRoom(item->RoomNumber, vec.roomNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 2; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 5; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 2; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 5; CreatureAnimation(itemNum, angle, 0); } @@ -68,11 +68,11 @@ void SmallSpiderControl(short itemNum) if (item->HitPoints <= 0) { - if (item->ActiveState != 7) + if (item->Animation.ActiveState != 7) { ExplodingDeath(itemNum, -1, 256); DisableEntityAI(itemNum); - item->ActiveState = 7; + item->Animation.ActiveState = 7; KillItem(itemNum); } } @@ -83,7 +83,7 @@ void SmallSpiderControl(short itemNum) CreatureMood(item, &info, VIOLENT); angle = CreatureTurn(item, ANGLE(8)); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: spider->Flags = 0; @@ -91,21 +91,21 @@ void SmallSpiderControl(short itemNum) if (spider->Mood == MoodType::Bored) { if (GetRandomControl() < 0x100) - item->TargetState = 2; + item->Animation.TargetState = 2; else break; } else if (info.ahead && item->TouchBits) { - item->TargetState = 4; + item->Animation.TargetState = 4; } else if (spider->Mood == MoodType::Stalk) { - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (spider->Mood == MoodType::Escape || spider->Mood == MoodType::Attack) { - item->TargetState = 3; + item->Animation.TargetState = 3; } break; @@ -113,13 +113,13 @@ void SmallSpiderControl(short itemNum) if (spider->Mood == MoodType::Bored) { if (GetRandomControl() < 0x100) - item->TargetState = 1; + item->Animation.TargetState = 1; else break; } else if (spider->Mood == MoodType::Escape || spider->Mood == MoodType::Attack) { - item->TargetState = 3; + item->Animation.TargetState = 3; } break; @@ -127,13 +127,13 @@ void SmallSpiderControl(short itemNum) spider->Flags = 0; if (spider->Mood == MoodType::Bored || spider->Mood == MoodType::Stalk) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (info.ahead && item->TouchBits) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (info.ahead && info.distance < SQUARE(WALL_SIZE / 5)) - item->TargetState = 6; + item->Animation.TargetState = 6; else if (info.ahead && info.distance < SQUARE(WALL_SIZE / 2)) - item->TargetState = 5; + item->Animation.TargetState = 5; break; case 4: @@ -151,7 +151,7 @@ void SmallSpiderControl(short itemNum) } - if (item->ActiveState == 5 || item->ActiveState == 4) + if (item->Animation.ActiveState == 5 || item->Animation.ActiveState == 4) CreatureAnimation(itemNum, angle, 0); else SpiderLeap(itemNum, item, angle); @@ -173,11 +173,11 @@ void BigSpiderControl(short itemNum) if (item->HitPoints <= 0) { - if (item->ActiveState != 7) + if (item->Animation.ActiveState != 7) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 2; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 7; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 2; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 7; } } else @@ -187,7 +187,7 @@ void BigSpiderControl(short itemNum) CreatureMood(item, &info, TRUE); angle = CreatureTurn(item, ANGLE(4)); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: spider->Flags = 0; @@ -195,21 +195,21 @@ void BigSpiderControl(short itemNum) if (spider->Mood == MoodType::Bored) { if (GetRandomControl() < 0x200) - item->TargetState = 2; + item->Animation.TargetState = 2; else break; } else if (info.ahead && info.distance < (SQUARE(STEP_SIZE * 3) + 15)) { - item->TargetState = 4; + item->Animation.TargetState = 4; } else if (spider->Mood == MoodType::Stalk) { - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (spider->Mood == MoodType::Escape || spider->Mood == MoodType::Attack) { - item->TargetState = 3; + item->Animation.TargetState = 3; } break; @@ -217,13 +217,13 @@ void BigSpiderControl(short itemNum) if (spider->Mood == MoodType::Bored) { if (GetRandomControl() < 0x200) - item->TargetState = 1; + item->Animation.TargetState = 1; else break; } else if (spider->Mood == MoodType::Escape || spider->Mood == MoodType::Attack) { - item->TargetState = 3; + item->Animation.TargetState = 3; } break; @@ -231,9 +231,9 @@ void BigSpiderControl(short itemNum) spider->Flags = 0; if (spider->Mood == MoodType::Bored || spider->Mood == MoodType::Stalk) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (info.ahead && item->TouchBits) - item->TargetState = 1; + item->Animation.TargetState = 1; break; case 4: diff --git a/TR5Main/Objects/TR2/Entity/tr2_sword_guardian.cpp b/TR5Main/Objects/TR2/Entity/tr2_sword_guardian.cpp index 62b905b8c..ea317df16 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_sword_guardian.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_sword_guardian.cpp @@ -54,7 +54,7 @@ void SwordGuardianControl(short itemNum) if (item->HitPoints <= 0) { - if (item->ActiveState != 12) + if (item->Animation.ActiveState != 12) { //item->meshBits >>= 1; SoundEffect(SFX_TR4_EXPLOSION1, &LaraItem->Position, 0); @@ -67,7 +67,7 @@ void SwordGuardianControl(short itemNum) KillItem(itemNum); //item->status = ITEM_DESACTIVATED; //item->flags |= ONESHOT; - item->ActiveState = 12; + item->Animation.ActiveState = 12; } return; } @@ -79,7 +79,7 @@ void SwordGuardianControl(short itemNum) sword->LOT.Zone = ZONE_BASIC; CreatureAIInfo(item, &info); - if (item->ActiveState == 8) + if (item->Animation.ActiveState == 8) { if (info.zoneNumber != info.enemyZone) { @@ -96,10 +96,10 @@ void SwordGuardianControl(short itemNum) angle = CreatureTurn(item, sword->MaxTurn); - if (item->ActiveState != 9) + if (item->Animation.ActiveState != 9) item->MeshBits = 0xFFFFFFFF; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 9: sword->MaxTurn = 0; @@ -126,21 +126,21 @@ void SwordGuardianControl(short itemNum) if (info.bite && info.distance < 0x100000) { if (GetRandomControl() >= 0x4000) - item->TargetState = 5; + item->Animation.TargetState = 5; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else { if (info.zoneNumber == info.enemyZone) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 8; + item->Animation.TargetState = 8; } } else { - item->TargetState = 7; + item->Animation.TargetState = 7; } break; @@ -153,13 +153,13 @@ void SwordGuardianControl(short itemNum) if (lara_alive) { if (info.bite && info.distance < 0x400000) - item->TargetState = 10; + item->Animation.TargetState = 10; else if (info.zoneNumber != info.enemyZone) - item->TargetState = 1; + item->Animation.TargetState = 1; } else { - item->TargetState = 1; + item->Animation.TargetState = 1; } break; @@ -170,9 +170,9 @@ void SwordGuardianControl(short itemNum) torso = info.angle; if (!info.bite || info.distance > 0x100000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 4; + item->Animation.TargetState = 4; break; case 5: @@ -182,9 +182,9 @@ void SwordGuardianControl(short itemNum) torso = info.angle; if (!info.bite || info.distance > 0x100000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 6; + item->Animation.TargetState = 6; break; case 10: @@ -194,9 +194,9 @@ void SwordGuardianControl(short itemNum) torso = info.angle; if (!info.bite || info.distance > 0x400000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 11; + item->Animation.TargetState = 11; break; case 8: @@ -208,7 +208,7 @@ void SwordGuardianControl(short itemNum) SwordGuardianFly(item); if (!sword->LOT.Fly) - item->TargetState = 1; + item->Animation.TargetState = 1; break; case 4: diff --git a/TR5Main/Objects/TR2/Entity/tr2_worker_dualrevolver.cpp b/TR5Main/Objects/TR2/Entity/tr2_worker_dualrevolver.cpp index 8faef0dc7..3040697e1 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_worker_dualrevolver.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_worker_dualrevolver.cpp @@ -28,16 +28,16 @@ void WorkerDualGunControl(short itemNum) if (item->HitPoints <= 0) { - if (item->ActiveState != 11) + if (item->Animation.ActiveState != 11) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 32; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 11; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 32; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 11; } } else if (LaraItem->HitPoints <= 0) { - item->TargetState = 2; + item->Animation.TargetState = 2; } else { @@ -48,7 +48,7 @@ void WorkerDualGunControl(short itemNum) angle = CreatureTurn(item, dual->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: case 2: @@ -65,9 +65,9 @@ void WorkerDualGunControl(short itemNum) if (Targetable(item, &info)) { if (info.distance <= 0x900000) - item->TargetState = 9; + item->Animation.TargetState = 9; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else { @@ -75,27 +75,27 @@ void WorkerDualGunControl(short itemNum) { case MoodType::Attack: if (info.distance > 0x19000000 || !info.ahead) - item->TargetState = 4; + item->Animation.TargetState = 4; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; case MoodType::Escape: - item->TargetState = 4; + item->Animation.TargetState = 4; break; case MoodType::Stalk: - item->TargetState = 3; + item->Animation.TargetState = 3; break; default: if (!info.ahead) - item->TargetState = 3; + item->Animation.TargetState = 3; break; } } } else { - item->TargetState = 1; + item->Animation.TargetState = 1; } break; case 3: @@ -111,34 +111,34 @@ void WorkerDualGunControl(short itemNum) { if (info.distance < 0x900000 || info.zoneNumber != info.enemyZone) { - item->TargetState = 1; + item->Animation.TargetState = 1; } else { if (info.angle >= 0) - item->TargetState = 6; + item->Animation.TargetState = 6; else - item->TargetState = 5; + item->Animation.TargetState = 5; } } if (dual->Mood == MoodType::Escape) { - item->TargetState = 4; + item->Animation.TargetState = 4; } else if (dual->Mood == MoodType::Attack || dual->Mood == MoodType::Stalk) { if (info.distance > 0x19000000 || !info.ahead) - item->TargetState = 4; + item->Animation.TargetState = 4; } else if (LaraItem->HitPoints > 0) { if (info.ahead) - item->TargetState = 1; + item->Animation.TargetState = 1; } else { - item->TargetState = 2; + item->Animation.TargetState = 2; } break; case 4: @@ -157,27 +157,27 @@ void WorkerDualGunControl(short itemNum) if (info.zoneNumber == info.enemyZone) { if (info.angle >= 0) - item->TargetState = 6; + item->Animation.TargetState = 6; else - item->TargetState = 5; + item->Animation.TargetState = 5; } else { - item->TargetState = 3; + item->Animation.TargetState = 3; } } else if (dual->Mood == MoodType::Attack) { if (info.ahead && info.distance < 0x19000000) - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (LaraItem->HitPoints > 0) { - item->TargetState = 1; + item->Animation.TargetState = 1; } else { - item->TargetState = 2; + item->Animation.TargetState = 2; } break; case 5: @@ -190,9 +190,9 @@ void WorkerDualGunControl(short itemNum) } if (Targetable(item, &info)) - item->TargetState = 7; + item->Animation.TargetState = 7; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; case 6: dual->Flags = 0; @@ -204,9 +204,9 @@ void WorkerDualGunControl(short itemNum) } if (Targetable(item, &info)) - item->TargetState = 8; + item->Animation.TargetState = 8; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; case 7: if (info.ahead) @@ -244,9 +244,9 @@ void WorkerDualGunControl(short itemNum) } if (Targetable(item, &info)) - item->TargetState = 10; + item->Animation.TargetState = 10; else - item->TargetState = 1; + item->Animation.TargetState = 1; break; case 10: if (info.ahead) diff --git a/TR5Main/Objects/TR2/Entity/tr2_worker_flamethrower.cpp b/TR5Main/Objects/TR2/Entity/tr2_worker_flamethrower.cpp index a05421d11..7f82d752d 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_worker_flamethrower.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_worker_flamethrower.cpp @@ -43,13 +43,13 @@ void InitialiseWorkerFlamethrower(short itemNum) ITEM_INFO* item; item = &g_Level.Items[itemNum]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 12; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 12; ClearItem(itemNum); - anim = &g_Level.Anims[item->AnimNumber]; - item->FrameNumber = anim->frameBase; - item->ActiveState = anim->ActiveState; + anim = &g_Level.Anims[item->Animation.AnimNumber]; + item->Animation.FrameNumber = anim->frameBase; + item->Animation.ActiveState = anim->ActiveState; } void WorkerFlamethrower(short itemNum) @@ -74,16 +74,16 @@ void WorkerFlamethrower(short itemNum) if (item->HitPoints <= 0) { - if (item->ActiveState != 7) + if (item->Animation.ActiveState != 7) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 19; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 7; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 19; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 7; } } else { - if (item->ActiveState != 5 && item->ActiveState != 6) + if (item->Animation.ActiveState != 5 && item->Animation.ActiveState != 6) { TriggerDynamicLight(pos.x, pos.y, pos.z, (GetRandomControl() & 4) + 10, (GetRandomControl() & 7) + 128, (GetRandomControl() & 7) + 64, GetRandomControl() & 7); AddFire(pos.x, pos.y, pos.z, 0, item->RoomNumber, 0); @@ -98,7 +98,7 @@ void WorkerFlamethrower(short itemNum) CreatureMood(item, &info, VIOLENT); angle = CreatureTurn(item, flame->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: flame->Flags = 0; @@ -112,25 +112,25 @@ void WorkerFlamethrower(short itemNum) if (flame->Mood == MoodType::Escape) { - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (Targetable(item, &info)) { if (info.distance < SQUARE(WALL_SIZE * 4) || info.zoneNumber != info.enemyZone) - item->TargetState = 8; + item->Animation.TargetState = 8; else - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (flame->Mood == MoodType::Attack || !info.ahead) { if (info.distance <= SQUARE(WALL_SIZE * 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else { - item->TargetState = 4; + item->Animation.TargetState = 4; } break; @@ -145,23 +145,23 @@ void WorkerFlamethrower(short itemNum) if (flame->Mood == MoodType::Escape) { - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (Targetable(item, &info)) { if (info.distance < SQUARE(WALL_SIZE * 4) || info.zoneNumber != info.enemyZone) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 6; + item->Animation.TargetState = 6; } else if (flame->Mood == MoodType::Attack || !info.ahead) { if (info.distance > SQUARE(WALL_SIZE * 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; } else { - item->TargetState = 4; + item->Animation.TargetState = 4; } break; @@ -178,11 +178,11 @@ void WorkerFlamethrower(short itemNum) { if (Targetable(item, &info)) { - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (flame->Mood == MoodType::Bored || flame->Mood == MoodType::Stalk) { - item->TargetState = 2; + item->Animation.TargetState = 2; } } break; @@ -196,17 +196,17 @@ void WorkerFlamethrower(short itemNum) if (Targetable(item, &info)) { - item->TargetState = 5; + item->Animation.TargetState = 5; } else { if (flame->Mood == MoodType::Attack) { - item->TargetState = 1; + item->Animation.TargetState = 1; } else if (!info.ahead) { - item->TargetState = 1; + item->Animation.TargetState = 1; } } break; @@ -219,9 +219,9 @@ void WorkerFlamethrower(short itemNum) torso_x = info.xAngle; } - if (item->TargetState != 1 && (flame->Mood == MoodType::Escape || info.distance > SQUARE(WALL_SIZE * 10) || !Targetable(item, &info))) + if (item->Animation.TargetState != 1 && (flame->Mood == MoodType::Escape || info.distance > SQUARE(WALL_SIZE * 10) || !Targetable(item, &info))) { - item->TargetState = 1; + item->Animation.TargetState = 1; } break; @@ -237,11 +237,11 @@ void WorkerFlamethrower(short itemNum) if (Targetable(item, &info)) { - item->TargetState = (item->ActiveState == 8) ? 5 : 11; + item->Animation.TargetState = (item->Animation.ActiveState == 8) ? 5 : 11; } else { - item->TargetState = 1; + item->Animation.TargetState = 1; } break; } diff --git a/TR5Main/Objects/TR2/Entity/tr2_worker_machinegun.cpp b/TR5Main/Objects/TR2/Entity/tr2_worker_machinegun.cpp index 2cf79fc08..750ebcc1f 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_worker_machinegun.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_worker_machinegun.cpp @@ -17,13 +17,13 @@ void InitialiseWorkerMachineGun(short itemNum) ANIM_STRUCT* anim; ITEM_INFO* item; item = &g_Level.Items[itemNum]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 12; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 12; ClearItem(itemNum); - anim = &g_Level.Anims[item->AnimNumber]; - item->FrameNumber = anim->frameBase; - item->ActiveState = anim->ActiveState; + anim = &g_Level.Anims[item->Animation.AnimNumber]; + item->Animation.FrameNumber = anim->frameBase; + item->Animation.ActiveState = anim->ActiveState; } void WorkerMachineGunControl(short itemNum) @@ -42,11 +42,11 @@ void WorkerMachineGunControl(short itemNum) if (item->HitPoints <= 0) { - if (item->ActiveState != 7) + if (item->Animation.ActiveState != 7) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 19; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 7; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 19; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 7; } } else @@ -56,7 +56,7 @@ void WorkerMachineGunControl(short itemNum) CreatureMood(item, &info, VIOLENT); angle = CreatureTurn(item, machinegun->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: machinegun->Flags = 0; @@ -70,25 +70,25 @@ void WorkerMachineGunControl(short itemNum) if (machinegun->Mood == MoodType::Escape) { - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (Targetable(item, &info)) { if (info.distance < 0x900000 || info.zoneNumber != info.enemyZone) - item->TargetState = (GetRandomControl() < 0x4000) ? 8 : 10; + item->Animation.TargetState = (GetRandomControl() < 0x4000) ? 8 : 10; else - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (machinegun->Mood == MoodType::Attack || !info.ahead) { if (info.distance <= 0x400000) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else { - item->TargetState = 4; + item->Animation.TargetState = 4; } break; @@ -103,23 +103,23 @@ void WorkerMachineGunControl(short itemNum) if (machinegun->Mood == MoodType::Escape) { - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (Targetable(item, &info)) { if (info.distance < 0x900000 || info.zoneNumber != info.enemyZone) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 6; + item->Animation.TargetState = 6; } else if (machinegun->Mood == MoodType::Attack || !info.ahead) { if (info.distance > 0x400000) - item->TargetState = 3; + item->Animation.TargetState = 3; } else { - item->TargetState = 4; + item->Animation.TargetState = 4; } break; @@ -136,11 +136,11 @@ void WorkerMachineGunControl(short itemNum) { if (Targetable(item, &info)) { - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (machinegun->Mood == MoodType::Bored || machinegun->Mood == MoodType::Stalk) { - item->TargetState = 2; + item->Animation.TargetState = 2; } } break; @@ -154,17 +154,17 @@ void WorkerMachineGunControl(short itemNum) if (Targetable(item, &info)) { - item->TargetState = 5; + item->Animation.TargetState = 5; } else { if (machinegun->Mood == MoodType::Attack) { - item->TargetState = 1; + item->Animation.TargetState = 1; } else if (!info.ahead) { - item->TargetState = 1; + item->Animation.TargetState = 1; } } break; @@ -181,11 +181,11 @@ void WorkerMachineGunControl(short itemNum) if (Targetable(item, &info)) { - item->TargetState = (item->ActiveState == 8) ? 5 : 11; + item->Animation.TargetState = (item->Animation.ActiveState == 8) ? 5 : 11; } else { - item->TargetState = 1; + item->Animation.TargetState = 1; } break; @@ -200,11 +200,11 @@ void WorkerMachineGunControl(short itemNum) if (Targetable(item, &info)) { - item->TargetState = 6; + item->Animation.TargetState = 6; } else { - item->TargetState = 2; + item->Animation.TargetState = 2; } break; @@ -227,9 +227,9 @@ void WorkerMachineGunControl(short itemNum) machinegun->Flags = 5; } - if (item->TargetState != 1 && (machinegun->Mood == MoodType::Escape || info.distance > 0x900000 || !Targetable(item, &info))) + if (item->Animation.TargetState != 1 && (machinegun->Mood == MoodType::Escape || info.distance > 0x900000 || !Targetable(item, &info))) { - item->TargetState = 1; + item->Animation.TargetState = 1; } break; diff --git a/TR5Main/Objects/TR2/Entity/tr2_worker_shotgun.cpp b/TR5Main/Objects/TR2/Entity/tr2_worker_shotgun.cpp index fcf84ac7b..eef964c1b 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_worker_shotgun.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_worker_shotgun.cpp @@ -39,12 +39,12 @@ void InitialiseWorkerShotgun(short itemNum) { auto* item = &g_Level.Items[itemNum]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 5; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 5; ClearItem(itemNum); - auto* anim = &g_Level.Anims[item->AnimNumber]; - item->FrameNumber = anim->frameBase; - item->ActiveState = anim->ActiveState; + auto* anim = &g_Level.Anims[item->Animation.AnimNumber]; + item->Animation.FrameNumber = anim->frameBase; + item->Animation.ActiveState = anim->ActiveState; } void WorkerShotgunControl(short itemNumber) @@ -64,11 +64,11 @@ void WorkerShotgunControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 7) + if (item->Animation.ActiveState != 7) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 18; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 7; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 18; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 7; } } else @@ -81,7 +81,7 @@ void WorkerShotgunControl(short itemNumber) angle = CreatureTurn(item, info->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 2: info->Flags = 0; @@ -95,19 +95,19 @@ void WorkerShotgunControl(short itemNumber) if (info->Mood == MoodType::Escape) { - item->TargetState = 5; + item->Animation.TargetState = 5; } else if (Targetable(item, &aiInfo)) { if (aiInfo.distance <= 0x900000 || aiInfo.zoneNumber != aiInfo.enemyZone) - item->TargetState = (GetRandomControl() >= 0x4000) ? 9 : 8; + item->Animation.TargetState = (GetRandomControl() >= 0x4000) ? 9 : 8; else - item->TargetState = 1; + item->Animation.TargetState = 1; } else if (info->Mood == MoodType::Attack || !aiInfo.ahead) - item->TargetState = (aiInfo.distance <= 0x400000) ? 1 : 5; + item->Animation.TargetState = (aiInfo.distance <= 0x400000) ? 1 : 5; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -119,9 +119,9 @@ void WorkerShotgunControl(short itemNumber) } if (Targetable(item, &aiInfo)) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (info->Mood == MoodType::Attack || !aiInfo.ahead) - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -135,21 +135,21 @@ void WorkerShotgunControl(short itemNumber) } if (info->Mood == MoodType::Escape) - item->TargetState = 5; + item->Animation.TargetState = 5; else if (Targetable(item, &aiInfo)) { if (aiInfo.distance < 0x900000 || aiInfo.zoneNumber != aiInfo.enemyZone) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 6; + item->Animation.TargetState = 6; } else if (info->Mood == MoodType::Attack || !aiInfo.ahead) { if (aiInfo.distance > 0x400000) - item->TargetState = 5; + item->Animation.TargetState = 5; } else - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -166,9 +166,9 @@ void WorkerShotgunControl(short itemNumber) if (info->Mood != MoodType::Escape) { if (Targetable(item, &aiInfo)) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (info->Mood == MoodType::Bored || info->Mood == MoodType::Stalk) - item->TargetState = 1; + item->Animation.TargetState = 1; } break; @@ -184,7 +184,7 @@ void WorkerShotgunControl(short itemNumber) } if (Targetable(item, &aiInfo)) - item->TargetState = (item->ActiveState == 8) ? 4 : 10; + item->Animation.TargetState = (item->Animation.ActiveState == 8) ? 4 : 10; break; @@ -203,10 +203,10 @@ void WorkerShotgunControl(short itemNumber) info->Flags = 1; } - if (item->ActiveState == 4 && item->TargetState != 2 && + if (item->Animation.ActiveState == 4 && item->Animation.TargetState != 2 && (info->Mood == MoodType::Escape || aiInfo.distance > 0x900000 || !Targetable(item, &aiInfo))) { - item->TargetState = 2; + item->Animation.TargetState = 2; } break; diff --git a/TR5Main/Objects/TR2/Entity/tr2_yeti.cpp b/TR5Main/Objects/TR2/Entity/tr2_yeti.cpp index 37804d2ce..a94c257fd 100644 --- a/TR5Main/Objects/TR2/Entity/tr2_yeti.cpp +++ b/TR5Main/Objects/TR2/Entity/tr2_yeti.cpp @@ -32,9 +32,9 @@ void InitialiseYeti(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 19; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = g_Level.Anims[item->AnimNumber].ActiveState; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 19; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; } void YetiControl(short itemNumber) @@ -54,11 +54,11 @@ void YetiControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 8) + if (item->Animation.ActiveState != 8) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 31; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 8; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 31; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 8; } } else @@ -71,7 +71,7 @@ void YetiControl(short itemNumber) angle = CreatureTurn(item, info->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 2: info->MaxTurn = 0; @@ -81,26 +81,26 @@ void YetiControl(short itemNumber) head = aiInfo.angle; if (info->Mood == MoodType::Escape) - item->TargetState = 1; - else if (item->RequiredState) - item->TargetState = item->RequiredState; + item->Animation.TargetState = 1; + else if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (info->Mood == MoodType::Bored) { if (GetRandomControl() < 0x100 || !laraAlive) - item->TargetState = 7; + item->Animation.TargetState = 7; else if (GetRandomControl() < 0x200) - item->TargetState = 9; + item->Animation.TargetState = 9; else if (GetRandomControl() < 0x300) - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(0.5f), 2) && GetRandomControl() < 0x4000) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (aiInfo.ahead && aiInfo.distance < pow(CLICK(1), 2)) - item->TargetState = 5; + item->Animation.TargetState = 5; else if (info->Mood == MoodType::Stalk) - item->TargetState = 3; + item->Animation.TargetState = 3; else - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -109,24 +109,24 @@ void YetiControl(short itemNumber) head = aiInfo.angle; if (info->Mood == MoodType::Escape || item->HitStatus) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (info->Mood == MoodType::Bored) { if (laraAlive) { if (GetRandomControl() < 0x100) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (GetRandomControl() < 0x200) - item->TargetState = 9; + item->Animation.TargetState = 9; else if (GetRandomControl() < 0x300) { - item->TargetState = 2; - item->RequiredState = 3; + item->Animation.TargetState = 2; + item->Animation.RequiredState = 3; } } } else if (GetRandomControl() < 0x200) - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -135,21 +135,21 @@ void YetiControl(short itemNumber) head = aiInfo.angle; if (info->Mood == MoodType::Escape || item->HitStatus) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (info->Mood == MoodType::Bored) { if (GetRandomControl() < 0x100 || !laraAlive) - item->TargetState = 7; + item->Animation.TargetState = 7; else if (GetRandomControl() < 0x200) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (GetRandomControl() < 0x300) { - item->TargetState = 2; - item->RequiredState = 3; + item->Animation.TargetState = 2; + item->Animation.RequiredState = 3; } } else if (GetRandomControl() < 0x200) - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -160,28 +160,28 @@ void YetiControl(short itemNumber) head = aiInfo.angle; if (info->Mood == MoodType::Escape) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (info->Mood == MoodType::Bored) { if (GetRandomControl() < 0x100 || !laraAlive) { - item->TargetState = 2; - item->RequiredState = 7; + item->Animation.TargetState = 2; + item->Animation.RequiredState = 7; } else if (GetRandomControl() < 0x200) { - item->TargetState = 2; - item->RequiredState = 9; + item->Animation.TargetState = 2; + item->Animation.RequiredState = 9; } else if (GetRandomControl() < 0x300) - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (info->Mood == MoodType::Attack) { if (aiInfo.ahead && aiInfo.distance < pow(CLICK(1), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (aiInfo.distance < pow(SECTOR(2), 2)) - item->TargetState = 1; + item->Animation.TargetState = 1; } break; @@ -197,13 +197,13 @@ void YetiControl(short itemNumber) if (info->Mood == MoodType::Escape) break; else if (info->Mood == MoodType::Bored) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (aiInfo.ahead && aiInfo.distance < pow(CLICK(1), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (aiInfo.ahead && aiInfo.distance < pow(SECTOR(2), 2)) - item->TargetState = 6; + item->Animation.TargetState = 6; else if (info->Mood == MoodType::Stalk) - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -282,32 +282,32 @@ void YetiControl(short itemNumber) CreatureJoint(item, 0, torso); CreatureJoint(item, 1, head); - if (item->ActiveState < 10) + if (item->Animation.ActiveState < 10) { switch (CreatureVault(itemNumber, angle, 2, 300)) { case 2: - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 34; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 10; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 34; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 10; break; case 3: - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 33; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 11; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 33; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 11; break; case 4: - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 32; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 12; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 32; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 12; break; case -4: - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 35; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 13; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 35; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 13; break; } } diff --git a/TR5Main/Objects/TR2/Trap/tr2_killerstatue.cpp b/TR5Main/Objects/TR2/Trap/tr2_killerstatue.cpp index 9de66b8b2..69b085e4b 100644 --- a/TR5Main/Objects/TR2/Trap/tr2_killerstatue.cpp +++ b/TR5Main/Objects/TR2/Trap/tr2_killerstatue.cpp @@ -13,21 +13,21 @@ void InitialiseKillerStatue(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 3; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 3; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 1; } void KillerStatueControl(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - if (TriggerActive(item) && item->ActiveState == 1) - item->TargetState = 2; + if (TriggerActive(item) && item->Animation.ActiveState == 1) + item->Animation.TargetState = 2; else - item->TargetState = 1; + item->Animation.TargetState = 1; - if (item->TouchBits & 0x80 && item->ActiveState == 2) + if (item->TouchBits & 0x80 && item->Animation.ActiveState == 2) { LaraItem->HitStatus = 1; LaraItem->HitPoints -= 20; @@ -37,7 +37,7 @@ void KillerStatueControl(short itemNumber) int y = LaraItem->Position.yPos - GetRandomControl() / 44; int d = (GetRandomControl() - 16384) / 8 + LaraItem->Position.yRot; - DoBloodSplat(x, y, z, LaraItem->Velocity, d, LaraItem->RoomNumber); + DoBloodSplat(x, y, z, LaraItem->Animation.Velocity, d, LaraItem->RoomNumber); } AnimateItem(item); diff --git a/TR5Main/Objects/TR2/Trap/tr2_spinningblade.cpp b/TR5Main/Objects/TR2/Trap/tr2_spinningblade.cpp index 953135acf..85f5bb9df 100644 --- a/TR5Main/Objects/TR2/Trap/tr2_spinningblade.cpp +++ b/TR5Main/Objects/TR2/Trap/tr2_spinningblade.cpp @@ -15,9 +15,9 @@ void InitialiseSpinningBlade(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 3; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 3; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 1; } void SpinningBladeControl(short itemNumber) @@ -26,16 +26,16 @@ void SpinningBladeControl(short itemNumber) bool spinning = false; - if (item->ActiveState == 2) + if (item->Animation.ActiveState == 2) { - if (item->TargetState != 1) + if (item->Animation.TargetState != 1) { int x = item->Position.xPos + SECTOR(3) * phd_sin(item->Position.yRot) / 2; int z = item->Position.zPos + SECTOR(3) * phd_cos(item->Position.yRot) / 2; int height = GetCollisionResult(x, item->Position.yPos, z, item->RoomNumber).Position.Floor; if (height == NO_HEIGHT) - item->TargetState = 1; + item->Animation.TargetState = 1; } spinning = true; @@ -45,7 +45,7 @@ void SpinningBladeControl(short itemNumber) LaraItem->HitStatus = true; LaraItem->HitPoints -= 100; - DoLotsOfBlood(LaraItem->Position.xPos, LaraItem->Position.yPos - CLICK(2), LaraItem->Position.zPos, (short)(item->Velocity * 2), LaraItem->Position.yRot, LaraItem->RoomNumber, 2); + DoLotsOfBlood(LaraItem->Position.xPos, LaraItem->Position.yPos - CLICK(2), LaraItem->Position.zPos, (short)(item->Animation.Velocity * 2), LaraItem->Position.yRot, LaraItem->RoomNumber, 2); } SoundEffect(231, &item->Position, 0); @@ -53,7 +53,7 @@ void SpinningBladeControl(short itemNumber) else { if (TriggerActive(item)) - item->TargetState = 2; + item->Animation.TargetState = 2; spinning = false; } @@ -68,6 +68,6 @@ void SpinningBladeControl(short itemNumber) if (probe.RoomNumber != item->RoomNumber) ItemNewRoom(itemNumber, probe.RoomNumber); - if (spinning && item->ActiveState == 1) + if (spinning && item->Animation.ActiveState == 1) item->Position.yRot += -ANGLE(180.0f); } diff --git a/TR5Main/Objects/TR2/Trap/tr2_springboard.cpp b/TR5Main/Objects/TR2/Trap/tr2_springboard.cpp index 8a5a131a0..375bca4fb 100644 --- a/TR5Main/Objects/TR2/Trap/tr2_springboard.cpp +++ b/TR5Main/Objects/TR2/Trap/tr2_springboard.cpp @@ -10,24 +10,24 @@ void SpringBoardControl(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - if (item->ActiveState == 0 && LaraItem->Position.yPos == item->Position.yPos && + if (item->Animation.ActiveState == 0 && LaraItem->Position.yPos == item->Position.yPos && LaraItem->Position.xPos / SECTOR(1) == item->Position.xPos / SECTOR(1) && LaraItem->Position.zPos / SECTOR(1) == item->Position.zPos / SECTOR(1)) { if (LaraItem->HitPoints <= 0) return; - if (LaraItem->ActiveState == LS_WALK_BACK || LaraItem->ActiveState == LS_RUN_BACK) - LaraItem->Velocity = -LaraItem->Velocity; + if (LaraItem->Animation.ActiveState == LS_WALK_BACK || LaraItem->Animation.ActiveState == LS_RUN_BACK) + LaraItem->Animation.Velocity = -LaraItem->Animation.Velocity; - LaraItem->VerticalVelocity = -240; - LaraItem->Airborne = true; - LaraItem->AnimNumber = LA_FALL_START; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; - LaraItem->ActiveState = LS_JUMP_FORWARD; - LaraItem->TargetState = LS_JUMP_FORWARD; + LaraItem->Animation.VerticalVelocity = -240; + LaraItem->Animation.Airborne = true; + LaraItem->Animation.AnimNumber = LA_FALL_START; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; + LaraItem->Animation.ActiveState = LS_JUMP_FORWARD; + LaraItem->Animation.TargetState = LS_JUMP_FORWARD; - item->TargetState = 1; + item->Animation.TargetState = 1; } AnimateItem(item); diff --git a/TR5Main/Objects/TR2/Vehicles/boat.cpp b/TR5Main/Objects/TR2/Vehicles/boat.cpp index f9cb2b677..7af4014c2 100644 --- a/TR5Main/Objects/TR2/Vehicles/boat.cpp +++ b/TR5Main/Objects/TR2/Vehicles/boat.cpp @@ -198,7 +198,7 @@ BoatMountType GetSpeedBoatMountType(ITEM_INFO* laraItem, ITEM_INFO* sBoatItem, C short deltaAngle = sBoatItem->Position.yRot - laraItem->Position.yRot; if (lara->Control.WaterStatus == WaterStatus::TreadWater || lara->Control.WaterStatus == WaterStatus::Wade) { - if (!(TrInput & IN_ACTION) || laraItem->Airborne || sBoatItem->Velocity) + if (!(TrInput & IN_ACTION) || laraItem->Animation.Airborne || sBoatItem->Animation.Velocity) return mountType; if (deltaAngle > ANGLE(45.0f) && deltaAngle < ANGLE(135.0f)) @@ -208,7 +208,7 @@ BoatMountType GetSpeedBoatMountType(ITEM_INFO* laraItem, ITEM_INFO* sBoatItem, C } else if (lara->Control.WaterStatus == WaterStatus::Dry) { - if (laraItem->VerticalVelocity > 0) + if (laraItem->Animation.VerticalVelocity > 0) { if (deltaAngle > -ANGLE(135.0f) && deltaAngle < ANGLE(135.0f) && laraItem->Position.yPos > sBoatItem->Position.yPos) @@ -216,7 +216,7 @@ BoatMountType GetSpeedBoatMountType(ITEM_INFO* laraItem, ITEM_INFO* sBoatItem, C mountType = BoatMountType::Jump; } } - else if (laraItem->VerticalVelocity == 0) + else if (laraItem->Animation.VerticalVelocity == 0) { if (deltaAngle > -ANGLE(135.0f) && deltaAngle < ANGLE(135.0f)) { @@ -270,19 +270,19 @@ void DoSpeedBoatDismount(ITEM_INFO* laraItem, ITEM_INFO* sBoatItem) { auto* lara = GetLaraInfo(laraItem); - if ((laraItem->ActiveState == SBOAT_STATE_DISMOUNT_LEFT || - laraItem->ActiveState == SBOAT_STATE_DISMOUNT_RIGHT) && - TestLastFrame(laraItem, laraItem->AnimNumber)) + if ((laraItem->Animation.ActiveState == SBOAT_STATE_DISMOUNT_LEFT || + laraItem->Animation.ActiveState == SBOAT_STATE_DISMOUNT_RIGHT) && + TestLastFrame(laraItem, laraItem->Animation.AnimNumber)) { - if (laraItem->ActiveState == SBOAT_STATE_DISMOUNT_LEFT) + if (laraItem->Animation.ActiveState == SBOAT_STATE_DISMOUNT_LEFT) laraItem->Position.yRot -= ANGLE(90.0f); - else if(laraItem->ActiveState == SBOAT_STATE_DISMOUNT_RIGHT) + else if(laraItem->Animation.ActiveState == SBOAT_STATE_DISMOUNT_RIGHT) laraItem->Position.yRot += ANGLE(90.0f); SetAnimation(laraItem, LA_JUMP_FORWARD); - laraItem->Velocity = 40; - laraItem->VerticalVelocity = -50; - laraItem->Airborne = true; + laraItem->Animation.Velocity = 40; + laraItem->Animation.VerticalVelocity = -50; + laraItem->Animation.Airborne = true; laraItem->Position.xRot = 0; laraItem->Position.zRot = 0; lara->Vehicle = NO_ITEM; @@ -302,8 +302,8 @@ void DoSpeedBoatDismount(ITEM_INFO* laraItem, ITEM_INFO* sBoatItem) } laraItem->Position.yPos = y; - sBoatItem->AnimNumber = Objects[ID_SPEEDBOAT].animIndex; - sBoatItem->FrameNumber = g_Level.Anims[sBoatItem->AnimNumber].frameBase; + sBoatItem->Animation.AnimNumber = Objects[ID_SPEEDBOAT].animIndex; + sBoatItem->Animation.FrameNumber = g_Level.Anims[sBoatItem->Animation.AnimNumber].frameBase; } } @@ -545,8 +545,8 @@ int SpeedBoatDynamics(ITEM_INFO* laraItem, short itemNumber) sBoatItem->Position.yRot += sBoat->TurnRate + sBoat->ExtraRotation; sBoat->LeanAngle = sBoat->TurnRate * 6; - sBoatItem->Position.xPos += sBoatItem->Velocity * phd_sin(sBoatItem->Position.yRot); - sBoatItem->Position.zPos += sBoatItem->Velocity * phd_cos(sBoatItem->Position.yRot); + sBoatItem->Position.xPos += sBoatItem->Animation.Velocity * phd_sin(sBoatItem->Position.yRot); + sBoatItem->Position.zPos += sBoatItem->Animation.Velocity * phd_cos(sBoatItem->Position.yRot); int slip = BOAT_SIDE_SLIP * phd_sin(sBoatItem->Position.zRot); if (!slip && sBoatItem->Position.zRot) @@ -608,30 +608,30 @@ int SpeedBoatDynamics(ITEM_INFO* laraItem, short itemNumber) { newVelocity = (sBoatItem->Position.zPos - old.z) * phd_cos(sBoatItem->Position.yRot) + (sBoatItem->Position.xPos - old.x) * phd_sin(sBoatItem->Position.yRot); - if (lara->Vehicle == itemNumber && sBoatItem->Velocity > BOAT_MAX_VELOCITY + BOAT_ACCELERATION && newVelocity < sBoatItem->Velocity - 10) + if (lara->Vehicle == itemNumber && sBoatItem->Animation.Velocity > BOAT_MAX_VELOCITY + BOAT_ACCELERATION && newVelocity < sBoatItem->Animation.Velocity - 10) { - laraItem->HitPoints -= sBoatItem->Velocity; + laraItem->HitPoints -= sBoatItem->Animation.Velocity; laraItem->HitStatus = 1; SoundEffect(SFX_TR4_LARA_INJURY, &laraItem->Position, 0); newVelocity /= 2; - sBoatItem->Velocity /= 2; + sBoatItem->Animation.Velocity /= 2; } if (slip) { - if (sBoatItem->Velocity <= BOAT_MAX_VELOCITY + 10) - sBoatItem->Velocity = newVelocity; + if (sBoatItem->Animation.Velocity <= BOAT_MAX_VELOCITY + 10) + sBoatItem->Animation.Velocity = newVelocity; } else { - if (sBoatItem->Velocity > 0 && newVelocity < sBoatItem->Velocity) - sBoatItem->Velocity = newVelocity; - else if (sBoatItem->Velocity < 0 && newVelocity > sBoatItem->Velocity) - sBoatItem->Velocity = newVelocity; + if (sBoatItem->Animation.Velocity > 0 && newVelocity < sBoatItem->Animation.Velocity) + sBoatItem->Animation.Velocity = newVelocity; + else if (sBoatItem->Animation.Velocity < 0 && newVelocity > sBoatItem->Animation.Velocity) + sBoatItem->Animation.Velocity = newVelocity; } - if (sBoatItem->Velocity < BOAT_MAX_BACK) - sBoatItem->Velocity = BOAT_MAX_BACK; + if (sBoatItem->Animation.Velocity < BOAT_MAX_BACK) + sBoatItem->Animation.Velocity = BOAT_MAX_BACK; } return collide; @@ -647,7 +647,7 @@ bool SpeedBoatUserControl(ITEM_INFO* laraItem, ITEM_INFO* sBoatItem) if (sBoatItem->Position.yPos >= sBoat->Water - CLICK(0.5f) && sBoat->Water != NO_HEIGHT) { if (!(TrInput & SBOAT_IN_DISMOUNT) && !(TrInput & IN_LOOK) || - sBoatItem->Velocity) + sBoatItem->Animation.Velocity) { if (TrInput & SBOAT_IN_LEFT && !(TrInput & SBOAT_IN_REVERSE) || TrInput & SBOAT_IN_RIGHT && TrInput & SBOAT_IN_REVERSE) @@ -680,10 +680,10 @@ bool SpeedBoatUserControl(ITEM_INFO* laraItem, ITEM_INFO* sBoatItem) if (TrInput & SBOAT_IN_REVERSE) { - if (sBoatItem->Velocity > 0) - sBoatItem->Velocity -= BOAT_BRAKE; - else if (sBoatItem->Velocity > BOAT_MAX_BACK) - sBoatItem->Velocity += BOAT_REVERSE; + if (sBoatItem->Animation.Velocity > 0) + sBoatItem->Animation.Velocity -= BOAT_BRAKE; + else if (sBoatItem->Animation.Velocity > BOAT_MAX_BACK) + sBoatItem->Animation.Velocity += BOAT_REVERSE; } else if (TrInput & SBOAT_IN_ACCELERATE) { @@ -692,39 +692,39 @@ bool SpeedBoatUserControl(ITEM_INFO* laraItem, ITEM_INFO* sBoatItem) else maxVelocity = (TrInput & SBOAT_IN_SLOW) ? BOAT_SLOW_SPEED : BOAT_MAX_VELOCITY; - if (sBoatItem->Velocity < maxVelocity) - sBoatItem->Velocity += (BOAT_ACCELERATION / 2) + (BOAT_ACCELERATION * (sBoatItem->Velocity / (maxVelocity * 2))); - else if (sBoatItem->Velocity > maxVelocity + BOAT_SLOWDOWN) - sBoatItem->Velocity -= BOAT_SLOWDOWN; + if (sBoatItem->Animation.Velocity < maxVelocity) + sBoatItem->Animation.Velocity += (BOAT_ACCELERATION / 2) + (BOAT_ACCELERATION * (sBoatItem->Animation.Velocity / (maxVelocity * 2))); + else if (sBoatItem->Animation.Velocity > maxVelocity + BOAT_SLOWDOWN) + sBoatItem->Animation.Velocity -= BOAT_SLOWDOWN; } else if (TrInput & (SBOAT_IN_LEFT | SBOAT_IN_RIGHT) && - sBoatItem->Velocity >= 0 && - sBoatItem->Velocity < BOAT_MIN_SPEED) + sBoatItem->Animation.Velocity >= 0 && + sBoatItem->Animation.Velocity < BOAT_MIN_SPEED) { if (!(TrInput & SBOAT_IN_DISMOUNT) && - sBoatItem->Velocity == 0) - sBoatItem->Velocity = BOAT_MIN_SPEED; + sBoatItem->Animation.Velocity == 0) + sBoatItem->Animation.Velocity = BOAT_MIN_SPEED; } - else if (sBoatItem->Velocity > BOAT_SLOWDOWN) - sBoatItem->Velocity -= BOAT_SLOWDOWN; + else if (sBoatItem->Animation.Velocity > BOAT_SLOWDOWN) + sBoatItem->Animation.Velocity -= BOAT_SLOWDOWN; else - sBoatItem->Velocity = 0; + sBoatItem->Animation.Velocity = 0; } else { if (TrInput & (SBOAT_IN_LEFT | SBOAT_IN_RIGHT) && - sBoatItem->Velocity >= 0 && - sBoatItem->Velocity < BOAT_MIN_SPEED) + sBoatItem->Animation.Velocity >= 0 && + sBoatItem->Animation.Velocity < BOAT_MIN_SPEED) { - if (sBoatItem->Velocity == 0 && !(TrInput & SBOAT_IN_DISMOUNT)) - sBoatItem->Velocity = BOAT_MIN_SPEED; + if (sBoatItem->Animation.Velocity == 0 && !(TrInput & SBOAT_IN_DISMOUNT)) + sBoatItem->Animation.Velocity = BOAT_MIN_SPEED; } - else if (sBoatItem->Velocity > BOAT_SLOWDOWN) - sBoatItem->Velocity -= BOAT_SLOWDOWN; + else if (sBoatItem->Animation.Velocity > BOAT_SLOWDOWN) + sBoatItem->Animation.Velocity -= BOAT_SLOWDOWN; else - sBoatItem->Velocity = 0; + sBoatItem->Animation.Velocity = 0; - if (TrInput & IN_LOOK && sBoatItem->Velocity == 0) + if (TrInput & IN_LOOK && sBoatItem->Animation.Velocity == 0) LookUpDown(laraItem); } } @@ -738,49 +738,49 @@ void SpeedBoatAnimation(ITEM_INFO* laraItem, ITEM_INFO* sBoatItem, int collide) if (laraItem->HitPoints <= 0) { - if (laraItem->ActiveState != SBOAT_STATE_DEATH) + if (laraItem->Animation.ActiveState != SBOAT_STATE_DEATH) { - laraItem->AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_DEATH; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = laraItem->TargetState = SBOAT_STATE_DEATH; + laraItem->Animation.AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_DEATH; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = SBOAT_STATE_DEATH; } } - else if (sBoatItem->Position.yPos < sBoat->Water - CLICK(0.5f) && sBoatItem->VerticalVelocity > 0) + else if (sBoatItem->Position.yPos < sBoat->Water - CLICK(0.5f) && sBoatItem->Animation.VerticalVelocity > 0) { - if (laraItem->ActiveState != SBOAT_STATE_FALL) + if (laraItem->Animation.ActiveState != SBOAT_STATE_FALL) { - laraItem->AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_LEAP_START; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = laraItem->TargetState = SBOAT_STATE_FALL; + laraItem->Animation.AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_LEAP_START; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = SBOAT_STATE_FALL; } } else if (collide) { - if (laraItem->ActiveState != SBOAT_STATE_HIT) + if (laraItem->Animation.ActiveState != SBOAT_STATE_HIT) { - laraItem->AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + collide; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = laraItem->TargetState = SBOAT_STATE_HIT; + laraItem->Animation.AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + collide; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = SBOAT_STATE_HIT; } } else { - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case SBOAT_STATE_IDLE: if (TrInput & SBOAT_IN_DISMOUNT) { - if (sBoatItem->Velocity == 0) + if (sBoatItem->Animation.Velocity == 0) { if (TrInput & SBOAT_IN_RIGHT && TestSpeedBoatDismount(sBoatItem, sBoatItem->Position.yRot + ANGLE(90.0f))) - laraItem->TargetState = SBOAT_STATE_DISMOUNT_RIGHT; + laraItem->Animation.TargetState = SBOAT_STATE_DISMOUNT_RIGHT; else if (TrInput & SBOAT_IN_LEFT && TestSpeedBoatDismount(sBoatItem, sBoatItem->Position.yRot - ANGLE(90.0f))) - laraItem->TargetState = SBOAT_STATE_DISMOUNT_LEFT; + laraItem->Animation.TargetState = SBOAT_STATE_DISMOUNT_LEFT; } } - if (sBoatItem->Velocity > 0) - laraItem->TargetState = SBOAT_STATE_MOVING; + if (sBoatItem->Animation.Velocity > 0) + laraItem->Animation.TargetState = SBOAT_STATE_MOVING; break; @@ -788,32 +788,32 @@ void SpeedBoatAnimation(ITEM_INFO* laraItem, ITEM_INFO* sBoatItem, int collide) if (TrInput & SBOAT_IN_DISMOUNT) { if (TrInput & SBOAT_IN_RIGHT) - laraItem->TargetState = SBOAT_STATE_DISMOUNT_RIGHT; + laraItem->Animation.TargetState = SBOAT_STATE_DISMOUNT_RIGHT; else if (TrInput & SBOAT_IN_RIGHT) - laraItem->TargetState = SBOAT_STATE_DISMOUNT_LEFT; + laraItem->Animation.TargetState = SBOAT_STATE_DISMOUNT_LEFT; } - else if (sBoatItem->Velocity <= 0) - laraItem->TargetState = SBOAT_STATE_IDLE; + else if (sBoatItem->Animation.Velocity <= 0) + laraItem->Animation.TargetState = SBOAT_STATE_IDLE; break; case SBOAT_STATE_FALL: - laraItem->TargetState = SBOAT_STATE_MOVING; + laraItem->Animation.TargetState = SBOAT_STATE_MOVING; break; //case BOAT_TURNR: - if (sBoatItem->Velocity <= 0) - laraItem->TargetState = SBOAT_STATE_IDLE; + if (sBoatItem->Animation.Velocity <= 0) + laraItem->Animation.TargetState = SBOAT_STATE_IDLE; else if (!(TrInput & SBOAT_IN_RIGHT)) - laraItem->TargetState = SBOAT_STATE_MOVING; + laraItem->Animation.TargetState = SBOAT_STATE_MOVING; break; case SBOAT_STATE_TURN_LEFT: - if (sBoatItem->Velocity <= 0) - laraItem->TargetState = SBOAT_STATE_IDLE; + if (sBoatItem->Animation.Velocity <= 0) + laraItem->Animation.TargetState = SBOAT_STATE_IDLE; else if (!(TrInput & SBOAT_IN_LEFT)) - laraItem->TargetState = SBOAT_STATE_MOVING; + laraItem->Animation.TargetState = SBOAT_STATE_MOVING; break; } @@ -867,19 +867,19 @@ void SpeedBoatCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) return; case BoatMountType::WaterLeft: - laraItem->AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_MOUNT_LEFT; + laraItem->Animation.AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_MOUNT_LEFT; break; case BoatMountType::WaterRight: - laraItem->AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_MOUNT_RIGHT; + laraItem->Animation.AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_MOUNT_RIGHT; break; case BoatMountType::Jump: - laraItem->AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_MOUNT_JUMP; + laraItem->Animation.AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_MOUNT_JUMP; break; case BoatMountType::StartPosition: - laraItem->AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_IDLE; + laraItem->Animation.AnimNumber = Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex + SBOAT_ANIM_IDLE; break; } @@ -889,12 +889,12 @@ void SpeedBoatCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) laraItem->Position.xRot = 0; laraItem->Position.yRot = sBoatItem->Position.yRot; laraItem->Position.zRot = 0; - laraItem->Velocity = 0; - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = SBOAT_STATE_MOUNT; - laraItem->TargetState = SBOAT_STATE_MOUNT; + laraItem->Animation.Velocity = 0; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = SBOAT_STATE_MOUNT; + laraItem->Animation.TargetState = SBOAT_STATE_MOUNT; lara->Control.WaterStatus = WaterStatus::Dry; if (laraItem->RoomNumber != sBoatItem->RoomNumber) @@ -940,7 +940,7 @@ void SpeedBoatControl(short itemNumber) if (lara->Vehicle == itemNumber && laraItem->HitPoints > 0) { - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case SBOAT_STATE_MOUNT: case SBOAT_STATE_DISMOUNT_RIGHT: @@ -955,10 +955,10 @@ void SpeedBoatControl(short itemNumber) } else { - if (sBoatItem->Velocity > BOAT_SLOWDOWN) - sBoatItem->Velocity -= BOAT_SLOWDOWN; + if (sBoatItem->Animation.Velocity > BOAT_SLOWDOWN) + sBoatItem->Animation.Velocity -= BOAT_SLOWDOWN; else - sBoatItem->Velocity = 0; + sBoatItem->Animation.Velocity = 0; } if (noTurn) @@ -979,11 +979,11 @@ void SpeedBoatControl(short itemNumber) sBoat->LeftVerticalVelocity = DoSpeedBoatDynamics(heightFrontLeft, sBoat->LeftVerticalVelocity, (int*)&frontLeft.y); sBoat->RightVerticalVelocity = DoSpeedBoatDynamics(heightFrontRight, sBoat->RightVerticalVelocity, (int*)&frontRight.y); - sBoatItem->VerticalVelocity = DoSpeedBoatDynamics(sBoat->Water, sBoatItem->VerticalVelocity, (int*)&sBoatItem->Position.yPos); + sBoatItem->Animation.VerticalVelocity = DoSpeedBoatDynamics(sBoat->Water, sBoatItem->Animation.VerticalVelocity, (int*)&sBoatItem->Position.yPos); - auto ofs = sBoatItem->VerticalVelocity; - if (ofs - sBoatItem->VerticalVelocity > 32 && sBoatItem->VerticalVelocity == 0 && water != NO_HEIGHT) - SpeedBoatSplash(sBoatItem, ofs - sBoatItem->VerticalVelocity, water); + auto ofs = sBoatItem->Animation.VerticalVelocity; + if (ofs - sBoatItem->Animation.VerticalVelocity > 32 && sBoatItem->Animation.VerticalVelocity == 0 && water != NO_HEIGHT) + SpeedBoatSplash(sBoatItem, ofs - sBoatItem->Animation.VerticalVelocity, water); probe.Position.Floor = (frontLeft.y + frontRight.y); if (probe.Position.Floor < 0) @@ -1024,8 +1024,8 @@ void SpeedBoatControl(short itemNumber) if (laraItem->HitPoints > 0) { - sBoatItem->AnimNumber = Objects[ID_SPEEDBOAT].animIndex + (laraItem->AnimNumber - Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex); - sBoatItem->FrameNumber = g_Level.Anims[sBoatItem->AnimNumber].frameBase + (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase); + sBoatItem->Animation.AnimNumber = Objects[ID_SPEEDBOAT].animIndex + (laraItem->Animation.AnimNumber - Objects[ID_SPEEDBOAT_LARA_ANIMS].animIndex); + sBoatItem->Animation.FrameNumber = g_Level.Anims[sBoatItem->Animation.AnimNumber].frameBase + (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase); } Camera.targetElevation = -ANGLE(20.0f); @@ -1039,13 +1039,13 @@ void SpeedBoatControl(short itemNumber) sBoatItem->Position.zRot += sBoat->LeanAngle; } - auto pitch = sBoatItem->Velocity; + auto pitch = sBoatItem->Animation.Velocity; sBoat->Pitch += (pitch - sBoat->Pitch) / 4; - int fx = (sBoatItem->Velocity > 8) ? SFX_TR2_BOAT_MOVING : (drive ? SFX_TR2_BOAT_IDLE : SFX_TR2_BOAT_ACCELERATE); + int fx = (sBoatItem->Animation.Velocity > 8) ? SFX_TR2_BOAT_MOVING : (drive ? SFX_TR2_BOAT_IDLE : SFX_TR2_BOAT_ACCELERATE); SoundEffect(fx, &sBoatItem->Position, 0, sBoat->Pitch / (float)BOAT_MAX_VELOCITY); - if (sBoatItem->Velocity && (water - 5) == sBoatItem->Position.yPos) + if (sBoatItem->Animation.Velocity && (water - 5) == sBoatItem->Position.yPos) DoBoatWakeEffect(sBoatItem); if (lara->Vehicle != itemNumber) diff --git a/TR5Main/Objects/TR2/Vehicles/skidoo.cpp b/TR5Main/Objects/TR2/Vehicles/skidoo.cpp index 3ed659b33..d0f70e9e8 100644 --- a/TR5Main/Objects/TR2/Vehicles/skidoo.cpp +++ b/TR5Main/Objects/TR2/Vehicles/skidoo.cpp @@ -143,7 +143,7 @@ int GetSkidooMountType(ITEM_INFO* laraItem, ITEM_INFO* skidooItem, COLL_INFO* co if (!(TrInput & IN_ACTION) || lara->Control.HandStatus != HandStatus::Free || - laraItem->Airborne) + laraItem->Animation.Airborne) { return mountType = 0; } @@ -197,10 +197,10 @@ bool TestSkidooDismount(ITEM_INFO* laraItem, ITEM_INFO* skidooItem) if (lara->Vehicle != NO_ITEM) { - if ((laraItem->ActiveState == SKIDOO_STATE_DISMOUNT_RIGHT || laraItem->ActiveState == SKIDOO_STATE_DISMOUNT_LEFT) && - laraItem->FrameNumber == g_Level.Anims[laraItem->AnimNumber].frameEnd) + if ((laraItem->Animation.ActiveState == SKIDOO_STATE_DISMOUNT_RIGHT || laraItem->Animation.ActiveState == SKIDOO_STATE_DISMOUNT_LEFT) && + laraItem->Animation.FrameNumber == g_Level.Anims[laraItem->Animation.AnimNumber].frameEnd) { - if (laraItem->ActiveState == SKIDOO_STATE_DISMOUNT_LEFT) + if (laraItem->Animation.ActiveState == SKIDOO_STATE_DISMOUNT_LEFT) laraItem->Position.yRot += ANGLE(90.0f); else laraItem->Position.yRot -= ANGLE(90.0f); @@ -213,30 +213,30 @@ bool TestSkidooDismount(ITEM_INFO* laraItem, ITEM_INFO* skidooItem) lara->Vehicle = NO_ITEM; lara->Control.HandStatus = HandStatus::Free; } - else if (laraItem->ActiveState == SKIDOO_STATE_JUMP_OFF && + else if (laraItem->Animation.ActiveState == SKIDOO_STATE_JUMP_OFF && (skidooItem->Position.yPos == skidooItem->Floor || TestLastFrame(laraItem))) { SetAnimation(laraItem, LA_FREEFALL); if (skidooItem->Position.yPos == skidooItem->Floor) { - laraItem->TargetState = LS_DEATH; - laraItem->Velocity = 0; - laraItem->VerticalVelocity = DAMAGE_START + DAMAGE_LENGTH; + laraItem->Animation.TargetState = LS_DEATH; + laraItem->Animation.Velocity = 0; + laraItem->Animation.VerticalVelocity = DAMAGE_START + DAMAGE_LENGTH; SkidooExplode(laraItem, skidooItem); } else { - laraItem->TargetState = LS_FREEFALL; + laraItem->Animation.TargetState = LS_FREEFALL; laraItem->Position.yPos -= 200; - laraItem->Velocity = skidooItem->Velocity; - laraItem->VerticalVelocity = skidooItem->VerticalVelocity; + laraItem->Animation.Velocity = skidooItem->Animation.Velocity; + laraItem->Animation.VerticalVelocity = skidooItem->Animation.VerticalVelocity; SoundEffect(SFX_TR4_LARA_FALL, &laraItem->Position, 0); } laraItem->Position.xRot = 0; laraItem->Position.zRot = 0; - laraItem->Airborne = true; + laraItem->Animation.Airborne = true; lara->Control.HandStatus = HandStatus::Free; lara->Control.MoveAngle = skidooItem->Position.yRot; skidooItem->Flags |= ONESHOT; @@ -310,12 +310,12 @@ void SkidooCollision(short itemNum, ITEM_INFO* laraItem, COLL_INFO* coll) } if (mountType == 1) - laraItem->AnimNumber = Objects[ID_SNOWMOBILE_LARA_ANIMS].animIndex + SKIDOO_ANIM_MOUNT_RIGHT; + laraItem->Animation.AnimNumber = Objects[ID_SNOWMOBILE_LARA_ANIMS].animIndex + SKIDOO_ANIM_MOUNT_RIGHT; else if (mountType == 2) - laraItem->AnimNumber = Objects[ID_SNOWMOBILE_LARA_ANIMS].animIndex + SKIDOO_ANIM_MOUNT_LEFT; + laraItem->Animation.AnimNumber = Objects[ID_SNOWMOBILE_LARA_ANIMS].animIndex + SKIDOO_ANIM_MOUNT_LEFT; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = SKIDOO_STATE_MOUNT; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = SKIDOO_STATE_MOUNT; laraItem->Position.xPos = skidooItem->Position.xPos; laraItem->Position.yPos = skidooItem->Position.yPos; laraItem->Position.zPos = skidooItem->Position.zPos; @@ -483,7 +483,7 @@ bool SkidooControl(ITEM_INFO* laraItem, COLL_INFO* coll) TrInput &= ~(IN_LEFT | IN_RIGHT | IN_BACK | IN_FORWARD); dead = true; } - else if (laraItem->ActiveState == SKIDOO_STATE_JUMP_OFF) + else if (laraItem->Animation.ActiveState == SKIDOO_STATE_JUMP_OFF) { dead = true; collide = 0; @@ -499,7 +499,7 @@ bool SkidooControl(ITEM_INFO* laraItem, COLL_INFO* coll) } else { - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case SKIDOO_STATE_MOUNT: case SKIDOO_STATE_DISMOUNT_RIGHT: @@ -536,7 +536,7 @@ bool SkidooControl(ITEM_INFO* laraItem, COLL_INFO* coll) skidoo->LeftVerticalVelocity = DoSkidooDynamics(heightFrontLeft, skidoo->LeftVerticalVelocity, (int*)&frontLeft.y); skidoo->RightVerticalVelocity = DoSkidooDynamics(heightFrontRight, skidoo->RightVerticalVelocity, (int*)&frontRight.y); - skidooItem->VerticalVelocity = DoSkidooDynamics(height, skidooItem->VerticalVelocity, (int*)&skidooItem->Position.yPos); + skidooItem->Animation.VerticalVelocity = DoSkidooDynamics(height, skidooItem->Animation.VerticalVelocity, (int*)&skidooItem->Position.yPos); height = (frontLeft.y + frontRight.y) / 2; short xRot = phd_atan(SKIDOO_FRONT, skidooItem->Position.yPos - height); @@ -569,7 +569,7 @@ bool SkidooControl(ITEM_INFO* laraItem, COLL_INFO* coll) ItemNewRoom(lara->ItemNumber, probe.RoomNumber); } - if (laraItem->ActiveState != SKIDOO_STATE_FALLOFF) + if (laraItem->Animation.ActiveState != SKIDOO_STATE_FALLOFF) { laraItem->Position.xPos = skidooItem->Position.xPos; laraItem->Position.yPos = skidooItem->Position.yPos; @@ -594,20 +594,20 @@ bool SkidooControl(ITEM_INFO* laraItem, COLL_INFO* coll) if (!dead) { - skidooItem->AnimNumber = Objects[ID_SNOWMOBILE].animIndex + (laraItem->AnimNumber - Objects[ID_SNOWMOBILE_LARA_ANIMS].animIndex); - skidooItem->FrameNumber = g_Level.Anims[skidooItem->AnimNumber].frameBase + (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase); + skidooItem->Animation.AnimNumber = Objects[ID_SNOWMOBILE].animIndex + (laraItem->Animation.AnimNumber - Objects[ID_SNOWMOBILE_LARA_ANIMS].animIndex); + skidooItem->Animation.FrameNumber = g_Level.Anims[skidooItem->Animation.AnimNumber].frameBase + (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase); } else { - skidooItem->AnimNumber = Objects[ID_SNOWMOBILE].animIndex + SKIDOO_ANIM_IDLE; - skidooItem->FrameNumber = g_Level.Anims[skidooItem->AnimNumber].frameBase; + skidooItem->Animation.AnimNumber = Objects[ID_SNOWMOBILE].animIndex + SKIDOO_ANIM_IDLE; + skidooItem->Animation.FrameNumber = g_Level.Anims[skidooItem->Animation.AnimNumber].frameBase; } - if (skidooItem->Velocity && skidooItem->Floor == skidooItem->Position.yPos) + if (skidooItem->Animation.Velocity && skidooItem->Floor == skidooItem->Position.yPos) { DoSnowEffect(skidooItem); - if (skidooItem->Velocity < 50) + if (skidooItem->Animation.Velocity < 50) DoSnowEffect(skidooItem); } @@ -623,9 +623,9 @@ bool SkidooUserControl(ITEM_INFO* laraItem, ITEM_INFO* skidooItem, int height, i if (skidooItem->Position.yPos >= (height - CLICK(1))) { - *pitch = skidooItem->Velocity + (height - skidooItem->Position.yPos); + *pitch = skidooItem->Animation.Velocity + (height - skidooItem->Position.yPos); - if (TrInput & IN_LOOK && skidooItem->Velocity == 0) + if (TrInput & IN_LOOK && skidooItem->Animation.Velocity == 0) LookUpDown(laraItem); if ((TrInput & SKIDOO_IN_LEFT && !(TrInput & SKIDOO_IN_BRAKE)) || @@ -646,12 +646,12 @@ bool SkidooUserControl(ITEM_INFO* laraItem, ITEM_INFO* skidooItem, int height, i if (TrInput & SKIDOO_IN_BRAKE) { - if (skidooItem->Velocity > 0) - skidooItem->Velocity -= SKIDOO_BRAKE; + if (skidooItem->Animation.Velocity > 0) + skidooItem->Animation.Velocity -= SKIDOO_BRAKE; else { - if (skidooItem->Velocity > SKIDOO_MAX_BACK) - skidooItem->Velocity += SKIDOO_REVERSE; + if (skidooItem->Animation.Velocity > SKIDOO_MAX_BACK) + skidooItem->Animation.Velocity += SKIDOO_REVERSE; drive = true; } @@ -665,27 +665,27 @@ bool SkidooUserControl(ITEM_INFO* laraItem, ITEM_INFO* skidooItem, int height, i else maxVelocity = SKIDOO_MAX_VELOCITY; - if (skidooItem->Velocity < maxVelocity) - skidooItem->Velocity += (SKIDOO_ACCELERATION / 2) + (SKIDOO_ACCELERATION * (skidooItem->Velocity / (2 * maxVelocity))); - else if (skidooItem->Velocity > (maxVelocity + SKIDOO_SLOWDOWN)) - skidooItem->Velocity -= SKIDOO_SLOWDOWN; + if (skidooItem->Animation.Velocity < maxVelocity) + skidooItem->Animation.Velocity += (SKIDOO_ACCELERATION / 2) + (SKIDOO_ACCELERATION * (skidooItem->Animation.Velocity / (2 * maxVelocity))); + else if (skidooItem->Animation.Velocity > (maxVelocity + SKIDOO_SLOWDOWN)) + skidooItem->Animation.Velocity -= SKIDOO_SLOWDOWN; drive = true; } else if (TrInput & (SKIDOO_IN_LEFT | SKIDOO_IN_RIGHT) && - skidooItem->Velocity >= 0 && - skidooItem->Velocity < SKIDOO_MIN_VELOCITY) + skidooItem->Animation.Velocity >= 0 && + skidooItem->Animation.Velocity < SKIDOO_MIN_VELOCITY) { - skidooItem->Velocity = SKIDOO_MIN_VELOCITY; + skidooItem->Animation.Velocity = SKIDOO_MIN_VELOCITY; drive = true; } - else if (skidooItem->Velocity > SKIDOO_SLOWDOWN) + else if (skidooItem->Animation.Velocity > SKIDOO_SLOWDOWN) { - skidooItem->Velocity -= SKIDOO_SLOWDOWN; - if ((GetRandomControl() & 0x7f) < skidooItem->Velocity) + skidooItem->Animation.Velocity -= SKIDOO_SLOWDOWN; + if ((GetRandomControl() & 0x7f) < skidooItem->Animation.Velocity) drive = true; } else - skidooItem->Velocity = 0; + skidooItem->Animation.Velocity = 0; } else if (TrInput & (SKIDOO_IN_ACCELERATE | SKIDOO_IN_BRAKE)) { @@ -700,104 +700,104 @@ void SkidooAnimation(ITEM_INFO* laraItem, ITEM_INFO* skidooItem, int collide, bo { auto* skidoo = (SkidooInfo*)skidooItem->Data; - if (laraItem->ActiveState != SKIDOO_STATE_FALL && + if (laraItem->Animation.ActiveState != SKIDOO_STATE_FALL && skidooItem->Position.yPos != skidooItem->Floor && - skidooItem->VerticalVelocity > 0 && + skidooItem->Animation.VerticalVelocity > 0 && !dead) { - laraItem->AnimNumber = Objects[ID_SNOWMOBILE_LARA_ANIMS].animIndex + SKIDOO_ANIM_LEAP_START; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = SKIDOO_STATE_FALL; - laraItem->TargetState = SKIDOO_STATE_FALL; + laraItem->Animation.AnimNumber = Objects[ID_SNOWMOBILE_LARA_ANIMS].animIndex + SKIDOO_ANIM_LEAP_START; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = SKIDOO_STATE_FALL; + laraItem->Animation.TargetState = SKIDOO_STATE_FALL; } - else if (laraItem->ActiveState != SKIDOO_STATE_FALL && + else if (laraItem->Animation.ActiveState != SKIDOO_STATE_FALL && collide && !dead) { - if (laraItem->ActiveState != SKIDOO_STATE_HIT) + if (laraItem->Animation.ActiveState != SKIDOO_STATE_HIT) { if (collide == SKIDOO_ANIM_HIT_FRONT) SoundEffect(SFX_TR2_CLATTER_1, &skidooItem->Position, 0); else SoundEffect(SFX_TR2_CLATTER_2, &skidooItem->Position, 0); - laraItem->AnimNumber = Objects[ID_SNOWMOBILE_LARA_ANIMS].animIndex + collide; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = laraItem->TargetState = SKIDOO_STATE_HIT; + laraItem->Animation.AnimNumber = Objects[ID_SNOWMOBILE_LARA_ANIMS].animIndex + collide; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = SKIDOO_STATE_HIT; } } else { - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case SKIDOO_STATE_IDLE: if (dead) { - laraItem->TargetState = SKIDOO_STATE_DEATH; + laraItem->Animation.TargetState = SKIDOO_STATE_DEATH; break; } - laraItem->TargetState = SKIDOO_STATE_IDLE; + laraItem->Animation.TargetState = SKIDOO_STATE_IDLE; if (TrInput & SKIDOO_IN_DISMOUNT) { if (TrInput & SKIDOO_IN_RIGHT && TestSkidooDismountOK(skidooItem, SKIDOO_STATE_DISMOUNT_RIGHT)) { - laraItem->TargetState = SKIDOO_STATE_DISMOUNT_RIGHT; - skidooItem->Velocity = 0; + laraItem->Animation.TargetState = SKIDOO_STATE_DISMOUNT_RIGHT; + skidooItem->Animation.Velocity = 0; } else if (TrInput & SKIDOO_IN_LEFT && TestSkidooDismountOK(skidooItem, SKIDOO_STATE_DISMOUNT_LEFT)) { - laraItem->TargetState = SKIDOO_STATE_DISMOUNT_LEFT; - skidooItem->Velocity = 0; + laraItem->Animation.TargetState = SKIDOO_STATE_DISMOUNT_LEFT; + skidooItem->Animation.Velocity = 0; } } else if (TrInput & SKIDOO_IN_LEFT) - laraItem->TargetState = SKIDOO_STATE_LEFT; + laraItem->Animation.TargetState = SKIDOO_STATE_LEFT; else if (TrInput & SKIDOO_IN_RIGHT) - laraItem->TargetState = SKIDOO_STATE_RIGHT; + laraItem->Animation.TargetState = SKIDOO_STATE_RIGHT; else if (TrInput & (SKIDOO_IN_ACCELERATE | SKIDOO_IN_BRAKE)) - laraItem->TargetState = SKIDOO_STATE_SIT; + laraItem->Animation.TargetState = SKIDOO_STATE_SIT; break; case SKIDOO_STATE_SIT: - if (skidooItem->Velocity == 0) - laraItem->TargetState = SKIDOO_STATE_IDLE; + if (skidooItem->Animation.Velocity == 0) + laraItem->Animation.TargetState = SKIDOO_STATE_IDLE; if (dead) - laraItem->TargetState = SKIDOO_STATE_FALLOFF; + laraItem->Animation.TargetState = SKIDOO_STATE_FALLOFF; else if (TrInput & SKIDOO_IN_LEFT) - laraItem->TargetState = SKIDOO_STATE_LEFT; + laraItem->Animation.TargetState = SKIDOO_STATE_LEFT; else if (TrInput & SKIDOO_IN_RIGHT) - laraItem->TargetState = SKIDOO_STATE_RIGHT; + laraItem->Animation.TargetState = SKIDOO_STATE_RIGHT; break; case SKIDOO_STATE_LEFT: if (!(TrInput & SKIDOO_IN_LEFT)) - laraItem->TargetState = SKIDOO_STATE_SIT; + laraItem->Animation.TargetState = SKIDOO_STATE_SIT; break; case SKIDOO_STATE_RIGHT: if (!(TrInput & SKIDOO_IN_RIGHT)) - laraItem->TargetState = SKIDOO_STATE_SIT; + laraItem->Animation.TargetState = SKIDOO_STATE_SIT; break; case SKIDOO_STATE_FALL: - if (skidooItem->VerticalVelocity <= 0 || + if (skidooItem->Animation.VerticalVelocity <= 0 || skidoo->LeftVerticalVelocity <= 0 || skidoo->RightVerticalVelocity <= 0) { - laraItem->TargetState = SKIDOO_STATE_SIT; + laraItem->Animation.TargetState = SKIDOO_STATE_SIT; SoundEffect(SFX_TR2_CLATTER_3, &skidooItem->Position, 0); } - else if (skidooItem->VerticalVelocity > (DAMAGE_START + DAMAGE_LENGTH)) - laraItem->TargetState = SKIDOO_STATE_JUMP_OFF; + else if (skidooItem->Animation.VerticalVelocity > (DAMAGE_START + DAMAGE_LENGTH)) + laraItem->Animation.TargetState = SKIDOO_STATE_JUMP_OFF; break; } @@ -806,7 +806,7 @@ void SkidooAnimation(ITEM_INFO* laraItem, ITEM_INFO* skidooItem, int collide, bo if (TestEnvironment(ENV_FLAG_WATER, skidooItem) || TestEnvironment(ENV_FLAG_SWAMP, skidooItem)) { - laraItem->TargetState = SKIDOO_STATE_JUMP_OFF; + laraItem->Animation.TargetState = SKIDOO_STATE_JUMP_OFF; laraItem->HitPoints = 0; laraItem->RoomNumber = skidooItem->RoomNumber; SkidooExplode(laraItem, skidooItem); @@ -928,12 +928,12 @@ short DoSkidooShift(ITEM_INFO* skidooItem, PHD_VECTOR* pos, PHD_VECTOR* old) { skidooItem->Position.zPos += z; skidooItem->Position.xPos += x; - skidooItem->Velocity -= 50; + skidooItem->Animation.Velocity -= 50; } else if (z) { skidooItem->Position.zPos += z; - skidooItem->Velocity -= 50; + skidooItem->Animation.Velocity -= 50; if (z > 0) return (skidooItem->Position.xPos - pos->x); @@ -943,7 +943,7 @@ short DoSkidooShift(ITEM_INFO* skidooItem, PHD_VECTOR* pos, PHD_VECTOR* old) else if (x) { skidooItem->Position.xPos += x; - skidooItem->Velocity -= 50; + skidooItem->Animation.Velocity -= 50; if (x > 0) return (pos->z - skidooItem->Position.zPos); @@ -954,7 +954,7 @@ short DoSkidooShift(ITEM_INFO* skidooItem, PHD_VECTOR* pos, PHD_VECTOR* old) { skidooItem->Position.zPos += old->z - pos->z; skidooItem->Position.xPos += old->x - pos->x; - skidooItem->Velocity -= 50; + skidooItem->Animation.Velocity -= 50; } } @@ -1024,8 +1024,8 @@ int SkidooDynamics(ITEM_INFO* laraItem, ITEM_INFO* skidooItem) else skidooItem->Position.yRot += skidoo->TurnRate + skidoo->ExtraRotation; - skidooItem->Position.zPos += skidooItem->Velocity * phd_cos(skidoo->MomentumAngle); - skidooItem->Position.xPos += skidooItem->Velocity * phd_sin(skidoo->MomentumAngle); + skidooItem->Position.zPos += skidooItem->Animation.Velocity * phd_cos(skidoo->MomentumAngle); + skidooItem->Position.xPos += skidooItem->Animation.Velocity * phd_sin(skidoo->MomentumAngle); int slip = SKIDOO_SLIP * phd_sin(skidooItem->Position.xRot); if (abs(slip) > (SKIDOO_SLIP / 2)) @@ -1076,20 +1076,20 @@ int SkidooDynamics(ITEM_INFO* laraItem, ITEM_INFO* skidooItem) if (collide) { int newVelocity = (skidooItem->Position.zPos - old.z) * phd_cos(skidoo->MomentumAngle) + (skidooItem->Position.xPos - old.x) * phd_sin(skidoo->MomentumAngle); - if (skidooItem->Velocity > (SKIDOO_MAX_VELOCITY + SKIDOO_ACCELERATION) && - newVelocity < (skidooItem->Velocity - 10)) + if (skidooItem->Animation.Velocity > (SKIDOO_MAX_VELOCITY + SKIDOO_ACCELERATION) && + newVelocity < (skidooItem->Animation.Velocity - 10)) { - laraItem->HitPoints -= (skidooItem->Velocity - newVelocity) / 2; + laraItem->HitPoints -= (skidooItem->Animation.Velocity - newVelocity) / 2; laraItem->HitStatus = true; } - if (skidooItem->Velocity > 0 && newVelocity < skidooItem->Velocity) - skidooItem->Velocity = (newVelocity < 0) ? 0 : newVelocity; - else if (skidooItem->Velocity < 0 && newVelocity > skidooItem->Velocity) - skidooItem->Velocity = (newVelocity > 0) ? 0 : newVelocity; + if (skidooItem->Animation.Velocity > 0 && newVelocity < skidooItem->Animation.Velocity) + skidooItem->Animation.Velocity = (newVelocity < 0) ? 0 : newVelocity; + else if (skidooItem->Animation.Velocity < 0 && newVelocity > skidooItem->Animation.Velocity) + skidooItem->Animation.Velocity = (newVelocity > 0) ? 0 : newVelocity; - if (skidooItem->Velocity < SKIDOO_MAX_BACK) - skidooItem->Velocity = SKIDOO_MAX_BACK; + if (skidooItem->Animation.Velocity < SKIDOO_MAX_BACK) + skidooItem->Animation.Velocity = SKIDOO_MAX_BACK; } return collide; diff --git a/TR5Main/Objects/TR3/Entity/tr3_civvy.cpp b/TR5Main/Objects/TR3/Entity/tr3_civvy.cpp index c4e3e9a43..a4e638200 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_civvy.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_civvy.cpp @@ -67,9 +67,9 @@ void InitialiseCivvy(short itemNumber) InitialiseCreature(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_STOP_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = item->TargetState = CIVVY_STOP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_STOP_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = item->Animation.TargetState = CIVVY_STOP; } void CivvyControl(short itemNumber) @@ -94,11 +94,11 @@ void CivvyControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != CIVVY_DEATH) + if (item->Animation.ActiveState != CIVVY_DEATH) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_DIE_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = CIVVY_DEATH; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_DIE_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = CIVVY_DEATH; creature->LOT.Step = CLICK(1); } } @@ -152,12 +152,12 @@ void CivvyControl(short itemNumber) } creature->Enemy = realEnemy; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case CIVVY_WAIT: - if (creature->Alerted || item->TargetState == CIVVY_RUN) + if (creature->Alerted || item->Animation.TargetState == CIVVY_RUN) { - item->TargetState = CIVVY_STOP; + item->Animation.TargetState = CIVVY_STOP; break; } @@ -171,43 +171,43 @@ void CivvyControl(short itemNumber) head = AIGuard(creature); if (!(GetRandomControl() & 0xFF)) { - if (item->ActiveState == CIVVY_STOP) - item->TargetState = CIVVY_WAIT; + if (item->Animation.ActiveState == CIVVY_STOP) + item->Animation.TargetState = CIVVY_WAIT; else - item->TargetState = CIVVY_STOP; + item->Animation.TargetState = CIVVY_STOP; } break; } else if (item->AIBits & PATROL1) - item->TargetState = CIVVY_WALK; + item->Animation.TargetState = CIVVY_WALK; else if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && AI.ahead) - item->TargetState = CIVVY_STOP; + item->Animation.TargetState = CIVVY_STOP; else - item->TargetState = CIVVY_RUN; + item->Animation.TargetState = CIVVY_RUN; } else if (creature->Mood == MoodType::Bored || (item->AIBits & FOLLOW && (creature->ReachedGoal || laraAiInfo.distance > pow(SECTOR(2), 2)))) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.ahead) - item->TargetState = CIVVY_STOP; + item->Animation.TargetState = CIVVY_STOP; else - item->TargetState = CIVVY_RUN; + item->Animation.TargetState = CIVVY_RUN; } else if (AI.bite && AI.distance < CIVVY_ATTACK0_RANGE) - item->TargetState = CIVVY_AIM0; + item->Animation.TargetState = CIVVY_AIM0; else if (AI.bite && AI.distance < CIVVY_ATTACK1_RANGE) - item->TargetState = CIVVY_AIM1; + item->Animation.TargetState = CIVVY_AIM1; else if (AI.bite && AI.distance < CIVVY_WALK_RANGE) - item->TargetState = CIVVY_WALK; + item->Animation.TargetState = CIVVY_WALK; else - item->TargetState = CIVVY_RUN; + item->Animation.TargetState = CIVVY_RUN; break; @@ -217,25 +217,25 @@ void CivvyControl(short itemNumber) if (item->AIBits & PATROL1) { - item->TargetState = CIVVY_WALK; + item->Animation.TargetState = CIVVY_WALK; head = 0; } else if (creature->Mood == MoodType::Escape) - item->TargetState = CIVVY_RUN; + item->Animation.TargetState = CIVVY_RUN; else if (creature->Mood == MoodType::Bored) { if (GetRandomControl() < CIVVY_WAIT_CHANCE) { - item->RequiredState = CIVVY_WAIT; - item->TargetState = CIVVY_STOP; + item->Animation.RequiredState = CIVVY_WAIT; + item->Animation.TargetState = CIVVY_STOP; } } else if (AI.bite && AI.distance < CIVVY_ATTACK0_RANGE) - item->TargetState = CIVVY_STOP; + item->Animation.TargetState = CIVVY_STOP; else if (AI.bite && AI.distance < CIVVY_ATTACK2_RANGE) - item->TargetState = CIVVY_AIM2; + item->Animation.TargetState = CIVVY_AIM2; else - item->TargetState = CIVVY_RUN; + item->Animation.TargetState = CIVVY_RUN; break; @@ -247,19 +247,19 @@ void CivvyControl(short itemNumber) head = AI.angle; if (item->AIBits & GUARD) - item->TargetState = CIVVY_WAIT; + item->Animation.TargetState = CIVVY_WAIT; else if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && AI.ahead) - item->TargetState = CIVVY_STOP; + item->Animation.TargetState = CIVVY_STOP; break; } else if ((item->AIBits & FOLLOW) && (creature->ReachedGoal || laraAiInfo.distance > pow(SECTOR(2), 2))) - item->TargetState = CIVVY_STOP; + item->Animation.TargetState = CIVVY_STOP; else if (creature->Mood == MoodType::Bored) - item->TargetState = CIVVY_WALK; + item->Animation.TargetState = CIVVY_WALK; else if (AI.ahead && AI.distance < CIVVY_WALK_RANGE) - item->TargetState = CIVVY_WALK; + item->Animation.TargetState = CIVVY_WALK; break; @@ -273,9 +273,9 @@ void CivvyControl(short itemNumber) } if (AI.bite && AI.distance < CIVVY_ATTACK0_RANGE) - item->TargetState = CIVVY_PUNCH0; + item->Animation.TargetState = CIVVY_PUNCH0; else - item->TargetState = CIVVY_STOP; + item->Animation.TargetState = CIVVY_STOP; creature->Flags = 0; break; @@ -290,9 +290,9 @@ void CivvyControl(short itemNumber) } if (AI.ahead && AI.distance < CIVVY_ATTACK1_RANGE) - item->TargetState = CIVVY_PUNCH1; + item->Animation.TargetState = CIVVY_PUNCH1; else - item->TargetState = CIVVY_STOP; + item->Animation.TargetState = CIVVY_STOP; creature->Flags = 0; break; @@ -308,9 +308,9 @@ void CivvyControl(short itemNumber) } if (AI.bite && AI.distance < CIVVY_ATTACK2_RANGE) - item->TargetState = CIVVY_PUNCH2; + item->Animation.TargetState = CIVVY_PUNCH2; else - item->TargetState = CIVVY_WALK; + item->Animation.TargetState = CIVVY_WALK; break; @@ -355,7 +355,7 @@ void CivvyControl(short itemNumber) } if (AI.ahead && AI.distance > CIVVY_ATTACK1_RANGE&& AI.distance < CIVVY_ATTACK2_RANGE) - item->TargetState = CIVVY_PUNCH2; + item->Animation.TargetState = CIVVY_PUNCH2; break; @@ -387,36 +387,36 @@ void CivvyControl(short itemNumber) CreatureJoint(item, 1, torsoX); CreatureJoint(item, 2, head); - if (item->ActiveState < CIVVY_DEATH) + if (item->Animation.ActiveState < CIVVY_DEATH) { switch (CreatureVault(itemNumber, angle, 2, CIVVY_VAULT_SHIFT)) { case 2: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_CLIMB1_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = CIVVY_CLIMB1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_CLIMB1_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = CIVVY_CLIMB1; break; case 3: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_CLIMB2_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = CIVVY_CLIMB2; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_CLIMB2_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = CIVVY_CLIMB2; break; case 4: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_CLIMB3_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = CIVVY_CLIMB3; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_CLIMB3_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = CIVVY_CLIMB3; break; case -4: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_FALL3_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = CIVVY_FALL3; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + CIVVY_FALL3_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = CIVVY_FALL3; break; } } diff --git a/TR5Main/Objects/TR3/Entity/tr3_cobra.cpp b/TR5Main/Objects/TR3/Entity/tr3_cobra.cpp index 448b7fc52..3c5c6cf6d 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_cobra.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_cobra.cpp @@ -30,9 +30,9 @@ void InitialiseCobra(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 2; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase + 45; - item->ActiveState = item->TargetState = 3; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 2; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase + 45; + item->Animation.ActiveState = item->Animation.TargetState = 3; item->ItemFlags[2] = item->HitStatus; } @@ -50,11 +50,11 @@ void CobraControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 4) + if (item->Animation.ActiveState != 4) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 4; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 4; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 4; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 4; } } else @@ -81,17 +81,17 @@ void CobraControl(short itemNumber) else item->Position.yRot += ANGLE(10.0f); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: info->Flags = 0; if (AI.distance > pow(SECTOR(2.5f), 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (LaraItem->HitPoints > 0 && - ((AI.ahead && AI.distance < pow(SECTOR(1), 2)) || item->HitStatus || LaraItem->Velocity > 15)) + ((AI.ahead && AI.distance < pow(SECTOR(1), 2)) || item->HitStatus || LaraItem->Animation.Velocity > 15)) { - item->TargetState = 2; + item->Animation.TargetState = 2; } break; @@ -106,7 +106,7 @@ void CobraControl(short itemNumber) } if (AI.distance < pow(SECTOR(1.5f), 2) && LaraItem->HitPoints > 0) { - item->TargetState = 0; + item->Animation.TargetState = 0; item->HitPoints = item->ItemFlags[2]; } diff --git a/TR5Main/Objects/TR3/Entity/tr3_flamethrower.cpp b/TR5Main/Objects/TR3/Entity/tr3_flamethrower.cpp index d2cebf319..8038b064f 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_flamethrower.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_flamethrower.cpp @@ -233,7 +233,7 @@ void FlameThrowerControl(short itemNumber) GetJointAbsPosition(item, &pos, FlamethrowerBite.meshNum); int random = GetRandomControl(); - if (item->ActiveState != 6 && item->ActiveState != 11) + if (item->Animation.ActiveState != 6 && item->Animation.ActiveState != 11) { TriggerDynamicLight(pos.x, pos.y, pos.z, (random & 3) + 6, 24 - ((random / 16) & 3), 16 - ((random / 64) & 3), random & 3); TriggerPilotFlame(itemNumber); @@ -243,11 +243,11 @@ void FlameThrowerControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 7) + if (item->Animation.ActiveState != 7) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 19; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 7; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 19; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 7; } } else @@ -323,7 +323,7 @@ void FlameThrowerControl(short itemNumber) AlertAllGuards(itemNumber); } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->MaxTurn = 0; @@ -335,25 +335,25 @@ void FlameThrowerControl(short itemNumber) head = AIGuard(creature); if (!(GetRandomControl() & 0xFF)) - item->TargetState = 4; + item->Animation.TargetState = 4; break; } else if (item->AIBits & PATROL1) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (creature->Mood == MoodType::Escape) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (Targetable(item, &AI) && (realEnemy != LaraItem || creature->HurtByLara)) { if (AI.distance < pow(SECTOR(4), 2)) - item->TargetState = 10; + item->Animation.TargetState = 10; else - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (creature->Mood == MoodType::Bored && AI.ahead && !(GetRandomControl() & 0xFF)) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (creature->Mood == MoodType::Attack || !(GetRandomControl() & 0xFF)) - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -365,7 +365,7 @@ void FlameThrowerControl(short itemNumber) head = AIGuard(creature); if (!(GetRandomControl() & 0xFF)) - item->TargetState = 1; + item->Animation.TargetState = 1; break; } @@ -375,7 +375,7 @@ void FlameThrowerControl(short itemNumber) creature->Mood != MoodType::Bored || !(GetRandomControl() & 0xFF))) { - item->TargetState = 1; + item->Animation.TargetState = 1; } break; @@ -387,27 +387,27 @@ void FlameThrowerControl(short itemNumber) if (item->AIBits & GUARD) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 12; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 1; - item->TargetState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 12; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 1; + item->Animation.TargetState = 1; } else if (item->AIBits & PATROL1) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (creature->Mood == MoodType::Escape) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (Targetable(item, &AI) && (realEnemy != LaraItem || creature->HurtByLara)) { if (AI.distance < pow(SECTOR(4), 2)) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 9; + item->Animation.TargetState = 9; } else if (creature->Mood == MoodType::Bored && AI.ahead) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -423,10 +423,10 @@ void FlameThrowerControl(short itemNumber) AI.distance < pow(SECTOR(4), 2) && (realEnemy != LaraItem || creature->HurtByLara)) { - item->TargetState = 11; + item->Animation.TargetState = 11; } else - item->TargetState = 1; + item->Animation.TargetState = 1; } break; @@ -443,10 +443,10 @@ void FlameThrowerControl(short itemNumber) AI.distance < pow(SECTOR(4), 2) && (realEnemy != LaraItem || creature->HurtByLara)) { - item->TargetState = 6; + item->Animation.TargetState = 6; } else - item->TargetState = 2; + item->Animation.TargetState = 2; } break; @@ -464,13 +464,13 @@ void FlameThrowerControl(short itemNumber) AI.distance < pow(SECTOR(4), 2) && (realEnemy != LaraItem || creature->HurtByLara)) { - item->TargetState = 11; + item->Animation.TargetState = 11; } else - item->TargetState = 1; + item->Animation.TargetState = 1; } else - item->TargetState = 1; + item->Animation.TargetState = 1; if (creature->Flags < 40) TriggerFlameThrower(item, &FlamethrowerBite, creature->Flags); @@ -499,13 +499,13 @@ void FlameThrowerControl(short itemNumber) AI.distance < pow(SECTOR(4), 2) && (realEnemy != LaraItem || creature->HurtByLara)) { - item->TargetState = 6; + item->Animation.TargetState = 6; } else - item->TargetState = 2; + item->Animation.TargetState = 2; } else - item->TargetState = 2; + item->Animation.TargetState = 2; if (creature->Flags < 40) TriggerFlameThrower(item, &FlamethrowerBite, creature->Flags); diff --git a/TR5Main/Objects/TR3/Entity/tr3_monkey.cpp b/TR5Main/Objects/TR3/Entity/tr3_monkey.cpp index 2c183e6b8..dac513bde 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_monkey.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_monkey.cpp @@ -20,10 +20,10 @@ void InitialiseMonkey(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[ID_MONKEY].animIndex + 2; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 6; - item->TargetState = 6; + item->Animation.AnimNumber = Objects[ID_MONKEY].animIndex + 2; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 6; + item->Animation.TargetState = 6; } void MonkeyControl(short itemNumber) @@ -42,12 +42,12 @@ void MonkeyControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 11) + if (item->Animation.ActiveState != 11) { item->MeshBits = -1; - item->AnimNumber = Objects[ID_MONKEY].animIndex + 14; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 11; + item->Animation.AnimNumber = Objects[ID_MONKEY].animIndex + 14; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 11; } } else @@ -139,7 +139,7 @@ void MonkeyControl(short itemNumber) creature->Enemy = enemy; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 6: creature->Flags = 0; @@ -152,47 +152,47 @@ void MonkeyControl(short itemNumber) if (!(GetRandomControl() & 0xF)) { if (GetRandomControl() & 0x1) - item->TargetState = 8; + item->Animation.TargetState = 8; else - item->TargetState = 7; + item->Animation.TargetState = 7; } break; } else if (item->AIBits & PATROL1) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (creature->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (creature->Mood == MoodType::Bored) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (!(GetRandomControl() & 0xF)) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (!(GetRandomControl() & 0xF)) { if (GetRandomControl() & 0x1) - item->TargetState = 8; + item->Animation.TargetState = 8; else - item->TargetState = 7; + item->Animation.TargetState = 7; } } else if ((item->AIBits & FOLLOW) && (creature->ReachedGoal || laraAI.distance > pow(SECTOR(2), 2))) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.ahead) - item->TargetState = 6; + item->Animation.TargetState = 6; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (AI.bite && AI.distance < pow(682, 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (AI.bite && AI.distance < pow(682, 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -208,66 +208,66 @@ void MonkeyControl(short itemNumber) if (!(GetRandomControl() & 15)) { if (GetRandomControl() & 1) - item->TargetState = 10; + item->Animation.TargetState = 10; else - item->TargetState = 6; + item->Animation.TargetState = 6; } break; } else if (item->AIBits & PATROL1) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && AI.ahead) - item->TargetState = 3; + item->Animation.TargetState = 3; else - item->TargetState = 4; + item->Animation.TargetState = 4; } else if (creature->Mood == MoodType::Bored) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (!(GetRandomControl() & 15)) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (!(GetRandomControl() & 15)) { if (GetRandomControl() & 1) - item->TargetState = 10; + item->Animation.TargetState = 10; else - item->TargetState = 6; + item->Animation.TargetState = 6; } } else if (item->AIBits & FOLLOW && (creature->ReachedGoal || laraAI.distance > pow(SECTOR(2), 2))) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.ahead) - item->TargetState = 6; + item->Animation.TargetState = 6; else - item->TargetState = 4; + item->Animation.TargetState = 4; } else if (AI.bite && AI.distance < pow(341, 2)) { if (LaraItem->Position.yPos < item->Position.yPos) - item->TargetState = 13; + item->Animation.TargetState = 13; else - item->TargetState = 12; + item->Animation.TargetState = 12; } else if (AI.bite && AI.distance < pow(682, 2)) - item->TargetState = 14; + item->Animation.TargetState = 14; else if (AI.bite && AI.distance < pow(682, 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (AI.distance < pow(682, 2) && creature->Enemy != LaraItem && creature->Enemy != NULL && creature->Enemy->ObjectNumber != ID_AI_PATROL1 && creature->Enemy->ObjectNumber != ID_AI_PATROL2 && abs(item->Position.yPos - creature->Enemy->Position.yPos) < 256) { - item->TargetState = 5; + item->Animation.TargetState = 5; } else if (AI.bite && AI.distance < pow(SECTOR(1), 2)) - item->TargetState = 9; + item->Animation.TargetState = 9; else - item->TargetState = 4; + item->Animation.TargetState = 4; break; @@ -278,7 +278,7 @@ void MonkeyControl(short itemNumber) break; else if ((creature->Enemy->ObjectNumber == ID_SMALLMEDI_ITEM || creature->Enemy->ObjectNumber == ID_KEY_ITEM4) && - item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 12) + item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 12) { if (creature->Enemy->RoomNumber == NO_ROOM || creature->Enemy->Status == ITEM_INVISIBLE || @@ -311,7 +311,7 @@ void MonkeyControl(short itemNumber) } } } - else if (creature->Enemy->ObjectNumber == ID_AI_AMBUSH && item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 12) + else if (creature->Enemy->ObjectNumber == ID_AI_AMBUSH && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 12) { item->AIBits = 0; @@ -347,18 +347,18 @@ void MonkeyControl(short itemNumber) if (item->AIBits & PATROL1) { - item->TargetState = 2; + item->Animation.TargetState = 2; torsoY = 0; } else if (creature->Mood == MoodType::Escape) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (creature->Mood == MoodType::Bored) { if (GetRandomControl() < 256) - item->TargetState = 6; + item->Animation.TargetState = 6; } else if (AI.bite && AI.distance < pow(682, 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -370,21 +370,21 @@ void MonkeyControl(short itemNumber) torsoY = AI.angle; if (item->AIBits & GUARD) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && AI.ahead) - item->TargetState = 3; + item->Animation.TargetState = 3; break; } else if ((item->AIBits & FOLLOW) && (creature->ReachedGoal || laraAI.distance > pow(SECTOR(2), 2))) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (creature->Mood == MoodType::Bored) - item->TargetState = 9; + item->Animation.TargetState = 9; else if (AI.distance < pow(682, 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (AI.bite && AI.distance < pow(SECTOR(1), 2)) - item->TargetState = 9; + item->Animation.TargetState = 9; break; @@ -533,50 +533,50 @@ void MonkeyControl(short itemNumber) CreatureJoint(item, 1, headX); CreatureJoint(item, 2, torsoY); - if (item->ActiveState < 15) + if (item->Animation.ActiveState < 15) { switch (CreatureVault(itemNumber, angle, 2, 128)) { case 2: creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_MONKEY].animIndex + 19; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 17; + item->Animation.AnimNumber = Objects[ID_MONKEY].animIndex + 19; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 17; break; case 3: creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_MONKEY].animIndex + 18; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 16; + item->Animation.AnimNumber = Objects[ID_MONKEY].animIndex + 18; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 16; break; case 4: creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_MONKEY].animIndex + 17; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 15; + item->Animation.AnimNumber = Objects[ID_MONKEY].animIndex + 17; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 15; break; case -2: creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_MONKEY].animIndex + 22; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 20; + item->Animation.AnimNumber = Objects[ID_MONKEY].animIndex + 22; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 20; break; case -3: creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_MONKEY].animIndex + 21; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 19; + item->Animation.AnimNumber = Objects[ID_MONKEY].animIndex + 21; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 19; break; case -4: creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_MONKEY].animIndex + 20; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 18; + item->Animation.AnimNumber = Objects[ID_MONKEY].animIndex + 20; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 18; break; } } diff --git a/TR5Main/Objects/TR3/Entity/tr3_mpgun.cpp b/TR5Main/Objects/TR3/Entity/tr3_mpgun.cpp index 25502be61..b95d8ef40 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_mpgun.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_mpgun.cpp @@ -83,13 +83,13 @@ void MPGunControl(short itemNumber) if (item->HitPoints <= 0) { item->HitPoints = 0; - if (item->ActiveState != 13) + if (item->Animation.ActiveState != 13) { - item->AnimNumber = Objects[ID_MP_WITH_GUN].animIndex + 14; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 13; + item->Animation.AnimNumber = Objects[ID_MP_WITH_GUN].animIndex + 14; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 13; } - else if (!(GetRandomControl() & 3) && item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 1) + else if (!(GetRandomControl() & 3) && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 1) { CreatureAIInfo(item, &info); @@ -177,15 +177,15 @@ void MPGunControl(short itemNumber) } creature->Enemy = enemy; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case MPGUN_WAIT: head = laraInfo.angle; creature->MaxTurn = 0; - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + 17 || - item->AnimNumber == Objects[item->ObjectNumber].animIndex + 27 || - item->AnimNumber == Objects[item->ObjectNumber].animIndex + 28) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + 17 || + item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + 27 || + item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + 28) { if (abs(info.angle) < ANGLE(10)) item->Position.yRot += info.angle; @@ -198,41 +198,41 @@ void MPGunControl(short itemNumber) if (item->AIBits & GUARD) { head = AIGuard(creature); - item->TargetState = MPGUN_WAIT; + item->Animation.TargetState = MPGUN_WAIT; break; } else if (item->AIBits & PATROL1) { - item->TargetState = MPGUN_WALK; + item->Animation.TargetState = MPGUN_WALK; head = 0; } else if (cover && (Lara.TargetEntity == item || item->HitStatus)) - item->TargetState = MPGUN_DUCK; - else if (item->RequiredState == MPGUN_DUCK) - item->TargetState = MPGUN_DUCK; + item->Animation.TargetState = MPGUN_DUCK; + else if (item->Animation.RequiredState == MPGUN_DUCK) + item->Animation.TargetState = MPGUN_DUCK; else if (creature->Mood == MoodType::Escape) - item->TargetState = MPGUN_RUN; + item->Animation.TargetState = MPGUN_RUN; else if (Targetable(item, &info)) { random = GetRandomControl(); if (random < 0x2000) - item->TargetState = MPGUN_SHOOT1; + item->Animation.TargetState = MPGUN_SHOOT1; else if (random < 0x4000) - item->TargetState = MPGUN_SHOOT2; + item->Animation.TargetState = MPGUN_SHOOT2; else - item->TargetState = MPGUN_AIM3; + item->Animation.TargetState = MPGUN_AIM3; } else if (creature->Mood == MoodType::Bored || ((item->AIBits & FOLLOW) && (creature->ReachedGoal || laraInfo.distance > SQUARE(2048)))) { if (info.ahead) - item->TargetState = MPGUN_WAIT; + item->Animation.TargetState = MPGUN_WAIT; else - item->TargetState = MPGUN_WALK; + item->Animation.TargetState = MPGUN_WALK; } else - item->TargetState = MPGUN_RUN; + item->Animation.TargetState = MPGUN_RUN; break; case MPGUN_WALK: @@ -240,32 +240,32 @@ void MPGunControl(short itemNumber) creature->MaxTurn = ANGLE(6); if (item->AIBits & PATROL1) { - item->TargetState = MPGUN_WALK; + item->Animation.TargetState = MPGUN_WALK; head = 0; } else if (cover && (Lara.TargetEntity == item || item->HitStatus)) { - item->RequiredState = MPGUN_DUCK; - item->TargetState = MPGUN_WAIT; + item->Animation.RequiredState = MPGUN_DUCK; + item->Animation.TargetState = MPGUN_WAIT; } else if (creature->Mood == MoodType::Escape) - item->TargetState = MPGUN_RUN; + item->Animation.TargetState = MPGUN_RUN; else if (Targetable(item, &info)) { if (info.distance > SQUARE(1536) && info.zoneNumber == info.enemyZone) - item->TargetState = MPGUN_AIM4; + item->Animation.TargetState = MPGUN_AIM4; else - item->TargetState = MPGUN_WAIT; + item->Animation.TargetState = MPGUN_WAIT; } else if (creature->Mood == MoodType::Bored) { if (info.ahead) - item->TargetState = MPGUN_WALK; + item->Animation.TargetState = MPGUN_WALK; else - item->TargetState = MPGUN_WAIT; + item->Animation.TargetState = MPGUN_WAIT; } else - item->TargetState = MPGUN_RUN; + item->Animation.TargetState = MPGUN_RUN; break; case MPGUN_RUN: @@ -275,18 +275,18 @@ void MPGunControl(short itemNumber) creature->MaxTurn = ANGLE(10); tilt = angle / 2; if (item->AIBits & GUARD) - item->TargetState = MPGUN_WAIT; + item->Animation.TargetState = MPGUN_WAIT; else if (cover && (Lara.TargetEntity == item || item->HitStatus)) { - item->RequiredState = MPGUN_DUCK; - item->TargetState = MPGUN_WAIT; + item->Animation.RequiredState = MPGUN_DUCK; + item->Animation.TargetState = MPGUN_WAIT; } else if (creature->Mood == MoodType::Escape) break; else if (Targetable(item, &info) || ((item->AIBits & FOLLOW) && (creature->ReachedGoal || laraInfo.distance > SQUARE(2048)))) - item->TargetState = MPGUN_WAIT; + item->Animation.TargetState = MPGUN_WAIT; else if (creature->Mood == MoodType::Bored) - item->TargetState = MPGUN_WALK; + item->Animation.TargetState = MPGUN_WALK; break; case MPGUN_AIM1: @@ -296,15 +296,15 @@ void MPGunControl(short itemNumber) torsoX = info.xAngle; } - if ((item->AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 12) || (item->AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 1 && item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 10)) + if ((item->Animation.AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 12) || (item->Animation.AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 1 && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 10)) { if (!ShotLara(item, &info, &mpgunBite, torsoY, 32)) - item->RequiredState = MPGUN_WAIT; + item->Animation.RequiredState = MPGUN_WAIT; } else if (item->HitStatus && !(GetRandomControl() & 0x3) && cover) { - item->RequiredState = MPGUN_DUCK; - item->TargetState = MPGUN_WAIT; + item->Animation.RequiredState = MPGUN_DUCK; + item->Animation.TargetState = MPGUN_WAIT; } break; @@ -314,8 +314,8 @@ void MPGunControl(short itemNumber) torsoY = info.angle; torsoX = info.xAngle; } - if (item->RequiredState == MPGUN_WAIT) - item->TargetState = MPGUN_WAIT; + if (item->Animation.RequiredState == MPGUN_WAIT) + item->Animation.TargetState = MPGUN_WAIT; break; case MPGUN_SHOOT2: @@ -324,15 +324,15 @@ void MPGunControl(short itemNumber) torsoY = info.angle; torsoX = info.xAngle; } - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { if (!ShotLara(item, &info, &mpgunBite, torsoY, 32)) - item->TargetState = MPGUN_WAIT; + item->Animation.TargetState = MPGUN_WAIT; } else if (item->HitStatus && !(GetRandomControl() & 0x3) && cover) { - item->RequiredState = MPGUN_DUCK; - item->TargetState = MPGUN_WAIT; + item->Animation.RequiredState = MPGUN_DUCK; + item->Animation.TargetState = MPGUN_WAIT; } break; @@ -343,15 +343,15 @@ void MPGunControl(short itemNumber) torsoY = info.angle; torsoX = info.xAngle; } - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase || (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 11)) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase || (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 11)) { if (!ShotLara(item, &info, &mpgunBite, torsoY, 32)) - item->TargetState = MPGUN_WAIT; + item->Animation.TargetState = MPGUN_WAIT; } else if (item->HitStatus && !(GetRandomControl() & 0x3) && cover) { - item->RequiredState = MPGUN_DUCK; - item->TargetState = MPGUN_WAIT; + item->Animation.RequiredState = MPGUN_DUCK; + item->Animation.TargetState = MPGUN_WAIT; } break; @@ -361,18 +361,18 @@ void MPGunControl(short itemNumber) torsoY = info.angle; torsoX = info.xAngle; } - if ((item->AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 18 && item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 17) || (item->AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 19 && item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 6)) + if ((item->Animation.AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 18 && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 17) || (item->Animation.AnimNumber == Objects[ID_MP_WITH_GUN].animIndex + 19 && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 6)) { if (!ShotLara(item, &info, &mpgunBite, torsoY, 32)) - item->RequiredState = MPGUN_WALK; + item->Animation.RequiredState = MPGUN_WALK; } else if (item->HitStatus && !(GetRandomControl() & 0x3) && cover) { - item->RequiredState = MPGUN_DUCK; - item->TargetState = MPGUN_WAIT; + item->Animation.RequiredState = MPGUN_DUCK; + item->Animation.TargetState = MPGUN_WAIT; } if (info.distance < SQUARE(1536)) - item->RequiredState = MPGUN_WALK; + item->Animation.RequiredState = MPGUN_WALK; break; case MPGUN_SHOOT4A: @@ -382,17 +382,17 @@ void MPGunControl(short itemNumber) torsoY = info.angle; torsoX = info.xAngle; } - if (item->RequiredState == MPGUN_WALK) + if (item->Animation.RequiredState == MPGUN_WALK) { - item->TargetState = MPGUN_WALK; + item->Animation.TargetState = MPGUN_WALK; } - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 16) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 16) { if (!ShotLara(item, &info, &mpgunBite, torsoY, 32)) - item->TargetState = MPGUN_WALK; + item->Animation.TargetState = MPGUN_WALK; } if (info.distance < SQUARE(1536)) - item->TargetState = MPGUN_WALK; + item->Animation.TargetState = MPGUN_WALK; break; case MPGUN_DUCKED: @@ -402,11 +402,11 @@ void MPGunControl(short itemNumber) creature->MaxTurn = 0; if (Targetable(item, &info)) - item->TargetState = MPGUN_DUCKAIM; + item->Animation.TargetState = MPGUN_DUCKAIM; else if (item->HitStatus || !cover || (info.ahead && !(GetRandomControl() & 0x1F))) - item->TargetState = MPGUN_STAND; + item->Animation.TargetState = MPGUN_STAND; else - item->TargetState = MPGUN_DUCKWALK; + item->Animation.TargetState = MPGUN_DUCKWALK; break; case MPGUN_DUCKAIM: @@ -416,19 +416,19 @@ void MPGunControl(short itemNumber) torsoY = info.angle; if (Targetable(item, &info)) - item->TargetState = MPGUN_DUCKSHOT; + item->Animation.TargetState = MPGUN_DUCKSHOT; else - item->TargetState = MPGUN_DUCKED; + item->Animation.TargetState = MPGUN_DUCKED; break; case MPGUN_DUCKSHOT: if (info.ahead) torsoY = info.angle; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { if (!ShotLara(item, &info, &mpgunBite, torsoY, 32) || !(GetRandomControl() & 0x7)) - item->TargetState = MPGUN_DUCKED; + item->Animation.TargetState = MPGUN_DUCKED; } break; @@ -440,7 +440,7 @@ void MPGunControl(short itemNumber) creature->MaxTurn = ANGLE(6); if (Targetable(item, &info) || item->HitStatus || !cover || (info.ahead && !(GetRandomControl() & 0x1F))) - item->TargetState = MPGUN_DUCKED; + item->Animation.TargetState = MPGUN_DUCKED; break; } diff --git a/TR5Main/Objects/TR3/Entity/tr3_mpstick.cpp b/TR5Main/Objects/TR3/Entity/tr3_mpstick.cpp index 7217983dc..d8538c84b 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_mpstick.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_mpstick.cpp @@ -40,9 +40,9 @@ void InitialiseMPStick(short itemNumber) ITEM_INFO* item = &g_Level.Items[itemNumber]; ClearItem(itemNumber); - item->AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 6; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = item->TargetState = BATON_STOP; + item->Animation.AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 6; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = item->Animation.TargetState = BATON_STOP; } void MPStickControl(short itemNumber) @@ -76,11 +76,11 @@ void MPStickControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != BATON_DEATH) + if (item->Animation.ActiveState != BATON_DEATH) { - item->AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 26; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BATON_DEATH; + item->Animation.AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 26; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BATON_DEATH; creature->LOT.Step = 256; } } @@ -153,12 +153,12 @@ void MPStickControl(short itemNumber) } creature->Enemy = enemy; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case BATON_WAIT: - if (creature->Alerted || item->TargetState == BATON_RUN) + if (creature->Alerted || item->Animation.TargetState == BATON_RUN) { - item->TargetState = BATON_STOP; + item->Animation.TargetState = BATON_STOP; break; } @@ -172,41 +172,41 @@ void MPStickControl(short itemNumber) head = AIGuard(creature); if (!(GetRandomControl() & 0xFF)) { - if (item->ActiveState == BATON_STOP) - item->TargetState = BATON_WAIT; + if (item->Animation.ActiveState == BATON_STOP) + item->Animation.TargetState = BATON_WAIT; else - item->TargetState = BATON_STOP; + item->Animation.TargetState = BATON_STOP; } break; } else if (item->AIBits & PATROL1) - item->TargetState = BATON_WALK; + item->Animation.TargetState = BATON_WALK; else if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && info.ahead && !item->HitStatus) - item->TargetState = BATON_STOP; + item->Animation.TargetState = BATON_STOP; else - item->TargetState = BATON_RUN; + item->Animation.TargetState = BATON_RUN; } else if (creature->Mood == MoodType::Bored || ((item->AIBits & FOLLOW) && (creature->ReachedGoal || laraInfo.distance > SQUARE(2048)))) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (info.ahead) - item->TargetState = BATON_STOP; + item->Animation.TargetState = BATON_STOP; else - item->TargetState = BATON_RUN; + item->Animation.TargetState = BATON_RUN; } else if (info.bite && info.distance < SQUARE(512)) - item->TargetState = BATON_AIM0; + item->Animation.TargetState = BATON_AIM0; else if (info.bite && info.distance < SQUARE(1024)) - item->TargetState = BATON_AIM1; + item->Animation.TargetState = BATON_AIM1; else if (info.bite && info.distance < SQUARE(1024)) - item->TargetState = BATON_WALK; + item->Animation.TargetState = BATON_WALK; else - item->TargetState = BATON_RUN; + item->Animation.TargetState = BATON_RUN; break; case BATON_WALK: head = laraInfo.angle; @@ -216,27 +216,27 @@ void MPStickControl(short itemNumber) if (item->AIBits & PATROL1) { - item->TargetState = BATON_WALK; + item->Animation.TargetState = BATON_WALK; head = 0; } else if (creature->Mood == MoodType::Escape) - item->TargetState = BATON_RUN; + item->Animation.TargetState = BATON_RUN; else if (creature->Mood == MoodType::Bored) { if (GetRandomControl() < 0x100) { - item->RequiredState = BATON_WAIT; - item->TargetState = BATON_STOP; + item->Animation.RequiredState = BATON_WAIT; + item->Animation.TargetState = BATON_STOP; } } else if (info.bite && info.distance < SQUARE(1536) && info.xAngle < 0) - item->TargetState = BATON_KICK; + item->Animation.TargetState = BATON_KICK; else if (info.bite && info.distance < SQUARE(512)) - item->TargetState = BATON_STOP; + item->Animation.TargetState = BATON_STOP; else if (info.bite && info.distance < SQUARE(1280)) - item->TargetState = BATON_AIM2; + item->Animation.TargetState = BATON_AIM2; else - item->TargetState = BATON_RUN; + item->Animation.TargetState = BATON_RUN; break; case BATON_RUN: @@ -247,19 +247,19 @@ void MPStickControl(short itemNumber) tilt = angle / 2; if (item->AIBits & GUARD) - item->TargetState = BATON_WAIT; + item->Animation.TargetState = BATON_WAIT; else if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && info.ahead) - item->TargetState = BATON_STOP; + item->Animation.TargetState = BATON_STOP; break; } else if ((item->AIBits & FOLLOW) && (creature->ReachedGoal || laraInfo.distance > SQUARE(2048))) - item->TargetState = BATON_STOP; + item->Animation.TargetState = BATON_STOP; else if (creature->Mood == MoodType::Bored) - item->TargetState = BATON_WALK; + item->Animation.TargetState = BATON_WALK; else if (info.ahead && info.distance < SQUARE(1024)) - item->TargetState = BATON_WALK; + item->Animation.TargetState = BATON_WALK; break; case BATON_AIM0: @@ -272,9 +272,9 @@ void MPStickControl(short itemNumber) creature->Flags = 0; if (info.bite && info.distance < SQUARE(512)) - item->TargetState = BATON_PUNCH0; + item->Animation.TargetState = BATON_PUNCH0; else - item->TargetState = BATON_STOP; + item->Animation.TargetState = BATON_STOP; break; case BATON_AIM1: @@ -287,9 +287,9 @@ void MPStickControl(short itemNumber) creature->Flags = 0; if (info.ahead && info.distance < SQUARE(1024)) - item->TargetState = BATON_PUNCH1; + item->Animation.TargetState = BATON_PUNCH1; else - item->TargetState = BATON_STOP; + item->Animation.TargetState = BATON_STOP; break; case BATON_AIM2: @@ -302,9 +302,9 @@ void MPStickControl(short itemNumber) creature->Flags = 0; if (info.bite && info.distance < SQUARE(1280)) - item->TargetState = BATON_PUNCH2; + item->Animation.TargetState = BATON_PUNCH2; else - item->TargetState = BATON_WALK; + item->Animation.TargetState = BATON_WALK; break; case BATON_PUNCH0: @@ -386,7 +386,7 @@ void MPStickControl(short itemNumber) if (info.ahead && info.distance > SQUARE(1024) && info.distance < SQUARE(1280)) - item->TargetState = BATON_PUNCH2; + item->Animation.TargetState = BATON_PUNCH2; break; case BATON_PUNCH2: @@ -435,7 +435,7 @@ void MPStickControl(short itemNumber) if (enemy == LaraItem) { - if (creature->Flags != 1 && (item->TouchBits & 0x60) && (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 8)) + if (creature->Flags != 1 && (item->TouchBits & 0x60) && (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 8)) { LaraItem->HitPoints -= 150; LaraItem->HitStatus = 1; @@ -447,7 +447,7 @@ void MPStickControl(short itemNumber) } else { - if (!creature->Flags != 1 && enemy && (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 8)) + if (!creature->Flags != 1 && enemy && (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 8)) { if (abs(enemy->Position.xPos - item->Position.xPos) < 256 && abs(enemy->Position.yPos - item->Position.yPos) <= 256 && @@ -471,35 +471,35 @@ void MPStickControl(short itemNumber) CreatureJoint(item, 1, torsoX); CreatureJoint(item, 2, head); - if (item->ActiveState < BATON_DEATH) + if (item->Animation.ActiveState < BATON_DEATH) { switch (CreatureVault(itemNumber, angle, 2, 260)) { case 2: creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 28; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BATON_CLIMB1; + item->Animation.AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 28; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BATON_CLIMB1; break; case 3: creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 29; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BATON_CLIMB2; + item->Animation.AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 29; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BATON_CLIMB2; break; case 4: creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 27; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BATON_CLIMB3; + item->Animation.AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 27; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BATON_CLIMB3; break; case -4: creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 30; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BATON_FALL3; + item->Animation.AnimNumber = Objects[ID_MP_WITH_STICK].animIndex + 30; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BATON_FALL3; break; } } diff --git a/TR5Main/Objects/TR3/Entity/tr3_raptor.cpp b/TR5Main/Objects/TR3/Entity/tr3_raptor.cpp index 0aa4cf0ba..6612541a1 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_raptor.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_raptor.cpp @@ -41,15 +41,15 @@ void RaptorControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 5) + if (item->Animation.ActiveState != 5) { if (GetRandomControl() > 0x4000) - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 9; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 9; else - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 10; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 10; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 5; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 5; } } else @@ -114,29 +114,29 @@ void RaptorControl(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); neck = -angle * 6; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->MaxTurn = 0; creature->Flags &= ~1; - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (creature->Flags & 2) { creature->Flags &= ~2; - item->TargetState = 6; + item->Animation.TargetState = 6; } else if (item->TouchBits & 0xFF7C00 || (AI.distance < pow(585, 2) && AI.bite)) - item->TargetState = 8; + item->Animation.TargetState = 8; else if (AI.bite && AI.distance < pow(SECTOR(1.5f), 2)) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (creature->Mood == MoodType::Escape && Lara.TargetEntity != item && AI.ahead && !item->HitStatus) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (creature->Mood == MoodType::Bored) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -145,11 +145,11 @@ void RaptorControl(short itemNumber) creature->Flags &= ~1; if (creature->Mood != MoodType::Bored) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (AI.ahead && GetRandomControl() < 0x80) { - item->RequiredState = 6; - item->TargetState = 1; + item->Animation.RequiredState = 6; + item->Animation.TargetState = 1; creature->Flags &= ~2; } @@ -161,30 +161,30 @@ void RaptorControl(short itemNumber) creature->Flags &= ~1; if (item->TouchBits & 0xFF7C00) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (creature->Flags & 2) { - item->RequiredState = 6; - item->TargetState = 1; + item->Animation.RequiredState = 6; + item->Animation.TargetState = 1; creature->Flags &= ~2; } else if (AI.bite && AI.distance < SQUARE(1536)) { - if (item->TargetState == 3) + if (item->Animation.TargetState == 3) { if (GetRandomControl() < 0x2000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 7; + item->Animation.TargetState = 7; } } else if (AI.ahead && creature->Mood != MoodType::Escape && GetRandomControl() < 0x80) { - item->RequiredState = 6; - item->TargetState = 1; + item->Animation.RequiredState = 6; + item->Animation.TargetState = 1; } else if (creature->Mood == MoodType::Bored || (creature->Mood == MoodType::Escape && Lara.TargetEntity != item && AI.ahead)) - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -205,7 +205,7 @@ void RaptorControl(short itemNumber) LaraItem->HitPoints -= 100; LaraItem->HitStatus = 1; - item->RequiredState = 1; + item->Animation.RequiredState = 1; } } else @@ -248,7 +248,7 @@ void RaptorControl(short itemNumber) LaraItem->HitPoints -= 100; LaraItem->HitStatus = 1; - item->RequiredState = 1; + item->Animation.RequiredState = 1; } } else @@ -290,7 +290,7 @@ void RaptorControl(short itemNumber) if (LaraItem->HitPoints <= 0) creature->Flags |= 2; - item->RequiredState = 3; + item->Animation.RequiredState = 3; } } else diff --git a/TR5Main/Objects/TR3/Entity/tr3_scuba.cpp b/TR5Main/Objects/TR3/Entity/tr3_scuba.cpp index 36c7d8cf3..a1b11386d 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_scuba.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_scuba.cpp @@ -31,7 +31,7 @@ static void ShootHarpoon(ITEM_INFO* frogman, int x, int y, int z, short speed, s harpoon->Position.xRot = 0; harpoon->Position.yRot = yRot; - harpoon->VerticalVelocity = 150; + harpoon->Animation.VerticalVelocity = 150; AddActiveItem(harpoonItemNum); harpoon->Status = ITEM_ACTIVE; @@ -54,10 +54,10 @@ void ScubaHarpoonControl(short itemNum) int ox = item->Position.xPos; int oz = item->Position.zPos; - short speed = item->VerticalVelocity * phd_cos(item->Position.xRot); + short speed = item->Animation.VerticalVelocity * phd_cos(item->Position.xRot); item->Position.zPos += speed * phd_cos(item->Position.yRot); item->Position.xPos += speed * phd_sin(item->Position.yRot); - item->Position.yPos += -item->VerticalVelocity * phd_sin(item->Position.xRot); + item->Position.yPos += -item->Animation.VerticalVelocity * phd_sin(item->Position.xRot); short roomNumber = item->RoomNumber; FLOOR_INFO* floor = GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &roomNumber); @@ -83,11 +83,11 @@ void ScubaControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 9) + if (item->Animation.ActiveState != 9) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 16; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 9; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 16; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 9; } CreatureFloat(itemNumber); @@ -146,7 +146,7 @@ void ScubaControl(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); waterHeight = GetWaterSurface(item->Position.xPos, item->Position.yPos, item->Position.zPos, item->RoomNumber) + WALL_SIZE / 2; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->MaxTurn = ANGLE(3); @@ -154,11 +154,11 @@ void ScubaControl(short itemNumber) neck = -info.angle; if (creature->Target.y < waterHeight && item->Position.yPos < waterHeight + creature->LOT.Fly) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (creature->Mood == MoodType::Escape) break; else if (shoot) - item->TargetState = 4; + item->Animation.TargetState = 4; break; case 4: @@ -168,9 +168,9 @@ void ScubaControl(short itemNumber) neck = -info.angle; if (!shoot || creature->Mood == MoodType::Escape || (creature->Target.y < waterHeight && item->Position.yPos < waterHeight + creature->LOT.Fly)) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; case 3: @@ -179,7 +179,7 @@ void ScubaControl(short itemNumber) if (!creature->Flags) { - ShootHarpoon(item, item->Position.xPos, item->Position.yPos, item->Position.zPos, item->VerticalVelocity, item->Position.yRot, item->RoomNumber); + ShootHarpoon(item, item->Position.xPos, item->Position.yPos, item->Position.zPos, item->Animation.VerticalVelocity, item->Position.yRot, item->RoomNumber); creature->Flags = 1; } break; @@ -192,11 +192,11 @@ void ScubaControl(short itemNumber) head = info.angle; if (creature->Target.y > waterHeight) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (creature->Mood == MoodType::Escape) break; else if (shoot) - item->TargetState = 6; + item->Animation.TargetState = 6; break; case 6: @@ -206,9 +206,9 @@ void ScubaControl(short itemNumber) head = info.angle; if (!shoot || creature->Mood == MoodType::Escape || creature->Target.y > waterHeight) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 7; + item->Animation.TargetState = 7; break; case 7: @@ -217,7 +217,7 @@ void ScubaControl(short itemNumber) if (!creature->Flags) { - ShootHarpoon(item, item->Position.xPos, item->Position.yPos, item->Position.zPos, item->VerticalVelocity, item->Position.yRot, item->RoomNumber); + ShootHarpoon(item, item->Position.xPos, item->Position.yPos, item->Position.zPos, item->Animation.VerticalVelocity, item->Position.yRot, item->RoomNumber); creature->Flags = 1; } break; @@ -229,7 +229,7 @@ void ScubaControl(short itemNumber) CreatureJoint(item, 1, neck); CreatureAnimation(itemNumber, angle, 0); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: case 4: diff --git a/TR5Main/Objects/TR3/Entity/tr3_shiva.cpp b/TR5Main/Objects/TR3/Entity/tr3_shiva.cpp index 744ea0f8a..1b277c1f3 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_shiva.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_shiva.cpp @@ -141,11 +141,11 @@ void InitialiseShiva(short itemNumber) ClearItem(itemNumber); auto* item = &g_Level.Items[itemNumber]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 14; - auto* anim = &g_Level.Anims[item->AnimNumber]; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 14; + auto* anim = &g_Level.Anims[item->Animation.AnimNumber]; - item->FrameNumber = anim->frameBase; - item->ActiveState = anim->ActiveState; + item->Animation.FrameNumber = anim->frameBase; + item->Animation.ActiveState = anim->ActiveState; } void ShivaControl(short itemNumber) @@ -168,11 +168,11 @@ void ShivaControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 9) + if (item->Animation.ActiveState != 9) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 22; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 9; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 22; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 9; } } else @@ -191,12 +191,12 @@ void ShivaControl(short itemNumber) angle = CreatureTurn(item, shiva->MaxTurn); - if (item->ActiveState != 4) + if (item->Animation.ActiveState != 4) item->MeshBits = 0xFFFFFFFF; int effectMesh = 0; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 4: shiva->MaxTurn = 0; @@ -218,7 +218,7 @@ void ShivaControl(short itemNumber) if (item->MeshBits == 0x7FFFFFFF) { - item->TargetState = 0; + item->Animation.TargetState = 0; shiva->Flags = -45; effectMesh = 0; } @@ -250,35 +250,35 @@ void ShivaControl(short itemNumber) if (box != NO_BOX && !(g_Level.Boxes[box].flags & BLOCKABLE) && !shiva->Flags) { - item->TargetState = 8; + item->Animation.TargetState = 8; } else - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (shiva->Mood == MoodType::Bored) { int random = GetRandomControl(); if (random < 0x400) - item->TargetState = 1; + item->Animation.TargetState = 1; } else if (AI.bite && AI.distance < pow(SECTOR(1.25f), 2)) { - item->TargetState = 5; + item->Animation.TargetState = 5; shiva->Flags = 0; } else if (AI.bite && AI.distance < pow(SECTOR(4) / 3, 2)) { - item->TargetState = 7; + item->Animation.TargetState = 7; shiva->Flags = 0; } else if (item->HitStatus && AI.ahead) { shiva->Flags = 4; - item->TargetState = 2; + item->Animation.TargetState = 2; } else { - item->TargetState = 1; + item->Animation.TargetState = 1; } break; @@ -293,18 +293,18 @@ void ShivaControl(short itemNumber) shiva->Flags = 4; if (AI.bite && AI.distance < pow(SECTOR(4) / 3, 2) || - (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase && + (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase && !shiva->Flags) || !AI.ahead) { - item->TargetState = 0; + item->Animation.TargetState = 0; shiva->Flags = 0; } else if (shiva->Flags) - item->TargetState = 2; + item->Animation.TargetState = 2; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase && shiva->Flags > 1) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase && shiva->Flags > 1) shiva->Flags -= 2; break; @@ -316,18 +316,18 @@ void ShivaControl(short itemNumber) headY = AI.angle; if (shiva->Mood == MoodType::Escape) - item->TargetState = 0; + item->Animation.TargetState = 0; else if (shiva->Mood == MoodType::Bored) - item->TargetState = 0; + item->Animation.TargetState = 0; else if (AI.bite && AI.distance < pow(SECTOR(4) / 3, 2)) { - item->TargetState = 0; + item->Animation.TargetState = 0; shiva->Flags = 0; } else if (item->HitStatus) { shiva->Flags = 4; - item->TargetState = 3; + item->Animation.TargetState = 3; } break; @@ -342,16 +342,16 @@ void ShivaControl(short itemNumber) shiva->Flags = 4; if (AI.bite && AI.distance < pow(SECTOR(1.25f), 2) || - (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase && + (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase && !shiva->Flags)) { - item->TargetState = 1; + item->Animation.TargetState = 1; shiva->Flags = 0; } else if (shiva->Flags) - item->TargetState = 3; + item->Animation.TargetState = 3; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) shiva->Flags = 0; break; @@ -363,15 +363,15 @@ void ShivaControl(short itemNumber) headY = AI.angle; if (AI.ahead && AI.distance < pow(SECTOR(4) / 3, 2) || - (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase && + (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase && !shiva->Flags)) { - item->TargetState = 0; + item->Animation.TargetState = 0; } else if (item->HitStatus) { shiva->Flags = 4; - item->TargetState = 0; + item->Animation.TargetState = 0; } break; @@ -407,9 +407,9 @@ void ShivaControl(short itemNumber) torsoX = 0; torsoY = 0; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 10 || - item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 21 || - item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 33) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 10 || + item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 21 || + item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 33) { CreatureEffect(item, &ShivaBiteRight, DoBloodSplat); CreatureEffect(item, &ShivaBiteLeft, DoBloodSplat); diff --git a/TR5Main/Objects/TR3/Entity/tr3_tiger.cpp b/TR5Main/Objects/TR3/Entity/tr3_tiger.cpp index 1e64bbefd..d57e62bd4 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_tiger.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_tiger.cpp @@ -39,11 +39,11 @@ void TigerControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 9) + if (item->Animation.ActiveState != 9) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 11; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 9; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 11; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 9; } } else @@ -63,7 +63,7 @@ void TigerControl(short itemNumber) angle = CreatureTurn(item, info->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: info->MaxTurn = 0; @@ -72,32 +72,32 @@ void TigerControl(short itemNumber) if (info->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && aiInfo.ahead) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (info->Mood == MoodType::Bored) { short random = GetRandomControl(); if (random < 0x60) - item->TargetState = 5; + item->Animation.TargetState = 5; else if (random < 0x460); - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (aiInfo.bite && aiInfo.distance < pow(340, 2)) - item->TargetState = 6; + item->Animation.TargetState = 6; else if (aiInfo.bite && aiInfo.distance < pow(SECTOR(1), 2)) { info->MaxTurn = ANGLE(3.0f); - item->TargetState = 8; + item->Animation.TargetState = 8; } - else if (item->RequiredState) - item->TargetState = item->RequiredState; + else if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (info->Mood != MoodType::Attack && GetRandomControl() < 0x60) - item->TargetState = 5; + item->Animation.TargetState = 5; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -105,11 +105,11 @@ void TigerControl(short itemNumber) info->MaxTurn = ANGLE(3.0f); if (info->Mood == MoodType::Escape || info->Mood == MoodType::Attack) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (GetRandomControl() < 0x60) { - item->TargetState = 1; - item->RequiredState = 5; + item->Animation.TargetState = 1; + item->Animation.RequiredState = 5; } break; @@ -118,23 +118,23 @@ void TigerControl(short itemNumber) info->MaxTurn = ANGLE(6.0f); if (info->Mood == MoodType::Bored) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (info->Flags && aiInfo.ahead) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (aiInfo.bite && aiInfo.distance < pow(SECTOR(1.5f), 2)) { - if (LaraItem->Velocity == 0) - item->TargetState = 1; + if (LaraItem->Animation.Velocity == 0) + item->Animation.TargetState = 1; else - item->TargetState = 7; + item->Animation.TargetState = 7; } else if (info->Mood != MoodType::Attack && GetRandomControl() < 0x60) { - item->RequiredState = 5; - item->TargetState = 1; + item->Animation.RequiredState = 5; + item->Animation.TargetState = 1; } else if (info->Mood == MoodType::Escape && Lara.TargetEntity != item && aiInfo.ahead) - item->TargetState = 1; + item->Animation.TargetState = 1; info->Flags = 0; break; diff --git a/TR5Main/Objects/TR3/Entity/tr3_tony.cpp b/TR5Main/Objects/TR3/Entity/tr3_tony.cpp index 7d89a3df0..721903384 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_tony.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_tony.cpp @@ -521,14 +521,14 @@ void TonyControl(short itemNum) if (item->HitPoints <= 0) { - if (item->ActiveState != 6) + if (item->Animation.ActiveState != 6) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 6; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 6; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 6; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 6; } - if ((item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase) > 110) + if ((item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase) > 110) { item->MeshBits = 0; if (!BossData.DroppedIcon) @@ -574,16 +574,16 @@ void TonyControl(short itemNum) if (info.ahead) head = info.angle; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case TONYBOSS_WAIT: tonyboss->MaxTurn = 0; - if (item->TargetState != TONYBOSS_RISE && item->ItemFlags[3]) - item->TargetState = TONYBOSS_RISE; + if (item->Animation.TargetState != TONYBOSS_RISE && item->ItemFlags[3]) + item->Animation.TargetState = TONYBOSS_RISE; break; case TONYBOSS_RISE: - if ((item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase) > 16) + if ((item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase) > 16) tonyboss->MaxTurn = TONYBOSS_TURN; else tonyboss->MaxTurn = 0; @@ -596,26 +596,26 @@ void TonyControl(short itemNum) if (!BossData.ExplodeCount) { - if (item->TargetState != TONYBOSS_BIGBOOM && item->ItemFlags[3] != 2) + if (item->Animation.TargetState != TONYBOSS_BIGBOOM && item->ItemFlags[3] != 2) { - item->TargetState = TONYBOSS_BIGBOOM; + item->Animation.TargetState = TONYBOSS_BIGBOOM; tonyboss->MaxTurn = 0; } - if (item->TargetState != TONYBOSS_ROCKZAPP && item->ItemFlags[3] == 2) + if (item->Animation.TargetState != TONYBOSS_ROCKZAPP && item->ItemFlags[3] == 2) { if (!(Wibble & 255) && item->ItemFlags[0] == 0) { - item->TargetState = TONYBOSS_ROCKZAPP; + item->Animation.TargetState = TONYBOSS_ROCKZAPP; item->ItemFlags[0] = 1; } } - if (item->TargetState != TONYBOSS_ZAPP && item->TargetState != TONYBOSS_ROCKZAPP && item->ItemFlags[3] == 2) + if (item->Animation.TargetState != TONYBOSS_ZAPP && item->Animation.TargetState != TONYBOSS_ROCKZAPP && item->ItemFlags[3] == 2) { if (!(Wibble & 255) && item->ItemFlags[0] == 1) { - item->TargetState = TONYBOSS_ZAPP; + item->Animation.TargetState = TONYBOSS_ZAPP; item->ItemFlags[0] = 0; } } @@ -627,7 +627,7 @@ void TonyControl(short itemNum) torso_x = info.xAngle; tonyboss->MaxTurn = 0; - if (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase == 40) + if (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase == 40) { TriggerFireBall(item, T_ROCKZAPPL, NULL, item->RoomNumber, 0, 0); TriggerFireBall(item, T_ROCKZAPPR, NULL, item->RoomNumber, 0, 0); @@ -639,13 +639,13 @@ void TonyControl(short itemNum) torso_x = info.xAngle; tonyboss->MaxTurn = TONYBOSS_TURN / 2; - if ((item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase) == 28) + if ((item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase) == 28) TriggerFireBall(item, T_ZAPP, NULL, item->RoomNumber, item->Position.yRot, 0); break; case TONYBOSS_BIGBOOM: tonyboss->MaxTurn = 0; - if ((item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase) == 56) + if ((item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase) == 56) { item->ItemFlags[3] = 2; BossData.DrawExplode = true; @@ -657,15 +657,15 @@ void TonyControl(short itemNum) } } - if (item->ActiveState == TONYBOSS_ROCKZAPP || item->ActiveState == TONYBOSS_ZAPP || item->ActiveState == TONYBOSS_BIGBOOM) + if (item->Animation.ActiveState == TONYBOSS_ROCKZAPP || item->Animation.ActiveState == TONYBOSS_ZAPP || item->Animation.ActiveState == TONYBOSS_BIGBOOM) { byte r, g, b; int bright; - bright = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + bright = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if (bright > 16) { - bright = g_Level.Anims[item->AnimNumber].frameEnd - item->FrameNumber; + bright = g_Level.Anims[item->Animation.AnimNumber].frameEnd - item->Animation.FrameNumber; if (bright > 16) bright = 16; } @@ -683,7 +683,7 @@ void TonyControl(short itemNum) TriggerDynamicLight(pos1.x, pos1.y, pos1.z, 12, r, g, b); TriggerTonyFlame(itemNum, 14); - if (item->ActiveState == TONYBOSS_ROCKZAPP || item->ActiveState == TONYBOSS_BIGBOOM) + if (item->Animation.ActiveState == TONYBOSS_ROCKZAPP || item->Animation.ActiveState == TONYBOSS_BIGBOOM) { pos1.x = pos1.y = pos1.z = 0; GetJointAbsPosition(item, &pos1, 13); diff --git a/TR5Main/Objects/TR3/Entity/tr3_trex.cpp b/TR5Main/Objects/TR3/Entity/tr3_trex.cpp index 4a92d0a86..71faeaec8 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_trex.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_trex.cpp @@ -25,7 +25,7 @@ enum TRexAnim void LaraTRexDeath(ITEM_INFO* tRexItem, ITEM_INFO* laraItem) { - tRexItem->TargetState = 8; + tRexItem->Animation.TargetState = 8; if (laraItem->RoomNumber != tRexItem->RoomNumber) ItemNewRoom(Lara.ItemNumber, tRexItem->RoomNumber); @@ -36,12 +36,12 @@ void LaraTRexDeath(ITEM_INFO* tRexItem, ITEM_INFO* laraItem) laraItem->Position.xRot = 0; laraItem->Position.yRot = tRexItem->Position.yRot; laraItem->Position.zRot = 0; - laraItem->Airborne = false; + laraItem->Animation.Airborne = false; - laraItem->AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex + 1; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = LS_DEATH; - laraItem->TargetState = LS_DEATH; + laraItem->Animation.AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex + 1; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = LS_DEATH; + laraItem->Animation.TargetState = LS_DEATH; laraItem->HitPoints = -16384; Lara.Air = -1; @@ -66,10 +66,10 @@ void TRexControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState == 1) - item->TargetState = 5; + if (item->Animation.ActiveState == 1) + item->Animation.TargetState = 5; else - item->TargetState = 1; + item->Animation.TargetState = 1; } else { @@ -85,7 +85,7 @@ void TRexControl(short itemNumber) angle = CreatureTurn(item, info->MaxTurn); if (item->TouchBits) - LaraItem->HitPoints -= (item->ActiveState == 3) ? 10 : 1; + LaraItem->HitPoints -= (item->Animation.ActiveState == 3) ? 10 : 1; info->Flags = (info->Mood != MoodType::Escape && !aiInfo.ahead && aiInfo.enemyFacing > -FRONT_ARC && aiInfo.enemyFacing < FRONT_ARC); @@ -96,28 +96,28 @@ void TRexControl(short itemNumber) info->Flags = 1; } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (aiInfo.distance < pow(1500, 2) && aiInfo.bite) - item->TargetState = 7; + item->Animation.TargetState = 7; else if (info->Mood == MoodType::Bored || info->Flags) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; case 2: info->MaxTurn = ANGLE(2.0f); if (info->Mood != MoodType::Bored || !info->Flags) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (aiInfo.ahead && GetRandomControl() < 0x200) { - item->RequiredState = 6; - item->TargetState = 1; + item->Animation.RequiredState = 6; + item->Animation.TargetState = 1; } break; @@ -126,30 +126,30 @@ void TRexControl(short itemNumber) info->MaxTurn = ANGLE(4.0f); if (aiInfo.distance < pow(SECTOR(5), 2) && aiInfo.bite) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (info->Flags) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (info->Mood != MoodType::Escape && aiInfo.ahead && GetRandomControl() < 0x200) { - item->RequiredState = 6; - item->TargetState = 1; + item->Animation.RequiredState = 6; + item->Animation.TargetState = 1; } else if (info->Mood == MoodType::Bored) - item->TargetState = 1; + item->Animation.TargetState = 1; break; case 7: if (item->TouchBits & 0x3000) { - item->TargetState = 8; + item->Animation.TargetState = 8; LaraItem->HitPoints -= 1500; LaraItem->HitStatus = true; LaraTRexDeath(item, LaraItem); } - item->RequiredState = 2; + item->Animation.RequiredState = 2; break; } } diff --git a/TR5Main/Objects/TR3/Entity/tr3_tribesman.cpp b/TR5Main/Objects/TR3/Entity/tr3_tribesman.cpp index c38740344..278ffa19b 100644 --- a/TR5Main/Objects/TR3/Entity/tr3_tribesman.cpp +++ b/TR5Main/Objects/TR3/Entity/tr3_tribesman.cpp @@ -64,16 +64,16 @@ void TribemanAxeControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 9) + if (item->Animation.ActiveState != 9) { - if (item->ActiveState == 1 || - item->ActiveState == 7) - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 21; + if (item->Animation.ActiveState == 1 || + item->Animation.ActiveState == 7) + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 21; else - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 20; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 20; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 9; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 9; } } else @@ -97,7 +97,7 @@ void TribemanAxeControl(short itemNumber) if (AI.ahead) head = AI.angle; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->MaxTurn = ANGLE(4.0f); @@ -108,33 +108,33 @@ void TribemanAxeControl(short itemNumber) creature->MaxTurn = 0; if (GetRandomControl() < 0x100) - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && AI.ahead && !item->HitStatus) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (item->ItemFlags[0]) { item->ItemFlags[0] = 0; - item->TargetState = 11; + item->Animation.TargetState = 11; } else if (AI.ahead && AI.distance < pow(682, 2)) - item->TargetState = 7; + item->Animation.TargetState = 7; else if (AI.ahead && AI.distance < pow(SECTOR(1), 2)) { if (GetRandomControl() < 0x4000) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 7; + item->Animation.TargetState = 7; } else if (AI.ahead && AI.distance < pow(SECTOR(2), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -146,26 +146,26 @@ void TribemanAxeControl(short itemNumber) { creature->MaxTurn = 0; if (GetRandomControl() < 0x100) - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && AI.ahead && !item->HitStatus) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (AI.ahead && AI.distance < pow(682, 2)) { if (GetRandomControl() < 0x800) - item->TargetState = 5; + item->Animation.TargetState = 5; else - item->TargetState = 8; + item->Animation.TargetState = 8; } else if (AI.distance < pow(SECTOR(2), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -180,22 +180,22 @@ void TribemanAxeControl(short itemNumber) if (GetRandomControl() < 0x100) { if (GetRandomControl() < 0x2000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 11; + item->Animation.TargetState = 11; } } else if (creature->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (AI.ahead && AI.distance < pow(682, 2)) { if (GetRandomControl() < 0x2000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 11; + item->Animation.TargetState = 11; } else if (AI.distance > pow(SECTOR(2), 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -210,21 +210,21 @@ void TribemanAxeControl(short itemNumber) if (GetRandomControl() < 0x100) { if (GetRandomControl() < 0x4000) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 11; + item->Animation.TargetState = 11; } } else if (creature->Mood == MoodType::Escape && Lara.TargetEntity != item && AI.ahead) - item->TargetState = 11; + item->Animation.TargetState = 11; else if (AI.bite || AI.distance < pow(SECTOR(2), 2)) { if (GetRandomControl() < 0x4000) - item->TargetState = 12; + item->Animation.TargetState = 12; else if (GetRandomControl() < 0x2000) - item->TargetState = 10; + item->Animation.TargetState = 10; else - item->TargetState = 2; + item->Animation.TargetState = 2; } break; @@ -232,9 +232,9 @@ void TribemanAxeControl(short itemNumber) case 8: creature->MaxTurn = ANGLE(4.0f); if (AI.bite || AI.distance < pow(682, 2)) - item->TargetState = 6; + item->Animation.TargetState = 6; else - item->TargetState = 11; + item->Animation.TargetState = 11; break; @@ -245,20 +245,20 @@ void TribemanAxeControl(short itemNumber) case 12: item->ItemFlags[0] = 1; creature->MaxTurn = ANGLE(4.0f); - creature->Flags = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + creature->Flags = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if (creature->Enemy == LaraItem) { if (item->TouchBits & 0x2000 && - creature->Flags >= TribesmanAxeHit[item->ActiveState][0] && - creature->Flags <= TribesmanAxeHit[item->ActiveState][1]) + creature->Flags >= TribesmanAxeHit[item->Animation.ActiveState][0] && + creature->Flags <= TribesmanAxeHit[item->Animation.ActiveState][1]) { - for (int i = 0; i < TribesmanAxeHit[item->ActiveState][2]; i += 8) + for (int i = 0; i < TribesmanAxeHit[item->Animation.ActiveState][2]; i += 8) CreatureEffect(item, &TribesmanAxeBite, DoBloodSplat); SoundEffect(70, &item->Position, 0); - LaraItem->HitPoints -= TribesmanAxeHit[item->ActiveState][2]; + LaraItem->HitPoints -= TribesmanAxeHit[item->Animation.ActiveState][2]; LaraItem->HitStatus = true; } } @@ -269,8 +269,8 @@ void TribemanAxeControl(short itemNumber) if (abs(creature->Enemy->Position.xPos - item->Position.xPos) < 512 && abs(creature->Enemy->Position.yPos - item->Position.yPos) < 512 && abs(creature->Enemy->Position.zPos - item->Position.zPos) < 512 && - creature->Flags >= TribesmanAxeHit[item->ActiveState][0] && - creature->Flags <= TribesmanAxeHit[item->ActiveState][1]) + creature->Flags >= TribesmanAxeHit[item->Animation.ActiveState][0] && + creature->Flags <= TribesmanAxeHit[item->Animation.ActiveState][1]) { creature->Enemy->HitPoints -= 2; creature->Enemy->HitStatus = true; @@ -324,7 +324,7 @@ static void TribesmanShotDart(ITEM_INFO* item) dartItem->Position.xRot = angles[1]; dartItem->Position.yRot = angles[0]; - dartItem->Velocity = CLICK(1); + dartItem->Animation.Velocity = CLICK(1); AddActiveItem(dartItemNumber); @@ -358,15 +358,15 @@ void TribemanDartsControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != 9) + if (item->Animation.ActiveState != 9) { - if (item->ActiveState == 1 || item->ActiveState == 4) - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 21; + if (item->Animation.ActiveState == 1 || item->Animation.ActiveState == 4) + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 21; else - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 20; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 20; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; - item->ActiveState = 9; + item->Animation.ActiveState = 9; } } else @@ -398,7 +398,7 @@ void TribemanDartsControl(short itemNumber) AlertAllGuards(itemNumber); } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: if (AI.ahead) @@ -416,31 +416,31 @@ void TribemanDartsControl(short itemNumber) torsoX = 0; creature->MaxTurn = 0; if (!(GetRandomControl() & 0xFF)) - item->TargetState = 11; + item->Animation.TargetState = 11; break; } else if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && AI.ahead && !item->HitStatus) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (AI.bite && AI.distance < pow(SECTOR(0.5f), 2)) - item->TargetState = 11; + item->Animation.TargetState = 11; else if (AI.bite && AI.distance < pow(SECTOR(2), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (Targetable(item, &AI) && AI.distance < pow(MAX_VISIBILITY_DISTANCE, 2)) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (creature->Mood == MoodType::Bored) { if (GetRandomControl() < 0x200) - item->TargetState = 2; + item->Animation.TargetState = 2; else break; } else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -456,27 +456,27 @@ void TribemanDartsControl(short itemNumber) torsoX = 0; if (!(GetRandomControl() & 0xFF)) - item->TargetState = 1; + item->Animation.TargetState = 1; break; } else if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && AI.ahead && !item->HitStatus) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (AI.bite && AI.distance < pow(SECTOR(0.5f), 2)) - item->TargetState = 6; + item->Animation.TargetState = 6; else if (AI.bite && AI.distance < pow(SECTOR(2), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (Targetable(item, &AI) && AI.distance < pow(MAX_VISIBILITY_DISTANCE, 2)) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (creature->Mood == MoodType::Bored && GetRandomControl() < 0x200) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -484,24 +484,24 @@ void TribemanDartsControl(short itemNumber) creature->MaxTurn = ANGLE(9.0f); if (AI.bite && AI.distance < pow(SECTOR(0.5f), 2)) - item->TargetState = 11; + item->Animation.TargetState = 11; else if (AI.bite && AI.distance < pow(SECTOR(2), 2)) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (Targetable(item, &AI) && AI.distance < pow(MAX_VISIBILITY_DISTANCE, 2)) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (creature->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (creature->Mood == MoodType::Bored) { if (GetRandomControl() > 0x200) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (GetRandomControl() > 0x200) - item->TargetState = 11; + item->Animation.TargetState = 11; else - item->TargetState = 1; + item->Animation.TargetState = 1; } else if (AI.distance > pow(SECTOR(2), 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -511,24 +511,24 @@ void TribemanDartsControl(short itemNumber) tilt = angle / 4; if (AI.bite && AI.distance < pow(SECTOR(0.5f), 2)) - item->TargetState = 11; + item->Animation.TargetState = 11; else if (Targetable(item, &AI) && AI.distance < pow(MAX_VISIBILITY_DISTANCE, 2), 2) - item->TargetState = 1; + item->Animation.TargetState = 1; if (item->AIBits & GUARD) - item->TargetState = 11; + item->Animation.TargetState = 11; else if (creature->Mood == MoodType::Escape && Lara.TargetEntity != item && AI.ahead) - item->TargetState = 11; + item->Animation.TargetState = 11; else if (creature->Mood == MoodType::Bored) - item->TargetState = 1; + item->Animation.TargetState = 1; break; case 8: if (!AI.bite || AI.distance > pow(SECTOR(0.5f), 2)) - item->TargetState = 11; + item->Animation.TargetState = 11; else - item->TargetState = 6; + item->Animation.TargetState = 6; break; @@ -548,10 +548,10 @@ void TribemanDartsControl(short itemNumber) else item->Position.yRot += ANGLE(2.0f); - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 15) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 15) { TribesmanShotDart(item); - item->TargetState = 1; + item->Animation.TargetState = 1; } break; diff --git a/TR5Main/Objects/TR3/Trap/train.cpp b/TR5Main/Objects/TR3/Trap/train.cpp index daa1b515a..ae395f1cf 100644 --- a/TR5Main/Objects/TR3/Trap/train.cpp +++ b/TR5Main/Objects/TR3/Trap/train.cpp @@ -107,15 +107,15 @@ void TrainCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) SoundEffect(SFX_TR3_LARA_FALLDETH, &laraItem->Position, SFX_ALWAYS); StopSoundEffect(SFX_TR3_TUBE_LOOP); - laraItem->AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex + LARA_TRAIN_DEATH_ANIM; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex + LARA_TRAIN_DEATH_ANIM; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; // larA->ActiveState = EXTRA_TRAINKILL; // larA->TargetState = EXTRA_TRAINKILL; laraItem->HitPoints = 0; laraItem->Position.yRot = trainItem->Position.yRot; - laraItem->Velocity = 0; - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; + laraItem->Animation.Velocity = 0; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; AnimateItem(laraItem); diff --git a/TR5Main/Objects/TR3/Vehicles/biggun.cpp b/TR5Main/Objects/TR3/Vehicles/biggun.cpp index 38ddaedeb..be3f5b913 100644 --- a/TR5Main/Objects/TR3/Vehicles/biggun.cpp +++ b/TR5Main/Objects/TR3/Vehicles/biggun.cpp @@ -80,7 +80,7 @@ static bool BigGunTestMount(ITEM_INFO* laraItem, ITEM_INFO* bigGunItem) if (!(TrInput & IN_ACTION) || lara->Control.HandStatus != HandStatus::Free || - laraItem->Airborne) + laraItem->Animation.Airborne) { return false; } @@ -124,7 +124,7 @@ void BigGunFire(ITEM_INFO* laraItem, ITEM_INFO* bigGunItem) projectileItem->Position.xRot = -((bigGun->Rotation.xRot - 32) * ANGLE(1.0f)); projectileItem->Position.yRot = bigGunItem->Position.yRot; projectileItem->Position.zRot = 0; - projectileItem->Velocity = 16; + projectileItem->Animation.Velocity = 16; projectileItem->ItemFlags[0] = BGUN_FLAG_UP_DOWN; AddActiveItem(itemNumber); @@ -162,12 +162,12 @@ void BigGunCollision(short itemNum, ITEM_INFO* laraItem, COLL_INFO* coll) lara->Control.Weapon.GunType = LaraWeaponType::None; } - laraItem->AnimNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_MOUNT; - laraItem->FrameNumber = g_Level.Anims[Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_MOUNT].frameBase; - laraItem->TargetState = BGUN_STATE_MOUNT; - laraItem->ActiveState = BGUN_STATE_MOUNT; + laraItem->Animation.AnimNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_MOUNT; + laraItem->Animation.FrameNumber = g_Level.Anims[Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_MOUNT].frameBase; + laraItem->Animation.TargetState = BGUN_STATE_MOUNT; + laraItem->Animation.ActiveState = BGUN_STATE_MOUNT; laraItem->Position = bigGunItem->Position; - laraItem->Airborne = false; + laraItem->Animation.Airborne = false; lara->Control.HandStatus = HandStatus::Busy; bigGunItem->HitPoints = 1; bigGun->Flags = 0; @@ -242,10 +242,10 @@ bool BigGunControl(ITEM_INFO* laraItem, COLL_INFO* coll) { if (bigGun->Rotation.xRot == BGUN_DISMOUNT_FRAME) { - laraItem->AnimNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_DISMOUNT; - laraItem->FrameNumber = g_Level.Anims[Objects[ID_BIGGUN].animIndex + BGUN_ANIM_DISMOUNT].frameBase; - laraItem->ActiveState = BGUN_STATE_DISMOUNT; - laraItem->TargetState = BGUN_STATE_DISMOUNT; + laraItem->Animation.AnimNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_DISMOUNT; + laraItem->Animation.FrameNumber = g_Level.Anims[Objects[ID_BIGGUN].animIndex + BGUN_ANIM_DISMOUNT].frameBase; + laraItem->Animation.ActiveState = BGUN_STATE_DISMOUNT; + laraItem->Animation.TargetState = BGUN_STATE_DISMOUNT; bigGun->GunRotYAdd = 0; bigGun->BarrelRotating = false; bigGun->Flags = BGUN_FLAG_DISMOUNT; @@ -256,13 +256,13 @@ bool BigGunControl(ITEM_INFO* laraItem, COLL_INFO* coll) bigGun->Rotation.xRot++; } - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case BGUN_STATE_MOUNT: case BGUN_STATE_DISMOUNT: AnimateItem(laraItem); - bigGunItem->AnimNumber = Objects[ID_BIGGUN].animIndex + (laraItem->AnimNumber - Objects[ID_BIGGUN_ANIMS].animIndex); - bigGunItem->FrameNumber = g_Level.Anims[bigGunItem->AnimNumber].frameBase + (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase); + bigGunItem->Animation.AnimNumber = Objects[ID_BIGGUN].animIndex + (laraItem->Animation.AnimNumber - Objects[ID_BIGGUN_ANIMS].animIndex); + bigGunItem->Animation.FrameNumber = g_Level.Anims[bigGunItem->Animation.AnimNumber].frameBase + (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase); if (bigGun->Flags & BGUN_FLAG_DISMOUNT && TestLastFrame(laraItem)) { @@ -275,10 +275,10 @@ bool BigGunControl(ITEM_INFO* laraItem, COLL_INFO* coll) break; case BGUN_STATE_UP_DOWN: - laraItem->AnimNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_UP_DOWN; - laraItem->FrameNumber = g_Level.Anims[Objects[ID_BIGGUN].animIndex + BGUN_ANIM_UP_DOWN].frameBase + bigGun->Rotation.xRot; - bigGunItem->AnimNumber = Objects[ID_BIGGUN].animIndex + (laraItem->AnimNumber - Objects[ID_BIGGUN_ANIMS].animIndex); - bigGunItem->FrameNumber = g_Level.Anims[bigGunItem->AnimNumber].frameBase + (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase); + laraItem->Animation.AnimNumber = Objects[ID_BIGGUN_ANIMS].animIndex + BGUN_ANIM_UP_DOWN; + laraItem->Animation.FrameNumber = g_Level.Anims[Objects[ID_BIGGUN].animIndex + BGUN_ANIM_UP_DOWN].frameBase + bigGun->Rotation.xRot; + bigGunItem->Animation.AnimNumber = Objects[ID_BIGGUN].animIndex + (laraItem->Animation.AnimNumber - Objects[ID_BIGGUN_ANIMS].animIndex); + bigGunItem->Animation.FrameNumber = g_Level.Anims[bigGunItem->Animation.AnimNumber].frameBase + (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase); if (bigGun->FireCount > 0) bigGun->FireCount--; diff --git a/TR5Main/Objects/TR3/Vehicles/kayak.cpp b/TR5Main/Objects/TR3/Vehicles/kayak.cpp index caa7fbb22..a5858b4bb 100644 --- a/TR5Main/Objects/TR3/Vehicles/kayak.cpp +++ b/TR5Main/Objects/TR3/Vehicles/kayak.cpp @@ -188,7 +188,7 @@ void KayakDoWake(ITEM_INFO* kayakItem, int xOffset, int zOffset, short rotate) if (waterHeight != NO_HEIGHT) { short angle1, angle2; - if (kayakItem->Velocity < 0) + if (kayakItem->Animation.Velocity < 0) { if (!rotate) { @@ -280,7 +280,7 @@ KayakMountType KayakGetMountType(ITEM_INFO* laraItem, short itemNumber) if (!(TrInput & IN_ACTION) || lara->Control.HandStatus != HandStatus::Free || - laraItem->Airborne) + laraItem->Animation.Airborne) { return KayakMountType::None; } @@ -614,8 +614,8 @@ void KayakToBackground(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) int rightHeight = KayakTestHeight(kayakItem, KAYAK_X, KAYAK_Z, &rightPos); kayakItem->Position.yRot += kayak->TurnRate / (USHRT_MAX + 1); - kayakItem->Position.xPos += kayakItem->Velocity * phd_sin(kayakItem->Position.yRot); - kayakItem->Position.zPos += kayakItem->Velocity * phd_cos(kayakItem->Position.yRot); + kayakItem->Position.xPos += kayakItem->Animation.Velocity * phd_sin(kayakItem->Position.yRot); + kayakItem->Position.zPos += kayakItem->Animation.Velocity * phd_cos(kayakItem->Position.yRot); KayakDoCurrent(laraItem,kayakItem); @@ -623,7 +623,7 @@ void KayakToBackground(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) kayak->RightVerticalVelocity = KayakDoDynamics(rightHeight, kayak->RightVerticalVelocity, &rightPos.y); kayak->FrontVerticalVelocity = KayakDoDynamics(frontHeight, kayak->FrontVerticalVelocity, &frontPos.y); - kayakItem->VerticalVelocity = KayakDoDynamics(kayak->WaterHeight, kayakItem->VerticalVelocity, &kayakItem->Position.yPos); + kayakItem->Animation.VerticalVelocity = KayakDoDynamics(kayak->WaterHeight, kayakItem->Animation.VerticalVelocity, &kayakItem->Position.yPos); int height2 = (leftPos.y + rightPos.y) / 2; int x = phd_atan(1024, kayakItem->Position.yPos - frontPos.y); @@ -733,16 +733,16 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) auto* kayak = (KayakInfo*)kayakItem->Data; if (laraItem->HitPoints <= 0 && - laraItem->ActiveState != KAYAK_STATE_IDLE_DEATH) + laraItem->Animation.ActiveState != KAYAK_STATE_IDLE_DEATH) { - laraItem->AnimNumber = Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_IDLE_DEATH; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = laraItem->TargetState = KAYAK_STATE_IDLE_DEATH; + laraItem->Animation.AnimNumber = Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_IDLE_DEATH; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = KAYAK_STATE_IDLE_DEATH; } - int frame = laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase; + int frame = laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case KAYAK_STATE_IDLE: if (TrInput & KAYAK_IN_DISMOUNT && @@ -751,26 +751,26 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) { if (TrInput & KAYAK_IN_LEFT && KayakCanGetOut(kayakItem, -1)) { - laraItem->TargetState = KAYAK_STATE_DISMOUNT; - laraItem->RequiredState = KAYAK_STATE_DISMOUNT_LEFT; + laraItem->Animation.TargetState = KAYAK_STATE_DISMOUNT; + laraItem->Animation.RequiredState = KAYAK_STATE_DISMOUNT_LEFT; } else if (TrInput & KAYAK_IN_RIGHT && KayakCanGetOut(kayakItem, 1)) { - laraItem->TargetState = KAYAK_STATE_DISMOUNT; - laraItem->RequiredState = KAYAK_STATE_DISMOUNT_RIGHT; + laraItem->Animation.TargetState = KAYAK_STATE_DISMOUNT; + laraItem->Animation.RequiredState = KAYAK_STATE_DISMOUNT_RIGHT; } } else if (TrInput & KAYAK_IN_FORWARD) { - laraItem->TargetState = KAYAK_STATE_TURN_RIGHT; + laraItem->Animation.TargetState = KAYAK_STATE_TURN_RIGHT; kayak->Turn = false; kayak->Forward = true; } else if (TrInput & KAYAK_IN_BACK) - laraItem->TargetState = KAYAK_STATE_BACK; + laraItem->Animation.TargetState = KAYAK_STATE_BACK; else if (TrInput & KAYAK_IN_LEFT) { - laraItem->TargetState = KAYAK_STATE_TURN_LEFT; + laraItem->Animation.TargetState = KAYAK_STATE_TURN_LEFT; if (kayak->Velocity) kayak->Turn = false; @@ -782,7 +782,7 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) else if (TrInput & KAYAK_IN_RIGHT) { - laraItem->TargetState = KAYAK_STATE_TURN_RIGHT; + laraItem->Animation.TargetState = KAYAK_STATE_TURN_RIGHT; if (kayak->Velocity) kayak->Turn = false; @@ -796,14 +796,14 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) lara->WaterCurrentPull.x || lara->WaterCurrentPull.z)) { - laraItem->TargetState = KAYAK_STATE_HOLD_LEFT; + laraItem->Animation.TargetState = KAYAK_STATE_HOLD_LEFT; } else if (TrInput & KAYAK_IN_HOLD_RIGHT && (kayak->Velocity || lara->WaterCurrentPull.x || lara->WaterCurrentPull.z)) { - laraItem->TargetState = KAYAK_STATE_HOLD_RIGHT; + laraItem->Animation.TargetState = KAYAK_STATE_HOLD_RIGHT; } break; @@ -826,16 +826,16 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) if (TrInput & KAYAK_IN_LEFT) { if ((kayak->LeftRightCount & ~0x80) >= 2) - laraItem->TargetState = KAYAK_STATE_TURN_RIGHT; + laraItem->Animation.TargetState = KAYAK_STATE_TURN_RIGHT; } else - laraItem->TargetState = KAYAK_STATE_TURN_RIGHT; + laraItem->Animation.TargetState = KAYAK_STATE_TURN_RIGHT; } else - laraItem->TargetState = KAYAK_STATE_IDLE; + laraItem->Animation.TargetState = KAYAK_STATE_IDLE; } else if (!(TrInput & KAYAK_IN_LEFT)) - laraItem->TargetState = KAYAK_STATE_IDLE; + laraItem->Animation.TargetState = KAYAK_STATE_IDLE; if (frame == 7) { @@ -885,17 +885,17 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) if (TrInput & KAYAK_IN_RIGHT) { if ((kayak->LeftRightCount & ~0x80) >= 2) - laraItem->TargetState = KAYAK_STATE_TURN_LEFT; + laraItem->Animation.TargetState = KAYAK_STATE_TURN_LEFT; } else - laraItem->TargetState = KAYAK_STATE_TURN_LEFT; + laraItem->Animation.TargetState = KAYAK_STATE_TURN_LEFT; } else - laraItem->TargetState = KAYAK_STATE_IDLE; + laraItem->Animation.TargetState = KAYAK_STATE_IDLE; } else if (!(TrInput & KAYAK_IN_RIGHT)) - laraItem->TargetState = KAYAK_STATE_IDLE; + laraItem->Animation.TargetState = KAYAK_STATE_IDLE; if (frame == 7) { @@ -930,9 +930,9 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) case KAYAK_STATE_BACK: if (!(TrInput & KAYAK_IN_BACK)) - laraItem->TargetState = KAYAK_STATE_IDLE; + laraItem->Animation.TargetState = KAYAK_STATE_IDLE; - if ((laraItem->AnimNumber - Objects[ID_KAYAK_LARA_ANIMS].animIndex) == KAYAK_ANIM_PADDLE_BACK) + if ((laraItem->Animation.AnimNumber - Objects[ID_KAYAK_LARA_ANIMS].animIndex) == KAYAK_ANIM_PADDLE_BACK) { if (frame == 8) { @@ -961,9 +961,9 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) !lara->WaterCurrentPull.x && !lara->WaterCurrentPull.z)) { - laraItem->TargetState = KAYAK_STATE_IDLE; + laraItem->Animation.TargetState = KAYAK_STATE_IDLE; } - else if ((laraItem->AnimNumber - Objects[ID_KAYAK_LARA_ANIMS].animIndex) == KAYAK_ANIM_HOLD_PADDLE_LEFT) + else if ((laraItem->Animation.AnimNumber - Objects[ID_KAYAK_LARA_ANIMS].animIndex) == KAYAK_ANIM_HOLD_PADDLE_LEFT) { if (kayak->Velocity >= 0) { @@ -997,9 +997,9 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) !lara->WaterCurrentPull.x && !lara->WaterCurrentPull.z)) { - laraItem->TargetState = KAYAK_STATE_IDLE; + laraItem->Animation.TargetState = KAYAK_STATE_IDLE; } - else if ((laraItem->AnimNumber - Objects[ID_KAYAK_LARA_ANIMS].animIndex) == KAYAK_ANIM_HOLD_PADDLE_RIGHT) + else if ((laraItem->Animation.AnimNumber - Objects[ID_KAYAK_LARA_ANIMS].animIndex) == KAYAK_ANIM_HOLD_PADDLE_RIGHT) { if (kayak->Velocity >= 0) { @@ -1028,7 +1028,7 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) break; case KAYAK_STATE_MOUNT_LEFT: - if (laraItem->AnimNumber == Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_GET_PADDLE && + if (laraItem->Animation.AnimNumber == Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_GET_PADDLE && frame == 24 && !(kayak->Flags & 0x80)) { @@ -1040,7 +1040,7 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) break; case KAYAK_STATE_DISMOUNT: - if (laraItem->AnimNumber == Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_DISMOUNT_START && + if (laraItem->Animation.AnimNumber == Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_DISMOUNT_START && frame == 27 && kayak->Flags & 0x80) { @@ -1049,11 +1049,11 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) laraItem->MeshBits |= LARA_LEG_BITS; } - laraItem->TargetState = laraItem->RequiredState; + laraItem->Animation.TargetState = laraItem->Animation.RequiredState; break; case KAYAK_STATE_DISMOUNT_LEFT: - if (laraItem->AnimNumber == Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_DISMOUNT_LEFT && + if (laraItem->Animation.AnimNumber == Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_DISMOUNT_LEFT && frame == 83) { PHD_VECTOR vec = { 0, 350, 500 }; @@ -1066,9 +1066,9 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) laraItem->Position.xRot = 0; laraItem->Position.yRot = kayakItem->Position.yRot - ANGLE(90.0f); laraItem->Position.zRot = 0; - laraItem->Velocity = 40; - laraItem->VerticalVelocity = -50; - laraItem->Airborne = true; + laraItem->Animation.Velocity = 40; + laraItem->Animation.VerticalVelocity = -50; + laraItem->Animation.Airborne = true; lara->Control.HandStatus = HandStatus::Free; lara->Vehicle = NO_ITEM; kayak->LeftRightCount = 0; @@ -1077,7 +1077,7 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) break; case KAYAK_STATE_DISMOUNT_RIGHT: - if (laraItem->AnimNumber == Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_DISMOUNT_RIGHT && + if (laraItem->Animation.AnimNumber == Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_DISMOUNT_RIGHT && frame == 83) { PHD_VECTOR vec = { 0, 350, 500 }; @@ -1090,9 +1090,9 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) laraItem->Position.xRot = 0; laraItem->Position.yRot = kayakItem->Position.yRot + ANGLE(90.0f); laraItem->Position.zRot = 0; - laraItem->Velocity = 40; - laraItem->VerticalVelocity = -50; - laraItem->Airborne = true; + laraItem->Animation.Velocity = 40; + laraItem->Animation.VerticalVelocity = -50; + laraItem->Animation.Airborne = true; lara->Control.HandStatus = HandStatus::Free; lara->Vehicle = NO_ITEM; kayak->LeftRightCount = 0; @@ -1117,7 +1117,7 @@ void KayakUserInput(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) else if (kayak->Velocity < -MAX_VELOCITY) kayak->Velocity = -MAX_VELOCITY; - kayakItem->Velocity = (kayak->Velocity / (USHRT_MAX + 1)); + kayakItem->Animation.Velocity = (kayak->Velocity / (USHRT_MAX + 1)); ; if (kayak->TurnRate >= 0) { @@ -1159,7 +1159,7 @@ void KayakToItemCollision(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) if (object->collision && (item->ObjectNumber == ID_TEETH_SPIKES || item->ObjectNumber == ID_DARTS && - item->ActiveState != 1)) + item->Animation.ActiveState != 1)) { int x = kayakItem->Position.xPos - item->Position.xPos; int y = kayakItem->Position.yPos - item->Position.yPos; @@ -1171,7 +1171,7 @@ void KayakToItemCollision(ITEM_INFO* laraItem, ITEM_INFO* kayakItem) { if (TestBoundsCollide(item, kayakItem, KAYAK_TO_ENTITY_RADIUS)) { - DoLotsOfBlood(laraItem->Position.xPos, laraItem->Position.yPos - STEP_SIZE, laraItem->Position.zPos, kayakItem->Velocity, kayakItem->Position.yRot, laraItem->RoomNumber, 3); + DoLotsOfBlood(laraItem->Position.xPos, laraItem->Position.yPos - STEP_SIZE, laraItem->Position.zPos, kayakItem->Animation.Velocity, kayakItem->Position.yRot, laraItem->RoomNumber, 3); laraItem->HitPoints -= 5; } } @@ -1187,14 +1187,14 @@ void KayakLaraRapidsDrown(ITEM_INFO* laraItem) { auto* lara = GetLaraInfo(laraItem); - laraItem->AnimNumber = Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_OVERBOARD_DEATH; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = 12; // TODO - laraItem->TargetState = 12; + laraItem->Animation.AnimNumber = Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_OVERBOARD_DEATH; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = 12; // TODO + laraItem->Animation.TargetState = 12; laraItem->HitPoints = 0; - laraItem->Velocity = 0; - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; + laraItem->Animation.Velocity = 0; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; AnimateItem(laraItem); @@ -1227,21 +1227,21 @@ void KayakCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) } if (mountType == KayakMountType::Right) - laraItem->AnimNumber = Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_MOUNT_RIGHT; + laraItem->Animation.AnimNumber = Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_MOUNT_RIGHT; else if (mountType == KayakMountType::Left) - laraItem->AnimNumber = Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_MOUNT_LEFT; + laraItem->Animation.AnimNumber = Objects[ID_KAYAK_LARA_ANIMS].animIndex + KAYAK_ANIM_MOUNT_LEFT; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = laraItem->TargetState = KAYAK_STATE_MOUNT_LEFT; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = KAYAK_STATE_MOUNT_LEFT; laraItem->Position.xPos = kayakItem->Position.xPos; laraItem->Position.yPos = kayakItem->Position.yPos; laraItem->Position.zPos = kayakItem->Position.zPos; laraItem->Position.xRot = 0; laraItem->Position.yRot = kayakItem->Position.yRot; laraItem->Position.zRot = 0; - laraItem->Velocity = 0; - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; + laraItem->Animation.Velocity = 0; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; lara->Control.WaterStatus = WaterStatus::Dry; if (laraItem->RoomNumber != kayakItem->RoomNumber) @@ -1268,7 +1268,7 @@ bool KayakControl(ITEM_INFO* laraItem) if (TrInput & IN_LOOK) LookUpDown(laraItem); - int ofs = kayakItem->VerticalVelocity; + int ofs = kayakItem->Animation.VerticalVelocity; KayakUserInput(laraItem, kayakItem); KayakToBackground(laraItem, kayakItem); @@ -1290,11 +1290,11 @@ bool KayakControl(ITEM_INFO* laraItem) kayak->TrueWater = true; } - if ((ofs - kayakItem->VerticalVelocity) > 128 && - kayakItem->VerticalVelocity == 0 && + if ((ofs - kayakItem->Animation.VerticalVelocity) > 128 && + kayakItem->Animation.VerticalVelocity == 0 && water != NO_HEIGHT) { - int damage = ofs - kayakItem->VerticalVelocity; + int damage = ofs - kayakItem->Animation.VerticalVelocity; if (damage > 160) laraItem->HitPoints -= (damage - 160) * 8; } @@ -1316,8 +1316,8 @@ bool KayakControl(ITEM_INFO* laraItem) AnimateItem(laraItem); - kayakItem->AnimNumber = Objects[ID_KAYAK].animIndex + (laraItem->AnimNumber - Objects[ID_KAYAK_LARA_ANIMS].animIndex); - kayakItem->FrameNumber = g_Level.Anims[kayakItem->AnimNumber].frameBase + (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase); + kayakItem->Animation.AnimNumber = Objects[ID_KAYAK].animIndex + (laraItem->Animation.AnimNumber - Objects[ID_KAYAK_LARA_ANIMS].animIndex); + kayakItem->Animation.FrameNumber = g_Level.Anims[kayakItem->Animation.AnimNumber].frameBase + (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase); Camera.targetElevation = -ANGLE(30.0f); Camera.targetDistance = CLICK(8); @@ -1331,7 +1331,7 @@ bool KayakControl(ITEM_INFO* laraItem) if (Wibble & 7) { - if (!kayak->TrueWater && kayakItem->VerticalVelocity < 20) + if (!kayak->TrueWater && kayakItem->Animation.VerticalVelocity < 20) { PHD_VECTOR dest; char cnt = 0; @@ -1352,7 +1352,7 @@ bool KayakControl(ITEM_INFO* laraItem) } } - if (!kayakItem->Velocity && + if (!kayakItem->Animation.Velocity && !lara->WaterCurrentPull.x && !lara->WaterCurrentPull.z) { diff --git a/TR5Main/Objects/TR3/Vehicles/minecart.cpp b/TR5Main/Objects/TR3/Vehicles/minecart.cpp index ee619e580..0a59a0911 100644 --- a/TR5Main/Objects/TR3/Vehicles/minecart.cpp +++ b/TR5Main/Objects/TR3/Vehicles/minecart.cpp @@ -170,7 +170,7 @@ static bool GetInMineCart(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, COLL_INF auto* lara = GetLaraInfo(laraItem); if (!(TrInput & CART_IN_SWIPE) || lara->Control.HandStatus != HandStatus::Free || - laraItem->Airborne) + laraItem->Animation.Airborne) { return false; } @@ -257,16 +257,16 @@ static void CartToEntityCollision(ITEM_INFO* laraItem, ITEM_INFO* minecartItem) { if (item->ObjectNumber == ID_ANIMATING2) { - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase && - (laraItem->ActiveState == CART_STATE_SWIPE && - laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 6)) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase && + (laraItem->Animation.ActiveState == CART_STATE_SWIPE && + laraItem->Animation.AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 6)) { - int frame = laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase; + int frame = laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; if (frame >= 12 && frame <= 22) { SoundEffect(220, &item->Position, 2); TestTriggers(item, true); - item->FrameNumber++; + item->Animation.FrameNumber++; } } } @@ -303,7 +303,7 @@ static void MoveCart(ITEM_INFO* laraItem, ITEM_INFO* minecartItem) { if (minecart->Velocity < 0xf000) { - minecartItem->Velocity = 0; + minecartItem->Animation.Velocity = 0; minecart->Velocity = 0; minecart->Flags |= CART_FLAG_STOPPED | CART_FLAG_CONTROL; return; @@ -389,9 +389,9 @@ static void MoveCart(ITEM_INFO* laraItem, ITEM_INFO* minecartItem) minecart->Velocity += -minecart->Gradient * 4; minecart->Velocity /= 256; // TODO: Then why use the huge values in the first place?? - if (minecartItem->Velocity < CART_MIN_VEL) + if (minecartItem->Animation.Velocity < CART_MIN_VEL) { - minecartItem->Velocity = CART_MIN_VEL; + minecartItem->Animation.Velocity = CART_MIN_VEL; StopSoundEffect(209); if (minecart->VerticalVelocity) @@ -406,12 +406,12 @@ static void MoveCart(ITEM_INFO* laraItem, ITEM_INFO* minecartItem) if (minecart->VerticalVelocity) StopSoundEffect(209); else - SoundEffect(209, &minecartItem->Position, (2 | 4) + 0x1000000 + (minecartItem->Velocity * 32768)); + SoundEffect(209, &minecartItem->Position, (2 | 4) + 0x1000000 + (minecartItem->Animation.Velocity * 32768)); } if (minecart->Flags & (CART_FLAG_TURNING_LEFT | CART_FLAG_TURNING_RIGHT)) { - minecart->TurnLen += minecartItem->Velocity * 3; + minecart->TurnLen += minecartItem->Animation.Velocity * 3; if (minecart->TurnLen > ANGLE(90.0f)) { if (minecart->Flags & CART_FLAG_TURNING_LEFT) @@ -470,8 +470,8 @@ static void MoveCart(ITEM_INFO* laraItem, ITEM_INFO* minecartItem) } else { - minecartItem->Position.xPos += minecartItem->Velocity * phd_sin(minecartItem->Position.yRot); - minecartItem->Position.zPos += minecartItem->Velocity * phd_cos(minecartItem->Position.yRot); + minecartItem->Position.xPos += minecartItem->Animation.Velocity * phd_sin(minecartItem->Position.yRot); + minecartItem->Position.zPos += minecartItem->Animation.Velocity * phd_cos(minecartItem->Position.yRot); } minecart->FloorHeightMiddle = TestMinecartHeight(minecartItem, 0, 0); @@ -508,9 +508,9 @@ static void MoveCart(ITEM_INFO* laraItem, ITEM_INFO* minecartItem) { short val = minecartItem->Position.yRot & 16383; if (minecart->Flags & CART_FLAG_TURNING_RIGHT) - minecartItem->Position.zRot = -(val * minecartItem->Velocity) / 512; + minecartItem->Position.zRot = -(val * minecartItem->Animation.Velocity) / 512; else - minecartItem->Position.zRot = ((ANGLE(90.0f) - val) * minecartItem->Velocity) / 512; + minecartItem->Position.zRot = ((ANGLE(90.0f) - val) * minecartItem->Animation.Velocity) / 512; } else minecartItem->Position.zRot -= minecartItem->Position.zRot / 8; @@ -522,75 +522,75 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn short floorHeight; - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case CART_STATE_MOVE: if (TrInput & CART_IN_SWIPE) - laraItem->TargetState = CART_STATE_SWIPE; + laraItem->Animation.TargetState = CART_STATE_SWIPE; else if (TrInput & CART_IN_DUCK) - laraItem->TargetState = CART_STATE_DUCK; + laraItem->Animation.TargetState = CART_STATE_DUCK; else if (TrInput & CART_IN_BRAKE) - laraItem->TargetState = CART_STATE_BRAKE; + laraItem->Animation.TargetState = CART_STATE_BRAKE; else if (minecart->Velocity == CART_MIN_VEL || minecart->Flags & CART_FLAG_STOPPED) - laraItem->TargetState = CART_STATE_IDLE; + laraItem->Animation.TargetState = CART_STATE_IDLE; else if (minecart->Gradient < CART_FORWARD_GRADIENT) - laraItem->TargetState = CART_STATE_FORWARD; + laraItem->Animation.TargetState = CART_STATE_FORWARD; else if (minecart->Gradient > CART_BACK_GRADIENT) - laraItem->TargetState = CART_STATE_BACK; + laraItem->Animation.TargetState = CART_STATE_BACK; else if (TrInput & CART_IN_LEFT) - laraItem->TargetState = CART_STATE_LEFT; + laraItem->Animation.TargetState = CART_STATE_LEFT; else if (TrInput & CART_IN_RIGHT) - laraItem->TargetState = CART_STATE_RIGHT; + laraItem->Animation.TargetState = CART_STATE_RIGHT; break; case CART_STATE_FORWARD: if (TrInput & CART_IN_SWIPE) - laraItem->TargetState = CART_STATE_SWIPE; + laraItem->Animation.TargetState = CART_STATE_SWIPE; else if (TrInput & CART_IN_DUCK) - laraItem->TargetState = CART_STATE_DUCK; + laraItem->Animation.TargetState = CART_STATE_DUCK; else if (TrInput & CART_IN_BRAKE) - laraItem->TargetState = CART_STATE_BRAKE; + laraItem->Animation.TargetState = CART_STATE_BRAKE; else if (minecart->Gradient > CART_FORWARD_GRADIENT) - laraItem->TargetState = CART_STATE_MOVE; + laraItem->Animation.TargetState = CART_STATE_MOVE; break; case CART_STATE_BACK: if (TrInput & CART_IN_SWIPE) - laraItem->TargetState = CART_STATE_SWIPE; + laraItem->Animation.TargetState = CART_STATE_SWIPE; else if (TrInput & CART_IN_DUCK) - laraItem->TargetState = CART_STATE_DUCK; + laraItem->Animation.TargetState = CART_STATE_DUCK; else if (TrInput & CART_IN_BRAKE) - laraItem->TargetState = CART_STATE_BRAKE; + laraItem->Animation.TargetState = CART_STATE_BRAKE; else if (minecart->Gradient < CART_BACK_GRADIENT) - laraItem->TargetState = CART_STATE_MOVE; + laraItem->Animation.TargetState = CART_STATE_MOVE; break; case CART_STATE_LEFT: if (TrInput & CART_IN_SWIPE) - laraItem->TargetState = CART_STATE_SWIPE; + laraItem->Animation.TargetState = CART_STATE_SWIPE; else if (TrInput & CART_IN_DUCK) - laraItem->TargetState = CART_STATE_DUCK; + laraItem->Animation.TargetState = CART_STATE_DUCK; else if (TrInput & CART_IN_BRAKE) - laraItem->TargetState = CART_STATE_BRAKE; + laraItem->Animation.TargetState = CART_STATE_BRAKE; if (!(TrInput & CART_IN_LEFT)) - laraItem->TargetState = CART_STATE_MOVE; + laraItem->Animation.TargetState = CART_STATE_MOVE; break; case CART_STATE_RIGHT: if (TrInput & CART_IN_SWIPE) - laraItem->TargetState = CART_STATE_SWIPE; + laraItem->Animation.TargetState = CART_STATE_SWIPE; else if (TrInput & CART_IN_DUCK) - laraItem->TargetState = CART_STATE_DUCK; + laraItem->Animation.TargetState = CART_STATE_DUCK; else if (TrInput & CART_IN_BRAKE) - laraItem->TargetState = CART_STATE_BRAKE; + laraItem->Animation.TargetState = CART_STATE_BRAKE; if (!(TrInput & CART_IN_RIGHT)) - laraItem->TargetState = CART_STATE_MOVE; + laraItem->Animation.TargetState = CART_STATE_MOVE; break; @@ -606,46 +606,46 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn { if (TrInput & CART_IN_LEFT && TestMinecartDismount(laraItem, -1)) { - laraItem->TargetState = CART_STATE_DISMOUNT; + laraItem->Animation.TargetState = CART_STATE_DISMOUNT; minecart->Flags &= ~CART_FLAG_RDIR; } else if (TrInput & CART_IN_RIGHT && TestMinecartDismount(laraItem, 1)) { - laraItem->TargetState = CART_STATE_DISMOUNT; + laraItem->Animation.TargetState = CART_STATE_DISMOUNT; minecart->Flags |= CART_FLAG_RDIR; } } if (TrInput & CART_IN_DUCK) - laraItem->TargetState = CART_STATE_DUCK; + laraItem->Animation.TargetState = CART_STATE_DUCK; else if (minecart->Velocity > CART_MIN_VEL) - laraItem->TargetState = CART_STATE_MOVE; + laraItem->Animation.TargetState = CART_STATE_MOVE; break; case CART_STATE_DUCK: if (TrInput & CART_IN_SWIPE) - laraItem->TargetState = CART_STATE_SWIPE; + laraItem->Animation.TargetState = CART_STATE_SWIPE; else if (TrInput & CART_IN_BRAKE) - laraItem->TargetState = CART_STATE_BRAKE; + laraItem->Animation.TargetState = CART_STATE_BRAKE; else if (!(TrInput & CART_IN_DUCK)) - laraItem->TargetState = CART_STATE_IDLE; + laraItem->Animation.TargetState = CART_STATE_IDLE; break; case CART_STATE_SWIPE: - laraItem->TargetState = CART_STATE_MOVE; + laraItem->Animation.TargetState = CART_STATE_MOVE; break; case CART_STATE_BRAKING: if (TrInput & CART_IN_DUCK) { - laraItem->TargetState = CART_STATE_DUCK; + laraItem->Animation.TargetState = CART_STATE_DUCK; StopSoundEffect(219); } else if (!(TrInput & CART_IN_BRAKE) || minecart->Flags & CART_FLAG_STOPPED) { - laraItem->TargetState = CART_STATE_MOVE; + laraItem->Animation.TargetState = CART_STATE_MOVE; StopSoundEffect(219); } else @@ -657,13 +657,13 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn break; case CART_STATE_BRAKE: - laraItem->TargetState = CART_STATE_BRAKING; + laraItem->Animation.TargetState = CART_STATE_BRAKING; break; case CART_STATE_DISMOUNT: - if (laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 7) + if (laraItem->Animation.AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 7) { - if (laraItem->FrameNumber == GetFrameNumber(minecartItem, 20) && + if (laraItem->Animation.FrameNumber == GetFrameNumber(minecartItem, 20) && minecart->Flags & CART_FLAG_MESH) { lara->MeshPtrs[LM_RHAND] = Objects[ID_MINECART_LARA_ANIMS].meshIndex + LM_RHAND; @@ -671,16 +671,16 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn } if (minecart->Flags & CART_FLAG_RDIR) - laraItem->TargetState = CART_STATE_DISMOUNT_RIGHT; + laraItem->Animation.TargetState = CART_STATE_DISMOUNT_RIGHT; else - laraItem->TargetState = CART_STATE_DISMOUNT_LEFT; + laraItem->Animation.TargetState = CART_STATE_DISMOUNT_LEFT; } break; case CART_STATE_DISMOUNT_LEFT: - if (laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 1 && - laraItem->FrameNumber == g_Level.Anims[laraItem->AnimNumber].frameEnd) + if (laraItem->Animation.AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 1 && + laraItem->Animation.FrameNumber == g_Level.Anims[laraItem->Animation.AnimNumber].frameEnd) { PHD_VECTOR pos = { 0, 640, 0 }; GetLaraJointPosition(&pos, LM_HIPS); @@ -701,8 +701,8 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn break; case CART_STATE_DISMOUNT_RIGHT: - if (laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 47 && - laraItem->FrameNumber == g_Level.Anims[laraItem->AnimNumber].frameEnd) + if (laraItem->Animation.AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 47 && + laraItem->Animation.FrameNumber == g_Level.Anims[laraItem->Animation.AnimNumber].frameEnd) { PHD_VECTOR pos = { 0, 640, 0 }; GetLaraJointPosition(&pos, LM_HIPS); @@ -723,8 +723,8 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn break; case CART_STATE_MOUNT: - if (laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 5 && - laraItem->FrameNumber == GetFrameNumber(minecartItem, 20) && + if (laraItem->Animation.AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 5 && + laraItem->Animation.FrameNumber == GetFrameNumber(minecartItem, 20) && !minecart->Flags & CART_FLAG_MESH) { auto temp = g_Level.Meshes[lara->MeshPtrs[LM_RHAND]]; @@ -759,7 +759,7 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn } else { - if (laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 30) + if (laraItem->Animation.AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 30) { minecart->Flags |= CART_FLAG_NO_ANIM; laraItem->HitPoints = -1; @@ -770,10 +770,10 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn case CART_STATE_HIT: if (laraItem->HitPoints <= 0 && - laraItem->FrameNumber == GetFrameNumber(minecartItem, 34) + 28) + laraItem->Animation.FrameNumber == GetFrameNumber(minecartItem, 34) + 28) { - laraItem->FrameNumber = GetFrameNumber(minecartItem, 34) + 28; - minecartItem->Velocity = 0; + laraItem->Animation.FrameNumber = GetFrameNumber(minecartItem, 34) + 28; + minecartItem->Animation.Velocity = 0; minecart->Flags = (minecart->Flags & ~CART_FLAG_CONTROL) | CART_FLAG_NO_ANIM; minecart->Velocity = 0; } @@ -786,20 +786,20 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn { AnimateItem(laraItem); - minecartItem->AnimNumber = Objects[ID_MINECART].animIndex + (laraItem->AnimNumber - Objects[ID_MINECART_LARA_ANIMS].animIndex); - minecartItem->FrameNumber = g_Level.Anims[minecartItem->AnimNumber].frameBase + (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase); + minecartItem->Animation.AnimNumber = Objects[ID_MINECART].animIndex + (laraItem->Animation.AnimNumber - Objects[ID_MINECART_LARA_ANIMS].animIndex); + minecartItem->Animation.FrameNumber = g_Level.Anims[minecartItem->Animation.AnimNumber].frameBase + (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase); } - if (laraItem->ActiveState != CART_TURN_DEATH && - laraItem->ActiveState != CART_WALL_DEATH && + if (laraItem->Animation.ActiveState != CART_TURN_DEATH && + laraItem->Animation.ActiveState != CART_WALL_DEATH && laraItem->HitPoints > 0) { if (minecartItem->Position.zRot > TERMINAL_ANGLE || minecartItem->Position.zRot < -TERMINAL_ANGLE) { - laraItem->AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + 31; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = laraItem->TargetState = CART_TURN_DEATH; - minecartItem->Velocity = 0; + laraItem->Animation.AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + 31; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = CART_TURN_DEATH; + minecartItem->Animation.Velocity = 0; minecart->Flags = (minecart->Flags & ~CART_FLAG_CONTROL) | CART_FLAG_STOPPED | CART_FLAG_DEAD; minecart->Velocity = 0; return; @@ -808,18 +808,18 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn floorHeight = GetMinecartCollision(minecartItem, minecartItem->Position.yRot, CLICK(2)); if (floorHeight < -CLICK(2)) { - laraItem->AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + 23; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = laraItem->TargetState = CART_WALL_DEATH; + laraItem->Animation.AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + 23; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = CART_WALL_DEATH; laraItem->HitPoints = -1; - minecartItem->Velocity = 0; + minecartItem->Animation.Velocity = 0; minecart->Flags = (minecart->Flags & ~CART_FLAG_CONTROL) | (CART_FLAG_STOPPED | CART_FLAG_DEAD); minecart->Velocity = 0; return; } - if (laraItem->ActiveState != CART_STATE_DUCK && - laraItem->ActiveState != CART_STATE_HIT) + if (laraItem->Animation.ActiveState != CART_STATE_DUCK && + laraItem->Animation.ActiveState != CART_STATE_HIT) { COLL_INFO coll; coll.Setup.Radius = CART_RADIUS; @@ -827,10 +827,10 @@ static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartIn if (coll.HitStatic) { - laraItem->AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + 34; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = laraItem->TargetState = CART_STATE_HIT; - DoLotsOfBlood(laraItem->Position.xPos, laraItem->Position.yPos - CLICK(3), laraItem->Position.zPos, minecartItem->Velocity, minecartItem->Position.yRot, laraItem->RoomNumber, 3); + laraItem->Animation.AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + 34; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = CART_STATE_HIT; + DoLotsOfBlood(laraItem->Position.xPos, laraItem->Position.yPos - CLICK(3), laraItem->Position.zPos, minecartItem->Animation.Velocity, minecartItem->Position.yRot, laraItem->RoomNumber, 3); int hits = CART_NHITS * short(minecart->Velocity / 2048); if (hits < 20) @@ -875,13 +875,13 @@ void MineCartCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) short angle = short(mGetAngle(minecartItem->Position.xPos, minecartItem->Position.zPos, laraItem->Position.xPos, laraItem->Position.zPos) - minecartItem->Position.yRot); if (angle > -ANGLE(45.0f) && angle < ANGLE(135.0f)) - laraItem->AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + CART_ANIM_MOUNT_RIGHT; + laraItem->Animation.AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + CART_ANIM_MOUNT_RIGHT; else - laraItem->AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + CART_ANIM_MOUNT_LEFT; + laraItem->Animation.AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + CART_ANIM_MOUNT_LEFT; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->TargetState = CART_STATE_MOUNT; - laraItem->ActiveState = CART_STATE_MOUNT; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.TargetState = CART_STATE_MOUNT; + laraItem->Animation.ActiveState = CART_STATE_MOUNT; laraItem->Position.xPos = minecartItem->Position.xPos; laraItem->Position.yPos = minecartItem->Position.yPos; diff --git a/TR5Main/Objects/TR3/Vehicles/quad.cpp b/TR5Main/Objects/TR3/Vehicles/quad.cpp index e56d265ae..0edef584d 100644 --- a/TR5Main/Objects/TR3/Vehicles/quad.cpp +++ b/TR5Main/Objects/TR3/Vehicles/quad.cpp @@ -237,10 +237,10 @@ static bool QuadCheckGetOff(ITEM_INFO* laraItem, ITEM_INFO* quadItem) if (lara->Vehicle == NO_ITEM) return true; - if ((laraItem->ActiveState == QUAD_STATE_DISMOUNT_RIGHT || laraItem->ActiveState == QUAD_STATE_DISMOUNT_LEFT) && + if ((laraItem->Animation.ActiveState == QUAD_STATE_DISMOUNT_RIGHT || laraItem->Animation.ActiveState == QUAD_STATE_DISMOUNT_LEFT) && TestLastFrame(laraItem)) { - if (laraItem->ActiveState == QUAD_STATE_DISMOUNT_LEFT) + if (laraItem->Animation.ActiveState == QUAD_STATE_DISMOUNT_LEFT) laraItem->Position.yRot += ANGLE(90.0f); else laraItem->Position.yRot -= ANGLE(90.0f); @@ -253,7 +253,7 @@ static bool QuadCheckGetOff(ITEM_INFO* laraItem, ITEM_INFO* quadItem) lara->Vehicle = NO_ITEM; lara->Control.HandStatus = HandStatus::Free; - if (laraItem->ActiveState == QUAD_STATE_FALL_OFF) + if (laraItem->Animation.ActiveState == QUAD_STATE_FALL_OFF) { PHD_VECTOR pos = { 0, 0, 0 }; @@ -263,8 +263,8 @@ static bool QuadCheckGetOff(ITEM_INFO* laraItem, ITEM_INFO* quadItem) laraItem->Position.xPos = pos.x; laraItem->Position.yPos = pos.y; laraItem->Position.zPos = pos.z; - laraItem->VerticalVelocity = quadItem->VerticalVelocity; - laraItem->Airborne = true; + laraItem->Animation.VerticalVelocity = quadItem->Animation.VerticalVelocity; + laraItem->Animation.Airborne = true; laraItem->Position.xRot = 0; laraItem->Position.zRot = 0; laraItem->HitPoints = 0; @@ -273,11 +273,11 @@ static bool QuadCheckGetOff(ITEM_INFO* laraItem, ITEM_INFO* quadItem) return false; } - else if (laraItem->ActiveState == QUAD_STATE_FALL_DEATH) + else if (laraItem->Animation.ActiveState == QUAD_STATE_FALL_DEATH) { - laraItem->TargetState = LS_DEATH; - laraItem->VerticalVelocity = DAMAGE_START + DAMAGE_LENGTH; - laraItem->VerticalVelocity = 0; + laraItem->Animation.TargetState = LS_DEATH; + laraItem->Animation.VerticalVelocity = DAMAGE_START + DAMAGE_LENGTH; + laraItem->Animation.VerticalVelocity = 0; quad->Flags |= QUAD_FLAG_DEAD; return false; @@ -294,7 +294,7 @@ static int GetOnQuadBike(ITEM_INFO* laraItem, ITEM_INFO* quadItem, COLL_INFO* co auto* lara = GetLaraInfo(laraItem); if (!(TrInput & IN_ACTION) || - laraItem->Airborne || + laraItem->Animation.Airborne || lara->Control.HandStatus != HandStatus::Free || quadItem->Flags & ONESHOT || abs(quadItem->Position.yPos - laraItem->Position.yPos) > CLICK(1)) @@ -368,7 +368,7 @@ static void QuadBaddieCollision(ITEM_INFO* laraItem, ITEM_INFO* quadItem) { if (TestBoundsCollide(item, quadItem, QUAD_RADIUS)) { - DoLotsOfBlood(item->Position.xPos, quadItem->Position.yPos - CLICK(1), item->Position.zPos, quadItem->VerticalVelocity, quadItem->Position.yRot, item->RoomNumber, 3); + DoLotsOfBlood(item->Position.xPos, quadItem->Position.yPos - CLICK(1), item->Position.zPos, quadItem->Animation.VerticalVelocity, quadItem->Position.yRot, item->RoomNumber, 3); item->HitPoints = 0; } } @@ -433,7 +433,7 @@ static int TestQuadHeight(ITEM_INFO* quadItem, int dz, int dx, PHD_VECTOR* pos) static int DoQuadShift(ITEM_INFO* quadItem, PHD_VECTOR* pos, PHD_VECTOR* old) { - COLL_RESULT probe; + CollisionResult probe; int x = pos->x / SECTOR(1); int z = pos->z / SECTOR(1); int oldX = old->x / SECTOR(1); @@ -662,9 +662,9 @@ static int QuadDynamics(ITEM_INFO* laraItem, ITEM_INFO* quadItem) auto probe = GetCollisionResult(quadItem); int speed = 0; if (quadItem->Position.yPos >= probe.Position.Floor) - speed = quadItem->VerticalVelocity * phd_cos(quadItem->Position.xRot); + speed = quadItem->Animation.VerticalVelocity * phd_cos(quadItem->Position.xRot); else - speed = quadItem->VerticalVelocity; + speed = quadItem->Animation.VerticalVelocity; quadItem->Position.zPos += speed * phd_cos(quad->MomentumAngle); quadItem->Position.xPos += speed * phd_sin(quad->MomentumAngle); @@ -799,75 +799,75 @@ static void AnimateQuadBike(ITEM_INFO* laraItem, ITEM_INFO* quadItem, int collid auto* quad = (QuadInfo*)quadItem->Data; if (quadItem->Position.yPos != quadItem->Floor && - laraItem->ActiveState != QUAD_STATE_FALL && - laraItem->ActiveState != QUAD_STATE_LAND && - laraItem->ActiveState != QUAD_STATE_FALL_OFF && + laraItem->Animation.ActiveState != QUAD_STATE_FALL && + laraItem->Animation.ActiveState != QUAD_STATE_LAND && + laraItem->Animation.ActiveState != QUAD_STATE_FALL_OFF && !dead) { if (quad->Velocity < 0) - laraItem->AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_LEAP_START; + laraItem->Animation.AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_LEAP_START; else - laraItem->AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_LEAP_START2; + laraItem->Animation.AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_LEAP_START2; - laraItem->FrameNumber = GetFrameNumber(laraItem, laraItem->AnimNumber); - laraItem->ActiveState = QUAD_STATE_FALL; - laraItem->TargetState = QUAD_STATE_FALL; + laraItem->Animation.FrameNumber = GetFrameNumber(laraItem, laraItem->Animation.AnimNumber); + laraItem->Animation.ActiveState = QUAD_STATE_FALL; + laraItem->Animation.TargetState = QUAD_STATE_FALL; } else if (collide && - laraItem->ActiveState != QUAD_STATE_HIT_FRONT && - laraItem->ActiveState != QUAD_STATE_HIT_BACK && - laraItem->ActiveState != QUAD_STATE_HIT_LEFT && - laraItem->ActiveState != QUAD_STATE_HIT_RIGHT && - laraItem->ActiveState != QUAD_STATE_FALL_OFF && + laraItem->Animation.ActiveState != QUAD_STATE_HIT_FRONT && + laraItem->Animation.ActiveState != QUAD_STATE_HIT_BACK && + laraItem->Animation.ActiveState != QUAD_STATE_HIT_LEFT && + laraItem->Animation.ActiveState != QUAD_STATE_HIT_RIGHT && + laraItem->Animation.ActiveState != QUAD_STATE_FALL_OFF && quad->Velocity > (MAX_VELOCITY / 3) && !dead) { if (collide == QUAD_HIT_FRONT) { - laraItem->AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_HIT_BACK; - laraItem->ActiveState = QUAD_STATE_HIT_FRONT; - laraItem->TargetState = QUAD_STATE_HIT_FRONT; + laraItem->Animation.AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_HIT_BACK; + laraItem->Animation.ActiveState = QUAD_STATE_HIT_FRONT; + laraItem->Animation.TargetState = QUAD_STATE_HIT_FRONT; } else if (collide == QUAD_HIT_BACK) { - laraItem->AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_HIT_FRONT; - laraItem->ActiveState = QUAD_STATE_HIT_BACK; - laraItem->TargetState = QUAD_STATE_HIT_BACK; + laraItem->Animation.AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_HIT_FRONT; + laraItem->Animation.ActiveState = QUAD_STATE_HIT_BACK; + laraItem->Animation.TargetState = QUAD_STATE_HIT_BACK; } else if (collide == QUAD_HIT_LEFT) { - laraItem->AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_HIT_RIGHT; - laraItem->ActiveState = QUAD_STATE_HIT_LEFT; - laraItem->TargetState = QUAD_STATE_HIT_LEFT; + laraItem->Animation.AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_HIT_RIGHT; + laraItem->Animation.ActiveState = QUAD_STATE_HIT_LEFT; + laraItem->Animation.TargetState = QUAD_STATE_HIT_LEFT; } else { - laraItem->AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_HIT_LEFT; - laraItem->ActiveState = QUAD_STATE_HIT_RIGHT; - laraItem->TargetState = QUAD_STATE_HIT_RIGHT; + laraItem->Animation.AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_HIT_LEFT; + laraItem->Animation.ActiveState = QUAD_STATE_HIT_RIGHT; + laraItem->Animation.TargetState = QUAD_STATE_HIT_RIGHT; } - laraItem->FrameNumber = GetFrameNumber(laraItem, laraItem->AnimNumber); + laraItem->Animation.FrameNumber = GetFrameNumber(laraItem, laraItem->Animation.AnimNumber); SoundEffect(SFX_TR3_QUAD_FRONT_IMPACT, &quadItem->Position, 0); } else { - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case QUAD_STATE_IDLE: if (dead) - laraItem->TargetState = QUAD_STATE_BIKE_DEATH; + laraItem->Animation.TargetState = QUAD_STATE_BIKE_DEATH; else if (TrInput & QUAD_IN_DISMOUNT && quad->Velocity == 0 && !quad->NoDismount) { if (TrInput & QUAD_IN_LEFT && CanQuadbikeGetOff(-1)) - laraItem->TargetState = QUAD_STATE_DISMOUNT_LEFT; + laraItem->Animation.TargetState = QUAD_STATE_DISMOUNT_LEFT; else if (TrInput & QUAD_IN_RIGHT && CanQuadbikeGetOff(1)) - laraItem->TargetState = QUAD_STATE_DISMOUNT_RIGHT; + laraItem->Animation.TargetState = QUAD_STATE_DISMOUNT_RIGHT; } else if (TrInput & (QUAD_IN_ACCELERATE | QUAD_IN_BRAKE)) - laraItem->TargetState = QUAD_STATE_DRIVE; + laraItem->Animation.TargetState = QUAD_STATE_DRIVE; break; @@ -875,31 +875,31 @@ static void AnimateQuadBike(ITEM_INFO* laraItem, ITEM_INFO* quadItem, int collid if (dead) { if (quad->Velocity > (MAX_VELOCITY / 2)) - laraItem->TargetState = QUAD_STATE_FALL_DEATH; + laraItem->Animation.TargetState = QUAD_STATE_FALL_DEATH; else - laraItem->TargetState = QUAD_STATE_BIKE_DEATH; + laraItem->Animation.TargetState = QUAD_STATE_BIKE_DEATH; } else if (!(TrInput & (QUAD_IN_ACCELERATE | QUAD_IN_BRAKE)) && (quad->Velocity / 256) == 0) { - laraItem->TargetState = QUAD_STATE_IDLE; + laraItem->Animation.TargetState = QUAD_STATE_IDLE; } else if (TrInput & QUAD_IN_LEFT && !quad->DriftStarting) { - laraItem->TargetState = QUAD_STATE_TURN_LEFT; + laraItem->Animation.TargetState = QUAD_STATE_TURN_LEFT; } else if (TrInput & QUAD_IN_RIGHT && !quad->DriftStarting) { - laraItem->TargetState = QUAD_STATE_TURN_RIGHT; + laraItem->Animation.TargetState = QUAD_STATE_TURN_RIGHT; } else if (TrInput & QUAD_IN_BRAKE) { if (quad->Velocity > (MAX_VELOCITY / 3 * 2)) - laraItem->TargetState = QUAD_STATE_BRAKE; + laraItem->Animation.TargetState = QUAD_STATE_BRAKE; else - laraItem->TargetState = QUAD_STATE_SLOW; + laraItem->Animation.TargetState = QUAD_STATE_SLOW; } break; @@ -908,48 +908,48 @@ static void AnimateQuadBike(ITEM_INFO* laraItem, ITEM_INFO* quadItem, int collid case QUAD_STATE_SLOW: case QUAD_STATE_STOP_SLOWLY: if ((quad->Velocity / 256) == 0) - laraItem->TargetState = QUAD_STATE_IDLE; + laraItem->Animation.TargetState = QUAD_STATE_IDLE; else if (TrInput & QUAD_IN_LEFT) - laraItem->TargetState = QUAD_STATE_TURN_LEFT; + laraItem->Animation.TargetState = QUAD_STATE_TURN_LEFT; else if (TrInput & QUAD_IN_RIGHT) - laraItem->TargetState = QUAD_STATE_TURN_RIGHT; + laraItem->Animation.TargetState = QUAD_STATE_TURN_RIGHT; break; case QUAD_STATE_TURN_LEFT: if ((quad->Velocity / 256) == 0) - laraItem->TargetState = QUAD_STATE_IDLE; + laraItem->Animation.TargetState = QUAD_STATE_IDLE; else if (TrInput & QUAD_IN_RIGHT) { - laraItem->AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_TURN_RIGHT_START; - laraItem->FrameNumber = GetFrameNumber(laraItem, laraItem->AnimNumber); - laraItem->ActiveState = QUAD_STATE_TURN_RIGHT; - laraItem->TargetState = QUAD_STATE_TURN_RIGHT; + laraItem->Animation.AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_TURN_RIGHT_START; + laraItem->Animation.FrameNumber = GetFrameNumber(laraItem, laraItem->Animation.AnimNumber); + laraItem->Animation.ActiveState = QUAD_STATE_TURN_RIGHT; + laraItem->Animation.TargetState = QUAD_STATE_TURN_RIGHT; } else if (!(TrInput & QUAD_IN_LEFT)) - laraItem->TargetState = QUAD_STATE_DRIVE; + laraItem->Animation.TargetState = QUAD_STATE_DRIVE; break; case QUAD_STATE_TURN_RIGHT: if ((quad->Velocity / 256) == 0) - laraItem->TargetState = QUAD_STATE_IDLE; + laraItem->Animation.TargetState = QUAD_STATE_IDLE; else if (TrInput & QUAD_IN_LEFT) { - laraItem->AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_TURN_LEFT_START; - laraItem->FrameNumber = GetFrameNumber(laraItem, laraItem->AnimNumber); - laraItem->ActiveState = QUAD_STATE_TURN_LEFT; - laraItem->TargetState = QUAD_STATE_TURN_LEFT; + laraItem->Animation.AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_TURN_LEFT_START; + laraItem->Animation.FrameNumber = GetFrameNumber(laraItem, laraItem->Animation.AnimNumber); + laraItem->Animation.ActiveState = QUAD_STATE_TURN_LEFT; + laraItem->Animation.TargetState = QUAD_STATE_TURN_LEFT; } else if (!(TrInput & QUAD_IN_RIGHT)) - laraItem->TargetState = QUAD_STATE_DRIVE; + laraItem->Animation.TargetState = QUAD_STATE_DRIVE; break; case QUAD_STATE_FALL: if (quadItem->Position.yPos == quadItem->Floor) - laraItem->TargetState = QUAD_STATE_LAND; - else if (quadItem->VerticalVelocity > TERMINAL_VERTICAL_VELOCITY) + laraItem->Animation.TargetState = QUAD_STATE_LAND; + else if (quadItem->Animation.VerticalVelocity > TERMINAL_VERTICAL_VELOCITY) quad->Flags |= QUAD_FLAG_IS_FALLING; break; @@ -962,7 +962,7 @@ static void AnimateQuadBike(ITEM_INFO* laraItem, ITEM_INFO* quadItem, int collid case QUAD_STATE_HIT_LEFT: case QUAD_STATE_HIT_RIGHT: if (TrInput & (QUAD_IN_ACCELERATE | QUAD_IN_BRAKE)) - laraItem->TargetState = QUAD_STATE_DRIVE; + laraItem->Animation.TargetState = QUAD_STATE_DRIVE; break; } @@ -970,7 +970,7 @@ static void AnimateQuadBike(ITEM_INFO* laraItem, ITEM_INFO* quadItem, int collid if (TestEnvironment(ENV_FLAG_WATER, quadItem) || TestEnvironment(ENV_FLAG_SWAMP, quadItem)) { - laraItem->TargetState = QUAD_STATE_FALL_OFF; + laraItem->Animation.TargetState = QUAD_STATE_FALL_OFF; laraItem->Position.yPos = quadItem->Position.yPos + 700; laraItem->RoomNumber = quadItem->RoomNumber; laraItem->HitPoints = 0; @@ -1146,7 +1146,7 @@ static int QuadUserControl(ITEM_INFO* quadItem, int height, int* pitch) quad->Revs = 0; } - quadItem->VerticalVelocity = quad->Velocity / 256; + quadItem->Animation.VerticalVelocity = quad->Velocity / 256; if (quad->EngineRevs > 0x7000) quad->EngineRevs = -0x2000; @@ -1201,16 +1201,16 @@ void QuadBikeCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (angle > -ANGLE(45.0f) && angle < ANGLE(135.0f)) { - laraItem->AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_MOUNT_LEFT; - laraItem->ActiveState = laraItem->TargetState = QUAD_STATE_MOUNT_LEFT; + laraItem->Animation.AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_MOUNT_LEFT; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = QUAD_STATE_MOUNT_LEFT; } else { - laraItem->AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_MOUNT_RIGHT; - laraItem->ActiveState = laraItem->TargetState = QUAD_STATE_MOUNT_RIGHT; + laraItem->Animation.AnimNumber = Objects[ID_QUAD_LARA_ANIMS].animIndex + QUAD_ANIM_MOUNT_RIGHT; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = QUAD_STATE_MOUNT_RIGHT; } - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; laraItem->Position.xPos = quadItem->Position.xPos; laraItem->Position.yPos = quadItem->Position.yPos; laraItem->Position.zPos = quadItem->Position.zPos; @@ -1321,7 +1321,7 @@ bool QuadBikeControl(ITEM_INFO* laraItem, COLL_INFO* coll) collide = false; else { - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case QUAD_STATE_MOUNT_LEFT: case QUAD_STATE_MOUNT_RIGHT: @@ -1364,7 +1364,7 @@ bool QuadBikeControl(ITEM_INFO* laraItem, COLL_INFO* coll) quad->LeftVerticalVelocity = DoQuadDynamics(floorHeightLeft, quad->LeftVerticalVelocity, (int*)&frontLeft.y); quad->RightVerticalVelocity = DoQuadDynamics(floorHeightRight, quad->RightVerticalVelocity, (int*)&frontRight.y); - quadItem->VerticalVelocity = DoQuadDynamics(probe.Position.Floor, quadItem->VerticalVelocity, (int*)&quadItem->Position.yPos); + quadItem->Animation.VerticalVelocity = DoQuadDynamics(probe.Position.Floor, quadItem->Animation.VerticalVelocity, (int*)&quadItem->Position.yPos); probe.Position.Floor = (frontLeft.y + frontRight.y) / 2; short xRot = phd_atan(QUAD_FRONT, quadItem->Position.yPos - probe.Position.Floor); @@ -1386,8 +1386,8 @@ bool QuadBikeControl(ITEM_INFO* laraItem, COLL_INFO* coll) AnimateQuadBike(laraItem, quadItem, collide, dead); AnimateItem(laraItem); - quadItem->AnimNumber = Objects[ID_QUAD].animIndex + (laraItem->AnimNumber - Objects[ID_QUAD_LARA_ANIMS].animIndex); - quadItem->FrameNumber = g_Level.Anims[quadItem->AnimNumber].frameBase + (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase); + quadItem->Animation.AnimNumber = Objects[ID_QUAD].animIndex + (laraItem->Animation.AnimNumber - Objects[ID_QUAD_LARA_ANIMS].animIndex); + quadItem->Animation.FrameNumber = g_Level.Anims[quadItem->Animation.AnimNumber].frameBase + (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase); Camera.targetElevation = -ANGLE(30.0f); @@ -1405,10 +1405,10 @@ bool QuadBikeControl(ITEM_INFO* laraItem, COLL_INFO* coll) } } - if (laraItem->ActiveState != QUAD_STATE_MOUNT_RIGHT && - laraItem->ActiveState != QUAD_STATE_MOUNT_LEFT && - laraItem->ActiveState != QUAD_STATE_DISMOUNT_RIGHT && - laraItem->ActiveState != QUAD_STATE_DISMOUNT_LEFT) + if (laraItem->Animation.ActiveState != QUAD_STATE_MOUNT_RIGHT && + laraItem->Animation.ActiveState != QUAD_STATE_MOUNT_LEFT && + laraItem->Animation.ActiveState != QUAD_STATE_DISMOUNT_RIGHT && + laraItem->Animation.ActiveState != QUAD_STATE_DISMOUNT_LEFT) { PHD_VECTOR pos; int speed = 0; @@ -1421,11 +1421,11 @@ bool QuadBikeControl(ITEM_INFO* laraItem, COLL_INFO* coll) pos.z = quadEffectsPositions[i].z; GetJointAbsPosition(quadItem, &pos, quadEffectsPositions[i].meshNum); angle = quadItem->Position.yRot + ((i == 0) ? 0x9000 : 0x7000); - if (quadItem->VerticalVelocity > 32) + if (quadItem->Animation.VerticalVelocity > 32) { - if (quadItem->VerticalVelocity < 64) + if (quadItem->Animation.VerticalVelocity < 64) { - speed = 64 - quadItem->VerticalVelocity; + speed = 64 - quadItem->Animation.VerticalVelocity; TriggerQuadExhaustSmoke(pos.x, pos.y, pos.z, angle, speed, 1); } } diff --git a/TR5Main/Objects/TR3/Vehicles/rubberboat.cpp b/TR5Main/Objects/TR3/Vehicles/rubberboat.cpp index a2a8adaf8..6e2c09442 100644 --- a/TR5Main/Objects/TR3/Vehicles/rubberboat.cpp +++ b/TR5Main/Objects/TR3/Vehicles/rubberboat.cpp @@ -130,8 +130,8 @@ RubberBoatMountType GetRubberBoatMountType(ITEM_INFO* laraItem, short itemNumber if (!(TrInput & IN_ACTION) || lara->Control.HandStatus != HandStatus::Free || - laraItem->Airborne || - rBoat->Velocity) + laraItem->Animation.Airborne || + rBoat->Animation.Velocity) { return mountType; } @@ -153,12 +153,12 @@ RubberBoatMountType GetRubberBoatMountType(ITEM_INFO* laraItem, short itemNumber } else if (lara->Control.WaterStatus == WaterStatus::Dry) { - if (laraItem->VerticalVelocity > 0) + if (laraItem->Animation.VerticalVelocity > 0) { if ((laraItem->Position.yPos + CLICK(2)) > rBoat->Position.yPos) mountType = RBOAT_MOUNT_JUMP; } - else if (laraItem->VerticalVelocity == 0) + else if (laraItem->Animation.VerticalVelocity == 0) { if (deltaAngle > -ANGLE(135.0f) && deltaAngle < ANGLE(135.0f)) { @@ -397,10 +397,10 @@ static int RubberBoatDynamics(ITEM_INFO* laraItem, short itemNumber) rBoatItem->Position.yRot += rBoat->TurnRate + rBoat->ExtraRotation; rBoat->LeanAngle = rBoat->TurnRate * 6; - rBoatItem->Position.zPos += rBoatItem->Velocity * phd_cos(rBoatItem->Position.yRot); - rBoatItem->Position.xPos += rBoatItem->Velocity * phd_sin(rBoatItem->Position.yRot); - if (rBoatItem->Velocity >= 0) - rBoat->PropellerRotation += (rBoatItem->Velocity * ANGLE(3.0f)) + ANGLE(2.0f); + rBoatItem->Position.zPos += rBoatItem->Animation.Velocity * phd_cos(rBoatItem->Position.yRot); + rBoatItem->Position.xPos += rBoatItem->Animation.Velocity * phd_sin(rBoatItem->Position.yRot); + if (rBoatItem->Animation.Velocity >= 0) + rBoat->PropellerRotation += (rBoatItem->Animation.Velocity * ANGLE(3.0f)) + ANGLE(2.0f); else rBoat->PropellerRotation += ANGLE(33.0f); @@ -468,31 +468,31 @@ static int RubberBoatDynamics(ITEM_INFO* laraItem, short itemNumber) int newVelocity = (rBoatItem->Position.zPos - old.z) * phd_cos(rBoatItem->Position.yRot) + (rBoatItem->Position.xPos - old.x) * phd_sin(rBoatItem->Position.yRot); if (lara->Vehicle == itemNumber && - rBoatItem->Velocity > (RBOAT_MAX_VELOCITY + RBOAT_ACCELERATION) && - newVelocity < rBoatItem->Velocity - 10) + rBoatItem->Animation.Velocity > (RBOAT_MAX_VELOCITY + RBOAT_ACCELERATION) && + newVelocity < rBoatItem->Animation.Velocity - 10) { - laraItem->HitPoints -= rBoatItem->Velocity; + laraItem->HitPoints -= rBoatItem->Animation.Velocity; laraItem->HitStatus = 1; SoundEffect(SFX_TR4_LARA_INJURY, &laraItem->Position, 0); newVelocity /= 2; - rBoatItem->Velocity /= 2; + rBoatItem->Animation.Velocity /= 2; } if (slip) { - if (rBoatItem->Velocity <= RBOAT_MAX_VELOCITY + 10) - rBoatItem->Velocity = newVelocity; + if (rBoatItem->Animation.Velocity <= RBOAT_MAX_VELOCITY + 10) + rBoatItem->Animation.Velocity = newVelocity; } else { - if (rBoatItem->Velocity > 0 && newVelocity < rBoatItem->Velocity) - rBoatItem->Velocity = newVelocity; - else if (rBoatItem->Velocity < 0 && newVelocity > rBoatItem->Velocity) - rBoatItem->Velocity = newVelocity; + if (rBoatItem->Animation.Velocity > 0 && newVelocity < rBoatItem->Animation.Velocity) + rBoatItem->Animation.Velocity = newVelocity; + else if (rBoatItem->Animation.Velocity < 0 && newVelocity > rBoatItem->Animation.Velocity) + rBoatItem->Animation.Velocity = newVelocity; } - if (rBoatItem->Velocity < RBOAT_MAX_BACK) - rBoatItem->Velocity = RBOAT_MAX_BACK; + if (rBoatItem->Animation.Velocity < RBOAT_MAX_BACK) + rBoatItem->Animation.Velocity = RBOAT_MAX_BACK; } return collide; @@ -533,7 +533,7 @@ bool RubberBoatUserControl(ITEM_INFO* laraItem, ITEM_INFO* rBoatItem) if (rBoatItem->Position.yPos >= (rBoat->Water - 128) && rBoat->Water != NO_HEIGHT) { - if (!(TrInput & RBOAT_IN_DISMOUNT) && !(TrInput & IN_LOOK) || rBoatItem->Velocity) + if (!(TrInput & RBOAT_IN_DISMOUNT) && !(TrInput & IN_LOOK) || rBoatItem->Animation.Velocity) { if ((TrInput & RBOAT_IN_LEFT && !(TrInput & RBOAT_IN_BACK)) || (TrInput & RBOAT_IN_RIGHT && TrInput & RBOAT_IN_BACK)) @@ -566,10 +566,10 @@ bool RubberBoatUserControl(ITEM_INFO* laraItem, ITEM_INFO* rBoatItem) if (TrInput & RBOAT_IN_BACK) { - if (rBoatItem->Velocity > 0) - rBoatItem->Velocity -= 5; - else if (rBoatItem->Velocity > -20) - rBoatItem->Velocity += -2; + if (rBoatItem->Animation.Velocity > 0) + rBoatItem->Animation.Velocity -= 5; + else if (rBoatItem->Animation.Velocity > -20) + rBoatItem->Animation.Velocity += -2; } else if (TrInput & RBOAT_IN_FORWARD) { @@ -579,39 +579,39 @@ bool RubberBoatUserControl(ITEM_INFO* laraItem, ITEM_INFO* rBoatItem) else maxVelocity = (TrInput & RBOAT_IN_SLOW) ? 37 : 110; - if (rBoatItem->Velocity < maxVelocity) - rBoatItem->Velocity += 3 + (5 * rBoatItem->Velocity) / (maxVelocity * 2); - else if (rBoatItem->Velocity > (maxVelocity + 1)) - rBoatItem->Velocity -= 1; + if (rBoatItem->Animation.Velocity < maxVelocity) + rBoatItem->Animation.Velocity += 3 + (5 * rBoatItem->Animation.Velocity) / (maxVelocity * 2); + else if (rBoatItem->Animation.Velocity > (maxVelocity + 1)) + rBoatItem->Animation.Velocity -= 1; } else if (TrInput & (RBOAT_IN_LEFT | RBOAT_IN_RIGHT) && - rBoatItem->Velocity >= 0 && - rBoatItem->Velocity < 20) + rBoatItem->Animation.Velocity >= 0 && + rBoatItem->Animation.Velocity < 20) { - if (!(TrInput & RBOAT_IN_DISMOUNT) && rBoatItem->Velocity == 0) - rBoatItem->Velocity = 20; + if (!(TrInput & RBOAT_IN_DISMOUNT) && rBoatItem->Animation.Velocity == 0) + rBoatItem->Animation.Velocity = 20; } - else if (rBoatItem->Velocity > 1) - rBoatItem->Velocity -= 1; + else if (rBoatItem->Animation.Velocity > 1) + rBoatItem->Animation.Velocity -= 1; else - rBoatItem->Velocity = 0; + rBoatItem->Animation.Velocity = 0; } else { if (TrInput & (RBOAT_IN_LEFT | RBOAT_IN_RIGHT) && - rBoatItem->Velocity >= 0 && - rBoatItem->Velocity < 20) + rBoatItem->Animation.Velocity >= 0 && + rBoatItem->Animation.Velocity < 20) { - if (!(TrInput & RBOAT_IN_DISMOUNT) && rBoatItem->Velocity == 0) - rBoatItem->Velocity = 20; + if (!(TrInput & RBOAT_IN_DISMOUNT) && rBoatItem->Animation.Velocity == 0) + rBoatItem->Animation.Velocity = 20; } - else if (rBoatItem->Velocity > 1) - rBoatItem->Velocity -= 1; + else if (rBoatItem->Animation.Velocity > 1) + rBoatItem->Animation.Velocity -= 1; else - rBoatItem->Velocity = 0; + rBoatItem->Animation.Velocity = 0; - if (TrInput & IN_LOOK && rBoatItem->Velocity == 0) + if (TrInput & IN_LOOK && rBoatItem->Animation.Velocity == 0) LookUpDown(laraItem); } } @@ -639,13 +639,13 @@ void RubberBoatCollision(short itemNum, ITEM_INFO* laraItem, COLL_INFO* coll) lara->Vehicle = itemNum; if (mountType == 1) - laraItem->AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_MOUNT_RIGHT; + laraItem->Animation.AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_MOUNT_RIGHT; else if (mountType == 2) - laraItem->AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_MOUNT_LEFT; + laraItem->Animation.AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_MOUNT_LEFT; else if (mountType == 3) - laraItem->AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_MOUNT_JUMP; + laraItem->Animation.AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_MOUNT_JUMP; else - laraItem->AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_IDLE; + laraItem->Animation.AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_IDLE; laraItem->Position.xPos = item->Position.xPos; laraItem->Position.yPos = item->Position.yPos - 5; @@ -653,11 +653,11 @@ void RubberBoatCollision(short itemNum, ITEM_INFO* laraItem, COLL_INFO* coll) laraItem->Position.xRot = 0; laraItem->Position.yRot = item->Position.yRot; laraItem->Position.zRot = 0; - laraItem->Velocity = 0; - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; - laraItem->ActiveState = 0; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.Velocity = 0; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; + laraItem->Animation.ActiveState = 0; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; lara->Control.WaterStatus = WaterStatus::Dry; if (laraItem->RoomNumber != item->RoomNumber) @@ -710,84 +710,84 @@ void RubberBoatAnimation(ITEM_INFO* laraItem, ITEM_INFO* rBoatItem, int collide) if (laraItem->HitPoints <= 0) { - if (laraItem->ActiveState!= RBOAT_STATE_DEATH) + if (laraItem->Animation.ActiveState!= RBOAT_STATE_DEATH) { - laraItem->TargetState = RBOAT_STATE_DEATH; - laraItem->ActiveState = RBOAT_STATE_DEATH; - laraItem->AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_IDLE_DEATH; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.TargetState = RBOAT_STATE_DEATH; + laraItem->Animation.ActiveState = RBOAT_STATE_DEATH; + laraItem->Animation.AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_IDLE_DEATH; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; } } else if (rBoatItem->Position.yPos < (rBoat->Water - CLICK(0.5f)) && - rBoatItem->VerticalVelocity > 0) + rBoatItem->Animation.VerticalVelocity > 0) { - if (laraItem->ActiveState != RBOAT_STATE_FALL) + if (laraItem->Animation.ActiveState != RBOAT_STATE_FALL) { - laraItem->TargetState = RBOAT_STATE_FALL; - laraItem->ActiveState = RBOAT_STATE_FALL; - laraItem->AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_LEAP_START; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.TargetState = RBOAT_STATE_FALL; + laraItem->Animation.ActiveState = RBOAT_STATE_FALL; + laraItem->Animation.AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + RBOAT_ANIM_LEAP_START; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; } } else if (collide) { - if (laraItem->ActiveState != RBOAT_STATE_HIT) + if (laraItem->Animation.ActiveState != RBOAT_STATE_HIT) { - laraItem->TargetState = RBOAT_STATE_HIT; - laraItem->ActiveState = RBOAT_STATE_HIT; - laraItem->AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + collide; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.TargetState = RBOAT_STATE_HIT; + laraItem->Animation.ActiveState = RBOAT_STATE_HIT; + laraItem->Animation.AnimNumber = Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex + collide; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; } } else { - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case RBOAT_STATE_IDLE: if (TrInput & RBOAT_IN_DISMOUNT) { - if (rBoatItem->Velocity == 0) + if (rBoatItem->Animation.Velocity == 0) { if (TrInput & IN_RIGHT && TestRubberBoatDismount(laraItem, rBoatItem->Position.yRot + ANGLE(90.0f))) - laraItem->TargetState = RBOAT_STATE_JUMP_RIGHT; + laraItem->Animation.TargetState = RBOAT_STATE_JUMP_RIGHT; else if (TrInput & IN_LEFT && TestRubberBoatDismount(laraItem, rBoatItem->Position.yRot - ANGLE(90.0f))) - laraItem->TargetState = RBOAT_STATE_JUMP_LEFT; + laraItem->Animation.TargetState = RBOAT_STATE_JUMP_LEFT; } } - if (rBoatItem->Velocity > 0) - laraItem->TargetState = RBOAT_STATE_MOVING; + if (rBoatItem->Animation.Velocity > 0) + laraItem->Animation.TargetState = RBOAT_STATE_MOVING; break; case RBOAT_STATE_MOVING: - if (rBoatItem->Velocity <= 0) - laraItem->TargetState = RBOAT_STATE_IDLE; + if (rBoatItem->Animation.Velocity <= 0) + laraItem->Animation.TargetState = RBOAT_STATE_IDLE; if (TrInput & RBOAT_IN_RIGHT) - laraItem->TargetState = RBOAT_STATE_TURN_RIGHT; + laraItem->Animation.TargetState = RBOAT_STATE_TURN_RIGHT; else if (TrInput & RBOAT_IN_LEFT) - laraItem->TargetState = RBOAT_STATE_TURN_LEFT; + laraItem->Animation.TargetState = RBOAT_STATE_TURN_LEFT; break; case RBOAT_STATE_FALL: - laraItem->TargetState = RBOAT_STATE_MOVING; + laraItem->Animation.TargetState = RBOAT_STATE_MOVING; break; case RBOAT_STATE_TURN_RIGHT: - if (rBoatItem->Velocity <= 0) - laraItem->TargetState = RBOAT_STATE_IDLE; + if (rBoatItem->Animation.Velocity <= 0) + laraItem->Animation.TargetState = RBOAT_STATE_IDLE; else if (!(TrInput & RBOAT_IN_RIGHT)) - laraItem->TargetState = RBOAT_STATE_MOVING; + laraItem->Animation.TargetState = RBOAT_STATE_MOVING; break; case RBOAT_STATE_TURN_LEFT: - if (rBoatItem->Velocity <= 0) - laraItem->TargetState = RBOAT_STATE_IDLE; + if (rBoatItem->Animation.Velocity <= 0) + laraItem->Animation.TargetState = RBOAT_STATE_IDLE; else if (!(TrInput & RBOAT_IN_LEFT)) - laraItem->TargetState = RBOAT_STATE_MOVING; + laraItem->Animation.TargetState = RBOAT_STATE_MOVING; break; } @@ -861,21 +861,21 @@ void DoRubberBoatDismount(ITEM_INFO* laraItem, ITEM_INFO* rBoatItem) { auto* lara = GetLaraInfo(laraItem); - if ((laraItem->ActiveState == RBOAT_STATE_JUMP_RIGHT || laraItem->ActiveState == RBOAT_STATE_JUMP_LEFT) && - laraItem->FrameNumber == g_Level.Anims[laraItem->AnimNumber].frameEnd) + if ((laraItem->Animation.ActiveState == RBOAT_STATE_JUMP_RIGHT || laraItem->Animation.ActiveState == RBOAT_STATE_JUMP_LEFT) && + laraItem->Animation.FrameNumber == g_Level.Anims[laraItem->Animation.AnimNumber].frameEnd) { - if (laraItem->ActiveState == RBOAT_STATE_JUMP_LEFT) + if (laraItem->Animation.ActiveState == RBOAT_STATE_JUMP_LEFT) laraItem->Position.yRot -= ANGLE(90.0f); else laraItem->Position.yRot += ANGLE(90.0f); - laraItem->TargetState = LS_JUMP_FORWARD; - laraItem->ActiveState = LS_JUMP_FORWARD; - laraItem->AnimNumber = LA_JUMP_FORWARD; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->Velocity = 20; - laraItem->VerticalVelocity = -40; - laraItem->Airborne = true; + laraItem->Animation.TargetState = LS_JUMP_FORWARD; + laraItem->Animation.ActiveState = LS_JUMP_FORWARD; + laraItem->Animation.AnimNumber = LA_JUMP_FORWARD; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.Velocity = 20; + laraItem->Animation.VerticalVelocity = -40; + laraItem->Animation.Airborne = true; laraItem->Position.xRot = 0; laraItem->Position.zRot = 0; lara->Vehicle = NO_ITEM; @@ -895,8 +895,8 @@ void DoRubberBoatDismount(ITEM_INFO* laraItem, ITEM_INFO* rBoatItem) } laraItem->Position.yPos = y; - rBoatItem->AnimNumber = Objects[ID_RUBBER_BOAT].animIndex; - rBoatItem->FrameNumber = g_Level.Anims[rBoatItem->AnimNumber].frameBase; + rBoatItem->Animation.AnimNumber = Objects[ID_RUBBER_BOAT].animIndex; + rBoatItem->Animation.FrameNumber = g_Level.Anims[rBoatItem->Animation.AnimNumber].frameBase; } } @@ -930,7 +930,7 @@ void RubberBoatControl(short itemNumber) if (lara->Vehicle == itemNumber && laraItem->HitPoints > 0) { - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case RBOAT_STATE_MOUNT: case RBOAT_STATE_JUMP_RIGHT: @@ -945,10 +945,10 @@ void RubberBoatControl(short itemNumber) } else { - if (rBoatItem->Velocity > RBOAT_SLOW_DOWN) - rBoatItem->Velocity -= RBOAT_SLOW_DOWN; + if (rBoatItem->Animation.Velocity > RBOAT_SLOW_DOWN) + rBoatItem->Animation.Velocity -= RBOAT_SLOW_DOWN; else - rBoatItem->Velocity = 0; + rBoatItem->Animation.Velocity = 0; } if (noTurn) @@ -971,8 +971,8 @@ void RubberBoatControl(short itemNumber) rBoat->LeftVerticalVelocity = DoRubberBoatDynamics(heightFrontLeft, rBoat->LeftVerticalVelocity, (int*)&frontLeft.y); rBoat->RightVerticalVelocity = DoRubberBoatDynamics(heightFrontRight, rBoat->RightVerticalVelocity, (int*)&frontRight.y); - ofs = rBoatItem->VerticalVelocity; - rBoatItem->VerticalVelocity = DoRubberBoatDynamics(rBoat->Water, rBoatItem->VerticalVelocity, (int*)&rBoatItem->Position.yPos); + ofs = rBoatItem->Animation.VerticalVelocity; + rBoatItem->Animation.VerticalVelocity = DoRubberBoatDynamics(rBoat->Water, rBoatItem->Animation.VerticalVelocity, (int*)&rBoatItem->Position.yPos); height = frontLeft.y + frontRight.y; if (height < 0) @@ -1013,8 +1013,8 @@ void RubberBoatControl(short itemNumber) if (laraItem->HitPoints > 0) { - rBoatItem->AnimNumber = Objects[ID_RUBBER_BOAT].animIndex + (laraItem->AnimNumber - Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex); - rBoatItem->FrameNumber = g_Level.Anims[rBoatItem->AnimNumber].frameBase + (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase); + rBoatItem->Animation.AnimNumber = Objects[ID_RUBBER_BOAT].animIndex + (laraItem->Animation.AnimNumber - Objects[ID_RUBBER_BOAT_LARA_ANIMS].animIndex); + rBoatItem->Animation.FrameNumber = g_Level.Anims[rBoatItem->Animation.AnimNumber].frameBase + (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase); } Camera.targetElevation = -ANGLE(20); @@ -1028,10 +1028,10 @@ void RubberBoatControl(short itemNumber) rBoatItem->Position.zRot += rBoat->LeanAngle; } - pitch = rBoatItem->Velocity; + pitch = rBoatItem->Animation.Velocity; rBoat->Pitch += ((pitch - rBoat->Pitch) / 4); - if (rBoatItem->Velocity > 8) + if (rBoatItem->Animation.Velocity > 8) SoundEffect(SFX_TR3_BOAT_MOVING, &rBoatItem->Position, 0, 0.5f + (float)abs(rBoat->Pitch) / (float)RBOAT_MAX_VELOCITY); else if (drive) SoundEffect(SFX_TR3_BOAT_IDLE, &rBoatItem->Position, 0, 0.5f + (float)abs(rBoat->Pitch) / (float)RBOAT_MAX_VELOCITY); @@ -1053,11 +1053,11 @@ void RubberBoatControl(short itemNumber) probedRoomNumber = GetCollisionResult(prop.x, prop.y, prop.z, rBoatItem->RoomNumber).RoomNumber; - if (rBoatItem->Velocity && + if (rBoatItem->Animation.Velocity && height < prop.y && height != NO_HEIGHT) { - TriggerRubberBoatMist(prop.x, prop.y, prop.z, abs(rBoatItem->Velocity), rBoatItem->Position.yRot + 0x8000, 0); + TriggerRubberBoatMist(prop.x, prop.y, prop.z, abs(rBoatItem->Animation.Velocity), rBoatItem->Position.yRot + 0x8000, 0); if ((GetRandomControl() & 1) == 0) { PHD_3DPOS pos; diff --git a/TR5Main/Objects/TR3/Vehicles/upv.cpp b/TR5Main/Objects/TR3/Vehicles/upv.cpp index d92565871..4f70bd2a4 100644 --- a/TR5Main/Objects/TR3/Vehicles/upv.cpp +++ b/TR5Main/Objects/TR3/Vehicles/upv.cpp @@ -162,8 +162,8 @@ static void FireUPVHarpoon(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) harpoonItem->Position.zRot = 0; // TODO: Huh? - harpoonItem->VerticalVelocity = -HARPOON_VELOCITY * phd_sin(harpoonItem->Position.xRot); - harpoonItem->VerticalVelocity = HARPOON_VELOCITY * phd_cos(harpoonItem->Position.xRot); + harpoonItem->Animation.VerticalVelocity = -HARPOON_VELOCITY * phd_sin(harpoonItem->Position.xRot); + harpoonItem->Animation.VerticalVelocity = HARPOON_VELOCITY * phd_cos(harpoonItem->Position.xRot); harpoonItem->HitPoints = HARPOON_TIME; harpoonItem->ItemFlags[0] = 1; @@ -331,7 +331,7 @@ static bool TestUPVMount(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) if (!(TrInput & IN_ACTION) || lara->Control.HandStatus != HandStatus::Free || - laraItem->Airborne) + laraItem->Animation.Airborne) { return false; } @@ -434,7 +434,7 @@ static void BackgroundCollision(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) coll->Setup.DeathFlagIsPit = false; coll->Setup.EnableSpasm = false; coll->Setup.EnableObjectPush = true; - coll->Setup.Mode = CollProbeMode::Quadrants; + coll->Setup.Mode = CollisionProbeMode::Quadrants; if ((UPVItem->Position.xRot >= -(SHRT_MAX / 2 + 1)) && (UPVItem->Position.xRot <= (SHRT_MAX / 2 + 1))) { @@ -469,7 +469,7 @@ static void BackgroundCollision(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) { if (abs(UPV->Velocity) >= MAX_VELOCITY) { - laraItem->TargetState = UPV_STATE_HIT; + laraItem->Animation.TargetState = UPV_STATE_HIT; UPV->Velocity = -UPV->Velocity / 2; } else @@ -510,15 +510,15 @@ static void UPVControl(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) TestUPVDismount(laraItem, UPVItem); - int anim = laraItem->AnimNumber - Objects[ID_UPV_LARA_ANIMS].animIndex; - int frame = laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase; + int anim = laraItem->Animation.AnimNumber - Objects[ID_UPV_LARA_ANIMS].animIndex; + int frame = laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; - switch (laraItem->ActiveState) + switch (laraItem->Animation.ActiveState) { case UPV_STATE_MOVE: if (laraItem->HitPoints <= 0) { - laraItem->TargetState = UPV_STATE_DEATH; + laraItem->Animation.TargetState = UPV_STATE_DEATH; break; } @@ -571,14 +571,14 @@ static void UPVControl(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) } else - laraItem->TargetState = UPV_STATE_IDLE; + laraItem->Animation.TargetState = UPV_STATE_IDLE; break; case UPV_STATE_IDLE: if (laraItem->HitPoints <= 0) { - laraItem->TargetState = UPV_STATE_DEATH; + laraItem->Animation.TargetState = UPV_STATE_DEATH; break; } @@ -623,9 +623,9 @@ static void UPVControl(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) else { if (UPV->Flags & UPV_SURFACE) - laraItem->TargetState = UPV_STATE_DISMOUNT_WATER_SURFACE; + laraItem->Animation.TargetState = UPV_STATE_DISMOUNT_WATER_SURFACE; else - laraItem->TargetState = UPV_STATE_DISMOUNT_UNDERWATER; + laraItem->Animation.TargetState = UPV_STATE_DISMOUNT_UNDERWATER; //sub->Flags &= ~UPV_CONTROL; having this here causes the UPV glitch, moving it directly to the states' code is better @@ -643,7 +643,7 @@ static void UPVControl(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) UPV->Flags |= UPV_DIVE; } - laraItem->TargetState = UPV_STATE_MOVE; + laraItem->Animation.TargetState = UPV_STATE_MOVE; } break; @@ -698,8 +698,8 @@ static void UPVControl(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) laraItem->Position.zPos = LPos.z; SetAnimation(laraItem, LA_UNDERWATER_IDLE); - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; laraItem->Position.xRot = laraItem->Position.zRot = 0; UpdateItemRoom(laraItem, 0); @@ -736,8 +736,8 @@ static void UPVControl(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) laraItem->Position.zPos = vec.z; SetAnimation(laraItem, LA_ONWATER_IDLE); - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; laraItem->Position.xRot = 0; laraItem->Position.zRot = 0; @@ -774,13 +774,13 @@ static void UPVControl(ITEM_INFO* laraItem, ITEM_INFO* UPVItem) laraItem->Position.zRot = 0; SetAnimation(UPVItem, LA_UNDERWATER_DEATH, 17); - laraItem->VerticalVelocity = 0; - laraItem->Airborne = false; + laraItem->Animation.VerticalVelocity = 0; + laraItem->Animation.Airborne = false; UPV->Flags |= UPV_DEAD; } - UPVItem->VerticalVelocity = 0; + UPVItem->Animation.VerticalVelocity = 0; break; } @@ -890,18 +890,18 @@ void UPVCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) lara->Control.HandStatus = HandStatus::Busy; UPVItem->HitPoints = 1; - if (laraItem->ActiveState == LS_ONWATER_STOP || laraItem->ActiveState == LS_ONWATER_FORWARD) + if (laraItem->Animation.ActiveState == LS_ONWATER_STOP || laraItem->Animation.ActiveState == LS_ONWATER_FORWARD) { - laraItem->AnimNumber = Objects[ID_UPV_LARA_ANIMS].animIndex + UPV_ANIM_MOUNT_SURFACE_START; - laraItem->ActiveState = laraItem->TargetState = UPV_STATE_MOUNT; + laraItem->Animation.AnimNumber = Objects[ID_UPV_LARA_ANIMS].animIndex + UPV_ANIM_MOUNT_SURFACE_START; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = UPV_STATE_MOUNT; } else { - laraItem->AnimNumber = Objects[ID_UPV_LARA_ANIMS].animIndex + UPV_ANIM_MOUNT_UNDERWATER; - laraItem->ActiveState = laraItem->TargetState = UPV_STATE_MOUNT; + laraItem->Animation.AnimNumber = Objects[ID_UPV_LARA_ANIMS].animIndex + UPV_ANIM_MOUNT_UNDERWATER; + laraItem->Animation.ActiveState = laraItem->Animation.TargetState = UPV_STATE_MOUNT; } - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; AnimateItem(laraItem); } else @@ -925,7 +925,7 @@ bool UPVControl(ITEM_INFO* laraItem, COLL_INFO* coll) { UPVControl(laraItem, UPVItem); - UPVItem->VerticalVelocity = UPV->Velocity / (USHRT_MAX + 1); + UPVItem->Animation.VerticalVelocity = UPV->Velocity / (USHRT_MAX + 1); UPVItem->Position.xRot += UPV->XRot / (USHRT_MAX + 1); UPVItem->Position.yRot += UPV->Rot / (USHRT_MAX + 1); @@ -936,9 +936,9 @@ bool UPVControl(ITEM_INFO* laraItem, COLL_INFO* coll) else if (UPVItem->Position.xRot < -UPDOWN_LIMIT) UPVItem->Position.xRot = -UPDOWN_LIMIT; - UPVItem->Position.xPos += phd_sin(UPVItem->Position.yRot) * UPVItem->VerticalVelocity * phd_cos(UPVItem->Position.xRot); - UPVItem->Position.yPos -= phd_sin(UPVItem->Position.xRot) * UPVItem->VerticalVelocity; - UPVItem->Position.zPos += phd_cos(UPVItem->Position.yRot) * UPVItem->VerticalVelocity * phd_cos(UPVItem->Position.xRot); + UPVItem->Position.xPos += phd_sin(UPVItem->Position.yRot) * UPVItem->Animation.VerticalVelocity * phd_cos(UPVItem->Position.xRot); + UPVItem->Position.yPos -= phd_sin(UPVItem->Position.xRot) * UPVItem->Animation.VerticalVelocity; + UPVItem->Position.zPos += phd_cos(UPVItem->Position.yRot) * UPVItem->Animation.VerticalVelocity * phd_cos(UPVItem->Position.xRot); } int newHeight = GetCollisionResult(UPVItem).Position.Floor; @@ -949,7 +949,7 @@ bool UPVControl(ITEM_INFO* laraItem, COLL_INFO* coll) UPVItem->Position.xPos = oldPos.xPos; UPVItem->Position.yPos = oldPos.yPos; UPVItem->Position.zPos = oldPos.zPos; - UPVItem->VerticalVelocity = 0; + UPVItem->Animation.VerticalVelocity = 0; } UPVItem->Floor = probe.Position.Floor; @@ -1022,9 +1022,9 @@ bool UPVControl(ITEM_INFO* laraItem, COLL_INFO* coll) UPV->Flags & UPV_CONTROL && !UPV->HarpoonTimer) { - if (laraItem->ActiveState != UPV_STATE_DISMOUNT_UNDERWATER && - laraItem->ActiveState != UPV_STATE_DISMOUNT_WATER_SURFACE && - laraItem->ActiveState != UPV_STATE_MOUNT) + if (laraItem->Animation.ActiveState != UPV_STATE_DISMOUNT_UNDERWATER && + laraItem->Animation.ActiveState != UPV_STATE_DISMOUNT_WATER_SURFACE && + laraItem->Animation.ActiveState != UPV_STATE_MOUNT) { FireUPVHarpoon(laraItem, UPVItem); UPV->HarpoonTimer = HARPOON_RELOAD; @@ -1048,10 +1048,10 @@ bool UPVControl(ITEM_INFO* laraItem, COLL_INFO* coll) BackgroundCollision(laraItem, UPVItem); if (UPV->Flags & UPV_CONTROL) - SoundEffect(SFX_TR3_LITTLE_SUB_LOOP, (PHD_3DPOS*)&UPVItem->Position.xPos, 2 | 4 | 0x1000000 | (UPVItem->VerticalVelocity * (USHRT_MAX + 1))); + SoundEffect(SFX_TR3_LITTLE_SUB_LOOP, (PHD_3DPOS*)&UPVItem->Position.xPos, 2 | 4 | 0x1000000 | (UPVItem->Animation.VerticalVelocity * (USHRT_MAX + 1))); - UPVItem->AnimNumber = Objects[ID_UPV].animIndex + (laraItem->AnimNumber - Objects[ID_UPV_LARA_ANIMS].animIndex); - UPVItem->FrameNumber = g_Level.Anims[UPVItem->AnimNumber].frameBase + (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase); + UPVItem->Animation.AnimNumber = Objects[ID_UPV].animIndex + (laraItem->Animation.AnimNumber - Objects[ID_UPV_LARA_ANIMS].animIndex); + UPVItem->Animation.FrameNumber = g_Level.Anims[UPVItem->Animation.AnimNumber].frameBase + (laraItem->Animation.FrameNumber - g_Level.Anims[laraItem->Animation.AnimNumber].frameBase); if (UPV->Flags & UPV_SURFACE) Camera.targetElevation = -ANGLE(60.0f); @@ -1072,8 +1072,8 @@ bool UPVControl(ITEM_INFO* laraItem, COLL_INFO* coll) UPV->XRot = 0; SetAnimation(UPVItem, UPV_ANIM_IDLE); - UPVItem->VerticalVelocity = 0; - UPVItem->Airborne = true; + UPVItem->Animation.VerticalVelocity = 0; + UPVItem->Animation.Airborne = true; AnimateItem(UPVItem); return true; diff --git a/TR5Main/Objects/TR4/Entity/tr4_ahmet.cpp b/TR5Main/Objects/TR4/Entity/tr4_ahmet.cpp index c76ab4a9a..9b36cb1ce 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_ahmet.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_ahmet.cpp @@ -89,10 +89,10 @@ namespace TEN::Entities::TR4 auto* item = &g_Level.Items[itemNumber]; InitialiseCreature(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = AHMET_STATE_IDLE; - item->ActiveState = AHMET_STATE_IDLE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = AHMET_STATE_IDLE; + item->Animation.ActiveState = AHMET_STATE_IDLE; item->ItemFlags[0] = item->Position.xPos / SECTOR(1); item->ItemFlags[1] = item->Position.yPos * 4 / SECTOR(1); item->ItemFlags[2] = item->Position.zPos / SECTOR(1); @@ -119,21 +119,21 @@ namespace TEN::Entities::TR4 if (item->HitPoints <= 0) { - if (item->ActiveState == AHMET_STATE_DIE) + if (item->Animation.ActiveState == AHMET_STATE_DIE) { // dont clear it ! - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) { item->Collidable = false; // NOTE: not exist in the original game, avoid wreid collision with lara... - item->FrameNumber = (g_Level.Anims[item->AnimNumber].frameEnd - 1); + item->Animation.FrameNumber = (g_Level.Anims[item->Animation.AnimNumber].frameEnd - 1); } } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + AHMET_ANIM_DEATH_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = AHMET_STATE_DIE; - item->TargetState = AHMET_STATE_DIE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + AHMET_ANIM_DEATH_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = AHMET_STATE_DIE; + item->Animation.TargetState = AHMET_STATE_DIE; Lara.InteractedItem = itemNumber; } @@ -176,7 +176,7 @@ namespace TEN::Entities::TR4 if (AI.ahead) headY = AI.angle; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case AHMET_STATE_IDLE: creature->MaxTurn = 0; @@ -184,41 +184,41 @@ namespace TEN::Entities::TR4 if (item->AIBits & GUARD) { - item->TargetState = AHMET_STATE_IDLE; + item->Animation.TargetState = AHMET_STATE_IDLE; headY = AIGuard(creature); } else if (item->AIBits & PATROL1) { - item->TargetState = AHMET_STATE_WALK; + item->Animation.TargetState = AHMET_STATE_WALK; headY = 0; } else if (creature->Mood == MoodType::Attack && creature->Mood != MoodType::Escape) { if (AI.bite && AI.distance < AHMET_STAND_DUALATK_RANGE) - item->TargetState = AHMET_STATE_STAND_DUALATK; + item->Animation.TargetState = AHMET_STATE_STAND_DUALATK; else if ((AI.angle >= AHMET_VIEW_ANGLE || AI.angle <= -AHMET_VIEW_ANGLE) || AI.distance >= AHMET_IDLE_RANGE) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else { if (!AI.ahead || AI.distance >= AHMET_RUN_RANGE) - item->TargetState = AHMET_STATE_RUN; + item->Animation.TargetState = AHMET_STATE_RUN; else - item->TargetState = AHMET_STATE_WALK; + item->Animation.TargetState = AHMET_STATE_WALK; } } else if (GetRandomControl() & 1) - item->TargetState = AHMET_STATE_JUMP_BITE; + item->Animation.TargetState = AHMET_STATE_JUMP_BITE; else - item->TargetState = AHMET_STATE_JUMP_DUALATK; + item->Animation.TargetState = AHMET_STATE_JUMP_DUALATK; } else { if (Lara.TargetEntity == item || !AI.ahead) - item->TargetState = AHMET_STATE_RUN; + item->Animation.TargetState = AHMET_STATE_RUN; else - item->TargetState = AHMET_STATE_IDLE; + item->Animation.TargetState = AHMET_STATE_IDLE; } break; @@ -228,13 +228,13 @@ namespace TEN::Entities::TR4 if (item->AIBits & PATROL1) { - item->TargetState = AHMET_STATE_WALK; + item->Animation.TargetState = AHMET_STATE_WALK; headY = 0; } else if (AI.bite && AI.distance < AHMET_IDLE_RANGE) - item->TargetState = AHMET_STATE_IDLE; + item->Animation.TargetState = AHMET_STATE_IDLE; else if (creature->Mood == MoodType::Escape || AI.distance > AHMET_RUN_RANGE || !AI.ahead || (AI.enemyFacing > -AHMET_ENEMY_ANGLE || AI.enemyFacing < AHMET_ENEMY_ANGLE)) - item->TargetState = AHMET_STATE_RUN; + item->Animation.TargetState = AHMET_STATE_RUN; break; @@ -243,9 +243,9 @@ namespace TEN::Entities::TR4 creature->Flags = 0; if (item->AIBits & GUARD || (creature->Mood == MoodType::Bored || creature->Mood == MoodType::Escape) && (Lara.TargetEntity == item && AI.ahead) || (AI.bite && AI.distance < AHMET_IDLE_RANGE)) - item->TargetState = AHMET_STATE_IDLE; + item->Animation.TargetState = AHMET_STATE_IDLE; else if (AI.ahead && AI.distance < AHMET_RUN_RANGE && (AI.enemyFacing < -AHMET_ENEMY_ANGLE || AI.enemyFacing > AHMET_ENEMY_ANGLE)) - item->TargetState = AHMET_STATE_WALK; + item->Animation.TargetState = AHMET_STATE_WALK; break; @@ -262,7 +262,7 @@ namespace TEN::Entities::TR4 else item->Position.yRot += AI.angle; - if (!(creature->Flags & 1) && item->FrameNumber > (g_Level.Anims[item->AnimNumber].frameBase + 7) && (item->TouchBits & AHMET_LEFT_TOUCH)) + if (!(creature->Flags & 1) && item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 7) && (item->TouchBits & AHMET_LEFT_TOUCH)) { CreatureEffect2(item, &AhmetBiteLeft, 10, -1, DoBloodSplat); creature->Flags |= 1; @@ -270,7 +270,7 @@ namespace TEN::Entities::TR4 LaraItem->HitStatus = true; LaraItem->HitPoints -= AHMET_HAND_DAMAGE; } - else if (!(creature->Flags & 2) && item->FrameNumber > (g_Level.Anims[item->AnimNumber].frameBase + 32) && (item->TouchBits & AHMET_RIGHT_TOUCH)) + else if (!(creature->Flags & 2) && item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 32) && (item->TouchBits & AHMET_RIGHT_TOUCH)) { CreatureEffect2(item, &AhmetBiteRight, 10, -1, DoBloodSplat); creature->Flags |= 2; @@ -284,7 +284,7 @@ namespace TEN::Entities::TR4 case AHMET_STATE_JUMP_BITE: creature->MaxTurn = 0; - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + AHMET_ANIM_JUMP_START) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + AHMET_ANIM_JUMP_START) { if (abs(AI.angle) >= ANGLE(5.0f)) { @@ -298,9 +298,9 @@ namespace TEN::Entities::TR4 } else { - if (!(creature->Flags & 1) && item->AnimNumber == Objects[item->ObjectNumber].animIndex + AHMET_ANIM_JUMP_ATTACK) + if (!(creature->Flags & 1) && item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + AHMET_ANIM_JUMP_ATTACK) { - if (item->FrameNumber > (g_Level.Anims[item->AnimNumber].frameBase + 11) && + if (item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 11) && item->TouchBits & AHMET_LEFT_TOUCH) { CreatureEffect2(item, &AhmetBiteJaw, 10, -1, DoBloodSplat); @@ -317,7 +317,7 @@ namespace TEN::Entities::TR4 case AHMET_STATE_JUMP_DUALATK: creature->MaxTurn = 0; - if (item->AnimNumber == (Objects[item->ObjectNumber].animIndex + AHMET_ANIM_JUMP_START)) + if (item->Animation.AnimNumber == (Objects[item->ObjectNumber].animIndex + AHMET_ANIM_JUMP_START)) { if (abs(AI.angle) >= ANGLE(5.0f)) { @@ -332,7 +332,7 @@ namespace TEN::Entities::TR4 else { if (!(creature->Flags & 1) && - item->FrameNumber > (g_Level.Anims[item->AnimNumber].frameBase + 14) && + item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 14) && item->TouchBits & AHMET_LEFT_TOUCH) { CreatureEffect2(item, &AhmetBiteLeft, 10, -1, DoBloodSplat); @@ -342,7 +342,7 @@ namespace TEN::Entities::TR4 LaraItem->HitPoints -= AHMET_HAND_DAMAGE; } else if (!(creature->Flags & 2) && - item->FrameNumber > (g_Level.Anims[item->AnimNumber].frameBase + 22) && + item->Animation.FrameNumber > (g_Level.Anims[item->Animation.AnimNumber].frameBase + 22) && item->TouchBits & AHMET_RIGHT_TOUCH) { CreatureEffect2(item, &AhmetBiteRight, 10, -1, DoBloodSplat); @@ -367,7 +367,7 @@ namespace TEN::Entities::TR4 { auto* item = &g_Level.Items[itemNumber]; - if (item->ActiveState != 7 || item->FrameNumber != g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.ActiveState != 7 || item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameEnd) return false; Weather.Flash(255, 64, 0, 0.03f); @@ -380,10 +380,10 @@ namespace TEN::Entities::TR4 if (item->RoomNumber != outsideRoom) ItemNewRoom(itemNumber, outsideRoom); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->TargetState = 1; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.TargetState = 1; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 1; item->HitPoints = Objects[item->ObjectNumber].HitPoints; AddActiveItem(itemNumber); diff --git a/TR5Main/Objects/TR4/Entity/tr4_baboon.cpp b/TR5Main/Objects/TR4/Entity/tr4_baboon.cpp index fa657ffdc..9ab4052c2 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_baboon.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_baboon.cpp @@ -163,10 +163,10 @@ static void UpdateRespawnedBaboon(short itemNumber) if (baboonRespawn->Count < baboonRespawn->MaxCount) baboonRespawn->Count++; - item->AnimNumber = object->animIndex + BABOON_SIT_IDLE_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BABOON_SIT_IDLE; - item->TargetState = BABOON_SIT_IDLE; + item->Animation.AnimNumber = object->animIndex + BABOON_SIT_IDLE_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BABOON_SIT_IDLE; + item->Animation.TargetState = BABOON_SIT_IDLE; item->HitPoints = object->HitPoints; RemoveActiveItem(itemNumber); @@ -203,10 +203,10 @@ void InitialiseBaboon(short itemNumber) auto* item = &g_Level.Items[itemNumber]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + BABOON_SIT_IDLE_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = BABOON_SIT_IDLE; - item->ActiveState = BABOON_SIT_IDLE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + BABOON_SIT_IDLE_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = BABOON_SIT_IDLE; + item->Animation.ActiveState = BABOON_SIT_IDLE; if (item->ObjectNumber == ID_BABOON_SILENT && item->TriggerFlags != 0) BaboonRespawn.Add(item, item->TriggerFlags); @@ -228,17 +228,17 @@ void BaboonControl(short itemNumber) if (item->HitPoints <= 0 && item->HitPoints != NOT_TARGETABLE) { - if (item->ActiveState == BABOON_DEATH) + if (item->Animation.ActiveState == BABOON_DEATH) { - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) BaboonRespawnFunction(itemNumber); } - else if (item->ActiveState != BABOON_ACTIVATE_SWITCH) + else if (item->Animation.ActiveState != BABOON_ACTIVATE_SWITCH) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + BABOON_DEATH_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = BABOON_DEATH; - item->TargetState = BABOON_DEATH; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + BABOON_DEATH_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = BABOON_DEATH; + item->Animation.TargetState = BABOON_DEATH; } } else @@ -282,10 +282,10 @@ void BaboonControl(short itemNumber) item->Position.yPos = creature->Enemy->Position.yPos; item->Position.zPos = creature->Enemy->Position.zPos; item->Position.yRot = creature->Enemy->Position.yRot; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + BABOON_SWITCH_ANIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = BABOON_ACTIVATE_SWITCH; - item->ActiveState = BABOON_ACTIVATE_SWITCH; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + BABOON_SWITCH_ANIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = BABOON_ACTIVATE_SWITCH; + item->Animation.ActiveState = BABOON_ACTIVATE_SWITCH; item->AIBits &= ~(FOLLOW); TestTriggers(item, true); @@ -294,7 +294,7 @@ void BaboonControl(short itemNumber) } } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case BABOON_IDLE: creature->MaxTurn = 0; @@ -306,51 +306,51 @@ void BaboonControl(short itemNumber) if (!(GetRandomControl() & 0xF)) { if (GetRandomControl() & 1) - item->TargetState = BABOON_HITGROUND; + item->Animation.TargetState = BABOON_HITGROUND; else - item->TargetState = BABOON_SIT_IDLE; + item->Animation.TargetState = BABOON_SIT_IDLE; } } else if (item->AIBits & PATROL1) - item->TargetState = BABOON_WALK; + item->Animation.TargetState = BABOON_WALK; else if (creature->Mood == MoodType::Escape) { if (AI.ahead && Lara.TargetEntity != item) - item->TargetState = BABOON_IDLE; + item->Animation.TargetState = BABOON_IDLE; else - item->TargetState = BABOON_RUN; + item->Animation.TargetState = BABOON_RUN; } else if (creature->Mood == MoodType::Attack) { - if (!(item->AIBits & FOLLOW) || (!item->Airborne && AI.distance <= BABOON_RUNROLL_RANGE)) + if (!(item->AIBits & FOLLOW) || (!item->Animation.Airborne && AI.distance <= BABOON_RUNROLL_RANGE)) { if (AI.bite && AI.distance < BABOON_ATK_NORMALRANGE) { if (LaraItem->Position.yPos >= item->Position.yPos) - item->TargetState = BABOON_ATK1; + item->Animation.TargetState = BABOON_ATK1; else - item->TargetState = BABOON_JUMPATK; + item->Animation.TargetState = BABOON_JUMPATK; } else if (AI.bite && AI.distance < BABOON_JUMP_RANGE) - item->TargetState = BABOON_SUPERJUMPATK; + item->Animation.TargetState = BABOON_SUPERJUMPATK; else if (AI.bite && AI.distance < BABOON_RUNROLL_RANGE) - item->TargetState = BABOON_RUN_ROLL; + item->Animation.TargetState = BABOON_RUN_ROLL; else - item->TargetState = BABOON_RUN; + item->Animation.TargetState = BABOON_RUN; } - else if (item->RequiredState) - item->TargetState = item->RequiredState; + else if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (GetRandomControl() & 1) - item->TargetState = BABOON_SIT_IDLE; + item->Animation.TargetState = BABOON_SIT_IDLE; } - else if (item->RequiredState) - item->TargetState = item->RequiredState; + else if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (!(GetRandomControl() & 3)) - item->TargetState = BABOON_WALK; + item->Animation.TargetState = BABOON_WALK; else if (!(GetRandomControl() & 1)) - item->TargetState = BABOON_RUN_ROLL; + item->Animation.TargetState = BABOON_RUN_ROLL; else if (GetRandomControl() & 4) - item->TargetState = BABOON_HITGROUND; + item->Animation.TargetState = BABOON_HITGROUND; break; @@ -362,45 +362,45 @@ void BaboonControl(short itemNumber) { AIGuard(creature); if (GetRandomControl() & 0xF) - item->TargetState = BABOON_SIT_EAT; + item->Animation.TargetState = BABOON_SIT_EAT; else if (GetRandomControl() & 0xA) - item->TargetState = BABOON_SIT_SCRATCH; + item->Animation.TargetState = BABOON_SIT_SCRATCH; } else if (item->AIBits & PATROL1) - item->TargetState = BABOON_WALK; + item->Animation.TargetState = BABOON_WALK; else if (creature->Mood != MoodType::Escape) { if (creature->Mood == MoodType::Bored) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; // NOTE: it's not the original code, but it's too wreid // that the baboon repeat the same move so i included the sit_idle with more random number // (the eat not exist in the bored mood, i added it !) else if (GetRandomControl() & 0x10) - item->TargetState = BABOON_SIT_IDLE; + item->Animation.TargetState = BABOON_SIT_IDLE; else if (GetRandomControl() & 0x500) { if (GetRandomControl() & 0x200) - item->TargetState = BABOON_SIT_SCRATCH; + item->Animation.TargetState = BABOON_SIT_SCRATCH; else if (GetRandomControl() & 0x250) - item->TargetState = BABOON_SIT_EAT; + item->Animation.TargetState = BABOON_SIT_EAT; } else if (GetRandomControl() & 0x1000 || item->AIBits & FOLLOW) - item->TargetState = BABOON_WALK; + item->Animation.TargetState = BABOON_WALK; } else if ((item->AIBits & FOLLOW) && AI.distance > BABOON_IDLE_DISTANCE) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else - item->TargetState = BABOON_WALK; + item->Animation.TargetState = BABOON_WALK; } else - item->TargetState = BABOON_WALK; + item->Animation.TargetState = BABOON_WALK; } else - item->TargetState = BABOON_IDLE; + item->Animation.TargetState = BABOON_IDLE; break; @@ -408,23 +408,23 @@ void BaboonControl(short itemNumber) creature->MaxTurn = BABOON_WALK_ANGLE; if (item->AIBits & PATROL1) - item->TargetState = BABOON_WALK; + item->Animation.TargetState = BABOON_WALK; else if (creature->Mood == MoodType::Bored) { if (item->AIBits & FOLLOW) - item->TargetState = BABOON_WALK; + item->Animation.TargetState = BABOON_WALK; else if (GetRandomControl() < 256) - item->TargetState = BABOON_SIT_IDLE; + item->Animation.TargetState = BABOON_SIT_IDLE; } else if (creature->Mood == MoodType::Escape) - item->TargetState = BABOON_RUN; + item->Animation.TargetState = BABOON_RUN; else if (creature->Mood == MoodType::Attack) { if (AI.bite && AI.distance < BABOON_ATK_RANGE) - item->TargetState = BABOON_IDLE; + item->Animation.TargetState = BABOON_IDLE; } else if (GetRandomControl() < 256) - item->TargetState = BABOON_SIT_IDLE; + item->Animation.TargetState = BABOON_SIT_IDLE; break; @@ -433,23 +433,23 @@ void BaboonControl(short itemNumber) tilt = angle / 2; if (item->AIBits & GUARD) - item->TargetState = BABOON_IDLE; + item->Animation.TargetState = BABOON_IDLE; else if (creature->Mood == MoodType::Escape) { if (AI.ahead && Lara.TargetEntity != item) - item->TargetState = BABOON_IDLE; + item->Animation.TargetState = BABOON_IDLE; } - else if (item->AIBits & FOLLOW && (item->Airborne || AI.distance > BABOON_FOLLOW_RANGE)) - item->TargetState = BABOON_IDLE; + else if (item->AIBits & FOLLOW && (item->Animation.Airborne || AI.distance > BABOON_FOLLOW_RANGE)) + item->Animation.TargetState = BABOON_IDLE; else if (creature->Mood == MoodType::Attack) { if (AI.distance < BABOON_ATK_RANGE) - item->TargetState = BABOON_IDLE; + item->Animation.TargetState = BABOON_IDLE; else if (AI.bite && AI.distance < BABOON_RUNROLL_RANGE) - item->TargetState = BABOON_RUN_ROLL; + item->Animation.TargetState = BABOON_RUN_ROLL; } else - item->TargetState = BABOON_RUN_ROLL; + item->Animation.TargetState = BABOON_RUN_ROLL; break; @@ -462,7 +462,7 @@ void BaboonControl(short itemNumber) creature->MaxTurn = 0; item->HitPoints = NOT_TARGETABLE; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 212) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 212) { GAME_VECTOR pos = { 0, 0, 0 }; pos.boxNumber = 0; diff --git a/TR5Main/Objects/TR4/Entity/tr4_baddy.cpp b/TR5Main/Objects/TR4/Entity/tr4_baddy.cpp index 473bf21ae..45c55078f 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_baddy.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_baddy.cpp @@ -229,10 +229,10 @@ namespace TEN::Entities::TR4 if (!ocb || ocb > 4 && ocb < 7) { - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_IDLE; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_BADDY_STOP; - item->ActiveState = STATE_BADDY_STOP; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_IDLE; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_BADDY_STOP; + item->Animation.ActiveState = STATE_BADDY_STOP; return; } @@ -240,10 +240,10 @@ namespace TEN::Entities::TR4 // OCB: jump right if (ocb == 1) { - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_TO_JUMP_RIGHT; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_BADDY_JUMP_RIGHT; - item->ActiveState = STATE_BADDY_JUMP_RIGHT; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_TO_JUMP_RIGHT; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_BADDY_JUMP_RIGHT; + item->Animation.ActiveState = STATE_BADDY_JUMP_RIGHT; return; } @@ -251,10 +251,10 @@ namespace TEN::Entities::TR4 // OCB: jump left if (ocb == 2) { - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_TO_ROLL_LEFT; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_BADDY_ROLL_LEFT; - item->ActiveState = STATE_BADDY_ROLL_LEFT; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_TO_ROLL_LEFT; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_BADDY_ROLL_LEFT; + item->Animation.ActiveState = STATE_BADDY_ROLL_LEFT; return; } @@ -262,10 +262,10 @@ namespace TEN::Entities::TR4 // OCB: crouch if (ocb == 3) { - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CROUCH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_BADDY_CROUCH; - item->ActiveState = STATE_BADDY_CROUCH; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CROUCH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_BADDY_CROUCH; + item->Animation.ActiveState = STATE_BADDY_CROUCH; return; } @@ -273,10 +273,10 @@ namespace TEN::Entities::TR4 // OCB: climb up 4 or 6 clicks if (ocb == 4) { - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CLIMB_4_CLICKS; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_BADDY_CLIMB_4_CLICKS; - item->ActiveState = STATE_BADDY_CLIMB_4_CLICKS; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CLIMB_4_CLICKS; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_BADDY_CLIMB_4_CLICKS; + item->Animation.ActiveState = STATE_BADDY_CLIMB_4_CLICKS; item->Position.xPos += phd_sin(item->Position.yRot) * (STEP_SIZE * 4); item->Position.zPos += phd_cos(item->Position.yRot) * (STEP_SIZE * 4); @@ -286,10 +286,10 @@ namespace TEN::Entities::TR4 // OCB: crouch and jump in train levels? if (ocb > 100) { - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CROUCH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_BADDY_CROUCH; - item->ActiveState = STATE_BADDY_CROUCH; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CROUCH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_BADDY_CROUCH; + item->Animation.ActiveState = STATE_BADDY_CROUCH; item->Position.xPos += phd_sin(item->Position.yRot) * (STEP_SIZE * 4); item->Position.zPos += phd_cos(item->Position.yRot) * (STEP_SIZE * 4); item->ItemFlags[3] = ocb; @@ -297,7 +297,7 @@ namespace TEN::Entities::TR4 return; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } void BaddyControl(short itemNum) @@ -439,32 +439,32 @@ namespace TEN::Entities::TR4 height = GetFloorHeight(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos); item->Floor = height; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_BADDY_DEATH: - item->Airborne = true; + item->Animation.Airborne = true; currentCreature->LOT.IsMonkeying = false; if (item->Position.yPos >= item->Floor) { item->Position.yPos = item->Floor; - item->VerticalVelocity = 0; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; } break; case STATE_BADDY_MONKEY_TO_FREEFALL: - item->TargetState = STATE_BADDY_FREEFALL; - item->Airborne = false; + item->Animation.TargetState = STATE_BADDY_FREEFALL; + item->Animation.Airborne = false; break; case STATE_BADDY_FREEFALL: - item->Airborne = true; + item->Animation.Airborne = true; if (item->Position.yPos >= item->Floor) { item->Position.yPos = item->Floor; - item->VerticalVelocity = 0; - item->Airborne = false; - item->TargetState = STATE_BADDY_FREEFALL_LAND_DEATH; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.TargetState = STATE_BADDY_FREEFALL_LAND_DEATH; } break; @@ -475,17 +475,17 @@ namespace TEN::Entities::TR4 case STATE_BADDY_MONKEY_GRAB: case STATE_BADDY_MONKEY_IDLE: case STATE_BADDY_MONKEY_FORWARD: - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_MONKEY_TO_FREEFALL; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = STATE_BADDY_MONKEY_TO_FREEFALL; - item->Velocity = 0; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_MONKEY_TO_FREEFALL; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = STATE_BADDY_MONKEY_TO_FREEFALL; + item->Animation.Velocity = 0; break; default: currentCreature->LOT.IsJumping = true; - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = STATE_BADDY_DEATH; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = STATE_BADDY_DEATH; // OCB: respawn code for BADDY_1 if (item->TriggerFlags > 999) @@ -643,7 +643,7 @@ namespace TEN::Entities::TR4 } } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_BADDY_STOP: currentCreature->LOT.IsMonkeying = false; @@ -660,7 +660,7 @@ namespace TEN::Entities::TR4 if (item->AIBits & GUARD) { joint3 = AIGuard(currentCreature); - item->TargetState = 0; + item->Animation.TargetState = 0; break; } @@ -669,7 +669,7 @@ namespace TEN::Entities::TR4 && laraInfo.ahead && laraInfo.distance > SQUARE(682)) { - item->TargetState = STATE_BADDY_DODGE_START; + item->Animation.TargetState = STATE_BADDY_DODGE_START; break; } @@ -677,23 +677,23 @@ namespace TEN::Entities::TR4 { if (item->SwapMeshFlags == SWAPMESHFLAGS_BADDY_GUN) { - item->TargetState = STATE_BADDY_AIM; + item->Animation.TargetState = STATE_BADDY_AIM; break; } if (item->SwapMeshFlags != SWAPMESHFLAGS_BADDY_SWORD_SIMPLE && item->SwapMeshFlags != SWAPMESHFLAGS_BADDY_SWORD_NINJA) { - item->TargetState = STATE_BADDY_DRAW_GUN; + item->Animation.TargetState = STATE_BADDY_DRAW_GUN; break; } - item->TargetState = STATE_BADDY_HOLSTER_SWORD; + item->Animation.TargetState = STATE_BADDY_HOLSTER_SWORD; break; } if (item->AIBits & MODIFY) { - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; if (item->Floor > item->Position.yPos + (STEP_SIZE * 3)) item->AIBits &= ~MODIFY; break; @@ -702,15 +702,15 @@ namespace TEN::Entities::TR4 if (canJump1sector || canJump2sectors) { currentCreature->MaxTurn = 0; - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_TO_JUMP_FORWARD; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = STATE_BADDY_JUMP_FORWARD_1_BLOCK; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_TO_JUMP_FORWARD; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = STATE_BADDY_JUMP_FORWARD_1_BLOCK; currentCreature->LOT.IsJumping = true; if (!canJump2sectors) - item->TargetState = STATE_BADDY_JUMP_FORWARD_1_BLOCK; + item->Animation.TargetState = STATE_BADDY_JUMP_FORWARD_1_BLOCK; else - item->TargetState = STATE_BADDY_JUMP_FORWARD_2_BLOCKS; + item->Animation.TargetState = STATE_BADDY_JUMP_FORWARD_2_BLOCKS; break; } @@ -720,15 +720,15 @@ namespace TEN::Entities::TR4 if ((objNum == ID_SMALLMEDI_ITEM || objNum == ID_UZI_AMMO_ITEM || objNum == ID_BIGMEDI_ITEM) && info.distance < SQUARE(512)) { - item->TargetState = STATE_BADDY_STAND_TO_CROUCH; - item->RequiredState = STATE_BADDY_CROUCH_PICKUP; + item->Animation.TargetState = STATE_BADDY_STAND_TO_CROUCH; + item->Animation.RequiredState = STATE_BADDY_CROUCH_PICKUP; break; } } if (item->SwapMeshFlags == SWAPMESHFLAGS_BADDY_GUN && item->ItemFlags[2] < 1) { - item->TargetState = STATE_BADDY_HOLSTER_GUN; + item->Animation.TargetState = STATE_BADDY_HOLSTER_GUN; break; } @@ -740,16 +740,16 @@ namespace TEN::Entities::TR4 { if (item->SwapMeshFlags == SWAPMESHFLAGS_BADDY_EMPTY) { - item->TargetState = STATE_BADDY_MONKEY_GRAB; + item->Animation.TargetState = STATE_BADDY_MONKEY_GRAB; break; } if (item->SwapMeshFlags == SWAPMESHFLAGS_BADDY_GUN) { - item->TargetState = STATE_BADDY_HOLSTER_GUN; + item->Animation.TargetState = STATE_BADDY_HOLSTER_GUN; break; } - item->TargetState = STATE_BADDY_HOLSTER_SWORD; + item->Animation.TargetState = STATE_BADDY_HOLSTER_SWORD; break; } } @@ -758,43 +758,43 @@ namespace TEN::Entities::TR4 if (roll) { currentCreature->MaxTurn = 0; - item->TargetState = STATE_BADDY_ROLL_LEFT; + item->Animation.TargetState = STATE_BADDY_ROLL_LEFT; break; } if (jump) { currentCreature->MaxTurn = 0; - item->TargetState = STATE_BADDY_JUMP_RIGHT; + item->Animation.TargetState = STATE_BADDY_JUMP_RIGHT; break; } if (item->SwapMeshFlags == SWAPMESHFLAGS_BADDY_EMPTY) { - item->TargetState = STATE_BADDY_DRAW_SWORD; + item->Animation.TargetState = STATE_BADDY_DRAW_SWORD; break; } if (currentCreature->Enemy && currentCreature->Enemy->HitPoints > 0 && info.distance < SQUARE(682)) { if (item->SwapMeshFlags == SWAPMESHFLAGS_BADDY_GUN) { - item->TargetState = STATE_BADDY_HOLSTER_GUN; + item->Animation.TargetState = STATE_BADDY_HOLSTER_GUN; } else if (info.distance >= SQUARE(512)) { - item->TargetState = STATE_BADDY_SWORD_HIT_FRONT; + item->Animation.TargetState = STATE_BADDY_SWORD_HIT_FRONT; } else if (GetRandomControl() & 1) { - item->TargetState = STATE_BADDY_SWORD_HIT_LEFT; + item->Animation.TargetState = STATE_BADDY_SWORD_HIT_LEFT; } else { - item->TargetState = STATE_BADDY_SWORD_HIT_RIGHT; + item->Animation.TargetState = STATE_BADDY_SWORD_HIT_RIGHT; } break; } } - item->TargetState = STATE_BADDY_WALK; + item->Animation.TargetState = STATE_BADDY_WALK; break; case STATE_BADDY_WALK: @@ -813,18 +813,18 @@ namespace TEN::Entities::TR4 } if (Targetable(item, &info) && item->ItemFlags[2] > 0) { - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; break; } if (canJump1sector || canJump2sectors) { currentCreature->MaxTurn = 0; - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; break; } if (currentCreature->ReachedGoal && currentCreature->MonkeySwingAhead) { - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; break; } @@ -832,38 +832,38 @@ namespace TEN::Entities::TR4 { if (item->SwapMeshFlags != SWAPMESHFLAGS_BADDY_SWORD_SIMPLE && item->SwapMeshFlags != SWAPMESHFLAGS_BADDY_SWORD_NINJA) { - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; break; } } if (info.ahead && info.distance < 0x40000) { - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; break; } if (info.bite) { if (info.distance < SQUARE(482)) { - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; break; } if (info.distance < SQUARE(1024)) { - item->TargetState = STATE_BADDY_WALK_SWORD_HIT_RIGHT; + item->Animation.TargetState = STATE_BADDY_WALK_SWORD_HIT_RIGHT; break; } } if (roll || jump) { - item->ActiveState = STATE_BADDY_STOP; + item->Animation.ActiveState = STATE_BADDY_STOP; break; } if (currentCreature->Mood == MoodType::Attack && !(currentCreature->JumpAhead) && info.distance > SQUARE(1024)) { - item->TargetState = STATE_BADDY_RUN; + item->Animation.TargetState = STATE_BADDY_RUN; } break; @@ -875,14 +875,14 @@ namespace TEN::Entities::TR4 currentCreature->MaxTurn = ANGLE(11); tilt = abs(angle) / 2; if (objectNumber == ID_BADDY2 - && item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_RUN_TO_SOMERSAULT + && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_RUN_TO_SOMERSAULT && height3 == height1 && abs(height1 - item->Position.yPos) < STEP_SIZE * 1.5f && (info.angle > -ANGLE(22.5f) && info.angle < ANGLE(22.5f) && info.distance < SQUARE(3072) || height2 >= height1 + 512)) { - item->TargetState = STATE_BADDY_SOMERSAULT; + item->Animation.TargetState = STATE_BADDY_SOMERSAULT; currentCreature->MaxTurn = 0; break; } @@ -895,12 +895,12 @@ namespace TEN::Entities::TR4 || info.distance < SQUARE(614) || currentCreature->JumpAhead) { - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; break; } if (info.distance < SQUARE(1024)) { - item->TargetState = STATE_BADDY_WALK; + item->Animation.TargetState = STATE_BADDY_WALK; break; } break; @@ -909,10 +909,10 @@ namespace TEN::Entities::TR4 case STATE_BADDY_SWORD_HIT_FRONT: case STATE_BADDY_SWORD_HIT_LEFT: case STATE_BADDY_WALK_SWORD_HIT_RIGHT: - if (item->ActiveState == STATE_BADDY_SWORD_HIT_RIGHT && + if (item->Animation.ActiveState == STATE_BADDY_SWORD_HIT_RIGHT && info.distance < 0x40000) { - item->TargetState = STATE_BADDY_SWORD_HIT_LEFT; + item->Animation.TargetState = STATE_BADDY_SWORD_HIT_LEFT; } if (info.ahead) { @@ -920,8 +920,8 @@ namespace TEN::Entities::TR4 joint2 = info.xAngle; } currentCreature->MaxTurn = 0; - if (item->ActiveState != STATE_BADDY_SWORD_HIT_FRONT || - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_SWORD_HIT_NO_DAMAGE_MAX) + if (item->Animation.ActiveState != STATE_BADDY_SWORD_HIT_FRONT || + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_SWORD_HIT_NO_DAMAGE_MAX) { if (abs(info.angle) >= ANGLE(7)) { @@ -943,8 +943,8 @@ namespace TEN::Entities::TR4 { if (item->TouchBits & 0x1C000) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_SWORD_HIT_DAMAGE_MIN && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_SWORD_HIT_DAMAGE_MAX) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_SWORD_HIT_DAMAGE_MIN && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_SWORD_HIT_DAMAGE_MAX) { LaraItem->HitPoints -= 120; LaraItem->HitStatus = true; @@ -958,7 +958,7 @@ namespace TEN::Entities::TR4 } } } - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd - 1) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd - 1) { currentCreature->Flags = 0; } @@ -975,25 +975,25 @@ namespace TEN::Entities::TR4 if (laraInfo.ahead && laraInfo.distance < SQUARE(682) - && (LaraItem->ActiveState == LS_MONKEY_IDLE - || LaraItem->ActiveState == LS_MONKEY_FORWARD - || LaraItem->ActiveState == LS_MONKEY_SHIMMY_LEFT - || LaraItem->ActiveState == LS_MONKEY_SHIMMY_RIGHT - || LaraItem->ActiveState == LS_MONKEY_TURN_180 - || LaraItem->ActiveState == LS_MONKEY_TURN_LEFT - || LaraItem->ActiveState == LS_MONKEY_TURN_RIGHT)) + && (LaraItem->Animation.ActiveState == LS_MONKEY_IDLE + || LaraItem->Animation.ActiveState == LS_MONKEY_FORWARD + || LaraItem->Animation.ActiveState == LS_MONKEY_SHIMMY_LEFT + || LaraItem->Animation.ActiveState == LS_MONKEY_SHIMMY_RIGHT + || LaraItem->Animation.ActiveState == LS_MONKEY_TURN_180 + || LaraItem->Animation.ActiveState == LS_MONKEY_TURN_LEFT + || LaraItem->Animation.ActiveState == LS_MONKEY_TURN_RIGHT)) { - item->TargetState = STATE_BADDY_MONKEY_PUSH_OFF; + item->Animation.TargetState = STATE_BADDY_MONKEY_PUSH_OFF; } else if (item->BoxNumber != currentCreature->LOT.TargetBox && currentCreature->MonkeySwingAhead || GetCeiling(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos) != height - (STEP_SIZE * 6)) { - item->TargetState = STATE_BADDY_MONKEY_FORWARD; + item->Animation.TargetState = STATE_BADDY_MONKEY_FORWARD; } else { - item->TargetState = STATE_BADDY_MONKEY_FALL_LAND; + item->Animation.TargetState = STATE_BADDY_MONKEY_FALL_LAND; currentCreature->LOT.IsMonkeying = false; currentCreature->LOT.IsJumping = false; } @@ -1013,7 +1013,7 @@ namespace TEN::Entities::TR4 height = GetFloorHeight(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos); if (GetCeiling(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos) == height - (STEP_SIZE * 6)) { - item->TargetState = STATE_BADDY_MONKEY_IDLE; + item->Animation.TargetState = STATE_BADDY_MONKEY_IDLE; } } if (laraInfo.ahead) @@ -1021,15 +1021,15 @@ namespace TEN::Entities::TR4 if (laraInfo.distance < SQUARE(682)) { - if (LaraItem->ActiveState == LS_MONKEY_IDLE - || LaraItem->ActiveState == LS_MONKEY_FORWARD - || LaraItem->ActiveState == LS_MONKEY_SHIMMY_LEFT - || LaraItem->ActiveState == LS_MONKEY_SHIMMY_RIGHT - || LaraItem->ActiveState == LS_MONKEY_TURN_180 - || LaraItem->ActiveState == LS_MONKEY_TURN_LEFT - || LaraItem->ActiveState == LS_MONKEY_TURN_RIGHT) + if (LaraItem->Animation.ActiveState == LS_MONKEY_IDLE + || LaraItem->Animation.ActiveState == LS_MONKEY_FORWARD + || LaraItem->Animation.ActiveState == LS_MONKEY_SHIMMY_LEFT + || LaraItem->Animation.ActiveState == LS_MONKEY_SHIMMY_RIGHT + || LaraItem->Animation.ActiveState == LS_MONKEY_TURN_180 + || LaraItem->Animation.ActiveState == LS_MONKEY_TURN_LEFT + || LaraItem->Animation.ActiveState == LS_MONKEY_TURN_RIGHT) { - item->TargetState = STATE_BADDY_MONKEY_IDLE; + item->Animation.TargetState = STATE_BADDY_MONKEY_IDLE; } } } @@ -1041,13 +1041,13 @@ namespace TEN::Entities::TR4 { if (item->TouchBits) { - LaraItem->ActiveState = LS_JUMP_UP; - LaraItem->TargetState = LS_JUMP_UP; - LaraItem->AnimNumber = LA_JUMP_UP; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->FrameNumber].frameBase + 9; - LaraItem->Airborne = true; - LaraItem->VerticalVelocity = 2; - LaraItem->VerticalVelocity = 1; + LaraItem->Animation.ActiveState = LS_JUMP_UP; + LaraItem->Animation.TargetState = LS_JUMP_UP; + LaraItem->Animation.AnimNumber = LA_JUMP_UP; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.FrameNumber].frameBase + 9; + LaraItem->Animation.Airborne = true; + LaraItem->Animation.VerticalVelocity = 2; + LaraItem->Animation.VerticalVelocity = 1; LaraItem->Position.yPos += (STEP_SIZE * 0.75f); Lara.Control.HandStatus = HandStatus::Free; currentCreature->Flags = 1; @@ -1072,13 +1072,13 @@ namespace TEN::Entities::TR4 || currentCreature->Enemy->ObjectNumber == ID_UZI_AMMO_ITEM) && info.distance < SQUARE(512)) { - item->TargetState = STATE_BADDY_CROUCH_PICKUP; + item->Animation.TargetState = STATE_BADDY_CROUCH_PICKUP; break; } } if (currentCreature->Alerted) { - item->TargetState = STATE_BADDY_CROUCH_TO_STAND; + item->Animation.TargetState = STATE_BADDY_CROUCH_TO_STAND; } } else @@ -1087,14 +1087,14 @@ namespace TEN::Entities::TR4 { break; } - item->TargetState = STATE_BADDY_CROUCH_TO_STAND; + item->Animation.TargetState = STATE_BADDY_CROUCH_TO_STAND; currentCreature->Enemy = NULL; } break; case STATE_BADDY_CROUCH_PICKUP: ClampRotation(&item->Position, info.angle, ANGLE(11)); - if (item->FrameNumber != g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_CROUCH_PICKUP) + if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_CROUCH_PICKUP) { break; } @@ -1158,10 +1158,10 @@ namespace TEN::Entities::TR4 if (!Targetable(item, &info) || item->ItemFlags[2] < 1) { - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; break; } - item->TargetState = STATE_BADDY_FIRE; + item->Animation.TargetState = STATE_BADDY_FIRE; break; case STATE_BADDY_FIRE: @@ -1171,8 +1171,8 @@ namespace TEN::Entities::TR4 joint2 = info.xAngle; } ClampRotation(&item->Position, info.angle, ANGLE(7)); - if (item->FrameNumber >= g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_FIRE_MAX || - item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_FIRE_MIN) + if (item->Animation.FrameNumber >= g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_FIRE_MAX || + item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_FIRE_MIN) { break; } @@ -1182,35 +1182,35 @@ namespace TEN::Entities::TR4 item->ItemFlags[2]--; } if (!ShotLara(item, &info, &baddyGun, joint1, 15)); - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; break; default: break; case STATE_BADDY_HOLSTER_GUN: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_HOLSTER_GUN) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_HOLSTER_GUN) { item->SwapMeshFlags = SWAPMESHFLAGS_BADDY_EMPTY; } break; case STATE_BADDY_DRAW_GUN: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_DRAW_GUN) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_DRAW_GUN) { item->SwapMeshFlags = SWAPMESHFLAGS_BADDY_GUN; } break; case STATE_BADDY_HOLSTER_SWORD: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_HOLSTER_SWORD) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_HOLSTER_SWORD) { item->SwapMeshFlags = SWAPMESHFLAGS_BADDY_EMPTY; } break; case STATE_BADDY_DRAW_SWORD: - if (item->FrameNumber != g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_DRAW_SWORD) + if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_DRAW_SWORD) { break; } @@ -1230,7 +1230,7 @@ namespace TEN::Entities::TR4 if (laraInfo.distance < SQUARE(682) || item != Lara.TargetEntity) { - item->TargetState = STATE_BADDY_UNKNOWN_9; + item->Animation.TargetState = STATE_BADDY_UNKNOWN_9; } break; @@ -1239,18 +1239,18 @@ namespace TEN::Entities::TR4 { if ((GetRandomControl() & 0x7F) == 0) { - item->TargetState = STATE_BADDY_STOP; + item->Animation.TargetState = STATE_BADDY_STOP; } } break; case STATE_BADDY_SOMERSAULT: - if (item->AnimNumber == Objects[objectNumber].animIndex + ANIMATION_BADDY_SOMERSAULT_END) + if (item->Animation.AnimNumber == Objects[objectNumber].animIndex + ANIMATION_BADDY_SOMERSAULT_END) { ClampRotation(&item->Position, info.angle, ANGLE(7)); break; } - if (item->FrameNumber != g_Level.Anims[item->AnimNumber].frameBase + FRAME_BADDY_SOMERSAULT_START_TAKE_OFF) + if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase + FRAME_BADDY_SOMERSAULT_START_TAKE_OFF) { break; } @@ -1263,7 +1263,7 @@ namespace TEN::Entities::TR4 { break; } - if (item->AnimNumber != Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_TO_JUMP_FORWARD) + if (item->Animation.AnimNumber != Objects[objectNumber].animIndex + ANIMATION_BADDY_STAND_TO_JUMP_FORWARD) { item->ItemFlags[0] += 2; } @@ -1276,12 +1276,12 @@ namespace TEN::Entities::TR4 CreatureJoint(item, 1, joint2); CreatureJoint(item, 2, joint3); - if (item->ActiveState >= STATE_BADDY_JUMP_FORWARD_2_BLOCKS || - item->ActiveState == STATE_BADDY_JUMP_FORWARD_1_BLOCK || - item->ActiveState == STATE_BADDY_MONKEY_FORWARD || - item->ActiveState == STATE_BADDY_DEATH || - item->ActiveState == STATE_BADDY_SOMERSAULT || - item->ActiveState == STATE_BADDY_BLIND) + if (item->Animation.ActiveState >= STATE_BADDY_JUMP_FORWARD_2_BLOCKS || + item->Animation.ActiveState == STATE_BADDY_JUMP_FORWARD_1_BLOCK || + item->Animation.ActiveState == STATE_BADDY_MONKEY_FORWARD || + item->Animation.ActiveState == STATE_BADDY_DEATH || + item->Animation.ActiveState == STATE_BADDY_SOMERSAULT || + item->Animation.ActiveState == STATE_BADDY_BLIND) { CreatureAnimation(itemNum, angle, 0); } @@ -1293,37 +1293,37 @@ namespace TEN::Entities::TR4 { case 2: creature->MaxTurn = 0; - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CLIMB_2_CLICKS; - item->ActiveState = STATE_BADDY_CLIMB_2_CLICKS; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CLIMB_2_CLICKS; + item->Animation.ActiveState = STATE_BADDY_CLIMB_2_CLICKS; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 3: creature->MaxTurn = 0; - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CLIMB_3_CLICKS; - item->ActiveState = STATE_BADDY_CLIMB_3_CLICKS; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CLIMB_3_CLICKS; + item->Animation.ActiveState = STATE_BADDY_CLIMB_3_CLICKS; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 4: creature->MaxTurn = 0; - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CLIMB_4_CLICKS; - item->ActiveState = STATE_BADDY_CLIMB_4_CLICKS; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_CLIMB_4_CLICKS; + item->Animation.ActiveState = STATE_BADDY_CLIMB_4_CLICKS; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case -3: creature->MaxTurn = 0; - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_JUMP_OFF_3_CLICKS; - item->ActiveState = STATE_BADDY_JUMP_OFF_3_CLICKS; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_JUMP_OFF_3_CLICKS; + item->Animation.ActiveState = STATE_BADDY_JUMP_OFF_3_CLICKS; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case -4: creature->MaxTurn = 0; - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_JUMP_OFF_4_CLICKS; - item->ActiveState = STATE_BADDY_JUMP_OFF_4_CLICKS; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_JUMP_OFF_4_CLICKS; + item->Animation.ActiveState = STATE_BADDY_JUMP_OFF_4_CLICKS; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; default: @@ -1333,9 +1333,9 @@ namespace TEN::Entities::TR4 else { creature->MaxTurn = 0; - item->AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_BLIND; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase + (GetRandomControl() & 7); - item->ActiveState = STATE_BADDY_BLIND; + item->Animation.AnimNumber = Objects[objectNumber].animIndex + ANIMATION_BADDY_BLIND; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase + (GetRandomControl() & 7); + item->Animation.ActiveState = STATE_BADDY_BLIND; } return; diff --git a/TR5Main/Objects/TR4/Entity/tr4_bat.cpp b/TR5Main/Objects/TR4/Entity/tr4_bat.cpp index 6b165b8a0..282c0f506 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_bat.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_bat.cpp @@ -52,10 +52,10 @@ namespace TEN::Entities::TR4 InitialiseCreature(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + BAT_ANIM_IDLE; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = BAT_STATE_IDLE; - item->ActiveState = BAT_STATE_IDLE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + BAT_ANIM_IDLE; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = BAT_STATE_IDLE; + item->Animation.ActiveState = BAT_STATE_IDLE; } void BatControl(short itemNumber) @@ -127,13 +127,13 @@ namespace TEN::Entities::TR4 angle = CreatureTurn(item, BAT_ANGLE); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case BAT_STATE_IDLE: if (aiInfo.distance < BAT_TARGETING_RANGE || item->HitStatus || creature->HurtByLara) - item->TargetState = BAT_STATE_START; + item->Animation.TargetState = BAT_STATE_START; break; @@ -149,7 +149,7 @@ namespace TEN::Entities::TR4 && aiInfo.ahead && abs(item->Position.yPos - creature->Enemy->Position.yPos) < BAT_TARGET_YPOS) { - item->TargetState = BAT_STATE_ATTACK; + item->Animation.TargetState = BAT_STATE_ATTACK; } } @@ -173,36 +173,36 @@ namespace TEN::Entities::TR4 } else { - item->TargetState = BAT_STATE_FLY; + item->Animation.TargetState = BAT_STATE_FLY; creature->Mood = MoodType::Bored; } break; } } - else if (item->ActiveState == BAT_STATE_ATTACK) + else if (item->Animation.ActiveState == BAT_STATE_ATTACK) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = BAT_STATE_FLY; - item->ActiveState = BAT_STATE_FLY; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = BAT_STATE_FLY; + item->Animation.ActiveState = BAT_STATE_FLY; } else { if (item->Position.yPos >= item->Floor) { - item->TargetState = BAT_STATE_DEATH; + item->Animation.TargetState = BAT_STATE_DEATH; item->Position.yPos = item->Floor; - item->Airborne = false; + item->Animation.Airborne = false; } else { - item->Airborne = true; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + BAT_ANIM_FALLING; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = BAT_STATE_FALL; - item->ActiveState = BAT_STATE_FALL; - item->Velocity = 0; + item->Animation.Airborne = true; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + BAT_ANIM_FALLING; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = BAT_STATE_FALL; + item->Animation.ActiveState = BAT_STATE_FALL; + item->Animation.Velocity = 0; } } diff --git a/TR5Main/Objects/TR4/Entity/tr4_big_beetle.cpp b/TR5Main/Objects/TR4/Entity/tr4_big_beetle.cpp index 441ecf5bd..d1caf3251 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_big_beetle.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_big_beetle.cpp @@ -33,10 +33,10 @@ namespace TEN::Entities::TR4 ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 3; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 1; - item->ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 3; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 1; + item->Animation.ActiveState = 1; } void BigBeetleControl(short itemNumber) @@ -51,31 +51,31 @@ namespace TEN::Entities::TR4 if (item->HitPoints <= 0) { - if (item->ActiveState != 6) + if (item->Animation.ActiveState != 6) { - if (item->ActiveState != 7) + if (item->Animation.ActiveState != 7) { - if (item->ActiveState == 8) + if (item->Animation.ActiveState == 8) { item->Position.xRot = 0; item->Position.yPos = item->Floor; } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 5; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 6; - item->Velocity = 0; - item->Airborne = true; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 5; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 6; + item->Animation.Velocity = 0; + item->Animation.Airborne = true; item->Position.xRot = 0; } } else if (item->Position.yPos >= item->Floor) { item->Position.yPos = item->Floor; - item->VerticalVelocity = 0; - item->Airborne = false; - item->TargetState = 8; + item->Animation.VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.TargetState = 8; } } @@ -102,7 +102,7 @@ namespace TEN::Entities::TR4 creature->Flags = 0; } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: item->Position.yPos = item->Floor; @@ -113,7 +113,7 @@ namespace TEN::Entities::TR4 creature->HurtByLara || AI.distance < pow(SECTOR(3), 2)) { - item->TargetState = 2; + item->Animation.TargetState = 2; } break; @@ -121,12 +121,12 @@ namespace TEN::Entities::TR4 case 3: creature->MaxTurn = ANGLE(7.0f); - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.ahead) { if (AI.distance < pow(CLICK(1), 2)) - item->TargetState = 9; + item->Animation.TargetState = 9; } break; @@ -137,14 +137,14 @@ namespace TEN::Entities::TR4 if (AI.ahead) { if (AI.distance < pow(CLICK(1), 2)) - item->TargetState = 4; + item->Animation.TargetState = 4; } else if (AI.distance < pow(CLICK(1), 2)) - item->TargetState = 9; + item->Animation.TargetState = 9; else { - item->RequiredState = 3; - item->TargetState = 9; + item->Animation.RequiredState = 3; + item->Animation.TargetState = 9; } if (!creature->Flags) @@ -179,8 +179,8 @@ namespace TEN::Entities::TR4 case 9u: creature->MaxTurn = ANGLE(7.0f); - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (!item->HitStatus && item->AIBits != MODIFY && GetRandomControl() >= 384 && @@ -191,11 +191,11 @@ namespace TEN::Entities::TR4 if (AI.ahead) { if (AI.distance < pow(CLICK(1), 2) && !creature->Flags) - item->TargetState = 4; + item->Animation.TargetState = 4; } } else - item->TargetState = 3; + item->Animation.TargetState = 3; break; diff --git a/TR5Main/Objects/TR4/Entity/tr4_bigscorpion.cpp b/TR5Main/Objects/TR4/Entity/tr4_bigscorpion.cpp index 8139f89ec..85377dbda 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_bigscorpion.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_bigscorpion.cpp @@ -43,18 +43,18 @@ void InitialiseScorpion(short itemNumber) if (item->TriggerFlags == 1) { - item->TargetState = BSCORPION_STATE_TROOPS_ATTACK; - item->ActiveState = BSCORPION_STATE_TROOPS_ATTACK; - item->AnimNumber = Objects[ID_BIG_SCORPION].animIndex + 7; + item->Animation.TargetState = BSCORPION_STATE_TROOPS_ATTACK; + item->Animation.ActiveState = BSCORPION_STATE_TROOPS_ATTACK; + item->Animation.AnimNumber = Objects[ID_BIG_SCORPION].animIndex + 7; } else { - item->TargetState = BSCORPION_STATE_IDLE; - item->ActiveState = BSCORPION_STATE_IDLE; - item->AnimNumber = Objects[ID_BIG_SCORPION].animIndex + 2; + item->Animation.TargetState = BSCORPION_STATE_IDLE; + item->Animation.ActiveState = BSCORPION_STATE_IDLE; + item->Animation.AnimNumber = Objects[ID_BIG_SCORPION].animIndex + 2; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } void ScorpionControl(short itemNumber) @@ -113,15 +113,15 @@ void ScorpionControl(short itemNumber) if (item->HitPoints <= 0) { item->HitPoints = 0; - if (item->ActiveState != BSCORPION_STATE_DEATH) + if (item->Animation.ActiveState != BSCORPION_STATE_DEATH) { if (item->TriggerFlags > 0 && item->TriggerFlags < 7) { CutSeqNum = 4; - item->AnimNumber = Objects[item->AnimNumber].animIndex + 5; - item->ActiveState = BSCORPION_STATE_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->Animation.AnimNumber].animIndex + 5; + item->Animation.ActiveState = BSCORPION_STATE_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; item->Status = ITEM_INVISIBLE; creature->MaxTurn = 0; @@ -142,19 +142,19 @@ void ScorpionControl(short itemNumber) } } } - else if (item->ActiveState != BSCORPION_STATE_DEATH && item->ActiveState != BSCORPION_STATE_SPECIAL_DEATH) + else if (item->Animation.ActiveState != BSCORPION_STATE_DEATH && item->Animation.ActiveState != BSCORPION_STATE_SPECIAL_DEATH) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 5; - item->ActiveState = BSCORPION_STATE_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 5; + item->Animation.ActiveState = BSCORPION_STATE_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } else if (CutSeqNum == 4) { - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameEnd - 1; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameEnd - 1; item->Status = ITEM_INVISIBLE; } - else if (item->ActiveState == BSCORPION_STATE_DEATH) + else if (item->Animation.ActiveState == BSCORPION_STATE_DEATH) { if (item->Status == ITEM_INVISIBLE) item->Status = ITEM_ACTIVE; @@ -166,7 +166,7 @@ void ScorpionControl(short itemNumber) GetAITarget(creature); else { - if (creature->HurtByLara && item->ActiveState != BSCORPION_STATE_TROOPS_ATTACK) + if (creature->HurtByLara && item->Animation.ActiveState != BSCORPION_STATE_TROOPS_ATTACK) creature->Enemy = LaraItem; else { @@ -212,7 +212,7 @@ void ScorpionControl(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case BSCORPION_STATE_IDLE: creature->MaxTurn = 0; @@ -220,7 +220,7 @@ void ScorpionControl(short itemNumber) if (info.distance > pow(1365, 2)) { - item->TargetState = BSCORPION_STATE_WALK; + item->Animation.TargetState = BSCORPION_STATE_WALK; break; } @@ -232,13 +232,13 @@ void ScorpionControl(short itemNumber) creature->Enemy->HitPoints <= 15 && creature->Enemy->ObjectNumber == ID_TROOPS) { - item->TargetState = BSCORPION_STATE_ATTACK_1; + item->Animation.TargetState = BSCORPION_STATE_ATTACK_1; } else - item->TargetState = BSCORPION_STATE_ATTACK_2; + item->Animation.TargetState = BSCORPION_STATE_ATTACK_2; } else if (!info.ahead) - item->TargetState = BSCORPION_STATE_WALK; + item->Animation.TargetState = BSCORPION_STATE_WALK; break; @@ -246,9 +246,9 @@ void ScorpionControl(short itemNumber) creature->MaxTurn = ANGLE(2.0f); if (info.distance < pow(1365, 2)) - item->TargetState = BSCORPION_STATE_IDLE; + item->Animation.TargetState = BSCORPION_STATE_IDLE; else if (info.distance > pow(853, 2)) - item->TargetState = BSCORPION_STATE_RUN; + item->Animation.TargetState = BSCORPION_STATE_RUN; break; @@ -256,7 +256,7 @@ void ScorpionControl(short itemNumber) creature->MaxTurn = ANGLE(3.0f); if (info.distance < pow(1365, 2)) - item->TargetState = BSCORPION_STATE_IDLE; + item->Animation.TargetState = BSCORPION_STATE_IDLE; break; @@ -284,7 +284,7 @@ void ScorpionControl(short itemNumber) creature->Enemy->HitPoints -= 15; if (creature->Enemy->HitPoints <= 0) { - item->TargetState = BSCORPION_STATE_SPECIAL_DEATH; + item->Animation.TargetState = BSCORPION_STATE_SPECIAL_DEATH; creature->MaxTurn = 0; } @@ -303,7 +303,7 @@ void ScorpionControl(short itemNumber) LaraItem->HitPoints -= 120; LaraItem->HitStatus = true; - if (item->ActiveState == 5) + if (item->Animation.ActiveState == 5) { Lara.PoisonPotency += 8; @@ -337,7 +337,7 @@ void ScorpionControl(short itemNumber) case BSCORPION_STATE_TROOPS_ATTACK: creature->MaxTurn = 0; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) { item->TriggerFlags++; } @@ -345,7 +345,7 @@ void ScorpionControl(short itemNumber) creature->Enemy->HitPoints <= 0 || item->TriggerFlags > 6) { - item->TargetState = BSCORPION_STATE_SPECIAL_DEATH; + item->Animation.TargetState = BSCORPION_STATE_SPECIAL_DEATH; creature->Enemy->HitPoints = 0; } diff --git a/TR5Main/Objects/TR4/Entity/tr4_crocodile.cpp b/TR5Main/Objects/TR4/Entity/tr4_crocodile.cpp index ef8f677ff..4a59feef5 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_crocodile.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_crocodile.cpp @@ -64,17 +64,17 @@ void InitialiseCrocodile(short itemNumber) if (TestEnvironment(ENV_FLAG_WATER, item)) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + CROC_ANIM_SWIM; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = CROC_STATE_UNDERWATER_SWIM; - item->TargetState = CROC_STATE_UNDERWATER_SWIM; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + CROC_ANIM_SWIM; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = CROC_STATE_UNDERWATER_SWIM; + item->Animation.TargetState = CROC_STATE_UNDERWATER_SWIM; } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + CROC_ANIM_IDLE; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = CROC_STATE_IDLE; - item->TargetState = CROC_STATE_IDLE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + CROC_ANIM_IDLE; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = CROC_STATE_IDLE; + item->Animation.TargetState = CROC_STATE_IDLE; } } @@ -123,21 +123,21 @@ void CrocodileControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != CROC_STATE_DEATH && item->ActiveState != CROC_STATE_UNDERWATER_DEATH) + if (item->Animation.ActiveState != CROC_STATE_DEATH && item->Animation.ActiveState != CROC_STATE_UNDERWATER_DEATH) { if (TestEnvironment(ENV_FLAG_WATER, item)) { - item->AnimNumber = object->animIndex + CROC_ANIM_UNDERWATER_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = CROC_STATE_UNDERWATER_DEATH; - item->TargetState = CROC_STATE_UNDERWATER_DEATH; + item->Animation.AnimNumber = object->animIndex + CROC_ANIM_UNDERWATER_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = CROC_STATE_UNDERWATER_DEATH; + item->Animation.TargetState = CROC_STATE_UNDERWATER_DEATH; } else { - item->AnimNumber = object->animIndex + CROC_ANIM_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = CROC_STATE_DEATH; - item->TargetState = CROC_STATE_DEATH; + item->Animation.AnimNumber = object->animIndex + CROC_ANIM_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = CROC_STATE_DEATH; + item->Animation.TargetState = CROC_STATE_DEATH; } } @@ -169,7 +169,7 @@ void CrocodileControl(short itemNumber) boneAngle = angle * 4; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case CROC_STATE_IDLE: creature->MaxTurn = 0; @@ -177,7 +177,7 @@ void CrocodileControl(short itemNumber) if (item->AIBits & GUARD) { boneAngle = item->ItemFlags[0]; - item->TargetState = CROC_STATE_IDLE; + item->Animation.TargetState = CROC_STATE_IDLE; item->ItemFlags[0] = item->ItemFlags[1] + boneAngle; if (!(GetRandomControl() & 0x1F)) @@ -194,13 +194,13 @@ void CrocodileControl(short itemNumber) item->ItemFlags[0] = 1024; } else if (AI.bite && AI.distance < CROC_ATTACK_RANGE) - item->TargetState = CROC_STATE_ATTACK; + item->Animation.TargetState = CROC_STATE_ATTACK; else { if (AI.ahead && AI.distance < CROC_STATE_RUN_RANGE) - item->TargetState = CROC_STATE_WALK; + item->Animation.TargetState = CROC_STATE_WALK; else - item->TargetState = CROC_STATE_RUN; + item->Animation.TargetState = CROC_STATE_RUN; } break; @@ -211,17 +211,17 @@ void CrocodileControl(short itemNumber) // Land to water transition. if (CrocodileIsInWater(item)) { - item->RequiredState = CROC_STATE_UNDERWATER_SWIM; - item->TargetState = CROC_STATE_UNDERWATER_SWIM; + item->Animation.RequiredState = CROC_STATE_UNDERWATER_SWIM; + item->Animation.TargetState = CROC_STATE_UNDERWATER_SWIM; break; } - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.bite && AI.distance < CROC_ATTACK_RANGE) - item->TargetState = CROC_STATE_IDLE; + item->Animation.TargetState = CROC_STATE_IDLE; else if (!AI.ahead || AI.distance > CROC_MAXRUN_RANGE) - item->TargetState = CROC_STATE_RUN; + item->Animation.TargetState = CROC_STATE_RUN; break; @@ -231,37 +231,37 @@ void CrocodileControl(short itemNumber) // Land to water transition. if (CrocodileIsInWater(item)) { - item->RequiredState = CROC_STATE_WALK; - item->TargetState = CROC_STATE_WALK; + item->Animation.RequiredState = CROC_STATE_WALK; + item->Animation.TargetState = CROC_STATE_WALK; break; } - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.bite && AI.distance < CROC_ATTACK_RANGE) - item->TargetState = CROC_STATE_IDLE; + item->Animation.TargetState = CROC_STATE_IDLE; else if (AI.ahead && AI.distance < CROC_STATE_RUN_RANGE) - item->TargetState = CROC_STATE_WALK; + item->Animation.TargetState = CROC_STATE_WALK; break; case CROC_STATE_ATTACK: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) - item->RequiredState = 0; + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + item->Animation.RequiredState = 0; if (AI.bite && item->TouchBits & CROC_TOUCHBITS) { - if (!item->RequiredState) + if (!item->Animation.RequiredState) { CreatureEffect2(item, &CrocodileBite, 10, -1, DoBloodSplat); - item->RequiredState = CROC_STATE_IDLE; + item->Animation.RequiredState = CROC_STATE_IDLE; LaraItem->HitPoints -= CROC_DAMAGE; LaraItem->HitStatus = true; } } else - item->TargetState = CROC_STATE_IDLE; + item->Animation.TargetState = CROC_STATE_IDLE; break; @@ -271,50 +271,50 @@ void CrocodileControl(short itemNumber) // Water to land transition. if (!CrocodileIsInWater(item)) { - item->AnimNumber = object->animIndex + CROC_ANIM_LAND_MODE; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->RequiredState = CROC_STATE_WALK; - item->ActiveState = CROC_STATE_WALK; - item->TargetState = CROC_STATE_WALK; + item->Animation.AnimNumber = object->animIndex + CROC_ANIM_LAND_MODE; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.RequiredState = CROC_STATE_WALK; + item->Animation.ActiveState = CROC_STATE_WALK; + item->Animation.TargetState = CROC_STATE_WALK; break; } - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.bite) { if (item->TouchBits & 768) - item->TargetState = CROC_STATE_UNDERWATER_ATTACK; + item->Animation.TargetState = CROC_STATE_UNDERWATER_ATTACK; } break; case CROC_STATE_UNDERWATER_ATTACK: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) - item->RequiredState = CROC_STATE_NONE_1; + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) + item->Animation.RequiredState = CROC_STATE_NONE_1; if (AI.bite && item->TouchBits & CROC_TOUCHBITS) { - if (!item->RequiredState) + if (!item->Animation.RequiredState) { CreatureEffect2(item, &CrocodileBite, 10, -1, DoBloodSplat); - item->RequiredState = CROC_STATE_UNDERWATER_SWIM; + item->Animation.RequiredState = CROC_STATE_UNDERWATER_SWIM; LaraItem->HitPoints -= CROC_DAMAGE; LaraItem->HitStatus = true; } } else - item->TargetState = CROC_STATE_UNDERWATER_SWIM; + item->Animation.TargetState = CROC_STATE_UNDERWATER_SWIM; break; } } OBJECT_BONES boneRot; - if (item->ActiveState == CROC_STATE_IDLE || - item->ActiveState == CROC_STATE_ATTACK || - item->ActiveState == CROC_STATE_UNDERWATER_ATTACK) + if (item->Animation.ActiveState == CROC_STATE_IDLE || + item->Animation.ActiveState == CROC_STATE_ATTACK || + item->Animation.ActiveState == CROC_STATE_UNDERWATER_ATTACK) { boneRot.bone0 = AI.angle; boneRot.bone1 = AI.angle; @@ -335,13 +335,13 @@ void CrocodileControl(short itemNumber) CreatureJoint(item, 2, boneRot.bone2); CreatureJoint(item, 3, boneRot.bone3); - if (item->ActiveState < CROC_STATE_UNDERWATER_SWIM) + if (item->Animation.ActiveState < CROC_STATE_UNDERWATER_SWIM) CalculateItemRotationToSurface(item, 2.0f); CreatureAnimation(itemNumber, angle, 0); - if (item->ActiveState >= CROC_STATE_UNDERWATER_SWIM && - item->ActiveState <= CROC_STATE_UNDERWATER_DEATH) + if (item->Animation.ActiveState >= CROC_STATE_UNDERWATER_SWIM && + item->Animation.ActiveState <= CROC_STATE_UNDERWATER_DEATH) { CreatureUnderwater(item, CLICK(1)); } diff --git a/TR5Main/Objects/TR4/Entity/tr4_demigod.cpp b/TR5Main/Objects/TR4/Entity/tr4_demigod.cpp index 0bf37ae25..e5800fab2 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_demigod.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_demigod.cpp @@ -136,11 +136,11 @@ namespace TEN::Entities::TR4 { auto* item = &g_Level.Items[itemNumber]; - short animIndex = item->AnimNumber - Objects[item->ObjectNumber].animIndex; + short animIndex = item->Animation.AnimNumber - Objects[item->ObjectNumber].animIndex; if (animIndex == 8) { - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { PHD_VECTOR pos1 = { -544, 96, 0 }; GetJointAbsPosition(item, &pos1, 16); @@ -168,7 +168,7 @@ namespace TEN::Entities::TR4 else if (animIndex == 19) { - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { PHD_VECTOR pos1 = { -544, 96, 0 }; GetJointAbsPosition(item, &pos1, 16); @@ -196,7 +196,7 @@ namespace TEN::Entities::TR4 else if (animIndex == 16) { // Animation 16 (State 10) is the big circle attack of DEMIGOD_3 - int frameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if (frameNumber >= 8 && frameNumber <= 64) { @@ -288,10 +288,10 @@ namespace TEN::Entities::TR4 ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->TargetState = STATE_DEMIGOD_IDLE; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = STATE_DEMIGOD_IDLE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = STATE_DEMIGOD_IDLE; /*if (g_Level.NumItems > 0) { @@ -339,21 +339,21 @@ namespace TEN::Entities::TR4 { item->HitPoints = 0; - if (item->ActiveState != STATE_DEMIGOD_DEATH_1 && - item->ActiveState != STATE_DEMIGOD_DEATH_2) + if (item->Animation.ActiveState != STATE_DEMIGOD_DEATH_1 && + item->Animation.ActiveState != STATE_DEMIGOD_DEATH_2) { - if (item->ActiveState == STATE_DEMIGOD_WALK || - item->ActiveState == STATE_DEMIGOD_RUN) + if (item->Animation.ActiveState == STATE_DEMIGOD_WALK || + item->Animation.ActiveState == STATE_DEMIGOD_RUN) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 27; - item->ActiveState = STATE_DEMIGOD_DEATH_2; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 27; + item->Animation.ActiveState = STATE_DEMIGOD_DEATH_2; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 12; - item->ActiveState = STATE_DEMIGOD_DEATH_1; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 12; + item->Animation.ActiveState = STATE_DEMIGOD_DEATH_1; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } } @@ -417,7 +417,7 @@ namespace TEN::Entities::TR4 joint3 = AI.angle >> 1; } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_DEMIGOD_IDLE: creature->MaxTurn = 0; @@ -429,15 +429,15 @@ namespace TEN::Entities::TR4 { if (AI.distance >= pow(SECTOR(3), 2)) { - item->TargetState = STATE_DEMIGOD_WALK; + item->Animation.TargetState = STATE_DEMIGOD_WALK; break; } if (AI.bite || - LaraItem->ActiveState >= LS_LADDER_IDLE && - LaraItem->ActiveState <= LS_LADDER_DOWN && + LaraItem->Animation.ActiveState >= LS_LADDER_IDLE && + LaraItem->Animation.ActiveState <= LS_LADDER_DOWN && !Lara.Location) { - item->TargetState = STATE_DEMIGOD_HAMMER_AIM; + item->Animation.TargetState = STATE_DEMIGOD_HAMMER_AIM; break; } } @@ -448,9 +448,9 @@ namespace TEN::Entities::TR4 creature->Flags = 1; if (item->ObjectNumber == ID_DEMIGOD2) - item->TargetState = STATE_DEMIGOD_AIM; + item->Animation.TargetState = STATE_DEMIGOD_AIM; else - item->TargetState = STATE_DEMIGOD_GROUND_AIM; + item->Animation.TargetState = STATE_DEMIGOD_GROUND_AIM; break; } @@ -459,13 +459,13 @@ namespace TEN::Entities::TR4 { if (AI.distance <= pow(SECTOR(2), 2) || AI.distance >= pow(SECTOR(5), 2)) { - item->TargetState = STATE_DEMIGOD_WALK; + item->Animation.TargetState = STATE_DEMIGOD_WALK; break; } if (!(GetRandomControl() & 3)) { - item->TargetState = STATE_DEMIGOD_CIRCLE_AIM; + item->Animation.TargetState = STATE_DEMIGOD_CIRCLE_AIM; break; } } @@ -473,11 +473,11 @@ namespace TEN::Entities::TR4 if (AI.distance <= pow(SECTOR(3), 2) || item->ObjectNumber != ID_DEMIGOD2) { - item->TargetState = STATE_DEMIGOD_WALK; + item->Animation.TargetState = STATE_DEMIGOD_WALK; break; } - item->TargetState = STATE_DEMIGOD_FLY; + item->Animation.TargetState = STATE_DEMIGOD_FLY; break; case STATE_DEMIGOD_WALK: @@ -485,7 +485,7 @@ namespace TEN::Entities::TR4 if (AI.distance < pow(SECTOR(2), 2)) { - item->TargetState = STATE_DEMIGOD_IDLE; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; break; } @@ -493,7 +493,7 @@ namespace TEN::Entities::TR4 { if (AI.distance < pow(SECTOR(3), 2)) { - item->TargetState = STATE_DEMIGOD_IDLE; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; break; } } @@ -501,7 +501,7 @@ namespace TEN::Entities::TR4 { if (Targetable(item, &AI)) { - item->TargetState = STATE_DEMIGOD_IDLE; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; break; } @@ -510,9 +510,9 @@ namespace TEN::Entities::TR4 if (AI.distance > pow(SECTOR(3), 2)) { if (item->ObjectNumber == ID_DEMIGOD2) - item->TargetState = STATE_DEMIGOD_FLY; + item->Animation.TargetState = STATE_DEMIGOD_FLY; else - item->TargetState = STATE_DEMIGOD_RUN; + item->Animation.TargetState = STATE_DEMIGOD_RUN; } break; @@ -522,14 +522,14 @@ namespace TEN::Entities::TR4 if (AI.distance < pow(SECTOR(2), 2)) { - item->TargetState = STATE_DEMIGOD_IDLE; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; break; } if (item->ObjectNumber == ID_DEMIGOD1) { if (AI.distance < pow(SECTOR(3), 2)) { - item->TargetState = STATE_DEMIGOD_IDLE; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; break; } } @@ -537,12 +537,12 @@ namespace TEN::Entities::TR4 { if (Targetable(item, &AI) || item->ObjectNumber == ID_DEMIGOD3 && AI.distance > pow(SECTOR(2), 2)) { - item->TargetState = STATE_DEMIGOD_IDLE; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; break; } if (AI.distance < pow(SECTOR(3), 2)) - item->TargetState = STATE_DEMIGOD_WALK; + item->Animation.TargetState = STATE_DEMIGOD_WALK; } break; @@ -553,7 +553,7 @@ namespace TEN::Entities::TR4 if (AI.ahead) joint1 = -AI.xAngle; - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + 6) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + 6) { if (AI.angle >= ANGLE(7.0f)) item->Position.yRot += ANGLE(7.0f); @@ -565,12 +565,12 @@ namespace TEN::Entities::TR4 if (Targetable(item, &AI) || creature->Flags) { - item->TargetState = STATE_DEMIGOD_ATTACK; + item->Animation.TargetState = STATE_DEMIGOD_ATTACK; creature->Flags = 0; } else { - item->TargetState = STATE_DEMIGOD_IDLE; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; creature->Flags = 0; } @@ -585,14 +585,14 @@ namespace TEN::Entities::TR4 creature->MaxTurn = ANGLE(7.0f); if (Targetable(item, &AI)) - item->TargetState = STATE_DEMIGOD_IDLE_FLY; + item->Animation.TargetState = STATE_DEMIGOD_IDLE_FLY; break; case STATE_DEMIGOD_CIRCLE_AIM: creature->MaxTurn = ANGLE(7.0f); if (!Targetable(item, &AI) && AI.distance < pow(SECTOR(5), 2)) - item->TargetState = STATE_DEMIGOD_CIRCLE_ATTACK; + item->Animation.TargetState = STATE_DEMIGOD_CIRCLE_ATTACK; break; @@ -603,7 +603,7 @@ namespace TEN::Entities::TR4 if (!Targetable(item, &AI) || AI.distance < pow(SECTOR(5), 2) || !GetRandomControl()) { - item->TargetState = STATE_DEMIGOD_IDLE; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; break; } @@ -617,7 +617,7 @@ namespace TEN::Entities::TR4 if (AI.ahead) joint1 = -AI.xAngle; - if (item->AnimNumber == Objects[(signed short)item->ObjectNumber].animIndex + 6) + if (item->Animation.AnimNumber == Objects[(signed short)item->ObjectNumber].animIndex + 6) { if (AI.angle >= ANGLE(7.0f)) item->Position.yRot += ANGLE(7.0f); @@ -629,12 +629,12 @@ namespace TEN::Entities::TR4 if (Targetable(item, &AI) || creature->Flags) { - item->TargetState = STATE_DEMIGOD_GROUND_ATTACK; + item->Animation.TargetState = STATE_DEMIGOD_GROUND_ATTACK; creature->Flags = 0; } else { - item->TargetState = STATE_DEMIGOD_IDLE; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; creature->Flags = 0; } @@ -654,19 +654,19 @@ namespace TEN::Entities::TR4 if (AI.distance >= pow(SECTOR(3), 2) || !AI.bite && - (LaraItem->ActiveState < LS_LADDER_IDLE || - LaraItem->ActiveState > LS_LADDER_DOWN || + (LaraItem->Animation.ActiveState < LS_LADDER_IDLE || + LaraItem->Animation.ActiveState > LS_LADDER_DOWN || Lara.Location)) { - item->TargetState = STATE_DEMIGOD_IDLE; + item->Animation.TargetState = STATE_DEMIGOD_IDLE; } else - item->TargetState = STATE_DEMIGOD_HAMMER_ATTACK; + item->Animation.TargetState = STATE_DEMIGOD_HAMMER_ATTACK; break; case STATE_DEMIGOD_HAMMER_ATTACK: - if (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase == 26) + if (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase == 26) { PHD_VECTOR pos = { 80, -8, -40 }; GetJointAbsPosition(item, &pos, 17); @@ -684,16 +684,16 @@ namespace TEN::Entities::TR4 Camera.bounce = -128; - if (LaraItem->ActiveState >= 56 && LaraItem->ActiveState <= 61 && !Lara.Location) + if (LaraItem->Animation.ActiveState >= 56 && LaraItem->Animation.ActiveState <= 61 && !Lara.Location) { ResetLaraFlex(LaraItem); - LaraItem->TargetState = 3; - LaraItem->ActiveState = 3; - LaraItem->AnimNumber = 34; - LaraItem->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + LaraItem->Animation.TargetState = 3; + LaraItem->Animation.ActiveState = 3; + LaraItem->Animation.AnimNumber = 34; + LaraItem->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; LaraItem->HitStatus = true; - LaraItem->Velocity = 2; - LaraItem->VerticalVelocity = 1; + LaraItem->Animation.Velocity = 2; + LaraItem->Animation.VerticalVelocity = 1; Lara.Control.HandStatus = HandStatus::Free; } } diff --git a/TR5Main/Objects/TR4/Entity/tr4_dog.cpp b/TR5Main/Objects/TR4/Entity/tr4_dog.cpp index 5c4f04d01..c9d568ca2 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_dog.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_dog.cpp @@ -42,17 +42,17 @@ namespace TEN::Entities::TR4 void InitialiseTr4Dog(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - item->ActiveState = DOG_STATE_STOP; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 8; + item->Animation.ActiveState = DOG_STATE_STOP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 8; // OCB 1 makes the dog sitting down until fired if (item->TriggerFlags) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; item->Status -= ITEM_INVISIBLE; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } void Tr4DogControl(short itemNumber) @@ -71,13 +71,13 @@ namespace TEN::Entities::TR4 if (item->HitPoints <= 0) { - if (item->AnimNumber == object->animIndex + 1) + if (item->Animation.AnimNumber == object->animIndex + 1) item->HitPoints = object->HitPoints; - else if (item->ActiveState != DOG_STATE_DEATH) + else if (item->Animation.ActiveState != DOG_STATE_DEATH) { - item->AnimNumber = object->animIndex + DogAnims[GetRandomControl() & 3]; - item->ActiveState = DOG_STATE_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = object->animIndex + DogAnims[GetRandomControl() & 3]; + item->Animation.ActiveState = DOG_STATE_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } else @@ -123,9 +123,9 @@ namespace TEN::Entities::TR4 } short random = GetRandomControl(); - int frame = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int frame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case DOG_STATE_NONE: case DOG_STATE_SLEEP: @@ -133,14 +133,14 @@ namespace TEN::Entities::TR4 joint2 = 0; if (creature->Mood != MoodType::Bored && item->AIBits != MODIFY) - item->TargetState = DOG_STATE_STOP; + item->Animation.TargetState = DOG_STATE_STOP; else { creature->Flags++; creature->MaxTurn = 0; if (creature->Flags > 300 && random < 128) - item->TargetState = DOG_STATE_STOP; + item->Animation.TargetState = DOG_STATE_STOP; } break; @@ -149,9 +149,9 @@ namespace TEN::Entities::TR4 case DOG_STATE_CROUCH: creature->MaxTurn = 0; - if (item->ActiveState == DOG_STATE_CROUCH && item->RequiredState) + if (item->Animation.ActiveState == DOG_STATE_CROUCH && item->Animation.RequiredState) { - item->TargetState = item->RequiredState; + item->Animation.TargetState = item->Animation.RequiredState; break; } @@ -162,26 +162,26 @@ namespace TEN::Entities::TR4 if (GetRandomControl()) break; - if (item->ActiveState == DOG_STATE_STOP) + if (item->Animation.ActiveState == DOG_STATE_STOP) { - item->TargetState = DOG_STATE_CROUCH; + item->Animation.TargetState = DOG_STATE_CROUCH; break; } } else { - if (item->ActiveState == DOG_STATE_CROUCH && random < 128) + if (item->Animation.ActiveState == DOG_STATE_CROUCH && random < 128) { - item->TargetState = DOG_STATE_STOP; + item->Animation.TargetState = DOG_STATE_STOP; break; } if (item->AIBits & PATROL1) { - if (item->ActiveState == DOG_STATE_STOP) - item->TargetState = DOG_STATE_WALK; + if (item->Animation.ActiveState == DOG_STATE_STOP) + item->Animation.TargetState = DOG_STATE_WALK; else - item->TargetState = DOG_STATE_STOP; + item->Animation.TargetState = DOG_STATE_STOP; break; } @@ -190,21 +190,21 @@ namespace TEN::Entities::TR4 { if (Lara.TargetEntity == item || !AI.ahead || item->HitStatus) { - item->RequiredState = DOG_STATE_RUN; - item->TargetState = DOG_STATE_CROUCH; + item->Animation.RequiredState = DOG_STATE_RUN; + item->Animation.TargetState = DOG_STATE_CROUCH; } else - item->TargetState = DOG_STATE_STOP; + item->Animation.TargetState = DOG_STATE_STOP; break; } if (creature->Mood != MoodType::Bored) { - item->RequiredState = DOG_STATE_RUN; + item->Animation.RequiredState = DOG_STATE_RUN; - if (item->ActiveState == DOG_STATE_STOP) - item->TargetState = DOG_STATE_CROUCH; + if (item->Animation.ActiveState == DOG_STATE_STOP) + item->Animation.TargetState = DOG_STATE_CROUCH; break; } @@ -216,9 +216,9 @@ namespace TEN::Entities::TR4 { if (item->AIBits & MODIFY) { - if (item->ActiveState == DOG_STATE_STOP) + if (item->Animation.ActiveState == DOG_STATE_STOP) { - item->TargetState = DOG_STATE_SLEEP; + item->Animation.TargetState = DOG_STATE_SLEEP; creature->Flags = 0; break; } @@ -228,19 +228,19 @@ namespace TEN::Entities::TR4 if (random >= 4096) { if (!(random & 0x1F)) - item->TargetState = DOG_STATE_HOWL; + item->Animation.TargetState = DOG_STATE_HOWL; break; } - if (item->ActiveState == DOG_STATE_STOP) + if (item->Animation.ActiveState == DOG_STATE_STOP) { - item->TargetState = DOG_STATE_WALK; + item->Animation.TargetState = DOG_STATE_WALK; break; } } - item->TargetState = DOG_STATE_STOP; + item->Animation.TargetState = DOG_STATE_STOP; break; case DOG_STATE_WALK: @@ -248,17 +248,17 @@ namespace TEN::Entities::TR4 if (item->AIBits & PATROL1) { - item->TargetState = DOG_STATE_WALK; + item->Animation.TargetState = DOG_STATE_WALK; break; } if (creature->Mood == MoodType::Bored && random < 256) { - item->TargetState = DOG_STATE_STOP; + item->Animation.TargetState = DOG_STATE_STOP; break; } - item->TargetState = DOG_STATE_STALK; + item->Animation.TargetState = DOG_STATE_STALK; break; case DOG_STATE_RUN: @@ -267,20 +267,20 @@ namespace TEN::Entities::TR4 if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && AI.ahead) - item->TargetState = DOG_STATE_CROUCH; + item->Animation.TargetState = DOG_STATE_CROUCH; } else if (creature->Mood != MoodType::Bored) { if (AI.bite && AI.distance < pow(SECTOR(1), 2)) - item->TargetState = DOG_STATE_JUMP_ATTACK; + item->Animation.TargetState = DOG_STATE_JUMP_ATTACK; else if (AI.distance < pow(SECTOR(1.5f), 2)) { - item->RequiredState = DOG_STATE_STALK; - item->TargetState = DOG_STATE_CROUCH; + item->Animation.RequiredState = DOG_STATE_STALK; + item->Animation.TargetState = DOG_STATE_CROUCH; } } else - item->TargetState = DOG_STATE_CROUCH; + item->Animation.TargetState = DOG_STATE_CROUCH; break; @@ -290,17 +290,17 @@ namespace TEN::Entities::TR4 if (creature->Mood != MoodType::Bored) { if (creature->Mood == MoodType::Escape) - item->TargetState = DOG_STATE_RUN; + item->Animation.TargetState = DOG_STATE_RUN; else if (AI.bite && AI.distance < pow(341, 2)) { - item->TargetState = DOG_STATE_CROUCH_ATTACK; - item->RequiredState = DOG_STATE_STALK; + item->Animation.TargetState = DOG_STATE_CROUCH_ATTACK; + item->Animation.RequiredState = DOG_STATE_STALK; } else if (AI.distance > pow(SECTOR(1.5f), 2) || item->HitStatus) - item->TargetState = DOG_STATE_RUN; + item->Animation.TargetState = DOG_STATE_RUN; } else - item->TargetState = DOG_STATE_CROUCH; + item->Animation.TargetState = DOG_STATE_CROUCH; break; @@ -316,7 +316,7 @@ namespace TEN::Entities::TR4 LaraItem->HitStatus = true; } - item->TargetState = DOG_STATE_RUN; + item->Animation.TargetState = DOG_STATE_RUN; break; case DOG_STATE_HOWL: diff --git a/TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.cpp b/TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.cpp index fda3a64d6..cfeb98ad9 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_enemy_jeep.cpp @@ -54,11 +54,11 @@ void EnemyJeepLaunchGrenade(ITEM_INFO* item) grenadeItem->ItemFlags[0] = 2; } - grenadeItem->Velocity = 32; - grenadeItem->ActiveState = grenadeItem->Position.xRot; - grenadeItem->VerticalVelocity = -32 * phd_sin(grenadeItem->Position.xRot); - grenadeItem->TargetState = grenadeItem->Position.yRot; - grenadeItem->RequiredState = 0; + grenadeItem->Animation.Velocity = 32; + grenadeItem->Animation.ActiveState = grenadeItem->Position.xRot; + grenadeItem->Animation.VerticalVelocity = -32 * phd_sin(grenadeItem->Position.xRot); + grenadeItem->Animation.TargetState = grenadeItem->Position.yRot; + grenadeItem->Animation.RequiredState = 0; grenadeItem->HitPoints = 120; AddActiveItem(grenadeItemNumber); @@ -162,7 +162,7 @@ void EnemyJeepControl(short itemNumber) PHD_VECTOR pos; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 0: case 2: @@ -178,10 +178,10 @@ void EnemyJeepControl(short itemNumber) GetJointAbsPosition(item, &pos, 11); TriggerDynamicLight(pos.x, pos.y, pos.z, 10, 64, 0, 0); - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (info.distance > SQUARE(1024) || Lara.Location >= item->ItemFlags[3]) - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -197,12 +197,12 @@ void EnemyJeepControl(short itemNumber) { if (info.angle < -256) { - item->TargetState = 3; + item->Animation.TargetState = 3; } } else { - item->TargetState = 4; + item->Animation.TargetState = 4; } break; @@ -212,7 +212,7 @@ void EnemyJeepControl(short itemNumber) item->ItemFlags[0] += 18; if (item->ItemFlags[0] > 8704) item->ItemFlags[0] = 8704; - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -228,13 +228,13 @@ void EnemyJeepControl(short itemNumber) if (height3 <= item->Floor + 512) { - if (height4 > item->Floor + 512 && item->ActiveState != 5) + if (height4 > item->Floor + 512 && item->Animation.ActiveState != 5) { item->ItemFlags[1] = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 8; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 5; - item->TargetState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 8; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 5; + item->Animation.TargetState = 1; } } else @@ -255,7 +255,7 @@ void EnemyJeepControl(short itemNumber) if (creature->LOT.RequiredBox & 8) { creature->MaxTurn = 0; - item->TargetState = 1; + item->Animation.TargetState = 1; } } @@ -266,12 +266,12 @@ void EnemyJeepControl(short itemNumber) { TestTriggers(target->Position.xPos,target->Position.yPos,target->Position.zPos,target->RoomNumber, true); - if (Lara.Location < item->ItemFlags[3] && item->ActiveState != 2 && item->TargetState != 2) + if (Lara.Location < item->ItemFlags[3] && item->Animation.ActiveState != 2 && item->Animation.TargetState != 2) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 2; - item->ActiveState = 2; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 2; + item->Animation.ActiveState = 2; if (target->Flags & 4) { @@ -385,12 +385,12 @@ void EnemyJeepControl(short itemNumber) ItemNewRoom(itemNumber, roomNumber); if (item->Position.yPos < item->Floor) - item->Airborne = true; + item->Animation.Airborne = true; else { - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; item->Position.yPos = item->Floor; - item->Airborne = false; + item->Animation.Airborne = false; } SoundEffect(SFX_TR4_JEEP_MOVE, &item->Position, (item->ItemFlags[0] * 1024) + 16777220); diff --git a/TR5Main/Objects/TR4/Entity/tr4_guide.cpp b/TR5Main/Objects/TR4/Entity/tr4_guide.cpp index 5b3cf58aa..43cc144f5 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_guide.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_guide.cpp @@ -39,10 +39,10 @@ void InitialiseGuide(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 4; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = GUIDE_STATE_IDLE; - item->ActiveState = GUIDE_STATE_IDLE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 4; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = GUIDE_STATE_IDLE; + item->Animation.ActiveState = GUIDE_STATE_IDLE; if (Objects[ID_WRAITH1].loaded) { @@ -91,10 +91,10 @@ void GuideControl(short itemNumber) 192 - ((random >> 6) & 0x1F), random & 0x3F); - if (item->AnimNumber == object->animIndex + 61) + if (item->Animation.AnimNumber == object->animIndex + 61) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 32 && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 42) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 32 && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 42) { TriggerFireFlame( (random & 0x3F) + pos.x - 32, @@ -144,8 +144,8 @@ void GuideControl(short itemNumber) if (!Objects[ID_WRAITH1].loaded) { - if (item->ActiveState < 4 || - item->ActiveState == GUIDE_STATE_TORCH_ATTACK) + if (item->Animation.ActiveState < 4 || + item->Animation.ActiveState == GUIDE_STATE_TORCH_ATTACK) { int minDistance = 0x7FFFFFFF; @@ -207,9 +207,9 @@ void GuideControl(short itemNumber) int frameNumber; short random; - TENLog("Guide state:" + std::to_string(item->ActiveState), LogLevel::Info); + TENLog("Guide state:" + std::to_string(item->Animation.ActiveState), LogLevel::Info); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case GUIDE_STATE_IDLE: creature->MaxTurn = 0; @@ -233,28 +233,28 @@ void GuideControl(short itemNumber) if (Objects[ID_WRAITH1].loaded) { if (item->ItemFlags[3] == 5) - item->TargetState = GUIDE_STATE_WALK; + item->Animation.TargetState = GUIDE_STATE_WALK; if (item->ItemFlags[3] == 5 || item->ItemFlags[3] == 6) break; } - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (Lara.Location >= item->ItemFlags[3] || item->ItemFlags[1] != 2) { if (!creature->ReachedGoal || foundEnemy) { if (item->SwapMeshFlags == 0x40000) - item->TargetState = 40; + item->Animation.TargetState = 40; else if (foundEnemy && AI.distance < pow(SECTOR(1), 2)) { if (AI.bite) - item->TargetState = GUIDE_STATE_TORCH_ATTACK; + item->Animation.TargetState = GUIDE_STATE_TORCH_ATTACK; } else if (enemy != LaraItem || AI.distance > pow(SECTOR(2), 2)) - item->TargetState = GUIDE_STATE_WALK; + item->Animation.TargetState = GUIDE_STATE_WALK; } else { @@ -272,20 +272,20 @@ void GuideControl(short itemNumber) switch (enemy->Flags) { case 0x02: - item->TargetState = 38; - item->RequiredState = 38; + item->Animation.TargetState = 38; + item->Animation.RequiredState = 38; break; case 0x20: - item->TargetState = GUIDE_STATE_PICKUP_TORCH; - item->RequiredState = GUIDE_STATE_PICKUP_TORCH; + item->Animation.TargetState = GUIDE_STATE_PICKUP_TORCH; + item->Animation.RequiredState = GUIDE_STATE_PICKUP_TORCH; break; case 0x28: if (laraAI.distance < pow(SECTOR(2), 2)) { - item->TargetState = 39; - item->RequiredState = 39; + item->Animation.TargetState = 39; + item->Animation.RequiredState = 39; } break; @@ -294,8 +294,8 @@ void GuideControl(short itemNumber) if (laraAI.distance < pow(SECTOR(2), 2)) { // Ignite torch - item->TargetState = 36; - item->RequiredState = 36; + item->Animation.TargetState = 36; + item->Animation.RequiredState = 36; } break; @@ -303,8 +303,8 @@ void GuideControl(short itemNumber) case 0x04: if (laraAI.distance < pow(SECTOR(2), 2)) { - item->TargetState = 36; - item->RequiredState = 43; + item->Animation.TargetState = 36; + item->Animation.RequiredState = 43; } break; @@ -319,12 +319,12 @@ void GuideControl(short itemNumber) else { creature->MaxTurn = 0; - item->RequiredState = 42 - (AI.ahead != 0); + item->Animation.RequiredState = 42 - (AI.ahead != 0); } } } else - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; break; @@ -343,12 +343,12 @@ void GuideControl(short itemNumber) if (Objects[ID_WRAITH1].loaded && item->ItemFlags[3] == 5) { item->ItemFlags[3] = 6; - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; } else if (item->ItemFlags[1] == 1) { - item->TargetState = GUIDE_STATE_IDLE; - item->RequiredState = GUIDE_STATE_IGNITE_TORCH; + item->Animation.TargetState = GUIDE_STATE_IDLE; + item->Animation.RequiredState = GUIDE_STATE_IGNITE_TORCH; } else if (creature->ReachedGoal) { @@ -361,7 +361,7 @@ void GuideControl(short itemNumber) break; } - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; } else { @@ -376,22 +376,22 @@ void GuideControl(short itemNumber) if (AI.distance >= pow(SECTOR(2), 2)) { if (AI.distance > pow(SECTOR(4), 2)) - item->TargetState = GUIDE_STATE_RUN; + item->Animation.TargetState = GUIDE_STATE_RUN; } else - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; } else if (Lara.Location > item->ItemFlags[3] && laraAI.distance > pow(SECTOR(2), 2)) { - item->TargetState = GUIDE_STATE_RUN; + item->Animation.TargetState = GUIDE_STATE_RUN; } } else - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; } else - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; } break; @@ -406,7 +406,7 @@ void GuideControl(short itemNumber) if (AI.distance < pow(SECTOR(2), 2) || Lara.Location < item->ItemFlags[3]) { - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; break; } @@ -421,14 +421,14 @@ void GuideControl(short itemNumber) break; } - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; } else if (foundEnemy && (AI.distance < 0x200000 || !(item->SwapMeshFlags & 0x40000) && AI.distance < pow(SECTOR(3), 2))) { - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; break; } @@ -442,7 +442,7 @@ void GuideControl(short itemNumber) GetJointAbsPosition(item, &pos1, GuideBite2.meshNum); - frameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; random = GetRandomControl(); if (frameNumber == 32) @@ -556,8 +556,8 @@ void GuideControl(short itemNumber) { if (enemy) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 15 && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 26) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 15 && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 26) { dx = abs(enemy->Position.xPos - item->Position.xPos); dy = abs(enemy->Position.yPos - item->Position.yPos); @@ -607,12 +607,12 @@ void GuideControl(short itemNumber) item->Position.yRot = ANGLE(2.0f); } - if (item->RequiredState == 43) - item->TargetState = 43; + if (item->Animation.RequiredState == 43) + item->Animation.TargetState = 43; else { - if (item->AnimNumber != object->animIndex + 57 && - item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd - 20) + if (item->Animation.AnimNumber != object->animIndex + 57 && + item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd - 20) { TestTriggers(item, true); @@ -620,7 +620,7 @@ void GuideControl(short itemNumber) creature->Enemy = NULL; item->AIBits = FOLLOW; item->ItemFlags[3]++; - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; break; } } @@ -628,7 +628,7 @@ void GuideControl(short itemNumber) break; case GUIDE_STATE_PICKUP_TORCH: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { someFlag = true; @@ -639,7 +639,7 @@ void GuideControl(short itemNumber) item->Position.yRot = enemy->Position.yRot; item->Position.zRot = enemy->Position.zRot; } - else if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 35) + else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 35) { item->SwapMeshFlags &= 0xFFFBFFFF; @@ -679,7 +679,7 @@ void GuideControl(short itemNumber) break; case 38: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { item->Position.xPos = enemy->Position.xPos; item->Position.yPos = enemy->Position.yPos; @@ -687,7 +687,7 @@ void GuideControl(short itemNumber) } else { - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 42) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 42) { TestTriggers(item, true); @@ -698,7 +698,7 @@ void GuideControl(short itemNumber) creature->Enemy = NULL; break; } - else if (item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 42) + else if (item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 42) { if (enemy->Position.yRot - item->Position.yRot <= ANGLE(2.0f)) { @@ -713,11 +713,11 @@ void GuideControl(short itemNumber) break; case 39: - if (item->FrameNumber >= g_Level.Anims[item->AnimNumber].frameBase + 20) + if (item->Animation.FrameNumber >= g_Level.Anims[item->Animation.AnimNumber].frameBase + 20) { - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 20) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 20) { - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; TestTriggers(item, true); @@ -728,9 +728,9 @@ void GuideControl(short itemNumber) break; } - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 70 && item->RoomNumber == 70) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 70 && item->RoomNumber == 70) { - item->RequiredState = GUIDE_STATE_RUN; + item->Animation.RequiredState = GUIDE_STATE_RUN; item->SwapMeshFlags |= 0x200000; SoundEffect(SFX_TR4_GUIDE_SCARE, &item->Position, 0); } @@ -778,7 +778,7 @@ void GuideControl(short itemNumber) creature->Enemy = NULL; } else if (item->TriggerFlags <= 999) - item->TargetState = GUIDE_STATE_IDLE; + item->Animation.TargetState = GUIDE_STATE_IDLE; else { KillItem(itemNumber); diff --git a/TR5Main/Objects/TR4/Entity/tr4_hammerhead.cpp b/TR5Main/Objects/TR4/Entity/tr4_hammerhead.cpp index 01497b061..da863bf48 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_hammerhead.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_hammerhead.cpp @@ -34,10 +34,10 @@ void InitialiseHammerhead(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 8; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = HAMMERHEAD_STATE_IDLE; - item->ActiveState = HAMMERHEAD_STATE_IDLE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 8; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = HAMMERHEAD_STATE_IDLE; + item->Animation.ActiveState = HAMMERHEAD_STATE_IDLE; } void HammerheadControl(short itemNumber) @@ -65,10 +65,10 @@ void HammerheadControl(short itemNumber) short angle = CreatureTurn(item, creature->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case HAMMERHEAD_STATE_IDLE: - item->TargetState = HAMMERHEAD_STATE_SWIM_SLOW; + item->Animation.TargetState = HAMMERHEAD_STATE_SWIM_SLOW; creature->Flags = 0; break; @@ -78,16 +78,16 @@ void HammerheadControl(short itemNumber) if (AI.distance <= pow(SECTOR(1), 2)) { if (AI.distance < pow(682, 2)) - item->TargetState = HAMMERHEAD_STATE_ATTACK; + item->Animation.TargetState = HAMMERHEAD_STATE_ATTACK; } else - item->TargetState = HAMMERHEAD_STATE_SWIM_FAST; + item->Animation.TargetState = HAMMERHEAD_STATE_SWIM_FAST; break; case HAMMERHEAD_STATE_SWIM_FAST: if (AI.distance < pow(SECTOR(1), 2)) - item->TargetState = HAMMERHEAD_STATE_SWIM_SLOW; + item->Animation.TargetState = HAMMERHEAD_STATE_SWIM_SLOW; break; @@ -118,7 +118,7 @@ void HammerheadControl(short itemNumber) // NOTE: in TR2 shark there was a call to CreatureKill with special kill anim // Hammerhead seems to not have it in original code but this check is still there as a leftover - if (item->ActiveState == HAMMERHEAD_STATE_KILL) + if (item->Animation.ActiveState == HAMMERHEAD_STATE_KILL) AnimateItem(item); else { @@ -130,11 +130,11 @@ void HammerheadControl(short itemNumber) { item->HitPoints = 0; - if (item->ActiveState != HAMMERHEAD_STATE_DEATH) + if (item->Animation.ActiveState != HAMMERHEAD_STATE_DEATH) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 4; - item->ActiveState = HAMMERHEAD_STATE_DEATH; - item->FrameNumber = g_Level.Anims[item->FrameNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 4; + item->Animation.ActiveState = HAMMERHEAD_STATE_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.FrameNumber].frameBase; } CreatureFloat(itemNumber); diff --git a/TR5Main/Objects/TR4/Entity/tr4_harpy.cpp b/TR5Main/Objects/TR4/Entity/tr4_harpy.cpp index 850daa08d..2a39a00ff 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_harpy.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_harpy.cpp @@ -252,10 +252,10 @@ void InitialiseHarpy(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 4; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_HARPY_STOP; - item->ActiveState = STATE_HARPY_STOP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 4; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_HARPY_STOP; + item->Animation.ActiveState = STATE_HARPY_STOP; } void HarpyControl(short itemNumber) @@ -275,7 +275,7 @@ void HarpyControl(short itemNumber) if (item->HitPoints <= 0) { - short state = item->ActiveState - 9; + short state = item->Animation.ActiveState - 9; item->HitPoints = 0; if (state) @@ -290,11 +290,11 @@ void HarpyControl(short itemNumber) } else { - item->AnimNumber = object->animIndex + 5; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 9; - item->Velocity = 0; - item->Airborne = true; + item->Animation.AnimNumber = object->animIndex + 5; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 9; + item->Animation.Velocity = 0; + item->Animation.Airborne = true; item->Position.xRot = 0; } @@ -309,14 +309,14 @@ void HarpyControl(short itemNumber) } } else - item->TargetState = STATE_HARPY_FALLING; + item->Animation.TargetState = STATE_HARPY_FALLING; if (item->Position.yPos >= item->Floor) { item->Position.yPos = item->Floor; - item->VerticalVelocity = 0; - item->TargetState = STATE_HARPY_DEATH; - item->Airborne = false; + item->Animation.VerticalVelocity = 0; + item->Animation.TargetState = STATE_HARPY_DEATH; + item->Animation.Airborne = false; } item->Position.xRot = 0; @@ -375,7 +375,7 @@ void HarpyControl(short itemNumber) int height = 0; int dy = 0; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_HARPY_STOP: creature->Flags = 0; @@ -386,7 +386,7 @@ void HarpyControl(short itemNumber) height = (item->Position.yPos + SECTOR(2)); if (creature->Enemy->Position.yPos > height && item->Floor > height) { - item->TargetState = 3; + item->Animation.TargetState = 3; break; } } @@ -397,12 +397,12 @@ void HarpyControl(short itemNumber) { if (info.distance < pow(341, 2)) { - item->TargetState = STATE_HARPY_POISON_ATTACK; + item->Animation.TargetState = STATE_HARPY_POISON_ATTACK; break; } if (dy <= SECTOR(1) && info.distance < pow(SECTOR(2), 2)) { - item->TargetState = 4; + item->Animation.TargetState = 4; break; } } @@ -413,11 +413,11 @@ void HarpyControl(short itemNumber) info.distance <= pow(SECTOR(3.5f), 2) || !(GetRandomControl() & 1)) { - item->TargetState = 2; + item->Animation.TargetState = 2; break; } - item->TargetState = STATE_HARPY_FLAME_ATTACK; + item->Animation.TargetState = STATE_HARPY_FLAME_ATTACK; item->ItemFlags[0] = 0; break; @@ -425,17 +425,17 @@ void HarpyControl(short itemNumber) creature->MaxTurn = ANGLE(7.0f); creature->Flags = 0; - if (item->RequiredState) + if (item->Animation.RequiredState) { - item->TargetState = item->RequiredState; - if (item->RequiredState == 8) + item->Animation.TargetState = item->Animation.RequiredState; + if (item->Animation.RequiredState == 8) item->ItemFlags[0] = 0; break; } if (item->HitStatus) { - item->TargetState = 7; + item->Animation.TargetState = 7; break; } if (info.ahead) @@ -447,25 +447,25 @@ void HarpyControl(short itemNumber) info.distance > pow(SECTOR(3.5f), 2) && GetRandomControl() & 1) { - item->TargetState = STATE_HARPY_FLAME_ATTACK; + item->Animation.TargetState = STATE_HARPY_FLAME_ATTACK; item->ItemFlags[0] = 0; } else - item->TargetState = 4; + item->Animation.TargetState = 4; } else - item->TargetState = STATE_HARPY_POISON_ATTACK; + item->Animation.TargetState = STATE_HARPY_POISON_ATTACK; break; } if (GetRandomControl() & 1) { - item->TargetState = 7; + item->Animation.TargetState = 7; break; } if (!info.ahead) { - item->TargetState = 4; + item->Animation.TargetState = 4; break; } if (info.distance >= pow(341, 2)) @@ -473,14 +473,14 @@ void HarpyControl(short itemNumber) if (info.ahead && info.distance >= pow(SECTOR(2), 2) && info.distance > pow(SECTOR(3.5f), 2) && GetRandomControl() & 1) { - item->TargetState = STATE_HARPY_FLAME_ATTACK; + item->Animation.TargetState = STATE_HARPY_FLAME_ATTACK; item->ItemFlags[0] = 0; } else - item->TargetState = 4; + item->Animation.TargetState = 4; } else - item->TargetState = STATE_HARPY_POISON_ATTACK; + item->Animation.TargetState = STATE_HARPY_POISON_ATTACK; break; @@ -488,7 +488,7 @@ void HarpyControl(short itemNumber) if (!creature->Enemy || creature->Enemy->Position.yPos < (item->Position.yPos + SECTOR(2))) { - item->TargetState = STATE_HARPY_STOP; + item->Animation.TargetState = STATE_HARPY_STOP; } break; @@ -497,15 +497,15 @@ void HarpyControl(short itemNumber) creature->MaxTurn = ANGLE(2.0f); if (info.ahead && info.distance < pow(SECTOR(2), 2)) - item->TargetState = STATE_HARPY_ATTACK; + item->Animation.TargetState = STATE_HARPY_ATTACK; else - item->TargetState = 13; + item->Animation.TargetState = 13; break; case STATE_HARPY_ATTACK: creature->MaxTurn = ANGLE(2.0f); - item->TargetState = 2; + item->Animation.TargetState = 2; if (item->TouchBits & 0x14 || creature->Enemy && creature->Enemy != LaraItem && @@ -571,16 +571,16 @@ void HarpyControl(short itemNumber) case 12: if (info.ahead && info.distance > pow(SECTOR(3.5f), 2)) { - item->TargetState = 2; - item->RequiredState = STATE_HARPY_FLAME_ATTACK; + item->Animation.TargetState = 2; + item->Animation.RequiredState = STATE_HARPY_FLAME_ATTACK; } else if (GetRandomControl() & 1) - item->TargetState = STATE_HARPY_STOP; + item->Animation.TargetState = STATE_HARPY_STOP; break; case 13: - item->TargetState = 2; + item->Animation.TargetState = 2; break; default: diff --git a/TR5Main/Objects/TR4/Entity/tr4_horseman.cpp b/TR5Main/Objects/TR4/Entity/tr4_horseman.cpp index 0c2db5c50..48f9b6e83 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_horseman.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_horseman.cpp @@ -116,10 +116,10 @@ namespace TEN::Entities::TR4 auto* item = &g_Level.Items[itemNumber]; auto* object = &Objects[ID_HORSE]; - item->AnimNumber = object->animIndex + 2; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = HORSEMAN_STATE_HORSE_RUN; - item->ActiveState = HORSEMAN_STATE_HORSE_RUN; + item->Animation.AnimNumber = object->animIndex + 2; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = HORSEMAN_STATE_HORSE_RUN; + item->Animation.ActiveState = HORSEMAN_STATE_HORSE_RUN; } void InitialiseHorseman(short itemNumber) @@ -129,10 +129,10 @@ namespace TEN::Entities::TR4 ClearItem(itemNumber); - item->AnimNumber = object->animIndex + 8; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 9; - item->ActiveState = 9; + item->Animation.AnimNumber = object->animIndex + 8; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 9; + item->Animation.ActiveState = 9; item->ItemFlags[0] = NO_ITEM; // No horse yet } @@ -195,11 +195,11 @@ namespace TEN::Entities::TR4 item->HitPoints = 0; if (item->ItemFlags[1] == 0) { - if (item->ActiveState != 16) + if (item->Animation.ActiveState != 16) { - item->AnimNumber = Objects[ID_HORSEMAN].animIndex + 21; - item->ActiveState = 16; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_HORSEMAN].animIndex + 21; + item->Animation.ActiveState = 16; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; if (item->ItemFlags[0]) { @@ -213,12 +213,12 @@ namespace TEN::Entities::TR4 item->HitPoints = 100; item->AIBits = 0; item->ItemFlags[1] = 0; - item->AnimNumber = Objects[ID_HORSEMAN].animIndex + 3; - item->ActiveState = 8; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_HORSEMAN].animIndex + 3; + item->Animation.ActiveState = 8; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; creature->Enemy = NULL; - horseItem->TargetState = HORSEMAN_STATE_HORSE_RUN; + horseItem->Animation.TargetState = HORSEMAN_STATE_HORSE_RUN; } } else @@ -253,7 +253,7 @@ namespace TEN::Entities::TR4 laraAI.angle > -ANGLE(67.5f) && laraAI.distance < pow(SECTOR(2), 2)) { - if (item->ActiveState != 15) + if (item->Animation.ActiveState != 15) { if (laraAI.angle <= 0) { @@ -262,7 +262,7 @@ namespace TEN::Entities::TR4 if (!item->ItemFlags[1]) { if (item->MeshBits & 0x400) - item->RequiredState = 15; + item->Animation.RequiredState = 15; } } else @@ -291,8 +291,8 @@ namespace TEN::Entities::TR4 } else if (!(GetRandomControl() & 7)) { - if (item->ActiveState == 15) - item->TargetState = 9; + if (item->Animation.ActiveState == 15) + item->Animation.TargetState = 9; ExplodeItemNode(item, 10, 1, -24); } @@ -308,15 +308,15 @@ namespace TEN::Entities::TR4 angle = CreatureTurn(item, creature->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case HORSEMAN_STATE_HORSE_RUN: creature->MaxTurn = ANGLE(3.0f); - horseItem->TargetState = HORSEMAN_STATE_HORSE_WALK; - if (item->RequiredState) + horseItem->Animation.TargetState = HORSEMAN_STATE_HORSE_WALK; + if (item->Animation.RequiredState) { - item->TargetState = 17; - horseItem->TargetState = HORSEMAN_STATE_MOUNT_HORSE; + item->Animation.TargetState = 17; + horseItem->Animation.TargetState = HORSEMAN_STATE_MOUNT_HORSE; } else if (creature->Flags || creature->ReachedGoal || @@ -331,8 +331,8 @@ namespace TEN::Entities::TR4 if (laraAI.angle > -8192 && laraAI.angle < 0x2000) { - item->TargetState = HORSEMAN_STATE_HORSE_IDLE; - horseItem->TargetState = HORSEMAN_STATE_HORSE_RUN; + item->Animation.TargetState = HORSEMAN_STATE_HORSE_IDLE; + horseItem->Animation.TargetState = HORSEMAN_STATE_HORSE_RUN; } } else @@ -357,13 +357,13 @@ namespace TEN::Entities::TR4 AI.angle < ANGLE(20.0f))) { creature->MaxTurn = 0; - item->TargetState = 6; + item->Animation.TargetState = 6; } } else { creature->MaxTurn = 0; - item->TargetState = 7; + item->Animation.TargetState = 7; } } } @@ -385,13 +385,13 @@ namespace TEN::Entities::TR4 AI.angle < ANGLE(20.0f))) { creature->MaxTurn = 0; - item->TargetState = 6; + item->Animation.TargetState = 6; } } else { creature->MaxTurn = 0; - item->TargetState = 7; + item->Animation.TargetState = 7; } } } @@ -404,8 +404,8 @@ namespace TEN::Entities::TR4 if (laraAI.distance > pow(SECTOR(4), 2) || creature->ReachedGoal || creature->Enemy == LaraItem) { - item->TargetState = HORSEMAN_STATE_HORSE_RUN; - horseItem->TargetState = HORSEMAN_STATE_HORSE_WALK; + item->Animation.TargetState = HORSEMAN_STATE_HORSE_RUN; + horseItem->Animation.TargetState = HORSEMAN_STATE_HORSE_WALK; creature->ReachedGoal = false; creature->Enemy = LaraItem; creature->Flags = 0; @@ -415,7 +415,7 @@ namespace TEN::Entities::TR4 case 3: creature->MaxTurn = 0; - horseItem->TargetState = HORSEMAN_STATE_HORSE_RUN; + horseItem->Animation.TargetState = HORSEMAN_STATE_HORSE_RUN; if (creature->Flags) { @@ -425,10 +425,10 @@ namespace TEN::Entities::TR4 else creature->Flags = 0; - if (item->RequiredState) + if (item->Animation.RequiredState) { - item->TargetState = HORSEMAN_STATE_HORSE_RUN; - horseItem->TargetState = HORSEMAN_STATE_HORSE_WALK; + item->Animation.TargetState = HORSEMAN_STATE_HORSE_RUN; + horseItem->Animation.TargetState = HORSEMAN_STATE_HORSE_WALK; horseItem->Flags = 0; } else if (creature->ReachedGoal || @@ -438,17 +438,17 @@ namespace TEN::Entities::TR4 AI.angle < ANGLE(10.0f) && AI.angle > -ANGLE(10.0f)) { - item->TargetState = HORSEMAN_STATE_HORSE_REARING; + item->Animation.TargetState = HORSEMAN_STATE_HORSE_REARING; if (creature->ReachedGoal) - item->RequiredState = 17; + item->Animation.RequiredState = 17; horseItem->Flags = 0; } else { - item->TargetState = HORSEMAN_STATE_HORSE_RUN; - horseItem->TargetState = HORSEMAN_STATE_HORSE_WALK; + item->Animation.TargetState = HORSEMAN_STATE_HORSE_RUN; + horseItem->Animation.TargetState = HORSEMAN_STATE_HORSE_WALK; horseItem->Flags = 0; } @@ -457,11 +457,11 @@ namespace TEN::Entities::TR4 case 4: creature->MaxTurn = 0; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { - horseItem->AnimNumber = Objects[ID_HORSE].animIndex + 1; - horseItem->ActiveState = HORSEMAN_STATE_HORSE_REARING; - horseItem->FrameNumber = g_Level.Anims[horseItem->AnimNumber].frameBase; + horseItem->Animation.AnimNumber = Objects[ID_HORSE].animIndex + 1; + horseItem->Animation.ActiveState = HORSEMAN_STATE_HORSE_REARING; + horseItem->Animation.FrameNumber = g_Level.Anims[horseItem->Animation.AnimNumber].frameBase; } if (!horseItem->Flags) @@ -516,7 +516,7 @@ namespace TEN::Entities::TR4 } } if (item->HitStatus) - item->TargetState = 9; + item->Animation.TargetState = 9; break; @@ -548,15 +548,15 @@ namespace TEN::Entities::TR4 if (!item->AIBits || item->ItemFlags[3]) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (AI.bite && AI.distance < pow(682,2)) - item->TargetState = 14; + item->Animation.TargetState = 14; else if (AI.distance < pow(SECTOR(6), 2) && AI.distance > pow(682, 2)) - item->TargetState = 10; + item->Animation.TargetState = 10; } else - item->TargetState = 10; + item->Animation.TargetState = 10; break; @@ -579,9 +579,9 @@ namespace TEN::Entities::TR4 creature->ReachedGoal = false; creature->Enemy = NULL; - item->AnimNumber = Objects[ID_HORSEMAN].animIndex + 14; - item->ActiveState = HORSEMAN_STATE_MOUNT_HORSE; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_HORSEMAN].animIndex + 14; + item->Animation.ActiveState = HORSEMAN_STATE_MOUNT_HORSE; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; creature->MaxTurn = 0; break; @@ -589,25 +589,25 @@ namespace TEN::Entities::TR4 if (item->HitStatus) { - item->TargetState = 9; + item->Animation.TargetState = 9; } else if (AI.bite && AI.distance < pow(682, 2)) { if (GetRandomControl() & 1) - item->TargetState = 12; + item->Animation.TargetState = 12; else if (GetRandomControl() & 1) - item->TargetState = 13; + item->Animation.TargetState = 13; else - item->TargetState = 9; + item->Animation.TargetState = 9; } else if (AI.distance < pow(SECTOR(5), 2) && AI.distance > pow(1365, 2)) - item->TargetState = 11; + item->Animation.TargetState = 11; break; case 11: if (AI.distance < pow(1365, 2)) - item->TargetState = 10; + item->Animation.TargetState = 10; break; @@ -647,7 +647,7 @@ namespace TEN::Entities::TR4 case 15: if (Lara.TargetEntity != item || AI.bite && AI.distance < pow(682, 2)) - item->TargetState = 9; + item->Animation.TargetState = 9; break; @@ -727,11 +727,11 @@ namespace TEN::Entities::TR4 } } - if (item->AnimNumber == Objects[ID_HORSEMAN].animIndex + 29 && - item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.AnimNumber == Objects[ID_HORSEMAN].animIndex + 29 && + item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { - horseItem->AnimNumber = Objects[ID_HORSE].animIndex + 10; - horseItem->FrameNumber = g_Level.Anims[horseItem->AnimNumber].frameBase; + horseItem->Animation.AnimNumber = Objects[ID_HORSE].animIndex + 10; + horseItem->Animation.FrameNumber = g_Level.Anims[horseItem->Animation.AnimNumber].frameBase; } if (laraAI.distance > pow(SECTOR(4), 2) || creature->ReachedGoal) @@ -742,8 +742,8 @@ namespace TEN::Entities::TR4 } else if (!AI.ahead) { - item->TargetState = HORSEMAN_STATE_HORSE_IDLE; - horseItem->TargetState = HORSEMAN_STATE_HORSE_RUN; + item->Animation.TargetState = HORSEMAN_STATE_HORSE_IDLE; + horseItem->Animation.TargetState = HORSEMAN_STATE_HORSE_RUN; } break; diff --git a/TR5Main/Objects/TR4/Entity/tr4_jeanyves.cpp b/TR5Main/Objects/TR4/Entity/tr4_jeanyves.cpp index 0259552aa..b7a5e3eed 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_jeanyves.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_jeanyves.cpp @@ -12,10 +12,10 @@ void InitialiseJeanYves(short itemNumber) auto* item = &g_Level.Items[itemNumber]; auto* objectInfo = &Objects[item->ObjectNumber]; - item->TargetState = 1; - item->ActiveState = 1; - item->AnimNumber = objectInfo->animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.TargetState = 1; + item->Animation.ActiveState = 1; + item->Animation.AnimNumber = objectInfo->animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } void JeanYvesControl(short itemNumber) @@ -31,7 +31,7 @@ void JeanYvesControl(short itemNumber) else state = 3 * (GetRandomControl() & 1); - item->TargetState = (((byte)(item->ActiveState) - 1) & 0xC) + state + 1; + item->Animation.TargetState = (((byte)(item->Animation.ActiveState) - 1) & 0xC) + state + 1; AnimateItem(item); } else @@ -43,9 +43,9 @@ void JeanYvesControl(short itemNumber) int animNumber = Objects[item->ObjectNumber].animIndex + state; state++; - item->TargetState = item->ActiveState = state; - item->AnimNumber = animNumber; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.TargetState = item->Animation.ActiveState = state; + item->Animation.AnimNumber = animNumber; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; item->TriggerFlags = Lara.HighestLocation; AnimateItem(item); diff --git a/TR5Main/Objects/TR4/Entity/tr4_knighttemplar.cpp b/TR5Main/Objects/TR4/Entity/tr4_knighttemplar.cpp index 73b3954f1..8907b2e54 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_knighttemplar.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_knighttemplar.cpp @@ -20,10 +20,10 @@ void InitialiseKnightTemplar(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[ID_KNIGHT_TEMPLAR].animIndex + 2; - item->TargetState = 1; - item->ActiveState = 1; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_KNIGHT_TEMPLAR].animIndex + 2; + item->Animation.TargetState = 1; + item->Animation.ActiveState = 1; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; item->MeshBits &= 0xF7FF; } @@ -36,10 +36,10 @@ void KnightTemplarControl(short itemNumber) auto* creature = GetCreatureInfo(item); auto* object = &Objects[item->ObjectNumber]; - if (item->AnimNumber == object->animIndex || - item->AnimNumber - object->animIndex == 1 || - item->AnimNumber - object->animIndex == 11 || - item->AnimNumber - object->animIndex == 12) + if (item->Animation.AnimNumber == object->animIndex || + item->Animation.AnimNumber - object->animIndex == 1 || + item->Animation.AnimNumber - object->animIndex == 11 || + item->Animation.AnimNumber - object->animIndex == 12) { if (GetRandomControl() & 1) { @@ -87,24 +87,24 @@ void KnightTemplarControl(short itemNumber) int frameBase = 0; int frameNumber = 0; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: - item->TargetState = 2; + item->Animation.TargetState = 2; creature->MaxTurn = ANGLE(2.0f); creature->Flags = 0; if (AI.distance > pow(682, 2)) { if (Lara.TargetEntity == item) - item->TargetState = 6; + item->Animation.TargetState = 6; } else if (GetRandomControl() & 1) - item->TargetState = 4; + item->Animation.TargetState = 4; else if (GetRandomControl() & 1) - item->TargetState = 3; + item->Animation.TargetState = 3; else - item->TargetState = 5; + item->Animation.TargetState = 5; break; @@ -112,7 +112,7 @@ void KnightTemplarControl(short itemNumber) creature->MaxTurn = ANGLE(7.0f); if (Lara.TargetEntity == item || AI.distance <= pow(682, 2)) - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -131,8 +131,8 @@ void KnightTemplarControl(short itemNumber) else item->Position.yRot += AI.angle; - frameNumber = item->FrameNumber; - frameBase = g_Level.Anims[item->AnimNumber].frameBase; + frameNumber = item->Animation.FrameNumber; + frameBase = g_Level.Anims[item->Animation.AnimNumber].frameBase; if (frameNumber > frameBase + 42 && frameNumber < frameBase + 51) { @@ -200,14 +200,14 @@ void KnightTemplarControl(short itemNumber) if (item->HitStatus) { if (GetRandomControl() & 1) - item->TargetState = 7; + item->Animation.TargetState = 7; else - item->TargetState = 8; + item->Animation.TargetState = 8; } else if (AI.distance <= pow(682, 2) || Lara.TargetEntity != item) - item->TargetState = 1; + item->Animation.TargetState = 1; else - item->TargetState = 6; + item->Animation.TargetState = 6; break; diff --git a/TR5Main/Objects/TR4/Entity/tr4_mummy.cpp b/TR5Main/Objects/TR4/Entity/tr4_mummy.cpp index 92948ab1d..c5e89d3a7 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_mummy.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_mummy.cpp @@ -61,18 +61,18 @@ void InitialiseMummy(short itemNumber) if (item->TriggerFlags == 2) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_LYING_DOWN; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = MUMMY_STATE_LYING_DOWN; - item->ActiveState = MUMMY_STATE_LYING_DOWN; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_LYING_DOWN; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = MUMMY_STATE_LYING_DOWN; + item->Animation.ActiveState = MUMMY_STATE_LYING_DOWN; item->Status = ITEM_INVISIBLE; } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_ARMS_CROSSED; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = MUMMY_STATE_ARMS_CROSSED; - item->ActiveState = MUMMY_STATE_ARMS_CROSSED; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_ARMS_CROSSED; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = MUMMY_STATE_ARMS_CROSSED; + item->Animation.ActiveState = MUMMY_STATE_ARMS_CROSSED; } } @@ -102,9 +102,9 @@ void MummyControl(short itemNumber) { if (AI.distance < pow(SECTOR(3), 2)) { - if (item->ActiveState != MUMMY_ANIM_STAND_TO_WALK_ARMS_UP && - item->ActiveState != MUMMY_ANIM_WALK_ARMS_UP_TO_WALK_LEFT && - item->ActiveState != MUMMY_ANIM_STAND_TO_WALK) + if (item->Animation.ActiveState != MUMMY_ANIM_STAND_TO_WALK_ARMS_UP && + item->Animation.ActiveState != MUMMY_ANIM_WALK_ARMS_UP_TO_WALK_LEFT && + item->Animation.ActiveState != MUMMY_ANIM_STAND_TO_WALK) { if (GetRandomControl() & 3 || Lara.Control.Weapon.GunType != LaraWeaponType::Shotgun && @@ -116,27 +116,27 @@ void MummyControl(short itemNumber) Lara.Control.Weapon.GunType == LaraWeaponType::HK || Lara.Control.Weapon.GunType == LaraWeaponType::Revolver) { - if (item->ActiveState == MUMMY_STATE_WALK_ARMS_UP || - item->ActiveState == MUMMY_STATE_WALK_HIT) + if (item->Animation.ActiveState == MUMMY_STATE_WALK_ARMS_UP || + item->Animation.ActiveState == MUMMY_STATE_WALK_HIT) { - item->ActiveState = MUMMY_STATE_ARMS_UP_PUSHED_BACK; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_ARMS_UP_PUSHED_BACK; + item->Animation.ActiveState = MUMMY_STATE_ARMS_UP_PUSHED_BACK; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_ARMS_UP_PUSHED_BACK; } else { - item->ActiveState = MUMMY_STATE_PUSHED_BACK; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_PUSHED_BACK; + item->Animation.ActiveState = MUMMY_STATE_PUSHED_BACK; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_PUSHED_BACK; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; item->Position.yRot += AI.angle; } } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_COLLAPSE_START; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = MUMMY_STATE_COLLAPSE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_COLLAPSE_START; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = MUMMY_STATE_COLLAPSE; item->Position.yRot += AI.angle; creature->MaxTurn = 0; } @@ -157,7 +157,7 @@ void MummyControl(short itemNumber) joint2 = AI.xAngle; } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case MUMMY_STATE_IDLE: creature->Flags = 0; @@ -167,10 +167,10 @@ void MummyControl(short itemNumber) AI.distance >= pow(SECTOR(7), 2)) { if (AI.distance - pow(SECTOR(0.5f), 2) <= 0) - item->TargetState = MUMMY_STATE_HIT; + item->Animation.TargetState = MUMMY_STATE_HIT; else { - item->TargetState = MUMMY_STATE_IDLE; + item->Animation.TargetState = MUMMY_STATE_IDLE; joint0 = 0; joint1 = 0; joint2 = 0; @@ -180,7 +180,7 @@ void MummyControl(short itemNumber) } } else - item->TargetState = MUMMY_STATE_WALK; + item->Animation.TargetState = MUMMY_STATE_WALK; break; @@ -189,7 +189,7 @@ void MummyControl(short itemNumber) { creature->MaxTurn = 0; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) item->TriggerFlags = 0; } else @@ -199,10 +199,10 @@ void MummyControl(short itemNumber) if (AI.distance >= pow(SECTOR(3), 2)) { if (AI.distance > pow(SECTOR(7), 2)) - item->TargetState = MUMMY_STATE_IDLE; + item->Animation.TargetState = MUMMY_STATE_IDLE; } else - item->TargetState = MUMMY_STATE_WALK_ARMS_UP; + item->Animation.TargetState = MUMMY_STATE_WALK_ARMS_UP; } break; @@ -213,20 +213,20 @@ void MummyControl(short itemNumber) if (AI.distance < pow(SECTOR(0.5f), 2)) { - item->TargetState = MUMMY_STATE_IDLE; + item->Animation.TargetState = MUMMY_STATE_IDLE; break; } if (AI.distance > pow(SECTOR(3), 2) && AI.distance < pow(SECTOR(7), 2)) { - item->TargetState = MUMMY_STATE_WALK; + item->Animation.TargetState = MUMMY_STATE_WALK; break; } if (AI.distance <= pow(682, 2)) - item->TargetState = MUMMY_STATE_WALK_HIT; + item->Animation.TargetState = MUMMY_STATE_WALK_HIT; else if (AI.distance > pow(SECTOR(7), 2)) - item->TargetState = MUMMY_STATE_IDLE; + item->Animation.TargetState = MUMMY_STATE_IDLE; break; @@ -234,7 +234,7 @@ void MummyControl(short itemNumber) creature->MaxTurn = 0; if (AI.distance < pow(SECTOR(1), 2) || item->TriggerFlags > -1) - item->TargetState = MUMMY_STATE_WALK; + item->Animation.TargetState = MUMMY_STATE_WALK; break; @@ -247,7 +247,7 @@ void MummyControl(short itemNumber) if (AI.distance < pow(SECTOR(1), 2) || !(GetRandomControl() & 0x7F)) { - item->TargetState = MUMMY_STATE_GET_UP; + item->Animation.TargetState = MUMMY_STATE_GET_UP; item->HitPoints = Objects[item->ObjectNumber].HitPoints; } @@ -271,13 +271,13 @@ void MummyControl(short itemNumber) { if (item->TouchBits & 0x4800) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameEnd) { LaraItem->HitPoints -= 100; LaraItem->HitStatus = true; - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_HIT_LEFT) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + MUMMY_ANIM_HIT_LEFT) { CreatureEffect2( item, diff --git a/TR5Main/Objects/TR4/Entity/tr4_mutant.cpp b/TR5Main/Objects/TR4/Entity/tr4_mutant.cpp index 81d291a49..291b50d82 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_mutant.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_mutant.cpp @@ -121,7 +121,7 @@ namespace TEN::Entities::TR4 static bool ShootFrame(ITEM_INFO* item) { - int frameNumber = (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase); + int frameNumber = (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase); if (frameNumber == 45 || /*frameNumber == 50 || frameNumber == 55 ||*/ @@ -232,10 +232,10 @@ namespace TEN::Entities::TR4 InitialiseCreature(itemNumber); auto* item = &g_Level.Items[itemNumber]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + MUTANT_ANIM_APPEAR; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = MUTANT_STATE_APPEAR; - item->TargetState = MUTANT_STATE_APPEAR; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + MUTANT_ANIM_APPEAR; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = MUTANT_STATE_APPEAR; + item->Animation.TargetState = MUTANT_STATE_APPEAR; } void CrocgodControl(short itemNumber) @@ -268,24 +268,24 @@ namespace TEN::Entities::TR4 creature->MaxTurn = 0; angle = CreatureTurn(item, 0); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case MUTANT_STATE_IDLE: if (AI.ahead) { int random = GetRandomControl() & 31; if ((random > 0 && random < 10) && AI.distance <= MUTANT_SHOOT_RANGE) - item->TargetState = MUTANT_STATE_SHOOT; + item->Animation.TargetState = MUTANT_STATE_SHOOT; else if ((random > 10 && random < 20) && AI.distance <= MUTANT_LOCUST_1_RANGE) - item->TargetState = MUTANT_STATE_LOCUST_1; + item->Animation.TargetState = MUTANT_STATE_LOCUST_1; else if ((random > 20 && random < 30) && AI.distance <= MUTANT_LOCUST_2_RANGE) - item->TargetState = MUTANT_STATE_LOCUST_2; + item->Animation.TargetState = MUTANT_STATE_LOCUST_2; } break; case MUTANT_STATE_SHOOT: - frameNumber = (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase); + frameNumber = (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase); if (frameNumber >= 94 && frameNumber <= 96) { PHD_3DPOS src; @@ -308,7 +308,7 @@ namespace TEN::Entities::TR4 break; case MUTANT_STATE_LOCUST_1: - frameNumber = (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase); + frameNumber = (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase); if (frameNumber >= 60 && frameNumber <= 120) TEN::Entities::TR4::SpawnLocust(item); @@ -325,7 +325,7 @@ namespace TEN::Entities::TR4 break; } - if (item->ActiveState != MUTANT_STATE_LOCUST_1) + if (item->Animation.ActiveState != MUTANT_STATE_LOCUST_1) mutantJoint = OBJECT_BONES(headY, AI.xAngle, true); else mutantJoint = OBJECT_BONES(0); diff --git a/TR5Main/Objects/TR4/Entity/tr4_sas.cpp b/TR5Main/Objects/TR4/Entity/tr4_sas.cpp index 28e21c450..cd053db20 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_sas.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_sas.cpp @@ -93,10 +93,10 @@ namespace TEN::Entities::TR4 ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + SAS_ANIM_STAND; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = SAS_STATE_IDLE; - item->ActiveState = SAS_STATE_IDLE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + SAS_ANIM_STAND; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = SAS_STATE_IDLE; + item->Animation.ActiveState = SAS_STATE_IDLE; } void SasControl(short itemNumber) @@ -164,14 +164,14 @@ namespace TEN::Entities::TR4 int angle1 = 0; int angle2 = 0; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case SAS_STATE_IDLE: creature->MaxTurn = 0; creature->Flags = 0; joint2 = angle; - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + SAS_ANIM_WALK_TO_STAND) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + SAS_ANIM_WALK_TO_STAND) { if (abs(AI.angle) >= ANGLE(10.0f)) { @@ -202,13 +202,13 @@ namespace TEN::Entities::TR4 if (!GetRandomControl()) { - if (item->ActiveState == SAS_STATE_IDLE) + if (item->Animation.ActiveState == SAS_STATE_IDLE) { - item->TargetState = SAS_STATE_WAIT; + item->Animation.TargetState = SAS_STATE_WAIT; break; } - item->TargetState = SAS_STATE_IDLE; + item->Animation.TargetState = SAS_STATE_IDLE; } } else if (!(item->AIBits & PATROL1) || @@ -221,23 +221,23 @@ namespace TEN::Entities::TR4 AI.zoneNumber != AI.enemyZone) { if (GetRandomControl() & 1) - item->TargetState = SAS_STATE_SIGHT_AIM; + item->Animation.TargetState = SAS_STATE_SIGHT_AIM; else if (GetRandomControl() & 1) - item->TargetState = SAS_STATE_HOLD_AIM; + item->Animation.TargetState = SAS_STATE_HOLD_AIM; else - item->TargetState = SAS_STATE_KNEEL_AIM; + item->Animation.TargetState = SAS_STATE_KNEEL_AIM; } else if (!(item->AIBits & MODIFY)) - item->TargetState = SAS_STATE_WALK; + item->Animation.TargetState = SAS_STATE_WALK; } else { if (item->AIBits & MODIFY) - item->TargetState = SAS_STATE_IDLE; + item->Animation.TargetState = SAS_STATE_IDLE; else { if (creature->Mood == MoodType::Escape) - item->TargetState = SAS_STATE_RUN; + item->Animation.TargetState = SAS_STATE_RUN; else { if ((creature->Alerted || @@ -249,20 +249,20 @@ namespace TEN::Entities::TR4 if (creature->Mood == MoodType::Bored || AI.distance <= pow(SECTOR(2), 2)) { - item->TargetState = SAS_STATE_WALK; + item->Animation.TargetState = SAS_STATE_WALK; break; } - item->TargetState = SAS_STATE_RUN; + item->Animation.TargetState = SAS_STATE_RUN; } else - item->TargetState = SAS_STATE_IDLE; + item->Animation.TargetState = SAS_STATE_IDLE; } } } } else { - item->TargetState = SAS_STATE_WALK; + item->Animation.TargetState = SAS_STATE_WALK; joint2 = 0; } @@ -278,7 +278,7 @@ namespace TEN::Entities::TR4 joint2 = AIGuard(creature); if (!GetRandomControl()) - item->TargetState = SAS_STATE_IDLE; + item->Animation.TargetState = SAS_STATE_IDLE; } else if (Targetable(item, &AI) || creature->Mood != MoodType::Bored || @@ -286,7 +286,7 @@ namespace TEN::Entities::TR4 item->AIBits & MODIFY || Lara.Vehicle != NO_ITEM) { - item->TargetState = SAS_STATE_IDLE; + item->Animation.TargetState = SAS_STATE_IDLE; } break; @@ -297,13 +297,13 @@ namespace TEN::Entities::TR4 joint2 = angle; if (item->AIBits & PATROL1) - item->TargetState = SAS_STATE_WALK; + item->Animation.TargetState = SAS_STATE_WALK; else if (Lara.Vehicle == NO_ITEM || !(item->AIBits & MODIFY) && item->AIBits) { if (creature->Mood == MoodType::Escape) - item->TargetState = SAS_STATE_RUN; + item->Animation.TargetState = SAS_STATE_RUN; else { if (item->AIBits & GUARD || @@ -311,7 +311,7 @@ namespace TEN::Entities::TR4 (creature->ReachedGoal || distance > pow(SECTOR(2), 2))) { - item->TargetState = SAS_STATE_IDLE; + item->Animation.TargetState = SAS_STATE_IDLE; break; } if (Targetable(item, &AI)) @@ -319,26 +319,26 @@ namespace TEN::Entities::TR4 if (AI.distance < pow(SECTOR(3), 2) || AI.enemyZone != AI.zoneNumber) { - item->TargetState = SAS_STATE_IDLE; + item->Animation.TargetState = SAS_STATE_IDLE; break; } - item->TargetState = SAS_STATE_WALK_AIM; + item->Animation.TargetState = SAS_STATE_WALK_AIM; } else if (creature->Mood != MoodType::Bored) { if (AI.distance > pow(SECTOR(2), 2)) - item->TargetState = SAS_STATE_RUN; + item->Animation.TargetState = SAS_STATE_RUN; } else if (AI.ahead) { - item->TargetState = SAS_STATE_IDLE; + item->Animation.TargetState = SAS_STATE_IDLE; break; } } } else - item->TargetState = SAS_STATE_IDLE; + item->Animation.TargetState = SAS_STATE_IDLE; break; @@ -353,7 +353,7 @@ namespace TEN::Entities::TR4 { if (item->AIBits & MODIFY || !item->AIBits) { - item->TargetState = SAS_STATE_WAIT; + item->Animation.TargetState = SAS_STATE_WAIT; break; } } @@ -363,14 +363,14 @@ namespace TEN::Entities::TR4 (creature->ReachedGoal || distance > pow(SECTOR(2), 2))) { - item->TargetState = SAS_STATE_WALK; + item->Animation.TargetState = SAS_STATE_WALK; break; } if (creature->Mood != MoodType::Escape) { if (Targetable(item, &AI)) - item->TargetState = SAS_STATE_WALK; + item->Animation.TargetState = SAS_STATE_WALK; else { if (creature->Mood != MoodType::Bored || @@ -378,7 +378,7 @@ namespace TEN::Entities::TR4 item->AIBits & FOLLOW && AI.distance < pow(SECTOR(2), 2)) { - item->TargetState = SAS_STATE_WALK; + item->Animation.TargetState = SAS_STATE_WALK; } } } @@ -397,17 +397,17 @@ namespace TEN::Entities::TR4 if (Targetable(item, &AI)) { - if (item->ActiveState == SAS_STATE_SIGHT_AIM) - item->TargetState = SAS_STATE_SIGHT_SHOOT; - else if (item->ActiveState == SAS_STATE_KNEEL_AIM) - item->TargetState = SAS_STATE_KNEEL_SHOOT; + if (item->Animation.ActiveState == SAS_STATE_SIGHT_AIM) + item->Animation.TargetState = SAS_STATE_SIGHT_SHOOT; + else if (item->Animation.ActiveState == SAS_STATE_KNEEL_AIM) + item->Animation.TargetState = SAS_STATE_KNEEL_SHOOT; else if (GetRandomControl() & 1) - item->TargetState = SAS_STATE_HOLD_SHOOT; + item->Animation.TargetState = SAS_STATE_HOLD_SHOOT; else - item->TargetState = SAS_STATE_HOLD_PREPARE_GRENADE; + item->Animation.TargetState = SAS_STATE_HOLD_PREPARE_GRENADE; } else - item->TargetState = SAS_STATE_IDLE; + item->Animation.TargetState = SAS_STATE_IDLE; } break; @@ -421,9 +421,9 @@ namespace TEN::Entities::TR4 joint1 = AI.xAngle; if (Targetable(item, &AI)) - item->TargetState = SAS_STATE_WALK_SHOOT; + item->Animation.TargetState = SAS_STATE_WALK_SHOOT; else - item->TargetState = SAS_STATE_WALK; + item->Animation.TargetState = SAS_STATE_WALK; } break; @@ -457,9 +457,9 @@ namespace TEN::Entities::TR4 angle2 = 0; } - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 20) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 20) { - if (!creature->Enemy->Velocity) + if (!creature->Enemy->Animation.Velocity) { angle1 += (GetRandomControl() & 0x1FF) - 256; angle2 += (GetRandomControl() & 0x1FF) - 256; @@ -470,7 +470,7 @@ namespace TEN::Entities::TR4 SasFireGrenade(item, angle2, angle1); if (Targetable(item, &AI)) - item->TargetState = SAS_STATE_HOLD_PREPARE_GRENADE; + item->Animation.TargetState = SAS_STATE_HOLD_PREPARE_GRENADE; } break; @@ -479,18 +479,18 @@ namespace TEN::Entities::TR4 case SAS_STATE_KNEEL_SHOOT: case SAS_STATE_SIGHT_SHOOT: case SAS_STATE_WALK_SHOOT: - if (item->ActiveState == SAS_STATE_HOLD_SHOOT || - item->ActiveState == SAS_STATE_KNEEL_SHOOT) + if (item->Animation.ActiveState == SAS_STATE_HOLD_SHOOT || + item->Animation.ActiveState == SAS_STATE_KNEEL_SHOOT) { - if (item->TargetState != SAS_STATE_IDLE && - item->TargetState != SAS_STATE_KNEEL_STOP && + if (item->Animation.TargetState != SAS_STATE_IDLE && + item->Animation.TargetState != SAS_STATE_KNEEL_STOP && (creature->Mood == MoodType::Escape || !Targetable(item, &AI))) { - if (item->ActiveState == SAS_STATE_HOLD_SHOOT) - item->TargetState = SAS_STATE_IDLE; + if (item->Animation.ActiveState == SAS_STATE_HOLD_SHOOT) + item->Animation.TargetState = SAS_STATE_IDLE; else - item->TargetState = SAS_STATE_KNEEL_STOP; + item->Animation.TargetState = SAS_STATE_KNEEL_STOP; } } @@ -513,7 +513,7 @@ namespace TEN::Entities::TR4 case SAS_STATE_BLIND: if (!WeaponEnemyTimer && !(GetRandomControl() & 0x7F)) - item->TargetState = SAS_STATE_WAIT; + item->Animation.TargetState = SAS_STATE_WAIT; break; @@ -522,21 +522,21 @@ namespace TEN::Entities::TR4 } if (WeaponEnemyTimer > 100 && - item->ActiveState != SAS_STATE_BLIND) + item->Animation.ActiveState != SAS_STATE_BLIND) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + SAS_ANIM_BLIND; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase + (GetRandomControl() & 7); - item->ActiveState = SAS_STATE_BLIND; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + SAS_ANIM_BLIND; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase + (GetRandomControl() & 7); + item->Animation.ActiveState = SAS_STATE_BLIND; creature->MaxTurn = 0; } } else { - if (item->ActiveState != SAS_STATE_DEATH) + if (item->Animation.ActiveState != SAS_STATE_DEATH) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + SAS_ANIM_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = SAS_STATE_DEATH; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + SAS_ANIM_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = SAS_STATE_DEATH; } } @@ -595,11 +595,11 @@ namespace TEN::Entities::TR4 grenadeItem->ItemFlags[0] = (int)GrenadeType::Super; grenadeItem->ItemFlags[2] = 1; - grenadeItem->Velocity = 128; - grenadeItem->ActiveState = grenadeItem->Position.xRot; - grenadeItem->VerticalVelocity = -128 * phd_sin(grenadeItem->Position.xRot); - grenadeItem->TargetState = grenadeItem->Position.yRot; - grenadeItem->RequiredState = 0; + grenadeItem->Animation.Velocity = 128; + grenadeItem->Animation.ActiveState = grenadeItem->Position.xRot; + grenadeItem->Animation.VerticalVelocity = -128 * phd_sin(grenadeItem->Position.xRot); + grenadeItem->Animation.TargetState = grenadeItem->Position.yRot; + grenadeItem->Animation.RequiredState = 0; grenadeItem->HitPoints = 120; AddActiveItem(itemNumber); @@ -612,35 +612,35 @@ namespace TEN::Entities::TR4 if (item->TriggerFlags) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->TargetState = item->ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.TargetState = item->Animation.ActiveState = 1; } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 3; - item->TargetState = item->ActiveState = 4; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 3; + item->Animation.TargetState = item->Animation.ActiveState = 4; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } void InjuredSasControl(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - if (item->ActiveState == 1) + if (item->Animation.ActiveState == 1) { if (!(GetRandomControl() & 0x7F)) { - item->TargetState = 2; + item->Animation.TargetState = 2; AnimateItem(item); } else if (!(byte)GetRandomControl()) - item->TargetState = 3; + item->Animation.TargetState = 3; } - else if (item->ActiveState == 4 && !(GetRandomControl() & 0x7F)) + else if (item->Animation.ActiveState == 4 && !(GetRandomControl() & 0x7F)) { - item->TargetState = 5; + item->Animation.TargetState = 5; AnimateItem(item); } else @@ -652,16 +652,16 @@ namespace TEN::Entities::TR4 ITEM_INFO* item = &g_Level.Items[itemNumber]; if ((!(TrInput & IN_ACTION) || - laraItem->Airborne || - laraItem->ActiveState != LS_IDLE || - laraItem->AnimNumber != LA_STAND_IDLE || + laraItem->Animation.Airborne || + laraItem->Animation.ActiveState != LS_IDLE || + laraItem->Animation.AnimNumber != LA_STAND_IDLE || Lara.Control.HandStatus != HandStatus::Free || item->Flags & 0x3E00) && (!(Lara.Control.IsMoving) || Lara.InteractedItem != itemNumber)) { if (item->Status == ITEM_ACTIVE) { - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) { int x = laraItem->Position.xPos - 512 * phd_sin(laraItem->Position.yRot); int y = laraItem->Position.yPos; @@ -682,9 +682,9 @@ namespace TEN::Entities::TR4 { if (MoveLaraPosition(&SASDragBodyPosition, item, laraItem)) { - laraItem->AnimNumber = LA_DRAG_BODY; - laraItem->ActiveState = LS_MISC_CONTROL; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_DRAG_BODY; + laraItem->Animation.ActiveState = LS_MISC_CONTROL; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; laraItem->Position.yRot = item->Position.yRot; ResetLaraFlex(laraItem); Lara.Control.IsMoving = false; diff --git a/TR5Main/Objects/TR4/Entity/tr4_setha.cpp b/TR5Main/Objects/TR4/Entity/tr4_setha.cpp index baaffce77..182f4a61d 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_setha.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_setha.cpp @@ -22,10 +22,10 @@ void InitialiseSetha(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 4; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 12; - item->ActiveState = 12; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 4; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 12; + item->Animation.ActiveState = 12; } void SethaControl(short itemNumber) @@ -95,20 +95,20 @@ void SethaControl(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->LOT.IsJumping = false; creature->Flags = 0; - if (item->RequiredState) + if (item->Animation.RequiredState) { - item->TargetState = item->RequiredState; + item->Animation.TargetState = item->Animation.RequiredState; break; } else if (info.distance < SQUARE(1024) && info.bite) { - item->TargetState = 8; + item->Animation.TargetState = 8; break; } else if (LaraItem->Position.yPos >= item->Position.yPos - 1024) @@ -119,7 +119,7 @@ void SethaControl(short itemNumber) && Targetable(item, &info)) { item->ItemFlags[0] = 0; - item->TargetState = 11; + item->Animation.TargetState = 11; break; } else if (ceiling != NO_HEIGHT @@ -133,11 +133,11 @@ void SethaControl(short itemNumber) { item->ItemFlags[0] = 0; item->Position.yPos += 1536; - item->TargetState = 12; + item->Animation.TargetState = 12; } else { - item->TargetState = 2; + item->Animation.TargetState = 2; item->Position.yPos += 1536; } break; @@ -148,7 +148,7 @@ void SethaControl(short itemNumber) { if (Targetable(item, &info)) { - item->TargetState = 4; + item->Animation.TargetState = 4; break; } } @@ -160,12 +160,12 @@ void SethaControl(short itemNumber) && Targetable(item, &info)) { item->ItemFlags[0] = 0; - item->TargetState = 13; + item->Animation.TargetState = 13; break; } else if (canJump) { - item->TargetState = 5; + item->Animation.TargetState = 5; break; } } @@ -174,7 +174,7 @@ void SethaControl(short itemNumber) { if (creature->ReachedGoal) { - item->TargetState = 14; + item->Animation.TargetState = 14; break; } else @@ -184,7 +184,7 @@ void SethaControl(short itemNumber) } } - item->TargetState = 2; + item->Animation.TargetState = 2; break; @@ -195,11 +195,11 @@ void SethaControl(short itemNumber) || canJump || creature->ReachedGoal) { - item->TargetState = 1; + item->Animation.TargetState = 1; } else if (info.distance > SQUARE(3072)) { - item->TargetState = 3; + item->Animation.TargetState = 3; } break; @@ -210,19 +210,19 @@ void SethaControl(short itemNumber) || canJump || creature->ReachedGoal) { - item->TargetState = 1; + item->Animation.TargetState = 1; } else if (info.distance < SQUARE(3072)) { - item->TargetState = 2; + item->Animation.TargetState = 2; } break; case 4: if (canJump) { - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + 15 - && item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + 15 + && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { creature->ReachedGoal = true; creature->MaxTurn = 0; @@ -233,7 +233,7 @@ void SethaControl(short itemNumber) { if (item->TouchBits) { - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + 16) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + 16) { if (item->TouchBits & 0xE000) { @@ -272,12 +272,12 @@ void SethaControl(short itemNumber) break; case 7: - if (item->AnimNumber == Objects[item->AnimNumber].animIndex + 17 - && item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.AnimNumber == Objects[item->Animation.AnimNumber].animIndex + 17 + && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) { if (GetRandomControl() & 1) { - item->RequiredState = 10; + item->Animation.RequiredState = 10; } } @@ -306,8 +306,8 @@ void SethaControl(short itemNumber) { if (item->TouchBits) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 15 - && item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 26) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 15 + && item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 26) { LaraItem->HitPoints -= 250; LaraItem->HitStatus = true; @@ -335,7 +335,7 @@ void SethaControl(short itemNumber) case 12: case 13: case 15: - if (item->ActiveState==15) + if (item->Animation.ActiveState==15) creature->Target.y = LaraItem->Position.yPos; creature->MaxTurn = 0; @@ -361,10 +361,10 @@ void SethaControl(short itemNumber) break; case 14: - if (item->AnimNumber != Objects[item->AnimNumber].animIndex + 26) + if (item->Animation.AnimNumber != Objects[item->Animation.AnimNumber].animIndex + 26) { creature->LOT.Fly = 16; - item->Airborne = false; + item->Animation.Airborne = false; creature->MaxTurn = 0; creature->Target.y = LaraItem->Position.yPos; @@ -390,16 +390,16 @@ void SethaControl(short itemNumber) if (Targetable(item, &info)) { item->ItemFlags[0] = 0; - item->TargetState = 15; + item->Animation.TargetState = 15; } } else { creature->LOT.Fly = 0; - item->Airborne = true; + item->Animation.Airborne = true; if (item->Position.yPos - item->Floor > 0) { - item->TargetState = 1; + item->Animation.TargetState = 1; } } @@ -417,30 +417,30 @@ void SethaControl(short itemNumber) && info.distance < SQUARE(2048) && !(creature->LOT.IsJumping)) { - if (item->ActiveState != 12) + if (item->Animation.ActiveState != 12) { - if (item->ActiveState <= 13) + if (item->Animation.ActiveState <= 13) { if (abs(height4 - item->Position.yPos) >= 512) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 11; - item->TargetState = 6; - item->ActiveState = 6; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 11; + item->Animation.TargetState = 6; + item->Animation.ActiveState = 6; } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 17; - item->TargetState = 7; - item->ActiveState = 7; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 17; + item->Animation.TargetState = 7; + item->Animation.ActiveState = 7; } } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 25; - item->TargetState = 16; - item->ActiveState = 16; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 25; + item->Animation.TargetState = 16; + item->Animation.ActiveState = 16; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } } @@ -576,7 +576,7 @@ void SethaAttack(int itemNumber) short angles[2]; PHD_3DPOS attackPos; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 11: case 15: diff --git a/TR5Main/Objects/TR4/Entity/tr4_skeleton.cpp b/TR5Main/Objects/TR4/Entity/tr4_skeleton.cpp index 01f1d5b6a..5c41c8bfb 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_skeleton.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_skeleton.cpp @@ -89,31 +89,31 @@ namespace TEN::Entities::TR4 switch (item->TriggerFlags) { case 0: - item->TargetState = 0; - item->ActiveState = 0; - item->AnimNumber = obj->animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.TargetState = 0; + item->Animation.ActiveState = 0; + item->Animation.AnimNumber = obj->animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 1: - item->TargetState = STATE_SKELETON_JUMP_RIGHT; - item->ActiveState = STATE_SKELETON_JUMP_RIGHT; - item->AnimNumber = obj->animIndex + 37; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.TargetState = STATE_SKELETON_JUMP_RIGHT; + item->Animation.ActiveState = STATE_SKELETON_JUMP_RIGHT; + item->Animation.AnimNumber = obj->animIndex + 37; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 2: - item->TargetState = STATE_SKELETON_JUMP_LEFT; - item->ActiveState = STATE_SKELETON_JUMP_LEFT; - item->AnimNumber = obj->animIndex + 34; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.TargetState = STATE_SKELETON_JUMP_LEFT; + item->Animation.ActiveState = STATE_SKELETON_JUMP_LEFT; + item->Animation.AnimNumber = obj->animIndex + 34; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 3: - item->TargetState = STATE_SKELETON_JUMP_LIE_DOWN; - item->ActiveState = STATE_SKELETON_JUMP_LIE_DOWN; - item->AnimNumber = obj->animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.TargetState = STATE_SKELETON_JUMP_LIE_DOWN; + item->Animation.ActiveState = STATE_SKELETON_JUMP_LIE_DOWN; + item->Animation.AnimNumber = obj->animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; //item->status = ITEM_DEACTIVATED; break; @@ -200,26 +200,26 @@ namespace TEN::Entities::TR4 if (item->HitStatus && Lara.Control.Weapon.GunType == LaraWeaponType::Shotgun && info.distance < SQUARE(3584) - && item->ActiveState != 7 - && item->ActiveState != 17 - && item->ActiveState != STATE_SKELETON_HURT_BY_SHOTGUN1 - && item->ActiveState != STATE_SKELETON_HURT_BY_SHOTGUN2 - && item->ActiveState != 25) + && item->Animation.ActiveState != 7 + && item->Animation.ActiveState != 17 + && item->Animation.ActiveState != STATE_SKELETON_HURT_BY_SHOTGUN1 + && item->Animation.ActiveState != STATE_SKELETON_HURT_BY_SHOTGUN2 + && item->Animation.ActiveState != 25) { if (info.angle >= 12288 || info.angle <= -12288) { - item->ActiveState = STATE_SKELETON_HURT_BY_SHOTGUN2; - item->AnimNumber = Objects[ID_SKELETON].animIndex + 33; + item->Animation.ActiveState = STATE_SKELETON_HURT_BY_SHOTGUN2; + item->Animation.AnimNumber = Objects[ID_SKELETON].animIndex + 33; item->Position.yRot += info.angle + -32768; } else { - item->ActiveState = STATE_SKELETON_HURT_BY_SHOTGUN1; - item->AnimNumber = Objects[ID_SKELETON].animIndex + 17; + item->Animation.ActiveState = STATE_SKELETON_HURT_BY_SHOTGUN1; + item->Animation.AnimNumber = Objects[ID_SKELETON].animIndex + 17; item->Position.yRot += info.angle; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; creature->LOT.IsJumping = true; item->HitPoints = 25; } @@ -322,12 +322,12 @@ namespace TEN::Entities::TR4 } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_SKELETON_STOP: if (!(GetRandomControl() & 0xF)) { - item->TargetState = 2; + item->Animation.TargetState = 2; } break; @@ -344,11 +344,11 @@ namespace TEN::Entities::TR4 { if (GetRandomControl() & 1) { - item->TargetState = 3; + item->Animation.TargetState = 3; } else { - item->TargetState = 4; + item->Animation.TargetState = 4; } } } @@ -356,38 +356,38 @@ namespace TEN::Entities::TR4 { if (item->AIBits & PATROL1) { - item->TargetState = 15; + item->Animation.TargetState = 15; } else if (canJump1sector || canJump2sectors) { creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_SKELETON].animIndex + 40; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = STATE_SKELETON_JUMP_LEFT; + item->Animation.AnimNumber = Objects[ID_SKELETON].animIndex + 40; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = STATE_SKELETON_JUMP_LEFT; if (!canJump2sectors) { - item->TargetState = STATE_SKELETON_JUMP_1SECTOR; + item->Animation.TargetState = STATE_SKELETON_JUMP_1SECTOR; creature->LOT.IsJumping = true; } else { - item->TargetState = STATE_SKELETON_JUMP_2SECTORS; + item->Animation.TargetState = STATE_SKELETON_JUMP_2SECTORS; creature->LOT.IsJumping = true; } } else if (jumpLeft) { - item->AnimNumber = Objects[ID_SKELETON].animIndex + 34; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_SKELETON_JUMP_LEFT; - item->ActiveState = STATE_SKELETON_JUMP_LEFT; + item->Animation.AnimNumber = Objects[ID_SKELETON].animIndex + 34; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_SKELETON_JUMP_LEFT; + item->Animation.ActiveState = STATE_SKELETON_JUMP_LEFT; } else if (jumpRight) { - item->AnimNumber = Objects[ID_SKELETON].animIndex + 37; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_SKELETON_JUMP_RIGHT; - item->ActiveState = STATE_SKELETON_JUMP_RIGHT; + item->Animation.AnimNumber = Objects[ID_SKELETON].animIndex + 37; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_SKELETON_JUMP_RIGHT; + item->Animation.ActiveState = STATE_SKELETON_JUMP_RIGHT; } else { @@ -398,23 +398,23 @@ namespace TEN::Entities::TR4 || item->HitStatus || !(item->MeshBits & 0x200)) { - item->TargetState = 15; + item->Animation.TargetState = 15; break; } - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (creature->Mood == MoodType::Bored || item->AIBits & FOLLOW && (creature->ReachedGoal || laraInfo.distance > SQUARE(2048))) { - if (item->RequiredState) + if (item->Animation.RequiredState) { - item->TargetState = item->RequiredState; + item->Animation.TargetState = item->Animation.RequiredState; } else if (!(GetRandomControl() & 0x3F)) { - item->TargetState = 15; + item->Animation.TargetState = 15; } } else if (Lara.TargetEntity == item @@ -424,7 +424,7 @@ namespace TEN::Entities::TR4 && (Lara.Control.Weapon.GunType == LaraWeaponType::Shotgun || !(GetRandomControl() & 0xF)) && item->MeshBits == -1) { - item->TargetState = STATE_SKELETON_USE_SHIELD; + item->Animation.TargetState = STATE_SKELETON_USE_SHIELD; } else if (info.bite && info.distance < SQUARE(682)) { @@ -432,34 +432,34 @@ namespace TEN::Entities::TR4 { if (GetRandomControl() & 1) { - item->TargetState = STATE_SKELETON_ATTACK1; + item->Animation.TargetState = STATE_SKELETON_ATTACK1; } else { - item->TargetState = STATE_SKELETON_ATTACK2; + item->Animation.TargetState = STATE_SKELETON_ATTACK2; } } else { - item->TargetState = STATE_SKELETON_ATTACK3; + item->Animation.TargetState = STATE_SKELETON_ATTACK3; } } - else if (item->HitStatus || item->RequiredState) + else if (item->HitStatus || item->Animation.RequiredState) { if (GetRandomControl() & 1) { - item->TargetState = STATE_SKELETON_AVOID_ATTACK1; - item->RequiredState = item->TargetState; + item->Animation.TargetState = STATE_SKELETON_AVOID_ATTACK1; + item->Animation.RequiredState = item->Animation.TargetState; } else { - item->TargetState = STATE_SKELETON_AVOID_ATTACK2; - item->RequiredState = item->TargetState; + item->Animation.TargetState = STATE_SKELETON_AVOID_ATTACK2; + item->Animation.RequiredState = item->Animation.TargetState; } } else { - item->TargetState = 15; + item->Animation.TargetState = 15; } } } @@ -471,30 +471,30 @@ namespace TEN::Entities::TR4 creature->MaxTurn = creature->Mood != MoodType::Bored ? 1092 : 364; if (item->AIBits & PATROL1) { - item->TargetState = 15; + item->Animation.TargetState = 15; } else if (item->HitStatus) { - item->TargetState = 2; + item->Animation.TargetState = 2; if (GetRandomControl() & 1) { - item->RequiredState = 5; + item->Animation.RequiredState = 5; } else { - item->RequiredState = 6; + item->Animation.RequiredState = 6; } } else { if (jumpLeft || jumpRight) { - item->TargetState = 2; + item->Animation.TargetState = 2; break; } if (creature->Mood == MoodType::Escape) { - item->TargetState = 16; + item->Animation.TargetState = 16; } else if (creature->Mood != MoodType::Bored) { @@ -502,26 +502,26 @@ namespace TEN::Entities::TR4 { if (info.bite && info.distance < SQUARE(1024)) { - item->TargetState = 18; + item->Animation.TargetState = 18; } else if (canJump1sector || canJump2sectors) { creature->MaxTurn = 0; - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (!info.ahead || info.distance > SQUARE(2048)) { - item->TargetState = 16; + item->Animation.TargetState = 16; } } else { - item->TargetState = 2; + item->Animation.TargetState = 2; } } else if (!(GetRandomControl() & 0x3F)) { - item->TargetState = 2; + item->Animation.TargetState = 2; } } break; @@ -535,7 +535,7 @@ namespace TEN::Entities::TR4 if (item->MeshBits & 0x200) { creature->MaxTurn = 0; - item->TargetState = 2; + item->Animation.TargetState = 2; break; } @@ -544,11 +544,11 @@ namespace TEN::Entities::TR4 if (GetFloorHeight(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos) > item->Position.yPos + 1024) { creature->MaxTurn = 0; - item->AnimNumber = Objects[ID_SKELETON].animIndex + 44; - item->ActiveState = 23; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_SKELETON].animIndex + 44; + item->Animation.ActiveState = 23; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; creature->LOT.IsJumping = false; - item->Airborne = true; + item->Animation.Airborne = true; } } else @@ -556,22 +556,22 @@ namespace TEN::Entities::TR4 if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && info.ahead && (item->MeshBits & 0x200)) - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (item->AIBits & FOLLOW && (creature->ReachedGoal || laraInfo.distance > SQUARE(2048))) { - item->TargetState = 2; + item->Animation.TargetState = 2; } else if (creature->Mood != MoodType::Bored) { if (info.ahead && info.distance < SQUARE(2048)) { - item->TargetState = 15; + item->Animation.TargetState = 15; } } else { - item->TargetState = 15; + item->Animation.TargetState = 15; } } break; @@ -607,7 +607,7 @@ namespace TEN::Entities::TR4 } if (!(GetRandomControl() & 0x3F) || LaraItem->HitPoints <= 0) { - item->TargetState = 11; + item->Animation.TargetState = 11; } break; @@ -630,7 +630,7 @@ namespace TEN::Entities::TR4 { item->Position.yRot += info.angle; } - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 15) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 15) { ROOM_INFO* room = &g_Level.Rooms[item->RoomNumber]; PHD_VECTOR pos; @@ -679,7 +679,7 @@ namespace TEN::Entities::TR4 { if (GetRandomControl() & 3) { - item->TargetState = 17; + item->Animation.TargetState = 17; } else { @@ -688,28 +688,28 @@ namespace TEN::Entities::TR4 } else { - item->TargetState = 2; + item->Animation.TargetState = 2; } } else if (Lara.TargetEntity != item || item->MeshBits != -1 || Lara.Control.Weapon.GunType != LaraWeaponType::Shotgun || !(GetRandomControl() & 0x7F)) { - item->TargetState = 2; + item->Animation.TargetState = 2; } break; case STATE_SKELETON_JUMP_1SECTOR: - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + 43) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + 43) { roomNumber = item->RoomNumber; floor = GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &roomNumber); if (GetFloorHeight(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos) > item->Position.yPos + 1280) { creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 44; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 23; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 44; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 23; creature->LOT.IsJumping = false; - item->Airborne = true; + item->Animation.Airborne = true; } } break; @@ -734,15 +734,15 @@ namespace TEN::Entities::TR4 case 11: case STATE_SKELETON_HURT_BY_SHOTGUN1: case STATE_SKELETON_HURT_BY_SHOTGUN2: - if ((item->ActiveState == STATE_SKELETON_HURT_BY_SHOTGUN1 - || item->ActiveState == STATE_SKELETON_HURT_BY_SHOTGUN2) && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 20) + if ((item->Animation.ActiveState == STATE_SKELETON_HURT_BY_SHOTGUN1 + || item->Animation.ActiveState == STATE_SKELETON_HURT_BY_SHOTGUN2) && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 20) { item->HitPoints = 25; creature->MaxTurn = 0; break; } - if (item->ActiveState == 11) + if (item->Animation.ActiveState == 11) { creature->MaxTurn = 0; break; @@ -757,16 +757,16 @@ namespace TEN::Entities::TR4 { if (!(GetRandomControl() & 0x1F)) { - item->TargetState = 14; + item->Animation.TargetState = 14; } } else { creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 47; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = 24; - item->Airborne = true; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 47; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = 24; + item->Animation.Airborne = true; } break; @@ -778,7 +778,7 @@ namespace TEN::Entities::TR4 break; case STATE_SKELETON_UNDER_FLOOR: - if (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase < 32) + if (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase < 32) { TriggerRiseEffect(item); } diff --git a/TR5Main/Objects/TR4/Entity/tr4_smallscorpion.cpp b/TR5Main/Objects/TR4/Entity/tr4_smallscorpion.cpp index af49716d2..97da98f90 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_smallscorpion.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_smallscorpion.cpp @@ -36,10 +36,10 @@ void InitialiseSmallScorpion(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[ID_SMALL_SCORPION].animIndex + 2; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = SSCORPION_STATE_IDLE; - item->ActiveState = SSCORPION_STATE_IDLE; + item->Animation.AnimNumber = Objects[ID_SMALL_SCORPION].animIndex + 2; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = SSCORPION_STATE_IDLE; + item->Animation.ActiveState = SSCORPION_STATE_IDLE; } void SmallScorpionControl(short itemNumber) @@ -62,12 +62,12 @@ void SmallScorpionControl(short itemNumber) if (item->HitPoints <= 0) { item->HitPoints = 0; - if (item->ActiveState != SSCORPION_STATE_DEATH_1 && - item->ActiveState != SSCORPION_STATE_DEATH_2) + if (item->Animation.ActiveState != SSCORPION_STATE_DEATH_1 && + item->Animation.ActiveState != SSCORPION_STATE_DEATH_2) { - item->AnimNumber = Objects[ID_SMALL_SCORPION].animIndex + 5; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = SSCORPION_STATE_DEATH_1; + item->Animation.AnimNumber = Objects[ID_SMALL_SCORPION].animIndex + 5; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = SSCORPION_STATE_DEATH_1; } } else @@ -89,24 +89,24 @@ void SmallScorpionControl(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case SSCORPION_STATE_IDLE: creature->MaxTurn = 0; creature->Flags = 0; if (AI.distance > pow(341, 2)) - item->TargetState = SSCORPION_STATE_WALK; + item->Animation.TargetState = SSCORPION_STATE_WALK; else if (AI.bite) { creature->MaxTurn = ANGLE(6.0f); if (GetRandomControl() & 1) - item->TargetState = SSCORPION_STATE_ATTACK_1; + item->Animation.TargetState = SSCORPION_STATE_ATTACK_1; else - item->TargetState = SSCORPION_STATE_ATTACK_2; + item->Animation.TargetState = SSCORPION_STATE_ATTACK_2; } else if (!AI.ahead) - item->TargetState = SSCORPION_STATE_RUN; + item->Animation.TargetState = SSCORPION_STATE_RUN; break; @@ -115,10 +115,10 @@ void SmallScorpionControl(short itemNumber) if (AI.distance >= pow(341, 2)) { if (AI.distance > pow(213, 2)) - item->TargetState = SSCORPION_STATE_RUN; + item->Animation.TargetState = SSCORPION_STATE_RUN; } else - item->TargetState = SSCORPION_STATE_IDLE; + item->Animation.TargetState = SSCORPION_STATE_IDLE; break; @@ -126,7 +126,7 @@ void SmallScorpionControl(short itemNumber) creature->MaxTurn = ANGLE(8.0f); if (AI.distance < pow(341, 2)) - item->TargetState = SSCORPION_STATE_IDLE; + item->Animation.TargetState = SSCORPION_STATE_IDLE; break; @@ -148,8 +148,8 @@ void SmallScorpionControl(short itemNumber) { if (item->TouchBits & 0x1B00100) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 20 && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 32) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 20 && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 32) { Lara.PoisonPotency += 2; LaraItem->HitPoints -= 20; @@ -157,7 +157,7 @@ void SmallScorpionControl(short itemNumber) short rotation; BITE_INFO* biteInfo; - if (item->ActiveState == SSCORPION_STATE_ATTACK_1) + if (item->Animation.ActiveState == SSCORPION_STATE_ATTACK_1) { rotation = item->Position.yRot + -ANGLE(180.0f); biteInfo = &SmallScorpionBiteInfo1; diff --git a/TR5Main/Objects/TR4/Entity/tr4_sphinx.cpp b/TR5Main/Objects/TR4/Entity/tr4_sphinx.cpp index e7c7cc47a..922e53ce8 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_sphinx.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_sphinx.cpp @@ -31,10 +31,10 @@ void InitialiseSphinx(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = SPHINX_SLEEPING; - item->ActiveState = SPHINX_SLEEPING; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = SPHINX_SLEEPING; + item->Animation.ActiveState = SPHINX_SLEEPING; } void SphinxControl(short itemNumber) @@ -54,7 +54,7 @@ void SphinxControl(short itemNumber) FLOOR_INFO* floor = GetFloor(x, y, z, &roomNumber); int height1 = GetFloorHeight(floor, x, y, z); - if (item->ActiveState == 5 && floor->Stopper) + if (item->Animation.ActiveState == 5 && floor->Stopper) { ROOM_INFO* room = &g_Level.Rooms[item->RoomNumber]; @@ -107,19 +107,19 @@ void SphinxControl(short itemNumber) int dx = abs(item->ItemFlags[2] - (short)item->Position.xPos); int dz = abs(item->ItemFlags[3] - (short)item->Position.zPos); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case SPHINX_SLEEPING: creature->MaxTurn = 0; if (info.distance < SQUARE(1024) || item->TriggerFlags) { - item->TargetState = SPHINX_WAKING_UP; + item->Animation.TargetState = SPHINX_WAKING_UP; } if (GetRandomControl() == 0) { - item->TargetState = SPHINX_ALERTED; + item->Animation.TargetState = SPHINX_ALERTED; } break; @@ -129,12 +129,12 @@ void SphinxControl(short itemNumber) if (info.distance < SQUARE(1024) || item->TriggerFlags) { - item->TargetState = SPHINX_WAKING_UP; + item->Animation.TargetState = SPHINX_WAKING_UP; } if (GetRandomControl() == 0) { - item->TargetState = SPHINX_SLEEPING; + item->Animation.TargetState = SPHINX_SLEEPING; } break; @@ -142,16 +142,16 @@ void SphinxControl(short itemNumber) case SPHINX_WALK: creature->MaxTurn = ANGLE(3); - if (info.distance > SQUARE(1024) && abs(info.angle) <= 512 || item->RequiredState == SPHINX_RUN) + if (info.distance > SQUARE(1024) && abs(info.angle) <= 512 || item->Animation.RequiredState == SPHINX_RUN) { - item->TargetState = SPHINX_RUN; + item->Animation.TargetState = SPHINX_RUN; } - else if (info.distance < SQUARE(2048) && item->TargetState != SPHINX_RUN) + else if (info.distance < SQUARE(2048) && item->Animation.TargetState != SPHINX_RUN) { if (height2 <= item->Position.yPos + 256 && height2 >= item->Position.yPos - 256) { - item->TargetState = SPHINX_STOP; - item->RequiredState = SPHINX_WALK_BACK; + item->Animation.TargetState = SPHINX_STOP; + item->Animation.RequiredState = SPHINX_WALK_BACK; } } @@ -176,17 +176,17 @@ void SphinxControl(short itemNumber) } } - if (dx >= 50 || dz >= 50 || item->AnimNumber != Objects[item->ObjectNumber].animIndex) + if (dx >= 50 || dz >= 50 || item->Animation.AnimNumber != Objects[item->ObjectNumber].animIndex) { if (info.distance > SQUARE(2048) && abs(info.angle) > 512) { - item->TargetState = SPHINX_STOP; + item->Animation.TargetState = SPHINX_STOP; } } else { - item->TargetState = SPHINX_HIT; - item->RequiredState = SPHINX_WALK_BACK; + item->Animation.TargetState = SPHINX_HIT; + item->Animation.RequiredState = SPHINX_WALK_BACK; creature->MaxTurn = 0; } @@ -196,14 +196,14 @@ void SphinxControl(short itemNumber) creature->MaxTurn = ANGLE(3); if (info.distance > SQUARE(2048) || height2 > item->Position.yPos + 256 || height2 < item->Position.yPos - 256) { - item->TargetState = SPHINX_STOP; - item->RequiredState = SPHINX_RUN; + item->Animation.TargetState = SPHINX_STOP; + item->Animation.RequiredState = SPHINX_RUN; } break; case SPHINX_HIT: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { TestTriggers(item, true); @@ -225,13 +225,13 @@ void SphinxControl(short itemNumber) case SPHINX_STOP: creature->Flags = 0; - if (item->RequiredState == SPHINX_WALK_BACK) + if (item->Animation.RequiredState == SPHINX_WALK_BACK) { - item->TargetState = SPHINX_WALK_BACK; + item->Animation.TargetState = SPHINX_WALK_BACK; } else { - item->TargetState = SPHINX_WALK; + item->Animation.TargetState = SPHINX_WALK; } break; diff --git a/TR5Main/Objects/TR4/Entity/tr4_troops.cpp b/TR5Main/Objects/TR4/Entity/tr4_troops.cpp index c4ea1d5e4..402d66169 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_troops.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_troops.cpp @@ -37,16 +37,16 @@ void InitialiseTroops(short itemNumber) if (item->TriggerFlags == 1) { - item->TargetState = item->ActiveState = STATE_TROOPS_ATTACKED_BY_SCORPION; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 27; + item->Animation.TargetState = item->Animation.ActiveState = STATE_TROOPS_ATTACKED_BY_SCORPION; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 27; } else { - item->TargetState = item->ActiveState = STATE_TROOPS_STOP; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 12; + item->Animation.TargetState = item->Animation.ActiveState = STATE_TROOPS_STOP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 12; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } void TroopsControl(short itemNumber) @@ -87,26 +87,26 @@ void TroopsControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != STATE_TROOPS_DEATH - && item->ActiveState != STATE_TROOPS_KILLED_BY_SCORPION) + if (item->Animation.ActiveState != STATE_TROOPS_DEATH + && item->Animation.ActiveState != STATE_TROOPS_KILLED_BY_SCORPION) { if (creature->Enemy && creature->Enemy->ObjectNumber == ID_BIG_SCORPION && item->ItemFlags[0] < 80) { - if (creature->Enemy->AnimNumber == Objects[ID_BIG_SCORPION].animIndex + 6) + if (creature->Enemy->Animation.AnimNumber == Objects[ID_BIG_SCORPION].animIndex + 6) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 23; - if (item->ActiveState == STATE_TROOPS_ATTACKED_BY_SCORPION) + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 23; + if (item->Animation.ActiveState == STATE_TROOPS_ATTACKED_BY_SCORPION) { - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase + 37; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase + 37; } else { - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } - item->TargetState = STATE_TROOPS_KILLED_BY_SCORPION; - item->ActiveState = STATE_TROOPS_KILLED_BY_SCORPION; + item->Animation.TargetState = STATE_TROOPS_KILLED_BY_SCORPION; + item->Animation.ActiveState = STATE_TROOPS_KILLED_BY_SCORPION; angle = 0; @@ -128,9 +128,9 @@ void TroopsControl(short itemNumber) } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 19; - item->ActiveState = STATE_TROOPS_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 19; + item->Animation.ActiveState = STATE_TROOPS_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } } @@ -175,7 +175,7 @@ void TroopsControl(short itemNumber) } } - if (creature->HurtByLara && item->ActiveState != STATE_TROOPS_ATTACKED_BY_SCORPION) + if (creature->HurtByLara && item->Animation.ActiveState != STATE_TROOPS_ATTACKED_BY_SCORPION) creature->Enemy = LaraItem; AI_INFO info; @@ -210,14 +210,14 @@ void TroopsControl(short itemNumber) if (item->HitStatus) AlertAllGuards(itemNumber); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_TROOPS_STOP: creature->Flags = 0; creature->MaxTurn = 0; joint2 = rot; - if (item->AnimNumber == obj->animIndex + 17) + if (item->Animation.AnimNumber == obj->animIndex + 17) { if (abs(info.angle) >= ANGLE(10)) { @@ -241,24 +241,24 @@ void TroopsControl(short itemNumber) joint2 = AIGuard(creature); if (!GetRandomControl()) { - if (item->ActiveState == STATE_TROOPS_STOP) + if (item->Animation.ActiveState == STATE_TROOPS_STOP) { - item->TargetState = STATE_TROOPS_GUARD; + item->Animation.TargetState = STATE_TROOPS_GUARD; } else { - item->TargetState = STATE_TROOPS_STOP; + item->Animation.TargetState = STATE_TROOPS_STOP; } } } else if (item->AIBits & PATROL1) { - item->TargetState = STATE_TROOPS_WALK; + item->Animation.TargetState = STATE_TROOPS_WALK; joint2 = 0; } else if (creature->Mood == MoodType::Escape) { - item->TargetState = STATE_TROOPS_RUN; + item->Animation.TargetState = STATE_TROOPS_RUN; } else if (Targetable(item, &info)) { @@ -266,16 +266,16 @@ void TroopsControl(short itemNumber) { if (GetRandomControl() >= 16384) { - item->TargetState = STATE_TROOPS_AIM3; + item->Animation.TargetState = STATE_TROOPS_AIM3; } else { - item->TargetState = STATE_TROOPS_AIM1; + item->Animation.TargetState = STATE_TROOPS_AIM1; } } else { - item->TargetState = STATE_TROOPS_WALK; + item->Animation.TargetState = STATE_TROOPS_WALK; } } else @@ -288,14 +288,14 @@ void TroopsControl(short itemNumber) { if (creature->Mood == MoodType::Bored || info.distance <= SQUARE(2048)) { - item->TargetState = STATE_TROOPS_WALK; + item->Animation.TargetState = STATE_TROOPS_WALK; break; } - item->TargetState = STATE_TROOPS_RUN; + item->Animation.TargetState = STATE_TROOPS_RUN; } else { - item->TargetState = STATE_TROOPS_STOP; + item->Animation.TargetState = STATE_TROOPS_STOP; } } @@ -308,11 +308,11 @@ void TroopsControl(short itemNumber) if (item->AIBits & PATROL1) { - item->TargetState = STATE_TROOPS_WALK; + item->Animation.TargetState = STATE_TROOPS_WALK; } else if (creature->Mood == MoodType::Escape) { - item->TargetState = STATE_TROOPS_RUN; + item->Animation.TargetState = STATE_TROOPS_RUN; } else { @@ -321,29 +321,29 @@ void TroopsControl(short itemNumber) && (creature->ReachedGoal || distance > SQUARE(2048))) { - item->TargetState = STATE_TROOPS_STOP; + item->Animation.TargetState = STATE_TROOPS_STOP; } else if (Targetable(item, &info)) { if (info.distance < SQUARE(3072) || info.enemyZone != info.zoneNumber) { - item->TargetState = STATE_TROOPS_STOP; + item->Animation.TargetState = STATE_TROOPS_STOP; } else { - item->TargetState = STATE_TROOPS_AIM2; + item->Animation.TargetState = STATE_TROOPS_AIM2; } } else if (creature->Mood != MoodType::Bored) { if (info.distance > SQUARE(2048)) { - item->TargetState = STATE_TROOPS_RUN; + item->Animation.TargetState = STATE_TROOPS_RUN; } } else if (info.ahead) { - item->TargetState = STATE_TROOPS_STOP; + item->Animation.TargetState = STATE_TROOPS_STOP; } } @@ -362,20 +362,20 @@ void TroopsControl(short itemNumber) && (creature->ReachedGoal || distance > SQUARE(2048))) { - item->TargetState = STATE_TROOPS_WALK; + item->Animation.TargetState = STATE_TROOPS_WALK; } else if (creature->Mood != MoodType::Escape) { if (Targetable(item, &info)) { - item->TargetState = STATE_TROOPS_WALK; + item->Animation.TargetState = STATE_TROOPS_WALK; } else if (creature->Mood == MoodType::Bored || creature->Mood == MoodType::Stalk && !(item->AIBits & FOLLOW) && info.distance < SQUARE(2048)) { - item->TargetState = STATE_TROOPS_WALK; + item->Animation.TargetState = STATE_TROOPS_WALK; } } @@ -391,16 +391,16 @@ void TroopsControl(short itemNumber) joint2 = AIGuard(creature); if (!GetRandomControl()) { - item->TargetState = STATE_TROOPS_STOP; + item->Animation.TargetState = STATE_TROOPS_STOP; } } else if (Targetable(item, &info)) { - item->TargetState = STATE_TROOPS_ATTACK1; + item->Animation.TargetState = STATE_TROOPS_ATTACK1; } else if (creature->Mood != MoodType::Bored || !info.ahead) { - item->TargetState = STATE_TROOPS_STOP; + item->Animation.TargetState = STATE_TROOPS_STOP; } break; @@ -436,11 +436,11 @@ void TroopsControl(short itemNumber) if (Targetable(item, &info)) { - item->TargetState = item->ActiveState != STATE_TROOPS_AIM1 ? STATE_TROOPS_ATTACK3 : STATE_TROOPS_ATTACK1; + item->Animation.TargetState = item->Animation.ActiveState != STATE_TROOPS_AIM1 ? STATE_TROOPS_ATTACK3 : STATE_TROOPS_ATTACK1; } else { - item->TargetState = STATE_TROOPS_STOP; + item->Animation.TargetState = STATE_TROOPS_STOP; } } @@ -456,23 +456,23 @@ void TroopsControl(short itemNumber) if (Targetable(item, &info)) { - item->TargetState = STATE_TROOPS_ATTACK2; + item->Animation.TargetState = STATE_TROOPS_ATTACK2; } else { - item->TargetState = STATE_TROOPS_WALK; + item->Animation.TargetState = STATE_TROOPS_WALK; } } break; case STATE_TROOPS_ATTACK3: - if (item->TargetState != STATE_TROOPS_STOP + if (item->Animation.TargetState != STATE_TROOPS_STOP && (creature->Mood == MoodType::Escape || info.distance > SQUARE(3072) || !Targetable(item, &info))) { - item->TargetState = STATE_TROOPS_STOP; + item->Animation.TargetState = STATE_TROOPS_STOP; } if (info.ahead) @@ -500,7 +500,7 @@ void TroopsControl(short itemNumber) case STATE_TROOPS_FLASHED: if (!WeaponEnemyTimer && !(GetRandomControl() & 0x7F)) { - item->TargetState = STATE_TROOPS_GUARD; + item->Animation.TargetState = STATE_TROOPS_GUARD; } break; @@ -511,13 +511,13 @@ void TroopsControl(short itemNumber) if (WeaponEnemyTimer > 100) { - if (item->ActiveState != STATE_TROOPS_FLASHED - && item->ActiveState != STATE_TROOPS_ATTACKED_BY_SCORPION) + if (item->Animation.ActiveState != STATE_TROOPS_FLASHED + && item->Animation.ActiveState != STATE_TROOPS_ATTACKED_BY_SCORPION) { creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 28; - item->ActiveState = STATE_TROOPS_FLASHED; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase + (GetRandomControl() & 7); + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 28; + item->Animation.ActiveState = STATE_TROOPS_FLASHED; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase + (GetRandomControl() & 7); } } } diff --git a/TR5Main/Objects/TR4/Entity/tr4_von_croy.cpp b/TR5Main/Objects/TR4/Entity/tr4_von_croy.cpp index 0b120b86e..0756ae7a5 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_von_croy.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_von_croy.cpp @@ -49,10 +49,10 @@ void InitialiseVonCroy(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 11; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_VON_CROY_TOGGLE_KNIFE; - item->ActiveState = STATE_VON_CROY_TOGGLE_KNIFE; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 11; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_VON_CROY_TOGGLE_KNIFE; + item->Animation.ActiveState = STATE_VON_CROY_TOGGLE_KNIFE; item->SwapMeshFlags = SWAPMESHFLAGS_VON_CROY; memset(VonCroyPassedWaypoints, 0, 128); @@ -195,8 +195,8 @@ void VonCroyControl(short itemNumber) } // HACK: even the most advanced zone in TR must have a step height of 1024, so we need to recreate zones when step difference is higher - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + ANIMATION_VON_CROY_STEP_DOWN_HIGH - || item->AnimNumber == Objects[item->ObjectNumber].animIndex + ANIMATION_VON_CROY_CLIMB_UP_AFTER_JUMP) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + ANIMATION_VON_CROY_STEP_DOWN_HIGH + || item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + ANIMATION_VON_CROY_CLIMB_UP_AFTER_JUMP) { short oldRoom = item->RoomNumber; item->Position.xPos += dx; @@ -204,7 +204,7 @@ void VonCroyControl(short itemNumber) GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &item->RoomNumber); - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 1) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 1) { CreateZone(item); } @@ -289,9 +289,9 @@ void VonCroyControl(short itemNumber) short rot = 0; int dy, height, ceiling, flags; - TENLog("State:" + std::to_string(item->ActiveState), LogLevel::Info); + TENLog("State:" + std::to_string(item->Animation.ActiveState), LogLevel::Info); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_VON_CROY_STOP: creature->LOT.IsMonkeying = false; @@ -308,13 +308,13 @@ void VonCroyControl(short itemNumber) if (item->AIBits & GUARD) { joint3 = AIGuard(creature); - item->TargetState = 0; + item->Animation.TargetState = 0; break; } if (item->AIBits & MODIFY) { - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; if (item->Floor > item->Position.yPos + (STEP_SIZE * 3)) item->AIBits &= ~MODIFY; break; @@ -324,27 +324,27 @@ void VonCroyControl(short itemNumber) { if (item->ItemFlags[2] != VON_CROY_FLAG_JUMP && !canJump2blocks) { - item->TargetState = STATE_VON_CROY_JUMP_BACK; + item->Animation.TargetState = STATE_VON_CROY_JUMP_BACK; } else { - item->TargetState = STATE_VON_CROY_RUN; + item->Animation.TargetState = STATE_VON_CROY_RUN; } break; } else if (canJump1block || canJump2blocks) { creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 22; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = STATE_VON_CROY_JUMP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 22; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = STATE_VON_CROY_JUMP; creature->LOT.IsJumping = true; if (!canJump2blocks && !canJump3blocks) - item->TargetState = STATE_VON_CROY_JUMP; + item->Animation.TargetState = STATE_VON_CROY_JUMP; else { - item->TargetState = STATE_VON_CROY_JUMP_2BLOCKS; + item->Animation.TargetState = STATE_VON_CROY_JUMP_2BLOCKS; } break; } @@ -356,9 +356,9 @@ void VonCroyControl(short itemNumber) if (GetCeiling(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos) == height - 1536) { if (item->SwapMeshFlags == SWAPMESHFLAGS_VON_CROY) - item->TargetState = STATE_VON_CROY_TOGGLE_KNIFE; + item->Animation.TargetState = STATE_VON_CROY_TOGGLE_KNIFE; else - item->TargetState = STATE_VON_CROY_START_MONKEY; + item->Animation.TargetState = STATE_VON_CROY_START_MONKEY; break; } } @@ -372,16 +372,16 @@ void VonCroyControl(short itemNumber) if (enemy->HitPoints > 0 && info.ahead) { if (abs(enemy->Position.yPos - item->Position.yPos + 512) < 512) - item->TargetState = STATE_VON_CROY_KNIFE_ATTACK_HIGH; + item->Animation.TargetState = STATE_VON_CROY_KNIFE_ATTACK_HIGH; else - item->TargetState = STATE_VON_CROY_KNIFE_ATTACK_LOW; + item->Animation.TargetState = STATE_VON_CROY_KNIFE_ATTACK_LOW; break; } } } } - item->TargetState = STATE_VON_CROY_WALK; + item->Animation.TargetState = STATE_VON_CROY_WALK; break; case STATE_VON_CROY_WALK: @@ -402,13 +402,13 @@ void VonCroyControl(short itemNumber) if (canJump1block || canJump2blocks || canJump3blocks) { creature->MaxTurn = 0; - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; break; } if (creature->ReachedGoal && creature->MonkeySwingAhead) { - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; break; } @@ -423,7 +423,7 @@ void VonCroyControl(short itemNumber) break; } - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; break; } else @@ -438,27 +438,27 @@ void VonCroyControl(short itemNumber) { if (info.distance > 0x1000000) { - item->TargetState = STATE_VON_CROY_RUN; + item->Animation.TargetState = STATE_VON_CROY_RUN; } } else { - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; } } else if (Lara.Location > item->ItemFlags[3] && laraInfo.distance > 0x400000) { - item->TargetState = STATE_VON_CROY_RUN; + item->Animation.TargetState = STATE_VON_CROY_RUN; } } else { - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; } } else { - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; } } @@ -466,7 +466,7 @@ void VonCroyControl(short itemNumber) { if (info.distance < SQUARE(1024)) { - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; break; } } @@ -475,7 +475,7 @@ void VonCroyControl(short itemNumber) !(creature->JumpAhead) && info.distance > SQUARE(1024)) { - item->TargetState = STATE_VON_CROY_RUN; + item->Animation.TargetState = STATE_VON_CROY_RUN; } break; @@ -488,7 +488,7 @@ void VonCroyControl(short itemNumber) if (item->ItemFlags[2] == VON_CROY_FLAG_JUMP) { creature->MaxTurn = 0; - item->TargetState = STATE_VON_CROY_JUMP_2BLOCKS; + item->Animation.TargetState = STATE_VON_CROY_JUMP_2BLOCKS; break; } @@ -497,7 +497,7 @@ void VonCroyControl(short itemNumber) if (info.distance < SQUARE(2048) || Lara.Location < creature->LocationAI) { - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; break; } @@ -512,7 +512,7 @@ void VonCroyControl(short itemNumber) break; } - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; break; } @@ -524,13 +524,13 @@ void VonCroyControl(short itemNumber) || info.distance < SQUARE(1024) || creature->JumpAhead) { - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; break; } if (info.distance < SQUARE(1024)) { - item->TargetState = STATE_VON_CROY_WALK; + item->Animation.TargetState = STATE_VON_CROY_WALK; break; } @@ -540,7 +540,7 @@ void VonCroyControl(short itemNumber) creature->MaxTurn = 0; if (item->BoxNumber != creature->LOT.TargetBox && creature->MonkeySwingAhead) { - item->TargetState = STATE_VON_CROY_MONKEY; + item->Animation.TargetState = STATE_VON_CROY_MONKEY; } else { @@ -548,7 +548,7 @@ void VonCroyControl(short itemNumber) height = GetFloorHeight(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos); ceiling = GetCeiling(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos); if (ceiling == height - 1536) - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; } break; @@ -563,13 +563,13 @@ void VonCroyControl(short itemNumber) floor = GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &roomNumber); height = GetFloorHeight(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos); if (GetCeiling(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos) == height - 1536) - item->TargetState = STATE_VON_CROY_START_MONKEY; + item->Animation.TargetState = STATE_VON_CROY_START_MONKEY; } break; case STATE_VON_CROY_TOGGLE_KNIFE: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { if (!(item->SwapMeshFlags & SWAPMESHFLAGS_VON_CROY)) { @@ -583,7 +583,7 @@ void VonCroyControl(short itemNumber) break; case STATE_VON_CROY_LOOK_BEFORE_JUMP: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { item->Position.xPos = enemy->Position.xPos; item->Position.yPos = enemy->Position.yPos; @@ -595,10 +595,10 @@ void VonCroyControl(short itemNumber) if (item->ItemFlags[2] == VON_CROY_FLAG_JUMP) { creature->MaxTurn = 0; - item->ActiveState = STATE_VON_CROY_JUMP; - item->TargetState = STATE_VON_CROY_JUMP_2BLOCKS; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 22; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.ActiveState = STATE_VON_CROY_JUMP; + item->Animation.TargetState = STATE_VON_CROY_JUMP_2BLOCKS; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 22; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; creature->LOT.IsJumping = true; } @@ -611,8 +611,8 @@ void VonCroyControl(short itemNumber) break; case STATE_VON_CROY_JUMP_2BLOCKS: - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + 25 - || item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 5) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + 25 + || item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 5) { creature->LOT.IsJumping = true; //if (canJump3blocks) @@ -620,18 +620,18 @@ void VonCroyControl(short itemNumber) } else if (canJump1block) { - item->TargetState = STATE_VON_CROY_JUMP; + item->Animation.TargetState = STATE_VON_CROY_JUMP; } if (item->ItemFlags[2] == VON_CROY_FLAG_JUMP) { - item->TargetState = 33; + item->Animation.TargetState = 33; } break; case STATE_VON_CROY_ENABLE_TRAP: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { item->Position.xPos = enemy->Position.xPos; item->Position.yPos = enemy->Position.yPos; @@ -640,7 +640,7 @@ void VonCroyControl(short itemNumber) item->Position.yRot = enemy->Position.yRot; item->Position.zRot = enemy->Position.zRot; } - else if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 120) + else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 120) { TestTriggers( creature->AITarget->Position.xPos, @@ -670,8 +670,8 @@ void VonCroyControl(short itemNumber) if (!creature->Flags && enemy != NULL) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 20 - && item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 45) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 20 + && item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 45) { if (abs(item->Position.xPos - enemy->Position.xPos) < 512 && abs(item->Position.yPos - enemy->Position.yPos) < 512 @@ -714,7 +714,7 @@ void VonCroyControl(short itemNumber) } else {*/ - item->TargetState = STATE_VON_CROY_LADDER_CLIMB_UP; + item->Animation.TargetState = STATE_VON_CROY_LADDER_CLIMB_UP; creature->ReachedGoal = false; creature->Enemy = NULL; item->AIBits = FOLLOW; @@ -740,12 +740,12 @@ void VonCroyControl(short itemNumber) if ((enemy == NULL || enemy->Flags != 0) - || item->FrameNumber <= g_Level.Anims[item->AnimNumber].frameBase + 21) + || item->Animation.FrameNumber <= g_Level.Anims[item->Animation.AnimNumber].frameBase + 21) { if (creature->Flags == 0 && enemy != NULL) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 15 - && item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 26) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 15 + && item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 26) { if (abs(item->Position.xPos - enemy->Position.xPos) < 512 && abs(item->Position.yPos - enemy->Position.yPos) < 512 @@ -790,16 +790,16 @@ void VonCroyControl(short itemNumber) creature->MaxTurn = 0; ClampRotation(&item->Position, info.angle / 2, ANGLE(6)); - if (item->AnimNumber == Objects[item->ObjectNumber].animIndex + 47) + if (item->Animation.AnimNumber == Objects[item->ObjectNumber].animIndex + 47) { - if (item->FrameNumber != g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase) break; } else { if (GetRandomControl() & 0x1F) break; - item->TargetState = STATE_VON_CROY_STOP; + item->Animation.TargetState = STATE_VON_CROY_STOP; } creature->ReachedGoal = false; @@ -811,14 +811,14 @@ void VonCroyControl(short itemNumber) case 33: flags = 1; - if (item->AnimNumber != Objects[item->ObjectNumber].animIndex + 52 - || item->FrameNumber != g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.AnimNumber != Objects[item->ObjectNumber].animIndex + 52 + || item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase) { flags = 0; } - item->TargetState = STATE_VON_CROY_WALK; - item->RequiredState = STATE_VON_CROY_RUN; + item->Animation.TargetState = STATE_VON_CROY_WALK; + item->Animation.RequiredState = STATE_VON_CROY_RUN; item->ItemFlags[2] = 0; //if (sVar3 == -1) goto LAB_0041a991; if (!flags) @@ -849,64 +849,64 @@ void VonCroyControl(short itemNumber) CreatureJoint(item, 2, joint2); CreatureJoint(item, 3, joint3); - if ((item->ActiveState < 15) && (item->ActiveState != 5)) + if ((item->Animation.ActiveState < 15) && (item->Animation.ActiveState != 5)) { switch (CreatureVault(itemNumber, angle, 2, 260)) { case 2: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex+29; - item->ActiveState = 19; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex+29; + item->Animation.ActiveState = 19; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 3: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 28; - item->ActiveState = 18; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 28; + item->Animation.ActiveState = 18; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 4: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 27; - item->ActiveState = 17; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 27; + item->Animation.ActiveState = 17; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 7: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 37; - item->ActiveState = 27; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 37; + item->Animation.ActiveState = 27; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case -7: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 36; - item->ActiveState = 26; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 36; + item->Animation.ActiveState = 26; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case -4: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 35; - item->ActiveState = 25; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 35; + item->Animation.ActiveState = 25; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case -3: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 41; - item->ActiveState = 24; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 41; + item->Animation.ActiveState = 24; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case -2: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 42; - item->ActiveState = 23; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 42; + item->Animation.ActiveState = 23; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; } diff --git a/TR5Main/Objects/TR4/Entity/tr4_wildboar.cpp b/TR5Main/Objects/TR4/Entity/tr4_wildboar.cpp index 25c9177ff..b3f3b2d5b 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_wildboar.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_wildboar.cpp @@ -19,10 +19,10 @@ void InitialiseWildBoar(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[ID_WILD_BOAR].animIndex + 6; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 1; - item->ActiveState = 1; + item->Animation.AnimNumber = Objects[ID_WILD_BOAR].animIndex + 6; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 1; + item->Animation.ActiveState = 1; } void WildBoarControl(short itemNumber) @@ -98,20 +98,20 @@ void WildBoarControl(short itemNumber) joint3 = AI.angle / 2; } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->MaxTurn = 0; if (AI.ahead && AI.distance || item->Flags) - item->TargetState = 2; + item->Animation.TargetState = 2; else if (GetRandomControl() & 0x7F) { joint1 = AIGuard(creature) / 2; joint3 = joint1; } else - item->TargetState = 3; + item->Animation.TargetState = 3; break; @@ -119,9 +119,9 @@ void WildBoarControl(short itemNumber) creature->MaxTurn = 0; if (AI.ahead && AI.distance) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (!(GetRandomControl() & 0x7F)) - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -140,7 +140,7 @@ void WildBoarControl(short itemNumber) if (!item->Flags && (AI.distance < 0x10000 && AI.bite)) { - item->TargetState = 4; + item->Animation.TargetState = 4; if (creature->Enemy == LaraItem) { @@ -163,11 +163,11 @@ void WildBoarControl(short itemNumber) { item->HitPoints = 0; - if (item->ActiveState != 5) + if (item->Animation.ActiveState != 5) { - item->AnimNumber = Objects[ID_WILD_BOAR].animIndex + 5; - item->ActiveState = 5; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_WILD_BOAR].animIndex + 5; + item->Animation.ActiveState = 5; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } diff --git a/TR5Main/Objects/TR4/Entity/tr4_wraith.cpp b/TR5Main/Objects/TR4/Entity/tr4_wraith.cpp index 5661f4fde..ce3fb90b4 100644 --- a/TR5Main/Objects/TR4/Entity/tr4_wraith.cpp +++ b/TR5Main/Objects/TR4/Entity/tr4_wraith.cpp @@ -31,7 +31,7 @@ namespace TEN::Entities::TR4 item->Data = WraithInfo(); auto* wraith = (WraithInfo*)item->Data; - item->VerticalVelocity = WraithVelocity; + item->Animation.VerticalVelocity = WraithVelocity; item->ItemFlags[0] = 0; item->ItemFlags[6] = 0; @@ -93,7 +93,7 @@ namespace TEN::Entities::TR4 angleV -= item->Position.xRot; - int velocity = 8 * (WraithVelocity / item->VerticalVelocity); + int velocity = 8 * (WraithVelocity / item->Animation.VerticalVelocity); if (abs(angleH) >= item->ItemFlags[2] || angleH > 0 != item->ItemFlags[2] > 0) { @@ -151,9 +151,9 @@ namespace TEN::Entities::TR4 oldY = item->Position.yPos; oldZ = item->Position.zPos; - item->Position.xPos += item->VerticalVelocity * phd_sin(item->Position.yRot); - item->Position.yPos += item->VerticalVelocity * phd_sin(item->Position.xRot); - item->Position.zPos += item->VerticalVelocity * phd_cos(item->Position.yRot); + item->Position.xPos += item->Animation.VerticalVelocity * phd_sin(item->Position.yRot); + item->Position.yPos += item->Animation.VerticalVelocity * phd_sin(item->Position.xRot); + item->Position.zPos += item->Animation.VerticalVelocity * phd_cos(item->Position.yRot); auto outsideRoom = IsRoomOutside(item->Position.xPos, item->Position.yPos, item->Position.zPos); if (item->RoomNumber != outsideRoom && outsideRoom != NO_ROOM) @@ -223,8 +223,8 @@ namespace TEN::Entities::TR4 { if (Wibble & 16) { - if (item->VerticalVelocity < WraithVelocity) - item->VerticalVelocity++; + if (item->Animation.VerticalVelocity < WraithVelocity) + item->Animation.VerticalVelocity++; if (item->ItemFlags[6]) { @@ -235,8 +235,8 @@ namespace TEN::Entities::TR4 } else { - if (item->VerticalVelocity > 32) - item->VerticalVelocity -= 12; + if (item->Animation.VerticalVelocity > 32) + item->Animation.VerticalVelocity -= 12; if (target == LaraItem) { @@ -266,7 +266,7 @@ namespace TEN::Entities::TR4 target->HitPoints = 0; if (target->TriggerFlags > 0) - target->FrameNumber = g_Level.Anims[target->AnimNumber].frameBase; + target->Animation.FrameNumber = g_Level.Anims[target->Animation.AnimNumber].frameBase; KillItem(itemNumber); } diff --git a/TR5Main/Objects/TR4/Floor/tr4_burningfloor.cpp b/TR5Main/Objects/TR4/Floor/tr4_burningfloor.cpp index a6267871e..eb8b853f4 100644 --- a/TR5Main/Objects/TR4/Floor/tr4_burningfloor.cpp +++ b/TR5Main/Objects/TR4/Floor/tr4_burningfloor.cpp @@ -5,7 +5,7 @@ void InitialiseBurningFloor(short itemNumber) { - g_Level.Items[itemNumber].RequiredState = 127; + g_Level.Items[itemNumber].Animation.RequiredState = 127; } void BurningFloorControl(short itemNumber) diff --git a/TR5Main/Objects/TR4/Object/tr4_clockwork_beetle.cpp b/TR5Main/Objects/TR4/Object/tr4_clockwork_beetle.cpp index 29fc04ad1..90f70188f 100644 --- a/TR5Main/Objects/TR4/Object/tr4_clockwork_beetle.cpp +++ b/TR5Main/Objects/TR4/Object/tr4_clockwork_beetle.cpp @@ -13,17 +13,17 @@ void ClockworkBeetleControl(short itemNumber) int flag = 0; - if (LaraItem->AnimNumber == LA_MECHANICAL_BEETLE_USE) + if (LaraItem->Animation.AnimNumber == LA_MECHANICAL_BEETLE_USE) { short fb = g_Level.Anims[LA_MECHANICAL_BEETLE_USE].frameBase; - if (LaraItem->FrameNumber < fb + 14) + if (LaraItem->Animation.FrameNumber < fb + 14) { beetle->Status = ITEM_INVISIBLE; return; } - if (LaraItem->FrameNumber < fb + 104) + if (LaraItem->Animation.FrameNumber < fb + 104) { PHD_VECTOR pos = { 0, 0, -32 }; GetLaraJointPosition(&pos, LM_RHAND); @@ -37,7 +37,7 @@ void ClockworkBeetleControl(short itemNumber) return; } - if (LaraItem->FrameNumber == fb + 104) + if (LaraItem->Animation.FrameNumber == fb + 104) { short roomNumber = beetle->RoomNumber; FLOOR_INFO* floor = GetFloor(beetle->Position.xPos, beetle->Position.yPos, beetle->Position.zPos, &roomNumber); @@ -56,8 +56,8 @@ void ClockworkBeetleControl(short itemNumber) SoundEffect(SFX_TR4_BEETLARA_WINDUP, &beetle->Position, 0); - beetle->VerticalVelocity += 12; - beetle->Position.yPos += beetle->VerticalVelocity; + beetle->Animation.VerticalVelocity += 12; + beetle->Position.yPos += beetle->Animation.VerticalVelocity; short roomNumber = beetle->RoomNumber; FLOOR_INFO* floor = GetFloor(beetle->Position.xPos, beetle->Position.yPos - 20, beetle->Position.zPos, &roomNumber); @@ -67,10 +67,10 @@ void ClockworkBeetleControl(short itemNumber) { beetle->Position.yPos = height; - if (beetle->VerticalVelocity <= 32) - beetle->VerticalVelocity = 0; + if (beetle->Animation.VerticalVelocity <= 32) + beetle->Animation.VerticalVelocity = 0; else - beetle->VerticalVelocity = -beetle->VerticalVelocity >> 1; + beetle->Animation.VerticalVelocity = -beetle->Animation.VerticalVelocity >> 1; flag = 1; } @@ -140,22 +140,22 @@ void ClockworkBeetleControl(short itemNumber) if (pow(x, 2) + pow(z, 2) >= 0x19000) { - if (beetle->Velocity < 32) - beetle->Velocity++; + if (beetle->Animation.Velocity < 32) + beetle->Animation.Velocity++; } else { - if (beetle->Velocity <= 4) + if (beetle->Animation.Velocity <= 4) { - if (beetle->Velocity < 4) - beetle->Velocity++; + if (beetle->Animation.Velocity < 4) + beetle->Animation.Velocity++; } else - beetle->Velocity = beetle->Velocity - (beetle->ItemFlags[2] == 4) - 1; + beetle->Animation.Velocity = beetle->Animation.Velocity - (beetle->ItemFlags[2] == 4) - 1; } - beetle->Position.xPos += beetle->Velocity * phd_sin(beetle->Position.yRot); - beetle->Position.zPos += beetle->Velocity * phd_cos(beetle->Position.yRot); + beetle->Position.xPos += beetle->Animation.Velocity * phd_sin(beetle->Position.yRot); + beetle->Position.zPos += beetle->Animation.Velocity * phd_cos(beetle->Position.yRot); } else { @@ -233,11 +233,11 @@ void ClockworkBeetleControl(short itemNumber) case 3: { - if (beetle->Velocity < 32) - beetle->Velocity++; + if (beetle->Animation.Velocity < 32) + beetle->Animation.Velocity++; - beetle->Position.xPos += beetle->Velocity * phd_sin(beetle->Position.yRot); - beetle->Position.zPos += beetle->Velocity * phd_cos(beetle->Position.yRot); + beetle->Position.xPos += beetle->Animation.Velocity * phd_sin(beetle->Position.yRot); + beetle->Position.zPos += beetle->Animation.Velocity * phd_cos(beetle->Position.yRot); if (!floor->Flags.MarkBeetle) beetle->ItemFlags[3] = 1; @@ -275,7 +275,7 @@ void ClockworkBeetleControl(short itemNumber) if (flag && beetle->ItemFlags[3] > 30 && val) { - beetle->VerticalVelocity = -((val >> 1) + GetRandomControl() % val); + beetle->Animation.VerticalVelocity = -((val >> 1) + GetRandomControl() % val); return; } } @@ -287,7 +287,7 @@ void ClockworkBeetleControl(short itemNumber) if (flag && val) { - beetle->VerticalVelocity = -((val >> 1) + GetRandomControl() % val); + beetle->Animation.VerticalVelocity = -((val >> 1) + GetRandomControl() % val); return; } @@ -304,8 +304,8 @@ void ClockworkBeetleControl(short itemNumber) void UseClockworkBeetle(short flag) { if (flag || - LaraItem->ActiveState == LS_IDLE && - LaraItem->AnimNumber == LA_STAND_IDLE && + LaraItem->Animation.ActiveState == LS_IDLE && + LaraItem->Animation.AnimNumber == LA_STAND_IDLE && !LaraItem->HitStatus && Lara.Control.HandStatus == HandStatus::Free) { @@ -333,7 +333,7 @@ void UseClockworkBeetle(short flag) else item->ItemFlags[0] = 0; - item->Velocity = 0; + item->Animation.Velocity = 0; AddActiveItem(itemNumber); if (item->ItemFlags[0]) diff --git a/TR5Main/Objects/TR4/Object/tr4_element_puzzle.cpp b/TR5Main/Objects/TR4/Object/tr4_element_puzzle.cpp index e66d43a2a..6ea48331f 100644 --- a/TR5Main/Objects/TR4/Object/tr4_element_puzzle.cpp +++ b/TR5Main/Objects/TR4/Object/tr4_element_puzzle.cpp @@ -175,8 +175,8 @@ namespace TEN::Entities::TR4 else flags = 25; - if ((laraItem->AnimNumber == LA_WATERSKIN_POUR_LOW || - laraItem->AnimNumber == LA_WATERSKIN_POUR_HIGH) && + if ((laraItem->Animation.AnimNumber == LA_WATERSKIN_POUR_LOW || + laraItem->Animation.AnimNumber == LA_WATERSKIN_POUR_HIGH) && !puzzleItem->ItemFlags[0]) { auto* box = GetBoundsAccurate(puzzleItem); @@ -191,13 +191,13 @@ namespace TEN::Entities::TR4 if (TestLaraPosition(&ElementPuzzleBounds, puzzleItem, laraItem)) { - if (laraItem->AnimNumber == LA_WATERSKIN_POUR_LOW && LaraItem->ItemFlags[2] == flags) + if (laraItem->Animation.AnimNumber == LA_WATERSKIN_POUR_LOW && LaraItem->ItemFlags[2] == flags) { - laraItem->AnimNumber = LA_WATERSKIN_POUR_HIGH; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_WATERSKIN_POUR_HIGH; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; } - if (laraItem->FrameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74 && + if (laraItem->Animation.FrameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74 && LaraItem->ItemFlags[2] == flags) { if (!puzzleItem->TriggerFlags) @@ -235,12 +235,12 @@ namespace TEN::Entities::TR4 !(TrInput & IN_ACTION) || puzzleItem->TriggerFlags != 1 || puzzleItem->ItemFlags[0] != 1 || - laraItem->ActiveState != LS_IDLE || - laraItem->AnimNumber != LA_STAND_IDLE || + laraItem->Animation.ActiveState != LS_IDLE || + laraItem->Animation.AnimNumber != LA_STAND_IDLE || !laraInfo->LitTorch || - laraItem->Airborne) + laraItem->Animation.Airborne) { - if (laraItem->AnimNumber != LA_TORCH_LIGHT_3 || + if (laraItem->Animation.AnimNumber != LA_TORCH_LIGHT_3 || g_Level.Anims[LA_TORCH_LIGHT_3].frameBase + 16 || puzzleItem->ItemFlags[0] != 2) { @@ -269,9 +269,9 @@ namespace TEN::Entities::TR4 if (TestLaraPosition(&ElementPuzzleBounds, puzzleItem, laraItem)) { - laraItem->AnimNumber = (abs(puzzleItem->Position.yPos - laraItem->Position.yPos) >> 8) + LA_TORCH_LIGHT_3; - laraItem->FrameNumber = g_Level.Anims[puzzleItem->AnimNumber].frameBase; - laraItem->ActiveState = LS_MISC_CONTROL; + laraItem->Animation.AnimNumber = (abs(puzzleItem->Position.yPos - laraItem->Position.yPos) >> 8) + LA_TORCH_LIGHT_3; + laraItem->Animation.FrameNumber = g_Level.Anims[puzzleItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = LS_MISC_CONTROL; laraInfo->Flare.ControlLeft = false; laraInfo->LeftArm.Locked = true; puzzleItem->ItemFlags[0] = 2; diff --git a/TR5Main/Objects/TR4/Object/tr4_mapper.cpp b/TR5Main/Objects/TR4/Object/tr4_mapper.cpp index 61acae080..bb5a20ac6 100644 --- a/TR5Main/Objects/TR4/Object/tr4_mapper.cpp +++ b/TR5Main/Objects/TR4/Object/tr4_mapper.cpp @@ -24,7 +24,7 @@ namespace TEN::Entities::TR4 if (!TriggerActive(item)) return; - if (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase >= 200) + if (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase >= 200) { SoundEffect(SFX_TR4_MAPPER_LAZER, &item->Position, 0); diff --git a/TR5Main/Objects/TR4/Object/tr4_obelisk.cpp b/TR5Main/Objects/TR4/Object/tr4_obelisk.cpp index 5bdb25a3f..8120e3c4f 100644 --- a/TR5Main/Objects/TR4/Object/tr4_obelisk.cpp +++ b/TR5Main/Objects/TR4/Object/tr4_obelisk.cpp @@ -17,8 +17,8 @@ void InitialiseObelisk(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 3;; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 3;; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; AddActiveItem(itemNumber); item->Status = ITEM_ACTIVE; @@ -166,40 +166,40 @@ void ObeliskControl(short itemNumber) auto* obj = &Objects[item->ObjectNumber]; bool flag = false; - if (item->AnimNumber == obj->animIndex + 2) + if (item->Animation.AnimNumber == obj->animIndex + 2) { item->Position.yRot -= ANGLE(90.0f); if (TrInput & IN_ACTION) { - item->AnimNumber = obj->animIndex + 1; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = obj->animIndex + 1; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } else flag = true; } - if (item->AnimNumber == obj->animIndex + 6) + if (item->Animation.AnimNumber == obj->animIndex + 6) { item->Position.yRot += ANGLE(90.0f); if (!(TrInput & IN_ACTION)) { - item->AnimNumber = obj->animIndex + 3; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = obj->animIndex + 3; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; flag = false; } else { - item->AnimNumber = obj->animIndex + 5; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = obj->animIndex + 5; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } if (flag) { - item->AnimNumber = obj->animIndex + 3; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = obj->animIndex + 3; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } if (item->TriggerFlags == 2) diff --git a/TR5Main/Objects/TR4/Object/tr4_sarcophagus.cpp b/TR5Main/Objects/TR4/Object/tr4_sarcophagus.cpp index c1ab8d5ce..6b26583a3 100644 --- a/TR5Main/Objects/TR4/Object/tr4_sarcophagus.cpp +++ b/TR5Main/Objects/TR4/Object/tr4_sarcophagus.cpp @@ -32,8 +32,8 @@ void SarcophagusCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll auto* sarcItem = &g_Level.Items[itemNumber]; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && laraInfo->Control.HandStatus == HandStatus::Free && sarcItem->Status != ITEM_ACTIVE || laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber) @@ -42,9 +42,9 @@ void SarcophagusCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll { if (MoveLaraPosition(&SarcophagusPosition, sarcItem, laraItem)) { - laraItem->AnimNumber = LA_PICKUP_SARCOPHAGUS; - laraItem->ActiveState = LS_MISC_CONTROL; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_PICKUP_SARCOPHAGUS; + laraItem->Animation.ActiveState = LS_MISC_CONTROL; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; sarcItem->Flags |= IFLAG_ACTIVATION_MASK; AddActiveItem(itemNumber); @@ -66,8 +66,8 @@ void SarcophagusCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll } } } - else if (laraItem->AnimNumber != LA_PICKUP_SARCOPHAGUS || - laraItem->FrameNumber != g_Level.Anims[LA_PICKUP_SARCOPHAGUS].frameBase + 113) + else if (laraItem->Animation.AnimNumber != LA_PICKUP_SARCOPHAGUS || + laraItem->Animation.FrameNumber != g_Level.Anims[LA_PICKUP_SARCOPHAGUS].frameBase + 113) { ObjectCollision(itemNumber, laraItem, coll); } diff --git a/TR5Main/Objects/TR4/Object/tr4_scales.cpp b/TR5Main/Objects/TR4/Object/tr4_scales.cpp index b04de32a6..b95794f7b 100644 --- a/TR5Main/Objects/TR4/Object/tr4_scales.cpp +++ b/TR5Main/Objects/TR4/Object/tr4_scales.cpp @@ -29,13 +29,13 @@ void ScalesControl(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - if (item->FrameNumber != g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameEnd) { AnimateItem(item); return; } - if (item->ActiveState == 1 || item->ItemFlags[1]) + if (item->Animation.ActiveState == 1 || item->ItemFlags[1]) { if (Objects[item->ObjectNumber].animIndex) { @@ -63,7 +63,7 @@ void ScalesControl(short itemNumber) g_Level.Items[itemNos[sw]].Flags = 1024; } - item->TargetState = 1; + item->Animation.TargetState = 1; } AnimateItem(item); @@ -71,7 +71,7 @@ void ScalesControl(short itemNumber) int flags = 0; - if (item->ActiveState == 2) + if (item->Animation.ActiveState == 2) { flags = -512; RemoveActiveItem(itemNumber); @@ -93,7 +93,7 @@ void ScalesCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (TestBoundsCollide(item, laraItem, LARA_RAD)) { - if (laraItem->AnimNumber != LA_WATERSKIN_POUR_LOW && laraItem->AnimNumber != LA_WATERSKIN_POUR_HIGH || item->ActiveState != 1) + if (laraItem->Animation.AnimNumber != LA_WATERSKIN_POUR_LOW && laraItem->Animation.AnimNumber != LA_WATERSKIN_POUR_HIGH || item->Animation.ActiveState != 1) { GlobalCollisionBounds.X1 = 640; GlobalCollisionBounds.X2 = 1280; @@ -126,42 +126,42 @@ void ScalesCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) if (TestLaraPosition(&ScalesBounds, item, laraItem)) { - laraItem->AnimNumber = LA_WATERSKIN_POUR_HIGH; - laraItem->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_WATERSKIN_POUR_HIGH; + laraItem->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; item->Position.yRot = rotY; } - else if (laraItem->FrameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 51) + else if (laraItem->Animation.FrameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 51) { SoundEffect(SFX_TR4_POUR, &laraItem->Position, 0); item->Position.yRot = rotY; } - else if (laraItem->FrameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74) + else if (laraItem->Animation.FrameNumber == g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74) { AddActiveItem(itemNumber); item->Status = ITEM_ACTIVE; if (laraItem->ItemFlags[3] < item->TriggerFlags) { - item->TargetState = 4; + item->Animation.TargetState = 4; item->Position.yRot = rotY; } else if (laraItem->ItemFlags[3] == item->TriggerFlags) { - item->TargetState = 2; + item->Animation.TargetState = 2; item->Position.yRot = rotY; } else - item->TargetState = 3; + item->Animation.TargetState = 3; } else item->Position.yRot = rotY; } } - if (laraItem->FrameNumber >= g_Level.Anims[LA_WATERSKIN_POUR_LOW].frameBase + 44 && - laraItem->FrameNumber <= g_Level.Anims[LA_WATERSKIN_POUR_LOW].frameBase + 72 || - laraItem->FrameNumber >= g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 51 && - laraItem->FrameNumber <= g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74) + if (laraItem->Animation.FrameNumber >= g_Level.Anims[LA_WATERSKIN_POUR_LOW].frameBase + 44 && + laraItem->Animation.FrameNumber <= g_Level.Anims[LA_WATERSKIN_POUR_LOW].frameBase + 72 || + laraItem->Animation.FrameNumber >= g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 51 && + laraItem->Animation.FrameNumber <= g_Level.Anims[LA_WATERSKIN_POUR_HIGH].frameBase + 74) { PHD_VECTOR pos = { 0, 0, 0 }; GetLaraJointPosition(&pos, LM_LHAND); diff --git a/TR5Main/Objects/TR4/Object/tr4_senet.cpp b/TR5Main/Objects/TR4/Object/tr4_senet.cpp index 86699905c..307aeecf5 100644 --- a/TR5Main/Objects/TR4/Object/tr4_senet.cpp +++ b/TR5Main/Objects/TR4/Object/tr4_senet.cpp @@ -425,8 +425,8 @@ void GameSticksCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) ITEM_INFO* item = &g_Level.Items[itemNumber]; if (TrInput & IN_ACTION && - laraItem->ActiveState == LS_IDLE && - laraItem->AnimNumber == LA_STAND_IDLE && + laraItem->Animation.ActiveState == LS_IDLE && + laraItem->Animation.AnimNumber == LA_STAND_IDLE && Lara.Control.HandStatus == HandStatus::Free && !item->Active || Lara.Control.IsMoving && Lara.InteractedItem == itemNumber) { @@ -436,9 +436,9 @@ void GameSticksCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) { if (MoveLaraPosition(&GameStixPosition, item, laraItem)) { - laraItem->AnimNumber = LA_SENET_ROLL; - laraItem->FrameNumber = g_Level.Anims[LA_SENET_ROLL].frameBase; - laraItem->ActiveState = LS_MISC_CONTROL; + laraItem->Animation.AnimNumber = LA_SENET_ROLL; + laraItem->Animation.FrameNumber = g_Level.Anims[LA_SENET_ROLL].frameBase; + laraItem->Animation.ActiveState = LS_MISC_CONTROL; Lara.Control.IsMoving = false; Lara.ExtraTorsoRot = { 0, 0, 0 }; Lara.Control.HandStatus = HandStatus::Busy; diff --git a/TR5Main/Objects/TR4/Trap/tr4_birdblade.cpp b/TR5Main/Objects/TR4/Trap/tr4_birdblade.cpp index 71755d27d..c09f226f1 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_birdblade.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_birdblade.cpp @@ -15,12 +15,12 @@ namespace TEN::Entities::TR4 if (!TriggerActive(item)) { - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; *((int*)&item->ItemFlags[0]) = 0; } else { - int frameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if (frameNumber <= 14 || frameNumber >= 31) *((int*)&item->ItemFlags[0]) = 0; diff --git a/TR5Main/Objects/TR4/Trap/tr4_catwalkblade.cpp b/TR5Main/Objects/TR4/Trap/tr4_catwalkblade.cpp index 6607397b9..97ae3b85c 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_catwalkblade.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_catwalkblade.cpp @@ -12,12 +12,12 @@ namespace TEN::Entities::TR4 auto* item = &g_Level.Items[itemNumber]; if (!TriggerActive(item)) - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; else { - int frameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd || frameNumber < 38) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd || frameNumber < 38) item->ItemFlags[3] = 0; else item->ItemFlags[3] = 100; diff --git a/TR5Main/Objects/TR4/Trap/tr4_cog.cpp b/TR5Main/Objects/TR4/Trap/tr4_cog.cpp index 3752c8ca2..bd37653d5 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_cog.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_cog.cpp @@ -27,7 +27,7 @@ namespace TEN::Entities::TR4 GetJointAbsPosition(item, &pos, 0); SoundEffect(65, (PHD_3DPOS*)&pos, 0); - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) item->Flags &= 0xC1; } } diff --git a/TR5Main/Objects/TR4/Trap/tr4_fourblades.cpp b/TR5Main/Objects/TR4/Trap/tr4_fourblades.cpp index 603a8b670..28d8a671e 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_fourblades.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_fourblades.cpp @@ -13,12 +13,12 @@ namespace TEN::Entities::TR4 if (!TriggerActive(item)) { - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; *((int*)&item->ItemFlags[0]) = 0; } else { - int frameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if (frameNumber <= 5 || frameNumber >= 58 || frameNumber >= 8 && frameNumber <= 54) diff --git a/TR5Main/Objects/TR4/Trap/tr4_joby_spikes.cpp b/TR5Main/Objects/TR4/Trap/tr4_joby_spikes.cpp index 9b9c23cc5..751434fd2 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_joby_spikes.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_joby_spikes.cpp @@ -16,8 +16,8 @@ namespace TEN::Entities::TR4 auto* item = &g_Level.Items[itemNumber]; // Set bone mutators to 0 by default - for (int i = 0; i < item->Mutator.size(); i++) - item->Mutator[i].Scale.y = 0.0f; + for (int i = 0; i < item->Animation.Mutator.size(); i++) + item->Animation.Mutator[i].Scale.y = 0.0f; item->Position.yRot = GetRandomControl() * 1024; item->ItemFlags[2] = GetRandomControl() & 1; @@ -81,8 +81,8 @@ namespace TEN::Entities::TR4 // Update bone mutators if (item->ItemFlags[1]) { - for (int i = 0; i < item->Mutator.size(); i++) - item->Mutator[i].Scale = Vector3(1.0f, item->ItemFlags[1] / 4096.0f, 1.0f); + for (int i = 0; i < item->Animation.Mutator.size(); i++) + item->Animation.Mutator[i].Scale = Vector3(1.0f, item->ItemFlags[1] / 4096.0f, 1.0f); } } } diff --git a/TR5Main/Objects/TR4/Trap/tr4_mine.cpp b/TR5Main/Objects/TR4/Trap/tr4_mine.cpp index ee5bc4aaf..10b5fe053 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_mine.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_mine.cpp @@ -95,8 +95,8 @@ namespace TEN::Entities::TR4 if (mineItem->TriggerFlags && !mineItem->ItemFlags[3]) { - if (laraItem->AnimNumber != LA_DETONATOR_USE || - laraItem->FrameNumber < g_Level.Anims[laraItem->AnimNumber].frameBase + 57) + if (laraItem->Animation.AnimNumber != LA_DETONATOR_USE || + laraItem->Animation.FrameNumber < g_Level.Anims[laraItem->Animation.AnimNumber].frameBase + 57) { if (TestBoundsCollide(mineItem, laraItem, 512)) { @@ -109,10 +109,10 @@ namespace TEN::Entities::TR4 ExplodeItemNode(mineItem, 0, 0, 128); KillItem(itemNumber); - laraItem->AnimNumber = LA_MINE_DEATH; - laraItem->FrameNumber = g_Level.Anims[mineItem->AnimNumber].frameBase; - laraItem->ActiveState = LS_DEATH; - laraItem->Velocity = 0; + laraItem->Animation.AnimNumber = LA_MINE_DEATH; + laraItem->Animation.FrameNumber = g_Level.Anims[mineItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = LS_DEATH; + laraItem->Animation.Velocity = 0; SoundEffect(SFX_TR4_MINE_EXP_OVERLAY, &mineItem->Position, 0); } diff --git a/TR5Main/Objects/TR4/Trap/tr4_moving_blade.cpp b/TR5Main/Objects/TR4/Trap/tr4_moving_blade.cpp index c22486d13..495056ee7 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_moving_blade.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_moving_blade.cpp @@ -21,6 +21,6 @@ namespace TEN::Entities::TR4 AnimateItem(item); } else - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } diff --git a/TR5Main/Objects/TR4/Trap/tr4_plinthblade.cpp b/TR5Main/Objects/TR4/Trap/tr4_plinthblade.cpp index ee528cf17..98030d51e 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_plinthblade.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_plinthblade.cpp @@ -12,12 +12,12 @@ namespace TEN::Entities::TR4 auto* item = &g_Level.Items[itemNumber]; if (!TriggerActive(item)) - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; else { - int frameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) item->ItemFlags[3] = 0; else item->ItemFlags[3] = 200; diff --git a/TR5Main/Objects/TR4/Trap/tr4_sethblade.cpp b/TR5Main/Objects/TR4/Trap/tr4_sethblade.cpp index 08777289f..dba7ffec1 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_sethblade.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_sethblade.cpp @@ -12,10 +12,10 @@ namespace TEN::Entities::TR4 { auto* item = &g_Level.Items[itemNumber]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; - item->TargetState = 2; - item->ActiveState = 2; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.TargetState = 2; + item->Animation.ActiveState = 2; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; item->ItemFlags[2] = abs(item->TriggerFlags); } @@ -27,13 +27,13 @@ namespace TEN::Entities::TR4 if (TriggerActive(item)) { - if (item->ActiveState == 2) + if (item->Animation.ActiveState == 2) { if (item->ItemFlags[2] > 1) item->ItemFlags[2]--; else if (item->ItemFlags[2] == 1) { - item->TargetState = 1; + item->Animation.TargetState = 1; item->ItemFlags[2] = 0; } else if (item->ItemFlags[2] == 0) @@ -44,7 +44,7 @@ namespace TEN::Entities::TR4 } else { - int frameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if (frameNumber >= 0 && frameNumber <= 6) { diff --git a/TR5Main/Objects/TR4/Trap/tr4_spikeball.cpp b/TR5Main/Objects/TR4/Trap/tr4_spikeball.cpp index 3bfc47888..266cf3447 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_spikeball.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_spikeball.cpp @@ -13,7 +13,7 @@ namespace TEN::Entities::TR4 if (TriggerActive(item)) { - int frameNumber = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int frameNumber = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if ((frameNumber <= 14 || frameNumber >= 24) && (frameNumber < 138 || frameNumber > 140)) @@ -36,7 +36,7 @@ namespace TEN::Entities::TR4 } else { - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; *((int*)&item->ItemFlags[0]) = 0; } } diff --git a/TR5Main/Objects/TR4/Trap/tr4_teethspike.cpp b/TR5Main/Objects/TR4/Trap/tr4_teethspike.cpp index e07b456e9..c7a179d94 100644 --- a/TR5Main/Objects/TR4/Trap/tr4_teethspike.cpp +++ b/TR5Main/Objects/TR4/Trap/tr4_teethspike.cpp @@ -34,8 +34,8 @@ namespace TEN::Entities::TR4 item->Status = ITEM_INVISIBLE; // Set mutators to 0 by default - for (int i = 0; i < item->Mutator.size(); i++) - item->Mutator[i].Scale.y = 0.0f; + for (int i = 0; i < item->Animation.Mutator.size(); i++) + item->Animation.Mutator[i].Scale.y = 0.0f; short rotations[8] = { @@ -128,17 +128,17 @@ namespace TEN::Entities::TR4 int bloodCount = 0; - if ((item->ItemFlags[0] > 1024 || LaraItem->Airborne) + if ((item->ItemFlags[0] > 1024 || LaraItem->Animation.Airborne) && (item->TriggerFlags & 7) > 2 && (item->TriggerFlags & 7) < 6) { - if (LaraItem->VerticalVelocity > 6 || item->ItemFlags[0] > 1024) + if (LaraItem->Animation.VerticalVelocity > 6 || item->ItemFlags[0] > 1024) { LaraItem->HitPoints = -1; bloodCount = 20; } } - else if (LaraItem->Velocity >= 30) + else if (LaraItem->Animation.Velocity >= 30) { LaraItem->HitPoints -= 8; bloodCount = (GetRandomControl() & 3) + 2; @@ -187,11 +187,11 @@ namespace TEN::Entities::TR4 height -= LaraItem->Position.yPos; if (item->Position.yPos >= LaraItem->Position.yPos && height < 50) { - LaraItem->AnimNumber = LA_SPIKE_DEATH; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; - LaraItem->ActiveState = LS_DEATH; - LaraItem->TargetState = LS_DEATH; - LaraItem->Airborne = false; + LaraItem->Animation.AnimNumber = LA_SPIKE_DEATH; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; + LaraItem->Animation.ActiveState = LS_DEATH; + LaraItem->Animation.TargetState = LS_DEATH; + LaraItem->Animation.Airborne = false; } } } @@ -247,8 +247,8 @@ namespace TEN::Entities::TR4 // Update bone mutators if (item->ItemFlags[1]) { - for (int i = 0; i < item->Mutator.size(); i++) - item->Mutator[i].Scale = Vector3(1.0f, item->ItemFlags[1] / 4096.0f, 1.0f); + for (int i = 0; i < item->Animation.Mutator.size(); i++) + item->Animation.Mutator[i].Scale = Vector3(1.0f, item->ItemFlags[1] / 4096.0f, 1.0f); } } } diff --git a/TR5Main/Objects/TR4/Vehicles/jeep.cpp b/TR5Main/Objects/TR4/Vehicles/jeep.cpp index bf8cbbb88..47213a04f 100644 --- a/TR5Main/Objects/TR4/Vehicles/jeep.cpp +++ b/TR5Main/Objects/TR4/Vehicles/jeep.cpp @@ -395,15 +395,15 @@ void InitialiseJeep(short itemNum) static int JeepCheckGetOff() { - if (LaraItem->ActiveState == JS_GETOFF) + if (LaraItem->Animation.ActiveState == JS_GETOFF) { - if (LaraItem->FrameNumber == g_Level.Anims[LaraItem->AnimNumber].frameEnd) + if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameEnd) { LaraItem->Position.yRot += ANGLE(90); - LaraItem->AnimNumber = LA_STAND_SOLID; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; - LaraItem->TargetState = LS_IDLE; - LaraItem->ActiveState = LS_IDLE; + LaraItem->Animation.AnimNumber = LA_STAND_SOLID; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; + LaraItem->Animation.TargetState = LS_IDLE; + LaraItem->Animation.ActiveState = LS_IDLE; LaraItem->Position.xPos -= JEEP_GETOFF_DISTANCE * phd_sin(LaraItem->Position.yRot); LaraItem->Position.zPos -= JEEP_GETOFF_DISTANCE * phd_cos(LaraItem->Position.yRot); LaraItem->Position.xRot = 0; @@ -430,13 +430,13 @@ static int GetOnJeep(int itemNumber) if (Lara.Control.HandStatus != HandStatus::Free) return 0; - if (LaraItem->ActiveState != LS_IDLE) + if (LaraItem->Animation.ActiveState != LS_IDLE) return 0; - if (LaraItem->AnimNumber != LA_STAND_IDLE) + if (LaraItem->Animation.AnimNumber != LA_STAND_IDLE) return 0; - if (LaraItem->Airborne) + if (LaraItem->Animation.Airborne) return 0; if (abs(item->Position.yPos - LaraItem->Position.yPos) >= STEP_SIZE) @@ -699,7 +699,7 @@ int JeepDynamics(ITEM_INFO* item) if (rot > 13650) { item->Position.yPos -= 41; - item->VerticalVelocity = -6 - (GetRandomControl() & 3); + item->Animation.VerticalVelocity = -6 - (GetRandomControl() & 3); jeep->jeepTurn = 0; jeep->velocity -= (jeep->velocity / 8); } @@ -715,7 +715,7 @@ int JeepDynamics(ITEM_INFO* item) if (rot < -13650) { item->Position.yPos -= 41; - item->VerticalVelocity = -6 - (GetRandomControl() & 3); + item->Animation.VerticalVelocity = -6 - (GetRandomControl() & 3); jeep->jeepTurn = 0; jeep->velocity -= (jeep->velocity / 8); } @@ -733,9 +733,9 @@ int JeepDynamics(ITEM_INFO* item) short speed; if (item->Position.yPos < height) - speed = item->Velocity; + speed = item->Animation.Velocity; else - speed = item->Velocity * phd_cos(item->Position.xRot); + speed = item->Animation.Velocity * phd_cos(item->Position.xRot); item->Position.xPos += speed * phd_sin(jeep->momentumAngle); item->Position.zPos += speed * phd_cos(jeep->momentumAngle); @@ -879,7 +879,7 @@ int JeepDynamics(ITEM_INFO* item) static int JeepUserControl(ITEM_INFO* item, int height, int* pitch) { - if (LaraItem->ActiveState == JS_GETOFF || LaraItem->TargetState == JS_GETOFF) + if (LaraItem->Animation.ActiveState == JS_GETOFF || LaraItem->Animation.TargetState == JS_GETOFF) TrInput = 0; JeepInfo* jeep = (JeepInfo*)item->Data; @@ -995,7 +995,7 @@ static int JeepUserControl(ITEM_INFO* item, int height, int* pitch) else jeep->velocity = 0; - item->Velocity = jeep->velocity / 256; + item->Animation.Velocity = jeep->velocity / 256; if (jeep->engineRevs > 0xC000) jeep->engineRevs = (GetRandomControl() & 0x1FF) + 48896; @@ -1029,25 +1029,25 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) JeepInfo* jeep = (JeepInfo*)item->Data; bool dismount; if (item->Position.yPos != item->Floor && - LaraItem->ActiveState != JS_JUMP && - LaraItem->ActiveState != JS_LAND && + LaraItem->Animation.ActiveState != JS_JUMP && + LaraItem->Animation.ActiveState != JS_LAND && !dead) { if (jeep->unknown2 == 1) - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_JUMP_START; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_JUMP_START; else - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_FWD_JUMP_START; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_FWD_JUMP_START; - LaraItem->ActiveState = JS_JUMP; - LaraItem->TargetState = JS_JUMP; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.ActiveState = JS_JUMP; + LaraItem->Animation.TargetState = JS_JUMP; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; } else if ( (collide) && - (LaraItem->ActiveState != 4) && - (LaraItem->ActiveState != 5) && - (LaraItem->ActiveState != 2) && - (LaraItem->ActiveState != 3) && - (LaraItem->ActiveState != JS_JUMP) && + (LaraItem->Animation.ActiveState != 4) && + (LaraItem->Animation.ActiveState != 5) && + (LaraItem->Animation.ActiveState != 2) && + (LaraItem->Animation.ActiveState != 3) && + (LaraItem->Animation.ActiveState != JS_JUMP) && (0x2AAA < (short)jeep->velocity) && (!dead) ) { @@ -1056,36 +1056,36 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) { case 13: state = 4; - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + 11; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + 11; break; case 14: state = 5; - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + 10; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + 10; break; case 11: state = 2; - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + 12; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + 12; break; case 12: state = 3; - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + 13; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + 13; break; } - LaraItem->ActiveState = state; - LaraItem->TargetState = state; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.ActiveState = state; + LaraItem->Animation.TargetState = state; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; } else { - switch (LaraItem->ActiveState) + switch (LaraItem->Animation.ActiveState) { case JS_STOP: if (dead) - LaraItem->TargetState = JS_DEATH; + LaraItem->Animation.TargetState = JS_DEATH; else { dismount = ((TrInput & JEEP_IN_BRAKE) && (TrInput & IN_LEFT)) ? true : false; @@ -1094,7 +1094,7 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) !JeepNoGetOff) { if (JeepCanGetOff()) - LaraItem->TargetState = JS_GETOFF; + LaraItem->Animation.TargetState = JS_GETOFF; break; } @@ -1110,7 +1110,7 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) { jeep->unknown2++; if (jeep->unknown2 == 1) - LaraItem->TargetState = JS_DRIVE_BACK; + LaraItem->Animation.TargetState = JS_DRIVE_BACK; break; } } @@ -1118,13 +1118,13 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) { if ((TrInput & JEEP_IN_ACCELERATE) && !(TrInput & JEEP_IN_BRAKE)) { - LaraItem->TargetState = JS_DRIVE_FORWARD; + LaraItem->Animation.TargetState = JS_DRIVE_FORWARD; break; } else if (TrInput & (IN_LEFT | IN_LSTEP)) - LaraItem->TargetState = JS_FWD_LEFT; + LaraItem->Animation.TargetState = JS_FWD_LEFT; else if (TrInput & (IN_RIGHT | IN_RSTEP)) - LaraItem->TargetState = JS_FWD_RIGHT; + LaraItem->Animation.TargetState = JS_FWD_RIGHT; } /* if (!(DbInput & IN_WALK)) @@ -1160,7 +1160,7 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) case JS_DRIVE_FORWARD: if (dead) - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; else { if (jeep->velocity & 0xFFFFFF00 || @@ -1169,20 +1169,20 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) if (TrInput & JEEP_IN_BRAKE) { if (jeep->velocity <= 21844) - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; else - LaraItem->TargetState = JS_BRAKE; + LaraItem->Animation.TargetState = JS_BRAKE; } else { if (TrInput & (IN_LEFT | IN_LSTEP)) - LaraItem->TargetState = JS_FWD_LEFT; + LaraItem->Animation.TargetState = JS_FWD_LEFT; else if (TrInput & (IN_RIGHT | IN_RSTEP)) - LaraItem->TargetState = JS_FWD_RIGHT; + LaraItem->Animation.TargetState = JS_FWD_RIGHT; } } else - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; } break; @@ -1192,28 +1192,28 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) case 4: case 5: if (dead) - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; else if (TrInput & (JEEP_IN_ACCELERATE | JEEP_IN_BRAKE)) - LaraItem->TargetState = JS_DRIVE_FORWARD; + LaraItem->Animation.TargetState = JS_DRIVE_FORWARD; break; case JS_BRAKE: if (dead) - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; else if (jeep->velocity & 0xFFFFFF00) { if (TrInput & (IN_LEFT | IN_LSTEP)) - LaraItem->TargetState = JS_FWD_LEFT; + LaraItem->Animation.TargetState = JS_FWD_LEFT; else if (TrInput & (IN_RIGHT | IN_RSTEP)) - LaraItem->TargetState = JS_FWD_RIGHT; + LaraItem->Animation.TargetState = JS_FWD_RIGHT; } else - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; break; case JS_FWD_LEFT: if (dead) - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; else if (!(DbInput & IN_WALK)) { if (DbInput & IN_SPRINT) @@ -1223,22 +1223,22 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) jeep->unknown2++; if (jeep->unknown2 == 1) { - LaraItem->TargetState = JS_BACK_RIGHT; - LaraItem->ActiveState = JS_BACK_RIGHT; - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_REVERSE_RIGHT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.TargetState = JS_BACK_RIGHT; + LaraItem->Animation.ActiveState = JS_BACK_RIGHT; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_REVERSE_RIGHT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; break; } } } else if (TrInput & (IN_RIGHT | IN_RSTEP)) - LaraItem->TargetState = JS_DRIVE_FORWARD; + LaraItem->Animation.TargetState = JS_DRIVE_FORWARD; else if (TrInput & (IN_LEFT | IN_LSTEP)) - LaraItem->TargetState = JS_FWD_LEFT; + LaraItem->Animation.TargetState = JS_FWD_LEFT; else if (jeep->velocity) - LaraItem->TargetState = JS_DRIVE_FORWARD; + LaraItem->Animation.TargetState = JS_DRIVE_FORWARD; else - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; } else { @@ -1246,18 +1246,18 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) jeep->unknown2--; } - if (LaraItem->AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_FWD_LEFT && + if (LaraItem->Animation.AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_FWD_LEFT && !jeep->velocity) { - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_START; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase + JA_IDLE; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_START; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase + JA_IDLE; } - if (LaraItem->AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_START) + if (LaraItem->Animation.AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_START) { if (jeep->velocity) { - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_FWD_LEFT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_FWD_LEFT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; } } @@ -1265,7 +1265,7 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) case JS_FWD_RIGHT: if (dead) - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; if (!(DbInput & IN_WALK)) { if (DbInput & IN_SPRINT) @@ -1275,22 +1275,22 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) jeep->unknown2++; if (jeep->unknown2 == 1) { - LaraItem->TargetState = JS_BACK_LEFT; - LaraItem->ActiveState = JS_BACK_LEFT; - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_REVERSE_LEFT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.TargetState = JS_BACK_LEFT; + LaraItem->Animation.ActiveState = JS_BACK_LEFT; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_REVERSE_LEFT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; break; } } } else if (TrInput & (IN_LEFT | IN_LSTEP)) - LaraItem->TargetState = JS_DRIVE_FORWARD; + LaraItem->Animation.TargetState = JS_DRIVE_FORWARD; else if (TrInput & (IN_RIGHT | IN_RSTEP)) - LaraItem->TargetState = JS_FWD_RIGHT; + LaraItem->Animation.TargetState = JS_FWD_RIGHT; else if (jeep->velocity) - LaraItem->TargetState = JS_DRIVE_FORWARD; + LaraItem->Animation.TargetState = JS_DRIVE_FORWARD; else - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; } else { @@ -1298,17 +1298,17 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) jeep->unknown2--; } - if (LaraItem->AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_FWD_RIGHT && !jeep->velocity) + if (LaraItem->Animation.AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_FWD_RIGHT && !jeep->velocity) { - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_LEFT_START; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase + 14;//hmm + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_LEFT_START; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase + 14;//hmm } - if (LaraItem->AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_LEFT_START) + if (LaraItem->Animation.AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_LEFT_START) { if (jeep->velocity) { - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_FWD_RIGHT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_FWD_RIGHT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; } } @@ -1316,29 +1316,29 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) case JS_JUMP: if (item->Position.yPos == item->Floor) - LaraItem->TargetState = JS_LAND; - else if (item->VerticalVelocity > 300) + LaraItem->Animation.TargetState = JS_LAND; + else if (item->Animation.VerticalVelocity > 300) jeep->flags |= JF_FALLING; break; case JS_BACK: if (dead) - LaraItem->TargetState = JS_DRIVE_BACK; + LaraItem->Animation.TargetState = JS_DRIVE_BACK; else if (abs(jeep->velocity) & 0xFFFFFF00) { if (TrInput & (IN_LEFT | IN_LSTEP)) - LaraItem->TargetState = JS_BACK_RIGHT; + LaraItem->Animation.TargetState = JS_BACK_RIGHT; else if (TrInput & (IN_RIGHT | IN_RSTEP)) - LaraItem->TargetState = JS_BACK_LEFT; + LaraItem->Animation.TargetState = JS_BACK_LEFT; } else - LaraItem->TargetState = JS_DRIVE_BACK; + LaraItem->Animation.TargetState = JS_DRIVE_BACK; break; case JS_BACK_LEFT: if (dead) - LaraItem->TargetState = JS_DRIVE_BACK; + LaraItem->Animation.TargetState = JS_DRIVE_BACK; else if (!(DbInput & IN_WALK)) { if (DbInput & IN_SPRINT) @@ -1347,9 +1347,9 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) jeep->unknown2++; } else if (TrInput & (IN_RIGHT | IN_RSTEP)) - LaraItem->TargetState = JS_BACK_LEFT; + LaraItem->Animation.TargetState = JS_BACK_LEFT; else - LaraItem->TargetState = JS_BACK; + LaraItem->Animation.TargetState = JS_BACK; } else { @@ -1358,26 +1358,26 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) jeep->unknown2--; if (!jeep->unknown2) { - LaraItem->TargetState = JS_FWD_RIGHT; - LaraItem->ActiveState = JS_FWD_RIGHT; - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_FWD_RIGHT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.TargetState = JS_FWD_RIGHT; + LaraItem->Animation.ActiveState = JS_FWD_RIGHT; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_FWD_RIGHT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; break; } } } - if (LaraItem->AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_LEFT && !jeep->velocity) + if (LaraItem->Animation.AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_LEFT && !jeep->velocity) { - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_LEFT_BACK_START; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase + 14; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_LEFT_BACK_START; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase + 14; } - if (LaraItem->AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_LEFT_BACK_START) + if (LaraItem->Animation.AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_LEFT_BACK_START) { if (jeep->velocity) { - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_LEFT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_LEFT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; } } @@ -1386,7 +1386,7 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) case JS_BACK_RIGHT: if (dead) { - LaraItem->TargetState = JS_DRIVE_BACK; + LaraItem->Animation.TargetState = JS_DRIVE_BACK; } else if (!(DbInput & IN_WALK)) { @@ -1396,53 +1396,53 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) jeep->unknown2++; } else if (TrInput & (IN_LEFT | IN_LSTEP)) - LaraItem->TargetState = JS_BACK_RIGHT; + LaraItem->Animation.TargetState = JS_BACK_RIGHT; else - LaraItem->TargetState = JS_BACK; + LaraItem->Animation.TargetState = JS_BACK; - if (LaraItem->AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_RIGHT && !jeep->velocity) + if (LaraItem->Animation.AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_RIGHT && !jeep->velocity) { - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_BACK_START; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase + 14; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_BACK_START; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase + 14; } - if (LaraItem->AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_BACK_START) + if (LaraItem->Animation.AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_BACK_START) { if (jeep->velocity) { - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_RIGHT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_RIGHT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; } } break; } else if (!jeep->unknown2 || (--jeep->unknown2 != 0)) { - if (LaraItem->AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_RIGHT && !jeep->velocity) + if (LaraItem->Animation.AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_RIGHT && !jeep->velocity) { - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_BACK_START; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase + 14; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_BACK_START; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase + 14; } - if (LaraItem->AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_BACK_START) + if (LaraItem->Animation.AnimNumber == Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_RIGHT_BACK_START) { if (jeep->velocity) { - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_RIGHT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_BACK_RIGHT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; } } break; } - LaraItem->TargetState = JS_FWD_LEFT; - LaraItem->ActiveState = JS_FWD_LEFT; - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_FWD_RIGHT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.TargetState = JS_FWD_LEFT; + LaraItem->Animation.ActiveState = JS_FWD_LEFT; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_IDLE_FWD_RIGHT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; break; case JS_DRIVE_BACK: if (dead) - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; else // if (jeep->velocity || JeepNoGetOff) { @@ -1456,12 +1456,12 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) else if (!(TrInput & JEEP_IN_ACCELERATE) || TrInput & JEEP_IN_BRAKE) { if (TrInput & (IN_LEFT | IN_LSTEP)) - LaraItem->TargetState = JS_BACK_RIGHT; + LaraItem->Animation.TargetState = JS_BACK_RIGHT; else if (TrInput & (IN_LEFT | IN_LSTEP)) - LaraItem->TargetState = JS_BACK_LEFT; + LaraItem->Animation.TargetState = JS_BACK_LEFT; } else - LaraItem->TargetState = JS_BACK; + LaraItem->Animation.TargetState = JS_BACK; } else { @@ -1469,7 +1469,7 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) { jeep->unknown2--; if (!jeep->unknown2) - LaraItem->TargetState = JS_STOP; + LaraItem->Animation.TargetState = JS_STOP; } } } @@ -1481,7 +1481,7 @@ static void AnimateJeep(ITEM_INFO* item, int collide, int dead) } if (g_Level.Rooms[item->RoomNumber].flags & ENV_FLAG_WATER) { - LaraItem->TargetState = JS_JUMP; + LaraItem->Animation.TargetState = JS_JUMP; LaraItem->HitPoints = 0; JeepExplode(item); } @@ -1534,13 +1534,13 @@ void JeepCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) ang -= item->Position.yRot; if ((ang > -(ANGLE(45))) && (ang < (ANGLE(135)))) - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_GETIN_LEFT; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_GETIN_LEFT; else - LaraItem->AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_GETIN_RIGHT; + LaraItem->Animation.AnimNumber = Objects[ID_JEEP_LARA_ANIMS].animIndex + JA_GETIN_RIGHT; - LaraItem->TargetState = JS_GETIN; - LaraItem->ActiveState = JS_GETIN; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.TargetState = JS_GETIN; + LaraItem->Animation.ActiveState = JS_GETIN; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; item->HitPoints = 1; LaraItem->Position.xPos = item->Position.xPos; @@ -1553,7 +1553,7 @@ void JeepCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) AnimateItem(l); - int anim = LaraItem->AnimNumber; + int anim = LaraItem->Animation.AnimNumber; JeepInfo* jeep = (JeepInfo*)item->Data; jeep->revs = 0; @@ -1608,7 +1608,7 @@ int JeepControl(void) int pitch = 0; if (jeep->flags) collide = 0; - else if (LaraItem->ActiveState == JS_GETIN) + else if (LaraItem->Animation.ActiveState == JS_GETIN) { drive = -1; collide = 0; @@ -1644,7 +1644,7 @@ int JeepControl(void) jeep->rot4 -= rotAdd; int oldY = item->Position.yPos; - item->VerticalVelocity = DoJeepDynamics(height, item->VerticalVelocity, &item->Position.yPos, 0); + item->Animation.VerticalVelocity = DoJeepDynamics(height, item->Animation.VerticalVelocity, &item->Position.yPos, 0); height = (fl.y + fr.y) / 2; short xRot; @@ -1691,17 +1691,17 @@ int JeepControl(void) LaraItem->Position.zRot = item->Position.zRot; int jeepAnim = Objects[ID_JEEP].animIndex; - int laraAnim = LaraItem->AnimNumber; + int laraAnim = LaraItem->Animation.AnimNumber; int extraAnim = Objects[ID_JEEP_LARA_ANIMS].animIndex; AnimateJeep(item, collide, dead); AnimateItem(LaraItem); - item->AnimNumber = Objects[ID_JEEP].animIndex + LaraItem->AnimNumber - Objects[ID_JEEP_LARA_ANIMS].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase + (LaraItem->FrameNumber - g_Level.Anims[LaraItem->AnimNumber].frameBase); + item->Animation.AnimNumber = Objects[ID_JEEP].animIndex + LaraItem->Animation.AnimNumber - Objects[ID_JEEP_LARA_ANIMS].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase + (LaraItem->Animation.FrameNumber - g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase); jeepAnim = Objects[ID_JEEP].animIndex; - laraAnim = LaraItem->AnimNumber; + laraAnim = LaraItem->Animation.AnimNumber; extraAnim = Objects[ID_JEEP_LARA_ANIMS].animIndex; @@ -1728,8 +1728,8 @@ int JeepControl(void) } } - if (LaraItem->ActiveState == JS_GETIN || - LaraItem->ActiveState == JS_GETOFF) + if (LaraItem->Animation.ActiveState == JS_GETIN || + LaraItem->Animation.ActiveState == JS_GETOFF) JeepSmokeStart = 0; else { @@ -1743,7 +1743,7 @@ int JeepControl(void) GetJointAbsPosition(item, &pos, 11); - if (item->Velocity <= 32) + if (item->Animation.Velocity <= 32) { if (JeepSmokeStart >= 16) { @@ -1759,8 +1759,8 @@ int JeepControl(void) } TriggerJeepExhaustSmoke(pos.x, pos.y, pos.z, item->Position.yRot + -32768, speed, 0); } - else if (item->Velocity < 64) - TriggerJeepExhaustSmoke(pos.x, pos.y, pos.z, item->Position.yRot - 32768, 64 - item->Velocity, 1); + else if (item->Animation.Velocity < 64) + TriggerJeepExhaustSmoke(pos.x, pos.y, pos.z, item->Position.yRot - 32768, 64 - item->Animation.Velocity, 1); } return JeepCheckGetOff(); diff --git a/TR5Main/Objects/TR4/Vehicles/motorbike.cpp b/TR5Main/Objects/TR4/Vehicles/motorbike.cpp index 2b7c436e5..fa74603a5 100644 --- a/TR5Main/Objects/TR4/Vehicles/motorbike.cpp +++ b/TR5Main/Objects/TR4/Vehicles/motorbike.cpp @@ -299,7 +299,7 @@ static BOOL GetOnMotorBike(short itemNumber) short room_number; item = &g_Level.Items[itemNumber]; - if (item->Flags & ONESHOT || Lara.Control.HandStatus != HandStatus::Free || LaraItem->Airborne) + if (item->Flags & ONESHOT || Lara.Control.HandStatus != HandStatus::Free || LaraItem->Animation.Airborne) return false; if ((abs(item->Position.yPos - LaraItem->Position.yPos) >= STEP_SIZE || !(TrInput & IN_ACTION)) && g_Gui.GetInventoryItemChosen() != ID_PUZZLE_ITEM1) @@ -372,17 +372,17 @@ void MotorbikeCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* coll) { if (g_Gui.GetInventoryItemChosen() == ID_PUZZLE_ITEM1) { - laraitem->AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_UNLOCK; + laraitem->Animation.AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_UNLOCK; g_Gui.SetInventoryItemChosen(NO_ITEM); } else { - laraitem->AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_ENTER; + laraitem->Animation.AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_ENTER; } - laraitem->TargetState = BIKE_ENTER; - laraitem->ActiveState = BIKE_ENTER; + laraitem->Animation.TargetState = BIKE_ENTER; + laraitem->Animation.ActiveState = BIKE_ENTER; } - laraitem->FrameNumber = g_Level.Anims[laraitem->AnimNumber].frameBase; + laraitem->Animation.FrameNumber = g_Level.Anims[laraitem->Animation.AnimNumber].frameBase; item->HitPoints = 1; laraitem->Position.xPos = item->Position.xPos; @@ -475,7 +475,7 @@ static void DrawMotorBikeSmoke(ITEM_INFO* item) if (Lara.Vehicle == NO_ITEM) return; - if (LaraItem->ActiveState != BIKE_ENTER && LaraItem->ActiveState != BIKE_EXIT) + if (LaraItem->Animation.ActiveState != BIKE_ENTER && LaraItem->Animation.ActiveState != BIKE_EXIT) { PHD_VECTOR pos; int speed; @@ -485,7 +485,7 @@ static void DrawMotorBikeSmoke(ITEM_INFO* item) pos.z = -500; GetJointAbsPosition(item, &pos, 0); - speed = item->VerticalVelocity; + speed = item->Animation.VerticalVelocity; if (speed > 32 && speed < 64) { TriggerMotorbikeExhaustSmoke(pos.x, pos.y, pos.z, item->Position.yRot - ANGLE(180), 64 - speed, TRUE); @@ -540,13 +540,13 @@ static int MotorBikeCheckGetOff(void) if (Lara.Vehicle != NO_ITEM) { item = &g_Level.Items[Lara.Vehicle]; - if (LaraItem->ActiveState == BIKE_EXIT && LaraItem->FrameNumber == g_Level.Anims[LaraItem->AnimNumber].frameEnd) + if (LaraItem->Animation.ActiveState == BIKE_EXIT && LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameEnd) { LaraItem->Position.yRot -= 0x4000; - LaraItem->AnimNumber = LA_STAND_SOLID; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; - LaraItem->TargetState = LS_IDLE; - LaraItem->ActiveState = LS_IDLE; + LaraItem->Animation.AnimNumber = LA_STAND_SOLID; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; + LaraItem->Animation.TargetState = LS_IDLE; + LaraItem->Animation.ActiveState = LS_IDLE; LaraItem->Position.xPos -= 2 * phd_sin(item->Position.yRot); LaraItem->Position.zPos -= 2 * phd_cos(item->Position.yRot); LaraItem->Position.xRot = 0; @@ -557,7 +557,7 @@ static int MotorBikeCheckGetOff(void) return true; } - if (LaraItem->FrameNumber != g_Level.Anims[LaraItem->AnimNumber].frameEnd) + if (LaraItem->Animation.FrameNumber != g_Level.Anims[LaraItem->Animation.AnimNumber].frameEnd) return true; // exit when falling @@ -805,9 +805,9 @@ static int MotorBikeDynamics(ITEM_INFO* item) floor = GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &room_number); height = GetFloorHeight(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos); if (item->Position.yPos >= height) - speed = item->VerticalVelocity * phd_cos(item->Position.xRot); + speed = item->Animation.VerticalVelocity * phd_cos(item->Position.xRot); else - speed = item->VerticalVelocity; + speed = item->Animation.VerticalVelocity; item->Position.zPos += speed * phd_cos(motorbike->momentumAngle); item->Position.xPos += speed * phd_sin(motorbike->momentumAngle); @@ -969,24 +969,24 @@ static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead) motorbike = GetMotorbikeInfo(item); if (item->Position.yPos == item->Floor - || LaraItem->ActiveState == BIKE_FALLING - || LaraItem->ActiveState == BIKE_LANDING - || LaraItem->ActiveState == BIKE_EMPTY6 + || LaraItem->Animation.ActiveState == BIKE_FALLING + || LaraItem->Animation.ActiveState == BIKE_LANDING + || LaraItem->Animation.ActiveState == BIKE_EMPTY6 || dead) { if (!collide - || LaraItem->ActiveState == BIKE_HITBACK - || LaraItem->ActiveState == BIKE_HITFRONT - || LaraItem->ActiveState == BIKE_HITLEFT - || LaraItem->ActiveState == BIKE_EMPTY6 + || LaraItem->Animation.ActiveState == BIKE_HITBACK + || LaraItem->Animation.ActiveState == BIKE_HITFRONT + || LaraItem->Animation.ActiveState == BIKE_HITLEFT + || LaraItem->Animation.ActiveState == BIKE_EMPTY6 || motorbike->velocity <= 10922 || dead) { - switch (LaraItem->ActiveState) + switch (LaraItem->Animation.ActiveState) { case BIKE_IDLE: if (dead) - LaraItem->TargetState = BIKE_DEATH; + LaraItem->Animation.TargetState = BIKE_DEATH; else { @@ -999,17 +999,17 @@ static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead) if (!dismount || motorbike->velocity || NoGetOff) { if (TrInput & IN_ACCELERATE && !(TrInput & IN_BRAKE)) - LaraItem->TargetState = BIKE_MOVING_FRONT; + LaraItem->Animation.TargetState = BIKE_MOVING_FRONT; else if (TrInput & IN_REVERSE) - LaraItem->TargetState = BIKE_MOVING_BACK; + LaraItem->Animation.TargetState = BIKE_MOVING_BACK; } else if (dismount && MotorbikeCanGetOff()) { - LaraItem->TargetState = BIKE_EXIT; + LaraItem->Animation.TargetState = BIKE_EXIT; } else { - LaraItem->TargetState = BIKE_IDLE; + LaraItem->Animation.TargetState = BIKE_IDLE; } } break; @@ -1018,61 +1018,61 @@ static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead) if (dead) { if (motorbike->velocity <= MOTORBIKE_ACCEL_1) - LaraItem->TargetState = BIKE_DEATH; + LaraItem->Animation.TargetState = BIKE_DEATH; else - LaraItem->TargetState = BIKE_EMPTY5; + LaraItem->Animation.TargetState = BIKE_EMPTY5; } else if (motorbike->velocity & -256 || TrInput & (IN_ACCELERATE | IN_BRAKE)) { if (TrInput & IN_TURNL) - LaraItem->TargetState = BIKE_MOVING_LEFT; + LaraItem->Animation.TargetState = BIKE_MOVING_LEFT; else if (TrInput & IN_TURNR) - LaraItem->TargetState = BIKE_MOVING_RIGHT; + LaraItem->Animation.TargetState = BIKE_MOVING_RIGHT; else if (TrInput & IN_BRAKE) { if (motorbike->velocity <= 0x5554) - LaraItem->TargetState = BIKE_EMPTY3; + LaraItem->Animation.TargetState = BIKE_EMPTY3; else - LaraItem->TargetState = BIKE_STOP; + LaraItem->Animation.TargetState = BIKE_STOP; } else if (TrInput & IN_REVERSE && motorbike->velocity <= MOTORBIKE_BACKING_VEL) - LaraItem->TargetState = BIKE_MOVING_BACK; + LaraItem->Animation.TargetState = BIKE_MOVING_BACK; else if (motorbike->velocity == 0) - LaraItem->TargetState = BIKE_IDLE; + LaraItem->Animation.TargetState = BIKE_IDLE; } else - LaraItem->TargetState = BIKE_IDLE; + LaraItem->Animation.TargetState = BIKE_IDLE; break; case BIKE_MOVING_LEFT: if (motorbike->velocity & -256) { if (TrInput & IN_TURNR || !(TrInput & IN_TURNL)) - LaraItem->TargetState = BIKE_MOVING_FRONT; + LaraItem->Animation.TargetState = BIKE_MOVING_FRONT; } else - LaraItem->TargetState = BIKE_IDLE; + LaraItem->Animation.TargetState = BIKE_IDLE; if (motorbike->velocity == 0) - LaraItem->TargetState = BIKE_IDLE; + LaraItem->Animation.TargetState = BIKE_IDLE; break; case BIKE_MOVING_BACK: if (TrInput & IN_REVERSE) - LaraItem->TargetState = BIKE_MOVING_BACK_LOOP; + LaraItem->Animation.TargetState = BIKE_MOVING_BACK_LOOP; else - LaraItem->TargetState = BIKE_IDLE; + LaraItem->Animation.TargetState = BIKE_IDLE; break; case BIKE_MOVING_RIGHT: if (motorbike->velocity & -256) { if (TrInput & IN_TURNL || !(TrInput & IN_TURNR)) - LaraItem->TargetState = BIKE_MOVING_FRONT; + LaraItem->Animation.TargetState = BIKE_MOVING_FRONT; } else - LaraItem->TargetState = BIKE_IDLE; + LaraItem->Animation.TargetState = BIKE_IDLE; if (motorbike->velocity == 0) - LaraItem->TargetState = BIKE_IDLE; + LaraItem->Animation.TargetState = BIKE_IDLE; break; case BIKE_EMPTY3: @@ -1081,22 +1081,22 @@ static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead) if (motorbike->velocity & -256) { if (TrInput & IN_TURNL) - LaraItem->TargetState = BIKE_MOVING_LEFT; + LaraItem->Animation.TargetState = BIKE_MOVING_LEFT; if (TrInput & IN_TURNR) - LaraItem->TargetState = BIKE_MOVING_RIGHT; + LaraItem->Animation.TargetState = BIKE_MOVING_RIGHT; } else { - LaraItem->TargetState = BIKE_IDLE; + LaraItem->Animation.TargetState = BIKE_IDLE; } break; case BIKE_FALLING: if (item->Position.yPos == item->Floor) { - LaraItem->TargetState = BIKE_LANDING; + LaraItem->Animation.TargetState = BIKE_LANDING; - int fallspeed_damage = item->VerticalVelocity - 140; + int fallspeed_damage = item->Animation.VerticalVelocity - 140; if (fallspeed_damage > 0) { if (fallspeed_damage <= 100) @@ -1105,7 +1105,7 @@ static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead) LaraItem->HitPoints = 0; } } - else if (item->VerticalVelocity > 220) + else if (item->Animation.VerticalVelocity > 220) motorbike->flags |= FL_FALLING; break; @@ -1114,7 +1114,7 @@ static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead) case BIKE_HITRIGHT: case BIKE_HITLEFT: if (TrInput & (IN_ACCELERATE | IN_BRAKE)) - LaraItem->TargetState = BIKE_MOVING_FRONT; + LaraItem->Animation.TargetState = BIKE_MOVING_FRONT; break; } @@ -1125,32 +1125,32 @@ static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead) { case 13: - LaraItem->AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_BACK_HIT; - LaraItem->ActiveState = BIKE_HITBACK; - LaraItem->TargetState = BIKE_HITBACK; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_BACK_HIT; + LaraItem->Animation.ActiveState = BIKE_HITBACK; + LaraItem->Animation.TargetState = BIKE_HITBACK; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; break; case 14: - LaraItem->AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_FRONT_HIT; - LaraItem->ActiveState = BIKE_HITFRONT; - LaraItem->TargetState = BIKE_HITFRONT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_FRONT_HIT; + LaraItem->Animation.ActiveState = BIKE_HITFRONT; + LaraItem->Animation.TargetState = BIKE_HITFRONT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; break; case 11: - LaraItem->AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_RIGHT_HIT; - LaraItem->ActiveState = BIKE_HITRIGHT; - LaraItem->TargetState = BIKE_HITRIGHT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_RIGHT_HIT; + LaraItem->Animation.ActiveState = BIKE_HITRIGHT; + LaraItem->Animation.TargetState = BIKE_HITRIGHT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; break; default: case 12: - LaraItem->AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_LEFT_HIT; - LaraItem->ActiveState = BIKE_HITLEFT; - LaraItem->TargetState = BIKE_HITLEFT; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; + LaraItem->Animation.AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_LEFT_HIT; + LaraItem->Animation.ActiveState = BIKE_HITLEFT; + LaraItem->Animation.TargetState = BIKE_HITLEFT; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; break; } } @@ -1158,17 +1158,17 @@ static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead) else { if (motorbike->velocity >= 0) - LaraItem->AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_START_JUMP; + LaraItem->Animation.AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_START_JUMP; else - LaraItem->AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_START_FALL; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; - LaraItem->ActiveState = BIKE_FALLING; - LaraItem->TargetState = BIKE_FALLING; + LaraItem->Animation.AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_START_FALL; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; + LaraItem->Animation.ActiveState = BIKE_FALLING; + LaraItem->Animation.TargetState = BIKE_FALLING; } if (g_Level.Rooms[item->RoomNumber].flags & (ENV_FLAG_WATER|ENV_FLAG_SWAMP)) { - LaraItem->TargetState = BIKE_EMPTY6; + LaraItem->Animation.TargetState = BIKE_EMPTY6; MotorBikeExplode(item); } } @@ -1321,10 +1321,10 @@ static int MotorbikeUserControl(ITEM_INFO* item, int height, int* pitch) else motorbike->velocity = 0; - if (LaraItem->ActiveState == BIKE_MOVING_BACK) + if (LaraItem->Animation.ActiveState == BIKE_MOVING_BACK) { - int framenow = LaraItem->FrameNumber; - int framebase = g_Level.Anims[LaraItem->AnimNumber].frameBase; + int framenow = LaraItem->Animation.FrameNumber; + int framebase = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; if (framenow >= framebase + 24 && framenow <= framebase + 29) { @@ -1333,7 +1333,7 @@ static int MotorbikeUserControl(ITEM_INFO* item, int height, int* pitch) } } - item->VerticalVelocity = motorbike->velocity / 256; + item->Animation.VerticalVelocity = motorbike->velocity / 256; if (motorbike->engineRevs > MOTORBIKE_ACCEL_MAX) motorbike->engineRevs = (GetRandomControl() & 0x1FF) + 0xBF00; @@ -1361,13 +1361,13 @@ void SetLaraOnMotorBike(ITEM_INFO* item, ITEM_INFO* lara)//is this function even Lara.Control.HandStatus = HandStatus::Busy; Lara.HitDirection = -1; - lara->ActiveState = BIKE_IDLE; - lara->TargetState = BIKE_IDLE; - lara->AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_IDLE; - lara->FrameNumber = g_Level.Anims[lara->AnimNumber].frameBase; - lara->Airborne = false; - item->AnimNumber = lara->AnimNumber + (Objects[ID_MOTORBIKE].animIndex - Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex); - item->FrameNumber = lara->FrameNumber + (g_Level.Anims[ID_MOTORBIKE].frameBase - g_Level.Anims[ID_MOTORBIKE_LARA_ANIMS].frameBase); + lara->Animation.ActiveState = BIKE_IDLE; + lara->Animation.TargetState = BIKE_IDLE; + lara->Animation.AnimNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BA_IDLE; + lara->Animation.FrameNumber = g_Level.Anims[lara->Animation.AnimNumber].frameBase; + lara->Animation.Airborne = false; + item->Animation.AnimNumber = lara->Animation.AnimNumber + (Objects[ID_MOTORBIKE].animIndex - Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex); + item->Animation.FrameNumber = lara->Animation.FrameNumber + (g_Level.Anims[ID_MOTORBIKE].frameBase - g_Level.Anims[ID_MOTORBIKE_LARA_ANIMS].frameBase); item->HitPoints = 1; item->Flags = short(IFLAG_KILLED); // hmm... maybe wrong name (it can be IFLAG_CODEBITS) ? motorbike->revs = 0; @@ -1414,7 +1414,7 @@ int MotorbikeControl(void) else { DrawMotorbikeLight(item); - if (LaraItem->ActiveState < BIKE_ENTER || LaraItem->ActiveState > BIKE_EXIT) + if (LaraItem->Animation.ActiveState < BIKE_ENTER || LaraItem->Animation.ActiveState > BIKE_EXIT) drive = MotorbikeUserControl(item, height, &pitch); else { @@ -1450,7 +1450,7 @@ int MotorbikeControl(void) motorbike->wheelLeft = rotation; motorbike->wheelRight = rotation; int newy = item->Position.yPos; - item->VerticalVelocity = DoMotorBikeDynamics(height, item->VerticalVelocity, &item->Position.yPos, 0); + item->Animation.VerticalVelocity = DoMotorBikeDynamics(height, item->Animation.VerticalVelocity, &item->Position.yPos, 0); short xrot = 0, zrot = 0; int r1, r2; @@ -1502,8 +1502,8 @@ int MotorbikeControl(void) AnimateMotorbike(item, collide, dead); AnimateItem(LaraItem); - item->AnimNumber = LaraItem->AnimNumber + (Objects[ID_MOTORBIKE].animIndex - Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex); - item->FrameNumber = LaraItem->FrameNumber + (g_Level.Anims[item->AnimNumber].frameBase - g_Level.Anims[LaraItem->AnimNumber].frameBase); + item->Animation.AnimNumber = LaraItem->Animation.AnimNumber + (Objects[ID_MOTORBIKE].animIndex - Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex); + item->Animation.FrameNumber = LaraItem->Animation.FrameNumber + (g_Level.Anims[item->Animation.AnimNumber].frameBase - g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase); Camera.targetElevation = -5460; @@ -1519,7 +1519,7 @@ int MotorbikeControl(void) } } - if (LaraItem->ActiveState == BIKE_EXIT) + if (LaraItem->Animation.ActiveState == BIKE_EXIT) { ExhaustStart = false; MotorBikeCheckGetOff(); diff --git a/TR5Main/Objects/TR5/Entity/tr5_autoguns.cpp b/TR5Main/Objects/TR5/Entity/tr5_autoguns.cpp index b5eef0245..aa77d105c 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_autoguns.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_autoguns.cpp @@ -56,7 +56,7 @@ void AutoGunsControl(short itemNumber) if (TriggerActive(item)) { - if (item->FrameNumber >= g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber >= g_Level.Anims[item->Animation.AnimNumber].frameEnd) { std::array& data = item->Data; diff --git a/TR5Main/Objects/TR5/Entity/tr5_brownbeast.cpp b/TR5Main/Objects/TR5/Entity/tr5_brownbeast.cpp index 08058b46e..20ca207e1 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_brownbeast.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_brownbeast.cpp @@ -32,10 +32,10 @@ void InitialiseBrownBeast(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 1; - item->ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 1; + item->Animation.ActiveState = 1; } void ControlBrowsBeast(short itemNumber) @@ -51,11 +51,11 @@ void ControlBrowsBeast(short itemNumber) if (item->HitPoints <= 0) { item->HitPoints = 0; - if (item->ActiveState != 7) + if (item->Animation.ActiveState != 7) { - item->AnimNumber = Objects[ID_BROWN_BEAST].animIndex + 10; - item->ActiveState = 7; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_BROWN_BEAST].animIndex + 10; + item->Animation.ActiveState = 7; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } else @@ -87,7 +87,7 @@ void ControlBrowsBeast(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); creature->MaxTurn = ANGLE(7.0f); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->Flags = 0; @@ -96,24 +96,24 @@ void ControlBrowsBeast(short itemNumber) if (distance <= pow(SECTOR(1), 2)) { if (GetRandomControl() & 1) - item->TargetState = 4; + item->Animation.TargetState = 4; else - item->TargetState = 6; + item->Animation.TargetState = 6; } else if (GetRandomControl() & 1) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; } else - item->TargetState = 1; + item->Animation.TargetState = 1; break; case 2: case 3: if (distance < pow(SECTOR(1), 2) || creature->Mood != MoodType::Attack) - item->TargetState = 1; + item->Animation.TargetState = 1; SoundEffect(SFX_TR5_IMP_BARREL_ROLL, &item->Position, 0); break; @@ -137,10 +137,10 @@ void ControlBrowsBeast(short itemNumber) if (item->TouchBits & 0x3C000) { - if (item->AnimNumber == Objects[ID_BROWN_BEAST].animIndex + 8) + if (item->Animation.AnimNumber == Objects[ID_BROWN_BEAST].animIndex + 8) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 19 && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 25) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 19 && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 25) { CreatureEffect2(item, &BrownBeastBite1, 20, item->Position.yRot, DoBloodSplat); creature->Flags |= 1; @@ -151,10 +151,10 @@ void ControlBrowsBeast(short itemNumber) } } - if (item->AnimNumber == Objects[ID_BROWN_BEAST].animIndex + 2) + if (item->Animation.AnimNumber == Objects[ID_BROWN_BEAST].animIndex + 2) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 6 && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 16) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 6 && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 16) { CreatureEffect2(item, &BrownBeastBite1, 20, item->Position.yRot, DoBloodSplat); creature->Flags |= 1; @@ -169,10 +169,10 @@ void ControlBrowsBeast(short itemNumber) if (!(item->TouchBits & 0xF00000)) break; - if (item->AnimNumber == Objects[ID_BROWN_BEAST].animIndex + 8) + if (item->Animation.AnimNumber == Objects[ID_BROWN_BEAST].animIndex + 8) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 13 && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 20) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 13 && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 20) { CreatureEffect2(item, &BrownBeastBite2, 20, item->Position.yRot, DoBloodSplat); creature->Flags |= 2; @@ -183,10 +183,10 @@ void ControlBrowsBeast(short itemNumber) } } - if (item->AnimNumber == Objects[ID_BROWN_BEAST].animIndex + 2) + if (item->Animation.AnimNumber == Objects[ID_BROWN_BEAST].animIndex + 2) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 33 && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 43) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 33 && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 43) { CreatureEffect2(item, &BrownBeastBite2, 20, item->Position.yRot, DoBloodSplat); creature->Flags |= 2; diff --git a/TR5Main/Objects/TR5/Entity/tr5_chef.cpp b/TR5Main/Objects/TR5/Entity/tr5_chef.cpp index 2ce9b741b..9b2e4be81 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_chef.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_chef.cpp @@ -38,10 +38,10 @@ void InitialiseChef(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->TargetState = CHEF_STATE_COOKING; - item->ActiveState = CHEF_STATE_COOKING; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.TargetState = CHEF_STATE_COOKING; + item->Animation.ActiveState = CHEF_STATE_COOKING; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; item->Position.xPos += 192 * phd_sin(item->Position.yRot); item->Position.zPos += 192 * phd_cos(item->Position.yRot); } @@ -61,12 +61,12 @@ void ControlChef(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != CHEF_STATE_DEATH) + if (item->Animation.ActiveState != CHEF_STATE_DEATH) { item->HitPoints = 0; - item->ActiveState = CHEF_STATE_DEATH; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + CHEF_ANIM_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.ActiveState = CHEF_STATE_DEATH; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + CHEF_ANIM_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } else @@ -113,17 +113,17 @@ void ControlChef(short itemNumber) creature->MaxTurn = 0; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case CHEF_STATE_COOKING: if (abs(LaraItem->Position.yPos - item->Position.yPos) < SECTOR(1) && AI.distance < pow(SECTOR(1.5f), 2) && (item->TouchBits || item->HitStatus || - LaraItem->Velocity > 15 || + LaraItem->Animation.Velocity > 15 || TargetVisible(item, &aiLaraInfo))) { - item->TargetState = CHEF_STATE_TURN_180; + item->Animation.TargetState = CHEF_STATE_TURN_180; creature->Alerted = true; item->AIBits = 0; } @@ -137,7 +137,7 @@ void ControlChef(short itemNumber) item->Position.yRot -= ANGLE(2.0f); else item->Position.yRot += ANGLE(2.0f); - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) item->Position.yRot += -ANGLE(180.0f); break; @@ -159,7 +159,7 @@ void ControlChef(short itemNumber) { if (item->TouchBits & 0x2000) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 10) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 10) { CreatureEffect2(item, &ChefBite, 20, item->Position.yRot, DoBloodSplat); SoundEffect(SFX_TR4_LARA_THUD, &item->Position, 0); @@ -180,12 +180,12 @@ void ControlChef(short itemNumber) if (AI.distance >= pow(682, 2)) { if (AI.angle > ANGLE(112.5f) || AI.angle < -ANGLE(112.5f)) - item->TargetState = CHEF_STATE_TURN_180; + item->Animation.TargetState = CHEF_STATE_TURN_180; else if (creature->Mood == MoodType::Attack) - item->TargetState = CHEF_STATE_WALK; + item->Animation.TargetState = CHEF_STATE_WALK; } else if (AI.bite) - item->TargetState = CHEF_STATE_ATTACK; + item->Animation.TargetState = CHEF_STATE_ATTACK; break; @@ -197,7 +197,7 @@ void ControlChef(short itemNumber) AI.angle < -ANGLE(112.5f) || creature->Mood != MoodType::Attack) { - item->TargetState = CHEF_STATE_AIM; + item->Animation.TargetState = CHEF_STATE_AIM; } break; diff --git a/TR5Main/Objects/TR5/Entity/tr5_cyborg.cpp b/TR5Main/Objects/TR5/Entity/tr5_cyborg.cpp index 6aa74c4fe..37e8784f7 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_cyborg.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_cyborg.cpp @@ -51,10 +51,10 @@ void InitialiseCyborg(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 4; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = CYBORG_STATE_STOP; - item->ActiveState = CYBORG_STATE_STOP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 4; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = CYBORG_STATE_STOP; + item->Animation.ActiveState = CYBORG_STATE_STOP; } static void TriggerHitmanSparks(int x, int y, int z, short xv, short yv, short zv) @@ -205,10 +205,10 @@ void CyborgControl(short itemNumber) if (TestEnvironment(ENV_FLAG_WATER, item) && item->HitPoints > 0) { - item->ActiveState = CYBORG_STATE_DEATH; - item->AnimNumber = object->animIndex + 69; + item->Animation.ActiveState = CYBORG_STATE_DEATH; + item->Animation.AnimNumber = object->animIndex + 69; item->HitPoints = 0; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; DropEntityPickups(item); } @@ -250,9 +250,9 @@ void CyborgControl(short itemNumber) if (item->HitPoints <= 0) { - item->ActiveState = CYBORG_STATE_GASSED; - item->AnimNumber = object->animIndex + 68; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.ActiveState = CYBORG_STATE_GASSED; + item->Animation.AnimNumber = object->animIndex + 68; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } @@ -261,7 +261,7 @@ void CyborgControl(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); if (laraAI.distance < pow(SECTOR(2), 2) && - LaraItem->Velocity> 20 || + LaraItem->Animation.Velocity> 20 || item->HitStatus || TargetVisible(item, &laraAI)) { @@ -274,7 +274,7 @@ void CyborgControl(short itemNumber) int height; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case CYBORG_STATE_STOP: creature->MaxTurn = 0; @@ -288,8 +288,8 @@ void CyborgControl(short itemNumber) joint1 = AI.xAngle; } - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else { if (item->AIBits & GUARD) @@ -306,25 +306,25 @@ void CyborgControl(short itemNumber) else if (Targetable(item, &AI)) { if (AI.distance < pow(SECTOR(4), 2) || AI.zoneNumber != AI.enemyZone) - item->TargetState = CYBORG_STATE_AIM; + item->Animation.TargetState = CYBORG_STATE_AIM; else if (item->AIBits != MODIFY) - item->TargetState = CYBORG_STATE_WALK; + item->Animation.TargetState = CYBORG_STATE_WALK; } else { if (item->AIBits & PATROL1) - item->TargetState = CYBORG_STATE_WALK; + item->Animation.TargetState = CYBORG_STATE_WALK; else { if (canJump1block || canJump2blocks) { creature->MaxTurn = 0; - item->AnimNumber = object->animIndex + 22; - item->ActiveState = CYBORG_STATE_JUMP; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = object->animIndex + 22; + item->Animation.ActiveState = CYBORG_STATE_JUMP; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; if (canJump2blocks) - item->TargetState = CYBORG_STATE_JUMP_2BLOCKS; + item->Animation.TargetState = CYBORG_STATE_JUMP_2BLOCKS; creature->LOT.IsJumping = true; } else if (!creature->MonkeySwingAhead) @@ -332,12 +332,12 @@ void CyborgControl(short itemNumber) if (creature->Mood != MoodType::Bored) { if (AI.distance < pow(SECTOR(3), 2) || item->AIBits & FOLLOW) - item->TargetState = CYBORG_STATE_WALK; + item->Animation.TargetState = CYBORG_STATE_WALK; else - item->TargetState = CYBORG_STATE_RUN; + item->Animation.TargetState = CYBORG_STATE_RUN; } else - item->TargetState = CYBORG_STATE_STOP; + item->Animation.TargetState = CYBORG_STATE_STOP; } else { @@ -346,9 +346,9 @@ void CyborgControl(short itemNumber) height = probe.Position.Floor; if (probe.Position.Ceiling == height - SECTOR(1.5f)) - item->TargetState = CYBORG_STATE_START_END_MONKEY; + item->Animation.TargetState = CYBORG_STATE_START_END_MONKEY; else - item->TargetState = CYBORG_STATE_WALK; + item->Animation.TargetState = CYBORG_STATE_WALK; } } } @@ -364,20 +364,20 @@ void CyborgControl(short itemNumber) (AI.distance < pow(SECTOR(4), 2) || AI.zoneNumber != AI.enemyZone)) { - item->TargetState = CYBORG_STATE_STOP; - item->RequiredState = CYBORG_STATE_AIM; + item->Animation.TargetState = CYBORG_STATE_STOP; + item->Animation.RequiredState = CYBORG_STATE_AIM; } else { if (canJump1block || canJump2blocks) { - item->AnimNumber = object->animIndex + 22; - item->ActiveState = CYBORG_STATE_JUMP; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = object->animIndex + 22; + item->Animation.ActiveState = CYBORG_STATE_JUMP; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; creature->MaxTurn = 0; if (canJump2blocks) - item->TargetState = CYBORG_STATE_JUMP_2BLOCKS; + item->Animation.TargetState = CYBORG_STATE_JUMP_2BLOCKS; creature->LOT.IsJumping = true; } @@ -388,14 +388,14 @@ void CyborgControl(short itemNumber) if (AI.distance > pow(SECTOR(3), 2)) { if (!item->AIBits) - item->TargetState = CYBORG_STATE_RUN; + item->Animation.TargetState = CYBORG_STATE_RUN; } } else - item->TargetState = CYBORG_STATE_STOP; + item->Animation.TargetState = CYBORG_STATE_STOP; } else - item->TargetState = CYBORG_STATE_STOP; + item->Animation.TargetState = CYBORG_STATE_STOP; } break; @@ -408,27 +408,27 @@ void CyborgControl(short itemNumber) (AI.distance < pow(SECTOR(4), 2) || AI.zoneNumber != AI.enemyZone)) { - item->TargetState = CYBORG_STATE_STOP; - item->RequiredState = CYBORG_STATE_AIM; + item->Animation.TargetState = CYBORG_STATE_STOP; + item->Animation.RequiredState = CYBORG_STATE_AIM; } else if (canJump1block || canJump2blocks) { - item->AnimNumber = object->animIndex + 22; - item->ActiveState = CYBORG_STATE_JUMP; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = object->animIndex + 22; + item->Animation.ActiveState = CYBORG_STATE_JUMP; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; creature->MaxTurn = 0; if (canJump2blocks) - item->TargetState = CYBORG_STATE_JUMP_2BLOCKS; + item->Animation.TargetState = CYBORG_STATE_JUMP_2BLOCKS; creature->LOT.IsJumping = true; } else { if (creature->MonkeySwingAhead) - item->TargetState = CYBORG_STATE_STOP; + item->Animation.TargetState = CYBORG_STATE_STOP; else if (AI.distance < pow(SECTOR(3), 2)) - item->TargetState = CYBORG_STATE_WALK; + item->Animation.TargetState = CYBORG_STATE_WALK; } break; @@ -444,10 +444,10 @@ void CyborgControl(short itemNumber) height = probe.Position.Floor; if (probe.Position.Ceiling == height - SECTOR(1.5f), 2) - item->TargetState = CYBORG_STATE_STOP; + item->Animation.TargetState = CYBORG_STATE_STOP; } else - item->TargetState = CYBORG_STATE_MONKEY; + item->Animation.TargetState = CYBORG_STATE_MONKEY; break; @@ -464,7 +464,7 @@ void CyborgControl(short itemNumber) height = probe.Position.Floor; if (probe.Position.Ceiling == height - SECTOR(1.5f), 2) - item->TargetState = CYBORG_STATE_START_END_MONKEY; + item->Animation.TargetState = CYBORG_STATE_START_END_MONKEY; } break; @@ -491,9 +491,9 @@ void CyborgControl(short itemNumber) if (Targetable(item, &AI) && (AI.distance < pow(SECTOR(4), 2) || AI.zoneNumber != AI.enemyZone)) - item->TargetState = CYBORG_STATE_FIRE; + item->Animation.TargetState = CYBORG_STATE_FIRE; else - item->TargetState = CYBORG_STATE_STOP; + item->Animation.TargetState = CYBORG_STATE_STOP; break; @@ -516,9 +516,9 @@ void CyborgControl(short itemNumber) else item->Position.yRot += AI.angle; - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 6 && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 16 && - ((byte)item->FrameNumber - (byte)g_Level.Anims[item->AnimNumber].frameBase) & 1) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 6 && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 16 && + ((byte)item->Animation.FrameNumber - (byte)g_Level.Anims[item->Animation.AnimNumber].frameBase) & 1) { creature->FiredWeapon = 1; ShotLara(item, &AI, &HitmanGun, joint0, 12); @@ -530,7 +530,7 @@ void CyborgControl(short itemNumber) break; } } - else if (item->ActiveState == 43 && !Lara.Burn) + else if (item->Animation.ActiveState == 43 && !Lara.Burn) { PHD_VECTOR pos = { 0, 0, 0 }; GetLaraJointPosition(&pos, LM_LFOOT); @@ -575,14 +575,14 @@ void CyborgControl(short itemNumber) creature->Enemy->Position.yPos, creature->Enemy->Position.zPos, roomNumber, true); - item->RequiredState = CYBORG_STATE_WALK; + item->Animation.RequiredState = CYBORG_STATE_WALK; if (creature->Enemy->Flags & 2) item->ItemFlags[3] = (creature->Tosspad & 0xFF) - 1; if (creature->Enemy->Flags & 8) { - item->RequiredState = CYBORG_STATE_STOP; + item->Animation.RequiredState = CYBORG_STATE_STOP; item->TriggerFlags = 300; item->AIBits = GUARD | PATROL1; } @@ -593,7 +593,7 @@ void CyborgControl(short itemNumber) } } - if (item->ActiveState >= 15 || item->ActiveState == 5) + if (item->Animation.ActiveState >= 15 || item->Animation.ActiveState == 5) CreatureAnimation(itemNumber, angle, 0); else { @@ -601,44 +601,44 @@ void CyborgControl(short itemNumber) { case 0: creature->MaxTurn = 0; - item->AnimNumber = object->animIndex + 35; - item->ActiveState = 25; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = object->animIndex + 35; + item->Animation.ActiveState = 25; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 1: creature->MaxTurn = 0; - item->AnimNumber = object->animIndex + 41; - item->ActiveState = 24; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = object->animIndex + 41; + item->Animation.ActiveState = 24; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 2: creature->MaxTurn = 0; - item->AnimNumber = object->animIndex + 42; - item->ActiveState = 23; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = object->animIndex + 42; + item->Animation.ActiveState = 23; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 6: creature->MaxTurn = 0; - item->AnimNumber = object->animIndex + 29; - item->ActiveState = 19; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = object->animIndex + 29; + item->Animation.ActiveState = 19; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 7: creature->MaxTurn = 0; - item->AnimNumber = object->animIndex + 28; - item->ActiveState = 18; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = object->animIndex + 28; + item->Animation.ActiveState = 18; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 8: creature->MaxTurn = 0; - item->AnimNumber = object->animIndex + 27; - item->ActiveState = 17; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = object->animIndex + 27; + item->Animation.ActiveState = 17; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; default: diff --git a/TR5Main/Objects/TR5/Entity/tr5_doberman.cpp b/TR5Main/Objects/TR5/Entity/tr5_doberman.cpp index 20546a6ad..dc1616c0f 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_doberman.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_doberman.cpp @@ -18,16 +18,16 @@ void InitialiseDoberman(short itemNum) item = &g_Level.Items[itemNum]; if (item->TriggerFlags) { - item->ActiveState = 5; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 6; + item->Animation.ActiveState = 5; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 6; // TODO: item->flags2 ^= (item->flags2 ^ ((item->flags2 & 0xFE) + 2)) & 6; } else { - item->ActiveState = 6; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 10; + item->Animation.ActiveState = 6; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 10; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } void DobermanControl(short itemNumber) @@ -56,32 +56,32 @@ void DobermanControl(short itemNumber) int random; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->MaxTurn = ANGLE(3); if (creature->Mood != MoodType::Bored) { - item->TargetState = 2; + item->Animation.TargetState = 2; } else { random = GetRandomControl(); if (random < 768) { - item->RequiredState = 4; - item->TargetState = 3; + item->Animation.RequiredState = 4; + item->Animation.TargetState = 3; break; } if (random < 1536) { - item->RequiredState = 5; - item->TargetState = 3; + item->Animation.RequiredState = 5; + item->Animation.TargetState = 3; break; } if (random < 2816) { - item->TargetState = 3; + item->Animation.TargetState = 3; break; } } @@ -92,11 +92,11 @@ void DobermanControl(short itemNumber) creature->MaxTurn = ANGLE(6); if (creature->Mood == MoodType::Bored) { - item->TargetState = 3; + item->Animation.TargetState = 3; break; } if (info.distance < SQUARE(768)) - item->TargetState = 8; + item->Animation.TargetState = 8; break; case 3: @@ -107,15 +107,15 @@ void DobermanControl(short itemNumber) if (creature->Mood != MoodType::Escape && info.distance < SQUARE(341) && info.ahead) - item->TargetState = 7; + item->Animation.TargetState = 7; else - item->TargetState = 2; + item->Animation.TargetState = 2; } else { - if (item->RequiredState) + if (item->Animation.RequiredState) { - item->TargetState = item->RequiredState; + item->Animation.TargetState = item->Animation.RequiredState; } else { @@ -125,16 +125,16 @@ void DobermanControl(short itemNumber) if (random >= 1536) { if (random < 9728) - item->TargetState = 1; + item->Animation.TargetState = 1; } else { - item->TargetState = 5; + item->Animation.TargetState = 5; } } else { - item->TargetState = 4; + item->Animation.TargetState = 4; } } } @@ -143,21 +143,21 @@ void DobermanControl(short itemNumber) case 4: if (creature->Mood != MoodType::Bored || GetRandomControl() < 1280) { - item->TargetState = 3; + item->Animation.TargetState = 3; } break; case 5: if (creature->Mood != MoodType::Bored || GetRandomControl() < 256) { - item->TargetState = 3; + item->Animation.TargetState = 3; } break; case 6: if (creature->Mood != MoodType::Bored || GetRandomControl() < 512) { - item->TargetState = 3; + item->Animation.TargetState = 3; } break; @@ -174,9 +174,9 @@ void DobermanControl(short itemNumber) } if (info.distance <= SQUARE(341) || info.distance >= SQUARE(682)) - item->TargetState = 3; + item->Animation.TargetState = 3; else - item->TargetState = 9; + item->Animation.TargetState = 9; break; case 8: @@ -190,11 +190,11 @@ void DobermanControl(short itemNumber) if (info.distance >= SQUARE(341)) { if (info.distance < SQUARE(682)) - item->TargetState = 9; + item->Animation.TargetState = 9; } else { - item->TargetState = 7; + item->Animation.TargetState = 7; } break; case 9: @@ -207,17 +207,17 @@ void DobermanControl(short itemNumber) creature->Flags = 3; } if (info.distance < SQUARE(341)) - item->TargetState = 7; + item->Animation.TargetState = 7; break; default: break; } } - else if (item->ActiveState != 10) + else if (item->Animation.ActiveState != 10) { - item->AnimNumber = Objects[ID_DOG].animIndex + 13; - item->ActiveState = 10; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_DOG].animIndex + 13; + item->Animation.ActiveState = 10; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } CreatureTilt(item, tilt); diff --git a/TR5Main/Objects/TR5/Entity/tr5_dog.cpp b/TR5Main/Objects/TR5/Entity/tr5_dog.cpp index 6be60e58d..f77c212bf 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_dog.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_dog.cpp @@ -18,14 +18,14 @@ void InitialiseTr5Dog(short itemNum) ITEM_INFO* item; item = &g_Level.Items[itemNum]; - item->ActiveState = 1; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 8; + item->Animation.ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 8; if (!item->TriggerFlags) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; // TODO: item->flags2 ^= (item->flags2 ^ ((item->flags2 & 0xFE) + 2)) & 6; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } void Tr5DogControl(short itemNumber) @@ -44,15 +44,15 @@ void Tr5DogControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->AnimNumber == obj->animIndex + 1) + if (item->Animation.AnimNumber == obj->animIndex + 1) { item->HitPoints = obj->HitPoints; } - else if (item->ActiveState != 11) + else if (item->Animation.ActiveState != 11) { - item->AnimNumber = obj->animIndex + DogAnims[GetRandomControl() & 3]; - item->ActiveState = 11; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = obj->animIndex + DogAnims[GetRandomControl() & 3]; + item->Animation.ActiveState = 11; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } else @@ -101,9 +101,9 @@ void Tr5DogControl(short itemNumber) } short random = GetRandomControl(); - int frame = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int frame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 0: case 8: @@ -111,22 +111,22 @@ void Tr5DogControl(short itemNumber) joint2 = 0; if (creature->Mood != MoodType::Bored && (item->AIBits) != MODIFY) { - item->TargetState = 1; + item->Animation.TargetState = 1; } else { creature->Flags++; creature->MaxTurn = 0; if (creature->Flags > 300 && random < 128) - item->TargetState = 1; + item->Animation.TargetState = 1; } break; case 1: case 9: - if (item->ActiveState == 9 && item->RequiredState) + if (item->Animation.ActiveState == 9 && item->Animation.RequiredState) { - item->TargetState = item->RequiredState; + item->Animation.TargetState = item->Animation.RequiredState; break; } @@ -136,26 +136,26 @@ void Tr5DogControl(short itemNumber) joint1 = AIGuard(creature); if (GetRandomControl()) break; - if (item->ActiveState == 1) + if (item->Animation.ActiveState == 1) { - item->TargetState = 9; + item->Animation.TargetState = 9; break; } } else { - if (item->ActiveState == 9 && random < 128) + if (item->Animation.ActiveState == 9 && random < 128) { - item->TargetState = 1; + item->Animation.TargetState = 1; break; } if (item->AIBits & PATROL1) { - if (item->ActiveState == 1) - item->TargetState = 2; + if (item->Animation.ActiveState == 1) + item->Animation.TargetState = 2; else - item->TargetState = 1; + item->Animation.TargetState = 1; break; } @@ -163,21 +163,21 @@ void Tr5DogControl(short itemNumber) { if (Lara.TargetEntity == item || !info.ahead || item->HitStatus) { - item->RequiredState = 3; - item->TargetState = 9; + item->Animation.RequiredState = 3; + item->Animation.TargetState = 9; } else { - item->TargetState = 1; + item->Animation.TargetState = 1; } break; } if (creature->Mood != MoodType::Bored) { - item->RequiredState = 3; - if (item->ActiveState == 1) - item->TargetState = 9; + item->Animation.RequiredState = 3; + if (item->Animation.ActiveState == 1) + item->Animation.TargetState = 9; break; } @@ -188,9 +188,9 @@ void Tr5DogControl(short itemNumber) { if (item->AIBits & MODIFY) { - if (item->ActiveState == 1) + if (item->Animation.ActiveState == 1) { - item->TargetState = 8; + item->Animation.TargetState = 8; creature->Flags = 0; break; } @@ -200,33 +200,33 @@ void Tr5DogControl(short itemNumber) if (random >= 4096) { if (!(random & 0x1F)) - item->TargetState = 7; + item->Animation.TargetState = 7; break; } - if (item->ActiveState == 1) + if (item->Animation.ActiveState == 1) { - item->TargetState = 2; + item->Animation.TargetState = 2; break; } } - item->TargetState = 1; + item->Animation.TargetState = 1; break; case 2: creature->MaxTurn = ANGLE(3); if (item->AIBits & PATROL1) { - item->TargetState = 2; + item->Animation.TargetState = 2; break; } if (creature->Mood == MoodType::Bored && random < 256) { - item->TargetState = 1; + item->Animation.TargetState = 1; break; } - item->TargetState = 5; + item->Animation.TargetState = 5; break; case 3: @@ -234,23 +234,23 @@ void Tr5DogControl(short itemNumber) if (creature->Mood == MoodType::Escape) { if (Lara.TargetEntity != item && info.ahead) - item->TargetState = 9; + item->Animation.TargetState = 9; } else if (creature->Mood != MoodType::Bored) { if (info.bite && info.distance < SQUARE(1024)) { - item->TargetState = 6; + item->Animation.TargetState = 6; } else if (info.distance < SQUARE(1536)) { - item->RequiredState = 5; - item->TargetState = 9; + item->Animation.RequiredState = 5; + item->Animation.TargetState = 9; } } else { - item->TargetState = 9; + item->Animation.TargetState = 9; } break; @@ -260,21 +260,21 @@ void Tr5DogControl(short itemNumber) { if (creature->Mood == MoodType::Escape) { - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (info.bite && info.distance < SQUARE(341)) { - item->TargetState = 12; - item->RequiredState = 5; + item->Animation.TargetState = 12; + item->Animation.RequiredState = 5; } else if (info.distance > SQUARE(1536) || item->HitStatus) { - item->TargetState = 3; + item->Animation.TargetState = 3; } } else { - item->TargetState = 9; + item->Animation.TargetState = 9; } break; case 6: @@ -287,7 +287,7 @@ void Tr5DogControl(short itemNumber) LaraItem->HitPoints -= 20; LaraItem->HitStatus = true; } - item->TargetState = 3; + item->Animation.TargetState = 3; break; case 7: diff --git a/TR5Main/Objects/TR5/Entity/tr5_ghost.cpp b/TR5Main/Objects/TR5/Entity/tr5_ghost.cpp index 0db806df0..e908a592e 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_ghost.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_ghost.cpp @@ -18,10 +18,10 @@ void InitialiseInvisibleGhost(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 1; - item->ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 1; + item->Animation.ActiveState = 1; item->Position.yPos += CLICK(2); } @@ -66,23 +66,23 @@ void InvisibleGhostControl(short itemNumber) creature->MaxTurn = 0; - if (item->ActiveState == 1) + if (item->Animation.ActiveState == 1) { creature->Flags = 0; if (AI.distance < pow(614, 2)) { if (GetRandomControl() & 1) - item->TargetState = 2; + item->Animation.TargetState = 2; else - item->TargetState = 3; + item->Animation.TargetState = 3; } } - else if (item->ActiveState > 1 && - item->ActiveState <= 3 && + else if (item->Animation.ActiveState > 1 && + item->Animation.ActiveState <= 3 && !creature->Flags && item->TouchBits & 0x9470 && - item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 18) + item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 18) { CreatureEffect2(item, &InvisibleGhostBite, 10, item->Position.yRot, DoBloodSplat); creature->Flags = 1; diff --git a/TR5Main/Objects/TR5/Entity/tr5_gladiator.cpp b/TR5Main/Objects/TR5/Entity/tr5_gladiator.cpp index f8821024b..1fda3151c 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_gladiator.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_gladiator.cpp @@ -33,10 +33,10 @@ void InitialiseGladiator(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 1; - item->ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 1; + item->Animation.ActiveState = 1; if (item->TriggerFlags == 1) item->SwapMeshFlags = -1; @@ -59,11 +59,11 @@ void ControlGladiator(short itemNumber) if (item->HitPoints <= 0) { item->HitPoints = 0; - if (item->ActiveState != 6) + if (item->Animation.ActiveState != 6) { - item->AnimNumber = Objects[ID_GLADIATOR].animIndex + 16; - item->ActiveState = 6; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_GLADIATOR].animIndex + 16; + item->Animation.ActiveState = 6; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } else @@ -109,7 +109,7 @@ void ControlGladiator(short itemNumber) joint1 = AI.xAngle; } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->Flags = 0; @@ -126,7 +126,7 @@ void ControlGladiator(short itemNumber) } if (item->AIBits & PATROL1) - item->TargetState = 2; + item->Animation.TargetState = 2; else { if (creature->Mood == MoodType::Escape) @@ -135,7 +135,7 @@ void ControlGladiator(short itemNumber) AI.ahead && !item->HitStatus) { - item->TargetState = 1; + item->Animation.TargetState = 1; break; } } @@ -146,10 +146,10 @@ void ControlGladiator(short itemNumber) (creature->ReachedGoal || distance > pow(SECTOR(2), 2))) { - if (item->RequiredState) - item->TargetState = item->RequiredState; + if (item->Animation.RequiredState) + item->Animation.TargetState = item->Animation.RequiredState; else if (!(GetRandomControl() & 0x3F)) - item->TargetState = 2; + item->Animation.TargetState = 2; break; } @@ -162,22 +162,22 @@ void ControlGladiator(short itemNumber) !(GetRandomControl() & 0xF)) && item->MeshBits == -1) { - item->TargetState = 4; + item->Animation.TargetState = 4; break; } if (AI.bite && AI.distance < pow(819, 2)) { if (GetRandomControl() & 1) - item->TargetState = 8; + item->Animation.TargetState = 8; else - item->TargetState = 9; + item->Animation.TargetState = 9; break; } } - item->TargetState = 2; + item->Animation.TargetState = 2; } break; @@ -189,27 +189,27 @@ void ControlGladiator(short itemNumber) if (item->AIBits & PATROL1) { - item->TargetState = 2; + item->Animation.TargetState = 2; joint2 = 0; } else if (creature->Mood == MoodType::Escape) - item->TargetState = 3; + item->Animation.TargetState = 3; else if (creature->Mood != MoodType::Bored) { if (AI.distance < pow(SECTOR(1), 2)) { - item->TargetState = 1; + item->Animation.TargetState = 1; break; } if (AI.bite && AI.distance < pow(SECTOR(2), 2)) - item->TargetState = 11; + item->Animation.TargetState = 11; else if (!AI.ahead || AI.distance > pow(SECTOR(1.5f), 2)) - item->TargetState = 3; + item->Animation.TargetState = 3; } else if (!(GetRandomControl() & 0x3F)) { - item->TargetState = 1; + item->Animation.TargetState = 1; break; } @@ -226,7 +226,7 @@ void ControlGladiator(short itemNumber) if (item->AIBits & GUARD) { creature->MaxTurn = 0; - item->TargetState = 1; + item->Animation.TargetState = 1; break; } @@ -234,7 +234,7 @@ void ControlGladiator(short itemNumber) { if (Lara.TargetEntity != item && AI.ahead) { - item->TargetState = 1; + item->Animation.TargetState = 1; break; } @@ -245,22 +245,22 @@ void ControlGladiator(short itemNumber) (creature->ReachedGoal || distance > pow(SECTOR(2), 2))) { - item->TargetState = 1; + item->Animation.TargetState = 1; break; } if (creature->Mood == MoodType::Bored) { - item->TargetState = 2; + item->Animation.TargetState = 2; break; } if (AI.distance < pow(SECTOR(1.5f), 2)) { if (AI.bite) - item->TargetState = 10; + item->Animation.TargetState = 10; else - item->TargetState = 2; + item->Animation.TargetState = 2; } break; @@ -270,14 +270,14 @@ void ControlGladiator(short itemNumber) { if (!unknown) { - item->TargetState = 1; + item->Animation.TargetState = 1; break; } } else if (Lara.TargetEntity != item || !(GetRandomControl() & 0x7F)) { - item->TargetState = 1; + item->Animation.TargetState = 1; break; } @@ -285,7 +285,7 @@ void ControlGladiator(short itemNumber) case 5: if (Lara.TargetEntity != item) - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -305,7 +305,7 @@ void ControlGladiator(short itemNumber) else item->Position.yRot += AI.angle; - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 10) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 10) { auto* room = &g_Level.Rooms[item->RoomNumber]; diff --git a/TR5Main/Objects/TR5/Entity/tr5_guard.cpp b/TR5Main/Objects/TR5/Entity/tr5_guard.cpp index d7b958ee7..9f1900ed3 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_guard.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_guard.cpp @@ -83,21 +83,21 @@ void InitialiseGuard(short itemNum) { case 0: case 10: - item->AnimNumber = anim; - item->TargetState = STATE_GUARD_STOP; + item->Animation.AnimNumber = anim; + item->Animation.TargetState = STATE_GUARD_STOP; break; case 1: - item->TargetState = STATE_GUARD_RECOIL; - item->AnimNumber = anim + 23; + item->Animation.TargetState = STATE_GUARD_RECOIL; + item->Animation.AnimNumber = anim + 23; break; case 2: - item->TargetState = STATE_GUARD_CROUCH; - item->AnimNumber = anim + 25; + item->Animation.TargetState = STATE_GUARD_CROUCH; + item->Animation.AnimNumber = anim + 25; // TODO: item->flags2 ^= (item->flags2 ^ ((item->flags2 & 0xFE) + 2)) & 6; break; case 3: - item->TargetState = STATE_GUARD_SITTING; - item->AnimNumber = anim + 28; + item->Animation.TargetState = STATE_GUARD_SITTING; + item->Animation.AnimNumber = anim + 28; item->SwapMeshFlags = 9216; roomItemNumber = g_Level.Rooms[item->RoomNumber].itemNumber; if (roomItemNumber != NO_ITEM) @@ -110,8 +110,8 @@ void InitialiseGuard(short itemNum) roomItemNumber = item2->NextItem; if (roomItemNumber == NO_ITEM) { - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = item->TargetState; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = item->Animation.TargetState; break; } } @@ -119,38 +119,38 @@ void InitialiseGuard(short itemNum) } break; case 4: - item->TargetState = 17; + item->Animation.TargetState = 17; item->SwapMeshFlags = 8192; - item->AnimNumber = anim + 30; + item->Animation.AnimNumber = anim + 30; break; case 5: FLOOR_INFO *floor; short roomNumber; - item->AnimNumber = anim + 26; - item->TargetState = STATE_GUARD_ROPE_DOWN; + item->Animation.AnimNumber = anim + 26; + item->Animation.TargetState = STATE_GUARD_ROPE_DOWN; roomNumber = item->RoomNumber; floor = GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &roomNumber); GetFloorHeight(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos); item->Position.yPos = GetCeiling(floor, item->Position.xPos, item->Position.yPos, item->Position.zPos) - SECTOR(2); break; case 6: - item->TargetState = STATE_GUARD_WAITING_ON_WALL; - item->AnimNumber = anim + 32; + item->Animation.TargetState = STATE_GUARD_WAITING_ON_WALL; + item->Animation.AnimNumber = anim + 32; break; case 7: case 9: - item->TargetState = STATE_GUARD_USE_COMPUTER; - item->AnimNumber = anim + 59; + item->Animation.TargetState = STATE_GUARD_USE_COMPUTER; + item->Animation.AnimNumber = anim + 59; item->Position.xPos -= 512 * phd_sin(item->Position.yRot); item->Position.zPos -= 512 * phd_cos(item->Position.yRot); break; case 8: - item->TargetState = STATE_GUARD_HUNTING_IDLE; - item->AnimNumber = anim + 46; + item->Animation.TargetState = STATE_GUARD_HUNTING_IDLE; + item->Animation.AnimNumber = anim + 46; break; case 11: - item->TargetState = STATE_GUARD_RUN; - item->AnimNumber = anim + 12; + item->Animation.TargetState = STATE_GUARD_RUN; + item->Animation.AnimNumber = anim + 12; break; default: break; @@ -162,10 +162,10 @@ void InitialiseSniper(short itemNum) ITEM_INFO* item; item = &g_Level.Items[itemNum]; ClearItem(itemNum); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_SNIPER_STOP; - item->ActiveState = STATE_SNIPER_STOP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_SNIPER_STOP; + item->Animation.ActiveState = STATE_SNIPER_STOP; item->Position.yPos += STEP_SIZE * 2; item->Position.xPos += 1024 * phd_sin(item->Position.yRot + ANGLE(90)); item->Position.zPos += 1024 * phd_cos(item->Position.yRot + ANGLE(90)); @@ -176,10 +176,10 @@ void InitialiseGuardLaser(short itemNum) ITEM_INFO* item; item = &g_Level.Items[itemNum]; ClearItem(itemNum); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 6; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_GUARD_STOP; - item->ActiveState = STATE_GUARD_STOP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 6; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_GUARD_STOP; + item->Animation.ActiveState = STATE_GUARD_STOP; } void ControlGuardLaser(short itemNumber) @@ -272,21 +272,21 @@ void GuardControl(short itemNum) if (item->HitPoints <= 0) { - if (item->ActiveState != STATE_GUARD_DEATH1 && item->ActiveState != STATE_GUARD_DEATH2) + if (item->Animation.ActiveState != STATE_GUARD_DEATH1 && item->Animation.ActiveState != STATE_GUARD_DEATH2) { if (laraInfo.angle >= 12288 || laraInfo.angle <= -12288) { - item->ActiveState = STATE_GUARD_DEATH2; - item->AnimNumber = animIndex + ANIMATION_GUARD_DEATH2; + item->Animation.ActiveState = STATE_GUARD_DEATH2; + item->Animation.AnimNumber = animIndex + ANIMATION_GUARD_DEATH2; item->Position.yRot += laraInfo.angle + -ANGLE(180); } else { - item->ActiveState = STATE_GUARD_DEATH1; - item->AnimNumber = animIndex + ANIMATION_GUARD_DEATH1; + item->Animation.ActiveState = STATE_GUARD_DEATH1; + item->Animation.AnimNumber = animIndex + ANIMATION_GUARD_DEATH1; item->Position.yRot += laraInfo.angle; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } else @@ -322,9 +322,9 @@ void GuardControl(short itemNum) creature->Mood = MoodType::Escape; if (item->HitPoints <= 0) { - item->ActiveState = STATE_GUARD_DEATH2; - item->AnimNumber = animIndex + ANIMATION_GUARD_DEATH2; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.ActiveState = STATE_GUARD_DEATH2; + item->Animation.AnimNumber = animIndex + ANIMATION_GUARD_DEATH2; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } } @@ -332,7 +332,7 @@ void GuardControl(short itemNum) ITEM_INFO * enemy = creature->Enemy; angle = CreatureTurn(item, creature->MaxTurn); creature->Enemy = LaraItem; - if (laraInfo.distance < 0x400000 && LaraItem->Velocity > 20 + if (laraInfo.distance < 0x400000 && LaraItem->Animation.Velocity > 20 || item->HitStatus || TargetVisible(item, &laraInfo)) { @@ -359,7 +359,7 @@ void GuardControl(short itemNum) short currentItemNumber; PHD_VECTOR pos1, pos2; PHD_VECTOR pos; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_GUARD_STOP: creature->LOT.IsJumping = false; @@ -375,11 +375,11 @@ void GuardControl(short itemNum) } if (item->ObjectNumber == ID_SCIENTIST && item == Lara.TargetEntity) { - item->TargetState = STATE_GUARD_SURREND; + item->Animation.TargetState = STATE_GUARD_SURREND; } - else if (item->RequiredState) + else if (item->Animation.RequiredState) { - item->TargetState = item->RequiredState; + item->Animation.TargetState = item->Animation.RequiredState; } else if (item->AIBits & GUARD) { @@ -396,54 +396,54 @@ void GuardControl(short itemNum) } else if (creature->Enemy == LaraItem && (laraInfo.angle > 20480 || laraInfo.angle < -20480) && item->ObjectNumber != ID_SCIENTIST) { - item->TargetState = STATE_GUARD_TURN180; + item->Animation.TargetState = STATE_GUARD_TURN180; } else if (item->AIBits & PATROL1) { - item->TargetState = STATE_GUARD_WALK; + item->Animation.TargetState = STATE_GUARD_WALK; } else if (item->AIBits & AMBUSH) { - item->TargetState = STATE_GUARD_RUN; + item->Animation.TargetState = STATE_GUARD_RUN; } else if (Targetable(item, &info) && item->ObjectNumber != ID_SCIENTIST) { if (info.distance >= 0x1000000 && info.zoneNumber == info.enemyZone) { if (!(item->AIBits & MODIFY)) - item->TargetState = STATE_GUARD_WALK; + item->Animation.TargetState = STATE_GUARD_WALK; } else - item->TargetState = STATE_GUARD_AIM; + item->Animation.TargetState = STATE_GUARD_AIM; } else if (canJump1block || canJump2blocks) { creature->MaxTurn = 0; - item->AnimNumber = animIndex + 41; - item->ActiveState = STATE_GUARD_STOP_START_JUMP; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = animIndex + 41; + item->Animation.ActiveState = STATE_GUARD_STOP_START_JUMP; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; if (canJump1block) - item->TargetState = STATE_GUARD_JUMPING_1BLOCK; + item->Animation.TargetState = STATE_GUARD_JUMPING_1BLOCK; else - item->TargetState = STATE_GUARD_JUMPING_2BLOCKS; + item->Animation.TargetState = STATE_GUARD_JUMPING_2BLOCKS; creature->LOT.IsJumping = true; } else if (los) { - item->TargetState = STATE_GUARD_HUNTING_IDLE; + item->Animation.TargetState = STATE_GUARD_HUNTING_IDLE; } else if (creature->Mood != MoodType::Bored) { if (info.distance < 0x900000 || item->AIBits & FOLLOW) { - item->TargetState = STATE_GUARD_WALK; + item->Animation.TargetState = STATE_GUARD_WALK; } else - item->TargetState = STATE_GUARD_RUN; + item->Animation.TargetState = STATE_GUARD_RUN; } else { - item->TargetState = STATE_GUARD_STOP; + item->Animation.TargetState = STATE_GUARD_STOP; } if (item->TriggerFlags == 11) item->TriggerFlags = 0; @@ -454,7 +454,7 @@ void GuardControl(short itemNum) item->Position.yRot -= ANGLE(2); else item->Position.yRot += ANGLE(2); - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) item->Position.yRot += -ANGLE(180); break; case STATE_GUARD_FIRE_SINGLE: @@ -474,12 +474,12 @@ void GuardControl(short itemNum) { item->Position.yRot += info.angle; } - if (item->ActiveState == STATE_GUARD_FIRE_FAST) + if (item->Animation.ActiveState == STATE_GUARD_FIRE_FAST) { if (creature->Flags) { - if (item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 10 - && (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase) & 1) + if (item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 10 + && (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase) & 1) creature->Flags = 0; } } @@ -487,7 +487,7 @@ void GuardControl(short itemNum) { creature->Flags = 1; creature->FiredWeapon = 2; - if (item->ActiveState == STATE_GUARD_FIRE_SINGLE) + if (item->Animation.ActiveState == STATE_GUARD_FIRE_SINGLE) ShotLara(item, &info, &SwatGun, joint0, 30); else ShotLara(item, &info, &SwatGun, joint0, 10); @@ -519,11 +519,11 @@ void GuardControl(short itemNum) item->Position.yRot += info.angle; } if (!Targetable(item, &info)) - item->TargetState = STATE_GUARD_STOP; + item->Animation.TargetState = STATE_GUARD_STOP; else if (item->ObjectNumber == ID_GUARD1 || item->ObjectNumber == ID_GUARD2) - item->TargetState = STATE_GUARD_FIRE_SINGLE; + item->Animation.TargetState = STATE_GUARD_FIRE_SINGLE; else - item->TargetState = STATE_GUARD_FIRE_FAST; + item->Animation.TargetState = STATE_GUARD_FIRE_FAST; break; case STATE_GUARD_WALK: creature->LOT.IsJumping = false; @@ -536,13 +536,13 @@ void GuardControl(short itemNum) if (canJump1block || canJump2blocks) { creature->MaxTurn = 0; - item->AnimNumber = animIndex + 41; - item->ActiveState = STATE_GUARD_STOP_START_JUMP; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = animIndex + 41; + item->Animation.ActiveState = STATE_GUARD_STOP_START_JUMP; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; if (canJump1block) - item->TargetState = STATE_GUARD_JUMPING_1BLOCK; + item->Animation.TargetState = STATE_GUARD_JUMPING_1BLOCK; else - item->TargetState = STATE_GUARD_JUMPING_2BLOCKS; + item->Animation.TargetState = STATE_GUARD_JUMPING_2BLOCKS; creature->LOT.IsJumping = true; } else if (info.distance >= 0x100000) @@ -552,22 +552,22 @@ void GuardControl(short itemNum) if (info.distance > 0x900000) { if (!(item->InDrawRoom)) - item->TargetState = STATE_GUARD_RUN; + item->Animation.TargetState = STATE_GUARD_RUN; } } else { - item->TargetState = STATE_GUARD_STOP; + item->Animation.TargetState = STATE_GUARD_STOP; } } else { - item->TargetState = STATE_GUARD_STOP; + item->Animation.TargetState = STATE_GUARD_STOP; } } else { - item->TargetState = STATE_GUARD_AIM; + item->Animation.TargetState = STATE_GUARD_AIM; } break; case STATE_GUARD_RUN: @@ -575,27 +575,27 @@ void GuardControl(short itemNum) creature->MaxTurn = ANGLE(10); if (Targetable(item, &info) && (info.distance < 0x1000000 || info.enemyZone == info.zoneNumber) && item->ObjectNumber != ID_SCIENTIST) { - item->TargetState = STATE_GUARD_AIM; + item->Animation.TargetState = STATE_GUARD_AIM; } else if (canJump1block || canJump2blocks) { creature->MaxTurn = 0; - item->AnimNumber = animIndex + 50; - item->ActiveState = STATE_GUARD_STOP_START_JUMP; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = animIndex + 50; + item->Animation.ActiveState = STATE_GUARD_STOP_START_JUMP; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; if (canJump1block) - item->TargetState = STATE_GUARD_JUMPING_1BLOCK; + item->Animation.TargetState = STATE_GUARD_JUMPING_1BLOCK; else - item->TargetState = STATE_GUARD_JUMPING_2BLOCKS; + item->Animation.TargetState = STATE_GUARD_JUMPING_2BLOCKS; creature->LOT.IsJumping = true; } else if (los) { - item->TargetState = STATE_GUARD_STOP; + item->Animation.TargetState = STATE_GUARD_STOP; } else if (info.distance < 0x900000) { - item->TargetState = STATE_GUARD_WALK; + item->Animation.TargetState = STATE_GUARD_WALK; } if (item->TriggerFlags == 11) { @@ -608,7 +608,7 @@ void GuardControl(short itemNum) if (item->Position.yPos <= item->Floor - 2048 || item->TriggerFlags != 5) { if (item->Position.yPos >= item->Floor - 512) - item->TargetState = STATE_GUARD_AIM; + item->Animation.TargetState = STATE_GUARD_AIM; } else { @@ -631,16 +631,16 @@ void GuardControl(short itemNum) case STATE_GUARD_SITTING: joint2 = AIGuard(creature); if (creature->Alerted) - item->TargetState = STATE_GUARD_STAND_UP; + item->Animation.TargetState = STATE_GUARD_STAND_UP; break; case STATE_GUARD_STAND_UP: case 18: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { TestTriggers(item, true); break; } - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 44) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 44) { item->SwapMeshFlags = 0; short currentItemNumber = g_Level.Rooms[item->RoomNumber].itemNumber; @@ -665,37 +665,37 @@ void GuardControl(short itemNum) break; currentItem->MeshBits = -3; } - else if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) { item->Position.yRot -= ANGLE(90); } break; case 17: joint2 = 0; - if (!item->HitStatus && LaraItem->Velocity < 40 && !Lara.Control.Weapon.HasFired) + if (!item->HitStatus && LaraItem->Animation.Velocity < 40 && !Lara.Control.Weapon.HasFired) creature->Alerted = false; if (creature->Alerted) - item->TargetState = 18; + item->Animation.TargetState = 18; break; case STATE_GUARD_WAITING_ON_WALL: joint2 = AIGuard(creature); if (creature->Alerted) - item->TargetState = STATE_GUARD_STOP; + item->Animation.TargetState = STATE_GUARD_STOP; break; case STATE_GUARD_HUNTING: case STATE_GUARD_HUNTING_IDLE: - if (item->ActiveState == STATE_GUARD_HUNTING_IDLE) + if (item->Animation.ActiveState == STATE_GUARD_HUNTING_IDLE) { if (item->TriggerFlags != 8 || !los || item->HitStatus) - item->TargetState = STATE_GUARD_HUNTING; + item->Animation.TargetState = STATE_GUARD_HUNTING; } creature->LOT.IsJumping = false; creature->MaxTurn = ANGLE(5); if (canJump1block || canJump2blocks || info.distance < 0x100000 || !los || item->HitStatus) - item->TargetState = STATE_GUARD_STOP; + item->Animation.TargetState = STATE_GUARD_STOP; break; case STATE_GUARD_INSERT_CODE: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 39) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 39) { TestTriggers(item, true); } @@ -708,7 +708,7 @@ void GuardControl(short itemNum) if (item->ObjectNumber == ID_PUZZLE_HOLE8) break; } - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { currentItem->MeshBits = 0x1FFF; item->Position.xPos = currentItem->Position.xPos - 256; @@ -718,31 +718,31 @@ void GuardControl(short itemNum) } else { - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 32) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 32) { currentItem->MeshBits = 16381; } - else if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 74) + else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 74) { currentItem->MeshBits = 278461; } - else if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 120) + else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 120) { currentItem->MeshBits = 802621; } - else if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 157) + else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 157) { currentItem->MeshBits = 819001; } - else if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 190) + else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 190) { currentItem->MeshBits = 17592121; } - else if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + g_Level.Anims[item->AnimNumber].frameEnd) + else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + g_Level.Anims[item->Animation.AnimNumber].frameEnd) { currentItem->MeshBits = 0x1FFF; TestTriggers(item, true); - item->RequiredState = STATE_GUARD_WALK; + item->Animation.RequiredState = STATE_GUARD_WALK; item->SwapMeshFlags = 0; } } @@ -766,17 +766,17 @@ void GuardControl(short itemNum) } else { - item->TargetState = STATE_GUARD_STOP; + item->Animation.TargetState = STATE_GUARD_STOP; } break; case STATE_GUARD_SURREND: if (item != Lara.TargetEntity && !(GetRandomControl() & 0x3F)) { if (item->TriggerFlags == 7 || item->TriggerFlags == 9) - item->RequiredState = STATE_GUARD_USE_COMPUTER; - item->TargetState = STATE_GUARD_STOP; + item->Animation.RequiredState = STATE_GUARD_USE_COMPUTER; + item->Animation.TargetState = STATE_GUARD_STOP; } - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 39) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 39) { TestTriggers(item->Position.xPos, item->Position.yPos, item->Position.zPos, enemy->RoomNumber, true); } @@ -796,8 +796,8 @@ void GuardControl(short itemNum) { if (enemy->Flags & 0x10) { - item->TargetState = STATE_GUARD_STOP; - item->RequiredState = STATE_GUARD_USE_COMPUTER; + item->Animation.TargetState = STATE_GUARD_STOP; + item->Animation.RequiredState = STATE_GUARD_USE_COMPUTER; item->TriggerFlags = 300; item->AIBits = GUARD | PATROL1; } @@ -805,20 +805,20 @@ void GuardControl(short itemNum) { if (enemy->Flags & 0x20) { - item->TargetState = STATE_GUARD_STOP; - item->RequiredState = 36; + item->Animation.TargetState = STATE_GUARD_STOP; + item->Animation.RequiredState = 36; item->AIBits = PATROL1 | MODIFY; } else { TestTriggers(creature->Enemy->Position.xPos, creature->Enemy->Position.yPos, creature->Enemy->Position.zPos, enemy->RoomNumber, true); - item->RequiredState = STATE_GUARD_WALK; + item->Animation.RequiredState = STATE_GUARD_WALK; if (creature->Enemy->Flags & 2) item->ItemFlags[3] = (creature->Tosspad & 0xFF) - 1; if (creature->Enemy->Flags & 8) { - item->RequiredState = STATE_GUARD_STOP; + item->Animation.RequiredState = STATE_GUARD_STOP; item->TriggerFlags = 300; item->AIBits |= GUARD | PATROL1; } @@ -827,14 +827,14 @@ void GuardControl(short itemNum) } else { - item->TargetState = STATE_GUARD_STOP; - item->RequiredState = 37; + item->Animation.TargetState = STATE_GUARD_STOP; + item->Animation.RequiredState = 37; } } - if ((item->ActiveState >= 20 - || item->ActiveState == 6 - || item->ActiveState == 8) - && item->ActiveState != 30) + if ((item->Animation.ActiveState >= 20 + || item->Animation.ActiveState == 6 + || item->Animation.ActiveState == 8) + && item->Animation.ActiveState != 30) { CreatureAnimation(itemNum, angle, 0); } @@ -844,39 +844,39 @@ void GuardControl(short itemNum) { case 0: creature->MaxTurn = 0; - item->AnimNumber = animIndex + 38; - item->ActiveState = 23; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = animIndex + 38; + item->Animation.ActiveState = 23; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 1: creature->MaxTurn = 0; - item->AnimNumber = animIndex + 39; - item->ActiveState = 24; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = animIndex + 39; + item->Animation.ActiveState = 24; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 2: creature->MaxTurn = 0; - item->AnimNumber = animIndex + 40; - item->ActiveState = 25; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = animIndex + 40; + item->Animation.ActiveState = 25; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 6: creature->MaxTurn = 0; - item->AnimNumber = animIndex + 35; - item->ActiveState = 20; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = animIndex + 35; + item->Animation.ActiveState = 20; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 7: creature->MaxTurn = 0; - item->AnimNumber = animIndex + 36; - item->ActiveState = 21; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = animIndex + 36; + item->Animation.ActiveState = 21; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 8: creature->MaxTurn = 0; - item->AnimNumber = animIndex + 37; - item->ActiveState = 22; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = animIndex + 37; + item->Animation.ActiveState = 22; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; } } @@ -924,12 +924,12 @@ void SniperControl(short itemNumber) joint1 = info.xAngle; } creature->MaxTurn = 0; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_SNIPER_STOP: item->MeshBits = 0; if (TargetVisible(item, &info)) - item->TargetState = STATE_SNIPER_UNHIDE; + item->Animation.TargetState = STATE_SNIPER_UNHIDE; break; case STATE_SNIPER_UNHIDE: item->MeshBits = -1; @@ -940,11 +940,11 @@ void SniperControl(short itemNumber) || item->HitStatus && GetRandomControl() & 1) { - item->TargetState = STATE_SNIPER_HIDE; + item->Animation.TargetState = STATE_SNIPER_HIDE; } else if (!(GetRandomControl() & 0x1F)) { - item->TargetState = STATE_SNIPER_FIRE; + item->Animation.TargetState = STATE_SNIPER_FIRE; } break; case STATE_SNIPER_FIRE: @@ -962,11 +962,11 @@ void SniperControl(short itemNumber) else { item->HitPoints = 0; - if (item->ActiveState != STATE_SNIPER_DEATH) + if (item->Animation.ActiveState != STATE_SNIPER_DEATH) { - item->AnimNumber = Objects[ID_SNIPER].animIndex + 5; - item->ActiveState = STATE_SNIPER_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_SNIPER].animIndex + 5; + item->Animation.ActiveState = STATE_SNIPER_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } CreatureTilt(item, 0); @@ -981,10 +981,10 @@ void InitialiseMafia2(short itemNum) { ITEM_INFO* item = &g_Level.Items[itemNum]; ClearItem(itemNum); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_GUARD_STOP; - item->ActiveState = STATE_GUARD_STOP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_GUARD_STOP; + item->Animation.ActiveState = STATE_GUARD_STOP; item->SwapMeshFlags = 9216; } @@ -1074,7 +1074,7 @@ void Mafia2Control(short itemNum) CreatureMood(item, &info, creature->Enemy != LaraItem); angle = CreatureTurn(item, creature->MaxTurn); creature->Enemy = LaraItem; - if (laraInfo.distance < SQUARE(2048) && LaraItem->Velocity > 20 || item->HitStatus || TargetVisible(item, &laraInfo)) + if (laraInfo.distance < SQUARE(2048) && LaraItem->Animation.Velocity > 20 || item->HitStatus || TargetVisible(item, &laraInfo)) { if (!(item->AIBits & FOLLOW)) { @@ -1082,7 +1082,7 @@ void Mafia2Control(short itemNum) AlertAllGuards(itemNum); } } - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_MAFIA2_STOP: creature->LOT.IsJumping = false; @@ -1103,55 +1103,55 @@ void Mafia2Control(short itemNum) { if (item->SwapMeshFlags == 9216) { - item->TargetState = STATE_MAFIA2_UNDRAW_GUNS; + item->Animation.TargetState = STATE_MAFIA2_UNDRAW_GUNS; break; } } else if (item->SwapMeshFlags == 9216) { - item->TargetState = STATE_MAFIA2_TURN180; + item->Animation.TargetState = STATE_MAFIA2_TURN180; break; } if (Targetable(item, &info)) { if (info.distance < SQUARE(1024) || info.zoneNumber != info.enemyZone) { - item->TargetState = STATE_MAFIA2_AIM; + item->Animation.TargetState = STATE_MAFIA2_AIM; } else if (!(item->AIBits & MODIFY)) { - item->TargetState = STATE_MAFIA2_WALK; + item->Animation.TargetState = STATE_MAFIA2_WALK; } } else { if (item->AIBits & PATROL1) { - item->TargetState = STATE_MAFIA2_WALK; + item->Animation.TargetState = STATE_MAFIA2_WALK; } else { if (canJump1sector || canJump2sectors) { creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 41; - item->ActiveState = STATE_MAFIA2_STOP_START_JUMP; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 41; + item->Animation.ActiveState = STATE_MAFIA2_STOP_START_JUMP; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; if (canJump2sectors) - item->TargetState = STATE_MAFIA2_JUMPING_2BLOCKS; + item->Animation.TargetState = STATE_MAFIA2_JUMPING_2BLOCKS; else - item->TargetState = STATE_MAFIA2_JUMPING_1BLOCK; + item->Animation.TargetState = STATE_MAFIA2_JUMPING_1BLOCK; creature->LOT.IsJumping = true; break; } if (creature->Mood != MoodType::Bored) { if (info.distance >= SQUARE(3072)) - item->TargetState = STATE_MAFIA2_WALK; + item->Animation.TargetState = STATE_MAFIA2_WALK; } else { - item->TargetState = STATE_MAFIA2_STOP; + item->Animation.TargetState = STATE_MAFIA2_STOP; } } } @@ -1163,10 +1163,10 @@ void Mafia2Control(short itemNum) item->Position.yRot -= ANGLE(2); else item->Position.yRot += ANGLE(2); - if (item->FrameNumber != g_Level.Anims[item->AnimNumber].frameBase + 16 + if (item->Animation.FrameNumber != g_Level.Anims[item->Animation.AnimNumber].frameBase + 16 || item->SwapMeshFlags != 9216) { - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) item->Position.yRot += -ANGLE(180); } else @@ -1218,15 +1218,15 @@ void Mafia2Control(short itemNum) } if (Targetable(item, &info)) { - item->TargetState = STATE_MAFIA2_FIRE; + item->Animation.TargetState = STATE_MAFIA2_FIRE; } else if (laraInfo.angle > 20480 || laraInfo.angle < -20480) { - item->TargetState = 32; + item->Animation.TargetState = 32; } else { - item->TargetState = STATE_MAFIA2_STOP; + item->Animation.TargetState = STATE_MAFIA2_STOP; } break; case STATE_MAFIA2_WALK: @@ -1234,7 +1234,7 @@ void Mafia2Control(short itemNum) creature->MaxTurn = ANGLE(5); if (Targetable(item, &info) && (info.distance < SQUARE(1024) || info.zoneNumber != info.enemyZone)) { - item->TargetState = STATE_MAFIA2_AIM; + item->Animation.TargetState = STATE_MAFIA2_AIM; } else { @@ -1242,24 +1242,24 @@ void Mafia2Control(short itemNum) { creature->MaxTurn = 0; creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 41; - item->ActiveState = STATE_MAFIA2_STOP_START_JUMP; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 41; + item->Animation.ActiveState = STATE_MAFIA2_STOP_START_JUMP; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; if (canJump2sectors) - item->TargetState = STATE_MAFIA2_JUMPING_2BLOCKS; + item->Animation.TargetState = STATE_MAFIA2_JUMPING_2BLOCKS; else - item->TargetState = STATE_MAFIA2_JUMPING_1BLOCK; + item->Animation.TargetState = STATE_MAFIA2_JUMPING_1BLOCK; creature->LOT.IsJumping = true; break; } if (info.distance >= SQUARE(1024)) { if (info.distance > SQUARE(3072)) - item->TargetState = STATE_MAFIA2_RUN; + item->Animation.TargetState = STATE_MAFIA2_RUN; } else { - item->TargetState = STATE_MAFIA2_STOP; + item->Animation.TargetState = STATE_MAFIA2_STOP; } } break; @@ -1268,23 +1268,23 @@ void Mafia2Control(short itemNum) creature->MaxTurn = ANGLE(10); if (Targetable(item, &info) && (info.distance < SQUARE(1024) || info.zoneNumber != info.enemyZone)) { - item->TargetState = STATE_MAFIA2_AIM; + item->Animation.TargetState = STATE_MAFIA2_AIM; } else if (canJump1sector || canJump2sectors) { creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 50; - item->ActiveState = STATE_MAFIA2_STOP_START_JUMP; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 50; + item->Animation.ActiveState = STATE_MAFIA2_STOP_START_JUMP; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; if (canJump2sectors) - item->TargetState = STATE_MAFIA2_JUMPING_2BLOCKS; + item->Animation.TargetState = STATE_MAFIA2_JUMPING_2BLOCKS; else - item->TargetState = STATE_MAFIA2_JUMPING_1BLOCK; + item->Animation.TargetState = STATE_MAFIA2_JUMPING_1BLOCK; creature->LOT.IsJumping = true; } else if (info.distance < SQUARE(3072)) { - item->TargetState = STATE_MAFIA2_WALK; + item->Animation.TargetState = STATE_MAFIA2_WALK; } break; case STATE_MAFIA2_UNDRAW_GUNS: @@ -1293,7 +1293,7 @@ void Mafia2Control(short itemNum) item->Position.yRot += ANGLE(2); else item->Position.yRot -= ANGLE(2); - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 16 + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 16 && item->SwapMeshFlags == 9216) item->SwapMeshFlags = 128; break; @@ -1303,27 +1303,27 @@ void Mafia2Control(short itemNum) } else { - if (item->ActiveState != STATE_MAFIA2_DEATH2 && item->ActiveState != STATE_MAFIA2_DEATH1) + if (item->Animation.ActiveState != STATE_MAFIA2_DEATH2 && item->Animation.ActiveState != STATE_MAFIA2_DEATH1) { if (info.angle >= 12288 || info.angle <= -12288) { - item->ActiveState = STATE_MAFIA2_DEATH2; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 16; + item->Animation.ActiveState = STATE_MAFIA2_DEATH2; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 16; item->Position.yRot += info.angle - ANGLE(180); } else { - item->ActiveState = STATE_MAFIA2_DEATH1; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 11; + item->Animation.ActiveState = STATE_MAFIA2_DEATH1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 11; item->Position.yRot += info.angle; } - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } CreatureJoint(item, 0, joint0); CreatureJoint(item, 1, joint1); CreatureJoint(item, 2, joint2); - if (item->ActiveState >= 20 || item->ActiveState == 6 || item->ActiveState == 8) + if (item->Animation.ActiveState >= 20 || item->Animation.ActiveState == 6 || item->Animation.ActiveState == 8) { CreatureAnimation(itemNum, angle, 0); } @@ -1333,39 +1333,39 @@ void Mafia2Control(short itemNum) { case 0: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 38; - item->ActiveState = 23; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 38; + item->Animation.ActiveState = 23; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 1: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 39; - item->ActiveState = 24; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 39; + item->Animation.ActiveState = 24; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 2: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 40; - item->ActiveState = 25; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 40; + item->Animation.ActiveState = 25; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 6: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 35; - item->ActiveState = 20; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 35; + item->Animation.ActiveState = 20; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 7: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 36; - item->ActiveState = 21; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 36; + item->Animation.ActiveState = 21; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; case 8: creature->MaxTurn = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 37; - item->ActiveState = 22; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 37; + item->Animation.ActiveState = 22; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; break; default: return; diff --git a/TR5Main/Objects/TR5/Entity/tr5_hydra.cpp b/TR5Main/Objects/TR5/Entity/tr5_hydra.cpp index 0d22f316a..3ddc8188d 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_hydra.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_hydra.cpp @@ -41,10 +41,10 @@ void InitialiseHydra(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = 30 * item->TriggerFlags + g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = HYDRA_STATE_STOP; - item->ActiveState = HYDRA_STATE_STOP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = 30 * item->TriggerFlags + g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = HYDRA_STATE_STOP; + item->Animation.ActiveState = HYDRA_STATE_STOP; if (item->TriggerFlags == 1) item->Position.zPos += CLICK(1.5f); @@ -188,9 +188,9 @@ void HydraControl(short itemNumber) GetCreatureMood(item, &AI, VIOLENT); CreatureMood(item, &AI, VIOLENT); - if (item->ActiveState != 5 && - item->ActiveState != 10 && - item->ActiveState != HYDRA_STATE_DEATH) + if (item->Animation.ActiveState != 5 && + item->Animation.ActiveState != 10 && + item->Animation.ActiveState != HYDRA_STATE_DEATH) { if (abs(AI.angle) >= ANGLE(1.0f)) { @@ -208,7 +208,7 @@ void HydraControl(short itemNumber) tilt = ANGLE(2.8f); } - if (item->ActiveState != 12) + if (item->Animation.ActiveState != 12) { joint1 = AI.angle / 2; joint3 = AI.angle / 2; @@ -222,7 +222,7 @@ void HydraControl(short itemNumber) short angles[2]; short roomNumber; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case HYDRA_STATE_STOP: creature->MaxTurn = ANGLE(1.0f); @@ -238,13 +238,13 @@ void HydraControl(short itemNumber) if (AI.distance >= pow(SECTOR(2), 2) && GetRandomControl() & 0x1F) { if (!(GetRandomControl() & 0xF)) - item->TargetState = HYDRA_STATE_AIM; + item->Animation.TargetState = HYDRA_STATE_AIM; } else - item->TargetState = HYDRA_STATE_BITE_ATTACK1; + item->Animation.TargetState = HYDRA_STATE_BITE_ATTACK1; } else - item->TargetState = 6; + item->Animation.TargetState = 6; break; @@ -276,7 +276,7 @@ void HydraControl(short itemNumber) if (damage > 0) { item->HitPoints -= damage; - item->TargetState = HYDRA_STATE_HURT; + item->Animation.TargetState = HYDRA_STATE_HURT; CreatureEffect2(item, &HydraBite, 10 * damage, item->Position.yRot, DoBloodSplat); } } @@ -301,7 +301,7 @@ void HydraControl(short itemNumber) if ((GetRandomControl() & 0xF) < damage && AI.distance < SQUARE(10240) && damage > 0) { item->HitPoints -= damage; - item->TargetState = 4; + item->Animation.TargetState = 4; CreatureEffect2(item, &HydraBite, 10 * damage, item->Position.yRot, DoBloodSplat); } } @@ -313,7 +313,7 @@ void HydraControl(short itemNumber) if (!(GlobalCounter & 3)) { - frame = ((g_Level.Anims[item->AnimNumber].frameBase - item->FrameNumber) / 8) + 1; + frame = ((g_Level.Anims[item->Animation.AnimNumber].frameBase - item->Animation.FrameNumber) / 8) + 1; if (frame > 16) frame = 16; @@ -323,7 +323,7 @@ void HydraControl(short itemNumber) break; case 3: - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { pos1 = { 0, 1024, 40 }; GetJointAbsPosition(item, &pos1, 10); @@ -364,15 +364,15 @@ void HydraControl(short itemNumber) if (AI.distance >= pow(CLICK(5), 2)) { if (AI.distance >= pow(CLICK(7), 2)) - item->TargetState = 0; + item->Animation.TargetState = 0; else - item->TargetState = 9; + item->Animation.TargetState = 9; } else - item->TargetState = 8; + item->Animation.TargetState = 8; } else - item->TargetState = 7; + item->Animation.TargetState = 7; break; @@ -384,14 +384,14 @@ void HydraControl(short itemNumber) { item->HitPoints = 0; - if (item->ActiveState != HYDRA_STATE_DEATH) + if (item->Animation.ActiveState != HYDRA_STATE_DEATH) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 15; - item->ActiveState = HYDRA_STATE_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 15; + item->Animation.ActiveState = HYDRA_STATE_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } - if (!((item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase) & 7)) + if (!((item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase) & 7)) { if (item->ItemFlags[3] < 12) { diff --git a/TR5Main/Objects/TR5/Entity/tr5_imp.cpp b/TR5Main/Objects/TR5/Entity/tr5_imp.cpp index 78b411dd7..4372569a4 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_imp.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_imp.cpp @@ -47,22 +47,22 @@ void InitialiseImp(short itemNumber) if (item->TriggerFlags == 2 || item->TriggerFlags == 12) { state = IMP_STATE_START_ROLL; - item->AnimNumber = Objects[ID_IMP].animIndex + 8; + item->Animation.AnimNumber = Objects[ID_IMP].animIndex + 8; } else if (item->TriggerFlags == 1 || item->TriggerFlags == 11) { state = IMP_STATE_START_CLIMB; - item->AnimNumber = Objects[ID_IMP].animIndex + 7; + item->Animation.AnimNumber = Objects[ID_IMP].animIndex + 7; } else { state = IMP_STATE_IDLE; - item->AnimNumber = Objects[ID_IMP].animIndex + 1; + item->Animation.AnimNumber = Objects[ID_IMP].animIndex + 1; } - item->TargetState = state; - item->ActiveState = state; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.TargetState = state; + item->Animation.ActiveState = state; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } static void ImpThrowStones(ITEM_INFO* item) @@ -146,12 +146,12 @@ void ImpControl(short itemNumber) int d1 = item->Position.yPos - LaraItem->Position.yPos + CLICK(1.5f); - if (LaraItem->ActiveState == LS_CROUCH_IDLE || - LaraItem->ActiveState == LS_CROUCH_ROLL || - LaraItem->ActiveState > LS_MONKEY_TURN_180 && - LaraItem->ActiveState < LS_HANG_TO_CRAWL || - LaraItem->ActiveState == LS_CROUCH_TURN_LEFT || - LaraItem->ActiveState == LS_CROUCH_TURN_RIGHT) + if (LaraItem->Animation.ActiveState == LS_CROUCH_IDLE || + LaraItem->Animation.ActiveState == LS_CROUCH_ROLL || + LaraItem->Animation.ActiveState > LS_MONKEY_TURN_180 && + LaraItem->Animation.ActiveState < LS_HANG_TO_CRAWL || + LaraItem->Animation.ActiveState == LS_CROUCH_TURN_LEFT || + LaraItem->Animation.ActiveState == LS_CROUCH_TURN_RIGHT) { d1 = item->Position.yPos - LaraItem->Position.yPos; } @@ -162,7 +162,7 @@ void ImpControl(short itemNumber) GetCreatureMood(item, &AI, VIOLENT); - if (item->ActiveState == IMP_STATE_SCARED) + if (item->Animation.ActiveState == IMP_STATE_SCARED) creature->Mood = MoodType::Escape; CreatureMood(item, &AI, VIOLENT); @@ -178,17 +178,17 @@ void ImpControl(short itemNumber) else item->SwapMeshFlags = 0; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case IMP_STATE_WALK: creature->MaxTurn = ANGLE(7.0f); if (AI.distance <= pow(SECTOR(2), 2)) { if (AI.distance < pow(SECTOR(2), 2)) - item->TargetState = IMP_STATE_IDLE; + item->Animation.TargetState = IMP_STATE_IDLE; } else - item->TargetState = IMP_STATE_RUN; + item->Animation.TargetState = IMP_STATE_RUN; break; @@ -199,23 +199,23 @@ void ImpControl(short itemNumber) if (AI.bite && AI.distance < pow(170, 2) && item->TriggerFlags < 10) { if (GetRandomControl() & 1) - item->TargetState = IMP_STATE_ATTACK_1; + item->Animation.TargetState = IMP_STATE_ATTACK_1; else - item->TargetState = IMP_STATE_ATTACK_2; + item->Animation.TargetState = IMP_STATE_ATTACK_2; } else if (item->AIBits & FOLLOW) - item->TargetState = IMP_STATE_WALK; + item->Animation.TargetState = IMP_STATE_WALK; else { if (item->TriggerFlags == 3) - item->TargetState = IMP_STATE_THROW_STONES; + item->Animation.TargetState = IMP_STATE_THROW_STONES; else if (AI.distance <= pow(SECTOR(2), 2)) { if (AI.distance > pow(SECTOR(0.5f), 2) || item->TriggerFlags < 10) - item->TargetState = IMP_STATE_WALK; + item->Animation.TargetState = IMP_STATE_WALK; } else - item->TargetState = IMP_STATE_RUN; + item->Animation.TargetState = IMP_STATE_RUN; } break; @@ -226,10 +226,10 @@ void ImpControl(short itemNumber) if (AI.distance >= pow(SECTOR(0.5f), 2)) { if (AI.distance < pow(SECTOR(2), 2)) - item->TargetState = IMP_STATE_WALK; + item->Animation.TargetState = IMP_STATE_WALK; } else - item->TargetState = IMP_STATE_IDLE; + item->Animation.TargetState = IMP_STATE_IDLE; break; @@ -260,7 +260,7 @@ void ImpControl(short itemNumber) case IMP_STATE_THROW_STONES: creature->MaxTurn = -1; - if (item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase == 40) + if (item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase == 40) ImpThrowStones(item); break; @@ -273,11 +273,11 @@ void ImpControl(short itemNumber) { item->HitPoints = 0; - if (item->ActiveState != IMP_STATE_DEATH) + if (item->Animation.ActiveState != IMP_STATE_DEATH) { - item->AnimNumber = Objects[ID_IMP].animIndex + IMP_ANIM_DEATH; - item->ActiveState = IMP_STATE_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_IMP].animIndex + IMP_ANIM_DEATH; + item->Animation.ActiveState = IMP_STATE_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } diff --git a/TR5Main/Objects/TR5/Entity/tr5_lagoon_witch.cpp b/TR5Main/Objects/TR5/Entity/tr5_lagoon_witch.cpp index 85020f9ec..494b5232c 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_lagoon_witch.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_lagoon_witch.cpp @@ -33,10 +33,10 @@ void InitialiseLagoonWitch(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; - item->TargetState = WITCH_STATE_IDLE; - item->ActiveState = WITCH_STATE_IDLE; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.TargetState = WITCH_STATE_IDLE; + item->Animation.ActiveState = WITCH_STATE_IDLE; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; item->Position.yPos += 512; } @@ -56,12 +56,12 @@ void LagoonWitchControl(short itemNumber) if (item->HitPoints <= 0) { - if (item->ActiveState != WITCH_STATE_DEATH) + if (item->Animation.ActiveState != WITCH_STATE_DEATH) { item->HitPoints = 0; - item->ActiveState = WITCH_STATE_DEATH; - item->AnimNumber = object->animIndex + WITCH_ANIM_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.ActiveState = WITCH_STATE_DEATH; + item->Animation.AnimNumber = object->animIndex + WITCH_ANIM_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } else @@ -97,13 +97,13 @@ void LagoonWitchControl(short itemNumber) creature->MaxTurn = 0; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case WITCH_STATE_SWIM: creature->MaxTurn = ANGLE(4.0f); if (AI.distance < pow(SECTOR(1), 2)) - item->TargetState = WITCH_STATE_IDLE; + item->Animation.TargetState = WITCH_STATE_IDLE; break; @@ -112,11 +112,11 @@ void LagoonWitchControl(short itemNumber) creature->Flags = 0; if (AI.distance < pow(CLICK(3), 2)) - item->TargetState = WITCH_STATE_ATTACK; + item->Animation.TargetState = WITCH_STATE_ATTACK; else if (AI.distance > pow(SECTOR(1), 2)) - item->TargetState = WITCH_STATE_SWIM; + item->Animation.TargetState = WITCH_STATE_SWIM; else - item->TargetState = WITCH_STATE_IDLE; + item->Animation.TargetState = WITCH_STATE_IDLE; break; @@ -125,7 +125,7 @@ void LagoonWitchControl(short itemNumber) if (!creature->Flags && item->TouchBits & 0x3C3C0 && - item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 29) + item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 29) { CreatureEffect2(item, &LagoonWitchBite, 10, item->Position.yRot, DoBloodSplat); creature->Flags = WITCH_STATE_SWIM; diff --git a/TR5Main/Objects/TR5/Entity/tr5_larson.cpp b/TR5Main/Objects/TR5/Entity/tr5_larson.cpp index 779b3873c..423bb6f3c 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_larson.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_larson.cpp @@ -34,10 +34,10 @@ void InitialiseLarson(short itemNum) ClearItem(itemNum); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = STATE_TR5_LARSON_STOP; - item->ActiveState = STATE_TR5_LARSON_STOP; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; + item->Animation.ActiveState = STATE_TR5_LARSON_STOP; if (!item->TriggerFlags) return; @@ -104,14 +104,14 @@ void LarsonControl(short itemNumber) if (CurrentLevel == 2) { item->ItemFlags[3] = 1; - item->Airborne = false; + item->Animation.Airborne = false; item->HitStatus = false; item->Collidable = false; item->Status = ITEM_DEACTIVATED; } else { - item->Airborne = false; + item->Animation.Airborne = false; item->HitStatus = false; item->Collidable = false; item->Status = ITEM_ACTIVE; @@ -147,7 +147,7 @@ void LarsonControl(short itemNumber) CreatureMood(item, &info, VIOLENT); if (info.distance < SQUARE(2048) - && LaraItem->Velocity > 20 + && LaraItem->Animation.Velocity > 20 || item->HitStatus || TargetVisible(item, &info) != 0) { @@ -157,7 +157,7 @@ void LarsonControl(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATE_TR5_LARSON_STOP: joint0 = info.angle / 2; @@ -165,24 +165,24 @@ void LarsonControl(short itemNumber) if (info.ahead) joint1 = info.xAngle; - if (item->RequiredState) + if (item->Animation.RequiredState) { - item->TargetState = item->RequiredState; + item->Animation.TargetState = item->Animation.RequiredState; } else if (item->AIBits & AMBUSH) { - item->TargetState = STATE_TR5_LARSON_RUN; + item->Animation.TargetState = STATE_TR5_LARSON_RUN; } else if (Targetable(item, &info)) { - item->TargetState = STATE_TR5_LARSON_AIM; + item->Animation.TargetState = STATE_TR5_LARSON_AIM; } else { if (item->AIBits & GUARD || CurrentLevel == 2 || item->ItemFlags[3]) { creature->MaxTurn = 0; - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; if (abs(info.angle) >= ANGLE(2)) { if (info.angle > 0) @@ -200,13 +200,13 @@ void LarsonControl(short itemNumber) if (creature->Mood != MoodType::Bored) { if (creature->Mood == MoodType::Escape) - item->TargetState = STATE_TR5_LARSON_RUN; + item->Animation.TargetState = STATE_TR5_LARSON_RUN; else - item->TargetState = STATE_TR5_LARSON_WALK; + item->Animation.TargetState = STATE_TR5_LARSON_WALK; } else { - item->TargetState = GetRandomControl() >= 96 ? 2 : 6; + item->Animation.TargetState = GetRandomControl() >= 96 ? 2 : 6; } } } @@ -219,25 +219,25 @@ void LarsonControl(short itemNumber) creature->MaxTurn = ANGLE(7); if (creature->Mood == MoodType::Bored && GetRandomControl() < 96) { - item->RequiredState = STATE_TR5_LARSON_IDLE; - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.RequiredState = STATE_TR5_LARSON_IDLE; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; break; } if (creature->Mood == MoodType::Escape || item->AIBits & AMBUSH) { - item->RequiredState = STATE_TR5_LARSON_RUN; - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.RequiredState = STATE_TR5_LARSON_RUN; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; } else if (Targetable(item, &info)) { - item->RequiredState = STATE_TR5_LARSON_AIM; - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.RequiredState = STATE_TR5_LARSON_AIM; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; } else if (!info.ahead || info.distance > SQUARE(3072)) { - item->RequiredState = STATE_TR5_LARSON_RUN; - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.RequiredState = STATE_TR5_LARSON_RUN; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; } break; @@ -249,32 +249,32 @@ void LarsonControl(short itemNumber) if (creature->ReachedGoal) { - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; } else if (item->AIBits & AMBUSH) { - item->TargetState = STATE_TR5_LARSON_RUN; + item->Animation.TargetState = STATE_TR5_LARSON_RUN; } else if (creature->Mood != MoodType::Bored || GetRandomControl() >= 96) { if (Targetable(item, &info)) { - item->RequiredState = STATE_TR5_LARSON_AIM; - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.RequiredState = STATE_TR5_LARSON_AIM; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; } else if (info.ahead) { if (info.distance <= SQUARE(3072)) { - item->RequiredState = STATE_TR5_LARSON_WALK; - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.RequiredState = STATE_TR5_LARSON_WALK; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; } } } else { - item->RequiredState = STATE_TR5_LARSON_IDLE; - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.RequiredState = STATE_TR5_LARSON_IDLE; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; } break; @@ -297,9 +297,9 @@ void LarsonControl(short itemNumber) } if (Targetable(item, &info)) - item->TargetState = STATE_TR5_LARSON_ATTACK; + item->Animation.TargetState = STATE_TR5_LARSON_ATTACK; else - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; break; case STATE_TR5_LARSON_IDLE: @@ -310,14 +310,14 @@ void LarsonControl(short itemNumber) if (creature->Mood != MoodType::Bored) { - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; } else { if (GetRandomControl() <= 96) { - item->RequiredState = STATE_TR5_LARSON_WALK; - item->TargetState = STATE_TR5_LARSON_STOP; + item->Animation.RequiredState = STATE_TR5_LARSON_WALK; + item->Animation.TargetState = STATE_TR5_LARSON_STOP; } } break; @@ -339,7 +339,7 @@ void LarsonControl(short itemNumber) { item->Position.yRot += info.angle; } - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase) { if (item->ObjectNumber == ID_PIERRE) { @@ -353,7 +353,7 @@ void LarsonControl(short itemNumber) creature->FiredWeapon = 2; } if (creature->Mood == MoodType::Escape && GetRandomControl() > 0x2000) - item->RequiredState = STATE_TR5_LARSON_STOP; + item->Animation.RequiredState = STATE_TR5_LARSON_STOP; break; default: @@ -361,11 +361,11 @@ void LarsonControl(short itemNumber) } } - else if (item->ActiveState == STATE_TR5_LARSON_DIE) + else if (item->Animation.ActiveState == STATE_TR5_LARSON_DIE) { // When Larson dies, it activates trigger at start position if (item->ObjectNumber == ID_LARSON - && item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + && item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) { short roomNumber = item->ItemFlags[2] & 0xFF; short floorHeight = item->ItemFlags[2] & 0xFF00; @@ -384,11 +384,11 @@ void LarsonControl(short itemNumber) { // Die if (item->ObjectNumber == ID_PIERRE) - item->AnimNumber = Objects[ID_PIERRE].animIndex + ANIMATION_TR5_PIERRE_DIE; + item->Animation.AnimNumber = Objects[ID_PIERRE].animIndex + ANIMATION_TR5_PIERRE_DIE; else - item->AnimNumber = Objects[ID_LARSON].animIndex + ANIMATION_TR5_LARSON_DIE; - item->ActiveState = STATE_TR5_LARSON_DIE; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[ID_LARSON].animIndex + ANIMATION_TR5_LARSON_DIE; + item->Animation.ActiveState = STATE_TR5_LARSON_DIE; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } CreatureTilt(item, tilt); diff --git a/TR5Main/Objects/TR5/Entity/tr5_laser_head.cpp b/TR5Main/Objects/TR5/Entity/tr5_laser_head.cpp index 2dbc98c6d..cb3f72abb 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_laser_head.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_laser_head.cpp @@ -187,7 +187,7 @@ void InitialiseLaserHead(short itemNumber) int y = item->Position.yPos - 640; item->Position.yPos = y; item->ItemFlags[1] = y - 640; - item->ActiveState = 0; + item->Animation.ActiveState = 0; item->ItemFlags[3] = 90; ZeroMemory(&LaserHeadData, sizeof(LASER_HEAD_STRUCT)); @@ -210,23 +210,23 @@ void LaserHeadControl(short itemNumber) { if (!(GlobalCounter & 7)) { - if (item->ActiveState < 8) + if (item->Animation.ActiveState < 8) { - short tentacleNumber = creature->Tentacles[item->ActiveState]; - g_Level.Items[tentacleNumber].TargetState = 2; - item->ActiveState++; + short tentacleNumber = creature->Tentacles[item->Animation.ActiveState]; + g_Level.Items[tentacleNumber].Animation.TargetState = 2; + item->Animation.ActiveState++; } } // Destroy tentacle items - if (item->ActiveState > 0) + if (item->Animation.ActiveState > 0) { for (int i = 0; i < 8; i++) { ITEM_INFO* tentacleItem = &g_Level.Items[creature->Tentacles[i]]; - if (tentacleItem->AnimNumber == Objects[tentacleItem->ObjectNumber].animIndex + 1 - && tentacleItem->FrameNumber == g_Level.Anims[tentacleItem->AnimNumber].frameEnd + if (tentacleItem->Animation.AnimNumber == Objects[tentacleItem->ObjectNumber].animIndex + 1 + && tentacleItem->Animation.FrameNumber == g_Level.Anims[tentacleItem->Animation.AnimNumber].frameEnd && tentacleItem->MeshBits & 1) { SoundEffect(SFX_TR4_HIT_ROCK, &item->Position, 0); @@ -236,8 +236,8 @@ void LaserHeadControl(short itemNumber) } } - item->Position.yPos = item->ItemFlags[1] - (192 - item->Velocity) * phd_sin(item->ItemFlags[2]); - item->ItemFlags[2] += ONE_DEGREE * item->Velocity; + item->Position.yPos = item->ItemFlags[1] - (192 - item->Animation.Velocity) * phd_sin(item->ItemFlags[2]); + item->ItemFlags[2] += ONE_DEGREE * item->Animation.Velocity; if (!(GlobalCounter & 7)) { @@ -249,8 +249,8 @@ void LaserHeadControl(short itemNumber) InterpolateAngle(item->TriggerFlags, &item->Position.xRot, 0, 2); // Final death - item->Velocity++; - if (item->Velocity > 136) + item->Animation.Velocity++; + if (item->Animation.Velocity > 136) { ExplodeItemNode(&g_Level.Items[creature->BaseItem], 0, 0, 128); KillItem(creature->BaseItem); @@ -399,7 +399,7 @@ void LaserHeadControl(short itemNumber) if (!(GetRandomControl() & 0x1F) && abs(LaserHeadData.xRot) < 1024 && abs(LaserHeadData.yRot) < 1024 - && !LaraItem->VerticalVelocity + && !LaraItem->Animation.VerticalVelocity || !(GetRandomControl() & 0x1FF)) { item->ItemFlags[0]++; @@ -627,10 +627,10 @@ void LaserHeadControl(short itemNumber) } else { - item->VerticalVelocity += 3; - if (item->VerticalVelocity > 32) - item->VerticalVelocity = 32; - item->Position.yPos -= item->VerticalVelocity; + item->Animation.VerticalVelocity += 3; + if (item->Animation.VerticalVelocity > 32) + item->Animation.VerticalVelocity = 32; + item->Position.yPos -= item->Animation.VerticalVelocity; } } else if (!(GlobalCounter & 7)) @@ -652,8 +652,8 @@ void LaserHeadControl(short itemNumber) { short tentacleItemNumber = creature->Tentacles[i]; ITEM_INFO* tentacleItem = &g_Level.Items[tentacleItemNumber]; - if (tentacleItem->AnimNumber == Objects[tentacleItem->ObjectNumber].animIndex - && tentacleItem->FrameNumber != g_Level.Anims[tentacleItem->AnimNumber].frameEnd) + if (tentacleItem->Animation.AnimNumber == Objects[tentacleItem->ObjectNumber].animIndex + && tentacleItem->Animation.FrameNumber != g_Level.Anims[tentacleItem->Animation.AnimNumber].frameEnd) { break; } @@ -672,7 +672,7 @@ void LaserHeadControl(short itemNumber) item->ItemFlags[0] = 3; item->ItemFlags[3] = item->Position.yRot + (GetRandomControl() & 0x1000) - 2048; - item->Velocity = 3; + item->Animation.Velocity = 3; item->TriggerFlags = item->Position.xRot + (GetRandomControl() & 0x1000) - 2048; } } diff --git a/TR5Main/Objects/TR5/Entity/tr5_lion.cpp b/TR5Main/Objects/TR5/Entity/tr5_lion.cpp index 02bf92e4b..f45fa872a 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_lion.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_lion.cpp @@ -21,10 +21,10 @@ void InitialiseLion(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 1; - item->ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 1; + item->Animation.ActiveState = 1; } void LionControl(short itemNumber) @@ -44,11 +44,11 @@ void LionControl(short itemNumber) { item->HitPoints = 0; - if (item->ActiveState != 5) + if (item->Animation.ActiveState != 5) { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + (GetRandomControl() & 1) + 7; - item->ActiveState = 5; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + (GetRandomControl() & 1) + 7; + item->Animation.ActiveState = 5; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } else @@ -65,21 +65,21 @@ void LionControl(short itemNumber) angle = CreatureTurn(item, creature->MaxTurn); joint0 = -16 * angle; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case 1: creature->MaxTurn = 0; - if (item->RequiredState) + if (item->Animation.RequiredState) { - item->TargetState = item->RequiredState; + item->Animation.TargetState = item->Animation.RequiredState; break; } if (creature->Mood == MoodType::Bored) { if (!(GetRandomControl() & 0x3F)) - item->TargetState = 2; + item->Animation.TargetState = 2; break; } @@ -87,18 +87,18 @@ void LionControl(short itemNumber) { if (item->TouchBits & 0x200048) { - item->TargetState = 7; + item->Animation.TargetState = 7; break; } if (AI.distance < pow(SECTOR(1), 2)) { - item->TargetState = 4; + item->Animation.TargetState = 4; break; } } - item->TargetState = 3; + item->Animation.TargetState = 3; break; case 2: @@ -108,12 +108,12 @@ void LionControl(short itemNumber) { if (GetRandomControl() < 128) { - item->RequiredState = 6; - item->TargetState = 1; + item->Animation.RequiredState = 6; + item->Animation.TargetState = 1; } } else - item->TargetState = 1; + item->Animation.TargetState = 1; break; @@ -124,28 +124,28 @@ void LionControl(short itemNumber) if (creature->Mood != MoodType::Bored) { if (AI.ahead && AI.distance < pow(SECTOR(1), 2)) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (item->TouchBits & 0x200048 && AI.ahead) - item->TargetState = 1; + item->Animation.TargetState = 1; else if (creature->Mood != MoodType::Escape) { if (GetRandomControl() < 128) { - item->RequiredState = 6; - item->TargetState = 1; + item->Animation.RequiredState = 6; + item->Animation.TargetState = 1; } } } else - item->TargetState = 1; + item->Animation.TargetState = 1; break; case 4: - if (!item->RequiredState && item->TouchBits & 0x200048) + if (!item->Animation.RequiredState && item->TouchBits & 0x200048) { CreatureEffect2(item, &LionBite1, 10, item->Position.yRot, DoBloodSplat); - item->RequiredState = 1; + item->Animation.RequiredState = 1; LaraItem->HitPoints -= 200; LaraItem->HitStatus = true; @@ -156,10 +156,10 @@ void LionControl(short itemNumber) case 7: creature->MaxTurn = ANGLE(1.0f); - if (!item->RequiredState && item->TouchBits & 0x200048) + if (!item->Animation.RequiredState && item->TouchBits & 0x200048) { CreatureEffect2(item, &LionBite2, 10, item->Position.yRot, DoBloodSplat); - item->RequiredState = 1; + item->Animation.RequiredState = 1; LaraItem->HitPoints -= 60; LaraItem->HitStatus = true; diff --git a/TR5Main/Objects/TR5/Entity/tr5_reaper.cpp b/TR5Main/Objects/TR5/Entity/tr5_reaper.cpp index 0188d3201..f6c19a64a 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_reaper.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_reaper.cpp @@ -15,10 +15,10 @@ void InitialiseReaper(short itemNumber) auto* item = &g_Level.Items[itemNumber]; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + 1; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 2; - item->ActiveState = 2; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + 1; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 2; + item->Animation.ActiveState = 2; } void ReaperControl(short itemNumber) @@ -41,9 +41,9 @@ void ReaperControl(short itemNumber) short angle = CreatureTurn(item, ANGLE(2.0f)); - if (item->ActiveState == 2 && + if (item->Animation.ActiveState == 2 && !(GetRandomControl() & 0x3F)) - item->TargetState = 1; + item->Animation.TargetState = 1; if (creature->ReachedGoal) { diff --git a/TR5Main/Objects/TR5/Entity/tr5_roman_statue.cpp b/TR5Main/Objects/TR5/Entity/tr5_roman_statue.cpp index 520a1a24a..665824f96 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_roman_statue.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_roman_statue.cpp @@ -284,10 +284,10 @@ void InitialiseRomanStatue(short itemNumber) ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex + STATUE_ANIM_START_JUMP_DOWN; - item->TargetState = 13; - item->ActiveState = 13; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + STATUE_ANIM_START_JUMP_DOWN; + item->Animation.TargetState = 13; + item->Animation.ActiveState = 13; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; item->Status = ITEM_NOT_ACTIVE; item->Position.xPos += 486 * phd_sin(item->Position.yRot + ANGLE(90.0f)); item->Position.zPos += 486 * phd_cos(item->Position.yRot + ANGLE(90.0f)); @@ -340,10 +340,10 @@ void RomanStatueControl(short itemNumber) // Play hit animation. if (oldSwapMeshFlags != item->SwapMeshFlags) { - item->TargetState = STATUE_STATE_HIT; - item->ActiveState = STATUE_STATE_HIT; - item->AnimNumber = Objects[item->ObjectNumber].animIndex + STATUE_ANIM_HIT; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.TargetState = STATUE_STATE_HIT; + item->Animation.ActiveState = STATUE_STATE_HIT; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + STATUE_ANIM_HIT; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } if (item->HitPoints > 0) @@ -372,7 +372,7 @@ void RomanStatueControl(short itemNumber) int deltaFrame; bool unknown; - switch (item->ActiveState) + switch (item->Animation.ActiveState) { case STATUE_STATE_IDLE: creature->Flags = 0; @@ -383,7 +383,7 @@ void RomanStatueControl(short itemNumber) else { creature->MaxTurn = 0; - item->TargetState = STATUE_STATE_WALK; + item->Animation.TargetState = STATUE_STATE_WALK; } if (item->AIBits || @@ -394,21 +394,21 @@ void RomanStatueControl(short itemNumber) joint2 = AIGuard((CreatureInfo*)creature); } else if (AI.angle > ANGLE(112.5f) || AI.angle < -ANGLE(112.5f)) - item->TargetState = STATUE_STATE_TURN_180; + item->Animation.TargetState = STATUE_STATE_TURN_180; else if (AI.ahead && AI.distance < pow(SECTOR(1), 2)) { if (AI.bite & ((GetRandomControl() & 3) == 0)) - item->TargetState = STATUE_STATE_ATTACK_1; + item->Animation.TargetState = STATUE_STATE_ATTACK_1; else if (GetRandomControl() & 1) - item->TargetState = STATUE_STATE_ATTACK_2; + item->Animation.TargetState = STATUE_STATE_ATTACK_2; else - item->TargetState = STATUE_STATE_ATTACK_3; + item->Animation.TargetState = STATUE_STATE_ATTACK_3; } else { if (!item->ItemFlags[0]) { - item->TargetState = STATUE_STATE_SCREAM; + item->Animation.TargetState = STATUE_STATE_SCREAM; item->ItemFlags[0] = 5; break; } @@ -417,18 +417,18 @@ void RomanStatueControl(short itemNumber) { if (Targetable(item, &AI) && GetRandomControl() & 1) { - item->TargetState = STATUE_STATE_ENERGY_ATTACK; + item->Animation.TargetState = STATUE_STATE_ENERGY_ATTACK; break; } } if (item->TriggerFlags || AI.distance >= pow(SECTOR(2.5f), 2) || !AI.bite) { - item->TargetState = STATUE_STATE_WALK; + item->Animation.TargetState = STATUE_STATE_WALK; break; } - item->TargetState = STATUE_STATE_ATTACK_1; + item->Animation.TargetState = STATUE_STATE_ATTACK_1; } break; @@ -444,7 +444,7 @@ void RomanStatueControl(short itemNumber) pos = { (pos1.x + pos2.x) / 2, (pos1.y + pos2.y) / 2, (pos1.z + pos2.z) / 2}; - deltaFrame = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + deltaFrame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if (deltaFrame > 68 && deltaFrame < 130) { @@ -570,7 +570,7 @@ void RomanStatueControl(short itemNumber) else item->Position.yRot += AI.angle; - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 10) + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 10) { pos = { 0, 0, 0 }; GetJointAbsPosition(item, &pos, 16); @@ -621,7 +621,7 @@ void RomanStatueControl(short itemNumber) pos1.y = item->Position.yPos - 64; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase + 34 && item->ActiveState == 3) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameBase + 34 && item->Animation.ActiveState == 3) { if (item->ItemFlags[0]) item->ItemFlags[0]--; @@ -632,8 +632,8 @@ void RomanStatueControl(short itemNumber) TriggerShockwave((PHD_3DPOS*)&pos1, 16, 160, 64, 0, 64, 128, 48, 0, 1); } - deltaFrame = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; - int deltaFrame2 = g_Level.Anims[item->AnimNumber].frameEnd - item->FrameNumber; + deltaFrame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; + int deltaFrame2 = g_Level.Anims[item->Animation.AnimNumber].frameEnd - item->Animation.FrameNumber; if (deltaFrame2 >= 16) { @@ -670,13 +670,13 @@ void RomanStatueControl(short itemNumber) if (AI.distance < pow(SECTOR(1), 2)) { - item->TargetState = STATUE_STATE_IDLE; + item->Animation.TargetState = STATUE_STATE_IDLE; break; } if (AI.bite && AI.distance < pow(SECTOR(1.75f), 2)) { - item->TargetState = 9; + item->Animation.TargetState = 9; break; } @@ -684,15 +684,15 @@ void RomanStatueControl(short itemNumber) { if (Targetable(item, &AI) && !(GetRandomControl() & 3)) { - item->TargetState = STATUE_STATE_IDLE; + item->Animation.TargetState = STATUE_STATE_IDLE; break; } } if (item->TriggerFlags || AI.distance >= pow(SECTOR(2.5f), 2)) - item->TargetState = STATUE_STATE_WALK; + item->Animation.TargetState = STATUE_STATE_WALK; else - item->TargetState = STATUE_STATE_IDLE; + item->Animation.TargetState = STATUE_STATE_IDLE; break; @@ -705,7 +705,7 @@ void RomanStatueControl(short itemNumber) else item->Position.yRot += ANGLE(2.0f); - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) item->Position.yRot += -ANGLE(180.0f); break; @@ -721,7 +721,7 @@ void RomanStatueControl(short itemNumber) TriggerDynamicLight(RomanStatueData.Position.x, RomanStatueData.Position.y, RomanStatueData.Position.z, 16, 0, color, color / 2); } - deltaFrame = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + deltaFrame = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if (deltaFrame == 34) { @@ -849,16 +849,16 @@ void RomanStatueControl(short itemNumber) { item->HitPoints = 0; - if (item->ActiveState == STATUE_STATE_DEATH) + if (item->Animation.ActiveState == STATUE_STATE_DEATH) { - if (item->FrameNumber > g_Level.Anims[item->AnimNumber].frameBase + 54 && - item->FrameNumber < g_Level.Anims[item->AnimNumber].frameBase + 74 && + if (item->Animation.FrameNumber > g_Level.Anims[item->Animation.AnimNumber].frameBase + 54 && + item->Animation.FrameNumber < g_Level.Anims[item->Animation.AnimNumber].frameBase + 74 && item->TouchBits) { LaraItem->HitPoints -= 40; LaraItem->HitStatus = true; } - else if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + else if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) { // Activate trigger on death short roomNumber = item->ItemFlags[2] & 0xFF; @@ -874,9 +874,9 @@ void RomanStatueControl(short itemNumber) } else { - item->AnimNumber = Objects[item->ObjectNumber].animIndex + STATUE_ANIM_DEATH; - item->ActiveState = STATUE_STATE_DEATH; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex + STATUE_ANIM_DEATH; + item->Animation.ActiveState = STATUE_STATE_DEATH; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; } } diff --git a/TR5Main/Objects/TR5/Entity/tr5_submarine.cpp b/TR5Main/Objects/TR5/Entity/tr5_submarine.cpp index 9673d2452..b5516bfa6 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_submarine.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_submarine.cpp @@ -155,8 +155,8 @@ static void SubmarineAttack(ITEM_INFO* item) torpedoItem->Position.xRot = 0; torpedoItem->Position.yRot = item->Position.yRot; torpedoItem->Position.zRot = 0; - torpedoItem->Velocity = 0; - torpedoItem->VerticalVelocity = 0; + torpedoItem->Animation.Velocity = 0; + torpedoItem->Animation.VerticalVelocity = 0; torpedoItem->ItemFlags[0] = -1; AddActiveItem(itemNumber); @@ -168,10 +168,10 @@ void InitialiseSubmarine(short itemNumber) auto* item = &g_Level.Items[itemNumber]; ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 0; - item->ActiveState = 0; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 0; + item->Animation.ActiveState = 0; if (!item->TriggerFlags) item->TriggerFlags = 120; @@ -254,11 +254,11 @@ void SubmarineControl(short itemNumber) if (laraInfo.distance >= pow(SECTOR(3), 2)) { - item->TargetState = 1; + item->Animation.TargetState = 1; SoundEffect(SFX_TR5_MINI_SUB_LOOP, &item->Position, 2); } else - item->TargetState = 0; + item->Animation.TargetState = 0; if (AI.distance < pow(SECTOR(1), 2)) { @@ -275,7 +275,7 @@ void SubmarineControl(short itemNumber) } } else - item->TargetState = 1; + item->Animation.TargetState = 1; creature->Enemy = enemy; @@ -367,29 +367,29 @@ void ChaffFlareControl(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - if (item->VerticalVelocity) + if (item->Animation.VerticalVelocity) { item->Position.xRot += ANGLE(3.0f); item->Position.zRot += ANGLE(5.0f); } - int dx = item->Velocity * phd_sin(item->Position.yRot); - int dz = item->Velocity * phd_cos(item->Position.yRot); + int dx = item->Animation.Velocity * phd_sin(item->Position.yRot); + int dz = item->Animation.Velocity * phd_cos(item->Position.yRot); item->Position.xPos += dx; item->Position.zPos += dz; if (TestEnvironment(ENV_FLAG_WATER, item->RoomNumber)) { - item->Velocity += (5 - item->Velocity) / 2; - item->VerticalVelocity += (5 - item->VerticalVelocity) / 2; + item->Animation.Velocity += (5 - item->Animation.Velocity) / 2; + item->Animation.VerticalVelocity += (5 - item->Animation.VerticalVelocity) / 2; } else - item->VerticalVelocity += GRAVITY; + item->Animation.VerticalVelocity += GRAVITY; - item->Position.yPos += item->VerticalVelocity; + item->Position.yPos += item->Animation.VerticalVelocity; - DoProjectileDynamics(itemNumber, item->Position.xPos, item->Position.yPos, item->Position.zPos, dx, item->VerticalVelocity, dz); + DoProjectileDynamics(itemNumber, item->Position.xPos, item->Position.yPos, item->Position.zPos, dx, item->Animation.VerticalVelocity, dz); PHD_VECTOR pos1; pos1.x = 0; @@ -407,7 +407,7 @@ void ChaffFlareControl(short itemNumber) if (item->ItemFlags[0] >= 300) { - if (!item->VerticalVelocity && !item->Velocity) + if (!item->Animation.VerticalVelocity && !item->Animation.Velocity) { if (item->ItemFlags[1] <= 90) item->ItemFlags[1]++; @@ -461,28 +461,28 @@ void TorpedoControl(short itemNumber) pos.x = chaffItem->Position.xPos; pos.y = chaffItem->Position.yPos; pos.z = chaffItem->Position.zPos; - item->ActiveState = pos.x / 4; - item->TargetState = pos.y / 4; - item->RequiredState = pos.z / 4; + item->Animation.ActiveState = pos.x / 4; + item->Animation.TargetState = pos.y / 4; + item->Animation.RequiredState = pos.z / 4; } else { - pos.x = 4 * item->ActiveState; - pos.y = 4 * item->TargetState; - pos.z = 4 * item->RequiredState; + pos.x = 4 * item->Animation.ActiveState; + pos.y = 4 * item->Animation.TargetState; + pos.z = 4 * item->Animation.RequiredState; } } short angles[2]; phd_GetVectorAngles(pos.x - item->Position.xPos, pos.y - item->Position.yPos, pos.z - item->Position.zPos, angles); - if (item->Velocity >= 48) + if (item->Animation.Velocity >= 48) { - if (item->Velocity < 192) - item->Velocity++; + if (item->Animation.Velocity < 192) + item->Animation.Velocity++; } else - item->Velocity += 4; + item->Animation.Velocity += 4; item->ItemFlags[1]++; @@ -523,12 +523,12 @@ void TorpedoControl(short itemNumber) int y = item->Position.yPos; int z = item->Position.zPos; - item->Position.zRot += 16 * item->Velocity; + item->Position.zRot += 16 * item->Animation.Velocity; - int c = item->Velocity * phd_cos(item->Position.xRot); + int c = item->Animation.Velocity * phd_cos(item->Position.xRot); item->Position.xPos += c * phd_sin(item->Position.yRot); - item->Position.yPos += item->Velocity * phd_sin(-item->Position.xRot); + item->Position.yPos += item->Animation.Velocity * phd_sin(-item->Position.xRot); item->Position.zPos += c * phd_cos(item->Position.yRot); auto probe = GetCollisionResult(item); diff --git a/TR5Main/Objects/TR5/Entity/tr5_willowwisp.cpp b/TR5Main/Objects/TR5/Entity/tr5_willowwisp.cpp index 26541b76c..0fde2891e 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_willowwisp.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_willowwisp.cpp @@ -9,8 +9,8 @@ void InitialiseLightingGuide(short itemNumber) auto* item = &g_Level.Items[itemNumber]; ClearItem(itemNumber); - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->TargetState = 1; - item->ActiveState = 1; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.TargetState = 1; + item->Animation.ActiveState = 1; } diff --git a/TR5Main/Objects/TR5/Object/tr5_expandingplatform.cpp b/TR5Main/Objects/TR5/Object/tr5_expandingplatform.cpp index d3b47be93..0b56fe3e4 100644 --- a/TR5Main/Objects/TR5/Object/tr5_expandingplatform.cpp +++ b/TR5Main/Objects/TR5/Object/tr5_expandingplatform.cpp @@ -290,9 +290,9 @@ void ExpandingPlatformUpdateMutators(short itemNumber) if (item->Position.yRot == ANGLE(180.0f)) zTranslate = -offset + width; if (item->Position.yRot == ANGLE(270.0f)) zTranslate = width - offset; - for (int i = 0; i < item->Mutator.size(); i++) + for (int i = 0; i < item->Animation.Mutator.size(); i++) { - item->Mutator[i].Offset = Vector3(0, 0, zTranslate); - item->Mutator[i].Scale = Vector3(1.0f, 1.0f, item->ItemFlags[1] / 4096.0f); + item->Animation.Mutator[i].Offset = Vector3(0, 0, zTranslate); + item->Animation.Mutator[i].Scale = Vector3(1.0f, 1.0f, item->ItemFlags[1] / 4096.0f); } } diff --git a/TR5Main/Objects/TR5/Object/tr5_genslot.cpp b/TR5Main/Objects/TR5/Object/tr5_genslot.cpp index 595945b12..b55b1cc02 100644 --- a/TR5Main/Objects/TR5/Object/tr5_genslot.cpp +++ b/TR5Main/Objects/TR5/Object/tr5_genslot.cpp @@ -14,7 +14,7 @@ void GenSlot1Control(short itemNumber) if (TriggerActive(item) && !item->TriggerFlags) { - int df = item->FrameNumber - g_Level.Anims[item->AnimNumber].frameBase; + int df = item->Animation.FrameNumber - g_Level.Anims[item->Animation.AnimNumber].frameBase; if (df == 10 || df == 11) { diff --git a/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp b/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp index 0617322bb..c5aa52039 100644 --- a/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp +++ b/TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp @@ -145,30 +145,30 @@ void PushableBlockControl(short itemNumber) } // control block falling - if (item->Airborne) + if (item->Animation.Airborne) { int floorHeight = GetCollisionResult(item->Position.xPos, item->Position.yPos + 10, item->Position.zPos, item->RoomNumber).Position.Floor; - if (item->Position.yPos < (floorHeight - item->VerticalVelocity)) + if (item->Position.yPos < (floorHeight - item->Animation.VerticalVelocity)) { - if ((item->VerticalVelocity + info->gravity) < 128) - item->VerticalVelocity += info->gravity; + if ((item->Animation.VerticalVelocity + info->gravity) < 128) + item->Animation.VerticalVelocity += info->gravity; else - item->VerticalVelocity++; - item->Position.yPos += item->VerticalVelocity; + item->Animation.VerticalVelocity++; + item->Position.yPos += item->Animation.VerticalVelocity; - MoveStackY(itemNumber, item->VerticalVelocity); + MoveStackY(itemNumber, item->Animation.VerticalVelocity); } else { - item->Airborne = false; + item->Animation.Airborne = false; int relY = floorHeight - item->Position.yPos; item->Position.yPos = floorHeight; - if (item->VerticalVelocity >= 96) + if (item->Animation.VerticalVelocity >= 96) FloorShake(item); - item->VerticalVelocity = 0; + item->Animation.VerticalVelocity = 0; SoundEffect(info->fallSound, &item->Position, 2); MoveStackY(itemNumber, relY); @@ -192,11 +192,11 @@ void PushableBlockControl(short itemNumber) int displaceBox = GetBoundsAccurate(LaraItem)->Z2 - 80; // move pushable based on bbox->Z2 of Lara - switch (LaraItem->AnimNumber) + switch (LaraItem->Animation.AnimNumber) { case LA_PUSHABLE_PUSH: - if (LaraItem->FrameNumber == g_Level.Anims[LaraItem->AnimNumber].frameBase) + if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase) { RemoveFromStack(itemNumber); RemoveBridgeStack(itemNumber); @@ -243,7 +243,7 @@ void PushableBlockControl(short itemNumber) MoveStackXZ(itemNumber); - if (LaraItem->FrameNumber == g_Level.Anims[LaraItem->AnimNumber].frameEnd - 1) + if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameEnd - 1) { if (info->canFall) // check if pushable is about to fall { @@ -255,9 +255,9 @@ void PushableBlockControl(short itemNumber) MoveStackXZ(itemNumber); //SoundEffect(pushable->stopSound, &item->pos, 2); DoPushPull = 0; - LaraItem->TargetState = LS_IDLE; + LaraItem->Animation.TargetState = LS_IDLE; - item->Airborne = true; // do fall + item->Animation.Airborne = true; // do fall return; } } @@ -266,7 +266,7 @@ void PushableBlockControl(short itemNumber) if (TrInput & IN_ACTION) { if (!TestBlockPush(item, blockHeight, quadrant)) - LaraItem->TargetState = LS_IDLE; + LaraItem->Animation.TargetState = LS_IDLE; else { item->Position.xPos = info->moveX = item->Position.xPos & 0xFFFFFE00 | 0x200; @@ -275,14 +275,14 @@ void PushableBlockControl(short itemNumber) } } else - LaraItem->TargetState = LS_IDLE; + LaraItem->Animation.TargetState = LS_IDLE; } break; case LA_PUSHABLE_PULL: - if (LaraItem->FrameNumber == g_Level.Anims[LaraItem->AnimNumber].frameBase) + if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase) { RemoveFromStack(itemNumber); RemoveBridgeStack(itemNumber); @@ -328,12 +328,12 @@ void PushableBlockControl(short itemNumber) MoveStackXZ(itemNumber); - if (LaraItem->FrameNumber == g_Level.Anims[LaraItem->AnimNumber].frameEnd - 1) + if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameEnd - 1) { if (TrInput & IN_ACTION) { if (!TestBlockPull(item, blockHeight, quadrant)) - LaraItem->TargetState = LS_IDLE; + LaraItem->Animation.TargetState = LS_IDLE; else { item->Position.xPos = info->moveX = item->Position.xPos & 0xFFFFFE00 | 0x200; @@ -342,15 +342,15 @@ void PushableBlockControl(short itemNumber) } } else - LaraItem->TargetState = LS_IDLE; + LaraItem->Animation.TargetState = LS_IDLE; } break; case LA_PUSHABLE_PUSH_TO_STAND: case LA_PUSHABLE_PULL_TO_STAND: - if (LaraItem->FrameNumber == g_Level.Anims[LA_PUSHABLE_PUSH_TO_STAND].frameBase || - LaraItem->FrameNumber == g_Level.Anims[LA_PUSHABLE_PULL_TO_STAND].frameBase) + if (LaraItem->Animation.FrameNumber == g_Level.Anims[LA_PUSHABLE_PUSH_TO_STAND].frameBase || + LaraItem->Animation.FrameNumber == g_Level.Anims[LA_PUSHABLE_PULL_TO_STAND].frameBase) { item->Position.xPos = item->Position.xPos & 0xFFFFFE00 | 0x200; item->Position.zPos = item->Position.zPos & 0xFFFFFE00 | 0x200; @@ -362,7 +362,7 @@ void PushableBlockControl(short itemNumber) TestTriggers(item, true, item->Flags & IFLAG_ACTIVATION_MASK); } - if (LaraItem->FrameNumber == g_Level.Anims[LaraItem->AnimNumber].frameEnd) + if (LaraItem->Animation.FrameNumber == g_Level.Anims[LaraItem->Animation.AnimNumber].frameEnd) { RemoveActiveItem(itemNumber); item->Status = ITEM_NOT_ACTIVE; @@ -387,16 +387,16 @@ void PushableBlockCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* co int blockHeight = GetStackHeight(pushableItem); if ((!(TrInput & IN_ACTION) || - laraItem->ActiveState != LS_IDLE || - laraItem->AnimNumber != LA_STAND_IDLE || - laraItem->Airborne || + laraItem->Animation.ActiveState != LS_IDLE || + laraItem->Animation.AnimNumber != LA_STAND_IDLE || + laraItem->Animation.Airborne || laraInfo->Control.HandStatus != HandStatus::Free || pushableItem->Status == ITEM_INVISIBLE || pushableItem->TriggerFlags < 0) && (!laraInfo->Control.IsMoving || laraInfo->InteractedItem != itemNumber)) { - if ((laraItem->ActiveState != LS_PUSHABLE_GRAB || - (laraItem->FrameNumber != g_Level.Anims[LA_PUSHABLE_GRAB].frameBase + 19) || + if ((laraItem->Animation.ActiveState != LS_PUSHABLE_GRAB || + (laraItem->Animation.FrameNumber != g_Level.Anims[LA_PUSHABLE_GRAB].frameBase + 19) || laraInfo->NextCornerPos.xPos != itemNumber)) { if (!pushableInfo->hasFloorCeiling) @@ -438,14 +438,14 @@ void PushableBlockCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* co if (!TestBlockPush(pushableItem, blockHeight, quadrant) || pushableInfo->disablePush) return; - laraItem->TargetState = LS_PUSHABLE_PUSH; + laraItem->Animation.TargetState = LS_PUSHABLE_PUSH; } else if (TrInput & IN_BACK) { if (!TestBlockPull(pushableItem, blockHeight, quadrant) || pushableInfo->disablePull) return; - laraItem->TargetState = LS_PUSHABLE_PULL; + laraItem->Animation.TargetState = LS_PUSHABLE_PULL; } else return; @@ -490,10 +490,10 @@ void PushableBlockCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* co laraItem->Position.yRot = pushableItem->Position.yRot; laraItem->Position.zRot = pushableItem->Position.zRot; - laraItem->AnimNumber = LA_PUSHABLE_GRAB; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = LS_PUSHABLE_GRAB; - laraItem->TargetState = LS_PUSHABLE_GRAB; + laraItem->Animation.AnimNumber = LA_PUSHABLE_GRAB; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = LS_PUSHABLE_GRAB; + laraItem->Animation.TargetState = LS_PUSHABLE_GRAB; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; laraInfo->NextCornerPos.xPos = itemNumber; @@ -503,10 +503,10 @@ void PushableBlockCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* co { if (MoveLaraPosition(&PushableBlockPos, pushableItem, laraItem)) { - laraItem->AnimNumber = LA_PUSHABLE_GRAB; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->ActiveState = LS_PUSHABLE_GRAB; - laraItem->TargetState = LS_PUSHABLE_GRAB; + laraItem->Animation.AnimNumber = LA_PUSHABLE_GRAB; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.ActiveState = LS_PUSHABLE_GRAB; + laraItem->Animation.TargetState = LS_PUSHABLE_GRAB; laraInfo->Control.IsMoving = false; laraInfo->Control.HandStatus = HandStatus::Busy; laraInfo->NextCornerPos.xPos = itemNumber; diff --git a/TR5Main/Objects/TR5/Object/tr5_raisingblock.cpp b/TR5Main/Objects/TR5/Object/tr5_raisingblock.cpp index 5d1d5e8f0..1ad5d9360 100644 --- a/TR5Main/Objects/TR5/Object/tr5_raisingblock.cpp +++ b/TR5Main/Objects/TR5/Object/tr5_raisingblock.cpp @@ -24,8 +24,8 @@ void InitialiseRaisingBlock(short itemNumber) g_Level.Boxes[floor->Box].flags &= ~BLOCKED; // Set mutators to 0 by default - for (int i = 0; i < item->Mutator.size(); i++) - item->Mutator[i].Scale.y = 0; + for (int i = 0; i < item->Animation.Mutator.size(); i++) + item->Animation.Mutator[i].Scale.y = 0; if (item->TriggerFlags < 0) { @@ -144,8 +144,8 @@ void ControlRaisingBlock(short itemNumber) // Update bone mutators if (item->TriggerFlags > -1) { - for (int i = 0; i < item->Mutator.size(); i++) - item->Mutator[i].Scale = Vector3(1.0f, item->ItemFlags[1] / 4096.0f, 1.0f); + for (int i = 0; i < item->Animation.Mutator.size(); i++) + item->Animation.Mutator[i].Scale = Vector3(1.0f, item->ItemFlags[1] / 4096.0f, 1.0f); } } diff --git a/TR5Main/Objects/TR5/Object/tr5_rollingball.cpp b/TR5Main/Objects/TR5/Object/tr5_rollingball.cpp index ed6a943c8..9a395c285 100644 --- a/TR5Main/Objects/TR5/Object/tr5_rollingball.cpp +++ b/TR5Main/Objects/TR5/Object/tr5_rollingball.cpp @@ -22,13 +22,13 @@ void RollingBallCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll { if (TestCollision(ballItem, laraItem)) { - if (TriggerActive(ballItem) && (ballItem->ItemFlags[0] || ballItem->VerticalVelocity)) + if (TriggerActive(ballItem) && (ballItem->ItemFlags[0] || ballItem->Animation.VerticalVelocity)) { - laraItem->AnimNumber = LA_BOULDER_DEATH; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; - laraItem->TargetState = LS_DEATH; - laraItem->ActiveState = LS_DEATH; - laraItem->Airborne = false; + laraItem->Animation.AnimNumber = LA_BOULDER_DEATH; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; + laraItem->Animation.TargetState = LS_DEATH; + laraItem->Animation.ActiveState = LS_DEATH; + laraItem->Animation.Airborne = false; } else ObjectCollision(itemNumber, laraItem, coll); @@ -43,16 +43,16 @@ void RollingBallControl(short itemNumber) if (!TriggerActive(item)) return; - item->VerticalVelocity += GRAVITY; + item->Animation.VerticalVelocity += GRAVITY; item->Position.xPos += item->ItemFlags[0] / 32; - item->Position.yPos += item->VerticalVelocity; + item->Position.yPos += item->Animation.VerticalVelocity; item->Position.zPos += item->ItemFlags[1] / 32; int dh = GetCollisionResult(item).Position.Floor - CLICK(2); if (item->Position.yPos > dh) { - if (abs(item->VerticalVelocity) > 16) + if (abs(item->Animation.VerticalVelocity) > 16) { int distance = sqrt( pow(Camera.pos.x - item->Position.xPos, 2) + @@ -60,21 +60,21 @@ void RollingBallControl(short itemNumber) pow(Camera.pos.z - item->Position.zPos, 2)); if (distance < 16384) - Camera.bounce = -(((16384 - distance) * abs(item->VerticalVelocity)) / 16384); + Camera.bounce = -(((16384 - distance) * abs(item->Animation.VerticalVelocity)) / 16384); } if ((item->Position.yPos - dh) < CLICK(2)) item->Position.yPos = dh; - if (item->VerticalVelocity <= 64) + if (item->Animation.VerticalVelocity <= 64) { - if (abs(item->Velocity) <= CLICK(2) || (GetRandomControl() & 0x1F)) - item->VerticalVelocity = 0; + if (abs(item->Animation.Velocity) <= CLICK(2) || (GetRandomControl() & 0x1F)) + item->Animation.VerticalVelocity = 0; else - item->VerticalVelocity = -(short)(GetRandomControl() % (item->Velocity / 8)); + item->Animation.VerticalVelocity = -(short)(GetRandomControl() % (item->Animation.Velocity / 8)); } else - item->VerticalVelocity = -(short)(item->VerticalVelocity / 4); + item->Animation.VerticalVelocity = -(short)(item->Animation.VerticalVelocity / 4); } int frontX = item->Position.xPos; @@ -286,7 +286,7 @@ void ClassicRollingBallCollision(short itemNum, ITEM_INFO* lara, COLL_INFO* coll return; if (!TestCollision(item, lara)) return; - if (lara->Airborne) + if (lara->Animation.Airborne) { if (coll->Setup.EnableObjectPush) ItemPushItem(item, lara, coll, coll->Setup.EnableSpasm, 1); @@ -303,7 +303,7 @@ void ClassicRollingBallCollision(short itemNum, ITEM_INFO* lara, COLL_INFO* coll x = item->Position.xPos + ((x * 512) / d); y = item->Position.yPos - 512 + ((y * 512) / d); z = item->Position.zPos + ((z * 512) / d); - DoBloodSplat(x, y, z, item->Velocity, item->Position.yRot, item->RoomNumber); + DoBloodSplat(x, y, z, item->Animation.Velocity, item->Position.yRot, item->RoomNumber); } else { @@ -315,10 +315,10 @@ void ClassicRollingBallCollision(short itemNum, ITEM_INFO* lara, COLL_INFO* coll lara->Position.zPos = 0; lara->Position.zRot = 0; - lara->AnimNumber = LA_BOULDER_DEATH; - lara->FrameNumber = g_Level.Anims[lara->AnimNumber].frameBase; - lara->ActiveState = LS_BOULDER_DEATH; - lara->TargetState = LS_BOULDER_DEATH; + lara->Animation.AnimNumber = LA_BOULDER_DEATH; + lara->Animation.FrameNumber = g_Level.Anims[lara->Animation.AnimNumber].frameBase; + lara->Animation.ActiveState = LS_BOULDER_DEATH; + lara->Animation.TargetState = LS_BOULDER_DEATH; Camera.flags = CF_FOLLOW_CENTER; Camera.targetAngle = ANGLE(170); @@ -329,7 +329,7 @@ void ClassicRollingBallCollision(short itemNum, ITEM_INFO* lara, COLL_INFO* coll int y = lara->Position.yPos - (GetRandomControl() / 64); int z = lara->Position.zPos + (GetRandomControl() - ANGLE(180.0f) / 256); short d = ((GetRandomControl() - ANGLE(180) / 8) + item->Position.yRot); - DoBloodSplat(x, y, z, (short)(item->Velocity * 2), d, item->RoomNumber); + DoBloodSplat(x, y, z, (short)(item->Animation.Velocity * 2), d, item->RoomNumber); } } } @@ -351,7 +351,7 @@ void ClassicRollingBallControl(short itemNum) if (item->Status == ITEM_ACTIVE) { - if (item->TargetState == 2) + if (item->Animation.TargetState == 2) { AnimateItem(item); return; @@ -359,14 +359,14 @@ void ClassicRollingBallControl(short itemNum) if (item->Position.yPos < item->Floor) { - if (!item->Airborne) + if (!item->Animation.Airborne) { - item->Airborne = 1; - item->VerticalVelocity = -10; + item->Animation.Airborne = 1; + item->Animation.VerticalVelocity = -10; } } - else if (item->ActiveState == 0) - item->TargetState = 1; + else if (item->Animation.ActiveState == 0) + item->Animation.TargetState = 1; oldx = item->Position.xPos; oldz = item->Position.zPos; @@ -382,8 +382,8 @@ void ClassicRollingBallControl(short itemNum) if (item->Position.yPos >= (int)floor - 256) { - item->Airborne = false; - item->VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.VerticalVelocity = 0; item->Position.yPos = item->Floor; SoundEffect(SFX_TR3_ROLLING_BALL, &item->Position, 0); dist = sqrt((SQUARE(Camera.mikePos.x - item->Position.xPos)) + (SQUARE(Camera.mikePos.z - item->Position.zPos))); @@ -425,8 +425,8 @@ void ClassicRollingBallControl(short itemNum) item->Position.yPos = item->Floor; item->Position.xPos = oldx; item->Position.zPos = oldz; - item->Velocity = 0; - item->VerticalVelocity = 0; + item->Animation.Velocity = 0; + item->Animation.VerticalVelocity = 0; item->TouchBits = 0; } } @@ -447,13 +447,13 @@ void ClassicRollingBallControl(short itemNum) r->itemNumber = itemNum; item->RoomNumber = old->roomNumber; } - item->ActiveState = 0; - item->TargetState = 0; - item->AnimNumber = Objects[item->ObjectNumber].animIndex; - item->FrameNumber = g_Level.Anims[item->AnimNumber].frameBase; - item->ActiveState = g_Level.Anims[item->AnimNumber].ActiveState; - item->TargetState = g_Level.Anims[item->AnimNumber].ActiveState; - item->RequiredState = 0; + item->Animation.ActiveState = 0; + item->Animation.TargetState = 0; + item->Animation.AnimNumber = Objects[item->ObjectNumber].animIndex; + item->Animation.FrameNumber = g_Level.Anims[item->Animation.AnimNumber].frameBase; + item->Animation.ActiveState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; + item->Animation.TargetState = g_Level.Anims[item->Animation.AnimNumber].ActiveState; + item->Animation.RequiredState = 0; RemoveActiveItem(itemNum); } } diff --git a/TR5Main/Objects/TR5/Object/tr5_teleporter.cpp b/TR5Main/Objects/TR5/Object/tr5_teleporter.cpp index d4d65282b..9070408a7 100644 --- a/TR5Main/Objects/TR5/Object/tr5_teleporter.cpp +++ b/TR5Main/Objects/TR5/Object/tr5_teleporter.cpp @@ -183,10 +183,10 @@ void ControlTeleporter(short itemNumber) SoundEffect(SFX_TR5_LIFT_HIT_FLOOR2, 0, 0); } - LaraItem->AnimNumber = LA_ELEVATOR_RECOVER; - LaraItem->FrameNumber = g_Level.Anims[LaraItem->AnimNumber].frameBase; - LaraItem->TargetState = LS_MISC_CONTROL; - LaraItem->ActiveState = LS_MISC_CONTROL; + LaraItem->Animation.AnimNumber = LA_ELEVATOR_RECOVER; + LaraItem->Animation.FrameNumber = g_Level.Anims[LaraItem->Animation.AnimNumber].frameBase; + LaraItem->Animation.TargetState = LS_MISC_CONTROL; + LaraItem->Animation.ActiveState = LS_MISC_CONTROL; item->ItemFlags[0]++; if (item->ItemFlags[0] >= 150) diff --git a/TR5Main/Objects/TR5/Object/tr5_twoblockplatform.cpp b/TR5Main/Objects/TR5/Object/tr5_twoblockplatform.cpp index c64034dc9..c6f06bce9 100644 --- a/TR5Main/Objects/TR5/Object/tr5_twoblockplatform.cpp +++ b/TR5Main/Objects/TR5/Object/tr5_twoblockplatform.cpp @@ -57,7 +57,7 @@ void TwoBlocksPlatformControl(short itemNumber) } } - if (onObject && LaraItem->AnimNumber != LA_HOP_BACK_CONTINUE) + if (onObject && LaraItem->Animation.AnimNumber != LA_HOP_BACK_CONTINUE) item->ItemFlags[1] = 1; else item->ItemFlags[1] = -1; diff --git a/TR5Main/Objects/TR5/Switch/tr5_crowdove_switch.cpp b/TR5Main/Objects/TR5/Switch/tr5_crowdove_switch.cpp index c949da73e..93d654efa 100644 --- a/TR5Main/Objects/TR5/Switch/tr5_crowdove_switch.cpp +++ b/TR5Main/Objects/TR5/Switch/tr5_crowdove_switch.cpp @@ -40,13 +40,13 @@ namespace TEN::Entities::TR5 if (switchItem->Flags & ONESHOT || !(switchItem->MeshBits & 4) || (!(TrInput & IN_ACTION) || - laraItem->ActiveState != LS_IDLE || - laraItem->AnimNumber != LA_STAND_IDLE || - laraItem->Airborne || + laraItem->Animation.ActiveState != LS_IDLE || + laraItem->Animation.AnimNumber != LA_STAND_IDLE || + laraItem->Animation.Airborne || laraInfo->Control.HandStatus != HandStatus::Free) && (!laraInfo->Control.IsMoving || laraInfo->InteractedItem != itemNumber)) { - if (laraItem->ActiveState != LS_DOVE_SWITCH) + if (laraItem->Animation.ActiveState != LS_DOVE_SWITCH) ObjectCollision(itemNumber, laraItem, coll); } else @@ -57,9 +57,9 @@ namespace TEN::Entities::TR5 { if (MoveLaraPosition(&CrowDovePos, switchItem, laraItem)) { - laraItem->AnimNumber = LA_DOVESWITCH_TURN; - laraItem->ActiveState = LS_DOVE_SWITCH; - laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase; + laraItem->Animation.AnimNumber = LA_DOVESWITCH_TURN; + laraItem->Animation.ActiveState = LS_DOVE_SWITCH; + laraItem->Animation.FrameNumber = g_Level.Anims[laraItem->Animation.AnimNumber].frameBase; AddActiveItem(itemNumber); @@ -109,12 +109,12 @@ namespace TEN::Entities::TR5 } else if (item->ItemFlags[0] == 0) { - if (item->ActiveState == SWITCH_OFF) - item->TargetState = SWITCH_ON; + if (item->Animation.ActiveState == SWITCH_OFF) + item->Animation.TargetState = SWITCH_ON; AnimateItem(item); - if (item->ActiveState == SWITCH_OFF) + if (item->Animation.ActiveState == SWITCH_OFF) item->Position.yRot += ANGLE(90.0f); } } diff --git a/TR5Main/Objects/TR5/Trap/tr5_deathslide.cpp b/TR5Main/Objects/TR5/Trap/tr5_deathslide.cpp index 255a228b6..ea8df83d2 100644 --- a/TR5Main/Objects/TR5/Trap/tr5_deathslide.cpp +++ b/TR5Main/Objects/TR5/Trap/tr5_deathslide.cpp @@ -40,8 +40,8 @@ void DeathSlideCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) auto* laraInfo = GetLaraInfo(laraItem); if (!(TrInput & IN_ACTION) || - laraItem->ActiveState != LS_IDLE || - laraItem->Airborne || + laraItem->Animation.ActiveState != LS_IDLE || + laraItem->Animation.Airborne || laraInfo->Control.HandStatus != HandStatus::Free) { return; @@ -56,10 +56,10 @@ void DeathSlideCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll) AlignLaraPosition(&DeathSlidePosition, zipLineItem, laraItem); laraInfo->Control.HandStatus = HandStatus::Busy; - laraItem->TargetState = LS_ZIP_LINE; + laraItem->Animation.TargetState = LS_ZIP_LINE; do AnimateItem(laraItem); - while (laraItem->ActiveState != LS_GRABBING); + while (laraItem->Animation.ActiveState != LS_GRABBING); if (!zipLineItem->Active) AddActiveItem(itemNumber); @@ -87,15 +87,15 @@ void ControlDeathSlide(short itemNumber) ItemNewRoom(itemNumber, old->roomNumber); zipLineItem->Status = ITEM_NOT_ACTIVE; - zipLineItem->ActiveState = zipLineItem->TargetState = 1; - zipLineItem->AnimNumber = Objects[zipLineItem->ObjectNumber].animIndex; - zipLineItem->FrameNumber = g_Level.Anims[zipLineItem->AnimNumber].frameBase; + zipLineItem->Animation.ActiveState = zipLineItem->Animation.TargetState = 1; + zipLineItem->Animation.AnimNumber = Objects[zipLineItem->ObjectNumber].animIndex; + zipLineItem->Animation.FrameNumber = g_Level.Anims[zipLineItem->Animation.AnimNumber].frameBase; RemoveActiveItem(itemNumber); return; } - if (zipLineItem->ActiveState == 1) + if (zipLineItem->Animation.ActiveState == 1) { AnimateItem(zipLineItem); return; @@ -103,22 +103,22 @@ void ControlDeathSlide(short itemNumber) AnimateItem(zipLineItem); - if (zipLineItem->VerticalVelocity < 100) - zipLineItem->VerticalVelocity += 5; + if (zipLineItem->Animation.VerticalVelocity < 100) + zipLineItem->Animation.VerticalVelocity += 5; float c = phd_cos(zipLineItem->Position.yRot); float s = phd_sin(zipLineItem->Position.yRot); - zipLineItem->Position.zPos += zipLineItem->VerticalVelocity * c; - zipLineItem->Position.xPos += zipLineItem->VerticalVelocity * s; - zipLineItem->Position.yPos += zipLineItem->VerticalVelocity / 4; + zipLineItem->Position.zPos += zipLineItem->Animation.VerticalVelocity * c; + zipLineItem->Position.xPos += zipLineItem->Animation.VerticalVelocity * s; + zipLineItem->Position.yPos += zipLineItem->Animation.VerticalVelocity / 4; short roomNumber = zipLineItem->RoomNumber; GetFloor(zipLineItem->Position.xPos, zipLineItem->Position.yPos, zipLineItem->Position.zPos, &roomNumber); if (roomNumber != zipLineItem->RoomNumber) ItemNewRoom(itemNumber, roomNumber); - if (LaraItem->ActiveState == LS_ZIP_LINE) + if (LaraItem->Animation.ActiveState == LS_ZIP_LINE) { LaraItem->Position.xPos = zipLineItem->Position.xPos; LaraItem->Position.yPos = zipLineItem->Position.yPos; @@ -133,13 +133,13 @@ void ControlDeathSlide(short itemNumber) if (GetFloorHeight(floor, x, y, z) <= y + 256 || GetCeiling(floor, x, y, z) >= y - 256) { - if (LaraItem->ActiveState == LS_ZIP_LINE) + if (LaraItem->Animation.ActiveState == LS_ZIP_LINE) { - LaraItem->TargetState = LS_JUMP_FORWARD; + LaraItem->Animation.TargetState = LS_JUMP_FORWARD; AnimateLara(LaraItem); - LaraItem->Airborne = true; - LaraItem->Velocity = zipLineItem->VerticalVelocity; - LaraItem->VerticalVelocity = zipLineItem->VerticalVelocity / 4; + LaraItem->Animation.Airborne = true; + LaraItem->Animation.Velocity = zipLineItem->Animation.VerticalVelocity; + LaraItem->Animation.VerticalVelocity = zipLineItem->Animation.VerticalVelocity / 4; } // Stop diff --git a/TR5Main/Objects/TR5/Trap/tr5_fallingceiling.cpp b/TR5Main/Objects/TR5/Trap/tr5_fallingceiling.cpp index fcaa63a25..9547ce0b1 100644 --- a/TR5Main/Objects/TR5/Trap/tr5_fallingceiling.cpp +++ b/TR5Main/Objects/TR5/Trap/tr5_fallingceiling.cpp @@ -11,9 +11,9 @@ void FallingCeilingControl(short itemNumber) { auto* item = &g_Level.Items[itemNumber]; - if (item->ActiveState) + if (item->Animation.ActiveState) { - if (item->ActiveState == 1 && item->TouchBits) + if (item->Animation.ActiveState == 1 && item->TouchBits) { LaraItem->HitPoints -= 300; LaraItem->HitStatus = true; @@ -21,8 +21,8 @@ void FallingCeilingControl(short itemNumber) } else { - item->TargetState = 1; - item->Airborne = true;; + item->Animation.TargetState = 1; + item->Animation.Airborne = true;; } AnimateItem(item); @@ -38,14 +38,14 @@ void FallingCeilingControl(short itemNumber) if (probe.RoomNumber != item->RoomNumber) ItemNewRoom(itemNumber, probe.RoomNumber); - if (item->ActiveState == 1) + if (item->Animation.ActiveState == 1) { if (item->Position.yPos >= item->Floor) { item->Position.yPos = item->Floor; - item->Airborne = false; - item->TargetState = 2; - item->VerticalVelocity = 0; + item->Animation.Airborne = false; + item->Animation.TargetState = 2; + item->Animation.VerticalVelocity = 0; } } } diff --git a/TR5Main/Objects/TR5/Trap/tr5_ventilator.cpp b/TR5Main/Objects/TR5/Trap/tr5_ventilator.cpp index 0d5aab6b0..197762bee 100644 --- a/TR5Main/Objects/TR5/Trap/tr5_ventilator.cpp +++ b/TR5Main/Objects/TR5/Trap/tr5_ventilator.cpp @@ -149,19 +149,19 @@ void VentilatorControl(short itemNumber) { xChange = 1; TestTriggers(item, true); - if (item->ActiveState == 1) + if (item->Animation.ActiveState == 1) { //result = 5 * item->animNumber; - if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameEnd) + if (item->Animation.FrameNumber == g_Level.Anims[item->Animation.AnimNumber].frameEnd) return; } else - item->TargetState = 1; + item->Animation.TargetState = 1; } int speed = 0; - if (item->ActiveState == 1) - speed = g_Level.Anims[item->AnimNumber].frameEnd - item->FrameNumber; + if (item->Animation.ActiveState == 1) + speed = g_Level.Anims[item->Animation.AnimNumber].frameEnd - item->Animation.FrameNumber; else speed = 128; @@ -235,7 +235,7 @@ void VentilatorControl(short itemNumber) { int dz = 96 * zChange * (item->ItemFlags[0] - z1) / item->ItemFlags[0]; - if (item->ActiveState == 1) + if (item->Animation.ActiveState == 1) dz = speed * dz / 120; LaraItem->Position.zPos += dz; @@ -258,7 +258,7 @@ void VentilatorControl(short itemNumber) { int dx = 96 * xChange * (item->ItemFlags[0] - x1) / item->ItemFlags[0]; - if (item->ActiveState == 1) + if (item->Animation.ActiveState == 1) dx = speed * dx / 120; LaraItem->Position.xPos += dx; @@ -303,7 +303,7 @@ void VentilatorControl(short itemNumber) y = 96 * (item->ItemFlags[0] - (LaraItem->Position.yPos - effectBounds.Y2)) / item->ItemFlags[0]; } - if (item->ActiveState == 1) + if (item->Animation.ActiveState == 1) y = speed * y / 120; LaraItem->Position.yPos += y; diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index c8bc436e0..1e80f1490 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -2107,16 +2107,16 @@ namespace TEN::Renderer break; case RENDERER_DEBUG_PAGE::LARA_STATS: - PrintDebugMessage("Lara.AnimNumber: %d", LaraItem->AnimNumber); - PrintDebugMessage("Lara.FrameNumber: %d", LaraItem->FrameNumber); - PrintDebugMessage("Lara.ActiveState: %d", LaraItem->ActiveState); - PrintDebugMessage("Lara.RequiredState: %d", LaraItem->RequiredState); - PrintDebugMessage("Lara.TargetState: %d", LaraItem->TargetState); + PrintDebugMessage("Lara.AnimNumber: %d", LaraItem->Animation.AnimNumber); + PrintDebugMessage("Lara.FrameNumber: %d", LaraItem->Animation.FrameNumber); + PrintDebugMessage("Lara.ActiveState: %d", LaraItem->Animation.ActiveState); + PrintDebugMessage("Lara.RequiredState: %d", LaraItem->Animation.RequiredState); + PrintDebugMessage("Lara.TargetState: %d", LaraItem->Animation.TargetState); PrintDebugMessage("Lara.Control.WeaponControl.WeaponItem: %d", Lara.Control.Weapon.WeaponItem); PrintDebugMessage("Lara.Control.WeaponControl.GunType: %d", Lara.Control.Weapon.GunType); PrintDebugMessage("Lara.Control.HandStatus: %d", Lara.Control.HandStatus); - PrintDebugMessage("Lara.Velocity, VerticalVelocity: %d %d", LaraItem->Velocity, LaraItem->VerticalVelocity); - PrintDebugMessage("Lara.Airborne: %d", LaraItem->Airborne); + PrintDebugMessage("Lara.Velocity, VerticalVelocity: %d %d", LaraItem->Animation.Velocity, LaraItem->Animation.VerticalVelocity); + PrintDebugMessage("Lara.Airborne: %d", LaraItem->Animation.Airborne); PrintDebugMessage("Lara.Control.CanClimbLadder: %d", Lara.Control.CanClimbLadder); PrintDebugMessage("Lara.WaterSurfaceDist: %d", Lara.WaterSurfaceDist); break; diff --git a/TR5Main/Renderer/Renderer11Helper.cpp b/TR5Main/Renderer/Renderer11Helper.cpp index e2ba3d427..3180ce9c0 100644 --- a/TR5Main/Renderer/Renderer11Helper.cpp +++ b/TR5Main/Renderer/Renderer11Helper.cpp @@ -157,11 +157,11 @@ namespace TEN::Renderer { ITEM_INFO* nativeItem = &g_Level.Items[item->ItemNumber]; - if (nativeItem->Mutator.size() == boneIndexList.size()) + if (nativeItem->Animation.Mutator.size() == boneIndexList.size()) { for (int i : boneIndexList) { - auto mutator = nativeItem->Mutator[i]; + auto mutator = nativeItem->Animation.Mutator[i]; if (mutator.IsEmpty()) continue; diff --git a/TR5Main/Renderer/Renderer11Lara.cpp b/TR5Main/Renderer/Renderer11Lara.cpp index 220070c78..6f6b7398c 100644 --- a/TR5Main/Renderer/Renderer11Lara.cpp +++ b/TR5Main/Renderer/Renderer11Lara.cpp @@ -26,7 +26,7 @@ bool shouldAnimateUpperBody(const LaraWeaponType& weapon) { case LaraWeaponType::GrenadeLauncher: case LaraWeaponType::Crossbow: case LaraWeaponType::Shotgun: - return (LaraItem->ActiveState == LS_IDLE || LaraItem->ActiveState == LS_TURN_LEFT_FAST || LaraItem->ActiveState == LS_TURN_RIGHT_FAST || LaraItem->ActiveState == LS_TURN_LEFT_SLOW || LaraItem->ActiveState == LS_TURN_RIGHT_SLOW); + return (LaraItem->Animation.ActiveState == LS_IDLE || LaraItem->Animation.ActiveState == LS_TURN_LEFT_FAST || LaraItem->Animation.ActiveState == LS_TURN_RIGHT_FAST || LaraItem->Animation.ActiveState == LS_TURN_LEFT_SLOW || LaraItem->Animation.ActiveState == LS_TURN_RIGHT_SLOW); break; case LaraWeaponType::HK: { @@ -35,7 +35,7 @@ bool shouldAnimateUpperBody(const LaraWeaponType& weapon) { if(laraInfo.RightArm.AnimNumber - baseAnim == 0 || laraInfo.RightArm.AnimNumber - baseAnim == 2 || laraInfo.RightArm.AnimNumber - baseAnim == 4){ return true; } else - return (LaraItem->ActiveState == LS_IDLE || LaraItem->ActiveState == LS_TURN_LEFT_FAST || LaraItem->ActiveState == LS_TURN_RIGHT_FAST || LaraItem->ActiveState == LS_TURN_LEFT_SLOW || LaraItem->ActiveState == LS_TURN_RIGHT_SLOW); + return (LaraItem->Animation.ActiveState == LS_IDLE || LaraItem->Animation.ActiveState == LS_TURN_LEFT_FAST || LaraItem->Animation.ActiveState == LS_TURN_RIGHT_FAST || LaraItem->Animation.ActiveState == LS_TURN_LEFT_SLOW || LaraItem->Animation.ActiveState == LS_TURN_RIGHT_SLOW); } break; default: @@ -181,8 +181,8 @@ void Renderer11::updateLaraAnimations(bool force) case LaraWeaponType::Flare: case LaraWeaponType::Torch: // Left arm - LaraItem->AnimNumber = Lara.LeftArm.AnimNumber; - LaraItem->FrameNumber = Lara.LeftArm.FrameNumber; + LaraItem->Animation.AnimNumber = Lara.LeftArm.AnimNumber; + LaraItem->Animation.FrameNumber = Lara.LeftArm.FrameNumber; mask = MESH_BITS(LM_LINARM) | MESH_BITS(LM_LOUTARM) | MESH_BITS(LM_LHAND); frac = GetFrame(LaraItem, framePtr, &rate); diff --git a/TR5Main/Scripting/GameScriptItemInfo.cpp b/TR5Main/Scripting/GameScriptItemInfo.cpp index 8f2635f73..7234415ff 100644 --- a/TR5Main/Scripting/GameScriptItemInfo.cpp +++ b/TR5Main/Scripting/GameScriptItemInfo.cpp @@ -412,60 +412,60 @@ void GameScriptItemInfo::SetItemFlags(sol::as_table_t> cons int GameScriptItemInfo::GetCurrentAnimState() const { - return m_item->ActiveState; + return m_item->Animation.ActiveState; } void GameScriptItemInfo::SetCurrentAnimState(int animState) { - m_item->ActiveState = animState; + m_item->Animation.ActiveState = animState; } int GameScriptItemInfo::GetRequiredAnimState() const { - return m_item->RequiredState; + return m_item->Animation.RequiredState; } void GameScriptItemInfo::SetRequiredAnimState(short animState) { - m_item->RequiredState = animState; + m_item->Animation.RequiredState = animState; } int GameScriptItemInfo::GetGoalAnimState() const { - return m_item->TargetState; + return m_item->Animation.TargetState; } void GameScriptItemInfo::SetGoalAnimState(int state) { - m_item->TargetState = state; + m_item->Animation.TargetState = state; } int GameScriptItemInfo::GetAnimNumber() const { - return m_item->AnimNumber - Objects[m_item->ObjectNumber].animIndex; + return m_item->Animation.AnimNumber - Objects[m_item->ObjectNumber].animIndex; } void GameScriptItemInfo::SetAnimNumber(int animNumber) { //TODO fixme: we need bounds checking with an error message once it's in the level file format - m_item->AnimNumber = animNumber + Objects[m_item->ObjectNumber].animIndex; + m_item->Animation.AnimNumber = animNumber + Objects[m_item->ObjectNumber].animIndex; } int GameScriptItemInfo::GetFrameNumber() const { - return m_item->FrameNumber - g_Level.Anims[m_item->AnimNumber].frameBase; + return m_item->Animation.FrameNumber - g_Level.Anims[m_item->Animation.AnimNumber].frameBase; } void GameScriptItemInfo::SetFrameNumber(int frameNumber) { - auto const fBase = g_Level.Anims[m_item->AnimNumber].frameBase; - auto const fEnd = g_Level.Anims[m_item->AnimNumber].frameEnd; + auto const fBase = g_Level.Anims[m_item->Animation.AnimNumber].frameBase; + auto const fEnd = g_Level.Anims[m_item->Animation.AnimNumber].frameEnd; auto frameCount = fEnd - fBase; bool cond = (frameNumber < frameCount); const char* err = "Invalid frame number {}; max frame count for anim {} is {}."; - if (ScriptAssertF(cond, err, frameNumber, m_item->AnimNumber, frameCount)) - m_item->FrameNumber = frameNumber + fBase; + if (ScriptAssertF(cond, err, frameNumber, m_item->Animation.AnimNumber, frameCount)) + m_item->Animation.FrameNumber = frameNumber + fBase; else ScriptWarn("Not setting frame number."); } diff --git a/TR5Main/Specific/input.cpp b/TR5Main/Specific/input.cpp index 0f6f9e36a..150888132 100644 --- a/TR5Main/Specific/input.cpp +++ b/TR5Main/Specific/input.cpp @@ -223,12 +223,12 @@ int S_UpdateInput() { if (!flareNo) { - if (LaraItem->ActiveState == LS_CRAWL_IDLE || - LaraItem->ActiveState == LS_CRAWL_FORWARD || - LaraItem->ActiveState == LS_CRAWL_TURN_LEFT || - LaraItem->ActiveState == LS_CRAWL_TURN_RIGHT || - LaraItem->ActiveState == LS_CRAWL_BACK || - LaraItem->ActiveState == LS_CRAWL_TO_HANG) + if (LaraItem->Animation.ActiveState == LS_CRAWL_IDLE || + LaraItem->Animation.ActiveState == LS_CRAWL_FORWARD || + LaraItem->Animation.ActiveState == LS_CRAWL_TURN_LEFT || + LaraItem->Animation.ActiveState == LS_CRAWL_TURN_RIGHT || + LaraItem->Animation.ActiveState == LS_CRAWL_BACK || + LaraItem->Animation.ActiveState == LS_CRAWL_TO_HANG) { SoundEffect(SFX_TR4_LARA_NO, nullptr, 2); flareNo = true;