Make sure to use unsigned types in TntWriter
Extract save logic from CoreModel to new MapSaver class
Add overloads to TntReader constructor
Add constructor overloads to SctReader
Convert GenerateMinimap to static method
Remove baseMap field from CoreModel
Replace explicit namespaces with using directive
Move GenerateMinimap() to Util class
Use ordinal string comparison in TdfParser
Convert recursion in TdfReader.ReadNextLine() to loop
Extract TdfNode building logic from TdfParser into an adapter
Rename TdfParser.ReadNextLine to clarify its function
Extract line reading logic from TdfParser.ReadNextInterestingLine
Extract cleanup code from TdfParser.ReadNextInterestingLine
Extract duplicate block reading code in TdfParser
Rename method and tweak code in TdfParser
Handle too long and too short compressed GAF rows

At least one GAF in the wild has been seen with too long compressed rows.
e.g. TAK_Anims -> VeruTree -> VeruTree06,
row 44-45ish decompresses to 109px, but the image is 108px in width.
Add filename overload for GafReader constructor