z_mirror/fmm
git clone https://git.raiguard.me/z_mirror/fmm
5240ba3
updating
1package fmm 2 3import ( 4"bytes" 5"encoding/binary" 6"io" 7) 8 9type DatReader struct { 10reader * bytes.Reader 11} 12 13func newDatReader (source []byte )DatReader { 14return DatReader { 15reader :bytes .NewReader (source ), 16 } 17} 18 19func (d * DatReader )Advance (offset int64 ) { 20d .reader .Seek (offset ,io .SeekCurrent ) 21} 22 23func (d * DatReader )ReadBool ()bool { 24num ,_ := d .reader .ReadByte () 25return num == 1 26} 27 28func (d * DatReader )ReadModWithCRC ()ModIdent { 29name := d .ReadString () 30version := d .ReadOptimizedVersion (false ) 31d .ReadUint32 ()// CRC 32return ModIdent {name ,& version } 33} 34 35func (d * DatReader )ReadString ()string { 36length ,_ := d .reader .ReadByte () 37stringBuf := make ([]byte ,length ) 38io .ReadFull (d .reader ,stringBuf ) 39return string (stringBuf ) 40} 41 42func (d * DatReader )ReadUint8 ()uint8 { 43byte ,_ := d .reader .ReadByte () 44return uint8 (byte ) 45} 46 47func (d * DatReader )ReadUint16 ()uint16 { 48buf := make ([]byte ,2 ) 49io .ReadFull (d .reader ,buf ) 50return binary .LittleEndian .Uint16 (buf ) 51} 52 53func (d * DatReader )ReadUint32 ()uint32 { 54buf := make ([]byte ,4 ) 55io .ReadFull (d .reader ,buf ) 56return binary .LittleEndian .Uint32 (buf ) 57} 58 59func (d * DatReader )ReadUint16Optimized ()uint16 { 60first ,_ := d .reader .ReadByte () 61if first < 255 { 62return uint16 (first ) 63 } 64return d .ReadUint16 () 65} 66 67func (d * DatReader )ReadOptimizedVersion (withBuild bool )Version { 68ver := Version { 69d .ReadUint16Optimized (), 70d .ReadUint16Optimized (), 71d .ReadUint16Optimized (), 72 } 73if withBuild { 74ver [3 ]= d .ReadUint16Optimized () 75 } 76return ver 77} 78 79func (d * DatReader )ReadUnoptimizedVersion ()Version { 80return Version { 81d .ReadUint16 (), 82d .ReadUint16 (), 83d .ReadUint16 (), 84d .ReadUint16 (), 85 } 86}