📄 polygrid.cpp
字号:
// ----------------------------------------------------------------------- //
//
// MODULE : PolyGrid.cpp
//
// PURPOSE : PolyGrid - Implementation
//
// CREATED : 10/20/97
//
// ----------------------------------------------------------------------- //
#include "PolyGrid.h"
#include "cpp_server_de.h"
#include "ClientServerShared.h"
#include "SFXMsgIds.h"
#include "SharedDefs.h"
BEGIN_CLASS(PolyGrid)
ADD_VECTORPROP_FLAG(Dims, PF_DIMS | PF_LOCALDIMS)
ADD_COLORPROP(Color1, 255.0f, 255.0f, 255.0f)
ADD_COLORPROP(Color2, 255.0f, 255.0f, 255.0f)
ADD_STRINGPROP(SpriteSurfaceName, "Sprites\\VolumeBrushSprites\\Water1.spr")
ADD_REALPROP(XScaleMin, 15.0f)
ADD_REALPROP(XScaleMax, 15.0f)
ADD_REALPROP(YScaleMin, 15.0f)
ADD_REALPROP(YScaleMax, 15.0f)
ADD_REALPROP(XScaleDuration, 10.0f)
ADD_REALPROP(YScaleDuration, 10.0f)
ADD_REALPROP(XPan, 10.0f)
ADD_REALPROP(YPan, 10.0f)
ADD_REALPROP(Alpha, 0.7f)
ADD_LONGINTPROP(NumPolies, 160)
PROP_DEFINEGROUP(PlasmaInfo, PF_GROUP1)
ADD_LONGINTPROP_FLAG(PlasmaType, 1, PF_GROUP1)
ADD_LONGINTPROP_FLAG(Ring1Rate, 50, PF_GROUP1)
ADD_LONGINTPROP_FLAG(Ring2Rate, 10, PF_GROUP1)
ADD_LONGINTPROP_FLAG(Ring3Rate, 30, PF_GROUP1)
ADD_LONGINTPROP_FLAG(Ring4Rate, 20, PF_GROUP1)
END_CLASS_DEFAULT_FLAGS(PolyGrid, CClientSFX, NULL, NULL, CF_ALWAYSLOAD)
// ----------------------------------------------------------------------- //
//
// ROUTINE: PolyGrid::PolyGrid
//
// PURPOSE: Initialize
//
// ----------------------------------------------------------------------- //
PolyGrid::PolyGrid() : CClientSFX()
{
VEC_SET(m_vDims, 32.0f, 32.0f, 0.0f);
VEC_SET(m_vColor1, 50.0f, 50.0f, 200.0f);
VEC_SET(m_vColor2, 0.0f, 0.0f, 220.0f);
m_fXScaleMin = 15.0f;
m_fXScaleMax = 15.0f;
m_fYScaleMin = 15.0f;
m_fYScaleMax = 15.0f;
m_fXScaleDuration = 10.0f;
m_fYScaleDuration = 10.0f;
m_fXPan = 10.0f;
m_fYPan = 10.0f;
m_hstrSurfaceSprite = DNULL;
m_fAlpha = 0.7f;
m_nPlasmaType = 1;
m_bSetup = DFALSE;
m_dwNumPolies = 160;
m_nRingRate[0] = 50;
m_nRingRate[1] = 10;
m_nRingRate[2] = 30;
m_nRingRate[3] = 20;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PolyGrid::~PolyGrid
//
// PURPOSE: Deallocate
//
// ----------------------------------------------------------------------- //
PolyGrid::~PolyGrid()
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
if (m_hstrSurfaceSprite)
{
pServerDE->FreeString(m_hstrSurfaceSprite);
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PolyGrid::Setup
//
// PURPOSE: Initialize
//
// ----------------------------------------------------------------------- //
void PolyGrid:: Setup(DVector* pvDims, DVector* pvColor1, DVector* pvColor2,
HSTRING hstrSurfaceSprite, DFLOAT fXScaleMin, DFLOAT fXScaleMax,
DFLOAT fYScaleMin, DFLOAT fYScaleMax, DFLOAT fXScaleDuration,
DFLOAT fYScaleDuration, DFLOAT fXPan, DFLOAT fYPan,
DFLOAT fAlpha, DDWORD dwNumPolies)
{
D_WORD wColor1, wColor2;
CServerDE* pServerDE = GetServerDE();
if (!pServerDE || !pvDims || !pvColor1 || !pvColor2 || dwNumPolies < 4) return;
VEC_COPY(m_vDims, *pvDims);
pServerDE->SetObjectDims(m_hObject, pvDims);
VEC_COPY(m_vColor1, *pvColor1);
VEC_COPY(m_vColor2, *pvColor2);
wColor1 = Color255VectorToWord( pvColor1 );
wColor2 = Color255VectorToWord( pvColor2 );
// Limit the number of polies to 32k...
if ( dwNumPolies > 0x7FFF )
dwNumPolies = 0x7FFF;
HSTRING hstrSprite = hstrSurfaceSprite ? hstrSurfaceSprite : pServerDE->CreateString("");
// Tell the clients about the polygrid...
HMESSAGEWRITE hMessage = pServerDE->StartSpecialEffectMessage(this);
pServerDE->WriteToMessageByte(hMessage, SFX_POLYGRID_ID);
pServerDE->WriteToMessageVector(hMessage, &m_vDims);
pServerDE->WriteToMessageWord(hMessage, wColor1);
pServerDE->WriteToMessageWord(hMessage, wColor2);
pServerDE->WriteToMessageFloat(hMessage, fXScaleMin);
pServerDE->WriteToMessageFloat(hMessage, fXScaleMax);
pServerDE->WriteToMessageFloat(hMessage, fYScaleMin);
pServerDE->WriteToMessageFloat(hMessage, fYScaleMax);
pServerDE->WriteToMessageFloat(hMessage, fXScaleDuration);
pServerDE->WriteToMessageFloat(hMessage, fYScaleDuration);
pServerDE->WriteToMessageFloat(hMessage, fXPan);
pServerDE->WriteToMessageFloat(hMessage, fYPan);
pServerDE->WriteToMessageFloat(hMessage, fAlpha);
pServerDE->WriteToMessageHString(hMessage, hstrSprite);
pServerDE->WriteToMessageWord(hMessage, (D_WORD)dwNumPolies);
pServerDE->WriteToMessageByte(hMessage, m_nPlasmaType);
pServerDE->WriteToMessageByte(hMessage, m_nRingRate[0]);
pServerDE->WriteToMessageByte(hMessage, m_nRingRate[1]);
pServerDE->WriteToMessageByte(hMessage, m_nRingRate[2]);
pServerDE->WriteToMessageByte(hMessage, m_nRingRate[3]);
pServerDE->EndMessage(hMessage);
if (!hstrSurfaceSprite)
{
pServerDE->FreeString(hstrSprite);
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PolyGrid::EngineMessageFn
//
// PURPOSE: Handle engine messages
//
// ----------------------------------------------------------------------- //
DDWORD PolyGrid::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return 0;
switch(messageID)
{
case MID_PRECREATE:
{
if (fData == PRECREATE_WORLDFILE ||
fData == PRECREATE_STRINGPROP ||
fData == PRECREATE_NORMAL)
{
ReadProp((ObjectCreateStruct *)pData);
}
break;
}
case MID_INITIALUPDATE:
{
if (fData != INITIALUPDATE_SAVEGAME)
{
pServerDE->SetObjectUserFlags(m_hObject, USRFLG_VISIBLE);
if (m_bSetup)
{
Setup(&m_vDims, &m_vColor1, &m_vColor2, m_hstrSurfaceSprite,
m_fXScaleMin, m_fXScaleMax, m_fYScaleMin, m_fYScaleMax,
m_fXScaleDuration, m_fYScaleDuration, m_fXPan, m_fYPan,
m_fAlpha, m_dwNumPolies);
}
}
CacheFiles();
break;
}
default : break;
}
return CClientSFX::EngineMessageFn(messageID, pData, fData);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PolyGrid::ReadProp
//
// PURPOSE: Set property value
//
// ----------------------------------------------------------------------- //
void PolyGrid::ReadProp(ObjectCreateStruct * pStruct)
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
pStruct->m_Flags = FLAG_VISIBLE;
char buf[MAX_CS_FILENAME_LEN];
buf[0] = '\0';
pServerDE->GetPropString("SpriteSurfaceName", buf, MAX_CS_FILENAME_LEN);
if (buf[0]) m_hstrSurfaceSprite = pServerDE->CreateString(buf);
if (pServerDE->GetPropVector("Dims", &m_vDims) == DE_OK)
{
m_bSetup = DTRUE;
}
pServerDE->GetPropVector("Color1", &m_vColor1);
pServerDE->GetPropVector("Color2", &m_vColor2);
pServerDE->GetPropReal("XScaleMin", &m_fXScaleMin);
pServerDE->GetPropReal("XScaleMax", &m_fXScaleMax);
pServerDE->GetPropReal("YScaleMin", &m_fYScaleMin);
pServerDE->GetPropReal("YScaleMax", &m_fYScaleMax);
pServerDE->GetPropReal("XScaleDuration", &m_fXScaleDuration);
pServerDE->GetPropReal("YScaleDuration", &m_fYScaleDuration);
pServerDE->GetPropReal("XPan", &m_fXPan);
pServerDE->GetPropReal("YPan", &m_fYPan);
pServerDE->GetPropReal("Alpha", &m_fAlpha);
long nLongVal;
if (pServerDE->GetPropLongInt("NumPolies", &nLongVal) == DE_OK)
{
m_dwNumPolies = (DDWORD)nLongVal;
}
pServerDE->GetPropLongInt("PlasmaType", &nLongVal);
m_nPlasmaType = (DBYTE)nLongVal;
pServerDE->GetPropLongInt("Ring1Rate", &nLongVal);
m_nRingRate[0] = (DBYTE)nLongVal;
pServerDE->GetPropLongInt("Ring2Rate", &nLongVal);
m_nRingRate[1] = (DBYTE)nLongVal;
pServerDE->GetPropLongInt("Ring3Rate", &nLongVal);
m_nRingRate[2] = (DBYTE)nLongVal;
pServerDE->GetPropLongInt("Ring4Rate", &nLongVal);
m_nRingRate[3] = (DBYTE)nLongVal;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: PolyGrid::CacheFiles
//
// PURPOSE: Cache the resources associated with this object...
//
// ----------------------------------------------------------------------- //
void PolyGrid::CacheFiles()
{
CServerDE* pServerDE = GetServerDE();
if (!pServerDE) return;
// {MD 9/23/98}
if(!(pServerDE->GetServerFlags() & SS_CACHING))
return;
if (m_hstrSurfaceSprite)
{
char* pFile = pServerDE->GetStringData(m_hstrSurfaceSprite);
if (pFile && pFile[0])
{
pServerDE->CacheFile(FT_SPRITE, pFile);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -