package dynamic import ( "encoding/json" "fmt" "os" coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects" descriptors "github.com/DegustatorPonos/RuinesOfRafdolon/Dynamic/Descriptors" ui "github.com/DegustatorPonos/RuinesOfRafdolon/UI" rl "github.com/gen2brain/raylib-go/raylib" ) const MenusDirName string = "Menus" const RefreshButton int32 = rl.KeyF5 // Represents a menu variant that is loaded from a file type DynamicMenu struct { FileLocation string baseMenu *ui.Menu manager *coreobjects.SceneManager } func (base *DynamicMenu) Create(manager *coreobjects.SceneManager) { var err = base.LoadMenu() if err != nil { rl.TraceLog(rl.LogWarning, "Failed to load the menu from the file %v: %v", base.FileLocation, err.Error()) base.baseMenu = &ui.Menu { Contents: &ui.Void{}, } } base.manager = manager base.baseMenu.Create(manager) } func (base *DynamicMenu) GetUpdateFunctions() []coreobjects.UpdateFunction { return []coreobjects.UpdateFunction{} } func (base *DynamicMenu) Destroy() { base.baseMenu.Destroy() } func (base *DynamicMenu) Update() { if rl.IsKeyReleased(RefreshButton) { rl.TraceLog(rl.LogInfo, "Reloading the menu '%v'...", base.FileLocation) var err = base.Reload() if err != nil { rl.TraceLog(rl.LogWarning, "Failed to reload a dynamic menu '%v': %v", base.FileLocation, err.Error()) } } base.baseMenu.Update() } func (base *DynamicMenu) Draw() { base.baseMenu.Draw() } func (base *DynamicMenu) GetMousePosition() rl.Vector2 { return rl.GetMousePosition() } func (base *DynamicMenu) String() string { var outp, jsonErr = json.Marshal(base) if jsonErr != nil { return fmt.Sprintf("Failed to parse: %s", jsonErr.Error()) } return string(outp) } // Loads the menu from the file. Does not initialize it func (base *DynamicMenu) LoadMenu() error { var parsed, parseErr = base.readMenu() if parseErr != nil { return parseErr } base.baseMenu = parsed return nil } func (base *DynamicMenu) Reload() error { var parsed, parseErr = base.readMenu() if parseErr != nil { return parseErr } base.baseMenu.Destroy() base.baseMenu = parsed base.baseMenu.Create(base.manager) return nil } // Tries to read a base menu from the file func (base *DynamicMenu) readMenu() (*ui.Menu, error) { var file, fErr = os.ReadFile(base.FileLocation) if fErr != nil { return nil, fErr } var descriptor = descriptors.MenuDescriptor{} if jsonErr := json.Unmarshal(file, &descriptor); jsonErr != nil { return nil, jsonErr } return descriptor.Parse() }