Restructure loop, basic display functions
This commit is contained in:
		| @@ -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 | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user