2020-04-11 01:01:05 +01:00
|
|
|
package flow
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2020-04-19 20:57:45 +01:00
|
|
|
|
|
|
|
"code.ur.gs/lupine/ordoor/internal/assetstore"
|
|
|
|
"code.ur.gs/lupine/ordoor/internal/ui"
|
2020-04-11 01:01:05 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
type driverName string
|
|
|
|
|
|
|
|
const (
|
|
|
|
// Names of all the drivers
|
|
|
|
main driverName = "Main"
|
|
|
|
levelPly driverName = "LevelPly"
|
|
|
|
singles driverName = "Singles"
|
|
|
|
randomMap driverName = "RandomMap"
|
|
|
|
newGame driverName = "NewGame"
|
|
|
|
loadGame driverName = "LoadGame"
|
|
|
|
options driverName = "Options"
|
|
|
|
kbd driverName = "Keyboard"
|
|
|
|
bridge driverName = "Bridge"
|
|
|
|
briefing driverName = "Briefing"
|
|
|
|
choices driverName = "Choices"
|
|
|
|
saveGame driverName = "SaveGame"
|
|
|
|
credits driverName = "Credits"
|
|
|
|
arrange driverName = "Arrange"
|
|
|
|
|
|
|
|
configureUltEquip driverName = "Configure_UltEquip"
|
|
|
|
configureVehiclesUltra driverName = "Configure_Vehicles_Ultra"
|
|
|
|
|
|
|
|
mainGame driverName = "MainGame"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
driverNames = []driverName{
|
|
|
|
main, levelPly, singles, randomMap, newGame, loadGame, options, kbd,
|
|
|
|
bridge, briefing, choices, saveGame, credits, arrange,
|
|
|
|
configureUltEquip, configureVehiclesUltra,
|
|
|
|
mainGame,
|
|
|
|
}
|
2020-04-19 20:57:45 +01:00
|
|
|
|
|
|
|
menuTransforms = map[driverName]func(*assetstore.Menu){
|
|
|
|
mainGame: offsetMainGame,
|
|
|
|
}
|
2020-04-11 01:01:05 +01:00
|
|
|
)
|
|
|
|
|
2020-04-19 20:57:45 +01:00
|
|
|
// 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
|
|
|
|
}
|
|
|
|
|
2020-04-14 12:12:37 +01:00
|
|
|
func (f *Flow) returnToLastDriver(from driverName) func() {
|
|
|
|
return func() {
|
|
|
|
to, ok := f.returns[from]
|
|
|
|
if !ok {
|
|
|
|
f.exit = fmt.Errorf("Couldn't work out where to return to from %v", from)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
delete(f.returns, from)
|
|
|
|
|
|
|
|
f.setDriverNow(to)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-11 01:01:05 +01:00
|
|
|
// from is the child menu, to is the parent
|
|
|
|
func (f *Flow) returnToLastDriverNow(from driverName) error {
|
|
|
|
to, ok := f.returns[from]
|
|
|
|
if !ok {
|
|
|
|
return fmt.Errorf("Couldn't work out where to return to from %v", from)
|
|
|
|
}
|
|
|
|
|
|
|
|
delete(f.returns, from)
|
|
|
|
|
|
|
|
f.setDriverNow(to)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *Flow) setDriver(name driverName) func() {
|
|
|
|
return func() {
|
|
|
|
f.setDriverNow(name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *Flow) setDriverNow(name driverName) {
|
|
|
|
f.current = f.drivers[name]
|
|
|
|
}
|
|
|
|
|
|
|
|
// from is the parent menu, to is the child
|
|
|
|
func (f *Flow) setReturningDriver(from, to driverName) func() {
|
|
|
|
return func() {
|
|
|
|
f.setReturningDriverNow(from, to)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *Flow) setReturningDriverNow(from, to driverName) {
|
|
|
|
f.returns[to] = from
|
|
|
|
f.setDriverNow(to)
|
|
|
|
}
|