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()) }