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; }
// 从文件读取原始物品列表 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; }