lazarus/tools/dc6/dc6.go

98 lines
2.0 KiB
Go
Raw Permalink Normal View History

package main
import (
"flag"
"fmt"
"image"
2018-12-31 18:54:33 +00:00
"image/color"
"image/png"
"os"
"path"
"path/filepath"
"github.com/FooSoft/lazarus/formats/dat"
"github.com/FooSoft/lazarus/formats/dc6"
)
2019-01-09 02:45:19 +00:00
func loadPalette(path string) (*dat.Palette, error) {
fp, err := os.Open(path)
if err != nil {
return nil, err
}
defer fp.Close()
return dat.NewFromReader(fp)
}
2019-01-09 02:45:19 +00:00
func loadSprite(path string) (*dc6.Animation, error) {
fp, err := os.Open(path)
if err != nil {
return nil, err
}
defer fp.Close()
return dc6.NewFromReader(fp)
}
2019-01-09 02:45:19 +00:00
func extractSprite(spritePath string, palette *dat.Palette, targetDir string) error {
sprite, err := loadSprite(spritePath)
if err != nil {
return err
}
for di, direction := range sprite.Directions {
for fi, frame := range direction.Frames {
2018-12-31 18:54:33 +00:00
img := image.NewRGBA(image.Rect(0, 0, frame.Size.X, frame.Size.Y))
for y := 0; y < frame.Size.Y; y++ {
for x := 0; x < frame.Size.X; x++ {
colorSrc := palette.Colors[frame.Data[y*frame.Size.X+x]]
colorDst := color.RGBA{colorSrc.R, colorSrc.G, colorSrc.B, 0xff}
img.Set(x, y, colorDst)
}
}
basePath := filepath.Base(spritePath)
targetPath := fmt.Sprintf("%s_%d_%d.png", filepath.Join(targetDir, basePath), di, fi)
fp, err := os.Create(targetPath)
if err != nil {
return err
}
defer fp.Close()
if err := png.Encode(fp, img); err != nil {
return err
}
}
}
return nil
}
func main() {
targetDir := flag.String("target", ".", "target directory")
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: %s [options] palette_file [dc6_files]\n", path.Base(os.Args[0]))
fmt.Fprintf(os.Stderr, "Parameters:\n\n")
flag.PrintDefaults()
}
flag.Parse()
if flag.NArg() < 1 {
flag.Usage()
os.Exit(2)
}
palette, err := loadPalette(flag.Arg(0))
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
for i := 1; i < flag.NArg(); i++ {
if err := extractSprite(flag.Arg(1), palette, *targetDir); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
}