gnoface.gno

2.05 Kb ยท 124 lines
  1package gnoface
  2
  3import (
  4	"math/rand"
  5	"strconv"
  6	"strings"
  7
  8	"gno.land/p/demo/entropy"
  9	"gno.land/p/demo/ufmt"
 10)
 11
 12func Render(path string) string {
 13	seed := uint64(entropy.New().Value())
 14
 15	path = strings.TrimSpace(path)
 16	if path != "" {
 17		s, err := strconv.Atoi(path)
 18		if err != nil {
 19			panic(err)
 20		}
 21		seed = uint64(s)
 22	}
 23
 24	output := ufmt.Sprintf("Gnoface #%d\n", seed)
 25	output += "```\n" + Draw(seed) + "```\n"
 26	return output
 27}
 28
 29func Draw(seed uint64) string {
 30	var (
 31		hairs = []string{
 32			"     s",
 33			"  .......",
 34			"   s s s",
 35			"   /\\ /\\",
 36			"  |||||||",
 37		}
 38		headtop = []string{
 39			" /-------\\",
 40			" /~~~~~~~\\",
 41			" /|||||||\\",
 42			" ////////\\",
 43			" |||||||||",
 44			" /\\\\\\\\\\\\\\\\",
 45		}
 46		headspace = []string{
 47			" |       |",
 48		}
 49		eyebrow = []string{
 50			"~",
 51			"*",
 52			"_",
 53			".",
 54		}
 55		ear = []string{
 56			"o",
 57			" ",
 58			"D",
 59			"O",
 60			"<",
 61			">",
 62			".",
 63			"|",
 64			")",
 65			"(",
 66		}
 67		eyesmiddle = []string{
 68			"| o   o |",
 69			"| o   _ |",
 70			"| _   o |",
 71			"| .   . |",
 72			"| O   O |",
 73			"| v   v |",
 74			"| X   X |",
 75			"| x   X |",
 76			"| X   D |",
 77			"| ~   ~ |",
 78		}
 79		nose = []string{
 80			" |   o   |",
 81			" |   O   |",
 82			" |   V   |",
 83			" |   L   |",
 84			" |   C   |",
 85			" |   ~   |",
 86			" |  . .  |",
 87			" |   .   |",
 88		}
 89		mouth = []string{
 90			" |  __/  |",
 91			" |  \\_/  |",
 92			" |   .   |",
 93			" |  ___  |",
 94			" |  ~~~  |",
 95			" |  ===  |",
 96			" |  <=>  |",
 97		}
 98		headbottom = []string{
 99			" \\-------/",
100			" \\~~~~~~~/",
101			" \\_______/",
102		}
103	)
104
105	r := rand.New(rand.NewPCG(seed, 0xdeadbeef))
106
107	return pick(r, hairs) + "\n" +
108		pick(r, headtop) + "\n" +
109		pick(r, headspace) + "\n" +
110		" | " + pick(r, eyebrow) + "   " + pick(r, eyebrow) + " |\n" +
111		pick(r, ear) + pick(r, eyesmiddle) + pick(r, ear) + "\n" +
112		pick(r, headspace) + "\n" +
113		pick(r, nose) + "\n" +
114		pick(r, headspace) + "\n" +
115		pick(r, mouth) + "\n" +
116		pick(r, headspace) + "\n" +
117		pick(r, headbottom) + "\n"
118}
119
120func pick(r *rand.Rand, slice []string) string {
121	return slice[r.IntN(len(slice))]
122}
123
124// based on https://github.com/moul/pipotron/blob/master/dict/ascii-face.yml