All pastes #626062 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-07-19 11:19 UTC
rendered paste body
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