diff --git a/main.go b/main.go index b3f2728..4803a02 100644 --- a/main.go +++ b/main.go @@ -4,12 +4,20 @@ import ( "os" "fmt" "strings" + "math/bits" ) func main() { - var seed uint64 - fmt.Sscanf(os.Args[1], "%llu", seed) - fmt.Println(maleAvatar(seed)) + fmt.Println(makeAvatar(os.Args[1])) +} + +func makeAvatar (seed_string string) string { + var seed uint64 = 0 + for _, c := range []byte(seed_string) { + seed = bits.RotateLeft64(seed, 8) + seed ^= uint64(c) + } + return femaleAvatar(seed) } @@ -267,3 +275,167 @@ func maleAvatar (seed uint64) string { return strings.NewReplacer(m...).Replace(s) } +func femaleAvatar (seed uint64) string { + var g = LinearCongruentialGenerator(seed) + + var skinColor = g.pickone([]string { "#FFDBAC", "#F5CFA0", "#EAC393", "#E0B687", "#CB9E6E", "#B68655", "#A26D3D", "#8D5524" }) + var hairColor = Color(g.pickone([]string { "#090806", "#2c222b", "#71635a", "#b7a69e", "#d6c4c2", "#cabfb1", "#dcd0ba", "#fff5e1", + "#e6cea8", "#e5c8a8", "#debc99", "#b89778", "#a56b46", "#b55239", "#8d4a43", "#91553d", + "#533d32", "#3b3024", "#554838", "#4e433f", "#504444", "#6a4e42", "#a7856a", "#977961" })).brighterOrDarkerThan(*Color(skinColor), 17) + var eyesColor = g.pickone([]string { "#76778b", "#697b94", "#647b90", "#5b7c8b", "#588387" }) + var eyebrowsColor = Color(Color(hairColor).darkerThan(*Color(skinColor), 7)).darkerThan(*Color(hairColor), 10) + var accessoriesColor = g.pickone([]string { "#daa520", "#ffd700", "#eee8aa", "#fafad2", "#d3d3d3", "#a9a9a9" }) + var mouthColor = Color(g.pickone([]string { "#dbac98", "#d29985", "#c98276", "#e35d6a", "#e32153", "#de0f0d" })).brighterOrDarkerThan(*Color(skinColor), 10) + var glassesColor = g.pickone([]string { "#5f705c", "#43677d", "#5e172d", "#ffb67a", "#a04b5d", "#191919", "#323232", "#4b4b4b" }); + var clothesColor = g.pickone([]string { "#d11141", "#00b159", "#00aedb", "#f37735", "#ffc425", "#740001", "#ae0001", "#eeba30", + "#96ceb4", "#ffeead", "#ff6f69", "#ffcc5c", "#88d8b0" }) + var hatColor = g.pickone([]string { "#cc6192", "#2663a3", "#a62116", "#3d8a6b", "#614f8a" }) + + var mood = "" + if mood == "" { + mood = g.pickone([]string { "sad", "happy", "surprised" }) + } + var mouth string + if mood == "sad" { + mouth = "" + + "" + + "" + + "" + } else if mood == "happy" { + mouth = "" + + "" + + "" + + "" + + "" + + "" + + "" + } else if mood == "surprised" { + mouth = "" + + "" + } + + var s = strings.Join([]string { + "", + // Head + "", + // Eyes + g.pickone([]string { + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + }), + // Eyebrows + g.pickone([]string { + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + }), + // Accessories (15% chance) + g.pick_a_or_b(0.15, + g.pickone([]string { + "", + "", + "", + "", + }), + ""), + // Mouth + mouth, + // Glasses (25% chance) + g.pick_a_or_b(0.25, + g.pickone([]string { + "", + "", + "", + "", + "", + "", + "", + }), + ""), + // Clothes + g.pickone([]string { + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + }), + // Hair + g.pickone([]string { + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + }), + // Hat (5% chance) + g.pick_a_or_b(0.05, + g.pickone([]string { + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + }), + ""), + "", + }, "") + + m := []string{ + "${skinColor}", skinColor, + "${hairColor}", hairColor, + "${eyesColor}", eyesColor, + "${eyebrowsColor}", eyebrowsColor, + "${accessoriesColor}", accessoriesColor, + "${mouthColor}", mouthColor, + "${glassesColor}", glassesColor, + "${clothesColor}", clothesColor, + "${hatColor}", hatColor, + } + return strings.NewReplacer(m...).Replace(s) +} +