2018-06-17 17:29:57 +00:00
|
|
|
package level
|
|
|
|
|
2018-06-17 17:40:41 +00:00
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
2018-09-23 22:20:45 +00:00
|
|
|
|
|
|
|
"git.kirsle.net/apps/doodle/balance"
|
|
|
|
"git.kirsle.net/apps/doodle/render"
|
2018-06-17 17:40:41 +00:00
|
|
|
)
|
|
|
|
|
2018-06-17 17:29:57 +00:00
|
|
|
// Level is the container format for Doodle map drawings.
|
|
|
|
type Level struct {
|
2018-09-23 22:20:45 +00:00
|
|
|
Version int `json:"version"` // File format version spec.
|
2018-07-24 03:10:53 +00:00
|
|
|
GameVersion string `json:"gameVersion"` // Game version that created the level.
|
|
|
|
Title string `json:"title"`
|
|
|
|
Author string `json:"author"`
|
|
|
|
Password string `json:"passwd"`
|
|
|
|
Locked bool `json:"locked"`
|
2018-06-17 17:29:57 +00:00
|
|
|
|
2018-09-23 22:20:45 +00:00
|
|
|
// Chunked pixel data.
|
|
|
|
Chunker *Chunker `json:"chunks"`
|
|
|
|
|
|
|
|
// XXX: deprecated?
|
2018-06-17 17:29:57 +00:00
|
|
|
Width int32 `json:"w"`
|
|
|
|
Height int32 `json:"h"`
|
|
|
|
|
|
|
|
// The Palette holds the unique "colors" used in this map file, and their
|
|
|
|
// properties (solid, fire, slippery, etc.)
|
2018-08-11 00:19:47 +00:00
|
|
|
Palette *Palette `json:"palette"`
|
2018-06-17 17:29:57 +00:00
|
|
|
|
|
|
|
// Pixels is a 2D array indexed by [X][Y]. The cell values are indexes into
|
|
|
|
// the Palette.
|
2018-08-11 00:19:47 +00:00
|
|
|
Pixels []*Pixel `json:"pixels"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// New creates a blank level object with all its members initialized.
|
|
|
|
func New() *Level {
|
|
|
|
return &Level{
|
|
|
|
Version: 1,
|
2018-09-23 22:20:45 +00:00
|
|
|
Chunker: NewChunker(balance.ChunkSize),
|
2018-08-11 00:19:47 +00:00
|
|
|
Pixels: []*Pixel{},
|
|
|
|
Palette: &Palette{},
|
|
|
|
}
|
2018-06-17 17:29:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Pixel associates a coordinate with a palette index.
|
|
|
|
type Pixel struct {
|
2018-08-11 00:19:47 +00:00
|
|
|
X int32 `json:"x"`
|
|
|
|
Y int32 `json:"y"`
|
|
|
|
PaletteIndex int32 `json:"p"`
|
|
|
|
|
|
|
|
// Private runtime values.
|
|
|
|
Palette *Palette `json:"-"` // pointer to its palette, TODO: needed?
|
|
|
|
Swatch *Swatch `json:"-"` // pointer to its swatch, for when rendered.
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p Pixel) String() string {
|
|
|
|
return fmt.Sprintf("Pixel<%s '%s' (%d,%d)>", p.Swatch.Color, p.Swatch.Name, p.X, p.Y)
|
2018-06-17 17:29:57 +00:00
|
|
|
}
|
|
|
|
|
2018-09-23 22:20:45 +00:00
|
|
|
// Point returns the pixel's point.
|
|
|
|
func (p Pixel) Point() render.Point {
|
|
|
|
return render.Point{
|
|
|
|
X: p.X,
|
|
|
|
Y: p.Y,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-17 17:40:41 +00:00
|
|
|
// MarshalJSON serializes a Pixel compactly as a simple list.
|
|
|
|
func (p Pixel) MarshalJSON() ([]byte, error) {
|
|
|
|
return []byte(fmt.Sprintf(
|
|
|
|
`[%d, %d, %d]`,
|
2018-08-11 00:19:47 +00:00
|
|
|
p.X, p.Y, p.PaletteIndex,
|
2018-06-17 17:40:41 +00:00
|
|
|
)), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON loads a Pixel from JSON again.
|
|
|
|
func (p *Pixel) UnmarshalJSON(text []byte) error {
|
|
|
|
var triplet []int32
|
|
|
|
err := json.Unmarshal(text, &triplet)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
p.X = triplet[0]
|
|
|
|
p.Y = triplet[1]
|
2018-08-11 00:19:47 +00:00
|
|
|
if len(triplet) > 2 {
|
|
|
|
p.PaletteIndex = triplet[2]
|
|
|
|
}
|
2018-06-17 17:40:41 +00:00
|
|
|
return nil
|
|
|
|
}
|