// includes #include "stdio.h" #ifdef _SPEED #include "time.h" #include #endif #include #include #include using namespace std; // typedefs typedef unsigned long u32; typedef unsigned short u16 ; typedef unsigned char u8 ; typedef signed long s32; typedef signed short s16; typedef signed char s8; // defines #define MAXFIELDS 256 #define DELIMETER "," struct wdbheader_t{ char signature[4]; u32 ver; char lang[4]; u32 fields; u32 unknown2; }; union wdbfield_t{ u32 uival; s32 sival; float fval; char* pchar; }; enum wdbfieldtypes{ t_undefined = 1 << 0, t_uint = 1 << 1, t_sint = 1 << 2, t_float = 1 << 3, t_bitmask16 = 1 << 4, t_bitmask32 = 1 << 5, t_str = 1 << 6, t_special2byte = 1 << 7 }; char* BM16toString(u32 val){ char* str = new char[17]; for(int i=0;i<16;i++){ if(val & (1<<(15-i))) str[i] = '1'; else str[i] = '0'; } str[16] = 0x00; return str; } char* BM32toString(u32 val){ char* str = new char[33]; for(int i=0;i<32;i++){ if(val & (1<<(31-i))) str[i] = '1'; else str[i] = '0'; } str[32] = 0x00; return str; } class CWDBDef{ u16 m_fieldtypes[MAXFIELDS]; u32 m_fields; u16 m_index; bool isReadable; char signature[4]; string m_fieldnames[MAXFIELDS]; string m_wdbname; public: char* getSignature(){ return &signature[0]; } char* getFieldName(u32 index){ if( index > m_fields ) return 0; if( !m_fieldnames[index-1].c_str() ) return ""; return (char*)m_fieldnames[index-1].c_str(); } char* getWDBName(){ return (char*)m_wdbname.c_str(); } u16 getFieldType(u32 index){ return m_fieldtypes[index-1]; } u32 getNumFields(){ return m_fields; } void addField(u8 fieldtype, char* name){ m_fieldtypes[m_index] = fieldtype; m_fieldnames[m_index] = name; m_index++; m_fields++; } void setNumFields(u32 nfields){ m_fields = nfields; } void setFieldType(u32 index,u8 fieldtype){ m_fieldtypes[index-1] = fieldtype; } void setFieldName(u32 index,char* name){ m_fieldnames[index-1] = name; } void setWDBName(char* name){ m_wdbname = name; } void setSignature(char* sig){ strcpy(&signature[0],sig); m_index = 0; // HACK: This is terrible, move this... m_fields = 0; // HACK: ughkmsdsdfsd } CWDBDef(u32 fields,char* name){ m_fields = fields; m_wdbname = name; } CWDBDef(){ m_fields = 0; m_index = 0; } ~CWDBDef(){ } }; class CWDBRecord{ wdbfield_t m_fields[MAXFIELDS]; public: wdbfield_t* getField(int index){ return &m_fields[index-1]; } void addField(wdbfield_t field,int index){ m_fields[index-1] = field; } }; class CWDB{ CWDBDef *m_def; char *m_data; u32 m_datasize; vector m_records; bool isLoaded; wdbheader_t m_header; public: bool loadWDB(char* file); wdbfield_t* getField(u32 recindex, u32 fieldindex){ return m_records.at(recindex).getField(fieldindex); } bool toCSV(char* file){ char *file2 = new char[strlen(file)+5]; char buff[2048]; strcpy(file2,file); strcat(file2,".csv"); FILE *pFile = fopen(file2,"w"); if(!pFile) return false; // write headers for(u32 i=1;i<=m_def->getNumFields();i++){ if(!strcmp(m_def->getFieldName(i),"\0")){ fprintf(pFile,"Column %i",i); }else{ fputs(m_def->getFieldName(i),pFile); } fputs(DELIMETER,pFile); } fprintf(pFile,"\n"); // write data for(u32 r=0;rgetNumFields();f++){ if(m_def->getFieldType(f) & wdbfieldtypes.t_uint){ fprintf(pFile,"%u",getField(r,f)->uival); }else if(m_def->getFieldType(f) & t_sint){ fprintf(pFile,"%i",getField(r,f)->sival); }else if(m_def->getFieldType(f) & wdbfieldtypes.t_float){ fprintf(pFile,"%f",getField(r,f)->fval); }else if(m_def->getFieldType(f) & wdbfieldtypes.t_str){ // Add quotes around strings to support line breaks and commas sprintf(buff,"\x22%s\x22",getField(r,f)->pchar); fprintf(pFile,"%s",buff); }else if(m_def->getFieldType(f) & t_bitmask16){ fprintf(pFile,"%s",BM16toString(getField(r,f)->uival)); }else if(m_def->getFieldType(f) & t_bitmask32){ fprintf(pFile,"%s",BM32toString(getField(r,f)->uival)); }else{ // undefined fprintf(pFile,"%u",getField(r,f)->uival); } fputs(DELIMETER,pFile); } fprintf(pFile,"\n"); } fclose(pFile); return true; } void parseWDB() { CWDBRecord tRec; wdbfield_t tField; wdbfield_t recID,recSize; wdbfield_t *pm_data = (wdbfield_t*)m_data; char *pcm_data; u16 *psm_data; u32 sLen; int i; // 0xFFFF is just a random number I chose, simply to avoid infinite loops // which shouldn't happen anyways... for(i=0;i<0xFFFF;i++){ recID = *pm_data; pm_data++; if((u32)((char*)pm_data - m_data) >= m_datasize) break; // break if invalid ID if(recID.uival<1) break; tField.uival = recID.uival; tRec.addField(tField,1); recSize = *pm_data; pm_data++; tField.uival = recSize.uival; // break if the size of the record is less then 4 bytes if(recSize.uival<4) break; tRec.addField(tField,2); for(u32 j=3;j<=m_def->getNumFields();j++){ // if the field is a string, the wdbfield will simply contain a pointer to the string // in the m_data block if(m_def->getFieldType(j) & wdbfieldtypes.t_str){ sLen = strlen((char*)pm_data); tField.pchar = (char*)pm_data; pcm_data = (char*)pm_data; pcm_data += sLen+1; pm_data = (wdbfield_t*)pcm_data; } // special case that occurs in creaturecache.wdb else if(m_def->getFieldType(j) & t_special2byte){ u16 sField; psm_data = (u16*)pm_data; sField = *psm_data; tField.uival = (u32)sField; psm_data++; pm_data = (wdbfield_t*)psm_data; }else{ tField = *pm_data; pm_data++; } tRec.addField(tField,j); } m_records.push_back(tRec); } printf("%i records loaded.\n",i); } void setDef(CWDBDef* def){ m_def = def; } CWDBDef* getDef(){ return m_def; } wdbheader_t getHeader() { return m_header; } }; // globals vector gDefList; bool CWDB::loadWDB(char *file) { ifstream fin(file, ios_base::in | ios_base::binary); bool isMatch = false; if(!fin.is_open()) return false; u32 tlength; fin.read((char*)&m_header,sizeof(wdbheader_t)); // sometimes the number of fields can be deceiving! Did I mention I hate WDB files? if(m_header.fields < ((MAXFIELDS-2)*4) ){ m_header.fields /= 4; m_header.fields += 2; } // Set definition based on signature for(u32 i=0;igetNumFields() != m_header.fields){ printf("WARNING: Number of fields does not match definition,\n"); printf(" Temporarily adjusting fieldsize, this may be an older/newer version.\n\n"); printf("NEW FIELD INFO:\n\tNew fields: %i\n\n",m_header.fields - m_def->getNumFields()); // adjust fieldsize m_def->setNumFields(m_header.fields); } } } } if(!isMatch){ printf("Header does not match any known WDB file.\n"); return false; } fin.seekg(0,ios_base::end); tlength = fin.tellg(); tlength -= sizeof(wdbheader_t); m_data = new char[tlength]; m_datasize = tlength; fin.seekg(sizeof(wdbheader_t)); fin.read(m_data,tlength); fin.close(); return true; } void LoadDefinitions(){ CWDBDef def; // creaturecache.wdb (BOMW) def.setWDBName("creaturecache.wdb"); def.setSignature("BOMW"); // 15 fields def.addField(wdbfieldtypes.t_uint,"CreatureID"); def.addField(wdbfieldtypes.t_uint,"Entry Size"); def.addField(wdbfieldtypes.t_str,"Name 1"); def.addField(wdbfieldtypes.t_str,"Name 2"); def.addField(wdbfieldtypes.t_str,"Name 3"); def.addField(wdbfieldtypes.t_str,"Name 4"); def.addField(wdbfieldtypes.t_str,"Description"); def.addField(wdbfieldtypes.t_uint,""); // unknown def.addField(wdbfieldtypes.t_uint,"TypeID"); def.addField(wdbfieldtypes.t_uint,"FamilyID"); def.addField(wdbfieldtypes.t_uint,"FlagID"); def.addField(t_undefined,""); // unknown def.addField(wdbfieldtypes.t_uint,"SpellDataID"); def.addField(wdbfieldtypes.t_uint,"IconID"); #ifdef _BC def.addField(wdbfieldtypes.t_uint,""); def.addField(wdbfieldtypes.t_uint,""); #endif def.addField(t_special2byte | wdbfieldtypes.t_uint,""); // stupid 2byte field! gDefList.push_back(def); // gameobjectcache.wdb (BOGW) def.setWDBName("gameobjectcache.wdb"); def.setSignature("BOGW"); // 33 fields def.addField(wdbfieldtypes.t_uint,"ObjectID"); def.addField(wdbfieldtypes.t_uint,"Entry Size"); def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_str,"Name 1"); def.addField(wdbfieldtypes.t_str,"Name 2"); def.addField(wdbfieldtypes.t_str,"Name 3"); def.addField(wdbfieldtypes.t_str,"Name 4"); def.addField(wdbfieldtypes.t_str,"Str?"); #ifdef _BC def.addField(wdbfieldtypes.t_str,"Str?"); def.addField(wdbfieldtypes.t_str,"Str?"); #endif def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown def.addField(wdbfieldtypes.t_undefined,""); // unknown gDefList.push_back(def); // itemcache.wdb (BDIW) def.setWDBName("itemcache.wdb"); def.setSignature("BDIW"); #ifdef _BC // 131 fields #else // 130 fields #endif def.addField(wdbfieldtypes.t_uint,"ItemID"); def.addField(wdbfieldtypes.t_uint,"Entry Size"); def.addField(wdbfieldtypes.t_uint,"ItemClassID"); def.addField(wdbfieldtypes.t_uint,"ItemSubClassID"); #ifdef _BC def.addField(t_sint,"Unknown"); #endif def.addField(wdbfieldtypes.t_str,"Name 1"); def.addField(wdbfieldtypes.t_str,"Name 2"); def.addField(wdbfieldtypes.t_str,"Name 3"); def.addField(wdbfieldtypes.t_str,"Name 4"); def.addField(wdbfieldtypes.t_uint,"ItemDisplayID"); def.addField(wdbfieldtypes.t_uint,"Quality"); def.addField(wdbfieldtypes.t_uint,"Type Flags"); def.addField(wdbfieldtypes.t_uint,"Buy Price"); def.addField(wdbfieldtypes.t_uint,"Sell Price"); def.addField(wdbfieldtypes.t_uint,"Inventory Slot"); def.addField(wdbfieldtypes.t_uint,"Class Flags"); def.addField(wdbfieldtypes.t_uint,"Race Flags"); def.addField(wdbfieldtypes.t_uint,"Item Level"); def.addField(wdbfieldtypes.t_uint,"Req Level"); def.addField(wdbfieldtypes.t_uint,"Req Skill"); def.addField(wdbfieldtypes.t_uint,"Req Skill Level"); def.addField(wdbfieldtypes.t_uint,"Req Spell"); def.addField(wdbfieldtypes.t_uint,"Req Rank"); def.addField(wdbfieldtypes.t_uint,"Req Rank2"); def.addField(wdbfieldtypes.t_uint,"Req Faction"); def.addField(wdbfieldtypes.t_uint,"Req Faction LvL"); def.addField(wdbfieldtypes.t_uint,"isUnique"); def.addField(wdbfieldtypes.t_uint,"Stack Amount"); def.addField(wdbfieldtypes.t_uint,"Container Slots"); def.addField(t_sint,"Stat1"); def.addField(wdbfieldtypes.t_uint,"Stat1 Val"); def.addField(t_sint,"Stat2"); def.addField(wdbfieldtypes.t_uint,"Stat2 Val"); def.addField(t_sint,"Stat3"); def.addField(wdbfieldtypes.t_uint,"Stat3 Val"); def.addField(t_sint,"Stat4"); def.addField(wdbfieldtypes.t_uint,"Stat4 Val"); def.addField(t_sint,"Stat5"); def.addField(wdbfieldtypes.t_uint,"Stat5 Val"); def.addField(t_sint,"Stat6"); def.addField(wdbfieldtypes.t_uint,"Stat6 Val"); def.addField(t_sint,"Stat7"); def.addField(wdbfieldtypes.t_uint,"Stat7 Val"); def.addField(t_sint,"Stat8"); def.addField(wdbfieldtypes.t_uint,"Stat8 Val"); def.addField(t_sint,"Stat9"); def.addField(wdbfieldtypes.t_uint,"Stat9 Val"); def.addField(t_sint,"Stat10"); def.addField(wdbfieldtypes.t_uint,"Stat10 Val"); def.addField(wdbfieldtypes.t_float,"Damage1 Min"); def.addField(wdbfieldtypes.t_float,"Damage1 Max"); def.addField(wdbfieldtypes.t_uint ,"Damage1 Type"); def.addField(wdbfieldtypes.t_float,"Damage2 Min"); def.addField(wdbfieldtypes.t_float,"Damage2 Max"); def.addField(wdbfieldtypes.t_uint ,"Damage2 Type"); def.addField(wdbfieldtypes.t_float,"Damage3 Min"); def.addField(wdbfieldtypes.t_float,"Damage3 Max"); def.addField(wdbfieldtypes.t_uint ,"Damage3 Type"); def.addField(wdbfieldtypes.t_float,"Damage4 Min"); def.addField(wdbfieldtypes.t_float,"Damage4 Max"); def.addField(wdbfieldtypes.t_uint ,"Damage4 Type"); def.addField(wdbfieldtypes.t_float,"Damage5 Min"); def.addField(wdbfieldtypes.t_float,"Damage5 Max"); def.addField(wdbfieldtypes.t_uint ,"Damage5 Type"); def.addField(wdbfieldtypes.t_uint,"Physical Resist"); def.addField(wdbfieldtypes.t_uint,"Holy Resist"); def.addField(wdbfieldtypes.t_uint,"Fire Resist"); def.addField(wdbfieldtypes.t_uint,"Nature Resist"); def.addField(wdbfieldtypes.t_uint,"Frost Resist"); def.addField(wdbfieldtypes.t_uint,"Shadow Resist"); def.addField(wdbfieldtypes.t_uint,"Arcane Resist"); def.addField(wdbfieldtypes.t_uint,"Weapon Delay"); def.addField(wdbfieldtypes.t_uint,"Ammo Type"); def.addField(wdbfieldtypes.t_float,"Range Mod"); def.addField(wdbfieldtypes.t_uint,"Spell1 ID"); def.addField(wdbfieldtypes.t_uint,"Spell1 Trigger"); def.addField(wdbfieldtypes.t_uint,"Spell1 Charges"); def.addField(t_sint,"Spell1 Cooldown"); def.addField(wdbfieldtypes.t_uint,"Spell1 Category"); def.addField(t_sint,"Spell1 Category Cooldown"); def.addField(wdbfieldtypes.t_uint,"Spell2 ID"); def.addField(wdbfieldtypes.t_uint,"Spell2 Trigger"); def.addField(wdbfieldtypes.t_uint,"Spell2 Charges"); def.addField(t_sint,"Spell2 Cooldown"); def.addField(wdbfieldtypes.t_uint,"Spell2 Category"); def.addField(t_sint,"Spell2 Category Cooldown"); def.addField(wdbfieldtypes.t_uint,"Spell3 ID"); def.addField(wdbfieldtypes.t_uint,"Spell3 Trigger"); def.addField(wdbfieldtypes.t_uint,"Spell3 Charges"); def.addField(t_sint,"Spell3 Cooldown"); def.addField(wdbfieldtypes.t_uint,"Spell3 Category"); def.addField(t_sint,"Spell3 Category Cooldown"); def.addField(wdbfieldtypes.t_uint,"Spell4 ID"); def.addField(wdbfieldtypes.t_uint,"Spell4 Trigger"); def.addField(wdbfieldtypes.t_uint,"Spell4 Charges"); def.addField(t_sint,"Spell4 Cooldown"); def.addField(wdbfieldtypes.t_uint,"Spell4 Category"); def.addField(t_sint,"Spell4 Category Cooldown"); def.addField(wdbfieldtypes.t_uint,"Spell5 ID"); def.addField(wdbfieldtypes.t_uint,"Spell5 Trigger"); def.addField(wdbfieldtypes.t_uint,"Spell5 Charges"); def.addField(t_sint,"Spell5 Cooldown"); def.addField(wdbfieldtypes.t_uint,"Spell5 Category"); def.addField(t_sint,"Spell5 Category Cooldown"); def.addField(wdbfieldtypes.t_uint,"BondID"); def.addField(wdbfieldtypes.t_str,"Description"); def.addField(wdbfieldtypes.t_uint,"BookTextID"); def.addField(wdbfieldtypes.t_uint,"Book Pages"); def.addField(wdbfieldtypes.t_uint,"BookStationaryID"); def.addField(wdbfieldtypes.t_uint,"BeginQuestID"); def.addField(wdbfieldtypes.t_uint,"reqLockPickSkill"); def.addField(t_sint,"Material"); def.addField(wdbfieldtypes.t_uint,"SheathID"); def.addField(wdbfieldtypes.t_uint,"RandomPropertyID"); #ifdef _BC def.addField(wdbfieldtypes.t_uint,"Unknown"); #endif def.addField(wdbfieldtypes.t_uint,"Block Value"); def.addField(wdbfieldtypes.t_uint,"ItemSetID"); def.addField(wdbfieldtypes.t_uint,"Durability"); def.addField(wdbfieldtypes.t_uint,"ItemAreaID"); def.addField(wdbfieldtypes.t_uint,"ItemMapID"); def.addField(wdbfieldtypes.t_uint,"Bag Family"); def.addField(wdbfieldtypes.t_uint,"Totem Category"); def.addField(wdbfieldtypes.t_uint,"Socket Color 1"); def.addField(wdbfieldtypes.t_uint,"Unknown"); def.addField(wdbfieldtypes.t_uint,"Socket Color 2"); def.addField(wdbfieldtypes.t_uint,"Unknown"); def.addField(wdbfieldtypes.t_uint,"Socket Color 3"); def.addField(wdbfieldtypes.t_uint,"Unknown"); def.addField(wdbfieldtypes.t_uint,"SpellItemEnchantment"); def.addField(wdbfieldtypes.t_uint,"Gem Properties"); def.addField(wdbfieldtypes.t_uint,"Honor cost"); def.addField(wdbfieldtypes.t_uint,"Unknown"); gDefList.push_back(def); // itemnamecache.wdb (BDNW) def.setWDBName("itemnamecache.wdb"); def.setSignature("BDNW"); // 3 fields def.addField(wdbfieldtypes.t_uint,"ItemID"); def.addField(wdbfieldtypes.t_uint,"Entry Size"); def.addField(wdbfieldtypes.t_str,"Item Name"); gDefList.push_back(def); // itemtextcache.wdb (XTIW) def.setWDBName("itemnamecache.wdb"); def.setSignature("XTIW"); // 3 fields def.addField(wdbfieldtypes.t_uint,"EntryID"); def.addField(wdbfieldtypes.t_uint,"Entry Size"); def.addField(wdbfieldtypes.t_str,"Text"); gDefList.push_back(def); // npccache.wdb (CPNW) def.setWDBName("npccache.wdb"); def.setSignature("CPNW"); // 82 fields def.addField(wdbfieldtypes.t_uint,"EntryID"); def.addField(wdbfieldtypes.t_uint,"Entry Size"); for(int i=3;i<=73;i+=10){ def.addField(wdbfieldtypes.t_float,""); def.addField(wdbfieldtypes.t_str,""); def.addField(wdbfieldtypes.t_str,""); def.addField(wdbfieldtypes.t_uint,""); def.addField(wdbfieldtypes.t_uint,""); def.addField(wdbfieldtypes.t_uint,""); def.addField(wdbfieldtypes.t_uint,""); def.addField(wdbfieldtypes.t_uint,""); def.addField(wdbfieldtypes.t_uint,""); def.addField(wdbfieldtypes.t_uint,""); } // unknowns gDefList.push_back(def); // pagetextcache.wdb (XTPW) def.setWDBName("pagetextcache.wdb"); def.setSignature("XTPW"); // 4 fields def.addField(wdbfieldtypes.t_uint,"ItemID"); def.addField(wdbfieldtypes.t_uint,"Entry Size"); def.addField(wdbfieldtypes.t_str,"Page Text"); def.addField(wdbfieldtypes.t_uint,"NextPageID"); gDefList.push_back(def); // questcache.wdb (TSQW) def.setWDBName("questcache.wdb"); def.setSignature("TSQW"); // 66 fields // 67 BC fields def.addField(wdbfieldtypes.t_uint,"QuestID"); def.addField(wdbfieldtypes.t_uint,"Entry Size"); def.addField(wdbfieldtypes.t_uint,"QuestID2"); def.addField(wdbfieldtypes.t_uint,""); def.addField(wdbfieldtypes.t_uint,"Level"); def.addField(wdbfieldtypes.t_uint,"AreaID"); def.addField(wdbfieldtypes.t_uint,"InfoID"); def.addField(wdbfieldtypes.t_undefined,""); def.addField(wdbfieldtypes.t_undefined,""); def.addField(wdbfieldtypes.t_undefined,""); def.addField(wdbfieldtypes.t_undefined,""); #ifdef _BC def.addField(wdbfieldtypes.t_undefined,""); #endif def.addField(wdbfieldtypes.t_uint,"NextQuestID"); def.addField(t_sint,"CoinReward"); def.addField(t_uint,"CoinRewardOnExp"); def.addField(t_uint,"SpellReward"); def.addField(wdbfieldtypes.t_undefined,""); def.addField(t_uint,"StartItemID"); def.addField(t_uint,"QuestFlags"); def.addField(t_uint,"ItemReward1"); def.addField(t_uint,"ItemAmount1"); def.addField(t_uint,"ItemReward2"); def.addField(t_uint,"ItemAmount2"); def.addField(t_uint,"ItemReward3"); def.addField(t_uint,"ItemAmount3"); def.addField(t_uint,"ItemReward4"); def.addField(t_uint,"ItemAmount4"); def.addField(t_uint,"ItemChoice1"); def.addField(t_uint,"ItemChoiceAmount1"); def.addField(t_uint,"ItemChoice2"); def.addField(t_uint,"ItemChoiceAmount2"); def.addField(t_uint,"ItemChoice3"); def.addField(t_uint,"ItemChoiceAmount3"); def.addField(t_uint,"ItemChoice4"); def.addField(t_uint,"ItemChoiceAmount4"); def.addField(t_uint,"ItemChoice5"); def.addField(t_uint,"ItemChoiceAmount5"); def.addField(t_uint,"ItemChoice6"); def.addField(t_uint,"ItemChoiceAmount6"); def.addField(wdbfieldtypes.t_undefined,""); def.addField(wdbfieldtypes.t_undefined,""); def.addField(wdbfieldtypes.t_undefined,""); def.addField(wdbfieldtypes.t_undefined,""); def.addField(wdbfieldtypes.t_str,"Name"); def.addField(wdbfieldtypes.t_str,"Description"); def.addField(wdbfieldtypes.t_str,"Details"); def.addField(wdbfieldtypes.t_str,"Subdescription"); def.addField(t_uint,"KillCreature1"); def.addField(t_uint,"KillCreature1Amount"); def.addField(t_uint,"CollectItem1"); def.addField(t_uint,"CollectItem1Amount"); def.addField(t_uint,"KillCreature2"); def.addField(t_uint,"KillCreature2Amount"); def.addField(t_uint,"CollectItem2"); def.addField(t_uint,"CollectItem2Amount"); def.addField(t_uint,"KillCreature3"); def.addField(t_uint,"KillCreature3Amount"); def.addField(t_uint,"CollectItem3"); def.addField(t_uint,"CollectItem3Amount"); def.addField(t_uint,"KillCreature4"); def.addField(t_uint,"KillCreature4Amount"); def.addField(t_uint,"CollectItem4"); def.addField(t_uint,"CollectItem4Amount"); def.addField(wdbfieldtypes.t_str,"Objective1"); def.addField(wdbfieldtypes.t_str,"Objective2"); def.addField(wdbfieldtypes.t_str,"Objective3"); def.addField(wdbfieldtypes.t_str,"Objective4"); gDefList.push_back(def); // wowcache.wdb (NDRW) def.setWDBName("wowcache.wdb"); def.setSignature("NDRW"); // 4 fields def.addField(wdbfieldtypes.t_undefined,""); def.addField(wdbfieldtypes.t_undefined,""); def.addField(wdbfieldtypes.t_undefined,""); def.addField(wdbfieldtypes.t_undefined,""); gDefList.push_back(def); } void doexit(){ gDefList.empty(); //printf("\nPress any key to exit."); //char trash = getch(); } int main(int argc, char* argv[]) { printf("** WDB to CSV**\nby: Jb55\nWebsite: http://www.jb55.com\nContact: jackbox55@gmail.com\n\n"); if(argc<2){ printf("usage: wdbtocsv.exe (drag the wdb onto this file)\n"); doexit(); return 0; } CWDB wdb; LoadDefinitions(); #ifdef _SPEED _timeb starttime; _timeb endtime; unsigned short diff; _ftime( &starttime ); #endif if(!wdb.loadWDB(argv[1])) { doexit(); printf("There was an error loading the WDB.\n"); return 0; } wdb.parseWDB(); if(!wdb.toCSV(argv[1])) { doexit(); printf("There was an error creating the CSV file.\n"); return 0; } #ifdef _SPEED _ftime( &endtime ); diff = endtime.millitm - starttime.millitm; printf("Time elapsed parsing and building csv (milliseconds): %i\n",diff); #endif doexit(); return 0; }