📄 mhmap.cpp
字号:
// MHMap.cpp: implementation of the CMHMap class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MHMap.h"
#include "GameResourceManager.h"
#include "TileManager.h"
#include "MHFile.h"
//#include "Mp3/BGMLoader.h"
#include "ObjectManager.h"
#include "MainGame.h"
#include "Engine/Engine.h"
#include "GameIn.h"
#include "./Audio/MHAudioManager.h"
#include "MHCamera.h"
//#include "./mp3/BGMLoader.h"
#include "MiniMapDlg.h"
#include "QuestManager.h"
#include "ItemManager.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
GLOBALTON(CMHMap)
CMHMap::CMHMap()
{
sky = NULL;
m_pTileManager = NULL;
mapDesc = NULL;
m_bIsInited = FALSE;
m_CloudTable.Initialize(64);
m_bVillage = FALSE;
m_dwQuestNpcId = 1000;
}
CMHMap::~CMHMap()
{
// Release();
SAFE_DELETE(mapDesc);
}
void CMHMap::InitMap(MAPTYPE MapNum)
{
m_dwQuestNpcId = 1000;
m_bIsInited = TRUE;
m_MapNum = MapNum;
LOGFILE("LoadMapDesc(MapNum)");
LoadMapDesc(MapNum);
DIRECTORYMGR->SetLoadMode(eLM_Map);
{
// 烙矫
LOGFILE("map.Init(mapDesc->MapFileName)");
BOOL rt;
rt = map.Init(mapDesc->MapFileName);
LOGFILE("SAFE_DELETE(sky)");
SAFE_DELETE(sky);
if(mapDesc->bSky)
{
LOGFILE("sky");
sky = new CEngineSky;
sky->CreateSky(mapDesc->SkyMod,mapDesc->SkyAnm);
}
LOGFILE("m_pTileManager");
DIRECTORYMGR->SetLoadMode(eLM_Resource);
m_pTileManager = new CTileManager;
if(m_pTileManager->LoadTileInfo(mapDesc->TileFileName) == FALSE)
SAFE_DELETE(m_pTileManager);
DIRECTORYMGR->SetLoadMode(eLM_Map);
}
DIRECTORYMGR->SetLoadMode(eLM_Root);
LOGFILE("ApplyMapDesc()");
ApplyMapDesc();
// 阁胶磐 固府 肺爹
// PreLoadData();
LoadPreData(MapNum);
}
/*
void CMHMap::PreLoadData()
{
BASE_MONSTER_LIST* pMonsterInfo = GAMERESRCMNGR->GetMonsterListInfo(13);
}
*/
void CMHMap::LoadPreData(MAPTYPE MapNum)
{
sPRELOAD_INFO* pPreLoadInfo = GAMERESRCMNGR->GetPreDataInfo(MapNum);
if(!pPreLoadInfo) return;
//
BASE_MONSTER_LIST* pBMonInfo = NULL;
//----------------------------------------------------------------
// Monster
//----------------------------------------------------------------
DIRECTORYMGR->SetLoadMode(eLM_Monster);
for(int i=0; i<pPreLoadInfo->Count[ePreLoad_Monster]; i++)
{
pBMonInfo = GAMERESRCMNGR->GetMonsterListInfo(pPreLoadInfo->Kind[ePreLoad_Monster][i]);
if(pBMonInfo)
CEngineObject::PreLoadObject(pBMonInfo->ChxName);
}
//----------------------------------------------------------------
// Item
//----------------------------------------------------------------
DIRECTORYMGR->SetLoadMode(eLM_Character);
MOD_LIST* pModList_Man = &GAMERESRCMNGR->m_ModFileList[GENDER_MALE];
MOD_LIST* pModList_Woman = &GAMERESRCMNGR->m_ModFileList[GENDER_FEMALE];
StaticString* pString = NULL;
int PartModelNum = 0;
for(i=0; i<pPreLoadInfo->Count[ePreLoad_Item]; i++)
{
if(i == 54)
int a = 1;
PartModelNum = ITEMMGR->GetItemInfo(pPreLoadInfo->Kind[ePreLoad_Item][i])->Part3DModelNum;
// Man
pString = &pModList_Man->ModFile[PartModelNum];
if(pString == 0)
{
char buf[128];
sprintf(buf, "No Name ModList! Plz Check again.ItemNum : %d", pPreLoadInfo->Kind[ePreLoad_Item][i]);
ASSERTMSG(0, buf);
}
if(strlen(pString->Str))
CEngineObject::PreLoadObject(pString->Str);
// Woman
pString = &pModList_Woman->ModFile[PartModelNum];
if(strlen(pString->Str))
CEngineObject::PreLoadObject(pString->Str);
}
//----------------------------------------------------------------
// Effect
//----------------------------------------------------------------
DIRECTORYMGR->SetLoadMode(eLM_Effect);
PRELOADEFF* pEff = NULL;
cPtrList* pList = GAMERESRCMNGR->GetPreLoadEfflist();
PTRLISTPOS pos = pList->GetHeadPosition();
while(pos)
{
PRELOADEFF* pEff = (PRELOADEFF*)pList->GetNext(pos);
if(pEff)
{
g_pExecutive->PreLoadGXObject(pEff->FileName.Str);
}
}
DIRECTORYMGR->SetLoadMode(eLM_Root);
}
void CMHMap::ApplyMapDesc()
{
if(mapDesc == NULL)
{
LOGFILE("!!!!mapDesc == NULL!!!!");
}
// CameraFilter
if(mapDesc->CameraFilter[0])
{
m_CameraFilterObject.Init(mapDesc->CameraFilter,NULL,eEngineObjectType_Effect);
m_CameraFilterObject.AttachToCamera(mapDesc->CameraFilterDist);
CAMERA->SetCameraFilter(&m_CameraFilterObject);
}
MAINGAME->GetEngine()->GetGraphicsEngine()->SetBackGroundColor(mapDesc->backColor);
MAINGAME->GetEngine()->GetGraphicsEngine()->SetFixHeight(mapDesc->bFixHeight,mapDesc->FixHeight);
//YH2DO Remove Global Variable
bRenderSky = mapDesc->bSky;
g_pExecutive->GetGeometry()->SetAmbientColor(0,mapDesc->Ambient);
if(mapDesc->fogdesc.bEnable)
{
// 烙矫
g_pExecutive->GetGeometry()->EnableFog(0);
g_pExecutive->GetGeometry()->SetFog(&mapDesc->fogdesc,0);
}
else
{
g_pExecutive->GetGeometry()->DisableFog(0);
}
VECTOR3 pos;
pos.x = 0;
pos.y = 0;
pos.z = 0;
g_pExecutive->GetGeometry()->ResetCamera(&pos,CAMERA_NEAR,mapDesc->DefaultSight,DEGTORAD(mapDesc->Fov),0);
CAMERA->SetMaxSightDistance( mapDesc->DefaultSight );
CAMERA->SetCameraFov( DEGTORAD(mapDesc->Fov) );
//////////////////////////////////////////////////////////////////////////
// BGM
// if(mapDesc->BGMSoundNum)
// {
LOGFILE("AUDIOMGR->PlayBGM");
AUDIOMGR->PlayBGM( mapDesc->BGMSoundNum );
LOGFILE("AUDIOMGR->PlayBGM End");
//MP3->PlayFile(AUDIOMGR->GetFileName(mapDesc->BGMSoundNum),TRUE);
//mapDesc->BGMSound[0] = 0;
// }
//////////////////////////////////////////////////////////////////////////
// 规氢己 扼捞飘
g_pExecutive->GetGeometry()->EnableDirectionalLight(0);
DIRECTIONAL_LIGHT_DESC LightDesc;
LightDesc.dwAmbient = 0;
LightDesc.dwDiffuse = 0xffffffff;
LightDesc.dwSpecular = 0xffffffff;
LightDesc.v3Dir = mapDesc->SunPos * -1.f;
LightDesc.bEnable = TRUE;
g_pExecutive->GetGeometry()->SetDirectionalLight(&LightDesc,0);
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// 弊覆磊
if(GAMERESRCMNGR->m_GameDesc.bShadow == MHSHADOW_DETAIL)
{
VECTOR3 to;
to.x = 0;
to.y = 0;
to.z = 0;
//float len = VECTOR3Length(&mapDesc->SunPos);
float len = VECTOR3Length(&m_SunPosForShadow);
m_Shadowlight.InitShadowLight(0,&pos,&to,gPHI/16, len + 1000);
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// 秦 客 崔
if(mapDesc->bSun)
{
DIRECTORYMGR->SetLoadMode(eLM_Map);
m_SunObject.Init(mapDesc->SunObject,NULL,eEngineObjectType_Effect);
DIRECTORYMGR->SetLoadMode(eLM_Root);
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// 备抚
if(mapDesc->CloudNum)
{
CEngineCloud::LoadCloudList(mapDesc->CloudListFile);
CEngineCloud::SetCloudHeight(mapDesc->CloudHMin,mapDesc->CloudHMax);
VECTOR3 vel;
vel.x = 20;
vel.y = 0;
vel.z = 10;
CEngineCloud::SetCloudVelocity(&vel);
ASSERT(CEngineCloud::GetMaxCloudKindNum() != 0);
DWORD numperside = (DWORD)sqrt(mapDesc->CloudNum);
DWORD n=0;
float sizeperside = 51200.f / numperside;
for(DWORD x=0;x<numperside;++x)
{
for(DWORD z=0;z<numperside;++z)
{
CEngineCloud* pCloud = new CEngineCloud;
float fx = x*sizeperside + rand()%(DWORD(sizeperside));
float fz = z*sizeperside + rand()%(DWORD(sizeperside));
pCloud->Init(rand()%pCloud->GetMaxCloudKindNum(),fx,fz);
m_CloudTable.Add(pCloud,n++);
}
}
}
LOGFILE("Apply MapDesc Ends");
}
void CMHMap::Restore()
{
}
void CMHMap::Release()
{
m_CameraFilterObject.DetachFromCamera();
CAMERA->SetCameraFilter(NULL);
m_CameraFilterObject.Release();
AUDIOMGR->StopBGM();
m_CloudTable.SetPositionHead();
while(CEngineCloud* pCloud = m_CloudTable.GetData())
{
delete pCloud;
}
m_CloudTable.RemoveAll();
CEngineCloud::ReleaseCloudList();
m_bIsInited = FALSE;
ReleasePool();
ProcessGarbageObject();
m_Shadowlight.Release();
SAFE_DELETE(mapDesc);
SAFE_DELETE(sky);
m_SunObject.Release();
map.Release();
SAFE_DELETE(m_pTileManager);
}
void CMHMap::Invalidate()
{
// ReleasePool();
// ProcessGarbageObject();
}
void CMHMap::Process(DWORD CurTime)
{
if( !m_bIsInited ) return;
static DWORD SumTick = 0;
static DWORD LastTime = 0;
static DWORD Tick = 0;
if(LastTime)
{
Tick = CurTime - LastTime;
LastTime = CurTime;
}
else
{
LastTime = CurTime;
return;
}
if(mapDesc->bSky && sky)
{
SumTick += Tick;
if(SumTick > 50)
{
sky->IncreaseSkyAniFrame(1);
SumTick -= 50;
}
sky->RenderSky();
}
/*
if(GAMERESRCMNGR->m_GameDesc.bShadow == MHSHADOW_DETAIL) //
{
VECTOR3 pos;
pos = m_ShadowPivotPos + mapDesc->SunPos;
m_Shadowlight.SetPosition(&pos);
LIGHT_DESC desc;
m_Shadowlight.GetLightDesc(&desc);
desc.v3Point = pos;
desc.v3To = m_ShadowPivotPos;
m_Shadowlight.SetLightDesc(&desc);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -