From 3866ee07a860677c4d954e39ed974568745ca7b8 Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Mon, 1 Jun 2020 01:24:44 +0100 Subject: [PATCH] Source the palette name from data --- cmd/loader/main.go | 12 +++++++++--- config.toml.example | 1 + internal/assetstore/assetstore.go | 10 +++++++++- internal/assetstore/menu.go | 2 +- internal/assetstore/object.go | 2 +- internal/data/object.go | 6 +++--- internal/menus/menus.go | 15 +++++++-------- internal/palettes/palettes.go | 9 ++++----- 8 files changed, 35 insertions(+), 22 deletions(-) diff --git a/cmd/loader/main.go b/cmd/loader/main.go index 14058bd..440db0f 100644 --- a/cmd/loader/main.go +++ b/cmd/loader/main.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "image/color" "log" "path/filepath" "strings" @@ -13,6 +14,7 @@ import ( "code.ur.gs/lupine/ordoor/internal/idx" "code.ur.gs/lupine/ordoor/internal/maps" "code.ur.gs/lupine/ordoor/internal/menus" + "code.ur.gs/lupine/ordoor/internal/palettes" "code.ur.gs/lupine/ordoor/internal/sets" ) @@ -33,6 +35,10 @@ func main() { } engine := cfg.DefaultEngine() gamePath := engine.DataDir + palette, ok := palettes.Get(engine.Palette) + if !ok { + log.Fatalf("Unknown palette name: %v", engine.Palette) + } loadData(filepath.Join(gamePath, "Data")) @@ -43,7 +49,7 @@ func main() { loadMapsFrom(filepath.Join(gamePath, "Maps")) loadMapsFrom(filepath.Join(gamePath, "MultiMaps")) loadSets(filepath.Join(gamePath, "Sets")) - loadMenus(filepath.Join(gamePath, "Menu")) + loadMenus(filepath.Join(gamePath, "Menu"), palette) loadFonts(filepath.Join(gamePath, "Fonts")) loadIdx(filepath.Join(gamePath, "Idx", "WarHammer.idx")) } @@ -163,10 +169,10 @@ func loadSets(setsPath string) { } } -func loadMenus(menusPath string) { +func loadMenus(menusPath string, palette color.Palette) { log.Printf("Loading menus from %s", menusPath) - menus, err := menus.LoadMenus(menusPath) + menus, err := menus.LoadMenus(menusPath, palette) if err != nil { log.Fatalf("Failed to parse %s/*.mnu as menus: %v", menusPath, err) } diff --git a/config.toml.example b/config.toml.example index 1c7ecac..903720f 100644 --- a/config.toml.example +++ b/config.toml.example @@ -4,6 +4,7 @@ default_engine = "ordoor" [engines.geas] # Wages of War -> Gifts of Peace -> Geas data_dir = "./WoW" + palette = "WagesOfWar" [engines.ordoor] # Chaos Gate -> Order Door -> Ordoor data_dir = "./CG" diff --git a/internal/assetstore/assetstore.go b/internal/assetstore/assetstore.go index 90cd6d7..6cda5ee 100644 --- a/internal/assetstore/assetstore.go +++ b/internal/assetstore/assetstore.go @@ -2,6 +2,7 @@ package assetstore import ( "fmt" + "image/color" "io/ioutil" "os" "path/filepath" @@ -10,6 +11,7 @@ import ( "code.ur.gs/lupine/ordoor/internal/config" "code.ur.gs/lupine/ordoor/internal/data" "code.ur.gs/lupine/ordoor/internal/idx" + "code.ur.gs/lupine/ordoor/internal/palettes" ) type entryMap map[string]map[string]string @@ -29,7 +31,7 @@ type entryMap map[string]map[string]string // or instantiate two separate asset stores. type AssetStore struct { RootDir string - // Palette + Palette color.Palette // Case-insensitive file lookup. // {"":{"anim":"Anim", "obj":"Obj", ...}, "anim":{ "warhammer.ani":"WarHammer.ani" }, ...} @@ -56,8 +58,14 @@ func New(engine *config.Engine) (*AssetStore, error) { return nil, fmt.Errorf("Unconfigured engine passed to assetstore") } + palette, ok := palettes.Get(engine.Palette) + if !ok { + return nil, fmt.Errorf("Couldn't find palette %q for engine", engine.Palette) + } + store := &AssetStore{ RootDir: engine.DataDir, + Palette: palette, } // fill entryMap diff --git a/internal/assetstore/menu.go b/internal/assetstore/menu.go index a8bb453..bef2cc7 100644 --- a/internal/assetstore/menu.go +++ b/internal/assetstore/menu.go @@ -62,7 +62,7 @@ func (a *AssetStore) Menu(name string) (*Menu, error) { return nil, err } - raw, err := menus.LoadMenu(filename) + raw, err := menus.LoadMenu(filename, a.Palette) if err != nil { return nil, err } diff --git a/internal/assetstore/object.go b/internal/assetstore/object.go index 76cc72e..da10fa6 100644 --- a/internal/assetstore/object.go +++ b/internal/assetstore/object.go @@ -117,7 +117,7 @@ func (o *Object) Sprite(idx int) (*Sprite, error) { } raw := o.raw.Sprites[idx] - img, err := ebiten.NewImageFromImage(raw.ToImage(), ebiten.FilterDefault) + img, err := ebiten.NewImageFromImage(raw.ToImage(o.assets.Palette), ebiten.FilterDefault) if err != nil { return nil, err } diff --git a/internal/data/object.go b/internal/data/object.go index 64fe795..dfffe66 100644 --- a/internal/data/object.go +++ b/internal/data/object.go @@ -4,6 +4,7 @@ import ( "encoding/binary" "fmt" "image" + "image/color" "io" "io/ioutil" "log" @@ -12,7 +13,6 @@ import ( "strings" "code.ur.gs/lupine/ordoor/internal/data/rle" - "code.ur.gs/lupine/ordoor/internal/palettes" ) type SpriteHeader struct { @@ -53,12 +53,12 @@ type Sprite struct { Data []byte } -func (s *Sprite) ToImage() *image.Paletted { +func (s *Sprite) ToImage(palette color.Palette) *image.Paletted { return &image.Paletted{ Pix: s.Data, Stride: int(s.Width), Rect: image.Rect(0, 0, int(s.Width), int(s.Height)), - Palette: palettes.DefaultPalette(), + Palette: palette, } } diff --git a/internal/menus/menus.go b/internal/menus/menus.go index 0652f53..280cc75 100644 --- a/internal/menus/menus.go +++ b/internal/menus/menus.go @@ -9,7 +9,6 @@ import ( "strconv" "strings" - "code.ur.gs/lupine/ordoor/internal/palettes" "code.ur.gs/lupine/ordoor/internal/util/asciiscan" ) @@ -143,7 +142,7 @@ func (p *Properties) Point() image.Point { return image.Point{} } -func LoadMenu(filename string) (*Menu, error) { +func LoadMenu(filename string, palette color.Palette) (*Menu, error) { name := filepath.Base(filename) name = strings.TrimSuffix(name, filepath.Ext(name)) name = strings.ToLower(name) @@ -163,7 +162,7 @@ func LoadMenu(filename string) (*Menu, error) { return nil, err } - if err := loadProperties(out, scanner); err != nil { + if err := loadProperties(out, scanner, palette); err != nil { return nil, err } @@ -189,7 +188,7 @@ func loadObjects(menu *Menu, scanner *asciiscan.Scanner) error { return nil } -func loadProperties(menu *Menu, scanner *asciiscan.Scanner) error { +func loadProperties(menu *Menu, scanner *asciiscan.Scanner, palette color.Palette) error { for { ok, err := scanner.PeekProperty() @@ -218,9 +217,9 @@ func loadProperties(menu *Menu, scanner *asciiscan.Scanner) error { switch strings.ToUpper(k) { case "BACKGROUND COLOR": - menu.BackgroundColor = palettes.DefaultPalette()[vInt] + menu.BackgroundColor = palette[vInt] case "HYPERTEXT COLOR": - menu.HypertextColor = palettes.DefaultPalette()[vInt] + menu.HypertextColor = palette[vInt] case "FONT TYPE": menu.FontType = vInt default: @@ -319,7 +318,7 @@ func loadRecords(baseDir string, menu *Menu, scanner *asciiscan.Scanner) error { return nil } -func LoadMenus(dir string) (map[string]*Menu, error) { +func LoadMenus(dir string, palette color.Palette) (map[string]*Menu, error) { fis, err := ioutil.ReadDir(dir) if err != nil { return nil, err @@ -337,7 +336,7 @@ func LoadMenus(dir string) (map[string]*Menu, error) { continue } - built, err := LoadMenu(filepath.Join(dir, relname)) + built, err := LoadMenu(filepath.Join(dir, relname), palette) if err != nil { return nil, fmt.Errorf("%s: %v", filepath.Join(dir, relname), err) } diff --git a/internal/palettes/palettes.go b/internal/palettes/palettes.go index ddc6b2c..786355e 100644 --- a/internal/palettes/palettes.go +++ b/internal/palettes/palettes.go @@ -5,9 +5,6 @@ import ( "sync" ) -// Override this to change the palette globally -const DefaultPaletteName = "ChaosGate" - var ( Transparent = color.RGBA{R: 0, G: 0, B: 0, A: 0} @@ -16,6 +13,8 @@ var ( initPalettes = sync.Once{} ) -func DefaultPalette() color.Palette { - return Palettes[DefaultPaletteName] +func Get(name string) (color.Palette, bool) { + p, ok := Palettes[name] + + return p, ok }