Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
352 lines
8.9 KiB
C++
352 lines
8.9 KiB
C++
//===========================================================================//
|
|
// File: AnimationState.cpp
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- ---------------------------------------------------------- //
|
|
// 02/23/999 JSE Inital coding
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1998, Microsoft Corp. //
|
|
// All Rights reserved worldwide //
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
#include "MW4Headers.hpp"
|
|
#include "Vehicle.hpp"
|
|
#include "MechAnimationState.hpp"
|
|
#include "Mech.hpp"
|
|
|
|
//#############################################################################
|
|
//########################## AnimationStateEngine ########################
|
|
//#############################################################################
|
|
|
|
|
|
MechAnimationStateEngine::ClassData*
|
|
MechAnimationStateEngine::DefaultData = NULL;
|
|
|
|
const StateEngine::StateEntry
|
|
MechAnimationStateEngine::StateEntries[]=
|
|
{
|
|
STATE_ENTRY(MechAnimationStateEngine, Stand),
|
|
STATE_ENTRY(MechAnimationStateEngine, StandHalf),
|
|
|
|
STATE_ENTRY(MechAnimationStateEngine, Stand_1_8_th),
|
|
STATE_ENTRY(MechAnimationStateEngine, Stand_2_8_th),
|
|
STATE_ENTRY(MechAnimationStateEngine, Stand_3_8_th),
|
|
STATE_ENTRY(MechAnimationStateEngine, Stand_5_8_th),
|
|
STATE_ENTRY(MechAnimationStateEngine, Stand_6_8_th),
|
|
STATE_ENTRY(MechAnimationStateEngine, Stand_7_8_th),
|
|
|
|
STATE_ENTRY(MechAnimationStateEngine, Forward),
|
|
STATE_ENTRY(MechAnimationStateEngine, Backward),
|
|
|
|
STATE_ENTRY(MechAnimationStateEngine, TurnLeft),
|
|
STATE_ENTRY(MechAnimationStateEngine, TurnRight),
|
|
|
|
STATE_ENTRY(MechAnimationStateEngine, LGimpTurnRight),
|
|
STATE_ENTRY(MechAnimationStateEngine, RGimpTurnRight),
|
|
STATE_ENTRY(MechAnimationStateEngine, LGimpTurnLeft),
|
|
STATE_ENTRY(MechAnimationStateEngine, RGimpTurnLeft),
|
|
|
|
|
|
STATE_ENTRY(MechAnimationStateEngine, GimpStandLeft),
|
|
STATE_ENTRY(MechAnimationStateEngine, GimpForwardLeft),
|
|
STATE_ENTRY(MechAnimationStateEngine, GimpForwardRight),
|
|
STATE_ENTRY(MechAnimationStateEngine, GimpStandRight),
|
|
|
|
STATE_ENTRY(MechAnimationStateEngine, FallForward),
|
|
STATE_ENTRY(MechAnimationStateEngine, FallBackward),
|
|
STATE_ENTRY(MechAnimationStateEngine, FallLeft),
|
|
STATE_ENTRY(MechAnimationStateEngine, FallRight),
|
|
STATE_ENTRY(MechAnimationStateEngine, FallCataclysmic),
|
|
|
|
STATE_ENTRY(MechAnimationStateEngine, PowerDown),
|
|
STATE_ENTRY(MechAnimationStateEngine, PowerDownCataclysmic),
|
|
|
|
STATE_ENTRY(MechAnimationStateEngine, Crouch),
|
|
STATE_ENTRY(MechAnimationStateEngine, Fly)
|
|
|
|
};
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
MechAnimationStateEngine::InitializeClass()
|
|
{
|
|
Check_Object(AnimationStateEngine::DefaultData);
|
|
Verify(!DefaultData);
|
|
DefaultData =
|
|
new ClassData(
|
|
MechAnimationStateEngineClassID,
|
|
"MechAnimationStateEngine",
|
|
AnimationStateEngine::DefaultData,
|
|
ELEMENTS(StateEntries),
|
|
StateEntries,
|
|
NULL,
|
|
NULL
|
|
);
|
|
Register_Object(DefaultData);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
MechAnimationStateEngine::TerminateClass()
|
|
{
|
|
Unregister_Object(DefaultData);
|
|
delete DefaultData;
|
|
DefaultData = NULL;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
MechAnimationStateEngine*
|
|
MechAnimationStateEngine::Make(Vehicle *vehicle, const FactoryRequest *request)
|
|
{
|
|
Check_Object(request);
|
|
Check_Object(vehicle);
|
|
gos_PushCurrentHeap(Heap);
|
|
MechAnimationStateEngine* engine = new MechAnimationStateEngine(vehicle, DefaultData, request);
|
|
gos_PopCurrentHeap();
|
|
return engine;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
MechAnimationStateEngine::Save(FactoryRequest *request)
|
|
{
|
|
Check_Object(this);
|
|
Check_Object(request);
|
|
|
|
AnimationStateEngine::Save(request);
|
|
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
MechAnimationStateEngine::Reuse(const FactoryRequest *request)
|
|
{
|
|
Check_Object(this);
|
|
Check_Object(request);
|
|
|
|
AnimationStateEngine::Reuse(request);
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
MechAnimationStateEngine::MechAnimationStateEngine(
|
|
Vehicle *vehicle,
|
|
ClassData *class_data,
|
|
const FactoryRequest *request
|
|
):
|
|
AnimationStateEngine(vehicle, class_data, request)
|
|
{
|
|
//can't castobject as it is in the object constructor that this happens
|
|
m_Mech = (Mech*) vehicle;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
MechAnimationStateEngine::~MechAnimationStateEngine()
|
|
{
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
int
|
|
MechAnimationStateEngine::RequestState(
|
|
int new_state,
|
|
bool run_minimal,
|
|
void* data
|
|
)
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
Verify(new_state < StateCount);
|
|
|
|
if (m_Mech->GetFastTransition())
|
|
{
|
|
if (new_state == StandState)
|
|
{
|
|
if (GetState() == ForwardState || GetState() == BackwardState)
|
|
{
|
|
if (statePlaying.GetCurrent() != NULL)
|
|
{
|
|
|
|
Scalar state_percentage = statePlaying.GetCurrent()->GetStatePercentage();
|
|
|
|
|
|
if (state_percentage < 0.5)
|
|
{
|
|
if (state_percentage < 0.125)
|
|
{
|
|
new_state = Stand_1_8_thState;
|
|
//SPEW(("jerryeds", "1/8"));
|
|
}
|
|
else if (state_percentage < 0.250)
|
|
{
|
|
new_state = Stand_2_8_thState;
|
|
//SPEW(("jerryeds", "2/8"));
|
|
}
|
|
else if (state_percentage < 0.375)
|
|
{
|
|
new_state = Stand_3_8_thState;
|
|
//SPEW(("jerryeds", "3/8"));
|
|
}
|
|
else
|
|
{
|
|
new_state = StandHalfState;
|
|
//SPEW(("jerryeds", "4/8"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
if (state_percentage < 0.625)
|
|
{
|
|
new_state = Stand_5_8_thState;
|
|
//SPEW(("jerryeds", "5/8"));
|
|
}
|
|
else if (state_percentage < 0.750)
|
|
{
|
|
new_state = Stand_6_8_thState;
|
|
//SPEW(("jerryeds", "6/8"));
|
|
}
|
|
else if (state_percentage < 0.875)
|
|
{
|
|
new_state = Stand_7_8_thState;
|
|
//SPEW(("jerryeds", "7/8"));
|
|
}
|
|
else
|
|
{
|
|
new_state = StandState;
|
|
//SPEW(("jerryeds", "8/8"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (new_state == StandState)
|
|
{
|
|
if (GetState() == ForwardState || GetState() == BackwardState)
|
|
{
|
|
if (statePlaying.GetCurrent() != NULL)
|
|
{
|
|
|
|
if (statePlaying.GetCurrent()->GetStatePercentage() > 0.95f || statePlaying.GetCurrent()->GetStatePercentage() < 0.45f)
|
|
{
|
|
//SPEWALWAYS(("jerryeds", "HALF STOP : %f", statePlaying.GetCurrent()->GetStatePercentage()));
|
|
new_state = StandHalfState;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int return_state = AnimationStateEngine::RequestState(new_state, run_minimal, data);
|
|
|
|
Mech *mech = Cast_Object( Mech *, vehicleParent);
|
|
|
|
|
|
switch(GetTransitionState())
|
|
{
|
|
|
|
|
|
case FallForwardState:
|
|
case FallBackwardState:
|
|
case FallLeftState:
|
|
case FallRightState:
|
|
case FallCataclysmicState:
|
|
case PowerDownState:
|
|
case PowerDownCataclysmicState:
|
|
case CrouchState:
|
|
mech->FadeUndampened();
|
|
break;
|
|
|
|
default:
|
|
mech->FadeDampened();
|
|
break;
|
|
}
|
|
|
|
|
|
return return_state;
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void
|
|
MechAnimationStateEngine::RunStates(Stuff::Scalar time_slice, bool run_minimal)
|
|
{
|
|
|
|
//SPEW(("jerryeds", "-------------"));
|
|
|
|
if(statePlaying.GetCurrent() != NULL)
|
|
{
|
|
switch(GetState())
|
|
{
|
|
case StandHalfState:
|
|
case Stand_1_8_thState:
|
|
case Stand_2_8_thState:
|
|
case Stand_3_8_thState:
|
|
case Stand_5_8_thState:
|
|
case Stand_6_8_thState:
|
|
case Stand_7_8_thState:
|
|
AnimationStateEngine::RequestState(StandState);
|
|
break;
|
|
}
|
|
}
|
|
|
|
#if 0
|
|
MW4Animation::AnimHierarchyIteratorManager::doTransitionBlend = true;
|
|
if (IsTransitioning())
|
|
{
|
|
if (GetState() == FlyState)
|
|
{
|
|
// turn off transition
|
|
// we only want to turn this off during the first
|
|
// phase of the land...
|
|
|
|
if (quedCurrentState)
|
|
{
|
|
MW4Animation::AnimHierarchyIteratorManager::doTransitionBlend = false;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
AnimationStateEngine::RunStates(time_slice, run_minimal);
|
|
|
|
}
|
|
|
|
|
|
//#############################################################################
|
|
//########################## AnimationStateEngine #######################
|
|
//#############################################################################
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void
|
|
MechAnimationStateEngine::TestClass()
|
|
{
|
|
Verify(IsDerivedFrom(DefaultData));
|
|
}
|
|
|