50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
// package play takes a map and turns it into a playable scenario
|
|
package scenario
|
|
|
|
import (
|
|
"fmt"
|
|
"image"
|
|
|
|
"code.ur.gs/lupine/ordoor/internal/assetstore"
|
|
)
|
|
|
|
type Scenario struct {
|
|
area *assetstore.Map
|
|
specials *assetstore.Object
|
|
|
|
tick int
|
|
turn int
|
|
selectedCell IsoPt
|
|
|
|
// All these must be modified by user actions somehow.
|
|
// TODO: extract into the idea of a viewport passed to Update / Draw somehow?
|
|
// Or have a separater Drawer for the Scenario?
|
|
Viewpoint image.Point // Top-left of the screen
|
|
ZIdx int // Currently-viewed Z index
|
|
}
|
|
|
|
func NewScenario(assets *assetstore.AssetStore, name string) (*Scenario, error) {
|
|
area, err := assets.Map(name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
specials, err := assets.Object("specials") // FIXME: should this be hardcoded?
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Eager load sprites. TODO: do we really want to do this?
|
|
if err := area.LoadSprites(); err != nil {
|
|
return nil, fmt.Errorf("Eager-loading sprites failed: %v", err)
|
|
}
|
|
|
|
out := &Scenario{
|
|
area: area,
|
|
specials: specials,
|
|
Viewpoint: image.Pt(0, 3000), // FIXME: haxxx
|
|
}
|
|
|
|
return out, nil
|
|
}
|