Skip to content
2 changes: 2 additions & 0 deletions Core/GameEngine/Source/GameLogic/System/GameLogicDispatch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,8 @@ void GameLogic::clearGameData( Bool showScoreScreen )

void FixupScoreScreenMovieWindow();
FixupScoreScreenMovieWindow();

destroyQuitMenu();
Comment thread
xezon marked this conversation as resolved.
}

TheGameEngine->reset();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2180,51 +2180,53 @@ void W3DModelDraw::adjustAnimation(const ModelConditionInfo* prevState, Real pre

const W3DAnimationInfo& animInfo = m_curState->m_animations[m_whichAnimInCurState];

HAnimClass* animHandle = animInfo.getAnimHandle(); // note that this now returns an ADDREFED handle, which must be released by the caller!
if (m_renderObject && animHandle)
if (m_renderObject)
{
Int startFrame = 0;
if (m_curState->m_mode == RenderObjClass::ANIM_MODE_ONCE_BACKWARDS ||
m_curState->m_mode == RenderObjClass::ANIM_MODE_LOOP_BACKWARDS)
HAnimClass* animHandle = animInfo.getAnimHandle(); // note that this now returns an ADDREFED handle, which must be released by the caller!
if (animHandle)
{
startFrame = animHandle->Get_Num_Frames()-1;
}
Int startFrame = 0;
if (m_curState->m_mode == RenderObjClass::ANIM_MODE_ONCE_BACKWARDS ||
m_curState->m_mode == RenderObjClass::ANIM_MODE_LOOP_BACKWARDS)
{
startFrame = animHandle->Get_Num_Frames()-1;
}

if (testFlagBit(m_curState->m_flags, RANDOMIZE_START_FRAME))
{
startFrame = GameClientRandomValue(0, animHandle->Get_Num_Frames()-1);
}
else if (testFlagBit(m_curState->m_flags, START_FRAME_FIRST))
{
startFrame = 0;
}
else if (testFlagBit(m_curState->m_flags, START_FRAME_LAST))
{
startFrame = animHandle->Get_Num_Frames()-1;
}
// order is important here: MAINTAIN_FRAME_ACROSS_STATES is overridden by the other bits, above.
else if (isAnyMaintainFrameFlagSet(m_curState->m_flags) &&
prevState &&
prevState != m_curState &&
isAnyMaintainFrameFlagSet(prevState->m_flags) &&
isCommonMaintainFrameFlagSet(m_curState->m_flags, prevState->m_flags) &&
prevAnimFraction >= 0.0)
{
startFrame = REAL_TO_INT(prevAnimFraction * animHandle->Get_Num_Frames()-1);
}
if (testFlagBit(m_curState->m_flags, RANDOMIZE_START_FRAME))
{
startFrame = GameClientRandomValue(0, animHandle->Get_Num_Frames()-1);
}
else if (testFlagBit(m_curState->m_flags, START_FRAME_FIRST))
{
startFrame = 0;
}
else if (testFlagBit(m_curState->m_flags, START_FRAME_LAST))
{
startFrame = animHandle->Get_Num_Frames()-1;
}
// order is important here: MAINTAIN_FRAME_ACROSS_STATES is overridden by the other bits, above.
else if (isAnyMaintainFrameFlagSet(m_curState->m_flags) &&
prevState &&
prevState != m_curState &&
isAnyMaintainFrameFlagSet(prevState->m_flags) &&
isCommonMaintainFrameFlagSet(m_curState->m_flags, prevState->m_flags) &&
prevAnimFraction >= 0.0)
{
startFrame = REAL_TO_INT(prevAnimFraction * animHandle->Get_Num_Frames()-1);
}

m_renderObject->Set_Animation(animHandle, startFrame, m_curState->m_mode);
REF_PTR_RELEASE(animHandle);
animHandle = nullptr;
m_renderObject->Set_Animation(animHandle, startFrame, m_curState->m_mode);
REF_PTR_RELEASE(animHandle);
animHandle = nullptr;

if (m_renderObject->Class_ID() == RenderObjClass::CLASSID_HLOD)
{
HLodClass *hlod = (HLodClass*)m_renderObject;
Real factor = GameClientRandomValueReal( m_curState->m_animMinSpeedFactor, m_curState->m_animMaxSpeedFactor );
hlod->Set_Animation_Frame_Rate_Multiplier( factor );
if (m_renderObject->Class_ID() == RenderObjClass::CLASSID_HLOD)
{
HLodClass *hlod = (HLodClass*)m_renderObject;
Real factor = GameClientRandomValueReal( m_curState->m_animMinSpeedFactor, m_curState->m_animMaxSpeedFactor );
hlod->Set_Animation_Frame_Rate_Multiplier( factor );
}
}
}

}
else
{
Expand Down
62 changes: 42 additions & 20 deletions Core/Libraries/Source/WWVegas/WW3D2/hcanim.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -293,10 +293,6 @@ int HCompressedAnimClass::Load_W3D(ChunkLoadClass & cload)
/*
** Now, read in all of the other chunks (motion channels).
*/
TimeCodedMotionChannelClass * tc_chan;
AdaptiveDeltaMotionChannelClass * ad_chan;
TimeCodedBitChannelClass * newbitchan;

while (cload.Open_Chunk()) {

switch (cload.Cur_Chunk_ID()) {
Expand All @@ -306,7 +302,8 @@ int HCompressedAnimClass::Load_W3D(ChunkLoadClass & cload)
switch ( Flavor ) {

case ANIM_FLAVOR_TIMECODED:

{
TimeCodedMotionChannelClass* tc_chan = nullptr;
if (!read_channel(cload,&tc_chan)) {
goto Error;
}
Expand All @@ -322,8 +319,11 @@ int HCompressedAnimClass::Load_W3D(ChunkLoadClass & cload)
}

break;
}

case ANIM_FLAVOR_ADAPTIVE_DELTA:
{
AdaptiveDeltaMotionChannelClass* ad_chan = nullptr;
if (!read_channel(cload,&ad_chan)) {
goto Error;
}
Expand All @@ -338,10 +338,13 @@ int HCompressedAnimClass::Load_W3D(ChunkLoadClass & cload)
WWDEBUG_SAY(("ERROR! animation %s indexes a bone not present in the model. Please re-export!",Name));
}
break;
}
}
break;

case W3D_CHUNK_COMPRESSED_BIT_CHANNEL:
{
TimeCodedBitChannelClass* newbitchan = nullptr;
if (!read_bit_channel(cload,&newbitchan)) {
goto Error;
}
Expand All @@ -357,6 +360,7 @@ int HCompressedAnimClass::Load_W3D(ChunkLoadClass & cload)
}

break;
}

