1
0
forked from metin2/client
client/GameLib/Area.h

311 lines
8.7 KiB
C
Raw Normal View History

#pragma once
#include "../SpeedTreeLib/SpeedTreeWrapper.h"
#include "../eterGrnLib/ThingInstance.h"
#include "MapType.h"
#include "DungeonBlock.h"
class CMapOutdoor;
class CEffectInstance;
class CArea
{
public:
enum
{
ROTATION_STEP_COUNT = 24,
ROTATION_STEP_AMOUNT = 360 / ROTATION_STEP_COUNT,
YAW_STEP_COUNT = 24,
YAW_STEP_AMOUNT = 360 / YAW_STEP_COUNT,
PITCH_STEP_COUNT = YAW_STEP_COUNT,
PITCH_STEP_AMOUNT = YAW_STEP_AMOUNT,
};
typedef D3DXVECTOR3 TObjectPosition;
///////////////////////////////////////////////////////////////////////////////////
// Object Static Data
typedef struct SObjectData
{
TObjectPosition Position;
DWORD dwCRC;
BYTE abyPortalID[PORTAL_ID_MAX_NUM];
// For Tree
// - Nothing
// For Granny Thing
float m_fYaw;
float m_fPitch;
float m_fRoll;
float m_fHeightBias;
// For Effect
// - Nothing
// For Ambience
DWORD dwRange;
float fMaxVolumeAreaPercentage;
void InitializeRotation();
} TObjectData;
struct ObjectDataComp
{
bool operator () (TObjectData & lhs, TObjectData & rhs) const
{
return lhs.dwCRC < rhs.dwCRC;
}
};
typedef std::vector<TObjectData> TObjectDataVector;
typedef TObjectDataVector::iterator TObjectDataIterator;
///////////////////////////////////////////////////////////////////////////////////
// Object Dynamic Data
typedef struct SAmbienceInstance : public CScreen
{
float fx, fy, fz;
DWORD dwRange;
float fMaxVolumeAreaPercentage;
int iPlaySoundIndex;
float fNextPlayTime;
prt::TPropertyAmbience AmbienceData;
SAmbienceInstance();
virtual ~SAmbienceInstance() {}
void __Update(float fxCenter, float fyCenter, float fzCenter);
void (SAmbienceInstance::*Update)(float fxCenter, float fyCenter, float fzCenter);
void UpdateOnceSound(float fxCenter, float fyCenter, float fzCenter);
void UpdateStepSound(float fxCenter, float fyCenter, float fzCenter);
void UpdateLoopSound(float fxCenter, float fyCenter, float fzCenter);
void Render();
bool Picking();
float __GetVolumeFromDistance(float fDistance);
} TAmbienceInstance;
typedef struct SObjectInstance
{
DWORD dwType;
CAttributeInstance * pAttributeInstance;
// Data For Tree
CSpeedTreeWrapper * pTree;
// Data For Normal Object or Building
BOOL isShadowFlag;
CGraphicThingInstance * pThingInstance;
// Data for Effect
DWORD dwEffectID;
DWORD dwEffectInstanceIndex;
// Data For Ambience
TAmbienceInstance * pAmbienceInstance;
// Dungeon
CDungeonBlock * pDungeonBlock;
void Clear()
{
if (pTree)
pTree->Clear();
if (pThingInstance)
pThingInstance->Clear();
if (pAttributeInstance)
pAttributeInstance->Clear();
if (pAmbienceInstance)
pAmbienceInstance->Clear();
if (pDungeonBlock)
pDungeonBlock->Clear();
__Initialize();
}
void SetTree(float x, float y, float z, DWORD dwTreeCRC, const char* c_szTreeName);
void __Initialize()
{
dwType = prt::PROPERTY_TYPE_NONE;
dwEffectID = 0xffffffff;
dwEffectInstanceIndex = 0xffffffff;
isShadowFlag = false;
pTree=NULL;
pThingInstance=NULL;
pAttributeInstance=NULL;
pAmbienceInstance=NULL;
pDungeonBlock=NULL;
}
SObjectInstance()
{
__Initialize();
}
virtual ~SObjectInstance()
{
}
} TObjectInstance;
typedef std::vector<CSpeedTreeWrapper *> TTreeInstanceVector;
typedef std::vector<CGraphicThingInstance *> TThingInstanceVector;
typedef std::vector<CDungeonBlock *> TDungeonBlockInstanceVector;
typedef std::vector<TObjectInstance *> TObjectInstanceVector;
typedef std::vector<TAmbienceInstance *> TAmbienceInstanceVector;
typedef std::map<CGraphicThingInstance *, DWORD> TGraphicThingInstanceCRCMap; // <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> by <20><><EFBFBD><EFBFBD>
typedef std::set<int> TShowingPortalIDSet;
typedef struct SCRCWithNumber
{
DWORD dwCRC;
DWORD dwNumber;
} TCRCWithNumber;
typedef std::vector<TCRCWithNumber> TCRCWithNumberVector;
struct FFindIfCRC
{
FFindIfCRC(DWORD dwCRC) { m_dwCRC = dwCRC; }
bool operator() (TCRCWithNumber & rCRCWithNumber)
{
if (rCRCWithNumber.dwCRC == m_dwCRC)
return true;
return false;
}
DWORD m_dwCRC;
};
struct CRCNumComp
{
bool operator () (TCRCWithNumber & lhs, TCRCWithNumber & rhs) const
{
return lhs.dwNumber > rhs.dwNumber;
}
};
public:
CArea();
virtual ~CArea();
void CollectRenderingObject(std::vector<CGraphicThingInstance*>& rkVct_pkOpaqueThingInst);
void CollectBlendRenderingObject(std::vector<CGraphicThingInstance*>& rkVct_pkBlendThingInst);
void SetMapOutDoor(CMapOutdoor * pOwnerOutdoorMap);
void Clear();
bool Load(const char * c_szPathName);
DWORD GetObjectDataCount();
bool GetObjectDataPointer(DWORD dwIndex, const TObjectData ** ppObjectData) const;
const DWORD GetObjectInstanceCount() const;
const bool GetObjectInstancePointer(const DWORD & dwIndex, const TObjectInstance ** ppObjectInstance) const;
void EnablePortal(BOOL bFlag=TRUE);
void ClearPortal();
void AddShowingPortalID(int iNum);
void RefreshPortal();
//////////////////////////////////////////////////////////////////////////
void Update();
void UpdateAroundAmbience(float fX, float fY, float fZ);
void Render();
void RenderEffect();
void RenderCollision();
void RenderAmbience();
void RenderDungeon();
void Refresh();
//////////////////////////////////////////////////////////////////////////
void SetCoordinate(const WORD & c_usCoordX, const WORD & c_usCoordY);
void GetCoordinate(WORD * usCoordX, WORD * usCoordY);
//////////////////////////////////////////////////////////////////////////
DWORD DEBUG_GetRenderedCRCNum();
TCRCWithNumberVector & DEBUG_GetRenderedCRCWithNumVector();
DWORD DEBUG_GetRenderedGrapphicThingInstanceNum();
CMapOutdoor * GetOwner() { return m_pOwnerOutdoorMap; }
protected:
bool CheckObjectIndex(DWORD dwIndex) const;
bool __Load_LoadObject(const char * c_szFileName);
bool __Load_LoadAmbience(const char * c_szFileName);
void __Load_BuildObjectInstances();
void __UpdateAniThingList();
void __UpdateEffectList();
void __LoadAttribute(TObjectInstance * pObjectInstance, const char * c_szAttributeFileName);
protected:
void __Clear_DestroyObjectInstance(TObjectInstance * pObjectInstance);
void __SetObjectInstance(TObjectInstance * pObjectInstance, const TObjectData * c_pData);
void __SetObjectInstance_SetTree(TObjectInstance * pObjectInstance, const TObjectData * c_pData, CProperty * pProperty);
void __SetObjectInstance_SetBuilding(TObjectInstance * pObjectInstance, const TObjectData * c_pData, CProperty * pProperty);
void __SetObjectInstance_SetEffect(TObjectInstance * pObjectInstance, const TObjectData * c_pData, CProperty * pProperty);
void __SetObjectInstance_SetAmbience(TObjectInstance * pObjectInstance, const TObjectData * c_pData, CProperty * pProperty);
void __SetObjectInstance_SetDungeonBlock(TObjectInstance * pObjectInstance, const TObjectData * c_pData, CProperty * pProperty);
protected:
// Static Data
TObjectDataVector m_ObjectDataVector; // Area <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
// Rendering Instances
TObjectInstanceVector m_ObjectInstanceVector;
// Clone Instance Vector
TTreeInstanceVector m_TreeCloneInstaceVector;
TThingInstanceVector m_ThingCloneInstaceVector;
TDungeonBlockInstanceVector m_DungeonBlockCloneInstanceVector;
TThingInstanceVector m_AniThingCloneInstanceVector;
TThingInstanceVector m_ShadowThingCloneInstaceVector;
TAmbienceInstanceVector m_AmbienceCloneInstanceVector;
TGraphicThingInstanceCRCMap m_GraphicThingInstanceCRCMap;
TCRCWithNumberVector m_kRenderedThingInstanceCRCWithNumberVector;
TThingInstanceVector m_kRenderedGrapphicThingInstanceVector;
// <20><>ǥ : <20>ɸ<EFBFBD><C9B8><EFBFBD> <20><> <20><>ü <20>߿<EFBFBD><DFBF><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ... <20>Ѵ<EFBFBD> 0~999
WORD m_wX;
WORD m_wY;
// Owner COutdoorMap poineter
CMapOutdoor * m_pOwnerOutdoorMap;
protected:
static CDynamicPool<TObjectInstance> ms_ObjectInstancePool;
static CDynamicPool<CAttributeInstance> ms_AttributeInstancePool;
static CDynamicPool<TAmbienceInstance> ms_AmbienceInstancePool;
static CDynamicPool<CDungeonBlock> ms_DungeonBlockInstancePool;
typedef std::map<DWORD, CEffectInstance*> TEffectInstanceMap;
typedef TEffectInstanceMap::iterator TEffectInstanceIterator;
TEffectInstanceMap m_EffectInstanceMap;
BOOL m_bPortalEnable;
TShowingPortalIDSet m_kSet_ShowingPortalID;
public:
static void DestroySystem();
static CArea* New();
static void Delete(CArea* pkArea);
static CDynamicPool<CArea> ms_kPool;
};