# Packet Definition Parser Fast XML-like parser for binary packet structures with versioning and conditional fields. ## Basic Syntax ```xml ``` ## Field Types | Type | Size | Description | |------|------|-------------| | `i8`, `i16`, `i32`, `i64` | 1-8 bytes | Unsigned integers | | `si8`, `si16`, `si32`, `si64` | 1-8 bytes | Signed integers | | `f32`, `f64` | 4-8 bytes | Floating point | | `str8`, `str16`, `str32` | Variable | Length-prefixed strings | | `char` | Fixed | Fixed-size byte array | | `color` | 3 bytes | RGB color (r,g,b) | | `equip` | 8 bytes | Equipment item | | `array` | Variable | Array of substructures | ## Multiple Field Names ```xml ``` ## Conditional Fields ```xml ``` ### Condition Types - `flag:name` - Flag is set - `!flag:name` - Flag not set - `var:name` - Variable exists - `!var:name` - Variable doesn't exist - `field>=value` - Comparison operators: `>=`, `<=`, `>`, `<`, `==`, `!=` - `field&0x01` - Bitwise AND ## Arrays ```xml ``` ## Reusable Substructs ```xml ``` ## Field Attributes - `name="field1,field2"` - Field name(s) - `if="condition"` - Conditional parsing - `size="10"` - Fixed array size for `char` type - `count="var:name"` - Array size variable - `substruct="Name"` - Reference to substruct ## Multiple Versions ```xml ``` ## Comments ```xml ``` ## Usage ```go import "eq2emu/internal/parser" // Parse PML content packets, err := parser.Parse(pmlContent) if err != nil { log.Fatal(err) } // Get packet definition packet := packets["PacketName"] // Parse binary data result, err := packet.Parse(data, version, flags) ```