func makebox(s tcell.Screen) { w, h := s.Size() if w == 0 || h == 0 { return } glyphs := []rune{'@', '#', '&', '*', '=', '%', 'Z', 'A'} lx := rand.Int() % w ly := rand.Int() % h lw := rand.Int() % (w - lx) lh := rand.Int() % (h - ly) st := tcell.StyleDefault gl := ' ' if s.Colors() > 1 { st = st.Background(tcell.Color(rand.Int() % s.Colors())) } else { st = st.Reverse(rand.Int()%2 == 0) gl = glyphs[rand.Int()%len(glyphs)] } for row := 0; row < lh; row++ { for col := 0; col < lw; col++ { s.SetCell(lx+col, ly+row, st, gl) } } s.Show() }
func drawBox(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style, r rune) { if y2 < y1 { y1, y2 = y2, y1 } if x2 < x1 { x1, x2 = x2, x1 } for col := x1; col <= x2; col++ { s.SetCell(col, y1, style, tcell.RuneHLine) s.SetCell(col, y2, style, tcell.RuneHLine) } for row := y1 + 1; row < y2; row++ { s.SetCell(x1, row, style, tcell.RuneVLine) s.SetCell(x2, row, style, tcell.RuneVLine) } if y1 != y2 && x1 != x2 { // Only add corners if we need to s.SetCell(x1, y1, style, tcell.RuneULCorner) s.SetCell(x2, y1, style, tcell.RuneURCorner) s.SetCell(x1, y2, style, tcell.RuneLLCorner) s.SetCell(x2, y2, style, tcell.RuneLRCorner) } for row := y1 + 1; row < y2; row++ { for col := x1 + 1; col < x2; col++ { s.SetCell(col, row, style, r) } } }
func emitStr(s tcell.Screen, x, y int, style tcell.Style, str string) { for _, c := range str { var comb []rune w := runewidth.RuneWidth(c) if w == 0 { comb = []rune{c} c = ' ' w = 1 } s.SetContent(x, y, c, comb, style) x += w } }
func drawSelect(s tcell.Screen, x1, y1, x2, y2 int, sel bool) { if y2 < y1 { y1, y2 = y2, y1 } if x2 < x1 { x1, x2 = x2, x1 } for row := y1; row <= y2; row++ { for col := x1; col <= x2; col++ { mainc, combc, style, width := s.GetContent(col, row) if style == tcell.StyleDefault { style = defStyle } style = style.Reverse(sel) s.SetContent(col, row, mainc, combc, style) col += width - 1 } } }
func puts(s tcell.Screen, style tcell.Style, x, y int, str string) { i := 0 var deferred []rune dwidth := 0 for _, r := range str { switch runewidth.RuneWidth(r) { case 0: if len(deferred) == 0 { deferred = append(deferred, ' ') dwidth = 1 } case 1: if len(deferred) != 0 { s.SetContent(x+i, y, deferred[0], deferred[1:], style) i += dwidth } deferred = nil dwidth = 1 case 2: if len(deferred) != 0 { s.SetContent(x+i, y, deferred[0], deferred[1:], style) i += dwidth } deferred = nil dwidth = 2 } deferred = append(deferred, r) } if len(deferred) != 0 { s.SetContent(x+i, y, deferred[0], deferred[1:], style) i += dwidth } }
func Puts(s tcell.Screen, style tcell.Style, x, y int, str string) { i := 0 var deferred []rune dwidth := 0 for _, r := range str { switch runewidth.RuneWidth(r) { case 0: if len(deferred) == 0 { deferred = append(deferred, ' ') dwidth = 1 } case 1: if len(deferred) != 0 { s.SetCell(x+i, y, style, deferred...) i += dwidth } deferred = deferred[0:0] dwidth = 1 case 2: if len(deferred) != 0 { s.SetCell(x+i, y, style, deferred...) i += dwidth } deferred = deferred[0:0] dwidth = 2 } deferred = append(deferred, r) } if len(deferred) != 0 { s.SetCell(x+i, y, style, deferred...) i += dwidth } }
func drawSelect(s tcell.Screen, x1, y1, x2, y2 int, sel bool) { if y2 < y1 { y1, y2 = y2, y1 } if x2 < x1 { x1, x2 = x2, x1 } for row := y1; row <= y2; row++ { for col := x1; col <= x2; col++ { if cp := s.GetCell(col, row); cp != nil { st := cp.Style if st == tcell.StyleDefault { st = defStyle } st = st.Reverse(sel) cp.Style = st s.PutCell(col, row, cp) } } } }
func emitStr(s tcell.Screen, x, y int, style tcell.Style, str string) { for _, c := range str { s.SetCell(x, y, style, c) x++ } }
// RegisterFallbacks registers the UTF-8 runes we use in this game with // reasonable (best effort) ASCII fallbacks. func RegisterFallbacks(screen tcell.Screen) { // Register a few fallback runes - best we can do for ASCII screen.RegisterRuneFallback('Ξ', "M") screen.RegisterRuneFallback('Ѧ', "A") screen.RegisterRuneFallback('Ж', "X") screen.RegisterRuneFallback('▖', "\\") screen.RegisterRuneFallback('▗', "/") screen.RegisterRuneFallback('▟', "/") screen.RegisterRuneFallback('▛', "/") screen.RegisterRuneFallback('▙', "\\") screen.RegisterRuneFallback('▜', "\\") screen.RegisterRuneFallback('˄', "^") screen.RegisterRuneFallback('˃', ">") screen.RegisterRuneFallback('˂', "<") screen.RegisterRuneFallback('˅', "v") screen.RegisterRuneFallback('♥', "A") screen.RegisterRuneFallback('─', "-") screen.RegisterRuneFallback('━', "-") screen.RegisterRuneFallback('═', "=") screen.RegisterRuneFallback('⁐', "O") screen.RegisterRuneFallback('•', "*") }