]> git.lizzy.rs Git - furrybot.git/blob - waifu.lua
Japanese waifu names
[furrybot.git] / waifu.lua
1 local http, env, storage
2 local C = minetest.get_color_escape_sequence
3
4 furrybot.hiragana = {
5         map = {},
6         probability = {},
7 }
8
9 function furrybot.get_waifu_name()
10         local r = math.floor(1
11                 + math.random()
12                 + math.random()
13                 + math.random()
14                 + math.random()
15                 + math.random()
16         )
17
18         local jp = ""
19
20         for i = 1, r do
21                 jp = jp .. furrybot.hiragana.list[math.random(#furrybot.hiragana.list)]
22         end
23
24         local en = ""
25
26         for i = 1, r do
27                 local combo = furrybot.hiragana.map[utf8.sub(jp, i, i + 1)]
28
29                 if combo then
30                         en = en .. combo
31                         i = i + 1
32                 else
33                         en = en .. furrybot.hiragana.map[utf8.sub(jp, i, i)]
34                 end
35         end
36
37         return jp .. " (" .. furrybot.uppercase(en) .. ")"
38 end
39
40 function furrybot.random_distribution(tbl)
41         local accum = 0
42         local edges = {}
43
44         for i, v in ipairs(tbl) do
45                 accum = accum + v[2]
46                 edges[i] = accum
47         end
48
49         local r = math.random(accum)
50
51         for i, v in ipairs(tbl) do
52                 if r <= edges[i] then
53                         return v[1]
54                 end
55         end
56 end
57
58 function furrybot.get_waifu_species()
59         return furrybot.random_distribution({
60                 {nil, 100},                     -- Human
61                 {"Catgirl", 15},
62                 {"Foxgirl", 15},
63                 {"Wolfgirl", 15},
64                 {"Orc", 5},
65                 {"Elb", 5},
66                 {"Dwarf", 5},
67                 {"Femboy", 3},
68                 {"Apache Helicopter", 1},
69                 {"C++ Programmer", 1},
70         })
71 end
72
73 function furrybot.get_waifu_gender()
74         return furrybot.random_distribution({
75                 {"Male", 50},
76                 {"Female", 50},
77                 {"nil", 1},
78         })
79 end
80
81 function furrybot.get_waifu_hair()
82         return furrybot.random_distribution({
83                 {{"Brown", "#DDAE92"}, 25},
84                 {{"Black", "#433F3A"}, 25},
85                 {{"Blonde", "#ECC87E"}, 20},
86                 {{"Red", "#E2887F"}, 10},
87         })
88 end
89
90 function furrybot.get_waifu_eyes()
91         return furrybot.random_distribution({
92                 {{"Brown", "#463230"}, 15},
93                 {{"Blue", "#97C6FE"}, 10},
94                 {{"Green", "#36CC4E"}, 5},
95         })
96 end
97
98 function furrybot.get_waifu_age()
99         local agetab = furrybot.random_distribution({
100                 {{200, 600}, 25}, -- deamon
101                 {{1000, 2000}, 5}, -- next level deamon
102                 {{12, 16}, 50}, -- teen loli
103                 {{18, 19}, 5}, -- legal loli
104                 {{5, 9}, 5}, -- true loli
105                 {nil, 1}, -- unknown
106         })
107
108         return agetab and math.random(agetab[1], agetab[2])
109 end
110
111 function furrybot.get_waifu(id)
112         id = id or math.random(0, 32767)
113
114         math.randomseed(id)
115
116         local waifu = {
117                 id = id,
118                 name = furrybot.get_waifu_name(),
119                 species = furrybot.get_waifu_species(),
120                 gender = furrybot.get_waifu_gender(),
121                 hair = furrybot.get_waifu_hair(),
122                 eyes = furrybot.get_waifu_eyes(),
123                 age = furrybot.get_waifu_age(),
124         }
125
126         math.randomseed(os.time() + os.clock() + math.random())
127
128         return waifu
129 end
130
131 furrybot.commands.waifu = {
132         func = function(name, id)
133                 local waifu = furrybot.get_waifu(tonumber(id or ""))
134                 furrybot.send(waifu.name
135                         .. furrybot.colors.system .. (waifu.species and " | Species: " .. furrybot.colors.random .. waifu.species or "")
136                         .. furrybot.colors.system .. " | Age: " .. furrybot.colors.random .. (waifu.age or "Unknown")
137                         .. furrybot.colors.system .. " | Gender: " .. furrybot.colors.random .. waifu.gender
138                         .. furrybot.colors.system .. " | " .. C(waifu.hair[2]) .. waifu.hair[1] .. furrybot.colors.system .. " Hair"
139                         .. furrybot.colors.system .. " | " .. C(waifu.eyes[2]) .. waifu.eyes[1] .. furrybot.colors.system .. " Eyes"
140                         .. furrybot.colors.system .. " | " .. "#" .. waifu.id .. ""
141                 , furrybot.colors.random)
142         end,
143 }
144
145 return function(_http, _env, _storage)
146         http, env, storage = _http, _env, _storage
147
148         local function read_file(path)
149                 local f = env.io.open("clientmods/furrybot/" .. path, "r")
150                 local data = f:read("*a")
151                 f:close()
152
153                 return data
154         end
155
156         furrybot.hiragana.map = minetest.deserialize(read_file("hiragana"))
157         furrybot.hiragana.list = {}
158
159         local src = read_file("Japanese-Lipsum.txt")
160
161         for i = 1, #src do
162                 local c = utf8.sub(src, i, i)
163
164                 if furrybot.hiragana.map[c] then
165                         table.insert(furrybot.hiragana.list, c)
166                 end
167         end
168 end