diff --git a/cardsim/terminalui.go b/cardsim/terminalui.go index 22e3e79..ae9aac6 100644 --- a/cardsim/terminalui.go +++ b/cardsim/terminalui.go @@ -27,7 +27,8 @@ func RunSimpleTerminalUI[C StatsCollection](p *Player[C]) error { if p.DebugLevel < 1 && IsSeriousError(err) { return err } - displayAndWait(msg) + display(msg) + wait() } review(p) @@ -43,12 +44,11 @@ func RunSimpleTerminalUI[C StatsCollection](p *Player[C]) error { return nil } -func displayAndWait(m Message) { +func display(m Message) { if m == nil { return } fmt.Println(m.String()) - wait() } func wait() { @@ -58,67 +58,69 @@ func wait() { } func pickNextAction[C StatsCollection](p *Player[C]) (isCard bool, cardIdx int, choiceIdx int) { - cls() - needsDivider := displayMessageSection(p) - if needsDivider { - divider() - } - displayOnePanel(p, p.Prompt) - actionsOffset := displayStatsMenu(p) - handOffset := displayPermanentActionsMenu(p, actionsOffset) - max := displayHandMenu(p, handOffset) - - divider() - var input string - fmt.Printf("Show just (M)essages, (S)tats, (A)ctions, make a choice (1-%d), or (Q)uit? >", max+1) - fmt.Scanln(&input) - input = strings.TrimSpace(input) - input = strings.ToLower(input) - switch input { - // Special cases - case "m": + for { cls() - displayMessageSection(p) - wait() - case "s": - statsMode(p) - case "a": - actionsMode(p) - case "q": - confirmQuit() - default: - i, err := strconv.Atoi(input) - if err != nil { - fmt.Println("Sorry, I don't understand.") - wait() - return pickNextAction(p) + needsDivider := displayMessageSection(p) + if needsDivider { + divider() } - if i > max { - fmt.Println("That's not a valid action.") + displayOnePanel(p, p.Prompt) + actionsOffset := displayStatsMenu(p) + handOffset := displayPermanentActionsMenu(p, actionsOffset) + max := displayHandMenu(p, handOffset) + + divider() + var input string + fmt.Printf("Show just (M)essages, (S)tats, (A)ctions, make a choice (1-%d), or (Q)uit? >", max+1) + fmt.Scanln(&input) + input = strings.TrimSpace(input) + input = strings.ToLower(input) + switch input { + // Special cases + case "m": + cls() + displayMessageSection(p) wait() - return pickNextAction(p) - } - i -= 1 - if i < actionsOffset { - cls() - DisplayOnePanelAndWait(p, i) - } else if i < handOffset { - cls() - i -= actionsOffset - option, ok := promptPermanentAction(p, i) - if ok { - return false, i, option + case "s": + statsMode(p) + case "a": + actionsMode(p) + case "q": + confirmQuit() + default: + i, err := strconv.Atoi(input) + if err != nil { + fmt.Println("Sorry, I don't understand.") + wait() + return pickNextAction(p) } - } else { - cls() - i -= handOffset - option, ok := promptCard(p, i) - if ok { - return true, i, option + if i > max { + fmt.Println("That's not a valid action.") + wait() + return pickNextAction(p) + } + i -= 1 + if i < actionsOffset { + cls() + displayOnePanel(p, p.InfoPanels[i]) + wait() + } else if i < handOffset { + cls() + i -= actionsOffset + option, ok := promptPermanentAction(p, i) + if ok { + return false, i, option + } + } else { + cls() + i -= handOffset + option, ok := promptCard(p, i) + if ok { + return true, i, option + } } } } - return pickNextAction(p) } func cls() { @@ -162,6 +164,14 @@ func displayOnePanel[C StatsCollection](p *Player[C], panel InfoPanel[C]) error if IsSeriousError(err) { return errs.Emit() } - displayAndWait(MultiMessage(m)) + display(MultiMessage(m)) return errs.Emit() } + +func displayMessageSection[C StatsCollection](p *Player[C]) bool { + if len(p.TemporaryMessages) == 0 { + return false + } + display(MultiMessage(p.TemporaryMessages)) + return true +}