From 7824396c24b6d1ff9c50d55eef5812d5727eaa67 Mon Sep 17 00:00:00 2001 From: Nick Thomas Date: Wed, 25 Mar 2020 00:23:28 +0000 Subject: [PATCH] Add stubs for unknown widget types --- internal/menus/menus.go | 15 ++++++++++++++ internal/ordoor/interfaces.go | 26 +++++++++++++++++++++++- internal/ui/buttons.go | 7 +++++++ internal/ui/driver.go | 37 ++++++++++++++++++++++++++++++++++- 4 files changed, 83 insertions(+), 2 deletions(-) diff --git a/internal/menus/menus.go b/internal/menus/menus.go index 377d046..8893894 100644 --- a/internal/menus/menus.go +++ b/internal/menus/menus.go @@ -15,14 +15,29 @@ type MenuType int const ( TypeStatic MenuType = 0 TypeMenu MenuType = 1 + TypeDragMenu MenuType = 2 // Only seen in Configure_Vehicle_{Chaos,Ultra} TypeSimpleButton MenuType = 3 + TypeDoorHotspot MenuType = 30 // Like a button I guess? FONTTYPE is animation speed + TypeUnknown1 MenuType = 31 // ??? Needed for ChaEquip.mnu + TypeLineKbd MenuType = 40 + TypeThumb MenuType = 45 + TypeLineBriefing MenuType = 41 TypeInvokeButton MenuType = 50 + TypeSquadButton MenuType = 60 // Maybe? Appears in Arrange.mnu TypeOverlay MenuType = 61 TypeHypertext MenuType = 70 TypeCheckbox MenuType = 91 + TypeEditBox MenuType = 100 + TypeInventorySelect MenuType = 110 + TypeRadioButton MenuType = 120 + TypeDropdownButton MenuType = 200 + TypeComboBoxItem MenuType = 205 TypeAnimationSample MenuType = 220 + TypeAnimationToo MenuType = 221 // No idea why we have two of these. FONTTYPE is animation speed. TypeMainButton MenuType = 228 TypeSlider MenuType = 232 + TypeStatusBar MenuType = 233 + TypeDialogue MenuType = 300 ) type Record struct { diff --git a/internal/ordoor/interfaces.go b/internal/ordoor/interfaces.go index 0182846..e4bec2d 100644 --- a/internal/ordoor/interfaces.go +++ b/internal/ordoor/interfaces.go @@ -43,6 +43,11 @@ func (o *Ordoor) optionsDriver(main *ui.Driver) (*ui.Driver, error) { return nil, err } + kbd, err := o.keyboardDriver(options) + if err != nil { + return nil, err + } + if err := o.configIntoOptions(options); err != nil { return nil, err } @@ -59,7 +64,8 @@ func (o *Ordoor) optionsDriver(main *ui.Driver) (*ui.Driver, error) { 50: 50, 60: 60, 70: 70, 80: 80, } - try(options.OnClick("2.8", func() {}), &err) // Keyboard settings button + try(options.OnClick("2.8", func() { o.driver = kbd }), &err) // Keyboard settings button + try(options.ConfigureSlider("2.9", h3Slider), &err) // Resolution slider try(options.ConfigureSlider("2.10", v10Slider), &err) // Music volume slider try(options.ConfigureSlider("2.11", v10Slider), &err) // SFX volume slider @@ -76,6 +82,24 @@ func (o *Ordoor) optionsDriver(main *ui.Driver) (*ui.Driver, error) { return options, err } +func (o *Ordoor) keyboardDriver(options *ui.Driver) (*ui.Driver, error) { + kbd, err := o.buildDriver("keyboard") + if err != nil { + return nil, err + } + + // TODO: implement keybindings save/load behaviour + try(kbd.OnClick("3.1", func() { o.driver = options }), &err) // Done button + try(kbd.OnClick("3.2", func() { o.driver = options }), &err) // Cancel button + try(kbd.OnClick("3.4", func() {}), &err) // Reset to defaults button + + if err != nil { + return nil, err + } + + return kbd, nil +} + // FIXME: exiting is a bit OTT. Perhaps display "save failed"? func acceptOptionsFn(o *Ordoor, main, options *ui.Driver) func() { return func() { diff --git a/internal/ui/buttons.go b/internal/ui/buttons.go index 236524f..66d7a1c 100644 --- a/internal/ui/buttons.go +++ b/internal/ui/buttons.go @@ -14,6 +14,8 @@ func init() { } // A button without hover animation +// FIXME: Keyboard.mnu has TypeSimpleButton instances that seem to include a +// hover in the SpriteId field type button struct { path string @@ -34,6 +36,11 @@ type mainButton struct { } func registerSimpleButton(d *Driver, r *menus.Record) error { + // FIXME: LevelPly.mnu specifies a menu oddly. This tweak gets us past it + if d.Name == "levelply" && r.Id == 2 { + return nil + } + return registerButton(d, r, r.SpriteId[0]) } diff --git a/internal/ui/driver.go b/internal/ui/driver.go index 10e93d1..996942e 100644 --- a/internal/ui/driver.go +++ b/internal/ui/driver.go @@ -15,7 +15,42 @@ import ( func init() { // These menu types don't need driving, so we can ignore them - registerBuilder(menus.TypeMenu, nil) // Menus are just containers + registerBuilder(menus.TypeMenu, nil) // Menus are just containers + registerBuilder(menus.TypeDragMenu, nil) // Menus are just containers + + // FIXME: these need implementing + + // Needed for Keyboard.mnu (main -> options -> keyboard) + registerBuilder(menus.TypeLineKbd, nil) + registerBuilder(menus.TypeDialogue, nil) + + // Needed for Arrange.mnu (???) + registerBuilder(menus.TypeSquadButton, nil) + registerBuilder(menus.TypeAnimationToo, nil) + + // Needed for Bridge.mnu + registerBuilder(menus.TypeDoorHotspot, nil) + + // Needed for Briefing.mnu + registerBuilder(menus.TypeLineBriefing, nil) + + // Needed for ChaEquip.mnu + registerBuilder(menus.TypeUnknown1, nil) + registerBuilder(menus.TypeThumb, nil) + registerBuilder(menus.TypeInventorySelect, nil) + + // Needed for MainGameChaos.mnu + registerBuilder(menus.TypeStatusBar, nil) + + // Needed for Multiplayer_Choose.mnu + registerBuilder(menus.TypeComboBoxItem, nil) + registerBuilder(menus.TypeDropdownButton, nil) + + // Needed for Multiplayer_Configure.mnu + registerBuilder(menus.TypeEditBox, nil) + + // Needed for Multiplayer_Connect.mnu + registerBuilder(menus.TypeRadioButton, nil) } const (