1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152[<RequireQualifiedAccess>]
module rec Duets.Cli.Text.Styles
open Duets.Common
open Duets.Entities
/// Pre-defined style for asking the user for something.
let prompt title = $"[bold blue]{title}[/]"
/// Pre-defined style for errors.
let error text = $"[bold red]{text}[/]"
/// Pre-defined style for actions that cannot be undone.
let danger text = $"[red3]{text}[/]"
/// Pre-defined style for warnings and actions that might have unwanted consequences.
let warning text = $"[orange3]{text}[/]"
/// Pre-defined style for success messages.
let success text = $"[bold green3]{text}[/]"
/// Pre-defined style for showing numbers.
let number (value: int<_>) = System.String.Format("{0:#,0}", value)
/// Pre-defined style for showing decimal numbers.
let decimal (value: decimal<_>) =
System.String.Format("{0:#,##0.00}", value)
/// Pre-defined style for showing money amounts.
let money (amount: Amount) = $"[bold green3]{decimal amount}d$[/]"
/// Pre-defined style for referencing people in text.
let person name = $"[bold lightgreen_1]{name}[/]"
/// Pre-defined style for showing percentages.
let percentage value = $"{value |> Level.from}%%"
/// Pre-defined style for referencing places in text.
let place name = $"[bold lightsalmon1]{name}[/]"
/// Pre-defined style for referencing rooms in text.
let room name = $"[bold salmon1]{name}[/]"
/// Pre-defined style for referencing directions in text.
let direction name = $"[salmon1]{name}[/]"
/// Pre-defined style for referencing items in text.
let item name = $"[bold lightsalmon1]{name}[/]"
/// Pre-defined style for referencing time in text.
let time text = $"[bold grey70]{text}[/]"
/// Pre-defined style for referencing actions in text.
let action name = $"[bold deepskyblue2]{name}[/]"
/// Pre-defined style for referencing objects in text.
let object name = $"[bold cadetblue]{name}[/]"
/// Pre-defined style for referencing bands.
let band name = $"[italic]{name}[/]"
/// Pre-defined style for referencing albums in text.
let album name = $"[bold springgreen2]{name}[/]"
/// Pre-defined style for referencing songs in text.
let song name = album name
/// Pre-defined style for referencing information in text.
let information text = $"[underline]{text}[/]"
/// Pre-defined style for showing text that does not draw attention immediately.
let faded text = $"[grey]{text}[/]"
/// Pre-defined style for events that happen after a turn.
let event = faded
/// Pre-defined style for showing text that is a hint to the user.
let hint = faded
/// Pre-defined style for showing text that draws attention.
let highlight text = $"[bold deepskyblue3]{text}[/]"
/// Pre-defined style for table headers.
let header text = $"[bold]{text}[/]"
/// Pre-defined style for crossed out things.
let crossed text = $"[strikethrough]{text}[/]"
/// Pre-defined style for genres.
let genre text = $"[grey]{text}[/]"
/// Pre-defined style for dialog text.
let dialog text = $"[lightseagreen italic]{text}[/]"
/// Pre-defined style for a metro line that follows the line's color.
let line lineId =
match lineId with
| Blue -> $"[bold deepskyblue2]{lineId}[/]"
| Red -> $"[bold red3]{lineId}[/]"
/// Pre-defined styles for showing a progress step. Shows with a random color.
let progress text =
[ "deepskyblue3"
"deepskyblue3_1"
"dodgerblue1"
"springgreen4"
"springgreen3_1"
"springgreen2_1"
"springgreen1" ]
|> List.sample
|> fun color -> $"[{color}]{text}[/]"
module Level =
/// Pre-defined style for a bad level.
let bad text = $"[red]{text}[/]"
/// Pre-defined style for a normal level.
let normal text = $"[orange1]{text}[/]"
/// Pre-defined style for a good level.
let good text = $"[cadetblue]{text}[/]"
/// Pre-defined style for a great level.
let great text = $"[green3]{text}[/]"
/// Pre-defined styles for showing levels that range from 0 to 100.
let from l =
match l with
| level when level < (LanguagePrimitives.Int32WithMeasure 30) -> bad l
| level when level < (LanguagePrimitives.Int32WithMeasure 60) ->
normal l
| level when level < (LanguagePrimitives.Int32WithMeasure 80) -> good l
| _ -> great l
/// Pre-defined styles for showing levels that are worse the closer they are to 100.
let fromInverted l =
match l with
| level when level < (LanguagePrimitives.Int32WithMeasure 30) -> great l
| level when level < (LanguagePrimitives.Int32WithMeasure 60) -> good l
| level when level < (LanguagePrimitives.Int32WithMeasure 80) ->
normal l
| _ -> bad l
/// Pre-defined style for a title.
let title text = $"[bold underline]{text}[/]"
module Spacing =
/// Adds a new line with a few spaces to align the next line with the
/// previous one in choice prompts.
let choicePromptNewLine = "\n "