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