new object $word: $utilities; var $root created_on = 856377068; var $root flags = ['variables, 'methods, 'code, 'core, 'fertile]; var $root help_node = $help_sys_word; var $root inited = 1; var $root managed = [$word]; var $root manager = $word; var $word firstcons = #[["th", 1], ["b", 5], ["f", 9], ["qu", 10]]; var $word lastcons = #[["bh", 1], ["d", 5], ["b", 9]]; var $word syllable_pat = #[[["V"], 2], [["V", "LC"], 6], [["C", "V"], 8]]; var $word syllables = #[[2, 3], [3, 4]]; var $word vowels = #[["a", 10], ["e", 20], ["i", 30]]; public method .firstcons() { return firstcons; }; public method .format_chances() { return ((((((((.format_dict(syllables, "S")) + [""]) + (.format_dict(syllable_pat, "SP"))) + [""]) + (.format_dict(vowels, "V"))) + [""]) + (.format_dict(firstcons, "C"))) + [""]) + (.format_dict(lastcons, "LC")); }; public method .format_dict() { arg dict, cmd; var out, v, last, num; out = []; for v in (dict) { num = (v[2]) - last; last = v[2]; if ((type(v[1]) == 'string) && (" " in (v[1]))) out += [(((cmd + " \"") + (v[1])) + "\" ") + num]; if (type(v[1]) == 'list) out += [(((cmd + " ") + ((v[1]).join("-"))) + " ") + num]; else out += [(((cmd + " ") + (v[1])) + " ") + num]; } return out; }; public method .generate() { var x, y, out, pat, p; out = ""; for x in [1 .. .pick_value('syllables)] { pat = .pick_value('syllable_pat); for p in (pat) { switch (p) { case "V": out += .pick_value('vowels); case "C": out += .pick_value('firstcons); case "LC": out += .pick_value('lastcons); default: throw(~invpat, "Invalid syllable pattern: " + pat); } } } return out.capitalize(); }; public method .lastcons() { return lastcons; }; public method .pick_value() { arg name; var top, pick, v, last; top = dict_values(get_var(name)).last(); pick = random(top); for v in (get_var(name)) { if ((v[2]) > pick) { if (!last) return v[1]; return last; } last = v[1]; } return last; }; public method .set_chances() { arg what, value; var out, last, v, chance; (> .perms(sender()) <); // chances are received as a #[["what", chance]] dict // which is converted where the chance is a cumulative range of the total out = #[]; for v in (value) { chance = v[2]; out = dict_add(out, v[1], chance + last); last += chance; } set_var(what, out); return get_var(what); }; public method .submit_chances() { arg lines; var line, linec, s, sp, v, fc, lc, val, chance, vsp, part; s = (sp = (v = (fc = (lc = #[])))); for line in (lines) { linec++; if (match_regexp(line, " *#")) continue; line = line.explode_quoted(); if (!line) continue; if (listlen(line) != 3) throw(~bad, (("Line " + linec) + ": Invalid config: ") + (line.join())); chance = toint(line[3]); if (!chance) throw(~bad, ("Line " + linec) + ": Chance must be one or more."); switch (line[1]) { case "S": val = toint(line[2]); if (!val) throw(~bad, ("Line " + linec) + ": Syllables must be one or more."); s = s.add(val, chance); case "SP": val = line[2]; val = explode(uppercase(strsed(val, "[^CVL-]+", "")), "-"); if (filter part in (val) where (!(part in ["C", "V", "LC"]))) throw(~bad, ("Line " + linec) + ": Invalid syllable pattern"); sp = sp.add(val, chance); case "C": if (!(line[2])) throw(~bad, ("Line " + linec) + ": Invalid consanant"); fc = fc.add(line[2], chance); case "LC": if (!(line[2])) throw(~bad, ("Line " + linec) + ": Invalid consanant"); lc = lc.add(line[2], chance); case "V": if (!(line[2])) throw(~bad, ("Line " + linec) + ": Invalid vowel"); v = v.add(line[2], chance); default: throw(~bad, (("Line " + linec) + ": Invalid directive: ") + (line[1])); } refresh(); } .set_chances('syllables, s); .set_chances('syllable_pat, sp); .set_chances('firstcons, fc); .set_chances('lastcons, lc); .set_chances('vowels, v); }; public method .syllable_pat() { return syllable_pat; }; public method .syllables() { return syllables; }; public method .vowels() { return vowels; };