z_mirror/fmm

git clone https://git.raiguard.me/z_mirror/fmm

Caleb HeuerRename manager module to lib, move save file parsing to lib5240ba3

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