⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 itemdata.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 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 + -