This makes menus display more correctly, and also fixes trees and other objects on the main map, although it messes up bounds clipping (sigh).
90 lines
1.4 KiB
Go
90 lines
1.4 KiB
Go
package assetstore
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/hajimehoshi/ebiten"
|
|
|
|
"code.ur.gs/lupine/ordoor/internal/data"
|
|
)
|
|
|
|
type Object struct {
|
|
assets *AssetStore
|
|
sprites []*Sprite
|
|
|
|
raw *data.Object
|
|
}
|
|
|
|
type Sprite struct {
|
|
obj *Object
|
|
|
|
XOffset int
|
|
YOffset int
|
|
Width int
|
|
Height int
|
|
|
|
Image *ebiten.Image
|
|
}
|
|
|
|
func (a *AssetStore) Object(name string) (*Object, error) {
|
|
name = canonical(name)
|
|
|
|
if obj, ok := a.objs[name]; ok {
|
|
return obj, nil
|
|
}
|
|
log.Printf("Loading object %v", name)
|
|
|
|
filename, err := a.lookup(name, "obj", "Obj")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
raw, err := data.LoadObjectLazily(filename)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
raw.Name = name
|
|
|
|
obj := &Object{
|
|
assets: a,
|
|
sprites: make([]*Sprite, int(raw.NumSprites)),
|
|
raw: raw,
|
|
}
|
|
a.objs[name] = obj
|
|
|
|
return obj, nil
|
|
}
|
|
|
|
// Filled lazily
|
|
func (o *Object) Sprite(idx int) (*Sprite, error) {
|
|
if sprite := o.sprites[idx]; sprite != nil {
|
|
return sprite, nil
|
|
}
|
|
log.Printf("Loading sprite %v:%v", o.raw.Name, idx)
|
|
|
|
if o.raw.Sprites[idx] == nil {
|
|
if err := o.raw.LoadSprite(idx); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
raw := o.raw.Sprites[idx]
|
|
img, err := ebiten.NewImageFromImage(raw.ToImage(), ebiten.FilterDefault)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
sprite := &Sprite{
|
|
obj: o,
|
|
Width: int(raw.Width),
|
|
Height: int(raw.Width),
|
|
XOffset: int(raw.XOffset),
|
|
YOffset: int(raw.YOffset),
|
|
Image: img,
|
|
}
|
|
|
|
o.sprites[idx] = sprite
|
|
|
|
return sprite, nil
|
|
}
|