diff --git a/d2common/d2fileformats/d2font/d2fontglyph/font_glyph.go b/d2common/d2fileformats/d2font/d2fontglyph/font_glyph.go index 11eda03e..c98d3d2f 100644 --- a/d2common/d2fileformats/d2font/d2fontglyph/font_glyph.go +++ b/d2common/d2fileformats/d2font/d2fontglyph/font_glyph.go @@ -6,12 +6,9 @@ func Create(frame, width, height int) *FontGlyph { // nolint:gomnd // thes bytes are constant // comes from https://d2mods.info/forum/viewtopic.php?t=42044 result := &FontGlyph{ - unknown1: []byte{0}, - unknown2: []byte{1, 0, 0}, - unknown3: []byte{0, 0, 0, 0}, - frame: frame, - width: width, - height: height, + frame: frame, + width: width, + height: height, } return result @@ -19,12 +16,9 @@ func Create(frame, width, height int) *FontGlyph { // FontGlyph represents a single font glyph type FontGlyph struct { - unknown1 []byte - unknown2 []byte - unknown3 []byte - frame int - width int - height int + frame int + width int + height int } // SetSize sets glyph's size to w, h @@ -59,15 +53,15 @@ func (fg *FontGlyph) FrameIndex() int { // Unknown1 returns unknowns bytes func (fg *FontGlyph) Unknown1() []byte { - return fg.unknown1 + return []byte{0} } // Unknown2 returns unknowns bytes func (fg *FontGlyph) Unknown2() []byte { - return fg.unknown2 + return []byte{1, 0, 0} } // Unknown3 returns unknowns bytes func (fg *FontGlyph) Unknown3() []byte { - return fg.unknown3 + return []byte{0, 0, 0, 0} } diff --git a/d2common/d2fileformats/d2font/font.go b/d2common/d2fileformats/d2font/font.go index 7ffd6032..84b1a5c1 100644 --- a/d2common/d2fileformats/d2font/font.go +++ b/d2common/d2fileformats/d2font/font.go @@ -27,11 +27,10 @@ const ( // Font represents a displayable font type Font struct { - unknownHeaderBytes []byte - sheet d2interface.Animation - table []byte - Glyphs map[rune]*d2fontglyph.FontGlyph - color color.Color + sheet d2interface.Animation + table []byte + Glyphs map[rune]*d2fontglyph.FontGlyph + color color.Color } // Load loads a new font from byte slice @@ -52,10 +51,7 @@ func Load(data []byte) (*Font, error) { color: color.White, } - font.unknownHeaderBytes, err = sr.ReadBytes(unknownHeaderBytesCount) - if err != nil { - return nil, err - } + sr.SkipBytes(unknownHeaderBytesCount) err = font.initGlyphs(sr) if err != nil { @@ -149,10 +145,11 @@ func (f *Font) RenderText(text string, target d2interface.Surface) error { func (f *Font) initGlyphs(sr *d2datautils.StreamReader) error { glyphs := make(map[rune]*d2fontglyph.FontGlyph) - for i := numHeaderBytes; i < len(f.table); i += bytesPerGlyph { + // for i := numHeaderBytes; i < len(f.table); i += bytesPerGlyph { + for i := numHeaderBytes; true; i += bytesPerGlyph { code, err := sr.ReadUInt16() if err != nil { - return err + break } // byte of 0 @@ -194,7 +191,13 @@ func (f *Font) Marshal() []byte { sw := d2datautils.CreateStreamWriter() sw.PushBytes([]byte("Woo!\x01")...) - sw.PushBytes(f.unknownHeaderBytes...) + + // unknown header bytes - constant + sw.PushBytes([]byte{1, 0, 0, 0, 0, 1}...) + + // Expected Height of character cell and Expected Width of character cell + // not used in decoder + sw.PushBytes([]byte{0, 0}...) for c, i := range f.Glyphs { sw.PushUint16(uint16(c))