HAXXX: make the main game UI appear at the bottom
This commit is contained in:
@@ -2,6 +2,9 @@ package flow
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"code.ur.gs/lupine/ordoor/internal/assetstore"
|
||||||
|
"code.ur.gs/lupine/ordoor/internal/ui"
|
||||||
)
|
)
|
||||||
|
|
||||||
type driverName string
|
type driverName string
|
||||||
@@ -36,8 +39,62 @@ var (
|
|||||||
configureUltEquip, configureVehiclesUltra,
|
configureUltEquip, configureVehiclesUltra,
|
||||||
mainGame,
|
mainGame,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
menuTransforms = map[driverName]func(*assetstore.Menu){
|
||||||
|
mainGame: offsetMainGame,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// FIXME: HURK: MainGame elements need changes to show up in the right place
|
||||||
|
func offsetMainGame(menu *assetstore.Menu) {
|
||||||
|
for _, group := range menu.Groups() {
|
||||||
|
id := group.ID
|
||||||
|
|
||||||
|
// Bottom-aligned, not top-aligned
|
||||||
|
if id == 1 || id == 2 || id == 3 || id == 4 || id == 5 || id == 6 ||
|
||||||
|
id == 7 || id == 8 || id == 9 || id == 10 || id == 15 || id == 16 {
|
||||||
|
group.Y = 320 // Down by 320px
|
||||||
|
|
||||||
|
// FIXME: in reality, this appears to be a property of the group only
|
||||||
|
for _, rec := range group.Records {
|
||||||
|
rec.Y = 320
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Right-aligned, not left-aligned
|
||||||
|
// FIXME: this presents problems as there are two sizes and both need to
|
||||||
|
// be right-aligned, so a static offset won't quite work
|
||||||
|
// if id == 14 {
|
||||||
|
// group.X = 400 (or so)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Left-aligned, not centered
|
||||||
|
// FIXME: we're re-using the X-CORD and Y-CORD elements here. How do we
|
||||||
|
// signal a negative number?
|
||||||
|
// if id == 18 {
|
||||||
|
// group.X = 0
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildDriver(assets *assetstore.AssetStore, name driverName) (*ui.Driver, error) {
|
||||||
|
menu, err := assets.Menu(string(name))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if tf, ok := menuTransforms[name]; ok {
|
||||||
|
tf(menu)
|
||||||
|
}
|
||||||
|
|
||||||
|
driver, err := ui.NewDriver(assets, menu)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return driver, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (f *Flow) returnToLastDriver(from driverName) func() {
|
func (f *Flow) returnToLastDriver(from driverName) func() {
|
||||||
return func() {
|
return func() {
|
||||||
to, ok := f.returns[from]
|
to, ok := f.returns[from]
|
||||||
|
@@ -92,20 +92,6 @@ func New(assets *assetstore.AssetStore, config *config.Config, ship *ship.Ship)
|
|||||||
return out, out.exit
|
return out, out.exit
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildDriver(assets *assetstore.AssetStore, name driverName) (*ui.Driver, error) {
|
|
||||||
menu, err := assets.Menu(string(name))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
driver, err := ui.NewDriver(assets, menu)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return driver, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *Flow) Update(screenX, screenY int) error {
|
func (f *Flow) Update(screenX, screenY int) error {
|
||||||
if f.exit != nil {
|
if f.exit != nil {
|
||||||
return f.exit
|
return f.exit
|
||||||
|
@@ -2,6 +2,7 @@ package menus
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -134,6 +135,14 @@ type Properties struct {
|
|||||||
Help string
|
Help string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Properties) Point() image.Point {
|
||||||
|
if p.X > 0 || p.Y > 0 {
|
||||||
|
return image.Pt(p.X, p.Y)
|
||||||
|
}
|
||||||
|
|
||||||
|
return image.Point{}
|
||||||
|
}
|
||||||
|
|
||||||
func LoadMenu(filename string) (*Menu, error) {
|
func LoadMenu(filename string) (*Menu, error) {
|
||||||
name := filepath.Base(filename)
|
name := filepath.Base(filename)
|
||||||
name = strings.TrimSuffix(name, filepath.Ext(name))
|
name = strings.TrimSuffix(name, filepath.Ext(name))
|
||||||
|
@@ -13,6 +13,8 @@ import (
|
|||||||
type button struct {
|
type button struct {
|
||||||
locator string
|
locator string
|
||||||
|
|
||||||
|
rect image.Rectangle
|
||||||
|
|
||||||
baseSpr *assetstore.Sprite
|
baseSpr *assetstore.Sprite
|
||||||
clickSpr *assetstore.Sprite
|
clickSpr *assetstore.Sprite
|
||||||
frozenSpr *assetstore.Sprite
|
frozenSpr *assetstore.Sprite
|
||||||
@@ -37,6 +39,7 @@ func (d *Driver) buildButton(p *menus.Properties) (*button, *Widget, error) {
|
|||||||
|
|
||||||
btn := &button{
|
btn := &button{
|
||||||
locator: p.Locator,
|
locator: p.Locator,
|
||||||
|
rect: sprites[0].Rect.Add(p.Point()),
|
||||||
baseSpr: sprites[0],
|
baseSpr: sprites[0],
|
||||||
clickSpr: sprites[1],
|
clickSpr: sprites[1],
|
||||||
frozenSpr: sprites[2],
|
frozenSpr: sprites[2],
|
||||||
@@ -44,6 +47,7 @@ func (d *Driver) buildButton(p *menus.Properties) (*button, *Widget, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
widget := &Widget{
|
widget := &Widget{
|
||||||
|
Locator: p.Locator,
|
||||||
Active: p.Active,
|
Active: p.Active,
|
||||||
ownClickables: []clickable{btn},
|
ownClickables: []clickable{btn},
|
||||||
ownFreezables: []freezable{btn},
|
ownFreezables: []freezable{btn},
|
||||||
@@ -69,6 +73,7 @@ func (d *Driver) buildMainButton(p *menus.Properties) (*mainButton, *Widget, err
|
|||||||
hoverAnim: animation(hovers),
|
hoverAnim: animation(hovers),
|
||||||
button: button{
|
button: button{
|
||||||
locator: p.Locator,
|
locator: p.Locator,
|
||||||
|
rect: sprites[0].Rect.Add(p.Point()),
|
||||||
baseSpr: sprites[0],
|
baseSpr: sprites[0],
|
||||||
clickSpr: sprites[1],
|
clickSpr: sprites[1],
|
||||||
frozenSpr: sprites[2],
|
frozenSpr: sprites[2],
|
||||||
@@ -77,6 +82,7 @@ func (d *Driver) buildMainButton(p *menus.Properties) (*mainButton, *Widget, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
widget := &Widget{
|
widget := &Widget{
|
||||||
|
Locator: p.Locator,
|
||||||
Active: p.Active,
|
Active: p.Active,
|
||||||
ownClickables: []clickable{btn},
|
ownClickables: []clickable{btn},
|
||||||
ownFreezables: []freezable{btn},
|
ownFreezables: []freezable{btn},
|
||||||
@@ -95,6 +101,7 @@ func (d *Driver) buildDoorHotspot(p *menus.Properties) (*button, *Widget, error)
|
|||||||
|
|
||||||
btn := &button{
|
btn := &button{
|
||||||
locator: p.Locator,
|
locator: p.Locator,
|
||||||
|
rect: sprites[0].Rect.Add(p.Point()),
|
||||||
baseSpr: sprites[0],
|
baseSpr: sprites[0],
|
||||||
clickSpr: sprites[1],
|
clickSpr: sprites[1],
|
||||||
frozenSpr: sprites[0], // No disabled sprite
|
frozenSpr: sprites[0], // No disabled sprite
|
||||||
@@ -102,6 +109,7 @@ func (d *Driver) buildDoorHotspot(p *menus.Properties) (*button, *Widget, error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
widget := &Widget{
|
widget := &Widget{
|
||||||
|
Locator: p.Locator,
|
||||||
Active: p.Active,
|
Active: p.Active,
|
||||||
ownClickables: []clickable{btn},
|
ownClickables: []clickable{btn},
|
||||||
ownFreezables: []freezable{btn},
|
ownFreezables: []freezable{btn},
|
||||||
@@ -118,7 +126,7 @@ func (b *button) id() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *button) bounds() image.Rectangle {
|
func (b *button) bounds() image.Rectangle {
|
||||||
return b.baseSpr.Rect
|
return b.rect
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *button) mouseDownState() bool {
|
func (b *button) mouseDownState() bool {
|
||||||
|
@@ -67,7 +67,7 @@ func (d *Driver) buildNoninteractive(p *menus.Properties) (*noninteractive, erro
|
|||||||
ni := &noninteractive{
|
ni := &noninteractive{
|
||||||
locator: p.Locator,
|
locator: p.Locator,
|
||||||
frames: animation{sprite.Image},
|
frames: animation{sprite.Image},
|
||||||
rect: sprite.Rect,
|
rect: sprite.Rect.Add(p.Point()),
|
||||||
}
|
}
|
||||||
|
|
||||||
return ni, nil
|
return ni, nil
|
||||||
@@ -154,7 +154,7 @@ func (d *Driver) buildAnimationSample(p *menus.Properties) (*noninteractive, *Wi
|
|||||||
locator: p.Locator,
|
locator: p.Locator,
|
||||||
frames: animation(frames),
|
frames: animation(frames),
|
||||||
hoverImpl: hoverImpl{text: p.Text},
|
hoverImpl: hoverImpl{text: p.Text},
|
||||||
rect: sprite.Rect,
|
rect: sprite.Rect.Add(p.Point()),
|
||||||
}
|
}
|
||||||
|
|
||||||
widget := &Widget{
|
widget := &Widget{
|
||||||
@@ -187,7 +187,7 @@ func (d *Driver) buildAnimationHover(p *menus.Properties) (*animationHover, *Wid
|
|||||||
locator: p.Locator,
|
locator: p.Locator,
|
||||||
frames: animation(enterFrames),
|
frames: animation(enterFrames),
|
||||||
hoverImpl: hoverImpl{text: p.Text},
|
hoverImpl: hoverImpl{text: p.Text},
|
||||||
rect: sprite.Rect,
|
rect: sprite.Rect.Add(p.Point()),
|
||||||
},
|
},
|
||||||
|
|
||||||
exitFrames: animation(exitFrames),
|
exitFrames: animation(exitFrames),
|
||||||
|
@@ -20,6 +20,8 @@ type checkbox struct {
|
|||||||
type slider struct {
|
type slider struct {
|
||||||
locator string
|
locator string
|
||||||
|
|
||||||
|
rect image.Rectangle
|
||||||
|
|
||||||
baseSpr *assetstore.Sprite
|
baseSpr *assetstore.Sprite
|
||||||
clickSpr *assetstore.Sprite
|
clickSpr *assetstore.Sprite
|
||||||
sliderSpr *assetstore.Sprite
|
sliderSpr *assetstore.Sprite
|
||||||
@@ -42,6 +44,7 @@ func (d *Driver) buildCheckbox(p *menus.Properties) (*checkbox, *Widget, error)
|
|||||||
checkbox := &checkbox{
|
checkbox := &checkbox{
|
||||||
button: button{
|
button: button{
|
||||||
locator: p.Locator,
|
locator: p.Locator,
|
||||||
|
rect: sprites[0].Rect.Add(p.Point()),
|
||||||
baseSpr: sprites[0], // unchecked
|
baseSpr: sprites[0], // unchecked
|
||||||
clickSpr: sprites[2], // checked
|
clickSpr: sprites[2], // checked
|
||||||
frozenSpr: sprites[1], // disabled
|
frozenSpr: sprites[1], // disabled
|
||||||
@@ -71,6 +74,7 @@ func (d *Driver) buildSlider(p *menus.Properties) (*slider, *Widget, error) {
|
|||||||
|
|
||||||
slider := &slider{
|
slider := &slider{
|
||||||
locator: p.Locator,
|
locator: p.Locator,
|
||||||
|
rect: sprites[0].Rect.Add(p.Point()),
|
||||||
baseSpr: sprites[0],
|
baseSpr: sprites[0],
|
||||||
clickSpr: sprites[1],
|
clickSpr: sprites[1],
|
||||||
sliderSpr: sprites[2],
|
sliderSpr: sprites[2],
|
||||||
@@ -115,7 +119,7 @@ func (s *slider) id() string {
|
|||||||
|
|
||||||
// The bounds of the slider are the whole thing
|
// The bounds of the slider are the whole thing
|
||||||
func (s *slider) bounds() image.Rectangle {
|
func (s *slider) bounds() image.Rectangle {
|
||||||
return s.baseSpr.Rect
|
return s.rect
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *slider) registerMouseClick() {
|
func (s *slider) registerMouseClick() {
|
||||||
|
Reference in New Issue
Block a user