From 1f4bfc771ca602a8e2d57fa5b4d206bf5c9d3141 Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Sun, 19 Apr 2020 20:57:45 +0100 Subject: [PATCH] HAXXX: make the main game UI appear at the bottom --- internal/flow/drivers.go | 57 +++++++++++++++++++++++++++++++++++ internal/flow/flow.go | 14 --------- internal/menus/menus.go | 9 ++++++ internal/ui/buttons.go | 10 +++++- internal/ui/noninteractive.go | 6 ++-- internal/ui/selectors.go | 6 +++- 6 files changed, 83 insertions(+), 19 deletions(-) diff --git a/internal/flow/drivers.go b/internal/flow/drivers.go index c8f62df..1ac9db1 100644 --- a/internal/flow/drivers.go +++ b/internal/flow/drivers.go @@ -2,6 +2,9 @@ package flow import ( "fmt" + + "code.ur.gs/lupine/ordoor/internal/assetstore" + "code.ur.gs/lupine/ordoor/internal/ui" ) type driverName string @@ -36,8 +39,62 @@ var ( configureUltEquip, configureVehiclesUltra, 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() { return func() { to, ok := f.returns[from] diff --git a/internal/flow/flow.go b/internal/flow/flow.go index 74d6f2f..bb51208 100644 --- a/internal/flow/flow.go +++ b/internal/flow/flow.go @@ -92,20 +92,6 @@ func New(assets *assetstore.AssetStore, config *config.Config, ship *ship.Ship) 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 { if f.exit != nil { return f.exit diff --git a/internal/menus/menus.go b/internal/menus/menus.go index 53a9e2a..f78b363 100644 --- a/internal/menus/menus.go +++ b/internal/menus/menus.go @@ -2,6 +2,7 @@ package menus import ( "fmt" + "image" "image/color" "io/ioutil" "path/filepath" @@ -134,6 +135,14 @@ type Properties struct { 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) { name := filepath.Base(filename) name = strings.TrimSuffix(name, filepath.Ext(name)) diff --git a/internal/ui/buttons.go b/internal/ui/buttons.go index ddbdb72..cba8ae9 100644 --- a/internal/ui/buttons.go +++ b/internal/ui/buttons.go @@ -13,6 +13,8 @@ import ( type button struct { locator string + rect image.Rectangle + baseSpr *assetstore.Sprite clickSpr *assetstore.Sprite frozenSpr *assetstore.Sprite @@ -37,6 +39,7 @@ func (d *Driver) buildButton(p *menus.Properties) (*button, *Widget, error) { btn := &button{ locator: p.Locator, + rect: sprites[0].Rect.Add(p.Point()), baseSpr: sprites[0], clickSpr: sprites[1], frozenSpr: sprites[2], @@ -44,6 +47,7 @@ func (d *Driver) buildButton(p *menus.Properties) (*button, *Widget, error) { } widget := &Widget{ + Locator: p.Locator, Active: p.Active, ownClickables: []clickable{btn}, ownFreezables: []freezable{btn}, @@ -69,6 +73,7 @@ func (d *Driver) buildMainButton(p *menus.Properties) (*mainButton, *Widget, err hoverAnim: animation(hovers), button: button{ locator: p.Locator, + rect: sprites[0].Rect.Add(p.Point()), baseSpr: sprites[0], clickSpr: sprites[1], frozenSpr: sprites[2], @@ -77,6 +82,7 @@ func (d *Driver) buildMainButton(p *menus.Properties) (*mainButton, *Widget, err } widget := &Widget{ + Locator: p.Locator, Active: p.Active, ownClickables: []clickable{btn}, ownFreezables: []freezable{btn}, @@ -95,6 +101,7 @@ func (d *Driver) buildDoorHotspot(p *menus.Properties) (*button, *Widget, error) btn := &button{ locator: p.Locator, + rect: sprites[0].Rect.Add(p.Point()), baseSpr: sprites[0], clickSpr: sprites[1], frozenSpr: sprites[0], // No disabled sprite @@ -102,6 +109,7 @@ func (d *Driver) buildDoorHotspot(p *menus.Properties) (*button, *Widget, error) } widget := &Widget{ + Locator: p.Locator, Active: p.Active, ownClickables: []clickable{btn}, ownFreezables: []freezable{btn}, @@ -118,7 +126,7 @@ func (b *button) id() string { } func (b *button) bounds() image.Rectangle { - return b.baseSpr.Rect + return b.rect } func (b *button) mouseDownState() bool { diff --git a/internal/ui/noninteractive.go b/internal/ui/noninteractive.go index 0eac12f..c78316d 100644 --- a/internal/ui/noninteractive.go +++ b/internal/ui/noninteractive.go @@ -67,7 +67,7 @@ func (d *Driver) buildNoninteractive(p *menus.Properties) (*noninteractive, erro ni := &noninteractive{ locator: p.Locator, frames: animation{sprite.Image}, - rect: sprite.Rect, + rect: sprite.Rect.Add(p.Point()), } return ni, nil @@ -154,7 +154,7 @@ func (d *Driver) buildAnimationSample(p *menus.Properties) (*noninteractive, *Wi locator: p.Locator, frames: animation(frames), hoverImpl: hoverImpl{text: p.Text}, - rect: sprite.Rect, + rect: sprite.Rect.Add(p.Point()), } widget := &Widget{ @@ -187,7 +187,7 @@ func (d *Driver) buildAnimationHover(p *menus.Properties) (*animationHover, *Wid locator: p.Locator, frames: animation(enterFrames), hoverImpl: hoverImpl{text: p.Text}, - rect: sprite.Rect, + rect: sprite.Rect.Add(p.Point()), }, exitFrames: animation(exitFrames), diff --git a/internal/ui/selectors.go b/internal/ui/selectors.go index cbbe6eb..421b280 100644 --- a/internal/ui/selectors.go +++ b/internal/ui/selectors.go @@ -20,6 +20,8 @@ type checkbox struct { type slider struct { locator string + rect image.Rectangle + baseSpr *assetstore.Sprite clickSpr *assetstore.Sprite sliderSpr *assetstore.Sprite @@ -42,6 +44,7 @@ func (d *Driver) buildCheckbox(p *menus.Properties) (*checkbox, *Widget, error) checkbox := &checkbox{ button: button{ locator: p.Locator, + rect: sprites[0].Rect.Add(p.Point()), baseSpr: sprites[0], // unchecked clickSpr: sprites[2], // checked frozenSpr: sprites[1], // disabled @@ -71,6 +74,7 @@ func (d *Driver) buildSlider(p *menus.Properties) (*slider, *Widget, error) { slider := &slider{ locator: p.Locator, + rect: sprites[0].Rect.Add(p.Point()), baseSpr: sprites[0], clickSpr: sprites[1], sliderSpr: sprites[2], @@ -115,7 +119,7 @@ func (s *slider) id() string { // The bounds of the slider are the whole thing func (s *slider) bounds() image.Rectangle { - return s.baseSpr.Rect + return s.rect } func (s *slider) registerMouseClick() {