172 lines
3.6 KiB
Lua
172 lines
3.6 KiB
Lua
|
local util = require("itteutil")
|
||
|
|
||
|
|
||
|
local soupe = {
|
||
|
max_ingred = 7,
|
||
|
nouns_file = "nouns.txt",
|
||
|
}
|
||
|
|
||
|
soupe.servings = {
|
||
|
bowl = {
|
||
|
"bronze",
|
||
|
"copper",
|
||
|
"ceramic",
|
||
|
"crystal",
|
||
|
"earthenware",
|
||
|
"golden",
|
||
|
"stone",
|
||
|
"glass",
|
||
|
"plastic",
|
||
|
"silver",
|
||
|
"styrofoam",
|
||
|
"tin",
|
||
|
"tupperware",
|
||
|
},
|
||
|
cauldron = {
|
||
|
"bronze",
|
||
|
"cast iron",
|
||
|
"charred",
|
||
|
"copper",
|
||
|
"golden",
|
||
|
"rusty",
|
||
|
"silver",
|
||
|
},
|
||
|
chalice = {
|
||
|
"bronze",
|
||
|
"copper",
|
||
|
"crystal",
|
||
|
"golden",
|
||
|
"stone",
|
||
|
"silver",
|
||
|
},
|
||
|
cup = {
|
||
|
"bronze",
|
||
|
"copper",
|
||
|
"ceramic",
|
||
|
"crystal",
|
||
|
"earthenware",
|
||
|
"golden",
|
||
|
"glass",
|
||
|
"plastic",
|
||
|
"silver",
|
||
|
"styrofoam",
|
||
|
"tin",
|
||
|
},
|
||
|
mug = {
|
||
|
"ceramic",
|
||
|
"earthenware",
|
||
|
"glass",
|
||
|
"tin",
|
||
|
},
|
||
|
pot = {
|
||
|
"bronze",
|
||
|
"copper",
|
||
|
"ceramic",
|
||
|
"earthenware",
|
||
|
"stone",
|
||
|
"plastic",
|
||
|
"tin",
|
||
|
},
|
||
|
portion = {
|
||
|
"giant",
|
||
|
"large",
|
||
|
"medium",
|
||
|
"small",
|
||
|
"tiny",
|
||
|
},
|
||
|
serving = {
|
||
|
"large",
|
||
|
"small",
|
||
|
},
|
||
|
}
|
||
|
|
||
|
soupe.temps = {
|
||
|
"chilled",
|
||
|
"cold",
|
||
|
"hot",
|
||
|
"scalding hot",
|
||
|
"warm",
|
||
|
}
|
||
|
|
||
|
soupe.articles = {
|
||
|
"brimming with",
|
||
|
"filled with",
|
||
|
"full of",
|
||
|
"glistening with",
|
||
|
"nearly overflowing with",
|
||
|
"of",
|
||
|
}
|
||
|
|
||
|
|
||
|
-- Read a parts of speech file and turn a table of nouns.
|
||
|
function soupe.filter_nouns(mode)
|
||
|
local ns = util.read_file(soupe.nouns_file)
|
||
|
-- The delimiter does not remove the second section of hyphenated words,
|
||
|
-- this is done when looping through the table and comparing the first letter
|
||
|
-- of each word to the previous and next words' first letters. Since the list
|
||
|
-- is in alphabetical order, out-of-order words are excluded.
|
||
|
local nt = util.split_str(ns, "(%a*)[\\N]%S+")
|
||
|
local nouns = {}
|
||
|
if mode == "common" then
|
||
|
for i = 1, #nt do
|
||
|
if (#nt[i] > 4) and
|
||
|
((string.sub(nt[i - 1], 1, 1) == string.sub(nt[i], 1, 1)) or
|
||
|
(string.sub(nt[i], 1, 1) == string.sub(nt[i + 1], 1, 1))) and
|
||
|
(string.match(string.sub(nt[i], 1, 1), "%l") ~= nil) then
|
||
|
table.insert(nouns, nt[i])
|
||
|
end
|
||
|
end
|
||
|
-- Includes both proper and common nouns
|
||
|
else
|
||
|
for i = 1, #nt do
|
||
|
if (#nt[i] > 4) and
|
||
|
((string.sub(nt[i - 1], 1, 1) == string.sub(nt[i], 1, 1)) or
|
||
|
(string.sub(nt[i], 1, 1) == string.sub(nt[i + 1], 1, 1))) then
|
||
|
table.insert(nouns, nt[i])
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return nouns
|
||
|
end
|
||
|
|
||
|
|
||
|
-- Return a string description of soup.
|
||
|
function soupe.make_soup(items)
|
||
|
local ingred = items
|
||
|
if ingred == nil then ingred = math.random(1, soupe.max_ingred) end
|
||
|
local nouns = soupe.filter_nouns("common")
|
||
|
local servings = util.table_keys(soupe.servings)
|
||
|
local serving = servings[math.random(1, #servings)]
|
||
|
local adj = ""
|
||
|
local which_adj = math.random(1, 4)
|
||
|
if which_adj == 2 then
|
||
|
adj = soupe.temps[math.random(1, #soupe.temps)] .. " "
|
||
|
elseif which_adj == 3 then
|
||
|
adj = soupe.servings[serving][math.random(1, #soupe.servings[serving])] ..
|
||
|
" "
|
||
|
elseif which_adj == 4 then
|
||
|
adj = soupe.temps[math.random(1, #soupe.temps)] .. " " ..
|
||
|
soupe.servings[serving][math.random(1, #soupe.servings[serving])] ..
|
||
|
" "
|
||
|
end
|
||
|
|
||
|
local soup = adj .. serving .. " " ..
|
||
|
soupe.articles[math.random(1, #soupe.articles)] .. " "
|
||
|
if ingred == 1 then
|
||
|
soup = soup .. nouns[math.random(1, #nouns)]
|
||
|
elseif ingred == 2 then
|
||
|
soup = soup .. nouns[math.random(1, #nouns)] .. " and " ..
|
||
|
nouns[math.random(1, #nouns)]
|
||
|
elseif ingred > 2 then
|
||
|
for i = 1, (ingred - 2) do
|
||
|
soup = soup .. nouns[math.random(1, #nouns)] .. ", "
|
||
|
end
|
||
|
soup = soup .. nouns[math.random(1, #nouns)] .. " and " ..
|
||
|
nouns[math.random(1, #nouns)]
|
||
|
end
|
||
|
return soup
|
||
|
end
|
||
|
|
||
|
|
||
|
return soupe
|