109 lines
2.7 KiB
Go
109 lines
2.7 KiB
Go
|
package commands
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"path/filepath"
|
||
|
"strings"
|
||
|
|
||
|
"git.kirsle.net/SketchyMaze/doodle/pkg/doodads"
|
||
|
"git.kirsle.net/SketchyMaze/doodle/pkg/enum"
|
||
|
"git.kirsle.net/SketchyMaze/doodle/pkg/level"
|
||
|
"git.kirsle.net/SketchyMaze/doodle/pkg/log"
|
||
|
"github.com/urfave/cli/v2"
|
||
|
)
|
||
|
|
||
|
// Resave a Level or Doodad to adapt to file format upgrades.
|
||
|
var Resave *cli.Command
|
||
|
|
||
|
func init() {
|
||
|
Resave = &cli.Command{
|
||
|
Name: "resave",
|
||
|
Usage: "load and re-save a level or doodad file to migrate to newer file format versions",
|
||
|
ArgsUsage: "<.level or .doodad>",
|
||
|
Flags: []cli.Flag{
|
||
|
&cli.BoolFlag{
|
||
|
Name: "actors",
|
||
|
Usage: "print verbose actor data in Level files",
|
||
|
},
|
||
|
&cli.BoolFlag{
|
||
|
Name: "chunks",
|
||
|
Usage: "print verbose data about all the pixel chunks in a file",
|
||
|
},
|
||
|
&cli.BoolFlag{
|
||
|
Name: "script",
|
||
|
Usage: "print the script from a doodad file and exit",
|
||
|
},
|
||
|
&cli.StringFlag{
|
||
|
Name: "attachment",
|
||
|
Aliases: []string{"a"},
|
||
|
Usage: "print the contents of the attached filename to terminal",
|
||
|
},
|
||
|
&cli.BoolFlag{
|
||
|
Name: "verbose",
|
||
|
Aliases: []string{"v"},
|
||
|
Usage: "print verbose output (all verbose flags enabled)",
|
||
|
},
|
||
|
},
|
||
|
Action: func(c *cli.Context) error {
|
||
|
if c.NArg() < 1 {
|
||
|
return cli.Exit(
|
||
|
"Usage: doodad resave <.level .doodad ...>",
|
||
|
1,
|
||
|
)
|
||
|
}
|
||
|
|
||
|
filenames := c.Args().Slice()
|
||
|
for _, filename := range filenames {
|
||
|
switch strings.ToLower(filepath.Ext(filename)) {
|
||
|
case enum.LevelExt:
|
||
|
if err := resaveLevel(c, filename); err != nil {
|
||
|
log.Error(err.Error())
|
||
|
return cli.Exit("Error", 1)
|
||
|
}
|
||
|
case enum.DoodadExt:
|
||
|
if err := resaveDoodad(c, filename); err != nil {
|
||
|
log.Error(err.Error())
|
||
|
return cli.Exit("Error", 1)
|
||
|
}
|
||
|
default:
|
||
|
log.Error("File %s: not a level or doodad", filename)
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// resaveLevel shows data about a level file.
|
||
|
func resaveLevel(c *cli.Context, filename string) error {
|
||
|
lvl, err := level.LoadJSON(filename)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
log.Info("Loaded level from file: %s", filename)
|
||
|
log.Info("Last saved game version: %s", lvl.GameVersion)
|
||
|
|
||
|
log.Info("Saving back to disk")
|
||
|
if err := lvl.WriteJSON(filename); err != nil {
|
||
|
return fmt.Errorf("couldn't write %s: %s", filename, err)
|
||
|
}
|
||
|
return showLevel(c, filename)
|
||
|
}
|
||
|
|
||
|
func resaveDoodad(c *cli.Context, filename string) error {
|
||
|
dd, err := doodads.LoadJSON(filename)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
log.Info("Loaded doodad from file: %s", filename)
|
||
|
log.Info("Last saved game version: %s", dd.GameVersion)
|
||
|
|
||
|
log.Info("Saving back to disk")
|
||
|
if err := dd.WriteJSON(filename); err != nil {
|
||
|
return fmt.Errorf("couldn't write %s: %s", filename, err)
|
||
|
}
|
||
|
return showDoodad(c, filename)
|
||
|
}
|