default:
break;
Expand Down Expand Up @@ -387,20 +391,32 @@ int HCompressedAnimClass::Load_W3D(ChunkLoadClass & cload)
*=============================================================================================*/
bool HCompressedAnimClass::read_channel(ChunkLoadClass & cload,TimeCodedMotionChannelClass * * newchan)
{
*newchan = W3DNEW TimeCodedMotionChannelClass;
bool result = (*newchan)->Load_W3D(cload);

return result;

TimeCodedMotionChannelClass* channel = W3DNEW TimeCodedMotionChannelClass;
if (channel->Load_W3D(cload))
{
*newchan = channel;
return true;
}
else
{
delete channel;
return false;
}
}

bool HCompressedAnimClass::read_channel(ChunkLoadClass & cload,AdaptiveDeltaMotionChannelClass * * newchan)
{
*newchan = W3DNEW AdaptiveDeltaMotionChannelClass;
bool result = (*newchan)->Load_W3D(cload);

return result;

AdaptiveDeltaMotionChannelClass* channel = W3DNEW AdaptiveDeltaMotionChannelClass;
if (channel->Load_W3D(cload))
{
*newchan = channel;
return true;
}
else
{
delete channel;
return false;
}
}


Expand Down Expand Up @@ -483,11 +499,17 @@ void HCompressedAnimClass::add_channel(AdaptiveDeltaMotionChannelClass * newchan
*=============================================================================================*/
bool HCompressedAnimClass::read_bit_channel(ChunkLoadClass & cload,TimeCodedBitChannelClass * * newchan)
{
*newchan = W3DNEW TimeCodedBitChannelClass;
bool result = (*newchan)->Load_W3D(cload);

return result;

TimeCodedBitChannelClass* channel = W3DNEW TimeCodedBitChannelClass;
if (channel->Load_W3D(cload))
{
*newchan = channel;
return true;
}
else
{
delete channel;
return false;
}
}


Expand Down
2 changes: 1 addition & 1 deletion Core/Libraries/Source/WWVegas/WW3D2/seglinerenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ void SegLineRendererClass::Set_Texture_Tile_Factor(float factor)
///@todo: I raised this number and didn't see much difference on our min-spec. -MW
const static float MAX_LINE_TILING_FACTOR = 50.0f;
if (factor > MAX_LINE_TILING_FACTOR) {
WWDEBUG_SAY(("Texture (%s) Tile Factor (%.2f) too large in SegLineRendererClass!", Get_Texture()->Get_Texture_Name().str(), TextureTileFactor));
WWDEBUG_SAY(("Texture (%s) Tile Factor (%.2f) too large in SegLineRendererClass!", Peek_Texture()->Get_Texture_Name().str(), TextureTileFactor));
factor = MAX_LINE_TILING_FACTOR;
} else {
factor = MAX(factor, 0.0f);
Expand Down
3 changes: 3 additions & 0 deletions Generals/Code/GameEngine/Source/Common/GameEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,9 @@ GameEngine::~GameEngine()
delete TheSubsystemList;
TheSubsystemList = nullptr;

delete TheSkirmishGameInfo;
TheSkirmishGameInfo = nullptr;

delete TheNetwork;
TheNetwork = nullptr;

Expand Down
2 changes: 1 addition & 1 deletion Generals/Code/GameEngine/Source/Common/RTS/Player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2978,8 +2978,8 @@ void Player::removeUpgrade( const UpgradeTemplate *upgradeTemplate )
if( upgrade->getStatus() == UPGRADE_STATUS_COMPLETE )
onUpgradeRemoved();

deleteInstance(upgrade);
}

}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ static void embedPristineMap( AsciiString map, Xfer *xfer )
if( file->read( buffer, fileSize ) != fileSize )
{

delete[] buffer;

DEBUG_CRASH(( "embedPristineMap - Error reading from file '%s'", map.str() ));
throw SC_INVALID_DATA;

Expand Down Expand Up @@ -159,6 +161,8 @@ static void embedInUseMap( AsciiString map, Xfer *xfer )
if( fread( buffer, 1, fileSize, fp ) != fileSize )
{

delete[] buffer;

DEBUG_CRASH(( "embedInUseMap - Error reading from file '%s'", map.str() ));
throw SC_INVALID_DATA;

Expand Down Expand Up @@ -214,6 +218,8 @@ static void extractAndSaveMap( AsciiString mapToSave, Xfer *xfer )
if( fwrite( buffer, 1, dataSize, fp ) != dataSize )
{

delete[] buffer;

DEBUG_CRASH(( "extractAndSaveMap - Error writing to file '%s'", mapToSave.str() ));
throw SC_INVALID_DATA;

Expand Down
7 changes: 6 additions & 1 deletion Generals/Code/GameEngine/Source/GameLogic/Map/SidesList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -534,7 +534,12 @@ void SidesList::prepareForMP_or_Skirmish()
break;
}
}
if (curSide == -1) continue;
if (curSide == -1)
{
deleteInstance(scripts[i]);
scripts[i] = nullptr;
continue;
}

deleteInstance(getSkirmishSideInfo(curSide)->getScriptList());
getSkirmishSideInfo(curSide)->setScriptList(scripts[i]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ BattlePlanUpdate::~BattlePlanUpdate()
TheAudio->removeAudioEvent( m_holdTheLineUnpack.getPlayingHandle() );
TheAudio->removeAudioEvent( m_holdTheLinePack.getPlayingHandle() );

deleteInstance(m_bonuses);
}

// ------------------------------------------------------------------------------------------------
Expand Down
49 changes: 34 additions & 15 deletions Generals/Code/Libraries/Source/WWVegas/WW3D2/hrawanim.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -236,14 +236,13 @@ int HRawAnimClass::Load_W3D(ChunkLoadClass & cload)
/*
** Now, read in all of the other chunks (motion channels).
*/
MotionChannelClass * newchan;
BitChannelClass * newbitchan;

while (cload.Open_Chunk()) {

switch (cload.Cur_Chunk_ID()) {

case W3D_CHUNK_ANIMATION_CHANNEL:
{
MotionChannelClass* newchan = nullptr;
if (!read_channel(cload,&newchan,pre30)) {
goto Error;
}
Expand All @@ -258,8 +257,11 @@ int HRawAnimClass::Load_W3D(ChunkLoadClass & cload)
delete newchan;
}
break;
}

case W3D_CHUNK_BIT_CHANNEL:
{
BitChannelClass* newbitchan = nullptr;
if (!read_bit_channel(cload,&newbitchan,pre30)) {
goto Error;
}
Expand All @@ -274,6 +276,7 @@ int HRawAnimClass::Load_W3D(ChunkLoadClass & cload)
delete newbitchan;
}
break;
}

default:
break;
Expand Down Expand Up @@ -304,14 +307,22 @@ int HRawAnimClass::Load_W3D(ChunkLoadClass & cload)
*=============================================================================================*/
bool HRawAnimClass::read_channel(ChunkLoadClass & cload,MotionChannelClass * * newchan,bool pre30)
{
*newchan = W3DNEW MotionChannelClass;
bool result = (*newchan)->Load_W3D(cload);
MotionChannelClass* channel = W3DNEW MotionChannelClass;
if (channel->Load_W3D(cload))
{
if (pre30)
{
channel->PivotIdx += 1;
}

if (result && pre30) {
(*newchan)->PivotIdx += 1;
*newchan = channel;
return true;
}
else
{
delete channel;
return false;
}

return result;
}

/***********************************************************************************************
Expand Down Expand Up @@ -378,14 +389,22 @@ void HRawAnimClass::add_channel(MotionChannelClass * newchan)
*=============================================================================================*/
bool HRawAnimClass::read_bit_channel(ChunkLoadClass & cload,BitChannelClass * * newchan,bool pre30)
{
*newchan = W3DNEW BitChannelClass;
bool result = (*newchan)->Load_W3D(cload);
BitChannelClass* channel = W3DNEW BitChannelClass;
if (channel->Load_W3D(cload))
{
if (pre30)
{
channel->PivotIdx += 1;
}

if (result && pre30) {
(*newchan)->PivotIdx += 1;
*newchan = channel;
return true;
}
else
{
delete channel;
return false;
}

return result;
}


Expand Down
Loading
Loading