/* Copyright © Brian Buller Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package widgets import ( "fmt" "time" "unicode" "github.com/gdamore/tcell" ) // ArtWidget displays it's text as ascii art. type ArtWidget struct { id string style tcell.Style x, y int w, h int buffer *Buffer active bool visible bool focusable bool font string text string keyMap *KeyMap allFonts []ArtWidgetFont currFont ArtWidgetFont logger func(string, ...any) } var _ Widget = (*ArtWidget)(nil) func NewArtWidget(id string, st tcell.Style) *ArtWidget { ret := &ArtWidget{} ret.Init(id, st) return ret } func (w *ArtWidget) Init(id string, st tcell.Style) { w.id = id w.visible = true w.style = st w.keyMap = BlankKeyMap() w.initFonts() } func (w *ArtWidget) Id() string { return w.id } func (w *ArtWidget) HandleResize(ev *tcell.EventResize) { w.w, w.h = ev.Size() } func (w *ArtWidget) GetKeyMap() *KeyMap { return w.keyMap } func (w *ArtWidget) SetKeyMap(km *KeyMap) { w.keyMap = km } func (w *ArtWidget) HandleKey(ev *tcell.EventKey) bool { return false } func (w *ArtWidget) HandleTime(ev *tcell.EventTime) {} func (w *ArtWidget) Draw(screen tcell.Screen) { if !w.visible { return } w.buffer.Draw(w.x, w.y, screen) } func (w *ArtWidget) Active() bool { return w.active } func (w *ArtWidget) SetActive(a bool) { w.active = a } func (w *ArtWidget) Visible() bool { return w.visible } func (w *ArtWidget) SetVisible(v bool) { w.visible = v } func (w *ArtWidget) Focusable() bool { return w.focusable } func (w *ArtWidget) SetFocusable(t bool) { w.focusable = t } func (w *ArtWidget) SetX(x int) { w.x = x } func (w *ArtWidget) SetY(y int) { w.y = y } func (w *ArtWidget) GetX() int { return w.x } func (w *ArtWidget) GetY() int { return w.y } func (w *ArtWidget) GetPos() Coord { return Coord{X: w.x, Y: w.y} } func (w *ArtWidget) SetPos(pos Coord) { w.x, w.y = pos.X, pos.Y } func (w *ArtWidget) SetSize(size Coord) { w.w, w.h = size.X, size.Y } func (w *ArtWidget) SetW(wd int) { w.w = wd } func (w *ArtWidget) SetH(h int) { w.h = h } func (w *ArtWidget) GetW() int { return w.w } func (w *ArtWidget) GetH() int { return w.h } func (w *ArtWidget) WantW() int { return w.buffer.Width() } func (w *ArtWidget) WantH() int { return w.buffer.Height() } func (w *ArtWidget) MinW() int { return w.buffer.Width() } func (w *ArtWidget) MinH() int { return w.buffer.Height() } func (w *ArtWidget) SetText(txt string) { w.text = txt w.buildBuffer() } func (w *ArtWidget) GetText() string { return w.text } func (w *ArtWidget) SetFont(fnt string) { w.font = fnt w.buildBuffer() } func (w *ArtWidget) GetFont() string { return w.font } func (w *ArtWidget) buildBuffer() { b := NewBuffer() x, y := w.x, w.y chX := x for _, ch := range w.text { if ch == '\n' { x = w.x y = b.Height() + 1 continue } rs := w.getRune(ch) var maxX int for rY, ln := range rs { for rX, bt := range ln { b.SetCell(chX+rX, y+rY, *NewCell(bt, w.style)) if chX+rX > maxX { maxX = chX + rX } } } chX = maxX + 1 } w.buffer = b } func (w *ArtWidget) getRune(r rune) [][]rune { return w.currFont.GetRune(r) } func (w *ArtWidget) initFonts() { f := NewArtWidgetFont("miniwi") f.SetRune('a', [][]rune{{' ', ' '}, {'▀', '▌'}, {'█', '▌'}, {' ', ' '}}) f.SetRune('b', [][]rune{{'▌', ' '}, {'▛', '▌'}, {'▙', '▌'}, {' ', ' '}}) f.SetRune('c', [][]rune{{' ', ' '}, {'▛', '▘'}, {'▙', '▖'}, {' ', ' '}}) f.SetRune('d', [][]rune{{' ', '▌'}, {'▛', '▌'}, {'▙', '▌'}, {' ', ' '}}) f.SetRune('e', [][]rune{{' ', ' '}, {'█', '▌'}, {'▙', '▖'}, {' ', ' '}}) f.SetRune('f', [][]rune{{'▐', '▘'}, {'▜', '▘'}, {'▐', ' '}, {' ', ' '}}) f.SetRune('g', [][]rune{{' ', ' '}, {'▛', '▌'}, {'▙', '▌'}, {'▄', '▌'}}) f.SetRune('h', [][]rune{{'▌', ' '}, {'▛', '▌'}, {'▌', '▌'}, {' ', ' '}}) f.SetRune('i', [][]rune{{'▘'}, {'▌'}, {'▌'}, {' '}}) f.SetRune('j', [][]rune{{' ', '▘'}, {' ', '▌'}, {' ', '▌'}, {'▙', '▌'}}) f.SetRune('k', [][]rune{{'▌', ' '}, {'▙', '▘'}, {'▛', '▖'}, {' ', ' '}}) f.SetRune('l', [][]rune{{'▜', ' '}, {'▐', ' '}, {'▐', '▖'}, {' ', ' '}}) f.SetRune('m', [][]rune{{' ', ' ', ' '}, {'▛', '▛', '▌'}, {'▌', '▌', '▌'}, {' ', ' ', ' '}}) f.SetRune('n', [][]rune{{' ', ' '}, {'▛', '▌'}, {'▌', '▌'}, {' ', ' '}}) f.SetRune('o', [][]rune{{' ', ' '}, {'▛', '▌'}, {'▙', '▌'}, {' ', ' '}}) f.SetRune('p', [][]rune{{' ', ' '}, {'▛', '▌'}, {'▙', '▌'}, {'▌', ' '}}) f.SetRune('q', [][]rune{{' ', ' '}, {'▛', '▌'}, {'▙', '▌'}, {' ', '▌'}}) f.SetRune('r', [][]rune{{' ', ' '}, {'▛', '▘'}, {'▌', ' '}, {' ', ' '}}) f.SetRune('s', [][]rune{{' ', ' '}, {'▛', '▘'}, {'▄', '▌'}, {' ', ' '}}) f.SetRune('t', [][]rune{{'▗', ' '}, {'▜', '▘'}, {'▐', '▖'}, {' ', ' '}}) f.SetRune('u', [][]rune{{' ', ' '}, {'▌', '▌'}, {'▙', '▌'}, {' ', ' '}}) f.SetRune('v', [][]rune{{' ', ' '}, {'▌', '▌'}, {'▚', '▘'}, {' ', ' '}}) f.SetRune('w', [][]rune{{' ', ' ', ' '}, {'▌', '▌', '▌'}, {'▚', '▚', '▘'}, {' ', ' ', ' '}}) f.SetRune('x', [][]rune{{' ', ' '}, {'▚', '▘'}, {'▞', '▖'}, {' ', ' '}}) f.SetRune('y', [][]rune{{' ', ' '}, {'▌', '▌'}, {'▙', '▌'}, {'▄', '▌'}}) f.SetRune('z', [][]rune{{' ', ' '}, {'▀', '▌'}, {'▙', '▖'}, {' ', ' '}}) f.SetRune('A', [][]rune{{'▄', '▖'}, {'▌', '▌'}, {'▛', '▌'}, {' ', ' '}}) f.SetRune('B', [][]rune{{'▄', ' '}, {'▙', '▘'}, {'▙', '▘'}, {' ', ' '}}) f.SetRune('C', [][]rune{{'▄', '▖'}, {'▌', ' '}, {'▙', '▖'}, {' ', ' '}}) f.SetRune('D', [][]rune{{'▄', ' '}, {'▌', '▌'}, {'▙', '▘'}, {' ', ' '}}) f.SetRune('E', [][]rune{{'▄', '▖'}, {'▙', '▖'}, {'▙', '▖'}, {' ', ' '}}) f.SetRune('F', [][]rune{{'▄', '▖'}, {'▙', '▖'}, {'▌', ' '}, {' ', ' '}}) f.SetRune('G', [][]rune{{'▄', '▖'}, {'▌', ' '}, {'▙', '▌'}, {' ', ' '}}) f.SetRune('H', [][]rune{{'▖', '▖'}, {'▙', '▌'}, {'▌', '▌'}, {' ', ' '}}) f.SetRune('I', [][]rune{{'▄', '▖'}, {'▐', ' '}, {'▟', '▖'}, {' ', ' '}}) f.SetRune('J', [][]rune{{' ', '▖'}, {' ', '▌'}, {'▙', '▌'}, {' ', ' '}}) f.SetRune('K', [][]rune{{'▖', '▖'}, {'▙', '▘'}, {'▌', '▌'}, {' ', ' '}}) f.SetRune('L', [][]rune{{'▖', ' '}, {'▌', ' '}, {'▙', '▖'}, {' ', ' '}}) f.SetRune('M', [][]rune{{'▖', ' ', ' ', '▖'}, {'▛', '▖', '▞', '▌'}, {'▌', '▝', ' ', '▌'}, {' ', ' ', ' ', ' '}}) f.SetRune('N', [][]rune{{'▖', ' ', '▖'}, {'▛', '▖', '▌'}, {'▌', '▝', '▌'}, {' ', ' ', ' '}}) f.SetRune('O', [][]rune{{'▄', '▖'}, {'▌', '▌'}, {'▙', '▌'}, {' ', ' '}}) f.SetRune('P', [][]rune{{'▄', '▖'}, {'▙', '▌'}, {'▌', ' '}, {' ', ' '}}) f.SetRune('Q', [][]rune{{'▄', '▖'}, {'▌', '▌'}, {'█', '▌'}, {' ', '▘'}}) f.SetRune('R', [][]rune{{'▄', '▖'}, {'▙', '▘'}, {'▌', '▌'}, {' ', ' '}}) f.SetRune('S', [][]rune{{'▄', '▖'}, {'▚', ' '}, {'▄', '▌'}, {' ', ' '}}) f.SetRune('T', [][]rune{{'▄', '▖'}, {'▐', ' '}, {'▐', ' '}, {' ', ' '}}) f.SetRune('U', [][]rune{{'▖', '▖'}, {'▌', '▌'}, {'▙', '▌'}, {' ', ' '}}) f.SetRune('V', [][]rune{{'▖', '▖'}, {'▌', '▌'}, {'▚', '▘'}, {' ', ' '}}) f.SetRune('W', [][]rune{{'▖', ' ', ' ', '▖'}, {'▌', '▞', '▖', '▌'}, {'▛', ' ', '▝', '▌'}, {' ', ' ', ' ', ' '}}) f.SetRune('X', [][]rune{{'▖', '▖'}, {'▚', '▘'}, {'▌', '▌'}, {' ', ' '}}) f.SetRune('Y', [][]rune{{'▖', '▖'}, {'▌', '▌'}, {'▐', ' '}, {' ', ' '}}) f.SetRune('Z', [][]rune{{'▄', '▖'}, {'▗', '▘'}, {'▙', '▖'}, {' ', ' '}}) f.SetRune(' ', [][]rune{{' ', ' '}, {' ', ' '}, {' ', ' '}, {' ', ' '}}) w.allFonts = append(w.allFonts, *f) w.currFont = *f } func (w *ArtWidget) SetLogger(l func(string, ...any)) { w.logger = l } func (w *ArtWidget) Log(txt string, args ...any) { if w.logger != nil { txt = fmt.Sprintf("%s:%s", time.Now().Format(time.TimeOnly), txt) w.logger(txt, args...) } } type ArtWidgetFont struct { name string runes map[rune][][]rune } func NewArtWidgetFont(nm string) *ArtWidgetFont { return &ArtWidgetFont{ name: nm, runes: make(map[rune][][]rune), } } func (f *ArtWidgetFont) HasLower() bool { // Naively just check if the map has an 'a' element _, ok := f.runes['a'] return ok } func (f *ArtWidgetFont) SetRune(r rune, bts [][]rune) { f.runes[r] = bts } func (f *ArtWidgetFont) GetRune(r rune) [][]rune { if bts, ok := f.runes[r]; ok { return bts } if bts, ok := f.runes[unicode.ToUpper(r)]; ok { return bts } if bts, ok := f.runes[unicode.ToLower(r)]; ok { return bts } return [][]rune{} } func (f *ArtWidgetFont) RuneWidth(r rune) int { bts := f.GetRune(r) if len(bts) > 0 { return len(bts[0]) } return 0 } func (f *ArtWidgetFont) RuneHeight(r rune) int { return len(f.GetRune(r)) } /* # Big ## Uppercase ____ _____ _____ ______ ______ _____ _ _ _____ _ _ __ __ _ _ ____ _____ ____ _____ _____ _______ _ ___ ____ ____ ____ ________ /\ | _ \ / ____| __ \| ____| ____/ ____| | | |_ _| | | | | \/ | \ | |/ __ \| __ \ / __ \| __ \ / ____|__ __| | | \ \ / /\ \ / /\ \ / /\ \ / /___ / / \ | |_) | | | | | | |__ | |__ | | __| |__| | | | | | | | \ / | \| | | | | |__) | | | | |__) | (___ | | | | | |\ \ / / \ \ /\ / / \ V / \ \_/ / / / / /\ \ | _ <| | | | | | __| | __|| | |_ | __ | | | _ | | | | |\/| | . ` | | | | ___/| | | | _ / \___ \ | | | | | | \ \/ / \ \/ \/ / > < \ / / / / ____ \| |_) | |____| |__| | |____| | | |__| | | | |_| || |__| | |____| | | | |\ | |__| | | | |__| | | \ \ ____) | | | | |__| | \ / \ /\ / / . \ | | / /__ /_/ \_\____/ \_____|_____/|______|_| \_____|_| |_|_____\____/|______|_| |_|_| \_|\____/|_| \___\_\_| \_\_____/ |_| \____/ \/ \/ \/ /_/ \_\ |_| /_____| ## Lowercase _ _ __ _ _ _ _ _ _ | | | | / _| | | (_|_) | | | | | __ _| |__ ___ __| | ___| |_ __ _| |__ _ _| | _| |_ __ ___ _ __ ___ _ __ __ _ _ __ ___| |_ _ ___ ____ ____ ___ _ ____ / _` | '_ \ / __/ _` |/ _ \ _/ _` | '_ \| | | |/ / | '_ ` _ \| '_ \ / _ \| '_ \ / _` | '__/ __| __| | | \ \ / /\ \ /\ / /\ \/ / | | |_ / | (_| | |_) | (_| (_| | __/ || (_| | | | | | | <| | | | | | | | | | (_) | |_) | (_| | | \__ \ |_| |_| |\ V / \ V V / > <| |_| |/ / \__,_|_.__/ \___\__,_|\___|_| \__, |_| |_|_| |_|\_\_|_| |_| |_|_| |_|\___/| .__/ \__, |_| |___/\__|\__,_| \_/ \_/\_/ /_/\_\\__, /___| __/ | _/ | | | | | __/ | |___/ |__/ |_| |_| |___/ # BlurVision ░▒▓██████▓▒░░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓███████▓▒░░▒▓████████▓▒░▒▓████████▓▒░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓██████████████▓▒░░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓███████▓▒░ ░▒▓███████▓▒░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓████████▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓██▓▒░ ░▒▓████████▓▒░▒▓███████▓▒░░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓██████▓▒░ ░▒▓██████▓▒░░▒▓█▓▒▒▓███▓▒░▒▓████████▓▒░▒▓█▓▒░ ░▒▓█▓▒░▒▓███████▓▒░░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ ░▒▓██████▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░ ░▒▓██████▓▒░ ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▓�▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓███████▓▒░░▒▓████████▓▒░▒▓█▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░░▒▓█▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ ░▒▓█▓▒░ ░▒▓██████▓▒░ ░▒▓██▓▒░ ░▒▓█████████████▓▒░░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓████████▓▒░ ░▒▓█▓▒░ ░▒▓██▓▒░ # Bulbhead __ ____ ___ ____ ____ ____ ___ _ _ ____ ____ _ _ __ __ __ _ _ _____ ____ _____ ____ ___ ____ __ __ _ _ _ _ _ _ _ _ ____ /__\ ( _ \ / __)( _ \( ___)( ___)/ __)( )_( )(_ _) (_ _)( )/ )( ) ( \/ )( \( )( _ )( _ \( _ )( _ \/ __)(_ _)( )( )( \/ )( \/\/ )( \/ )( \/ )(_ ) /(__)\ ) _ <( (__ )(_) ))__) )__)( (_-. ) _ ( _)(_ .-_)( ) ( )(__ ) ( ) ( )(_)( )___/ )(_)( ) /\__ \ )( )(__)( \ / ) ( ) ( \ / / /_ (__)(__)(____/ \___)(____/(____)(__) \___/(_) (_)(____)\____) (_)\_)(____)(_/\/\_)(_)\_)(_____)(__) (___/\\(_)\_)(___/ (__) (______) \/ (__/\__)(_/\_) (__) (____) # Crawford2 ____ ____ __ ___ ___ _____ ____ __ __ ____ ____ __ _ _ ___ ___ ____ ___ ____ ___ ____ _____ ______ __ __ __ __ __ __ __ __ __ __ _____ / || \ / ]| \ / _]| | / || | || || || |/ ]| | | | || \ / \ | \ / \ | \ / ___/| || | || | || |__| || | || | || | | o || o ) / / | \ / [_ | __|| __|| | | | | |__ || ' / | | | _ _ || _ || || o ) || D )( \_ | || | || | || | | || | || | ||__/ | | || |/ / | D || _]| |_ | | || _ | | | __| || \ | |___ | \_/ || | || O || _/| Q || / \__ ||_| |_|| | || | || | | ||_ _|| ~ || __| | _ || O / \_ | || [_ | _] | |_ || | | | |/ | || \| || | || | || || | | || \ / \ | | | | : || : || ` ' || ||___, || / | | | || \ || || || | | || | | | |\ ` || . || || | || | || || | | || . \ \ | | | | | \ / \ / | | || || | |__|__||_____|\____||_____||_____||__| |___,_||__|__||____|\____||__|\_||_____||___|___||__|__| \___/ |__| \__,_||__|\_| \___| |__| \__,_| \_/ \_/\_/ |__|__||____/ |_____| # Doom ## Uppercase ___ ______ ___________ ___________ _____ _ _ _____ ___ _ __ _ ___ ___ _ _ ___________ ___________ _____ _____ _ _ _ _ _ ___ ____ ________ / _ \ | ___ \/ __ \ _ \ ___| ___| __ \| | | |_ _| |_ | | / /| | | \/ || \ | | _ | ___ \ _ | ___ \/ ___|_ _| | | | | | || | | \ \ / /\ \ / /___ / / /_\ \| |_/ /| / \/ | | | |__ | |_ | | \/| |_| | | | | | |/ / | | | . . || \| | | | | |_/ / | | | |_/ /\ `--. | | | | | | | | || | | |\ V / \ V / / / | _ || ___ \| | | | | | __|| _| | | __ | _ | | | | | \ | | | |\/| || . ` | | | | __/| | | | / `--. \ | | | | | | | | || |/\| |/ \ \ / / / | | | || |_/ /| \__/\ |/ /| |___| | | |_\ \| | | |_| |_/\__/ / |\ \| |____| | | || |\ \ \_/ / | \ \/' / |\ \ /\__/ / | | | |_| \ \_/ /\ /\ / /^\ \ | | ./ /___ \_| |_/\____/ \____/___/ \____/\_| \____/\_| |_/\___/\____/\_| \_/\_____/\_| |_/\_| \_/\___/\_| \_/\_\_| \_|\____/ \_/ \___/ \___/ \/ \/\/ \/ \_/ \_____/ ## Lowercase _ _ __ _ _ _ _ _ _ | | | | / _| | | (_|_) | | | | | __ _| |__ ___ __| | ___| |_ __ _| |__ _ _| | _| |_ __ ___ _ __ ___ _ __ __ _ _ __ ___| |_ _ ___ ____ ____ ___ _ ____ / _` | '_ \ / __/ _` |/ _ \ _/ _` | '_ \| | | |/ / | '_ ` _ \| '_ \ / _ \| '_ \ / _` | '__/ __| __| | | \ \ / /\ \ /\ / /\ \/ / | | |_ / | (_| | |_) | (_| (_| | __/ || (_| | | | | | | <| | | | | | | | | | (_) | |_) | (_| | | \__ \ |_| |_| |\ V / \ V V / > <| |_| |/ / \__,_|_.__/ \___\__,_|\___|_| \__, |_| |_|_| |_|\_\_|_| |_| |_|_| |_|\___/| .__/ \__, |_| |___/\__|\__,_| \_/ \_/\_/ /_/\_\\__, /___| __/ | _/ | | | | | __/ | |___/ |__/ |_| |_| |___/ # Epic ## Uppercase _______ ______ _______ ______ _______ _______ _______ __________________ _ _ _______ _ _______ _______ _______ _______ _______ _________ _______ ( ___ )( ___ \ ( ____ \( __ \ ( ____ \( ____ \( ____ \|\ /|\__ __/\__ _/| \ /\( \ ( )( ( /|( ___ )( ____ )( ___ )( ____ )( ____ \\__ __/|\ /||\ /||\ /||\ /||\ /|/ ___ ) | ( ) || ( ) )| ( \/| ( \ )| ( \/| ( \/| ( \/| ) ( | ) ( ) ( | \ / /| ( | () () || \ ( || ( ) || ( )|| ( ) || ( )|| ( \/ ) ( | ) ( || ) ( || ) ( |( \ / )( \ / )\/ ) | | (___) || (__/ / | | | | ) || (__ | (__ | | | (___) | | | | | | (_/ / | | | || || || \ | || | | || (____)|| | | || (____)|| (_____ | | | | | || | | || | _ | | \ (_) / \ (_) / / ) | ___ || __ ( | | | | | || __) | __) | | ____ | ___ | | | | | | _ ( | | | |(_)| || (\ \) || | | || _____)| | | || __)(_____ ) | | | | | |( ( ) )| |( )| | ) _ ( \ / / / | ( ) || ( \ \ | | | | ) || ( | ( | | \_ )| ( ) | | | | | | ( \ \ | | | | | || | \ || | | || ( | | /\| || (\ ( ) | | | | | | | \ \_/ / | || || | / ( ) \ ) ( / / | ) ( || )___) )| (____/\| (__/ )| (____/\| ) | (___) || ) ( |___) (___|\_) ) | / \ \| (____/\| ) ( || ) \ || (___) || ) | (_\ \ || ) \ \__/\____) | | | | (___) | \ / | () () |( / \ ) | | / (_/\ |/ \||/ \___/ (_______/(______/ (_______/|/ (_______)|/ \|\_______/(____/ |_/ \/(_______/|/ \||/ )_)(_______)|/ (____\/_)|/ \__/\_______) )_( (_______) \_/ (_______)|/ \| \_/ (_______/ # Graceful __ ____ ___ ____ ____ ____ ___ _ _ __ __ __ _ __ _ _ __ _ __ ____ __ ____ ____ ____ _ _ _ _ _ _ _ _ _ _ ____ / _\ ( _ \ / __)( \( __)( __)/ __)/ )( \( ) _( )( / )( ) ( \/ )( ( \ / \( _ \ / \ ( _ \/ ___)(_ _)/ )( \/ )( \/ )( \( \/ )( \/ )(__ ) / \ ) _ (( (__ ) D ( ) _) ) _)( (_ \) __ ( )( / \) \ ) ( / (_/\/ \/ \/ /( O )) __/( O ) ) /\___ \ )( ) \/ (\ \/ /\ /\ / ) ( ) / / _/ \_/\_/(____/ \___)(____/(____)(__) \___/\_)(_/(__)\____/(__\_)\____/\_)(_/\_)__) \__/(__) \__\)(__\_)(____/ (__) \____/ \__/ (_/\_)(_/\_)(__/ (____) # Graffiti ## Uppercase _____ ___________________ ________ ______________________________ ___ ___ .___ ____.____ __.____ _____ _______ ________ __________________ __________ ________________________ _______ ______ ______ ________.___.__________ / _ \\______ \_ ___ \\______ \ \_ _____/\_ _____/ _____/ / | \| | | | |/ _| | / \ \ \ \_____ \\______ \_____ \\______ \/ _____/\__ ___/ | \ \ / / \ / \ \/ /\__ | |\____ / / /_\ \| | _/ \ \/ | | \ | __)_ | __)/ \ ___/ ~ \ | | | < | | / \ / \ / | \ / | \| ___// / \ \| _/\_____ \ | | | | /\ Y /\ \/\/ /\ / / | | / / / | \ | \ \____| ` \| \ | \ \ \_\ \ Y / /\__| | | \| |___/ Y \/ | \/ | \ | / \_/. \ | \/ \ | | | | / \ / \ / / \ \____ | / /_ \____|__ /______ /\______ /_______ /_______ / \___ / \______ /\___|_ /|___\________|____|__ \_______ \____|__ /\____|__ /\_______ /____| \_____\ \_/____|_ /_______ / |____| |______/ \___/ \__/\ / /___/\ \ / ______|/_______ \ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \__> \/ \/ \/ \_/ \/ \/ ## Lowercase ___. .___ _____ .__ .__ __ __ .__ __ _____ \_ |__ ____ __| _/_____/ ____\____ | |__ |__| |__| | _| | _____ ____ ____ ______ _____________ _______/ |_ __ _____ ____ _ _____ ______.__.________ \__ \ | __ \_/ ___\ / __ |/ __ \ __\/ ___\| | \| | | | |/ / | / \ / \ / _ \\____ \ / ____/\_ __ \/ ___/\ __\ | \ \/ /\ \/ \/ /\ \/ < | |\___ / / __ \| \_\ \ \___/ /_/ \ ___/| | / /_/ > Y \ | | | <| |_| Y Y \ | ( <_> ) |_> >< <_| | | | \/\___ \ | | | | /\ / \ / > < \___ | / / (____ /___ /\___ >____ |\___ >__| \___ /|___| /__/\__| |__|_ \____/__|_| /___| /\____/| __/ \__ | |__| /____ > |__| |____/ \_/ \/\_/ /__/\_ \/ ____|/_____ \ \/ \/ \/ \/ \/ /_____/ \/ \______| \/ \/ \/ |__| |__| \/ \/\/ \/ # miniwi ## Uppercase ▄▖▄ ▄▖▄ ▄▖▄▖▄▖▖▖▄▖ ▖▖▖▖ ▖ ▖▖ ▖▄▖▄▖▄▖▄▖▄▖▄▖▖▖▖▖▖ ▖▖▖▖▖▄▖ ▌▌▙▘▌ ▌▌▙▖▙▖▌ ▙▌▐ ▌▙▘▌ ▛▖▞▌▛▖▌▌▌▙▌▌▌▙▘▚ ▐ ▌▌▌▌▌▞▖▌▚▘▌▌▗▘ ▛▌▙▘▙▖▙▘▙▖▌ ▙▌▌▌▟▖▙▌▌▌▙▖▌▝ ▌▌▝▌▙▌▌ █▌▌▌▄▌▐ ▙▌▚▘▛ ▝▌▌▌▐ ▙▖ ▘ ## Lowercase ▌ ▌ ▐▘ ▌ ▘ ▘▌ ▜ ▗ ▀▌▛▌▛▘▛▌█▌▜▘▛▌▛▌▌ ▌▙▘▐ ▛▛▌▛▌▛▌▛▌▛▌▛▘▛▘▜▘▌▌▌▌▌▌▌▚▘▌▌▀▌ █▌▙▌▙▖▙▌▙▖▐ ▙▌▌▌▌ ▌▛▖▐▖▌▌▌▌▌▙▌▙▌▙▌▌ ▄▌▐▖▙▌▚▘▚▚▘▞▖▙▌▙▖ ▄▌ ▙▌ ▌ ▌ ▄▌ # Shaded Blocky ░░ ░░░ ░░░░ ░░░ ░░░ ░░ ░░░ ░░░ ░░░░ ░░ ░░ ░░ ░░░░ ░░ ░░░░░░░░ ░░░░ ░░ ░░░ ░░░ ░░░ ░░░░ ░░░ ░░░░ ░░░ ░░ ░░░░ ░░ ░░░░ ░░ ░░░░ ░░ ░░░░ ░░ ░░░░ ░░ ░ ▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒ ▒▒▒ ▒▒▒ ▒▒▒▒▒▒▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒ ▒ ▒▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒▒▒▒▒▒▒ ▒▒ ▓ ▓▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓▓▓▓ ▓▓▓▓▓▓▓▓ ▓▓ ▓ ▓ ▓▓ ▓▓▓▓ ▓▓ ▓▓▓ ▓▓ ▓ ▓▓ ▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓▓ ▓▓▓ ▓▓▓▓ ▓▓▓▓▓▓ ▓▓▓▓▓▓▓ ▓▓▓▓ █ ██ ████ ██ ████ ██ ████ ██ ████████ ████████ ████ ██ ████ █████ █████ ████ ██ ███ ███ ████████ █ █ ██ ██ ██ ████ ██ ████████ ███ ██ ███ █████████ █████ █████ ████ ████ ████ ██ ███ ██ ██████ ██████ ██████ █ ████ ██ ████ ███ ███ ██ █████████ ███ ████ ██ ███ ███ ████ ██ ██ ████ ██ ███ ███ ███ █████████ █ █ ████ ███ ██████ ██████ ██████ █████ ████ ██ ████ █████ █████ █ # Slant ## Uppercase ___ ____ __________ ____________________ ______ ____ __ __ __ ____ ______ ____ ____ ____ _____________ ___ ___ ___ ____ _______ / | / __ )/ ____/ __ \/ ____/ ____/ ____/ / / / _/ / / //_// / / |/ / | / / __ \/ __ \/ __ \ / __ \/ ___/_ __/ / / / | / / | / / |/ /\ \/ /__ / / /| | / __ / / / / / / __/ / /_ / / __/ /_/ // /__ / / ,< / / / /|_/ / |/ / / / / /_/ / / / / / /_/ /\__ \ / / / / / /| | / /| | /| / /| / \ / / / / ___ |/ /_/ / /___/ /_/ / /___/ __/ / /_/ / __ // // /_/ / /| |/ /___/ / / / /| / /_/ / ____/ /_/ / / _, _/___/ // / / /_/ / | |/ / | |/ |/ // | / / / /__ /_/ |_/_____/\____/_____/_____/_/ \____/_/ /_/___/\____/_/ |_/_____/_/ /_/_/ |_/\____/_/ \___\_\/_/ |_|/____//_/ \____/ |___/ |__/|__//_/|_| /_/ /____/ ## Lowercase __ __ ____ __ _ _ __ __ __ ____ _/ /_ _________/ /__ / __/___ _/ /_ (_) (_) /__/ /___ ___ ____ ____ ____ ____ ___________/ /___ ___ ___ ___ ____ ______ / __ `/ __ \/ ___/ __ / _ \/ /_/ __ `/ __ \/ / / / //_/ / __ `__ \/ __ \/ __ \/ __ \/ __ `/ ___/ ___/ __/ / / / | / / | /| / / |/_/ / / /_ / / /_/ / /_/ / /__/ /_/ / __/ __/ /_/ / / / / / / / ,< / / / / / / / / / / /_/ / /_/ / /_/ / / (__ ) /_/ /_/ /| |/ /| |/ |/ />