z_mirror/fmm
git clone https://git.raiguard.me/z_mirror/fmm
27d8943
updating
1package fmm 2 3import ( 4"archive/zip" 5"compress/zlib" 6"errors" 7"io" 8"strings" 9) 10 11// Returns a slice of mod names and versions extracted from the given save 12// file. 13func ParseSaveFile (filepath string ) ([]ModIdent ,error ) { 14zipReader ,err := zip .OpenReader (filepath ) 15if err != nil { 16return nil ,err 17 } 18defer zipReader .Close () 19 20var dat * zip.File 21compressed := false 22for _ ,file := range zipReader .File { 23parts := strings .Split (file .Name ,"/" ) 24name := parts [len (parts )- 1 ] 25if name == "level.dat" || name == "level.dat0" { 26dat = file 27compressed = name == "level.dat0" 28break 29 } 30 } 31if dat == nil { 32return nil ,errors .New ("invalid save file: could not locate level data" ) 33 } 34 35rawReader ,err := dat .Open () 36if err != nil { 37return nil ,err 38 } 39if compressed { 40rawReader ,err = zlib .NewReader (rawReader ) 41 } 42if err != nil { 43return nil ,err 44 } 45defer rawReader .Close () 46 47bytes ,err := io .ReadAll (rawReader ) 48if err != nil { 49return nil ,err 50 } 51 52datReader := newDatReader (bytes ) 53 54datReader .ReadUnoptimizedVersion ()// mapVersion 55datReader .ReadUint8 ()// branchVersion 56datReader .ReadString ()// campaignName 57datReader .ReadString ()// levelName 58datReader .ReadString ()// modName 59datReader .ReadUint8 ()// difficulty 60datReader .ReadBool ()// finished 61datReader .ReadBool ()// playerWon 62datReader .ReadString ()// nextLevel 63datReader .ReadBool ()// canContinue 64datReader .ReadBool ()// finishedButContinuing 65datReader .ReadBool ()// savingReplay 66datReader .ReadBool ()// allowNonAdminDebugOptions 67datReader .ReadOptimizedVersion (true )// scenarioVersion 68datReader .ReadUint8 ()// scenarioBranchVersion 69datReader .ReadUint8 ()// allowedCommands 70 71numMods := datReader .ReadUint16Optimized () 72mods := make ([]ModIdent ,numMods ) 73for i := uint16 (0 );i < numMods ;i += 1 { 74mods [i ]= datReader .ReadModWithCRC () 75 } 76 77datReader .ReadUint32 ()// startupModSettingsCrc 78// TODO: Startup mod settings PropertyTree 79 80return mods ,nil 81}