📄 itemdata.cpp
字号:
// ItemData.cpp: implementation of the CItemData class.
//
//////////////////////////////////////////////////////////////////////
#include "ItemData.h"
// class static
MAP_ITEMINFO CItemData::s_mapItemType;
//---------------------------------------------------------------------
CItemData::CItemData()
{
m_dwRecordAmount = 0;
m_pIDIndex = NULL;
m_fp = NULL;
char szFilename[]="ini/itemtype.dat";
m_fp = fopen(szFilename, "rb");
MYASSERT(m_fp);
this->CreateIndexTable();
FILE* fp = fopen("ini/itemnamelist.ini", "r");
if(fp)
{
char szLine[1024] = "";
while(true)
{
if (1 != fscanf(fp,"%s\n", szLine))
break;
if(strlen(szLine) == 0)
continue;
std::string str = szLine;
m_setItemName.push_back(str);
}
fclose(fp);
}
this->CreateAdditionalInfo();
}
//---------------------------------------------------------------------
BOOL CItemData::CheckItem(const char* pszItemName)
{
if(!pszItemName)
return false;
for(int i = 0; i < m_setItemName.size(); i ++)
{
char szName[_MAX_NAMESIZE]="";
strcpy(szName, m_setItemName[i].c_str());
if(strcmp(szName, pszItemName) == 0)
return true;
}
return false;
}
//---------------------------------------------------------------------
CItemData::~CItemData()
{
delete[] m_pIDIndex;
m_setItemName.clear();
m_mapItemAdditional.clear();
fclose(m_fp);
}
//---------------------------------------------------------------------
BOOL CItemData::CreateIndexTable()
{
// 创建索引表
// 取记录条数
fread(&m_dwRecordAmount, sizeof(DWORD), 1, m_fp);
// 为ID索引表分配内存
m_pIDIndex = new OBJID[m_dwRecordAmount];
MYASSERT(m_pIDIndex);
// 读取ID索引
fread(m_pIDIndex, sizeof(OBJID), m_dwRecordAmount, m_fp);
return true;
}
//---------------------------------------------------------------------
BOOL CItemData::GetItemTypeInfo(OBJID idType, ItemTypeInfo& infoItemType)
{
MAP_ITEMINFO::iterator itr = s_mapItemType.find(idType);
if (itr != s_mapItemType.end())
{
memcpy(&infoItemType, &itr->second, sizeof(ItemTypeInfo));
return true;
}
if(!m_pIDIndex)
return false;
// 初始化定位信息 -1 为没有找到
int nLocate = -1;
// 查找索引表, 当ItemType表超过300时考虑做多级索引
for(DWORD i = 0; i < m_dwRecordAmount; i++)
{
OBJID* pObjID = m_pIDIndex + i;
OBJID idItem = *pObjID;
if(*pObjID == idType)
{
nLocate = i;
break;
}
}
// 看看索引表中有没有
if(nLocate < 0)
return false;
// 定位文件指针
DWORD dwOffset = sizeof(DWORD) +
sizeof(OBJID) * m_dwRecordAmount +
sizeof(ItemTypeInfo) * nLocate;
fseek(m_fp, dwOffset, SEEK_SET);
// 读记录
fread(&infoItemType, sizeof(ItemTypeInfo), 1, m_fp);
// save type info
s_mapItemType.insert(MAP_ITEMINFO::value_type(idType, infoItemType));
return true;
}
//---------------------------------------------------------------------
BOOL CItemData::GetItemAdditionInfo(OBJID idType, int nLevel, ItemAdditionInfo& infoAdditional)
{
__int64 i64Data = nLevel;
idType = (idType/10)*10;
i64Data = (i64Data << 32) + idType;
map<__int64, ItemAdditionInfo>::iterator iter = m_mapItemAdditional.find(i64Data);
if(iter != m_mapItemAdditional.end())
{
infoAdditional = iter->second;
return true;
}
return false;
}
//---------------------------------------------------------------------
void CItemData::CreateAdditionalInfo()
{
const char szIniFile[] = "ini/ItemAddition.ini";
FILE* fp = fopen(szIniFile, "r");
if(!fp)
return;
char szLine[1024];
while(fgets(szLine, 1023, fp))
{
if(strlen(szIniFile) <= 0)
continue;
if(szIniFile[0]==';')
continue;
DWORD dwID, dwLevel;
ItemAdditionInfo info;
if(11 == sscanf(szLine, "%u %u %d %d %d %d %d %d %d %d %d\n", &dwID, &dwLevel,
&info.nLife, &info.nAttackMax, &info.nAttackMin,
&info.nDefense, &info.nMAttackMax, &info.nMAttackMin,
&info.nMDef, &info.nDexterity, &info.nDodge))
{
__int64 i64Data = dwLevel;
i64Data = (i64Data << 32) + dwID;
// m_mapItemAdditional[1] = info;
m_mapItemAdditional.insert(MAP_ITEMADDITIONINFO::value_type(i64Data, info));
}
}
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -