aboutsummaryrefslogtreecommitdiff
path: root/internal/game/cmd_colortable.go
blob: d228a340eaee5de6ee2e526b069f0fc8c04bf6bc (plain)
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
package game

import (
	"fmt"
	"strings"

	"thehouseoficarus/internal/color"
	"thehouseoficarus/internal/net"
)

func (g *Game) doColortable(sess *net.Session) {
	mode := g.colorMode(sess)
	if mode == "none" || mode == "" {
		sess.WriteLine("Enable colors first: option color ansi (or xterm256)")
		return
	}

	writeColorBlock(sess, mode, true)
	sess.WriteLine("")
	writeColorBlock(sess, mode, false)
}

func (g *Game) executeColortable(sess *net.Session, args []string, rawInput string) {
	g.doColortable(sess)
}

func writeColorBlock(sess *net.Session, mode string, fg bool) {
	sess.WriteLine("ANSI 16 Colors:")
	writeColorRow(sess, mode, 0, 8, fg)
	writeColorRow(sess, mode, 8, 16, fg)

	sess.WriteLine("Color cube:")
	for blockRow := 0; blockRow < 2; blockRow++ {
		for row := 0; row < 6; row++ {
			var sb strings.Builder
			for block := 0; block < 3; block++ {
				base := 16 + (blockRow*3+block)*36 + row*6
				for col := 0; col < 6; col++ {
					idx := base + col
					if idx > 231 {
						break
					}
					if fg {
						sb.WriteString(color.FgCode(mode, idx))
					} else {
						sb.WriteString(color.ContrastFg(mode, idx))
						sb.WriteString(color.BgCode(mode, idx))
					}
					sb.WriteString(fmt.Sprintf(" %02X", idx))
					sb.WriteString(color.Reset)
				}
				if block < 2 {
					sb.WriteString("  ")
				}
			}
			sess.WriteLine(sb.String())
		}
		if blockRow == 0 {
			sess.WriteLine("")
		}
	}

	sess.WriteLine("Grayscale:")
	writeColorRow(sess, mode, 232, 244, fg)
	writeColorRow(sess, mode, 244, 256, fg)
}

func writeColorRow(sess *net.Session, mode string, start, end int, fg bool) {
	var sb strings.Builder
	for i := start; i < end && i < 256; i++ {
		if fg {
			sb.WriteString(color.FgCode(mode, i))
		} else {
			sb.WriteString(color.ContrastFg(mode, i))
			sb.WriteString(color.BgCode(mode, i))
		}
		sb.WriteString(fmt.Sprintf(" %02X", i))
		sb.WriteString(color.Reset)
	}
	sess.WriteLine(sb.String())
}