📄 cgamedata.cpp
字号:
//--------------------------------------------------------------------------------------------------------
// 游戏数据管理模块
//CGameData.cpp
//游戏引擎中的数据管理部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于:2003/6/20 by Kylinx
//--------------------------------------------------------------------------------------------------------
#include"CGameData.h"
#include"CGoods.h"
#include"CError.h"
#include"CRole.h"
#include"CMacro.h"
#include<stdio.h>
#include"CGame.h"
#include"CEffect.h"
#include"CDatabase.h"
////////////////////////////////////////////////////////////////////////////////////////////
//构造
////////////////////////////////////////////////////////////////////////////////////////////
CGameData::CGameData(CLog*pLog)
{
m_pLog=pLog;
m_bOwnLog=false;
if(!m_pLog)
{
m_pLog=new CLog("GameDataDebug.txt");
m_bOwnLog=true;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
//从魔法数据库文件中读取数据
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGameData::LoadEffectFromFile(CGame*pGame,char*szFile,int ID,STEffect*pEffect)
{
LOA_ASSERT(szFile!=NULL);
LOA_ASSERT(pEffect);
LOA_ASSERT(pGame);
char szID[32];
memset(szID,0,32);
wsprintf(szID,"%d",ID); //把ID转换为字符串
pEffect->ID=ID;
pEffect->dwDelay=::GetPrivateProfileInt(szID,"Delay",100,szFile);
pEffect->AlWaysShowFrameID=::GetPrivateProfileInt(szID,"AlwaysShow",-1,szFile);
char szPicName[256];
memset(szPicName,0,256);
::GetPrivateProfileString(szID,"EffectPic","",szPicName,256,szFile);
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&pEffect->pSurface,szPicName,0,0)))
{
pGame->GetLog()->WriteMessage("Create Effect Surface From File<%s> Failed!",szPicName);
return false;
}
char szString[256];
memset(szString,0,256);
::GetPrivateProfileString(szID,"PicColorKey","",szString,256,szFile);
int r,g,b;
sscanf(szString,"%d,%d,%d",&r,&g,&b);
pEffect->pSurface->SetColorKey(RGB(r,g,b));
char szSoundName[256];
memset(szSoundName,0,256);
::GetPrivateProfileString(szID,"Sound","",szSoundName,256,szFile);
pGame->GetSoundPlayer()->Create(&pEffect->pSound,szSoundName);
pEffect->nFrames=::GetPrivateProfileInt(szID,"AllFrames",0,szFile);
pEffect->aRect=new RECT[pEffect->nFrames];
pEffect->aFrameOffsiteX=new int[pEffect->nFrames];
pEffect->aFrameOffsiteY=new int[pEffect->nFrames];
if(!pEffect->aRect || !pEffect->aFrameOffsiteX || !pEffect->aFrameOffsiteY)
return false;
RECT rect;
char szKeyName[256];
for(int i=0;i<pEffect->nFrames;i++)
{
memset(szString,0,256);
memset(szKeyName,0,256);
wsprintf(szKeyName,"rect_%d",i+1);
::GetPrivateProfileString(szID,szKeyName,"",szString,256,szFile);
sscanf(szString,"%d,%d,%d,%d",&rect.left,&rect.top,&rect.right,&rect.bottom);
pEffect->aRect[i]=rect;
wsprintf(szKeyName,"xOffsite_%d",i+1);
pEffect->aFrameOffsiteX[i]=::GetPrivateProfileInt(szID,szKeyName,0,szFile);
wsprintf(szKeyName,"yOffsite_%d",i+1);
pEffect->aFrameOffsiteY[i]=::GetPrivateProfileInt(szID,szKeyName,0,szFile);
}
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//从魔法数据库文件中读取数据
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGameData::LoadMagicFromFile(CGame*pGame,char*szFile,int ID,STMagic*pMagic)
{
LOA_ASSERT(szFile!=NULL);
LOA_ASSERT(pMagic);
LOA_ASSERT(pGame);
char szID[32];
memset(szID,0,32);
wsprintf(szID,"%d",ID); //把ID转换为字符串
pMagic->nChangeHp=::GetPrivateProfileInt(szID,"ChangeHp",-1,szFile); //得到改变的Hp值
pMagic->nChangeMp=::GetPrivateProfileInt(szID,"ChangeMp",-1,szFile); //得到改变的Mp值
pMagic->ID=ID;
pMagic->bToAll=::GetPrivateProfileInt(szID,"bToAll",false,szFile);
pMagic->dwOldTime=0;
pMagic->dwDelay=::GetPrivateProfileInt(szID,"Delay",100,szFile);
memset(pMagic->szName,0,32);
::GetPrivateProfileString(szID,"Name","",pMagic->szName,32,szFile); //得到名字
memset(pMagic->szIntroduce,0,256);
::GetPrivateProfileString(szID,"Introduce","",pMagic->szIntroduce,256,szFile);//得到该魔法的简单说明
char szPicName[256];
memset(szPicName,0,256);
::GetPrivateProfileString(szID,"MagicPic","",szPicName,256,szFile);
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&pMagic->pSurface,szPicName,0,0)))
{
pGame->GetLog()->WriteMessage("Create Magic Surface From File<%s> Failed!",szPicName);
return false;
}
char szString[256];
memset(szString,0,256);
::GetPrivateProfileString(szID,"PicColorKey","",szString,256,szFile);
int r,g,b;
sscanf(szString,"%d,%d,%d",&r,&g,&b);
pMagic->pSurface->SetColorKey(RGB(r,g,b));
char szSoundName[256];
memset(szSoundName,0,256);
::GetPrivateProfileString(szID,"Sound","",szSoundName,256,szFile);
pGame->GetSoundPlayer()->Create(&pMagic->pSound,szSoundName);
pMagic->nFrames=::GetPrivateProfileInt(szID,"AllFrames",0,szFile);
pMagic->aRect=new RECT[pMagic->nFrames];
if(!pMagic->aRect)
return false;
RECT rect;
char szKeyName[256];
for(int i=0;i<pMagic->nFrames;i++)
{
memset(szString,0,256);
memset(szKeyName,0,256);
wsprintf(szKeyName,"rect_%d",i+1);
::GetPrivateProfileString(szID,szKeyName,"",szString,256,szFile);
sscanf(szString,"%d,%d,%d,%d",&rect.left,&rect.top,&rect.right,&rect.bottom);
pMagic->aRect[i]=rect;
}
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//从物品文件中读取数据
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGameData::LoadGoodsFromFile(char*szFile,int ID,STGood*good)
{
LOA_ASSERT(szFile!=NULL);
LOA_ASSERT(good);
char szID[32];
memset(szID,0,32);
wsprintf(szID,"%d",ID); //把ID转换为字符串
good->AddHp=::GetPrivateProfileInt(szID,"AddHp",0,szFile); //得到增加的Hp值
good->AddMaxHp=::GetPrivateProfileInt(szID,"AddMaxHp",0,szFile); //得到增加Hp上限的值
good->AddMaxMp=::GetPrivateProfileInt(szID,"AddMaxMp",0,szFile); //得到增加Mp上限的值
good->AddMp=::GetPrivateProfileInt(szID,"AddMp",0,szFile); //得到增加的Mp值
if(good->AddHp==0 && good->AddMaxHp==0
&& good->AddMaxMp==0 && good->AddMp==0) //如果找不到数据
return false;
good->ID=ID; //设置ID
good->dwPrice=::GetPrivateProfileInt(szID,"Price",0,szFile);
memset(good->szName,0,32);
::GetPrivateProfileString(szID,"Name","",good->szName,32,szFile); //得到名字
memset(good->szIntroduce,0,256);
::GetPrivateProfileString(szID,"Introduce","",good->szIntroduce,256,szFile);
//得到该物品的简单说明
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//创建魔法数据库
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGameData::CreateMagicDataBase(CGame*pGame,char*szDataFile,IDataBase<STMagic>**pdbMagic)
{
LOA_ASSERT(szDataFile);
LOA_ASSERT(pdbMagic);
LOA_ASSERT(pGame);
if(!(*pdbMagic))
{
(*pdbMagic)=IDataBase<STMagic>::ForeCreate();
}
char strID[4096];
memset(strID,0,4096);
::GetPrivateProfileString("ALLMAGICID","IDS","",strID,4096,szDataFile); //得到所有ID
if(strcmp("",strID)==0)
{
m_pLog->WriteMessage("错误的魔法数据文件!\n");
return false;
}
char temp[128];
int i=0;
int j=0;
int magicID;
STMagic*pMagic;
while(strID[i])
{
pMagic=new STMagic;
memset(temp,0,128);
j=0;
while(strID[i]!=',' && strID[i]!='\0') //得到string类型的一个ID
{
temp[j++]=strID[i];
i++;
}
i++; //跳过逗号
sscanf(temp,"%d",&magicID); //得到ID
if(!LoadMagicFromFile(pGame,szDataFile,magicID,pMagic))
{
m_pLog->WriteMessage("Can't Get Data(%d) While Init Magic DataBase!\n",magicID);
}
else
{
(*pdbMagic)->AddData(magicID,pMagic); //添加该魔法
}
}
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//创建物品数据库
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGameData::CreateGoodsDataBase(char*szDataFile,IDataBase<STGood>**pdbData)
{
LOA_ASSERT(szDataFile!=NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -