package assets import ( "image/color" "image/png" "log" "net/http" "path" "strings" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/text/v2" "muhq.space/muhqs-game/go/font" ) const ( IMAGE_URL_PART string = "html/build/latex-build" TILE_URL_PART string = "assets/tiles" SYMBOL_URL_PART string = "assets/symbols/40x40" ) func retrieveAsset(path string) *ebiten.Image { log.Printf("loading asset %s\n", path) resp, err := http.Get(PROTOCOL + path) if err != nil { log.Println(err) return nil } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil } img, err := png.Decode(resp.Body) if err != nil { log.Fatal("decoding ", err) } return ebiten.NewImageFromImage(img) } var cards = map[string]map[string]map[string]*ebiten.Image{} func GetCard(cardPath string, language string) *ebiten.Image { card := path.Base(cardPath) set := path.Dir(cardPath) img, found := cards[language][set][card] if !found { url := path.Join(BASE_URL, IMAGE_URL_PART, language, cardPath+".png") img = retrieveAsset(url) if cards[language] == nil { cards[language] = map[string]map[string]*ebiten.Image{} } if cards[language][set] == nil { cards[language][set] = map[string]*ebiten.Image{} } cards[language][set][card] = img } return img } var tiles = map[string]*ebiten.Image{} func GetTile(tile string) *ebiten.Image { img, found := tiles[tile] if !found { url := path.Join(BASE_URL, TILE_URL_PART, strings.ReplaceAll(tile, " ", "_")+".png") img = retrieveAsset(url) tiles[tile] = img } return img } var symbols = map[string]*ebiten.Image{} func GetSymbol(symbol string) *ebiten.Image { img, found := symbols[symbol] if !found { url := path.Join(BASE_URL, SYMBOL_URL_PART, symbol+".png") img = retrieveAsset(url) symbols[symbol] = img } return img } func GetGenericSymbol(symbol string) *ebiten.Image { img, found := symbols[symbol] if !found { genericBase := GetSymbol("generic_base") img = ebiten.NewImageFromImage(genericBase) op := &text.DrawOptions{} op.GeoM.Translate(5, 7) op.ColorScale.ScaleWithColor(color.Black) text.Draw(img, symbol, font.Font24, op) } return img }