Ejemplo n.º 1
0
bool ObjProtoLoader::Load( GI::ObjProtoFactory *fac, void *u )
{
    CRFile *file = rfOpen( "data/goods/goodslist.dat" );
    if( !file ) return false;
    char mark[6] = { 0 };
    file->ReadData( mark, 5 );
    if( strcmp( mark, "GOODS" ) ) return false;
    long version;
    file->ReadData( &version, sizeof( version ) );
    long cnt;
    file->ReadData( &cnt, sizeof( cnt ) );
    for( long i = 0; i < cnt; ++ i )
    {
        GI::ObjectProto *proto = new GI::ObjectProto();
        if( !LoadProto( proto, file ) ) delete proto; 
        else
        {
            long index = TypeSet::ValueType::ToLong( proto->GetValue( 
                        TypeSet::KeyType( PINDEX ) ) );
            fac->AddProperty( index, proto );
        }
    }
    rfClose( file );
    return true;
}
Ejemplo n.º 2
0
// 从文件读取原始物品列表
bool CGoodsList::LoadGoodsList(const char* filename)
{
	m_mapGoodsList.clear();
	m_mapGoodsListByName.clear();

	CRFile* prfile = rfOpen(filename);	
	if( prfile == NULL )
	{
		char str[256];
		sprintf(str, "file '%s' can't found!", filename);
		MessageBox(g_hWnd, str, "error", MB_OK);
		return false;
	}

	// 文件头和版本
	char szHeader[6];
	memset(szHeader, 0, 6);
	prfile->ReadData(szHeader, 5);
	if( strcmp(szHeader, "GOODS") != 0 )
	{
		char str[256];
		sprintf(str, "file '%s' is not goodslist file!", filename);
		MessageBox(g_hWnd, str, "error", MB_OK);
		rfClose(prfile);
		return false;
	}

	long lVersion = 0;
	prfile->ReadData(&lVersion, sizeof(long));

	// 具体内容

	long lNum = 0;
	prfile->ReadData(&lNum, sizeof(long));
	for(int i=0; i<lNum; i++)
	{
		long lStrSize=0;
		tagGoods2 stGoods;

		prfile->ReadData(&stGoods.BaseProperty.dwIndex, sizeof(stGoods.BaseProperty.dwIndex));

		prfile->ReadData(&lStrSize, sizeof(long));
		char *pStrOrginName=new char[lStrSize+1];	
		prfile->ReadData(pStrOrginName, lStrSize);
		pStrOrginName[lStrSize]='\0';
		stGoods.BaseProperty.strOrginName=pStrOrginName;
		SAFE_DELETE(pStrOrginName);
		prfile->ReadData(&lStrSize, sizeof(long));
		char *pStrName=new char[lStrSize+1];

		prfile->ReadData(pStrName, lStrSize);
		pStrName[lStrSize]='\0';
		stGoods.BaseProperty.strName=pStrName;
		SAFE_DELETE(pStrName);

		prfile->ReadData(&stGoods.BaseProperty.dwIconId, sizeof(stGoods.BaseProperty.dwIconId));		//	界面图形ID
		prfile->ReadData(&stGoods.BaseProperty.dwGroundId, sizeof(stGoods.BaseProperty.dwGroundId));		//	落地后图形ID
		prfile->ReadData(&stGoods.BaseProperty.dwEquipID, sizeof(stGoods.BaseProperty.dwEquipID));		//	换装图形ID
		prfile->ReadData(&stGoods.BaseProperty.dwSound, sizeof(stGoods.BaseProperty.dwSound));		//	拾取声音
		prfile->ReadData(&stGoods.BaseProperty.dwSoundID1, sizeof(stGoods.BaseProperty.dwSoundID1));		//	挥动/弱伤害声音
		prfile->ReadData(&stGoods.BaseProperty.dwSoundID2, sizeof(stGoods.BaseProperty.dwSoundID2));		//	特殊攻击/击中声音
		prfile->ReadData(&stGoods.BaseProperty.bSoundSwitch, sizeof(stGoods.BaseProperty.bSoundSwitch));	//	攻击时是否混音
		prfile->ReadData(&stGoods.BaseProperty.dwWeaponActType, sizeof(stGoods.BaseProperty.dwWeaponActType));//	武器对应的动作类型
		prfile->ReadData(&stGoods.BaseProperty.dwType, sizeof(stGoods.BaseProperty.dwType));				// 类型
		prfile->ReadData(&stGoods.BaseProperty.dwPrice, sizeof(stGoods.BaseProperty.dwPrice));				// 金币价格
		prfile->ReadData(&stGoods.BaseProperty.dwSilverPrice, sizeof(stGoods.BaseProperty.dwSilverPrice));	// 银币价格
		//prfile->ReadData(&stGoods.BaseProperty.dwWeight, sizeof(stGoods.BaseProperty.dwWeight));

		//中文描述内容
		prfile->ReadData(&lStrSize, sizeof(long));
		char *pStrContent=new char[lStrSize+1];	
		prfile->ReadData(pStrContent, lStrSize);
		pStrContent[lStrSize]='\0';
		stGoods.BaseProperty.strContent=pStrContent;
		SAFE_DELETE(pStrContent);

		long lEffectNum = 0;
		prfile->ReadData(&lEffectNum, sizeof(long));
		ushort wType=0;
		for(int j=0;j<lEffectNum;j++)
		{
			tagEffect stEffect;

			prfile->ReadData(&wType/*&stEffect.wType*/,sizeof(ushort));
			stEffect.wType=wType+1;
			prfile->ReadData(&stEffect.bEnable,sizeof(bool));
			prfile->ReadData(&stEffect.bHide,sizeof(bool));
			prfile->ReadData(&stEffect.dwValue1,sizeof(ulong));
			prfile->ReadData(&stEffect.dwValue2,sizeof(ulong));
			//prfile->ReadData(&stEffect.wOdds,sizeof(ushort));
			stGoods.vectorEffect.push_back(stEffect);
		}		

		//////////////////读套装属性/////////////////////////
		prfile->ReadData(&lEffectNum, sizeof(long));
		for(int i=0;i<lEffectNum;i++)
		{
			tagGoodsBeControlledAttri stSuitSingleGoodsAttri;

			prfile->ReadData(&wType,sizeof(ushort));
			stSuitSingleGoodsAttri.wPropertyName = wType+1;
			prfile->ReadData(&(stSuitSingleGoodsAttri.dwValue1),sizeof(ulong));
			prfile->ReadData(&(stSuitSingleGoodsAttri.dwValue2),sizeof(ulong));
			prfile->ReadData(&(stSuitSingleGoodsAttri.wActiveNum),sizeof(ushort));

			stGoods.m_SuitProperty.push_back(stSuitSingleGoodsAttri);
		}

		////////////////属性激发的属性////////////////////
		prfile->ReadData(&lEffectNum, sizeof(long));
		for(int i=0;i<lEffectNum;i++)
		{
			tagGoodsBeControlledAttri stGoodsAktiviertAttri;

			prfile->ReadData(&wType,sizeof(ushort));
			stGoodsAktiviertAttri.wPropertyName = wType+1;
			prfile->ReadData(&(stGoodsAktiviertAttri.dwValue1),sizeof(ulong));
			prfile->ReadData(&(stGoodsAktiviertAttri.dwValue2),sizeof(ulong));
			prfile->ReadData(&(stGoodsAktiviertAttri.wActiveNum),sizeof(ushort));

			stGoods.m_AkiviertProperty.push_back(stGoodsAktiviertAttri);
		}

		//////////////////////////////////////////////////////
		m_mapGoodsList[stGoods.BaseProperty.dwIndex] = stGoods;
		/////////////测试信息////////////
		//if (stGoods.BaseProperty.dwIndex==32)
		//{
		//	char buf[256];
		//	vector<CGoodsList::tagEffect>::iterator Iter = stGoods.vectorEffect.begin();
		//	for(;Iter!=stGoods.vectorEffect.end();Iter++)
		//	{
		//		PutDebugString(ltoa(Iter->wType,buf,10));
		//		PutDebugString(ltoa(Iter->dwValue1,buf,10));
		//	}
		//}
		////////////////////////////////
		m_mapGoodsListByName[stGoods.BaseProperty.strOrginName] = &m_mapGoodsList[stGoods.BaseProperty.dwIndex];
	}

	rfClose(prfile);
	return true;
}