Imports System.Runtime.InteropServices
Public Class GlobalMembers
Public Shared Function BM16toString(ByVal val As UInt32) As String
Dim str(16) As String
For i As Integer = 0 To 15
If val And (1 << (15 - i)) Then
str(i) = "1"c
Else
str(i) = "0"c
End If
Next i
str(16) = &H0
Return str.ToString
End Function
Public Shared Function BM32toString(ByVal val As UInt32) As String
Dim str(32) As String
For i As Integer = 0 To 31
If val And (1 << (31 - i)) Then
str(i) = "1"c
Else
str(i) = "0"c
End If
Next i
str(32) = &H0
Return str.ToString
End Function
End Class
Public Class wdbheader_t
Public signature As Byte()
Public ver As UInt32
Public lang As Byte()
Public fields As UInt32
Public unknown2 As UInt32
End Class
<StructLayout(LayoutKind.Explicit)> _
Public Structure wdbfield_t
<FieldOffset(0)> _
Public uival As UInt32
<FieldOffset(0)> _
Public sival As UInt32
<FieldOffset(0)> _
Public fval As Single
<FieldOffset(0)> _
Public pchar As String
End Structure
Public 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
End Enum
' defines
#Const MAXFIELDS = True
#Const DELIMETER = True
Friend NotInheritable Class DefineConstants
Public Const MAXFIELDS As Integer = 256
Public Const DELIMETER As String = ","
End Class
Public Class CWDBDef
Private m_fieldtypes As UInt16() = New UInt16(DefineConstants.MAXFIELDS - 1) {}
Private m_fields As UInt32
Private m_index As UInt16
Private isReadable As Boolean
Private signature(4) As Char
Private m_fieldnames As String() = New String(DefineConstants.MAXFIELDS - 1) {}
Private m_wdbname As String
Public Function getSignature() As String
Return signature(0)
End Function
Public Function getFieldName(ByVal index As UInt32) As String
If index > m_fields Then
Return 0
End If
If (Not m_fieldnames(index - 1).ToString()) Then
Return ""
End If
Return CType(m_fieldnames(index - 1).ToString(), SByte)
End Function
Public Function getWDBName() As String
Return CType(m_wdbname.ToString(), SByte)
End Function
Public Function getFieldType(ByVal index As UInt32) As UInt16
Return m_fieldtypes(index - 1)
End Function
Public Function getNumFields() As UInt32
Return m_fields
End Function
Public Sub addField(ByVal fieldtype As Integer, ByRef name As String)
m_fieldtypes(m_index) = fieldtype
m_fieldnames(m_index) = name
m_index += 1
m_fields += 1
End Sub
Public Sub setNumFields(ByVal nfields As UInt32)
m_fields = nfields
End Sub
Public Sub setFieldType(ByVal index As UInt32, ByVal fieldtype As Integer)
m_fieldtypes(index - 1) = fieldtype
End Sub
Public Sub setFieldName(ByVal index As UInt32, ByRef name As String)
m_fieldnames(index - 1) = name
End Sub
Public Sub setWDBName(ByRef name As String)
m_wdbname = name
End Sub
Public Sub setSignature(ByRef sig As String)
signature(0) = sig
m_index = 0
m_fields = 0
End Sub
Public Sub New(ByVal fields As UInt32, ByRef name As String)
m_fields = fields
m_wdbname = name
End Sub
Public Sub New()
m_fields = 0
m_index = 0
End Sub
Protected Overrides Sub Finalize()
End Sub
End Class
Public Class CWDBRecord
Private m_fields As wdbfield_t() = New wdbfield_t(DefineConstants.MAXFIELDS - 1) {}
Public Function getField(ByVal index As Integer) As wdbfield_t
Return m_fields(index - 1)
End Function
Public Sub addField(ByVal field As wdbfield_t, ByVal index As Integer)
m_fields(index - 1) = field
End Sub
End Class
Public Class CWDB
Private m_def As CWDBDef
Private m_data As String
Private m_datasize As UInt32
' Private m_records As vector(Of CWDBRecord)
Private isLoaded As Boolean
Private m_header As wdbheader_t
' Boolean loadWDB(SByte* file)
Public Function getField(ByVal recindex As UInt32, ByVal fieldindex As UInt32) As wdbfield_t
Return m_records.at(recindex).getField(fieldindex)
End Function
Public Function toCSV(ByRef file As String) As Boolean
Dim file2 As String '= New String(file.Length + 5 - 1) {}
Dim buff As String
file2 = file
file2 = file2 & ".csv"
Dim pFile As FileIO.FileSystem = fopen(file2, "w")
If (Not pFile) Then
Return False
End If
' write headers
For i As UInt32 = 1 To m_def.getNumFields()
If (Not String.Compare(m_def.getFieldName(i), Constants.vbNullChar)) Then
fprintf(pFile, "Column %i", i)
Else
fputs(m_def.getFieldName(i), pFile)
End If
fputs(DefineConstants.DELIMETER, pFile)
Next i
fprintf(pFile, Constants.vbLf)
' write data
For r As UInt32 = 0 To m_records.size() - 1
For f As UInt32 = 1 To m_def.getNumFields()
If m_def.getFieldType(f) And wdbfieldtypes.t_uint Then
fprintf(pFile, "%u", getField(r, f).uival)
ElseIf m_def.getFieldType(f) And wdbfieldtypes.t_sint Then
fprintf(pFile, "%i", getField(r, f).sival)
ElseIf m_def.getFieldType(f) And t_float Then
fprintf(pFile, "%f", getField(r, f).fval)
ElseIf m_def.getFieldType(f) And wdbfieldtypes.t_str Then
' Add quotes around strings to support line breaks and commas
sprintf(buff, ChrW(&H22).ToString() & "%s" & ChrW(&H22).ToString(), getField(r, f).pchar)
fprintf(pFile, "%s", buff)
ElseIf m_def.getFieldType(f) And t_bitmask16 Then
fprintf(pFile, "%s", GlobalMembers.BM16toString(getField(r, f).uival))
ElseIf m_def.getFieldType(f) And t_bitmask32 Then
fprintf(pFile, "%s", GlobalMembers.BM32toString(getField(r, f).uival)) ' undefined
Else
fprintf(pFile, "%u", getField(r, f).uival)
End If
fputs(DefineConstants.DELIMETER, pFile)
Next f
fprintf(pFile, Constants.vbLf)
Next r
fclose(pFile)
Return True
End Function
Private Sub parseWDB()
Dim tRec As CWDBRecord
Dim tField As wdbfield_t
Dim recID As wdbfield_t
Dim recSize As wdbfield_t
Dim pm_data As wdbfield_t = CType(m_data, wdbfield_t)
Dim pcm_data As SByte
Dim psm_data As UInt16
Dim sLen As UInt32
Dim i As Integer
i = 0
Do While i < &HFFFF
recID = pm_data
pm_data = pm_data + 1
If CType(CType(pm_data, SByte) - m_data, UInt32) >= m_datasize Then
Exit Do
End If
' break if invalid ID
If recID.uival < 1 Then
Exit Do
End If
tField.uival = recID.uival
tRec.addField(tField, 1)
recSize = pm_data
' pm_data += 1
tField.uival = recSize.uival
' break if the size of the record is less then 4 bytes
If recSize.uival < 4 Then
Exit Do
End If
tRec.addField(tField, 2)
For j As UInt32 = 3 To m_def.getNumFields()
' 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) And wdbfieldtypes.t_str Then
sLen = Convert.ToString(CType(pm_data.pchar, SByte)).Length
tField.pchar = CType(pm_data.fval, SByte)
pcm_data = CType(pm_data.pchar, SByte)
pcm_data += sLen + 1
pm_data = CType(pcm_data, wdbfield_t)
' special case that occurs in creaturecache.wdb
ElseIf m_def.getFieldType(j) And wdbfieldtypes.t_special2byte Then
Dim sField As UInt16
psm_data = CType(pm_data.fval, UInt16)
sField = psm_data
tField.uival = CType(sField, UInt32)
psm_data += 1
pm_data = CType(psm_data, wdbfield_t)
Else
tField = pm_data
pm_data += 1
End If
tRec.addField(tField, j)
Next j
m_records.push_back(tRec)
i += 1
Loop
Console.Write("{0:D} records loaded." & Constants.vbLf, i)
End Sub
Private Sub setDef(ByRef def As CWDBDef)
m_def = def
End Sub
Private Function getDef() As CWDBDef
Return m_def
End Function
Private Function getHeader() As wdbheader_t
Return m_header
End Function
' globals
Private gDefList As CWDBDef
Private Function loadWDB(ByRef file As String) As Boolean
Dim wdb As New wdbheader_t
Dim fin As New System.IO.FileStream(file, IO.FileMode.OpenOrCreate)
Dim isMatch As Boolean = False
If (Not fin.CanRead) Then
Return False
End If
redim wdb.lang(4) as byte
Dim tlength As UInt32
Dim buffer(fin.Length) As Byte
fin.Read(buffer, 0, fin.Length)
' sometimes the number of fields can be deceiving! Did I mention I hate WDB files?
If m_header.fields < ((DefineConstants.MAXFIELDS - 2) * 4) Then
m_header.fields /= 4
m_header.fields += 2
End If
' Set definition based on signature
For i As UInt32 = 0 To gDefList.getSignature - 1
If (Not StrComp(m_header.signature, gDefList.getSignature(i), 4)) Then
isMatch = True
Console.Write("Signature matches {0}" & Constants.vbLf, gDefList.at(i).getWDBName())
m_def = gDefList.at(i)
' if fieldsize is incorrect, adjust accordingly
If m_header.fields < ((DefineConstants.MAXFIELDS - 2) * 4) Then
If m_def.getNumFields() <> m_header.fields Then
Console.Write("WARNING: Number of fields does not match definition," & Constants.vbLf)
Console.Write(" Temporarily adjusting fieldsize, this may be an older/newer version." & Constants.vbLf + Constants.vbLf)
Console.Write("NEW FIELD INFO:" & Constants.vbLf + Constants.vbTab & "New fields: {0:D}" & Constants.vbLf + Constants.vbLf, m_header.fields - m_def.getNumFields())
' adjust fieldsize
m_def.setNumFields(m_header.fields)
End If
End If
End If
Next i
If (Not isMatch) Then
Console.Write("Header does not match any known WDB file." & Constants.vbLf)
Return False
End If
fin.Seek(0, IO.SeekOrigin.End)
tlength = fin.Length
tlength -= sizeof(wdbheader_t)
m_data = New SByte(tlength - 1) {}
m_datasize = tlength
fin.seekg(sizeof(wdbheader_t))
fin.Read(m_data, 0, tlength)
fin.Close()
Return True
End Function
Private Sub LoadDefinitions()
Dim def As CWDBDef
' 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(wdbfieldtypes.t_undefined, "") ' unknown
def.addField(wdbfieldtypes.t_uint, "SpellDataID")
def.addField(wdbfieldtypes.t_uint, "IconID")
#If _BC Then
def.addField(wdbfieldtypes.t_uint,"")
def.addField(wdbfieldtypes.t_uint,"")
#End If
def.addField(wdbfieldtypes.t_special2byte Or 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?")
#If _BC Then
def.addField(wdbfieldtypes.t_str,"Str?")
def.addField(wdbfieldtypes.t_str,"Str?")
#End If
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")
#If _BC Then
' 131 fields
#Else
' 130 fields
#End If
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")
#If _BC Then
def.addField(wdbfieldtypes.t_sint,"Unknown")
#End If
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(wdbfieldtypes.t_sint, "Stat1")
def.addField(wdbfieldtypes.t_uint, "Stat1 Val")
def.addField(wdbfieldtypes.t_sint, "Stat2")
def.addField(wdbfieldtypes.t_uint, "Stat2 Val")
def.addField(wdbfieldtypes.t_sint, "Stat3")
def.addField(wdbfieldtypes.t_uint, "Stat3 Val")
def.addField(wdbfieldtypes.t_sint, "Stat4")
def.addField(wdbfieldtypes.t_uint, "Stat4 Val")
def.addField(wdbfieldtypes.t_sint, "Stat5")
def.addField(wdbfieldtypes.t_uint, "Stat5 Val")
def.addField(wdbfieldtypes.t_sint, "Stat6")
def.addField(wdbfieldtypes.t_uint, "Stat6 Val")
def.addField(wdbfieldtypes.t_sint, "Stat7")
def.addField(wdbfieldtypes.t_uint, "Stat7 Val")
def.addField(wdbfieldtypes.t_sint, "Stat8")
def.addField(wdbfieldtypes.t_uint, "Stat8 Val")
def.addField(wdbfieldtypes.t_sint, "Stat9")
def.addField(wdbfieldtypes.t_uint, "Stat9 Val")
def.addField(wdbfieldtypes.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(wdbfieldtypes.t_sint, "Spell1 Cooldown")
def.addField(wdbfieldtypes.t_uint, "Spell1 Category")
def.addField(wdbfieldtypes.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(wdbfieldtypes.t_sint, "Spell2 Cooldown")
def.addField(wdbfieldtypes.t_uint, "Spell2 Category")
def.addField(wdbfieldtypes.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(wdbfieldtypes.t_sint, "Spell3 Cooldown")
def.addField(wdbfieldtypes.t_uint, "Spell3 Category")
def.addField(wdbfieldtypes.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(wdbfieldtypes.t_sint, "Spell4 Cooldown")
def.addField(wdbfieldtypes.t_uint, "Spell4 Category")
def.addField(wdbfieldtypes.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(wdbfieldtypes.t_sint, "Spell5 Cooldown")
def.addField(wdbfieldtypes.t_uint, "Spell5 Category")
def.addField(wdbfieldtypes.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(wdbfieldtypes.t_sint, "Material")
def.addField(wdbfieldtypes.t_uint, "SheathID")
def.addField(wdbfieldtypes.t_uint, "RandomPropertyID")
#If _BC Then
def.addField(wdbfieldtypes.t_uint,"Unknown")
#End If
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 i As Integer = 3 To 73 Step 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, "")
Next i ' 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, "")
#If _BC Then
def.addField(t_undefined,"")
#End If
def.addField(wdbfieldtypes.t_uint, "NextQuestID")
def.addField(wdbfieldtypes.t_sint, "CoinReward")
def.addField(wdbfieldtypes.t_uint, "CoinRewardOnExp")
def.addField(wdbfieldtypes.t_uint, "SpellReward")
def.addField(wdbfieldtypes.t_undefined, "")
def.addField(wdbfieldtypes.t_uint, "StartItemID")
def.addField(wdbfieldtypes.t_uint, "QuestFlags")
def.addField(wdbfieldtypes.t_uint, "ItemReward1")
def.addField(wdbfieldtypes.t_uint, "ItemAmount1")
def.addField(wdbfieldtypes.t_uint, "ItemReward2")
def.addField(wdbfieldtypes.t_uint, "ItemAmount2")
def.addField(wdbfieldtypes.t_uint, "ItemReward3")
def.addField(wdbfieldtypes.t_uint, "ItemAmount3")
def.addField(wdbfieldtypes.t_uint, "ItemReward4")
def.addField(wdbfieldtypes.t_uint, "ItemAmount4")
def.addField(wdbfieldtypes.t_uint, "ItemChoice1")
def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount1")
def.addField(wdbfieldtypes.t_uint, "ItemChoice2")
def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount2")
def.addField(wdbfieldtypes.t_uint, "ItemChoice3")
def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount3")
def.addField(wdbfieldtypes.t_uint, "ItemChoice4")
def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount4")
def.addField(wdbfieldtypes.t_uint, "ItemChoice5")
def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount5")
def.addField(wdbfieldtypes.t_uint, "ItemChoice6")
def.addField(wdbfieldtypes.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(wdbfieldtypes.t_uint, "KillCreature1")
def.addField(wdbfieldtypes.t_uint, "KillCreature1Amount")
def.addField(wdbfieldtypes.t_uint, "CollectItem1")
def.addField(wdbfieldtypes.t_uint, "CollectItem1Amount")
def.addField(wdbfieldtypes.t_uint, "KillCreature2")
def.addField(wdbfieldtypes.t_uint, "KillCreature2Amount")
def.addField(wdbfieldtypes.t_uint, "CollectItem2")
def.addField(wdbfieldtypes.t_uint, "CollectItem2Amount")
def.addField(wdbfieldtypes.t_uint, "KillCreature3")
def.addField(wdbfieldtypes.t_uint, "KillCreature3Amount")
def.addField(wdbfieldtypes.t_uint, "CollectItem3")
def.addField(wdbfieldtypes.t_uint, "CollectItem3Amount")
def.addField(wdbfieldtypes.t_uint, "KillCreature4")
def.addField(wdbfieldtypes.t_uint, "KillCreature4Amount")
def.addField(wdbfieldtypes.t_uint, "CollectItem4")
def.addField(wdbfieldtypes.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)
End Sub
Private Sub doexit()
gDefList.empty()
'printf("\nPress any key to exit.");
'char trash = getch();
End Sub
Friend Function main(ByVal argc As Integer, ByRef argv As String()) As Integer
Console.Write("** WDB to CSV**" & Constants.vbLf & "by: Jb55" & Constants.vbLf & "Website: http://www.jb55.com" & Constants.vbLf & "Contact: jackbox55@gmail.com" & Constants.vbLf + Constants.vbLf)
If argc < 2 Then
Console.Write("usage: wdbtocsv.exe <file.wdb> (drag the wdb onto this file)" & Constants.vbLf)
doexit()
Return 0
End If
LoadDefinitions()
#If _SPEED Then
Dim starttime As _timeb
Dim endtime As _timeb
Dim diff As UShort
_ftime(starttime)
#End If
If (Not loadWDB(argv(1))) Then
doexit()
Console.Write("There was an error loading the WDB." & Constants.vbLf)
Return 0
End If
parseWDB()
If (Not toCSV(argv(1))) Then
doexit()
Console.Write("There was an error creating the CSV file." & Constants.vbLf)
Return 0
End If
#If _SPEED Then
_ftime(endtime)
diff = endtime.millitm - starttime.millitm
Console.Write("Time elapsed parsing and building csv (milliseconds): {0:D}" & Constants.vbLf,diff)
#End If
doexit()
Return 0
End Function
End Class