2018-03-22 01:56:46 +00:00
|
|
|
package conv
|
|
|
|
|
|
|
|
import (
|
2019-12-29 15:38:49 +00:00
|
|
|
"github.com/hajimehoshi/ebiten"
|
2018-03-22 01:56:46 +00:00
|
|
|
|
2018-03-22 20:31:10 +00:00
|
|
|
"ur.gs/ordoor/internal/data"
|
2018-03-22 01:56:46 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Important conversions:
|
|
|
|
//
|
|
|
|
// * Width & height now stored using int
|
|
|
|
// * Colour data is now 32-bit rather than using a palette
|
|
|
|
type Sprite struct {
|
|
|
|
Width int
|
|
|
|
Height int
|
|
|
|
|
2019-12-29 15:38:49 +00:00
|
|
|
Image *ebiten.Image
|
2018-03-22 01:56:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type Object struct {
|
|
|
|
Name string
|
2018-10-13 01:37:44 +01:00
|
|
|
Sprites []*Sprite
|
2018-03-22 01:56:46 +00:00
|
|
|
}
|
|
|
|
|
2018-12-30 23:22:01 +00:00
|
|
|
func MapByName(objects []*Object) map[string]*Object {
|
|
|
|
out := make(map[string]*Object, len(objects))
|
|
|
|
|
|
|
|
for _, obj := range objects {
|
|
|
|
out[obj.Name] = obj
|
|
|
|
}
|
|
|
|
|
|
|
|
return out
|
|
|
|
}
|
|
|
|
|
2019-12-29 15:38:49 +00:00
|
|
|
func ConvertObject(rawObj *data.Object, name string) (*Object, error) {
|
2018-10-12 23:02:24 +01:00
|
|
|
out := &Object{
|
|
|
|
Name: name,
|
2018-10-13 01:37:44 +01:00
|
|
|
Sprites: make([]*Sprite, len(rawObj.Sprites)),
|
2018-10-12 23:02:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
for i, rawSpr := range rawObj.Sprites {
|
2019-12-29 15:38:49 +00:00
|
|
|
w := int(rawSpr.Width)
|
|
|
|
h := int(rawSpr.Height)
|
|
|
|
data := spriteToData(name, i, rawSpr)
|
2018-10-12 23:02:24 +01:00
|
|
|
|
2019-12-29 15:38:49 +00:00
|
|
|
image, err := ebiten.NewImage(w, h, ebiten.FilterDefault)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2018-03-22 01:56:46 +00:00
|
|
|
}
|
2019-12-29 15:38:49 +00:00
|
|
|
_ = image.ReplacePixels(data)
|
|
|
|
|
|
|
|
out.Sprites[i] = &Sprite{Width: w, Height: h, Image: image}
|
2018-03-22 01:56:46 +00:00
|
|
|
}
|
|
|
|
|
2019-12-29 15:38:49 +00:00
|
|
|
return out, nil
|
2018-03-22 01:56:46 +00:00
|
|
|
}
|
|
|
|
|
2019-12-29 15:38:49 +00:00
|
|
|
func spriteToData(name string, idx int, sprite *data.Sprite) []byte {
|
2018-10-12 20:22:40 +01:00
|
|
|
width := int(sprite.Width)
|
|
|
|
height := int(sprite.Height)
|
2019-12-29 15:38:49 +00:00
|
|
|
out := make([]byte, 0, 4*width*height)
|
2018-03-22 01:56:46 +00:00
|
|
|
|
2019-12-29 15:38:49 +00:00
|
|
|
for _, palette := range sprite.Data {
|
|
|
|
color := data.ColorPalette[int(palette)]
|
|
|
|
out = append(out, color.R, color.G, color.B, color.A)
|
2018-03-24 21:47:34 +00:00
|
|
|
}
|
|
|
|
|
2019-12-29 15:38:49 +00:00
|
|
|
return out
|
2018-03-24 21:47:34 +00:00
|
|
|
}
|