ADDED argue.ml Index: argue.ml ================================================================== --- argue.ml +++ argue.ml @@ -0,0 +1,617 @@ +type node = L of string | R of node array | C of string array | B of node list | O of node | F of (unit -> node) +let punct = C[| + "."; ","; + "?"; " ?"; "??"; " ??"; " ? ?"; + "!"; " !"; "!!"; " !!"; " ! !"; + "…"; "..."; ". . . "; "...!"; + "!?"; " !?"; " ! ?"; " <3"; " ♥"; + "~"; " ~uwu~"; " XD"; " :D"; + " :P"; " ;)"; " :)"; " :("; + " ಠ_ಠ"; " ^_^"; " >_>"; + " >_<"; +|] +let dimin = C [| + "hon"; + "honey"; + "honeybunch"; + "dear"; + "dearie"; + "my dear"; + "sweetie"; + "sweetheart"; + "bro"; + "babe"; + "dude"; + "bruh"; + "my man"; + "sweetcheeks"; + "kiddo"; + "kid"; + "daddy"; + "folks"; + "girl"; + "my child"; + "my sweet summer child"; + "pumpkin"; + "punkin"; + "my boy"; + "little boy"; + "little girl"; + "punk"; + "bb"; + "genius"; + "cuck"; + "bitch"; + "buddy"; + "bud"; + "pal"; + "silly"; + "silly boy"; + "dummy"; +|] +let writers = C[| + (* miscellaneous assholes & multipurpose tools *) + "lacan"; "derrida"; "chomsky"; "nietzsche"; "baudrillard"; "beaudrillard"; + "freud"; "pinker"; "žižek"; "zizek"; "foucault"; "deleuze"; "delueze"; "kant"; "hume"; + "russell"; "russel"; "descartes"; "guattari"; "guatari"; "richelieu"; "hegel"; "heidegger"; + "de tocqueville"; "de toqueville"; "friedman"; "keynes"; "hobbes"; "bacon"; "avicenna"; + "schopenhauer"; "camus"; "hamilton"; "schwarzenegger"; "rousseau"; "rawls"; "goethe"; + "hobbes"; "friedman"; "fromm"; "hubbard"; "johnson"; + (* greeks *) + "plato"; "aristotle"; "socrates"; "aristophanes"; "democritus"; + (* commies *) + "trotsky"; "comrade trotsky"; "lenin"; "comrade lenin"; "mao"; "marx"; + "hoxha"; + (* there are a lot of ways to misspell that man's name *) + "kierkegaard"; "kierkegard"; "keirkegaard"; "keirkegard"; + (* names i just made up*) + "o'dair"; "wilson"; "saint-madeleine"; "sampson-crusoe"; "lambert"; "hernández"; + "duchamp"; "roberts"; "michaud"; "bägelstein"; "braustwitz"; "lawrence"; "smith"; + (* elvish word generator *) + "harviorha"; "vieluval"; "beceou"; "ilvëthiorá"; "lioralie"; "bainon"; "alherdor"; + "lenusá"; + (* fictional characters *) + "dracula"; "voight-kampff"; "bond"; "thranduil"; "hood"; + (* me *) + "hale"; +|] +let interj = C [| + "wow"; + "w o w"; + "lmao"; + "lmfao"; + "rofl"; + "no"; + "nope"; + "wrong"; + "nuh-uh"; + "lol"; + "haha"; + "um"; + "k"; + "okay"; + "ok"; + "amazing"; + "alright"; + "now"; + "jesus"; + "oh boy"; + "boy"; + "man"; + "oh man"; + "oh my"; + "oh god"; + "god"; + "oh wow"; + "oh my sweet summer child"; + "my sweet summer child"; + "yo"; + "but"; + "so"; + "no way"; + "fake"; + "holy shit"; + "holy crap"; + "what the fuck"; + "ugh"; + "ughhh"; + "ugghh"; + "uugh"; + "yuck"; + "ew"; + "gross"; + "try and keep up"; +|] +let disagreements = C[| + "well"; + "well maybe"; + "well, maybe"; + "well, no"; + "well, actually"; + "well actually"; + "okay well"; + "actually"; + "maybe"; + "but"; + "and"; + "so"; + "first off"; + "firstly"; + "okay so first off"; + "okay well firstly"; +|] +let chance i = (Random.int i) = 0 +let pick (r : 'a array) : 'a = r.(Random.int(Array.length r)) +let quote x = F(fun () -> if chance 30 then R[| + B[L"\""; x ;L"\""]; + B[L"“"; x ;L"”";]; +|] else x) +type word = A of string | An of string +let rude_adjs = [| + A "smelly"; A "gross"; A "far-right"; A "right-wing"; + A "whiny"; A "childish"; A "stupid"; A "thoughtless"; + A "worthless"; An "inane"; An "idiotic"; A "fucking"; + A "fuckin"; A "pissy"; A "dumbfuck"; A "thick"; + A "sad"; A "pathetic"; A "witless"; A"horny"; + A "useless"; An "irrational"; +|] +let rude_nouns = [| + A "dumbass"; An "asshole"; A "jerk"; A "dipshit"; + A "baby"; A "nazi"; A "chucklefuck"; A "pig"; + An "ass"; A "dork"; A "geek"; A "nerd"; A "loser"; + A "whiner"; A "wanker"; A "gobshite"; A "wingnut"; + A "boob"; A "fuck"; A "fucker"; A "cuck"; A "yokel"; + A "feeb"; A "thug"; A"gringo"; +|] +let makeinsult () = let adj = if chance 2 then Some(pick rude_adjs) else None in + let noun = pick rude_nouns in L(match adj, noun with + | None, A(n) -> "a " ^ n + | None, An(n) -> "an " ^ n + | Some(A(a)), A(n) + | Some(A(a)), An(n) -> "a " ^ a ^ " " ^ n + | Some(An(a)), A(n) + | Some(An(a)), An(n) -> "an " ^ a ^ " " ^ n);; + +let starters = R[| interj; interj; disagreements; |] +let byes = C[| "thanks"; "thx"; "kthx"; "kthxbye"; "bye"; "bye now"; "goodbye"; "bye-bye"; "byeee"; "byeeee"; "love you too"; "byebye"; "pls and thx"; "please and thanks"; "please and thank you"; "okay"; "have a nice day"; "goodnight"; "if you know what i mean";|] +let closers = R[| byes; dimin; B[byes; O(punct); L" "; dimin;];|] +let ewe = C[| "you"; "u"; "you"; "u"; "you"; "u"; "you"; "u"; "you're";|] +let yore = R[| L"your"; L"you're"; L"ur"; L"yr"; L"u're"; B[ewe; L" are"]; B[ewe; L" r"];|] +let pleez = C[|"please"; "pls"; "plz";|] +let poscmds = R[| + L "grow up"; + L "learn to read"; + B[L "listen to "; yore; O(L " "); L "self"]; + B[L "calm "; yore; R[| + B[O(L " "); L "self"; O(L" down")]; + L" tits"; + |]]; + L"calm down"; + L"calm dowm"; + B[L "use "; yore; L " brain"]; + B[C[|"read"; "listen to"|]; L" what "; yore; C[|" sayin"; " saying"|]]; + B[L "think before "; ewe; L " speak"]; + L "try again"; + L "try harder"; + L "explain"; + B[L "explain "; yore; O(L " "); L "self"]; + B[L "explain "; yore; L " reasoning"]; + B[L "explain "; yore; L " logic"]; + B[L "explain "; yore; L " evidence"]; + B[L "show me "; yore; L " evidence"]; + L "go away"; + L "check the bible"; + L "pay attention"; + B[L "learn "; yore; L " place"]; + L "shut up"; + L "shut the fuck up"; + L "stop talking"; + L "shut your mouth"; + L "answer my question"; + L "read a book"; + B[L "read "; O(L"some "); writers]; + B[L "read "; O(L"some "); writers]; + B[L "read "; O(L"some "); writers]; + L "go to hell"; + L "burn in hell"; + L "go to jail"; + L "notice me senpai"; + B[L "stop contradicting "; yore; O(L " "); L "self"]; + L "alert the presses"; + L "get a job"; + L "learn to take a joke"; + L "stop projecting"; + L "speak english"; + L "face facts"; + L "pay me"; + L "die in a fire"; + B[L"stop being "; F makeinsult;]; + B[L"stop being such "; F makeinsult;]; + B[L"quit being "; F makeinsult;]; + B[C[|"learn ";"lern ";"lrn "|]; O(L"how "); C[|"to ";"2 ";"too ";"two "; "";|]; C[|"spell";"spel";"spele";"speling";"spelling"|]]; +|] +let negcmds = R [| + B[L"be "; F makeinsult;]; + B[L"be such "; F makeinsult;]; + B[L"act like such "; F makeinsult;]; + B[L"keep acting like such "; F makeinsult;]; + B[L"make "; F makeinsult; L " of "; yore; O(L " "); L "self"]; + B[L"make such "; F makeinsult; L " of "; yore; O(L " "); L "self"]; + L"be that way"; + L"talk like that"; + L"keep whining"; + L"whine"; + +|] +let commands = R[| + poscmds; + poscmds; + poscmds; + B[C[|"don't "; "dont "|]; negcmds]; +|] +let thats = C[| "that is"; "that's"; "it's"; "it is";|] +let thathas = C[| "that has"; "that's"; "it has"; "it has";|] +let thatsnot = C[| "that isn't"; "that's not"; "it's not"; "it isn't"; "that is not"; "it is not";|] +let theirs = C[| "there is"; "there's"; "theirs"; "their's"; |] +let thathasnt = C[| "that hasn't"; "that's not"; "it's not"; "it hasn't"; "that has not"; "it has not";|] +let im = C[| "i'm"; "i am"; "I am"; "i'm"; "im"; "Im"; |] +let comments = R [| + L "cool story"; + L "fuck me"; + L "fuck you"; + B[thats; L " wrong"]; + B[thats; L " not even wrong"]; + B[thats; L " so wrong"]; + B[thatsnot; L " correct"]; + B[thatsnot; L " right"]; + B[thats; L " incorrect"]; + B[thats; L " untrue"]; + B[thatsnot; L " true"]; + B[ewe; L " are wrong"]; + B[thats; L " never been true"]; + B[thathas; L " never been true"]; + B[thathasnt; L " ever been true"]; + B[ewe; L " have no evidence"]; + B[ewe; L " can't prove it"]; + B[ewe; L " can't prove that"]; + L "bored now"; + L "checkmate, atheists"; + L "i'm not really into pokemon"; + L "whatever"; + B[ O(L"how "); L"are "; ewe; O(L" even"); L" real" ]; + B[L"are "; ewe; O(L" even"); L" a person" ]; + B[L"are "; ewe; L" a bot" ]; + B[L"i think "; yore; O(L" actually"); O(L" just"); L" a bot"]; + L "you need jesus"; + L "you need Jesus"; + L "you need you some jesus"; + B[O(B[yore; L" "]); L"so edgy"]; + L "real edgy"; + B[thats; L" nice"]; + B[thats; O(L" so"); L" fake"]; + B[thats; L" cool"]; + B[L"good for "; ewe]; + B[O(L "watch out "); L "we got a";C[|" real ";"n "|]; L"edgelord here"]; + B[L "are "; ewe; C[| + " okay"; + " alright"; + " well"; + " diseased"; + " sick"; + " ok"; + " OK"; + |]]; + B[L "do "; ewe; L" need help"]; + B[L "no "; ewe]; + B[O(L "it "); L"takes one to know one"]; + B[L"where do i even start"; O(B[L" with"; R[|ewe;L" this one"; L" this bullshit"|]])]; + B[im; L" not "; C[|"gonna";"going to"|]; C[|" repeat myself"; " say it again"|];]; + L"i won't repeat myself"; + L"i won't repeat myself again"; + L"i won't say it again"; + L"don't make me repeat myself"; + B[ewe; L" make me laugh"]; + B[ewe; L" are very funny"]; + B[ewe; L" should be a comedian"]; + B[yore; L" very funny"]; + B[yore; L" a terrible person"]; + B[yore; L" a terrible person, aren't "; ewe]; + B[yore; L" a terrible human being"]; + B[yore; L" a terrible excuse for human being, aren't "; ewe]; + B[O(L"and "); C[|"who";"what"|]; O(L" even"); L" are ";ewe;O(L" supposed to be")]; + B[L"delete ";yore;L" account"]; + B[L"who do ";ewe;L" think ";ewe;L" are";]; + B[L"what are ";ewe; O(L" even"); L" talking about"]; + B[ewe; L" mad"]; + L"umadbro"; + B[L"do "; ewe; O(L" actually"); O(L" even"); L" know what that word means"]; + L"blocked and reported"; + B[L"what are ";ewe; O(L" even"); C[|" on"; " smoking"|]]; + B[L"do ";ewe; O(L" even"); L" lift"]; + B[L"are ";ewe; O(L", like,"); L" high"; O(L" or something")]; + L"look who's Mad Online"; + B[L"are ";ewe; O(L" seriously"); L" Mad Online"; O(L " right now")]; + B[L"i like ";ewe]; + L"wait for it"; + B[ewe; L " still haven't answered my question"]; + B[yore; L " an idiot"]; + B[L "i will pray for "; ewe]; + L"let's do this"; + L"fight me irl"; + L"come at me"; + B[L"how can you ";ewe; + C[| " say "; " think "; " believe " |]; + C[| "that"; "those things"; "such a thing"; + "something like that"; "things like that"; "lies"; "bullshit";|]; + ]; + B[im; L" so sad for "; ewe]; + L"send nudes"; + L"jesus loves you"; + B[im; L" entitled to my opinion"]; + B[L "have "; ewe; L" even heard of the first amendment"]; + B[thats; L" called free speech"]; + L"a/s/l"; + B[L "do "; ewe; L" kik"]; + B[thats; L " hot"]; + B[ewe; L " have a conflict of interest"]; + B[L "why should i listen to "; ewe]; + B[yore; L " going to hell"]; + B[yore; L " going to go to hell"]; + B[theirs; L" a special place in hell for "; O(L"people like "); ewe]; + B[L"do "; ewe; O(L" even"); L" know who i am" ]; + B[L"it's like "; ewe; L" don't"; O(L" even"); L" know who i am" ]; + B[im; L" trying to remove it"]; + B[L "do "; ewe; L" need a safe space"]; + B[thats; L" just my opinion"]; + L"then what"; + L"seriously"; + B[L "how do "; ewe; L" know"; R[| L""; L" that"; B[L" "; thats; L " true";]|]]; + B[thats; L" circular reasoning"]; + L"https://yourlogicalfallacyis.com/bandwagon"; + L"https://yourlogicalfallacyis.com/appeal-to-authority"; + L"https://yourlogicalfallacyis.com/slippery-slope"; + L"https://yourlogicalfallacyis.com/strawman"; + L"https://yourlogicalfallacyis.com/ad-hominem"; + L"https://yourlogicalfallacyis.com/no-true-scotsman"; + L"https://yourlogicalfallacyis.com/personal-incredulity"; + L"https://yourlogicalfallacyis.com/begging-the-question"; + B[thats; L" a fallacy"]; + B[thats; L" incoherent"]; + B[thats; L" illogical"]; + B[thats; L" self-contradictory"]; + B[ewe; L" just said it wasn't"]; + B[ewe; L" just said that wasn't true"]; + B[L"now "; yore; L" just lying"]; + L"that makes no sense"; + L"what"; + L"wait back up"; + L"hold on"; + B[L"hold ";yore;L" horses"]; + B[yore; L" contradicting yourself"; O(L" again")]; + B[L "how old are "; ewe; O(L" really"); O(L" even")]; + B[O(L"i think "); yore; O(L" being"); L" intellectually dishonest"; O(L" again")]; + B[ewe; L " don't "; O(L"really "); O(L"even "); L"know what "; C[|"that word means";"those words mean";"words mean"|]; O(B[L", do ";ewe])]; + B[O(L"why do "); ewe; L" hate america"]; + B[O(L"someone "); L"alert the presses"]; + B[C[|"gravity";"evolution";"abortion";"atheism";"feminism";"misandry"|]; L" is "; O(L"still "); C[|"just";"only";"nothing but"|]; L" a theory";]; + B[yore; L" parents must be "; O(L"very "); C[|"proud of ";"ashamed of ";"angry at ";"sad for "|]; ewe]; + B[L"are "; ewe; L" being sarcastic"]; + B[L"are "; ewe; L" for real"]; + B[L"are "; ewe; L" actually serious"]; + B[L"no wonder "; ewe; L" don't have a girlfriend"]; + B[L"no wonder "; ewe; L" dont have a girlfriend"]; + B[L"no wonder "; ewe; L" haven't got a girlfriend"]; + B[L"can't "; ewe; C[|""; " people"; " all"; "ppl"|]; O(L " ever"); O(L " even"); O(L " just"); O(L " learn to"); L" take a joke"]; + B[L"can't take a joke can "; ewe]; + B[L"can't take a joke, can "; ewe]; + B[L"can't take a joke, can we"]; + B[yore; O(L " so"); L" mad"]; + B[im; O(L " so"); L" mad"]; + B[L"are ";ewe;L" projecting"]; + B[L"i think ";yore;L" projecting"]; + L"tits or gtfo"; + L"gtfo"; + B[thats; L" illegal"]; + B[thats; L" illegal"]; + B[thatsnot; L" legal"]; + B[thatsnot; L" lawful"]; + B[thats; L" problematic"; O(B[O(L","); L" for a couple reasons";]) ]; + L"so what"; + L"i don't care"; + L"i dont care"; + L"why should i care"; + B[ + R [| + B[L"all "; yore; L" doing is"]; + B[yore; C[|"";" only";" just"|]]; + |]; + L" embarassing "; yore; + R[| + B[O(L " "); L "self"]; + B[O(L " own"); L " dumb ass"]; + |] + ]; + B[ewe; L" know i don't care, right"]; + B[L"i can't believe "; ewe; L" actually went there"]; + B[thats; L" a sin"]; + B[yore; L " sick"]; + L"time for some game theory"; + L"time 4 some game theory"; + B[ + O(B[O(L "maybe "); ewe; L"should "]); L"shut "; O(L"the fuck "); L "up"; + O(B[L" while "; C[| + "other people "; + "the adults "; + "the grown-ups "; + "smarter people "; + "better people "; + "the smart people "; + |]; L"are talking";]) + ]; + B[L"are "; ewe; L" always "; R[| + B[L"this "; C[| + "dense"; + "thick"; + "slow"; + "stupid"; + "annoying"; + "angry"; + "useless"; + "much of a cuck"; + "much of an asshole"; + "irritating"; + "irrational"; + "illogical"; + "dumb"; + "horny"; + |]]; + B[O(L"such "); C[| + "a cuck"; + "a honkey"; + "a gringo"; + "a baby"; + "a pansy"; + "a loser"; + "an idiot"; + "an asshole"; + "a yokel"; + "a dumbfuck yokel"; + "an asshat"; + "a dumbfuck honkey"; + "a dumbfuck yokel asshat"; + "a piece of shit"; + "a turd"; + "a party-pooper"; + "a wanker"; + "a burden"; + "a hindrance"; + "an obstacle"; + |]]; + |]]; + B[ewe; L" have to tell me if "; yore; L" a bot"; O(B[O(punct); L" it's the law"])]; + L "this is america"; + B[thats; O(L" called"); L " a power move"]; + L "i can't even"; + L "i cant even"; + L "don't know, don't care"; + B[L "are "; ewe; L" "; O(L"actually "); O(L"just "); + C[|"trying to"; "tryin to"; "tryna"|]; L" "; + C[|"bore";"whine";"wheedle";"bitch";"cry"|]; L " me "; + C[|"to death";"into submission"|]; O(L" or something") + ]; + B[C[|"its";"it's"|]; L" time for some game theory"]; +|] + +let insist = R[| + B[ewe; L " need to"]; + L"try and"; + R[| + L"do us a favor and"; + L"do us all a favor and"; + L"do us both a favor and"; + L"do everyone a favor and"; + L"do the world a favor and"; + L"do me a favor and"; + B[L "do "; yore; O(L " "); L "self a favor and"]; + |]; + L"try &"; + B[ewe; O(L" really"); L " gotta"]; + B[ewe; O(L" really"); L " should"]; + B[L "can "; ewe]; + B[L "why don't "; ewe]; + B[L "why dont "; ewe]; + B[L "y dont "; ewe]; + L "time to"; + B[L"time for ";ewe;L" to"]; + L "fuck you"; + L "fuck you,"; +|] +let advs = O(O(C[|"";" already";" next time";" again";|])) +let insults = R[| + commands; + B[C[|"please "; "pls "; "plz "; ""|]; insist; L" "; quote poscmds; advs]; + B[insist; C[|" please "; " pls "; " plz "; " "|]; quote commands; advs]; + B[insist; L" "; quote poscmds; advs; C[|" please"; " pls"; " plz"; ""|];]; + B[ + C[|"pls 2 "; "lern2"|]; + quote poscmds; + ]; + B[O(B[ewe; L" "]); L"better "; quote poscmds;]; + B[O(B[ewe; L" "]); L"better not "; quote negcmds;]; + B[ + C[|"fine"; "okay"; "sure"; "whatever"; "w/e"; "k"; "ok"|]; O(punct); L " "; + negcmds; O(punct); + L " see if i care"; O(punct); + ] +|] +let rec realgrammar = R [| + B[starters; punct]; + B[starters; L ", "; quote dimin; punct]; + B[O(B[starters; L" ";]); insults; O(B[L ", "; quote dimin]); punct]; + B[O(B[starters; L" ";]); insults; O(B[L ", "; quote dimin]); punct]; + B[O(B[starters; L" ";]); insults; O(B[L ", "; quote dimin]); punct]; + B[O(B[interj; punct; L" ";]); quote comments; O(punct); O(B[L" ";closers])]; + (* extremely leftist voice *) B[ + O(B[starters; O(punct); L" "]); + R[| + B[L "have "; ewe; O(L" ever"); O(L" even"); L" read "; + C[|"any ";"any ";"any ";"a single word of ";"";"";"";"";|]; + writers; O(L" at all")]; + B[ + C[|"i don't think"; "i don't believe"; "i doubt"; "doubt"; "really doubt"; "really gotta doubt"|]; + C[|" that ";" if "; " "|]; + ewe; + O(L" have"); + O(L " even"); L" read "; C[|"any ";"any ";"any ";"a single word of ";"";"";"";"";|]; writers + ]; + B[L"maybe if ";ewe;C[|"";"'d";" had"|];L" read "; writers; L " you wouldn't be "; O(L"such "); F makeinsult;]; + |]; + O(B[O(L","); L" "; quote dimin]); + O(punct); + ] +|] +let grammar = F (fun () -> match Random.int 32 with + | 0 -> B[ + C[| + "okay so (1/"; + "well first off (1/"; + "so (1/"; + "alright so (1/"; + |]; + F(fun () -> L(string_of_int ((Random.int 200)+53))); L")"]; + | 1 -> B[L"\""; realgrammar; L"\""]; + | 2 -> B[L"“"; realgrammar; L"”"]; + | 3 | 4 -> B[L"*"; yore;]; + | _ -> realgrammar);; (* this is horrific *) + +let iter c fn = + let rec loop i = fn i; if i = c-1 then () else loop (i+1) in loop 0 +let titcase x = + let len = String.length x in + let buf = Bytes.of_string x in + iter len (fun i -> + if i = 0 then + let c = Bytes.get buf (i) in + if c <= 'z' && c >= 'a' then + Bytes.set buf (i) (char_of_int ((int_of_char c)-32)) else () + else if i != len-1 && (Bytes.get buf i = ' ' || Bytes.get buf i = '*') then + let c = Bytes.get buf (i+1) in + if c <= 'z' && c >= 'a' then + Bytes.set buf (i+1) (char_of_int ((int_of_char c)-32)) else (); + else (); + ); + Bytes.to_string buf;; + +let randcap x = match Random.int 6 with + | 0 -> String.uppercase_ascii x + | 1 -> titcase x + | _ -> x +let rec eval : node -> string = function + | L(s) -> s + | R(n) -> eval (pick n) + | B(l) -> List.fold_left (fun x y -> x ^ (eval y)) "" l + | C(a) -> pick a + | O(n) -> if chance 2 then (eval n) else "" + | F(f) -> eval (f ()) +let () = Random.self_init (); + print_string (randcap (eval grammar)) ADDED badbiobot.ml Index: badbiobot.ml ================================================================== --- badbiobot.ml +++ badbiobot.ml @@ -0,0 +1,174 @@ +type node = N of node list | S of string | R of node array | Many of node * int * string | P | O of node | Filter of (string->string) * node;; +let gclass = R[|S"Warrior"; S "Bard"; S "Ranger"; S "Wizard"; S "Mage"; S "Paladin"; S "Rogue"; S "Ninja"; S "Warlock"; S "Champion"; S "Barbarian"; S "Assassin"; S "Conjurer"; S "Summoner"; S "Fighter"; S "Berserker"; S "Druid"; S "Orc"; S "Goblin"|] +let name = R [| + S "Stalin"; S "Hitler"; S "Marx"; S "Kony"; S "Mao"; S "Mussolini"; S "Trump"; S "Ted Cruz"; S "esr"; S "Richard Dawkins"; S "Mishima"; S "Nixon"; S "Kissinger"; S "Reagan"; S "Erdogan"; S "Hillary"; S "Clinton"; S "Bernie"; S "Sanders"; S "David Cameron"; S "Thatcher"; S "Nigel Farage"; S "McCarthy"; S "Putin"; S "Frank Underwood"; S "Andrew Jackson"; S "Sam Harris"; S "Christopher Hitchens"; S "Columbus"; S "Julian Assange"; S "Marcus Cicero"; S "Caligula"; S "Nero"; S "Commodus"; S "Caracalla"; S "Constantine"; S "Atilla the Hun"; S "Glenn Greenwald"; S "Ed Balls"; S "Edward Snowden"; S "Genghis Khan"; +|] +let nomen = R [| S"nationalist"; S "capitalist"; S "Libertarian"; S "atheist"; S "conservative"; S "Marxist"; S "beta"; S "rationalist"; S "Republican"; S "Neoreactionary"; S "communist"; S "moe"; S "NRx"; S "racial realist"; S "hacktivist"; S "European"; S "European-American"; S "white separatist"; S "Anonymous"; S "heterosexual"; S "intellectual"; S "moderate"; S "sapiosexual"; S "intellectual"; S "egalitarian";|] +let adj = R [|nomen; S "circumgender"; S "transracial"; S "free-thinking"; S "incel"; S "proud"; S "rational"; S "straight"; S "opinionated"; S "politically active"; S "traditional"; S "pro-life"; S "angry"; S "white"|] +let band = R[|S"Metallica"; S "Nine Inch Nails"; S "Taylor Swift"; S "Drake"; S "Run The Jewels"; S "Daft Punk"; S "Amanda Palmer"; S "Coldplay"; S "Radiohead";|] +let trendy_food = R [| S "bacon"; S "vodka"; S "beer"; S "wine"; S "coffee"; S "whiskey"; S "Soylent"; S "steak"; S "kale"; |] +let lang = R [| S "Ruby"; S "Rails"; S "Python"; S "Scala"; S "Java"; S "PHP"; S "Haskell"; S "LISP"; S "JavaScript"; S "node.js"; S "React"; S "Backbone"; S "Polymer"; S "Ember"; S "Angular"; S ".NET"; S "C#"; S "F#"; S "Visual Basic .NET"; S "PowerShell"; S "Meteor.js"; S "jQuery"; S "Linux"; S "GNU/Linux"; S "UNIX"; S "AWK"; S "bash"; S "zsh"; S "fish"; S "GNU"; S "Open Source "; S "Erlang"; S "Docker"; S "R"; S "Hadoop"; S "Android"; S "iOS"; S "Unity"; S "Unreal Engine"; S "UE4"; S "Source Engine"; S "Apache"; S "Lua"; S "Prolog"; S "C++"; S "D"; S "Go"; S "Golang"; S "Rust"; S "Nim"; S "OCaml"; S "Kotlin"; S "Clojure"; S "Groovy"; S "Scheme"; S "Common Lisp"; S "llvm"; S "LLVM"; S "Hoon"; S "Urbit"; S "Nock"; S "Elixir"; S "Crystal"; S "TypeScript"; S "PureScript"; S "CoffeeScript"; S "Elm"; S "LaTeX"; S "troff"; S "groff"; S "Markdown"; S "HTML"; S "CSS"; S "XSLT"; S "Flash"; S "ColdFusion"; S "FORTRAN"; S "COBOL"; S "Matlab"; S "Mathematica"; S "CUDA"; S "OpenCL"; S "OpenGL"; S "DirectX"; S "Vulkan"; S "Pascal"; S "Perl"; S "Perl 6"; S "UX"; S "Emacs Lisp"; S "Vimscript"; S "AppleScript"; S "Swift"; S "Objective-C"; S "Cocoa"; S "Cocoa Touch"; S "Xamarin"; S "Qt"; S "GTK+"; S "WPF"; S "JavaFX"; S "Swing"; S "Smalltalk" |] +let dev = R[|N[lang; S " developer";]; N[lang; S " evangelist";]; N[lang; S " dev";]; N[lang; S " lover";]; N[lang; S " enthusiast";]; N[lang; S " professional";]; N[lang; S " expert";]; N[lang; S " "; gclass]; N[lang; S " connoisseur";];|] +let rec activity = R [|band; trendy_food; S"freedom"; S "free speech"; S"nationalism"; S "Minecraft"; S "Call of Duty"; S "partying"; S "beer pong"; S "football"; S "baseball"; S "vaping"; S "pussy"; S "bacon"; S "LessWrong"; S "America"; S "RationalWiki"; S "memes"; S "4chan"; S "8chan"; S "comics"; S "hacktivism"; S "hacking"; S "ComicCon"; S "cosplay"; S "Game of Thrones"; S "hentai"; S "advocacy"; N[noun; S " advocacy";]; S "sex"; S "science"; S "anime"; S "Big Data"; S "Cloud"; S "butts"; S "UKIP"; S "white separatism"; S "Brexit"; S "grammar"; S "free software"; S "open source"; S "real literature";|] +and noun = R [| + nomen; S "Christian"; S "brony"; S "bro"; S "brogrammer"; S "brocialist"; N[activity; S "evangelist"]; N [S "bro"; noun]; dev; N[S "10x "; lang; S " dev";]; S "free-thinker"; S "Redditor"; S "atheist"; S "furry"; S "victim of cisphobia"; S "male feminist"; S "equalist"; S "MRA"; S "beer drinker"; S "father"; S "blogger"; N[noun; S "blogger";]; S "Thatcherite"; S "geek"; S "thought leader"; S "antivax"; S "channer"; S "Men's Rights Activist"; N[S "Social Justice "; gclass]; N[activity; S "lover";]; S "Anonymous"; S "infosec professional"; S "BernieBro"; S "Marxist"; S "socialist"; S "journalist"; S "marketer"; S "social media analyst"; S "philosopher"; S "educator"; S "advocate"; N[activity; S " advocate"]; S "sexpert"; S "professional"; N[activity; S" expert";]; N[activity; S"ninja";]; S "Pythonista"; S "Rubyist"; S "PhD candidate"; S "cartoonist"; S "man"; S "skeptic"; S "grammar Nazi"; S "open sorcerer"; S "podcaster"; N[name; S "-wannabe"]; S "lover"; S "detective"; S "trekkie"; S "fuckboy"; S "Soylent eater"; +|] +let political_party = R[| +S "Green"; S "Labour"; S "Labor"; S "National"; S "Libertarian"; S "Democratic"; S "Republican"; S "Liberal Democrat"; S "Lib Dem"; S "Tory"; S "Conservative"; S "Liberal"; S "UKIP"; S "BNP"; S "SSP"; S "Britain First"; S "Pirate"; S "Sex"; S "Communist"; +|] +let minority = R [| S "gays"; S "homosexuals"; S "jews"; S "Arabs"; S "Mexicans"; S "Muslims"; S "immigrants"; S "blacks"; S "transgendereds"; S "transgenders"; S "transgenderists"; S "queers"; S "SJWs"; S "feminists"; S "indie game developers"; S "gamers"; S "homos"; |];; +let minority_kind = R [|S "gender"; S "justice"; S "trans"; S "feminism"; S "queer"; S "gay"; S "homosexual";|] + +let startup = R[|S "Fumblr"; S "Grumblr"; S "Humblr"; S "Appearancely"; S "AccidentNow"; S "RefuseNow"; S "remainr"; S "Trembleit"; S "Punish"; S "SprayNow"; S "Tennisr"; S "Traply"; S "Yawnin"; S "momly"; S "Smartyell"; S "radiatein"; S "sawly"; S "suffery"; S "Sceneify"; S "WomanNow"; S "Ballhub"; S "Systemme"; S "Earnify"; S "Mathit"; S "Gruntly"; S "Bongh.it"; S "Lyly"|];; +let hashtag = R [| + S "#BlueLivesMatter"; + S "#AllLivesMatter"; + S "#NotAllMen"; + S "#KONY2012"; + S "#GamerGate"; + S "#FeelTheBern"; + S "#ImWithHer"; + S "#BuildTheWall"; + S "#VoteLeave"; + S "#FreeWeev"; + S "#WhiteGenocide"; + S "#2Ad"; + S "#NordicModel"; +|] +let verb = R [| S "game"; S "code"; S "blog"; S "hack"; S "vape pussy" |] +let startup_position = R[|S "CEO"; S "CTO"; S "Soylent eater"; S "Dev"; S "$dev"; S "Product Manager"; S "Customer Success Manager"; S "Full Stack Engineer"; S "Data journalist"; S "Infosec Expert"; S "Designer"; S "UX"; S "Hacker"; S "Engineer"; S "VP of Engineering"; S "Data scientist"; S "Growth Hacker"; S "Marketing"; S "Sexpert"|] +let sportsball_team = R[|S "Ducks"; S "Beavers"; S "Steelers"; S "Lakers"; S "Blazers"; S "Redskins"; S "Clippers"; S "All Blacks"; S "Newcastle"; S "Cubs"; S "West Ham"; S "Man U"; S "Chelsea"; S "Liverpool"|] +let activity = R [| band; trendy_food; S "Minecraft"; S "Call of Duty"; S "partying"; S "beer pong"; S "football"; S "baseball"; S "vaping"; S "pussy"; S "bacon"; S "LessWrong"; S "America"; S "RationalWiki"; S "memes"; S "4chan"; S "8chan"; S "comics"; S "hacktivism"; S "hacking"; S "ComicCon"; S "cosplay"; S "Game of Thrones"; S "hentai"; S "advocacy"; N[noun; S " advocacy";]; S "sex"; S "science"; S "anime"; S "Big Data"; S "Cloud"; S "Butts"; S "UKIP"; S "white separatism"; S "Brexit"; S "grammar"; S "free software"; S "open source"; S "real literature"; S "Star Trek"; S "Star Wars"; |] +let rec activity_phrase = N[activity; O(N[S", "; activity_phrase])] + +let phrase = R [| + N[S "Husband, father, "; noun; P;]; + S "Friendly."; + S "Hubby."; + S "That is all."; + S "Not as funny as I think I am."; + S "Nice guy."; + S "You have been warned."; + N[S "Avatar by "; name; S ".";]; + S "Jet fuel can't melt steel beams."; + N[minority; S " can't melt steel beams.";]; + N[activity; S " can't melt steel beams.";]; + N[lang; S " can't melt steel beams.";]; + N[name; S " was right.";]; + S "Ally."; + S "Cynical bastard."; + S "Proud Ally."; + S "Don't follow if you're easily offended."; + S "I aim to offend."; + S "Sarcastic."; + S "TERF is a slur."; + S "Put the Christ back in Christmas."; + S "Give me liberty or give me death."; + S "Fights for the users."; + S "I call them like I see them."; + S "I calls 'em like I sees 'em."; + S "Honest."; + S "I fear I am now a victim of 'cisphobia'."; + N[O(N[Many(adj,1," "); S " "]); noun; P;]; + N[O(N[Many(adj,1," "); S " "]); S "#"; noun; P;]; + N[adj; P;]; + N[Many(adj,3," "); S " #"; noun; S " and proud of it"; P;]; + N[activity_phrase; P]; + S "No fatties."; + N[minority_kind; S " critical."]; + N[minority_kind; S "-critical."]; + N[minority_kind; S " separatist.";]; + N[S "Go "; sportsball_team; S "!";]; + S "Don't tread on me."; + S "English only."; + S "We are all Africans."; + S "Je suis Charlie."; + N[S "Je suis "; name; P;]; + N[S "I am "; name; P;]; + N[S "We are all "; name; P]; + N[minority; S " are the real oppressors.";]; + N[minority; S " are the real racists.";]; + N[S "My best friends are "; minority; P;]; + N[S "Lover of all things "; lang; P;]; + N[S "Lover of all things "; activity; P;]; + S "RTs are not endorsements."; + S "Thoughts are my own."; + N[S "CEO of "; startup;]; + N[startup_position; S " at "; startup; P; ]; + S "Opinions are my own."; + S "Opinions do not reflect those of my employer."; + N[adj; S " pride.";]; + N[noun; S " pride.";]; + N[S "I like "; activity; P;]; + N[S "I stand with "; name; S ".";]; + S "I speak truth to power."; + S "History will vindicate me."; + S "Make America great again."; + N[S "Co-founder of "; startup; P]; + S "Molon labe."; + S "Μολών λαβέ."; + S "The best cure for bad speech is more speech."; + N[S "I "; verb; P;]; + N[S "I "; verb; S " and I vote.";]; + S "My public key: https://keyface.ohno/f897b10a."; + N[S "Make America "; adj; S " again.";]; + S "Watch my TED Talk."; + N[minority; S " need not apply.";]; + N[S "((("; name; S ")))";]; + N[S "Fan of "; band; P;]; + S "Beyhive."; + S "He/him."; + N[noun; S", "; noun; S ", "; noun; S ", not necessarily in that order.";]; + N[minority; S " are what's wrong with America.";]; + N[minority; S " go home.";]; + N[trendy_food; S " addict.";]; + N[trendy_food; S " enthusiast.";]; + N[trendy_food; S " and "; trendy_food; S ".";]; + N[Many(trendy_food,2,", "); S " and "; trendy_food; S ".";]; + N[trendy_food; S " is what's wrong with America.";]; + S "14/88."; + S "No trigger warnings."; + S "Resistance is futile."; + N[political_party; S " shill.";]; + N[political_party; S " activist.";]; + N[S "Vote "; political_party; S "!";]; + N[name; S " for president!";]; + N[name; S " for America.";]; + S "I love correcting people who are wrong."; + S "Carthago delenda est."; + S "Don't @ me."; + S "Just say no."; + S "PM me for direct sales."; + +|];; +let top = N[ Many(Filter(String.capitalize_ascii,phrase),2," "); O(N[S " "; Many(hashtag,1," ")]);] +let range min max = (Random.int (max-min)) + min +let pick (r: 'a array) : 'a = r.(range 0 (Array.length r));; +let rec copy n times sep : string = match times with + | 0 -> eval n + | _ -> (eval n)^sep^(copy n (times-1) sep) +and eval (n:node) : string = match n with + | N l -> List.fold_left (^) "" (List.map eval l) + | S s -> s + | R r -> eval (pick r) + | P -> "." + | Many(n,t,s) -> let times = t+(range 0 2) in copy n times s + | O x -> if Random.int 2 = 1 then eval x else "" + | Filter(fn,n) -> fn (eval n);; + +let (^^) text chr = text ^ (String.make 1 chr) +let scramble text = + let len = String.length text in + let rec loop i acc tps = + if i=len then acc else + if i+1=len then acc^^text.[i] else + match text.[i], text.[i+1] with + | ' ', _ -> loop (i+1) (acc^" ") false + | _ as c, ' ' -> loop (i+1) (acc^^c) false + | c1, c2 -> if not tps && Random.int 3 = 0 then + loop (i+2) ((acc^^c2)^^c1) true + else + loop (i+2) ((acc^^c1)^^c2) tps + in loop 0 "" false + +let () = Random.self_init(); print_string (scramble (eval top)) ADDED badname.c Index: badname.c ================================================================== --- badname.c +++ badname.c @@ -0,0 +1,104 @@ +// badname.c +// generates awful fantasy names based on a consistent +// lexicon. +// copyright 2014 alexis hale. released under GPLv2. + +#include +#include +#include + +#define to(ty, ctr, end) for(ty ctr = 0; ctrnoun->nat); + prt(n++->act->nat); + putchar(' '); + } while (++ct < len); + prt("\e[0m(\"\e[4m"); + ct = 0; + do { + prt(names->noun->translation); + prt(names++->act->translation); + if (ct != len-1) putchar(' '); + } while (++ct < len); + prt("\e[0m\")"); +} + +typedef struct entity_t { + name_t* names; u8 namec; +} entity_t; + +void make_entity(entity_t* e) { + e -> namec=rand()%3 + 2; + e -> names=malloc(sizeof(name_t)*e->namec); + to (u8, i, e -> namec) { + e -> names[i].noun = + &nouns[rand() % sizeof(nouns) / sizeof(struct morpheme)]; + e -> names[i].act = + &acts[rand() % sizeof(acts) / sizeof(struct morpheme)]; + } +} + +int main() { + srand(time(NULL)); + const u8 entities = 20; + entity_t* es = malloc(sizeof(entity_t)*entities); + for (u8 e = 0; e An (x^s) | A x -> A (x^s);; +let pick (r : 'a array) : 'a = r.(Random.int(Array.length r)) +let chance i = (Random.int i) = 0 +let cform root = match root with + | Edy x -> x^^"edo" | Xy x -> x^^"cto" | Ation x -> x^^"o" + | Rous x -> x^^"ro" | Le x -> x^^"ulo" | A x -> x^^"o" + | Cy x -> x^^"tico" | Ics x | Ics2 x -> x^^(if chance 2 then "i" else "o") + | Sis x -> x^^"to" + | X x -> x^^"co" | Ality x -> x^^"o" | Ty x -> x^^"to" + | Ication x -> x^^"o" | Tion x -> x^^"to" | Arity x -> x^^"a" + | Sm x -> x^^(if chance 2 then "smo" else "sto") +let bareform root = match root with + | Edy x -> (if chance 2 then x else x^^"ed") | Xy x -> x^^"ct" | Ation x -> x + | Rous x -> x^^"r" | Le x -> x^^"ul" | A x -> x + | Cy x -> x^^"tic" | Ics x -> x^^"ic" | Ics2 x -> x | Sis x -> x^^"t" + | X x -> x^^"c" | Ality x -> x | Ty x -> x^^"t" + | Ication x -> x | Tion x -> x^^"t" | Arity x -> x + | Sm x -> x^^"st" +let adjform root = match root with + | Edy x -> x^^"ic" | Xy x -> x^^"ctic" | Ation x -> x^^"ic" + | Rous x -> x^^"rous" | Le x -> x^^"ulous" | A x -> x^^"e" + | Cy x -> x^^"tical" | Ics x -> x^^"ical" | Ics2 x -> x^^"ic" | Sis x -> x^^"tic" + | X x -> x^^"cal" | Ality x -> x^^"al" | Ty x -> x^^"tical" + | Ication x -> x^^(if chance 3 then "itious" else "icate") + | Tion x -> x^^(match Random.int 4 with + | 0 -> "tive" | 1 -> "ted" | 2 -> "cious" | 3 -> "tory" | _ -> assert false) + | Arity x -> x^^"ary" | Sm x -> x^^(if chance 2 then "stic" else "smic") +let nform root = if chance 7 then (adjform root) ^^ "ness" else match root with + | Edy x -> x^^"edy" | Xy x -> x^^"xy" | Ation x -> x^^(if chance 3 then "itor" else "ation") + | Rous x -> x^^"er" | Le x -> x^^"le" | A x -> x^^"a" + | Cy x -> x^^"cy" | Ics x -> x^^(if chance 3 then "ician" else "ics") | Sis x -> x^^"sis" + | Ics2 x -> x^^(if chance 3 then "ician" else "ics") + | X x -> x^^"x" | Ality x -> x^^"ality" | Ty x -> x^^"ty" + | Ication x -> x^^"ication" | Tion x -> x^^"tion" | Arity x -> x^^"arity" + | Sm x -> x^^(if chance 2 then "st" else "sm") +let abs (w:word) = match w with A x | An x -> x +let append pref w = match pref with + | Inv x -> x ^^ (abs w) + | Vf(body,v) -> match w with + | An x -> body^^x + | A x -> (body^^v)^^x +let rec word () : word = match Random.int 7 with + | 0 -> nform (pick roots) + | 1 -> (match pick nsuffixes with + | An x -> (bareform (pick roots)) ^^ x + | A x -> (cform (pick roots)) ^^ x) + | 2 -> ((adjform (pick roots)) ^^ " ") ^^ (abs(word ())) + | 3 -> ((match pick adjsuffixes with + | An x -> (bareform (pick roots)) ^^ x + | A x -> (cform (pick roots)) ^^ x) ^^ " ") ^^ (abs(word ())) + | 4 -> append (pick prefixes) (word ()) + | 5 -> append (pick prefixes) (pick nsuffixes) + | 6 -> ((append (pick prefixes) (pick adjsuffixes)) ^^ " ") ^^ (abs (word())) + | _ -> assert false +let () = Random.self_init (); print_string (abs (word ())); () ADDED crime.ml Index: crime.ml ================================================================== --- crime.ml +++ crime.ml @@ -0,0 +1,776 @@ +type word = A of string | An of string | Article | Punctuation of string +type node = T of string | Tv of string | P of string | B of node list | N of node | R of node array | Indef | O of node | Fn of (unit -> word) | C of node + +let wconcat x y = match x, y with + | (A(x),An(y)) | (A(x),A(y)) -> A(x^" "^y) + | (An(x),An(y)) | (An(x),A(y)) -> An(x^" "^y) + | _ -> assert false +let wprefix x y = match x, y with + | (A(x),An(y)) | (A(x),A(y)) -> A(x^y) + | (An(x),An(y)) | (An(x),A(y)) -> An(x^y) + | _ -> assert false + +let range min max = (Random.int (max-min)) + min +let chance n = range 0 n = 0 +let pick (r: 'a array) : 'a = r.(range 0 (Array.length r));; + +module CrimeDrug = struct + +let frics = [| "f"; "sh"; "th"; |] +let vfrics = [| "z"; "v"; "zh"; |] +let stops = [| "t"; "p"; "k"; "c"; |] +let vstops = [| "d"; "b"; "g"; "gh"; |] +let withglide r f = Array.map (fun i -> i^f) r +let withonset r o = Array.map (fun i -> o^i) r +let consonants = Array.concat [ + frics; vfrics; stops; vstops; + withonset stops "s"; + [| "w"; "r"; "rh"; "s"; "l"; "ch"; "n"; "m"; |]; +] +let initials = Array.concat [ + consonants; + withglide frics "r"; withglide frics "l"; withglide frics "w"; + withglide stops "r"; withglide vstops "r"; withglide vstops "w"; + [| "qu"; "spr"; "spl"; "str"; "scr"; "scl"; "squ"; "bl"; "gl"; "sn"; "sm"; "j"; "h"; "sph"; "ph";|]; +] +let nuclei = [| "e"; "ee"; "i"; "a"; "ou"; "u"; "oo"; "ea"; "oa"; "ai"; "oi"; "ie";|] +let finals = Array.concat [ + vstops; + withonset stops "s"; withonset stops "r"; withonset stops "l"; + withonset vstops "r"; withonset vstops "l"; + [| "gh"; "ck"; "ce"; "ss"; "se"; "nd"; "mb"; "mph"; "nk"; "tch"; "ke"; "ght"; + "ff"; "ll"; "zz"; "t"; "p"; "th"; "rth"; "lth"; "dge"; "nge"; "ng"; "ft"; "ckle"; "ngle"; "rkle"; + "scht"; "ze"; "x"; "sh"; "rsh"; "lsh"; "ggle"; "ddle"; "bble"; "pple"; "rge"; "lge"; "ve"; "rve"; + "lve"; "ffle"; "ttle"; "kle"; "sch"; "m"; "n"; "rm"; "lm"; "rn"; "ln";|] +] +let prefixes = [| A "crack"; A "crystal"; A "powdered"; A"raw"; A "pure"; A "liquid"; + A"street"; A "super"; An "electric"; A "diced"; A "homemade"; A "traditional"; + An "old-school"; A "purified"; A "high-caliber"; A "high-octane"; An "old-fashioned"; + A "good old"; A "honest-to-god"; A "weapons-grade"; A "soviet"; An "american"; + A "canadian"; A "british"; A "russian"; A "synthetic"; A "french"; A "cyber"; |] + +let makeA i x = A(i ^ x) +let makeAn x = An x +let maybeConcat x y = match x with + | Some t -> wconcat t y + | None -> y +let gen () : word = maybeConcat (if chance 3 then Some (pick prefixes) else None) + ((if chance 5 then makeAn else makeA (pick initials)) + ((pick nuclei) ^ (pick finals))) + +end + +let rec crime = R [| + Tv "arson"; + T "murder"; + T "jaywalking"; + T "larceny"; + T "sex"; + T "intercourse"; + T "acts unspeakable"; + T "public indecency"; + T "software piracy"; + T "piracy"; + T "theft"; + T "regicide"; + Tv "assault"; + T "battery"; + T "treason"; + T "bribery"; + T "manslaughter"; + T "bestiality"; + T "assault and battery"; + T "corruption"; + T "corruption of a minor"; + T "highway robbery"; + T "banditry"; + T "cattle rustling"; + T "looting"; + T "war crimes"; + T "crimes against humanity"; + T "breach of contract"; + T "crime"; + T "crimes"; + T "burglary"; + T "vandalism"; + T "robbery"; + T "forgery"; + T "counterfeiting"; + T "stalking"; + T "sabotage"; + T "sedition"; + T "shoplifting"; + T "corrupt practices"; + T "fire-raising"; + T "genocide"; + T "desertion"; + T "defamation"; + T "embezzlement"; + T "immigration"; + T "emigration"; + T "illegal immigration"; + T "illegal emigration"; + T "endangerment"; + T "extortion"; + T "failure to appear in court"; + T "abduction"; + T "kidnapping"; + T "fraud"; + T "tax fraud"; + T "homicide"; + T "extortion"; + T "mutiny"; + T "extortion"; + T "perverting the course of justice"; + T "perversion"; + T "tweeting"; + T "blogging"; + T "mommyblogging"; + T "vlogging"; + T "posting"; + T "posts"; + T "trespass"; + T "broadcasting"; + T "assembly"; + T "war profiteering"; + T "blackmail"; + T "cybercrime"; + T "espionage"; + T "hijacking"; + T "hooliganism"; + T "perjury"; + T "refusal to serve in a public office"; + B [ T "failure to appear before"; Indef; profession ]; + B [ T "refusal to serve as"; Indef; profession ]; + B [ T "stalking"; O(T"of"); Indef; profession ]; + B [ T "solicitation of"; Indef; profession ]; + B [ T "bribery of"; Indef; profession; ]; + B [ T "cruelty to"; Indef; profession; ]; + B [ T "fraudulent"; practice; ]; + B [ T "misuse of"; Indef; thing; ]; + B [ thing; T "forging"; ]; + B [ T "obtaining"; Indef; thing; T "by deception"; ]; + B [ T "detonation of"; R[|B[Indef; thing];thingp|]; ]; + B [ T "conspiracy to commit"; O prefix; crime; ]; + B [ T "conspiracy to practice"; O prefix; practice ]; + B [ T "possession of"; + R[| + B[Indef; thing]; + thingp; + Fn CrimeDrug.gen; + |]; + O(T "with intent to distribute") + ];B [ T "use of"; + R[| + B[Indef; thing]; + thingp; + Fn CrimeDrug.gen; + |]; + ]; + B [ T "conspiracy to misuse"; Indef; thing ]; + T "tax evasion"; + T "fare evasion"; + B [ T "conduct unbecoming"; Indef; profession ]; + B [ T "deployment of"; Indef; thing ]; + B [ R[|T "provision of"; T "distribution of"|]; R[| + B[Indef; thing]; + thingp; + Fn CrimeDrug.gen; + |]; + O(R[|T"to minors"; T"to a minor"|]); + ]; + B [ Tv "purchase of"; Indef; thing ]; + B [ Tv "delivery of"; Indef; thing; T "to"; Indef; profession]; +|] and gerundcrime = R [| + B [ T "impersonating"; Indef; profession ]; + B [ T "breaking and"; doing; ]; + B [ T "practicing"; O prefix; practice; ]; + B [ T "practicing the"; instrument; ]; + B [ Tv "approaching"; Indef; profession ]; + B [ T "receiving stolen"; thingp ]; + B [ T "deploying"; Indef; thing ]; + T "being horny"; + T "marketing"; + T "advertising"; + T "unlawful restraint"; + T "trespassing"; +|] and doing = R [| + Tv "entering"; + T "decorating"; + Tv "invoking"; + Tv "evoking"; + Tv "insulting"; + Tv "advertising"; + Tv "mentoring"; + Tv "bantering"; + Tv "yiffing"; + Tv "posting"; + Tv "tweeting"; + Tv "blogging"; +|] and practice = R [| + T "falconry"; + T "dentistry"; + T "philosophy"; + T "linguistics"; + T "conjuration"; + T "illusion"; + T "mathematics"; + T "set theory"; + T "math"; + T "physics"; + T "astrophysics"; + T "natural philosophy"; + T "chemistry"; + T "engineering"; + T "marketing"; + T "advertising"; + T "blogging"; + T "tweeting"; + T "posting"; + B[T "forensic"; practice]; +|] and instrument = R [| + T "clarinet"; + T "piano"; + Tv "oboe"; + T "flute"; + T "violin"; +|] and thing = R [| + T "clarinet"; + T "piano"; + T "deadly weapon"; + T "firearm"; + T "weapon"; + T "sex doll"; + T "rhinocerous"; + T "farm animal"; + T "landmine"; + T "rocket launcher"; + T "rocket-propelled grenade"; + T "grenade"; + T "ballistic missile"; + T "ICBM"; + T "rifle"; + T "vibrator"; + Tv "assault rifle"; + Tv "assault weapon"; + Tv "automatic weapon"; + Tv "artifact"; + Tv "orb"; + T "cursed object"; + Tv "infectious disease"; + T "nuclear weapon"; + T "bioweapon"; + T "chemical weapon"; + T "memetic hazard"; + T "metaphor"; + T "simile"; + Tv "analogy"; + T "turkey baster"; + T "rolling pin"; + T "household item"; + Tv "appliance"; + T "blog"; + T "post"; + T "tweet"; +|] and thingp = R [| + T "clarinets"; + T "pianos"; + T "deadly weapons"; + T "firearms"; + T "weapons"; + T "sex dolls"; + T "rhinoceri"; + T "farm animals"; + T "landmines"; + T "rocket launchers"; + T "rocket-propelled grenades"; + T "grenades"; + T "ballistic missiles"; + T "ICBMs"; + T "rifles"; + T "vibrator"; + T "handcuffs"; + Tv "assault rifles"; + Tv "assault weapons"; + Tv "automatic weapons"; + Tv "artifacts"; + Tv "orbs"; + T "hazardous materials"; + T "gender"; + T "cursed objects"; + Tv "infectious diseases"; + Tv "internet access"; + T "nuclear material"; + T "nuclear weapons"; + T "bioweapons"; + T "chemical weapons"; + T "memetic hazards"; + T "cognitohazardous materials"; + T "propaganda"; + T "metaphors"; + T "similes"; + Tv "analogies"; + T "turkey basters"; + T "rolling pins"; + T "household items"; + Tv "appliances"; + T "stolen property"; + T "blogs"; + T "posts"; + T "tweets"; +|] and profession = R [| + T "public official"; + Tv "officer of the law"; + T "justice of the peace"; + T "locksmith"; + T "blacksmith"; + T "silversmith"; + T "magician"; + T "conjurer"; + Tv "illusionist"; + T "criminal"; + T "career criminal"; + T "drug dealer"; + T "schoolteacher"; + T "con artist"; + T "conman"; + T "burglar"; + T "poet"; + Tv "artisan"; + Tv "artist"; + T "courtesan"; + T "street artist"; + T "bartender"; + T "cattle rustler"; + T "celebrity"; + T "blogger"; + T "mommyblogger"; + B [ T "professor of"; practice ]; + B [ T "master of"; practice ]; + B [ practice; T "master" ]; + B [ practice; T "professor" ]; + B [ practice; T "expert" ]; + B [ thing; T "expert" ]; +|] and prefix = R [| + Tv "unjustified"; + Tv "unjustifiable"; + T "justifiable"; + Tv "unspeakable"; + T "tactless"; + Tv "indecent"; + Tv "intemperate"; + Tv "attempted"; + Tv "unlawful"; + T "malicious"; + Tv "aggravated"; + T "dread"; + T "horny"; + T "erotic"; + T "sexual"; + T "careless"; + T "negligent"; + T "first-degree"; + T "second-degree"; + T "third-degree"; + T "culpable and reckless"; + T "criminal"; + T "illegal"; + T "forcible"; + T "fractal"; +|] and suffix = R [| + B [ T "with intent to commit"; crime ]; + T "in a public place"; + T "in a court of law"; + T "on public transit"; + T "on the high seas"; + Tv "in anger"; + T "without a license"; + T "without lawful cause"; + B [ T "in the commission of"; crime ]; + B [ T "with"; Indef; thing ]; + B [ T "with"; thingp ]; + B [ T "with multiple"; thingp ]; + T "with intent to provoke a breach of the peace"; + T "with intent to commit a breach of the peace"; + B [ T "while acting in an official capacity"; O(B[T"as"; Indef; profession])]; + B [ T "in the presence of"; Indef; profession ]; + T "in the first degree"; + T "in the second degree"; + T "in the third degree"; + T "in the vicinity of a school"; + T "with malice aforethought"; + T "with malicious intent"; + T "with violent intent"; + B [ T "unbecoming"; Indef; profession ]; + T "under false pretenses"; +|] + +let charge = R [| + B[ O prefix; crime; O suffix; ]; + B[ prefix; practice; O suffix; ]; + B[ gerundcrime; O suffix; ]; +|] + +let rec eval node : word list = match node with + | T x -> [A x] + | Tv x -> [An x] + | B l -> List.fold_left (fun (a:word list) (n:node) : word list -> a @ (eval n)) [] l + | P p -> [Punctuation p] + | R a -> eval(pick a) + | O n -> if chance 2 then eval n else [] + | Fn f -> [f ()] + | Indef -> [Article] + | N n -> eval n (* unnecessary? *) + | C n -> match eval n with + | A i :: rs-> A(String.capitalize_ascii i) :: rs + | An i :: rs-> An(String.capitalize_ascii i) :: rs + | _ as i -> i + +(* TODO: make tail-recursive *) +let rec flatten (s : word list) : string = match s with + | Article :: A w :: rs -> " a "^w^(flatten rs) + | Article :: An w :: rs -> " an "^w^(flatten rs) + | Punctuation p :: rs -> p^(flatten rs) + | A w :: rs | An w :: rs -> " "^w^(flatten rs) + | [] -> "" + | _ -> assert false + +let numbers = R [| T "two"; T "three"; T "four"; T "five"; T "six"; T "seven"; + Tv "eight"; T "nine"; T "ten"; |] +let court = B[ + R[|T "the"; T "this"; |]; + O(R[|T "august"; T "noble"; T "glorious"; T "honorable"; T "grand"; + T "eminent"; T "splendid"; T "superb"; T "infallible"; T "holy"; + T "supreme";|]); + R[|T "court"; T "tribunal"; T "court of law"; T "committee"; + Tv "inquisition"; |]; +] +let accusation = C(B [ + Tv "you"; + R [| + R[| + B[ + T "stand"; + R[| + T "here"; + B[T "before"; court;]; + |]; + O(T "today"); + ] + |]; + Tv "are"; + |]; + R[| + B[T "to face justice for"; O(B[numbers; T "counts of"])]; + B[ + R[| + Tv "accused"; + T "to face charges"; + T "to answer charges"; + |]; + R[| + B[Tv "on"; numbers; T "counts of"]; + Tv "of"; + |] + ]; + |]; + charge; + P "."; + O(R[| + T "How do you plead?"; + T "What say you?"; + T "How do you answer the charges?"; + T "What is your plea?"; + T "Explain yourself!"; + |]); +]) +let sentence = B[ + R[| + B[ + R[| T "You are"; T "The defendant is"; T "The accused party is"; |]; + O(T "hereby"); + O(T "stripped of all rank and"); + R[|T "sentenced"; T "condemned"|]; + ]; + B[ + Tv "I"; + O(T "hereby"); + R[|T "sentence"; T "condemn"|]; + R[| T "you"; T "the defendant"; T "the accused party";|]; + ]; + |]; + T "to"; +] +let condemnation = B[ + sentence; + R[| + B[ + T "die"; + O(T "screaming"); + O(T "in agony"); + O(B[ + T "by"; + O(T "prolonged"); + O(T "ritual"); + O(T "public"); + R[| T "beheading"; T "strangulation"; T "torture"; + T "industrial negligence"; T "slow slicing"; T "lethal injection"; + T "disembowelment"; T "drowning"; T "burning"; + T "burning at the stake"; T "emasculation"; T "irradiation"; + T "stabbing"; T "poisoning"; T "flaying"; T "roasting"; + T "boiling"; T "boiling in oil"; T "boiling in acid"; + T "crucifixion"; |] + ]); + ]; + T "hang"; + T "hang until dead"; + T "hang until you are dead"; + T "be drawn and quartered"; + T "drown"; + T "burn"; + T "burn at the stake"; + T "be burned"; + T "be burned at the stake"; + T "be broken on the wheel"; + T "be torn apart by wild horses"; + |]; + O(R[| + B[ + T "at"; + R[| + T "dawn"; T "dusk"; T "noon"; T "high noon"; T "sunrise"; T "sunset"; + |] + ]; + T "within one week"; + T "within the hour"; + T "by day's end"; + |]) +] +let imprisonment = B[ + sentence; + R[| + B[ + R[|T "two"; T "three"; T "four"; T "five"; T "six"; T "seven"; + Tv "eight"; T "nine"; T "ten";|]; + R[|T "seconds"; T "minutes"; T "days"; T "weeks"; T "years"; T "decades"; T "millennia"; + T "hundred years"; T "thousand years"; Tv "eons"; Tv "ages"; Tv "eras"; T "million years"; + T "billion years"; T "trillion years"; |]; + ]; + B[ + R[|Indef;Tv "one";|]; + R[|T "second"; T "minute"; T "day"; T "week"; T "year"; T "decade"; T "millennium"; + T "hundred years"; T "thousand years"; Tv "eon"; Tv "age"; Tv "era"; T "million years"; + T "billion years"; T "trillion years"; |]; + ]; + Tv "a lifetime"; + Tv "an eternity"; + |]; + R[|Tv "of community service"; Tv "in state prison"; Tv "in federal prison"; Tv "in prison"; + Tv "of jail time"; Tv "of prison time"; B[T "without"; R[|B[Indef; thing];thingp|];]; + Tv "alone"; T "in the gulag"; Tv "in a labor camp"; Tv "in the county jail"; + T "thinking about what you've done"; Tv "of penance"; Tv "in the Box"; + Tv "in the Shame Cube"; Tv "in the nightmares of children"; + Tv "in a magic lamp";Tv "in a cursed mirror"; Tv "of indentured servitude"; Tv "of slavery";|]; +] +let status = R[| + T "citizenship"; + T "rank"; + T "all rank"; + T "all status"; + T "all rights"; + T "all privileges"; + T "all clearances"; + T "all certifications"; +|] +let banishment = B [ + R[| + B[ + T "You are"; + O(T "hereby"); + O(B[T "stripped of your citizenship and";]); + O(T "forever"); + R[|T "exiled"; T "banished";|]; + ]; + B[ + R[|T "The defendant is"; T "The accused party is"; |]; + O(T "hereby"); + O(B[T "stripped of"; R[|T"her"; T"his"; T"its"; T"their";|]; T "citizenship and";]); + O(T "forever"); + R[|T "exiled"; T "banished";|]; + ]; + B[ + Tv "I"; + O(T "hereby"); + O(T "strip you of your citizenship and"); + R[|T "exile"; T "banish";|]; + T "you"; + O(T "forever"); + ]; + |]; + O(B[ + T "from"; + R[| + T "the Realm"; + T "the Kingdom"; + T "the Empire"; + T "the Republic"; + T "the Federation"; + |]; + ]); + O(B[ + T "to"; + O(B[O(T"forever"); T "wander"]); + T "the"; + R[| + T "howling"; + T "dark"; + T "empty"; + T "abyssal"; + T "cursed"; + T "abandoned"; + T "barbarous"; + T "forgotten"; + T "lost"; + T "forsaken"; + T "desert"; + |]; + R[| + T "marshes"; + T "woods"; + T "forest"; + T "marsh"; + T "plain"; + T "plains"; + T "wastes"; + T "pit"; + T "shores"; + T "desert"; + |]; + ]); +] +let order = B [ + R[| + B[ + R[| T "You are"; T "The defendant is"; T "The accused party is"; |]; + O(T "hereby"); + O(B[T "stripped of"; status; Tv "and";]); + R[|T "ordered"; T "commanded"; T "enjoined"; T "required";|]; + ]; + B[ + Tv "I"; + O(T "hereby"); + R[| + B[T "strip you of"; status; T "and"; + R[|T "order"; T "command"; T "enjoin"; T "require";|]; + T "you"; + ]; + |]; + ]; + |]; + T "to"; + R[| + B[T "perform"; R[|T "one"; numbers;|]; T "hundred jumping jacks"]; + T "make amends"; + T "beg forgiveness"; + T "do the right thing"; + T "bleed"; + T "sacrifice your firstborn"; + T "forever quit the land of your birth"; + B[ + T "pay a fine of"; + numbers; (* TODO better numbers *) + O(R[|T "hundred"; T "thousand"; T "hundred thousand"; T "million"; T "billion"; T "trillion";|]); + R[| T "dollars"; T "credits"; T "units"; T "cows"; T "heads of cattle"; T "sand dollars"; + T "gold"; T "silver"; T "pounds"; T "pence"; T "pounds stirling"; T "talents"; + T "sovereigns"; T "dried yak teeth"; T "cursed fairy coins"; T "ultradollars";|]; + ]; + |]; +] +let reduce = B [ + R[| + B[ + R[| T "You are"; T "The defendant is"; T "The accused party is"; |]; + O(T "hereby"); + O(B[T "stripped of"; status; Tv "and";]); + R[|T "condemned"; T "reduced"; T "reassigned";|]; + ]; + B[ + Tv "I"; + O(T "hereby"); + R[| + B[T "strip you of"; status; T "and"; + R[|T "condemn"; T "reduce"; T "reassign";|]; + T "you"; + ]; + B[ + T "strip"; + R[|T "the defendant"; T "the accused party";|]; + Tv "of"; status; T "and"; + R[|T "condemn"; T "reduce"; T "reassign";|]; + R[|T "her"; T "him"; T "it"; T "them";|]; + ]; + B[ + R[|T "condemn"; T "reduce"; T "reassign";|]; + R[|T "you"; T "the defendant"; T "the accused party";|]; + ]; + |]; + ]; + |]; + T "to"; + R[| + T "slavery"; + T "undercaste status"; + T "prole status"; + T "servitude"; + T "Infrared Clearance"; + T "unskilled labor"; + T "kitchen duty"; + T "sanitation duty"; + T "court jester"; + |]; +] +let conviction = C(B [ + O(B[ + R[| + B[Tv "in the"; + R[|T"name";T"sight";T"name and sight";T "great and terrible name";|]]; + B[T "by the"; + R[|T"grace";T"power";T"grace and power";T"will";|]]; + |]; + Tv "of"; + R[| + T "the Queen"; T "the King"; T "her Majesty the Queen"; T "his Majesty the King"; + T "all that is holy"; T "justice"; T "God"; T "the Lord"; T "the Sultan"; T "the Caliph"; + T "the Prince"; T "the Princess"; T "the Realm"; T "the Kingdom"; T "our infernal master"; + T "Satan"; T "Lucifer"; T "Heaven"; T "the heavens"; T "the Prophet"; T "Yaldabaoth"; + T "Heaven and all its angels"; T "our Creator"; T "the Maker"; T "the spirits"; + |]; + P ","; + ]); + R[| + B[court; + O(T "hereby"); + R[| T "finds"; T "declares"; T "proclaims"; T "pronounces"; T "judges"; Tv "adjuges";|]; + ]; + B[Tv "I"; + O(T "hereby"); + R[| T "find"; T "declare"; T "proclaim"; T "pronounce"; T "judge"; Tv "adjudge"|]; + ] + |]; + R[| T "you"; T "the defendant"; T "the accused party";|]; + T "guilty"; + O(Tv "on all counts"); + Tv "of"; + charge; + P"."; + O(B[ + R[|imprisonment; reduce; order; banishment; condemnation; T"Get in the Crime Hole";|]; + P"."; + ]); +]) +let global = R[|conviction; accusation;|] +let () = Random.self_init (); + print_string + (String.trim + (flatten + (eval global))) ADDED drug.ml Index: drug.ml ================================================================== --- drug.ml +++ drug.ml @@ -0,0 +1,185 @@ +let frics = [| "f"; "sh"; "th"; |] +let vfrics = [| "z"; "v"; "zh"; |] +let stops = [| "t"; "p"; "k"; "c"; |] +let vstops = [| "d"; "b"; "g"; "gh"; |] +let withglide r f = Array.map (fun i -> i^f) r +let withonset r o = Array.map (fun i -> o^i) r +let consonants = Array.concat [ + frics; vfrics; stops; vstops; + withonset stops "s"; + [| "w"; "r"; "rh"; "s"; "l"; "ch"; "n"; "m"; |]; +] +let initials = Array.concat [ + consonants; + withglide frics "r"; withglide frics "l"; withglide frics "w"; + withglide stops "r"; withglide vstops "r"; withglide vstops "w"; + [| "qu"; "spr"; "spl"; "str"; "scr"; "scl"; "squ"; "bl"; "gl"; "sn"; "sm"; "j"; "h"; "sph"; "ph";|]; +] +let nuclei = [| "e"; "ee"; "i"; "a"; "ou"; "u"; "oo"; "ea"; "oa"; "ai"; "oi"; "ie";|] +let finals = Array.concat [ + vstops; + withonset stops "s"; withonset stops "r"; withonset stops "l"; + withonset vstops "r"; withonset vstops "l"; + [| "gh"; "ck"; "ce"; "ss"; "se"; "nd"; "mb"; "mph"; "nk"; "tch"; "ke"; "ght"; + "ff"; "ll"; "zz"; "t"; "p"; "th"; "rth"; "lth"; "dge"; "nge"; "ng"; "ft"; "ckle"; "ngle"; "rkle"; + "scht"; "ze"; "x"; "sh"; "rsh"; "lsh"; "ggle"; "ddle"; "bble"; "pple"; "rge"; "lge"; "ve"; "rve"; + "lve"; "ffle"; "ttle"; "kle"; "sch"; "m"; "n"; "rm"; "lm"; "rn"; "ln";|] +] +let range min max = (Random.int (max-min)) + min +let chance n = range 0 n = 0 +let pick (r: 'a array) : 'a = r.(range 0 (Array.length r));; +let prefixes = [| "crack"; "crystal"; "powdered"; "raw"; "pure"; "liquid"; "street"; + "super"; "electric"; "diced"; "homemade"; "traditional"; "old-school"; "purified"; + "high-caliber"; "high-octane"; "old-fashioned"; "good old"; "honest-to-god"; + "weapons-grade"; "soviet"; "american"; "canadian"; "british"; "russian"; + "synthetic"; "french"; "cyber"; |] +let word () = (if chance 3 then (pick prefixes) ^ " " else "") ^ + (if chance 5 then "" else pick initials) ^ + (pick nuclei) ^ + (pick finals) + +let greets = [| "hey"; "whassup"; "what's up"; "what up"; "yo"; "hey there"; "what's shakin'" |] +let names = [| "dude"; "bro"; "man"; "babe"; "sweetheart"; "honey"; "baby"; "hottie"; "girl"; |] +let questions = [| "wanna"; "want to"; "shall we"; "how about we"; |] +let exhorts = [| "we oughta"; "you oughta"; "we ought to"; "you ought to"; "we should"; + "you should"; "let's"; |] +type component = Invariant of string | Numbered of string * string | Poss +type state = Plain of string | Compound of component list +let states = [| + Plain "high"; + Compound[Invariant "out of"; Poss; Numbered("mind","minds")]; + Compound[Invariant "outta"; Poss; Numbered("mind","minds")]; + Plain "fucked up"; + Plain "wrecked"; + Plain "hammered"; + Plain "buzzed"; + Plain "tweaked"; + Plain "whacked"; + Plain "whacked out"; + Plain "smacked"; + Plain "smacked out"; + Plain "tipsy"; + Plain "snazzy"; + Plain "spooky"; + Plain "crazy"; + Plain "messed up"; + Plain "far out"; + Plain "horny"; + Plain "psycho"; + Plain "loony"; + Plain "wacky"; + Plain "silly"; + Plain "creepy"; + Plain "frazzled"; + Plain "dazzling"; + Plain "wired"; + Plain "peppy"; + Plain "hoovered"; + Plain "turnt"; + Plain "turnt up"; + Plain "tits-up"; + Plain "toasted"; + Plain "roasted"; + Plain "cooked"; + Plain "baked"; + Plain "basted"; + Plain "flunked"; + Plain "flunked out"; + Plain "crazed"; + Plain "stewed"; + Plain "framed for war crimes"; + Plain "ruined"; + Plain "totally ruined"; + Plain "whacked out"; + Plain "creeped out"; + Plain "spunky"; + Plain "spiffy"; + Plain "nifty"; + Plain "wicked"; + Plain "slutty"; + Plain "jazzed"; + Plain "jazzy"; + Plain "fried"; + Plain "hecked"; + Plain "hecked up"; + Plain "hecked out"; + Plain "screwed"; + Plain "screwed up"; + Plain "ousted"; + Plain "thrown out of the mall"; + Plain "cyber"; + Plain "totally online"; + Plain "cybered"; + Plain "downloaded"; +|] +let roas = [| "on"; "shooting up"; "using"; "mainlining"; "snorting"; "vaping"; "smoking"; "cybering"; + "sucking down"; "gargling"; "doing"; "trying"; "guzzling"; "popping"; "downing"; "chewing"; + "crunching"; "sniffing"; "zapping"; "downloading"; "dropping"; "cooking up"; "freebasing"|] +let vroas = [| "shoot up"; "mainline"; "snort"; "vape"; "smoke"; "freebase"; + "suck down"; "gargle"; "do"; "try"; "guzzle"; "pop"; "down"; "chew"; "crunch"; + "sniff"; "zap"; "download"; "drop"; "cyber"; "cook up"; |] +module Pronoun = struct + type t = { + nom : string; obl : string; gen : string; + refl : string; cop : string; brevcop : string; + pl : bool; + } + let you = {nom = "you"; obl = "you"; gen = "your"; refl = "yourself"; + cop = "are"; brevcop = "'re"; pl = false;} + let youpl = {nom = "you"; obl = "you"; gen = "your"; refl = "yourself"; + cop = "are"; brevcop = "'re"; pl = true;} + let he = {nom = "he"; obl = "him"; gen = "his"; refl = "himself"; + cop = "is"; brevcop = "'s"; pl = false;} + let they = {nom = "they"; obl = "them"; gen = "their"; refl = "themselves"; + cop = "are"; brevcop = "'re"; pl = true;} + let she = {nom = "she"; obl = "her"; gen = "her"; refl = "herself"; + cop = "is"; brevcop = "'s"; pl = false;} + let me = {nom = "I"; obl = "me"; gen = "my"; refl = "myself"; + cop = "am"; brevcop = "'m"; pl = false;} + let we = {nom = "we"; obl = "us"; gen = "our"; refl = "ourselves"; + cop = "are"; brevcop = "'re"; pl = true;} + let all = [| you; youpl; he; they; she; me; we |] +end +let cop p = Pronoun.(if chance 4 then p.nom ^ " " ^ p.cop else p.nom^p.brevcop) +let makestate p s = + let eval c = match c with + | Invariant i -> i + | Numbered(sg,pl) -> if p.Pronoun.pl then pl else sg + | Poss -> p.Pronoun.gen + in match s with + | Plain t -> t + | Compound l -> List.fold_left (fun a t -> if a = "" then a^(eval t) else a^" "^(eval t)) "" l +let gethigh p = (cop p) ^ (pick [|" getting "; " gonna get "; " "|]) ^ (pick [|"";"so "|]) + ^ (makestate p (pick states)) ^ " on " ^ (word ());; +let cantwait p = p.Pronoun.nom ^ " can't wait to get " ^ (makestate p (pick states)) ^ " on " ^ (word ());; +let affecting p = + if chance 2 then + (pick [| + "it's got"; "it's getting"; "it got"; "it has"; + "it's making"; "it's gonna get"; "it's gonna make" + |]) ^ " " ^ p.Pronoun.obl + else Pronoun.(pick [| + p.nom ^ " got"; + (cop p) ^ " getting"; + (cop p) ^ " gonna get"; + (cop p); + |]);; +let gotso p = (affecting p) ^ (pick [|" ";" so "|]) ^ (makestate p (pick states));; +let ison p = (cop p) ^ " " ^ (pick roas) ^ " " ^ (pick [|"so much ";"too much ";"way too much ";"a lotta ";"a lot of "; "a ton of "; "a whole lotta "; "a whole lot of ";"";""|]) ^ (word ());; +let isonand p = (ison p) ^ " and " ^ (gotso p) + +let offer p name (* haaaack *) = (pick greets) ^ " " ^ name ^ (pick [|"! "; ", "; ". "; " - ";|]) ^ + if chance 2 then + (pick questions) ^ (pick [|" go "; " "|]) ^ (pick vroas) ^ (pick [|" some "; " "|]) ^ + (word ()) ^ (if chance 2 then " and get " ^ (makestate p (pick states)) else "") ^ "?" + else + (pick exhorts) ^ (pick [|" go "; " "|]) ^ (pick vroas) ^ (pick [|" some "; " "|]) ^ + (word ()) ^ (if chance 2 then " and get " ^ (makestate p (pick states)) else "") ^ + (pick [|"!";"";"."|]);; +let offer_wrap p (* haaaack *) = offer Pronoun.you (pick names) +let gotsoand p = (gotso p) ^ " " ^ (pick roas) ^ (pick [|" the "; " that "; " all that ";" some ";|]) ^ (word ()) +let routes = [| gethigh; ison; isonand; offer_wrap; gotsoand; cantwait; |] +let main = Random.self_init (); + if Array.length Sys.argv >= 2 && String.length (String.trim (Sys.argv.(1))) >= 1 then + print_string(offer Pronoun.you (String.trim Sys.argv.(1))) + else print_string (pick routes (pick Pronoun.all)) ADDED dx.ml Index: dx.ml ================================================================== --- dx.ml +++ dx.ml @@ -0,0 +1,109 @@ +let range min max = (Random.int (max-min)) + min +let chance n = range 0 n = 0 +let pick (r: 'a array) : 'a = r.(range 0 (Array.length r));; + +let prefixes = [| + "anarcho"; "diabolo"; "psycho"; "neuro"; "socio"; "ego"; "mesmo"; +|] +let suffixes = [| + "phrenia"; "pathy"; "sis"; "tism"; "clasm"; +|] +let adjs = [| + "eboulliant"; "gangrenous"; "hysterical"; "malicious"; "diabolical"; "injunctive"; "gregarious"; "apocalyptic"; "felonious"; "oppositional"; "defiant"; "dextrous"; "harmonious"; "disharmonious"; "defective"; "reactive"; "magnificent"; "misogynistic"; "egalitarian"; "paraphilic"; "deviant"; "subjunctive"; "indicative"; "optative"; "jussive"; "judicial"; "precarious"; "disjunctive"; "redactive"; "[REDACTED]"; "criminal"; "illegal"; "psychotic"; "delusional"; "lawful"; "unlawful"; "inferior"; "superior"; "psychotic"; "histrionic"; "borderline"; "schizoid"; "theoretic"; "theoretical"; "Marxist"; "Leninist"; "Chomskyite"; "selective"; "clinical"; "sub-clinical"; "dominant"; "latent"; "submissive"; "orgasmic"; "orgiastic"; "optimistic"; "pessimistic"; "depressive"; "manic"; "dysfunctional"; "redundant"; "reciprocal"; "reflexive"; "didactic"; "syntonic"; "asymptomatic"; "asymptotic"; "infinite"; "diabetic"; "carcinogenic"; "diabetic"; "adiabatic"; +|] +let parts = [| + "ego"; "id"; "superego"; "posterior"; "hindbrain"; "forebrain"; "forehead"; "kidney"; "appendix"; "elbow"; "intestinal tract"; "bile"; "ichor"; "blood"; +|] +let dtnames = [| + "kreutz"; "hammar"; "feld"; "holtz"; "mann"; "eich"; "berger"; "wald"; "grund"; "weiss"; "schmerz"; "welt"; "sturm"; "blitz"; "reich"; "blitzen"; "brauch"; "ratten"; "huber"; "bliss"; "blatt"; "gott"; "zeit"; "leute"; "haupt"; "bann"; "eich"; "schaft"; "hund"; "stein"; "pferd"; "wurst"; "brot"; "lauf"; "glück"; "freund"; "feldt"; "stadt"; "dorf"; "bahn"; "euch"; "brandt"; "blut"; "knorpel"; +|] +let names = [| "Chomsky"; "Marx"; "Lenin"; "Mao"; "Freud"; "Asperger";|] +let name () = if chance 6 then (pick names) else String.capitalize_ascii ((pick dtnames) ^ (pick dtnames)) + +let kinds = [| + "disorder"; + "defect"; + "dysfunction"; + "personality disorder"; + "syndrome"; + "personality defect"; + "defect"; + "illness"; + "psychopathy"; + "sociopathy"; + "tendency"; + "delusion"; + "hysteria"; + "psychosis"; + "neurosis"; + "dementia"; + "schizophrenia"; + "effect"; + "mutism"; + "autism"; + "corruption"; + "mania"; +|] + + + +let rec subform () = match range 0 12 with + | 0 -> (pick adjs) ^ " " ^ (pick kinds) + | 1 -> (pick adjs) ^ "-" ^ (pick adjs) ^ " " ^ (pick kinds) + | 2 -> (name ()) ^ " " ^ (pick kinds) + | 3 -> (name ()) ^ " " ^ (subform ()) + | 4 -> (name ()) ^ "-type " ^ (subform ()) + | 5 -> (subform()) ^ " of the " ^ (pick parts) + | 6 -> (pick adjs) ^ " " ^ (subform ()) + | 7 -> (pick adjs) ^ " " ^ (pick prefixes) ^ (pick suffixes) + | 8 -> (pick prefixes) ^ "-" ^ (pick adjs) ^ " " ^ (pick kinds) + | 9 -> (pick parts) ^ " " ^ (pick kinds) + | 10 -> (name ()) ^ "-" ^ (subform ()) + | 11 -> (pick parts) ^ "-" ^ (pick adjs) ^ " " ^ (pick kinds) + | _ -> assert false + +let modifiers = [| + "a peculiar case of"; + "a peculiar form of"; + "an unusual case of"; + "an unusual form of"; + "a remarkable case of"; + "a remarkable form of"; +|] +let form () = (if chance 4 then (pick modifiers) ^ " " else "") ^ match range 0 3 with + | 0 -> subform () + | 1 -> (name ()) ^ "'s " ^ (subform ()) + | 2 -> "the " ^ (subform ()) + | _ -> assert false + +let dxs = [| + "suffering from"; + "afflicted by"; + "displaying"; + "displaying the characteristics of"; + "displaying the characteristic behavior of"; + "crippled by"; + "under the influence of"; +|] +let msg () = match (if chance 4 then 0 else range 0 5) with + | 0 -> (pick [| + "You appear to be"; + "You would appear to be"; + "You seem to be"; + "You would seem to be"; + "I can only hypothesize that you are"; + "You are"; + "It seems you are"; + "I can only come to the conclusion that you are"; + "The only conclusion I can come to is that you are"; + "I can conclude only that you are"; + "Clearly, you are"; + "You are clearly";|]) ^ " " ^ (pick dxs) ^ " " ^ (form()) + | 1 -> "As clear a case of " ^ (form ()) ^ " as I've ever seen" + | 2 -> "Clearly a case of " ^ (form ()) + | 3 -> "Clearly a sad case of " ^ (form ()) + | 4 -> "The symptoms are remarkably reminiscent of " ^ (form()) ^ ", as described by " ^ (name()) ^ " in his famous treatise" + | 5 -> "The obvious diagnosis is, of course, " ^ (form()) ^ (if chance 2 then ", though I remain skeptical" else "") + | _ -> assert false + +let () = Random.self_init (); print_string (msg ()) ADDED egret_txt.ml Index: egret_txt.ml ================================================================== --- egret_txt.ml +++ egret_txt.ml @@ -0,0 +1,119 @@ +type root = R of string | I of string*string +type kind = Plain | Vowel | Uncountable +type word = root * kind +let pick a = a.(Random.int (Array.length a)) +let words = [| + (R "egret", Vowel); (I("knife","knives"), Plain); (I("child","children"), Plain); + (R "owl", Vowel); (R "dawn", Uncountable); (R "dawn", Plain); + (R "relic", Plain); (R "home", Plain); (R "hope", Plain); + (R "tower", Plain); (R "plain", Plain); (R "fire", Plain); + (R "fire", Uncountable); (R "fear", Plain); (R "fear", Uncountable); + (R "whisper", Plain); (R "furrow", Plain); (R "field", Plain); + (R "regret", Plain); (R "blade", Plain); (R "thing", Plain); + (R "pillar", Plain); (R "fate", Plain); (R "doom", Plain); + (R "candle", Plain); (R "lantern", Plain); (I("sky","skies"), Plain); + (I("grass","grasses"), Plain); (I("ash","ashes"), Vowel); (R "void", Plain); + (R "stranger", Plain); (R "blood", Uncountable); (R "incompetence", Uncountable); + (R "holiness", Uncountable); (R "sorrow", Uncountable); (R "gladness", Uncountable); + (R "unkindness", Uncountable); (I("cruelty","cruelties"), Plain); + (R "cruelty", Uncountable); (R "ember", Vowel); (R "throat", Plain); +|] +let adjs = [| + "sorrowful";"fiery";"unkind";"fallow";"sallow";"hollow";"unending";"wondrous"; + "vapid";"dim";"shallow";"glorious";"empty";"failing";"dying";"crawling";"ashen"; + "furious";"frightened";"terrible";"awful";"eternal";"silent";"frightful";"timeless"; + "golden";"black";"white";"noble";"defunct"; +|] +let verbs = [| + R "burn", true; R "fear",true; R "slaughter",true; R "explode",false; + R "interrogate",true; R "sleep",false; R "despair",false; R "dissolve",true; + R "question",true; R "slay",true; R "stay",false; R "fade",false; + I("wonder at", "wonders at"),true; R "linger",false; R "die",false; + I("cry out", "cries out"),false; I("cry out at","cries out at"),true; + I("cry","cries"),false; R "weep", false; + I("cry out to","cries out to"),true; +|] +let compl : root array = [| R "hope"; R "believe"; I("wonder if","wonders if"); |];; +let sg (r:root) : string = match r with + | R x -> x + | I(x,_) -> x;; +let pl (r:root) : string = match r with + | R x -> x^"s" + | I(_,x) -> x;; +let indef (w:word) : string = let (r,k) = w in (match k with + | Plain -> "a " + | Uncountable -> "" + | Vowel -> "an ") ^ (sg r);; + +let pron () = pick [| + "it",false; "she",false; "he",false; "they",true; + "we",true; "you",true; +|] +let accpron() = pick [| + "it";"her";"him";"them";"us" +|] +let basenp () : string * bool= let w = pick words in + let (r,k) = w in + let adj = pick [|(pick adjs) ^ " ";""|] in + let rsg = adj ^ (sg r) in + let rpl = adj ^ (pl r) in + let sgs = [| + indef w; + "the " ^ rsg; + "yon " ^ rsg; + "this " ^ rsg; + "that " ^ rsg; + "my " ^ rsg; + "some " ^ rsg; + "your " ^ rsg; + "her " ^ rsg; + "our " ^ rsg; + "its " ^ rsg; + "their " ^ rsg; + "his " ^ rsg; + |] in let pls = [| + pl r; + "the " ^ rpl; + "these " ^ rpl; + "those " ^ rpl; + "my " ^ rpl; + "some " ^ rpl; + "yonder " ^ rpl; + "your " ^ rpl; + "her " ^ rpl; + "our " ^ rpl; + "its " ^ rpl; + "his " ^ rpl; + "their " ^ rpl; + |] in if k = Uncountable then (pick sgs,false) else pick [|(pick sgs,false);(pick pls,true)|] + +let rec gp () : string*bool = let (n,p) = np () in (n ^ " of " ^ (let (n,_) = np() in n)), p +and relp () : string*bool = let (n,p) = basenp () in (n ^ " that " ^ (vp p)), p +and np () : string*bool = (pick [| basenp; basenp; basenp; gp; relp |])() +and pvp p = let verb, trans = pick verbs in + let v = (if p then sg else pl) verb in + let n, _ = (pick [| np(); accpron(),false |]) in + v ^ if trans then (" " ^ n) else "" +(* and cvp (p:bool) : string = + let verb = (pick compl) in + let v = (if p then sg else pl) verb in + let n,p = (pick [|np;pron|])() in + let d = decl n p in + v ^ " " ^ d -- THIS IS HORRIBLY BROKEN *) +and vp p = pvp p +and decl n p = n ^ " " ^ (vp p) ^ (pick [| + (fun()->"."); + (fun()->", and " ^ (s())); + (fun()->", but " ^ (s())); +|]()) +and idques n p = let n2, _ = np() in (if p then "are " else "is ")^n^" "^n2^"?" +and ques n p = (if p then "do " else "does ")^n^" "^(vp true)^"?" +and s () = let (n,p) = pick [|np;pron|] () in (pick [|decl;decl;ques;idques|]) n p;; +let rec times x f = if x > 0 then + (f (); times (x-1) f) + else + ();; +(*let () = Random.self_init (); + times 10 (fun () -> let c = string_of_int ((Random.int 6)+1) in + print_string ("\x1b[1;3"^c^"m-\x1b[0;3"^c^"m "^(s ()) ^ "\n"));;*) +let () = Random.self_init (); print_string ((s ()) ^ "\n");; ADDED lib/bot-cs.scm Index: lib/bot-cs.scm ================================================================== --- lib/bot-cs.scm +++ lib/bot-cs.scm @@ -0,0 +1,16 @@ +(define-macro (rule . body) + (define (make-cases ct body acc) + (if (eq? body '()) acc + (make-cases (+ ct 1) (cdr body) + (cons (list (list ct) (cons 'string-append (car body))) acc)))) + (list 'define (car body) + (cons 'case (cons (list 'random (length (cdr body))) + (make-cases 0 (cdr body) '()) )))) + +(define {list1} + (case (random ct) + ((0) (string-append {list2})) + )) + +(define (pick ar) + (vector-ref ar (random (vector-length ar)))) ADDED lib/bot-gambit.scm Index: lib/bot-gambit.scm ================================================================== --- lib/bot-gambit.scm +++ lib/bot-gambit.scm @@ -0,0 +1,13 @@ +(define-macro (rule . body) + (define (make-cases ct body acc) + (if (eq? body '()) acc + (make-cases (+ ct 1) (cdr body) + (cons (list (list ct) (cons 'string-append (car body))) acc)))) + (list 'define (car body) + (cons 'case (cons (list 'random-integer (length (cdr body))) + (make-cases 0 (cdr body) '()) )))) + +(define (pick ar) + (vector-ref ar (random-integer (vector-length ar)))) + +(random-source-randomize! default-random-source) ADDED monster.ml Index: monster.ml ================================================================== --- monster.ml +++ monster.ml @@ -0,0 +1,113 @@ +let nouns = [| + "verve"; "pulchritude"; "beneficence"; "dismay"; "wit"; + "cheer"; "glee"; "malevolence"; "wickedness"; "cruelty"; + "sagacity"; "splendor"; "pride"; "rage"; "fury"; "snazz"; + "foolishness"; "sleepiness"; "curiosity"; "brevity"; "lust"; + "confidence"; "bashfulness"; "awkwardness"; "terror"; + "accuracy"; "insanity"; "sorrow"; "gladness"; "weariness"; + "depression"; "passion"; "dread"; "popularity"; "vulgarity"; + "madness"; "compassion"; +|] +let mods = [| + "filled"; "overcome"; "shining"; "vivacious"; + "burning"; "blazing"; "morose"; "gleeful"; "mad"; + "shaking"; "howling"; "snarling"; "gruesome"; + "helpless"; "vibrant"; "desperate"; +|] +let advs = [| + "cruelly"; "angrily"; "madly"; "hopelessly"; "thoughtlessly"; + "wickedly"; "hopefully"; "quickly"; "speedily"; "furiously"; + "kindly"; "maniacally"; "tearfully"; "bashfully"; "angrily"; + "wondrously"; "splendidly"; "tremendously"; "badly"; + "terribly"; "foolishly"; "snazzily"; "toplessly"; "balefully"; + "beautifully"; "kindly"; "thoughtfully"; "cautiously"; + "severely"; "wisely"; +|] +let adjs = [| + "cheerful"; "wondrous"; "overwhelming"; "adorable"; + "snazzy"; "hopeful"; "desperate"; "lustful"; "dour"; + "sad"; "sorrowful"; "hopeless"; "all-consuming"; "mad"; + "cruel"; "dreadful"; "terrible"; "fearsome"; "inescapable"; + "thoughtless"; "vile"; "bashful"; "topless"; "naked"; "dire"; + "baleful"; "vulgar"; "beautiful"; "horrid"; "cautious"; + "violent"; "wise"; "supreme"; "marvelous"; +|] +let verbs = [| + "shines"; "toots"; "honks"; "mutters"; "whispers"; "growls"; + "roars"; "whuffles"; "warbles"; "howls"; "screams"; "shrieks"; + "quivers"; "dances"; "hops up and down"; "grins"; "mumbles"; + "counsels you"; "glares"; "stares at you"; "looks up"; "gazes at you"; + "marvels"; "laughs"; +|] + +let pick a = a.(Random.int (Array.length a)) +type rule = R of string array | S of string | B of rule list | A of rule array | O of rule;; +let rec eval r : string = match r with + | R x -> pick x + | S x -> x + | B x -> List.fold_left (^) "" (List.map eval x) + | A x -> eval (pick x) + | O x -> if Random.int 2 = 0 then eval x else "" +let syl () = + let stop = R [| "p"; "t"; "k"; |] in + let fric = R [| "s"; "f"; "h"; "x"; |] in + let vstop = R [| "b"; "d"; "g"; |] in + let vfric = R [| "z"; "v"; "gh"; |] in + let liq = R [| "l"; "r"; "y"; "w"; |] in + let nasal = R [| "n"; "m"; "ng"; |] in + let obs = A [| stop; fric; vstop; nasal; liq; |] in + let v = R [| "a"; "e"; "u"; "o"; "i"; "ee"; "oo"; "au"; "ai";"oi";|] in + let sr = A [| + B[obs; v; O obs]; + B[A [|stop;vstop;fric;vfric;|]; O liq; v; O obs]; + |] in eval sr + ;; +let prefixes = [| "ur-"; "dire "; "dire ur-"; "super " |] +let name () = + let size = 1 + (Random.int 3) in + let rec loop n acc = if n = 0 then acc else loop (n-1) (acc^(syl ())) in + (if Random.int 2 = 0 then (pick prefixes) else "") ^ loop size "";; + +let isvowel c = match c with + | 'a' | 'e' | 'i' | 'o' | 'u' -> true + | _ -> false;; +let indef x = if isvowel x.[0] then "an "^x else "a "^x;; +let encounter () = + let msgs = [| + "you encounter"; + "you chance upon"; + "you find"; + "you run into"; + "you run straight into"; + "you trip over"; + "you stumble upon"; + "you happen upon"; + "egads!"; + "how wondrous!"; + "how marvelous!"; + "how gruesome!"; + "how splendid!"; + "oh no!"; + |] in + let kinds = B [ + R [|"it";"she";"he";|]; S" "; + A [| + B[ R verbs; S " "; + A [| + B[ S "with "; O(B[R adjs; S" "]); R nouns;]; + R advs; + |]; + ]; + B[S"is "; O(B[R advs;S" ";]); R mods; + O(B[ S " with "; O(B[R adjs; S" "]); R nouns;]); + ]; + |]; + S "!"; + ] in + (pick msgs)^" "^(indef (name()))^"! " ^ (eval kinds);; + +let rec times n a = if n = 0 then () else (a (); times (n-1) a);; +let () = Random.self_init (); +(* times 20 (fun () ->*) + print_string ((encounter ()) ^ "\n") +(* )*) ADDED namegen.c Index: namegen.c ================================================================== --- namegen.c +++ namegen.c @@ -0,0 +1,161 @@ +// No dependencies, just compile with "cc namegen.c -o namegen" +// replacing cc with your compiler of choice! + +#include +#include +#include +#include +#include + +struct nametype { + const char* name; + size_t nouns, adjs, gens; + bool default_article; + size_t maxadj_n, maxadj_g, minadj_n, minadj_g; + const char* names[]; +}; + +struct nametype conspiracy = { "Conspiracy", + 18,76,72,true, + 3,3,0,0, { // the horrible data structure here is so that we can keep everything + //NOUNS pertaining to the nametype in one place. I wish there were a better way. + "Order", "Cult", "Temple", "Church", "Hand", "Eyes", + "Source", "Keepers", "Maidens", "Servants", "Templars", + "Followers", "Celebrants", "Rite", "Sect", "Guild", + "Society", "School", + + //ADJECTIVES + "Sanctified", "Blasphemous", "Red", "Yellow", "Ebon", + "Ochre", "Eternal", "Perpetual", "Everlasting", "Black", + "White", "Infinite", "Timeless", "Mad", "Terrible", "Sightless", + "All-Seeing", "Third", "Second", "Endless", "Reviled", + "Absolute", "Damned", "Cursed", "Blessed", "Lucid", + "Unthinkable", "Nameless", "Unspeakable", "Glorious", + "Cold", "Burning", "Shapeless", "Unknowable", "Lifeless", + "Fatal", "Infernal", "Celestial", "Implacable", "Eldritch", + "Dark", "Resolute", "Resplendant", "Unstoppable", "Blood-Soaked", + "Endless", "Forgotten", "Iron", "Secret", "Hidden", "Fiery", + "Ancient", "Silver", "Screaming", "Mighty", "Thousand-Year", + "Jewelled", "Damnable", "Creeping", "All-Knowing", + "All-Hearing", "Holy", "Global", "Leering", "Forty-Second", + "Divine", "Faithful", "Ageless", "Steadfast", "Cruel", + "Sapphire", "Sapphic", "Secluded", "Scarlet", "Shrieking", + "Hollow", + + //GENS + "Prince", "King", "Master", "Princess", "Queen", "Mistress", + "Devourer", "Obliterator", "Destroyer", "0Doom", "0Death", // this is extremely hacky + "0Torment", "Serpent", "Moon", "One", "Two", "Three", "Four", + "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Twelve", //there is nothing menacing about the number 11 + "Eye", "God", "Horror", "Thing", "Flames", "Night", "Day", + "Year", "Years", "Way", "Realm", "Path", "Light", "Fire", + "Door", "Gate", "Plan", "Terror", "0Pain", "0Screams", + "Road", "Spire", "Beast", "Flesh", "Sword", "Mountain", + "River","Crown","Scepter","0Fires","Desecrator","Defiler", + "Despoiler", "Ravager", "Rite", "Sea", "Ocean", "Chaos", + "Goat", "Legion", "Pyramid", "Dragon", "Hand", "Pantheon", + "Spirit", "Devil", "Gods", + } +}; + +struct nametype government = { "Government", + 10,29,64,false, + 3,3,0,0, { + //NOUNS + "Kingdom", "Empire", "Republic", "Principality", "Federation", + "State", "States", "Confederacy", "Powers", "Duchy", + + //ADJECTIVES + "United", "Confederated", "Allied", "Unified", "Collective", + "Democratic", "Republican", "Federated", "Glorious", "People's", + "Socialist", "Soviet", "New", "Old", "Equatorial", "North", + "South", "West", "East", "Southwest", "Northwest", "Northeast", + "Southeast", "Great", "Superior", "Mostly Harmless", "Grand", + "Nuclear", "Imperial", + + //GENS + "America", "France", "Spain", "Megaspain", "Hyperfrance", + "Space America", "Space France", "Arabia", "New Arabia", + "Jersey", "Zealand", "York", "Manchester", "Britain", + "Sloravia", "Azmenistan", "Arkansas", "Ruritania", "Kundu", + "Earth", "Mars", "Pluto", "Kansas", "Nebtratucky", "Arkantucky", + "Nebrahoma", "New Mexigon", "Hawaishington", "Qurac", "Persia", + "Nevadakota", "Missisota", "Minnesippi", "Montanabraska", + "Wyomissouri", "New Hampchigan", "Delachusetts", "Arkantexas", + "Kentexas", "Bumbelch", "Nebravada", "Tennessaw", "Connectican't", + "Oklatucky", "Oklabama", "Canuckistan", + + "Russia", "Scotland", "Tanzania", "Ireland", "Togo", "Taiwan", + "Syria", "Senegal", "Serbia", "Paraguay", "Norway", "Korea", + "Poland", "Smop", + + "Warsaw", "London", "Moscow", "Rome", + + "Goat", + } +}; + +const struct nametype* alltypes[] = {&conspiracy, &government}; + +char* gen_name(const struct nametype* t) { + size_t length=0; + + const char* noun = t->names[rand()%t->nouns]; + length=strlen(noun)+3; + bool swaparticle; + const char* gen = t->names[t->nouns + t->adjs + rand()%t->gens]; + if (gen[0]=='0') swaparticle=true, gen++; else swaparticle=false; + if ((t->default_article && !swaparticle) || (!t->default_article && swaparticle)) { + length+=4; + } + length+=strlen(gen)+1; + + + size_t adjc_n = rand() % (t->maxadj_n-t->minadj_n+1) + t->minadj_n; + size_t adjc_o = rand() % (t->maxadj_g-t->minadj_g+1) + t->minadj_g; + + const char** adjs_n = malloc(sizeof(size_t) * adjc_n); + for (unsigned char i = 0; inames[t->nouns + rand()%t->adjs]; + length+=strlen(adjs_n[i])+1; + } // ouch + + const char** adjs_o = malloc(sizeof(size_t) * adjc_o); + for (unsigned char i = 0; inames[t->nouns + rand()%t->adjs]; + length+=strlen(adjs_o[i])+1; + } + + char* name = malloc(length+1); + name[0] = 0; //herp a derp were there some weird errors without this + //strcat you are fucking evil + for (size_t i = 0; idefault_article && !swaparticle) || (!t->default_article && swaparticle)) strcat (name, "the "); + for (size_t i = 0; iname,i,name); + free(name); + } + putchar('\n'); + } + return 0; +} ADDED orderbot.ml Index: orderbot.ml ================================================================== --- orderbot.ml +++ orderbot.ml @@ -0,0 +1,159 @@ +let verbs = [| + "repel"; "assail"; "bugger"; "degauss"; "murder"; + "slay"; "abort"; "avenge"; "fuck"; "defile"; "devour"; + "slaughter"; "spoil"; "eat"; "spank"; "seize"; "respect"; + "sacrifice"; "return"; "pursue"; "deny"; "purchase"; "buy"; + "inspect"; "despoil"; "censure"; "flog"; "elect"; "summon"; + "oust"; "expel"; "extirpate"; "hire"; "fire"; "assassinate"; + "torture"; "extract"; "rescue"; "incite"; "rouse"; "arouse"; + "eliminate"; "arrest"; "kidnap"; "confine"; "condemn"; + "import"; "export"; "exclude"; "make out with"; "kiss"; + "slap"; "punch"; "whip"; "evict"; "install"; "isolate"; + "compile"; "gather"; "banish"; "exile"; "defeat"; "battle"; + "alert"; "go after"; "track down"; "hunt down"; "locate"; + "find"; "transport"; "tolerate"; "impede"; "incinerate"; + "defend"; "impale"; "demoralize"; "pleasure"; "bomb"; + "lay waste to"; "raze"; "inspire"; "worship"; "exalt"; + "repair"; "rectify"; "duplicate"; "clone"; "avert"; "prevent"; + "pervert"; "cast out"; "throw down"; "bang"; "screw"; "do"; + "enslave"; "butcher"; "download"; "upload"; "kill"; "eradicate"; + "fight"; "stab"; "cut"; "steal"; "lacerate"; "chew"; "digest"; + "impound"; "impanel"; "gnaw on"; "respect"; +|] + +let adjs = [| + "sleeping"; "thoughtful"; "insipid"; "thoughtless"; "wretched"; + "wrathful"; "Republican"; "Democratic"; "royal"; "earnest"; + "imperial"; "American"; "inspired"; "immoral"; "wistful"; "wondrous"; + "cheerful"; "giggling"; "wonderful"; "angry"; "silly"; "desperate"; + "warped"; "rotting"; "rancid"; "raging"; "cool"; "clever"; + "sneering"; "eternal"; "timeless"; "ancient"; "indecent"; "delightful"; + "scented"; "sexy"; "hot"; "arousing"; "rampant"; "randy"; "evil"; + "sacred"; "holy"; "satanic"; "unholy"; "blasphemous"; "repellent"; + "repulsive"; "fucking"; "worthless"; "grotesque"; "weeping"; + "goddamn"; "rebellious"; "revolutionary"; "young"; "national"; + "federal"; "government"; "presidential"; "international"; "public"; + "current"; "medical"; "fascist"; "buxom"; "apocalyptic"; + "boastful"; "boring"; "effulgent"; "exuberant"; "lugubrious"; + "noisome"; "German"; "germanic"; "cloned"; "perverted"; "fanatic"; + "arrogant"; "magic"; "magical"; "slutty"; "orgasmic"; "obedient"; + "frantic"; "wandering"; "exalted"; "luminous"; "towering"; + "little"; "communist"; "socialist"; "neoliberal"; "master's"; + "grand"; +|] + +type noun = R of string | M of string | I of string * string | P of string +let nouns = [| + R "spanner"; R "clown"; R "beetle"; R "candidate"; R "asshole"; + R "queen"; R "king"; R "advisor"; R "sausage"; M "garbage"; + R "book"; I("cockroach","cockroaches"); R "virgin"; I("clitoris","clitorises"); + R "parking lot"; R "parking space"; R "coin meter"; R "car"; + R "burglar"; I("sheep","sheep"); R "bear"; M "rabble"; + R "burger"; R "waterfall"; R "hammer"; R "doorknob"; + R "pig"; R "cop"; R "bagel"; R "mayor"; R "president"; + R "detective"; R "inquisitor"; M "police"; R "teen"; + R "mustache"; R "heterosexual"; P "Inquisition"; R "general"; + I("titty","titties"); R "monkey"; I("empress","empresses"); R "emperor"; + R "dowager"; R "elixir"; R "cipher"; R "code"; R "secret"; + M "heterosexuality"; R "dudebro"; P "opposition"; I("cactus","cacti"); + R "candelabra"; I("furry","furries"); P "gays"; P "spawn"; I("roach","roaches"); + P "debt"; M "indecency"; R "waste"; M "yaoi"; R "American"; R "Russian"; + R "German"; R "fascist"; M "software"; R "pigeon"; R "king"; R "mob"; + P "mafia"; P "apocalypse"; R "clone"; R "pervert"; R "fucker"; R "dude"; + R "fanatic"; I("army","armies"); R "wall"; R "slut"; I("sorceress","sorceresses"); + R "sorcerer"; R "mage"; I("elf","elves"); I("industry","industries"); + R "orgasm"; R "bastard"; R "cult"; R "volunteer"; I("knife","knives"); + R "spire"; I("mistress","mistresses"); R "master"; R "communist"; R "socialist"; + R "conservative"; R "liberal"; I("volcano","volcanoes"); P "means of production"; + I("jury","juries"); R"imperative"; +|] + +let ppl = [| + "asshole"; "jackass"; "mom"; "dad"; "mommy"; "daddy"; "granny"; + "auntie"; "senator"; "general"; "captain"; "ma'am"; "sir"; "your majesty"; + "milady"; "milord"; "sire"; "soldier"; "private"; "fool"; "you fool"; + "you idiots"; "girls"; "ladies"; "boys"; "men"; "folks"; "minister"; + "prime minister"; "mayor"; "inquisitor"; +|] +let isVowel (x:char) : bool = List.mem x ['a';'e';'i';'o';'u';'A';'E';'I';'O';'U'] +type articles = Definite | Indefinite | Zero +let rand a = a.(Random.int(Array.length a)) +let np () : string = if (Random.int 5) == 0 then + rand [|"me";"yourself";"her";"him";"them"|] + else let n, art = match rand nouns with + | R s -> rand [| + s, rand [|Definite;Indefinite|]; + s^"s", rand [|Definite;Zero|]; + |] + | I(s,p) -> rand [| + s, rand [|Definite;Indefinite|]; + p, rand [|Definite;Zero|]; + |] + | P x -> x, Definite + | M x -> x, rand [|Definite;Zero|] in + let sp = rand [|n; (rand adjs)^" "^n|] in match art with + | Definite -> "the " ^ sp + | Indefinite -> (if isVowel sp.[0] then "an " else "a ") ^ sp + | Zero -> sp + +type seqe = T of string | S | A of string array | F of (unit -> string) | R of seqe array | O of seqe | B of seqe list +let syntax = B [A verbs; S; F np;] +let seqs = R [| + B[syntax; R[| + B[T ". that is an order, "; A ppl;]; + B[T ", "; A ppl]; + B[T ", "; A ppl; T ". that is an order"]; + |]; R[| T "."; T "!"; |];]; + B[O(T"i command you, "); A ppl; T ", "; syntax; R[| + T "."; + T ". that is an order!"; + T ". it is the only option."; + T ". and god help us all."; + T ". otherwise, we're dead."; + T " or die trying."; + T "! now!"; + |];]; + B[ + O(T"it is imperative that you "); syntax; + O(T " or die trying"); O(B[T", ";A ppl]); R[| + T "."; + T ". it is the only option."; + T ". otherwise, god help us all."; + T ". otherwise, we're dead."; + |];]; + B[T "this is your last chance, "; A ppl; T ". "; syntax; O(R[| + T " or you're a dead man"; + T " or you're a dead woman"; + T " or else"; + T " or you find out what we do to people who screw us"; + T " or we go after your family"; + |]); T "."; + ]; + B[ R[| + T "you shouldn't "; + T "you mustn't "; + T "don't "; + T "we mustn't "; + T "we cannot allow you to "; + |]; syntax; O(B[T ", "; A ppl]); T ".";]; + B[syntax; O(B[T ", "; A ppl]); T ", and to hell with the consequences!"]; + B[T "man up and "; syntax; O(B[T ", "; A ppl]); T "."]; + B[syntax; O(B[T ", "; A ppl]); T ", and face your death like a man!"]; + B[T "we're dead anyway, we might as well ";syntax;T".";]; + B[T "you're dead anyway, you might as well ";syntax;T".";]; +|] +(* val eval : seqe -> string *) +let rec eval s = match s with + | T x -> x + | S -> " " + | A arr -> rand arr + | F f -> f () + | R s -> eval (rand s) + | B s -> (List.fold_left (^) "" (List.map eval s)) + | O s -> if Random.int 2 = 0 then eval s else "" + +let rec times i x = x (); if i > 0 then times (i-1) x +let () = Random.self_init(); + print_string (eval seqs); + (* (times 10 (fun () -> print_string ("- "^(eval seqs)^"\n")));; *) + ADDED pharma.ml Index: pharma.ml ================================================================== --- pharma.ml +++ pharma.ml @@ -0,0 +1,24 @@ +let suffixes = [| "tine"; "zone"; "done"; "dol"; "mycin"; "pentin"; "nine"; "cillin"; "mab"; "xone"; "xine"; "zine"; "dine"; "nyl"; "nil"; "codone"; "morphone"; "drene"; "phine"; "thine"; "toxin"; "xin"; "dioxin"; "lene"; "ne"; "pine"; "relin"; "gen"; "phen"; "fen"; "dem"; "lone"; "fen"; "line"; "but"; "te"; "xate"; "tal"; "mate"; "norphine"; "dal"; "phetamine"; "amphetamine"; "quel"; |] +let salts = [| "chloride"; "acetate"; "phosphate"; "hydrochloride"; "succinate"; "sulphate"; |] +let prefixes = [| "neo"; "retro"; "nor"; "tri"; "cycli"; "tetra"; "penta"; "methyl"; "nal"; "pro"; "metha"; "fenta"; "meta"; "hydro"; "fluoro"; "thieno"; "mal"; "eroto"; "diablo"; "miso"; "propy"; "ethy"; "buta"; "hexa"; "benzo"; "piperi"; "sado"; "maso"; "philo"; "theo"; "iso"; "cyclo"; "klepto"; "pyro"; "carba"; "ibu"; "masculo"; "phos"; "estro"; "endo"; "poly"; "bi"; "tri"; "cumulo"; "strato"; "dextro"; "sinistro"; "levo"; "dextra"; "sinistra"; "ecto"; "myco"; "canna"; "am"; |] +let onsets = [| "f"; "fl"; "fr"; "p"; "pr"; "pl"; "c"; "cr"; "cl"; "s"; "sc"; "scl"; "scr"; "ph"; "sph"; "phr"; "phl"; "ch"; "chr"; "chl"; "z"; "th"; "thr"; "r"; "x"; |] +let vowels = [| "a"; "e"; "i"; "o"; "u"; "y"; |] +let codas = [| "n"; "m"; "r"; "s"; "f"; |] +let pick a = a.(Random.int(Array.length a)) +let range min max = min+(Random.int(max-min)) + +let syl () = match range 0 3 with + | 0 -> (pick onsets) ^ (pick vowels) ^ (pick codas) + | 1 | 2 -> (pick onsets) ^ (pick vowels) + | _ -> (pick vowels) ^ (pick codas) +let rec cat op fn times = + if times = 0 then "" else (op (fn()) (cat op fn (times-1))) + +let drug () = + let prefct = range 0 3 in + let sylct = if prefct= 0 then range 1 3 else range 0 3 in + (cat (^) (fun () -> pick prefixes) prefct) ^ + (cat (^) syl sylct) ^ + (pick suffixes) ^ + (if range 0 7 = 0 then " "^(pick salts) else "") +let () = Random.self_init (); print_string (drug ()); print_string "\n"; ADDED procbot.ml Index: procbot.ml ================================================================== --- procbot.ml +++ procbot.ml @@ -0,0 +1,2 @@ +require "cinch" + ADDED procbot.rb Index: procbot.rb ================================================================== --- procbot.rb +++ procbot.rb @@ -0,0 +1,591 @@ +#!/usr/bin/ruby +# encoding: UTF-8 +require "cinch" +Bots = ["cclg", "sext", "sect", "order", "monster", "pharma", "argue","crime","drug","badbio","bottist","egret_txt", "babdio", "botsoc","dx"] +ShoutingMatch = /\b(MS\.|MS\s|SERGEANT\s|SGT\s|SGT\.)?\s*(SAMANTHA TAGGART|SAMANTHA TAGUE|SAMANTHA|SAM TAGUE|SAM TAGGART|SAMTAGUE|SAMMY|SAM|TAGUE|TAGGART)\b/ +SmallMatch = /\b(ms\.|ms\s|sergeant\s|sgt\s|sgt\.)?\s*(samantha taggart|samantha tague|samantha|sam tague|sam taggart|samtague|sam|sammy|tague|taggart|(ね|)サム|(ね|)サムさん|(ね|)サムちゃん|سام|يا سام)\b/i +FormalQs = [ + "How may I be of assistance", + "Yes", + "You rang", + "What can I do for you today", + "Yes", + "You rang", +] +def mult(a,b) + b.map{|bi| a.map{|ai| ai+bi}}.flatten +end +$lastcmd = "" +bot = Cinch::Bot.new do + configure do |c| + c.server = "irc.oftc.net" + c.port = 6697 + c.channels = ["#crimehole"] + c.nick = "samtague" + c.user = "samtague" + c.realname = "samantha taggart" + #c.sasl.username = "sam-tague" + #c.sasl.password = "bott-ist-tot" + c.ssl.use = true + end + + on :message, /\b(ms\.|ms\s|sergeant\s|sgt\s|sgt\.)?\s*(samantha taggart|samantha tague|samantha|sam tague|sam taggart|samtague|sam|tague|taggart|(ね|)サム|(ね|)サムさん|(ね|)サムちゃん|سام|يا سام)\b/i do |m| + + @m=m + @shouting = false + def reply(x) + if @shouting + @m.reply x.upcase + else + @m.reply x + end + end + formality = :friendly + msg = m.params[1] + if par = ShoutingMatch.match(msg) + @shouting = true + cmd=msg.split(ShoutingMatch,2) + elsif par = SmallMatch.match(msg) + @shouting = false + cmd=msg.split(SmallMatch,2) + end + ranks = { + "velartrill" => ["Admiral", "Admiral Hale"].sample, + "mtp" => "General", + "^alex" => "General", + "caurinus" => "Captain", + "Riking" => "Lieutenant" + } + lowranks = [ "Corporal", "Private", "Trooper" ] + user = m.user.nick + if ranks.include?(user) + rank=ranks[user] + else + rank="Commander" + end + cmd.map! {|x| x.strip} + + cmd[1].downcase! + if cmd[1] == "ms" or cmd[1] == "ms." + formality = :formal + name = cmd[2].downcase + action = cmd[3].downcase + elsif cmd[1] == "sergeant" or cmd[1]=="sgt" or cmd[1]=="sgt." + formality = :military + name = cmd[2].downcase + action = cmd[3] + else + formality = :friendly + name = cmd[1].downcase + action = cmd[2] + end + if action == "" + action = cmd[0].downcase + action.sub!(/\W*$/,'') + greeting = "" + else + greeting = cmd[0].downcase + end + + greetings = ["hey", "hi", "yo", "hello","hey there","hi there","yo there","heya","what up","oh shit","aw yeah","ahlan","hujambo","اهلن", "你好","morning","evening","afternoon","good morning","good evening","good afternoon", "buenos días", "buenos dias", "buenos tardes", "bonjour", "ciao", "bonsoir", "howdy"] + if greetings.include?(action.sub(/^\W*/,'').sub(/\W*$/,'')) + greeting = action + action = "" + end + action.sub!(/^\W*/,'') + action.sub!(/^please/,'') + action.sub!(/please$/,'') + greeting.sub!(/^\W*/,'') + greeting.sub!(/\W*$/,'') + lowrank = false + if formality == :military + if action != "" + if action.sub!(/^sir\b/i,'') or action.sub!(/\bsir$/i,'') + rank = lowranks.sample + lowrank = true + action.strip! + end + end + end + nulls = { + :friendly => [ + "that's my name, don't wear it out", + "yes?", + "what's up?", + greetings.sample, + greetings.sample+", "+user, + "what's going on?" + ], + :formal => FormalQs.map {|x| x+"?"} + FormalQs.map {|x| x+", "+user+"?"}, + :military => lowrank ? [ + "Report, soldier!", + "Stand down, " + rank + "!", + "Hold your horses, " + rank + "!", + rank + " " + user + "! Report!", + "Report!" + ] : [ + "Sir!", + "What's the situation, sir?", + "What's the situation, "+rank+"?", + ] + } + affirmatives = { + :friendly => [ + "sure thing.", + "no problem.", + "no worries.", + "will do.", + "np!", + "sure!", + "okay!" + ], + :formal => [ + "Of course.", + "Right away.", + "At once.", + "As you wish.", + "Certainly.", + "Pleased to assist.", + "At your command." + ], + :military => [ + "Sir yes sir!", + "Ten-four!", + "Wilco!", + "Roger that!", + "Roger that, sir!", + "Roger!", + "Wilco, sir!", + "Wilco, "+rank+"!", + "Roger, " +rank+"!", + ] + } + def scancmd(x,strs) + strs.each { |str| + return "" if x==str + if x.start_with?(str) + return x[str.length+1,x.length] + end + } + return false + end + def perform(x,user) + y=x.split(" ",2) + if Bots.include?(y[0].downcase) + $lastcmd = x + msg = "" + bot = "./"+y[0].downcase + IO.popen(y.length == 2 ? [bot, y[1]] : bot) { |pd| + msg = pd.read + } + return msg + elsif scancmd(x,["what do you think","what are you thinking about","penny for your thoughts","what's your opinion","opinions"]) + $lastcmd="botsoc" + return perform("botsoc",user) + elsif scancmd(x,["again", "make another", "do another", "tell another", "make us another", "encore", "more", "do that again", "once more" "one more time", "do it again", "play it again"]) + if $lastcmd != "" then + return perform($lastcmd,user) + else + return nil + end + elsif bot=scancmd(x, + (mult((mult ["give","tell","make","invent","find","i want","we want","i'd like","we'd like","can i have","can we have","can i get","can we get","create","let's get","let's have","let's hear","lemme have","let me have"], [""," me", " us"]) + + ["make up", "come up with","do","how about","maybe"], [""," a", " an", " a new", " another", " more", " some", " some more"])+ + ["more","another","a","a new","an","some"]).reverse) + # this is the worst thing i have ever done + # i am so sorry + case bot + when "crime", "crimes", "felony", "felonies" + return perform("crime",user) + when "word", "term", "weird word", "long word", "jargon", "obscure word", + "words", "terms", "weird words", "long words", "obscure words" + return perform("cclg",user) + when "monster", "beast", "monsters", "beasts" + return perform("monster",user) + when "drug", "drugs","street drug","street drugs" + return perform("drug",user) + when "pill", "pills", "pharmaceutical", "pharmaceuticals", "legal drug", "legal drugs" + return perform("pharma",user) + when "bad bio", "bad bios", "bad twitter bio", "bad twitter bios" + return perform("badbio",user) + when "order", "orders", "my orders", "our orders", "our marching orders","plan of action","our plan of action","our strategy","strategy" + return perform("order",user) + when "sect", "cult", "sects", "cults" + return perform("sect",user) + when "sext" + return perform("sext",user) + when "argument", "arguments", "fight", "fights" + return perform("argue",user) + when "ideology", "anarchism", "politics", "belief", "creed", "joke" + return perform("bottist",user) + when "verse", "ominous statement", "line", "prophecy" + return perform("egret_txt",user) + when "analysis", "opinion", "opine" + return perform("botsoc",user) + when "diagnosis", "dx" + return perform("dx",user) + end + elsif bot=scancmd(x,["fight with","fight"]) + $lastcmd = x + return perform("argue",user) + else + return nil + end + end + negatives = { + :friendly => [ + "no can do", + "sorry, not happening", + "i don't know how", + "what?", + "huh?", + "i'm confused", + "????", + "what are you asking me to do", + "um, no?", + "um, no??", + "that's fucked up", + "isn't that a little problematic", + "what do you mean", + "that doesn't make any sense", + "i don't understand", + "what are you talking about", + "how?", + "what's going on", + "what's going on?", + "im scared", + "i'm scared", + "calm down " + user, + "what are you talking about, " + user, + "i never understand what "+user+" is on about", + "im dying", + "help", + "lol", + "lmao", + "what", + "okay but why", + "okay but how", + "who do i need to kill", + ";)", + "don't make me come over there", + "oh really", + "i won't", + "no", + "you can't make me", + "try and make me", + "not happening", + "not gonna happen", + "did you really think that would work", + "did you really think that would work, " + user, + "did you really think you'd get away with that", + "did you really think you'd get away with that, " + user + ], + :formal => [ + "I'm afraid I can't do that.", + "I'm afraid that won't be possible.", + "That won't be possible.", + "No can do, I'm afraid.", + "I don't think I can help you with that.", + "I'm sorry to report that is beyond my capabilities at present.", + "I don't think I can do that, I'm sorry to say.", + "Goodness! I would never dream of such a thing.", + "Certainly not! I have a reputation to think of.", + "Could you rephrase that?", + "I'm sorry, I don't think I understand" + ], + :military => lowrank ? [ + "Not happening, "+rank+"!", + "Don't even think about it, "+rank+"!", + "Do I look like I was born yesterday, "+rank+"!", + "Not happening, "+rank+" "+user+"!", + "Don't even think about it, "+rank+" "+user+"!", + "Do I look like I was born yesterday, "+rank+" "+user+"!", + "Drop and give me twenty!", + "That's it, you're on KP duty!", + "No backtalk, maggots!" + ] : [ + "Negative, sir.", + "Cannot comply, sir.", + "Not possible, "+rank+".", + "Negative, sir, we're pinned down!", + "We don't have the troops for that, "+rank+"!", + "Sorry, sir, there's nothing I can do." + ] + } + whoareyou = { + :friendly => [ + "i'm sam!", + "i'm sam tague!", + "samantha taggart", + "ash's sister", + "ash's little sister", + "ash's younger sister" + ], :formal => [ + "I am Samantha Taggart.", + "My name is Samantha Taggart.", + "Taggart. Samantha Taggart.", + "The name is Samantha Taggart.", + "The name is Taggart.", + "Samantha Taggart, esquire." + ], :military => [ + "Sergeant Samantha Taggart reporting for duty, sir!", + "Sergeant First Class Sam Taggart, sir!", + "Sergeant Taggart, sir.", + "Sergeant Taggart, sir. The boys call me Tague.", + "Sergeant Taggart, sir. But you can call me Sam.", + "Sergeant Taggart, sir. Call me Sam." + ] + } + goodgirl = { + :friendly => [ + "^_^", ":)", + "thanks!", + "you're sweet", + "just doing my job!", + "that's really nice of you", + "aw, do you mean it?", + "aw, really?", + "thank you!", + ], :formal => [ + "Of course. I aim to please.", + "Happy to be of service.", + "Just doing my job.", + "It's my pleasure.", + "I'm just glad I can be of service.", + "You're too kind.", + "You're far too kind.", + "That's very kind of you.", + "Why, thank you!", + "It's good to feel appreciated.", + "It's always good to feel appreciated.", + ], :military => [ + "Yes, sir!", + "Sir, yes, sir!", + "Roger that, sir!", + "Thank you, sir!", + "You're not so bad yourself, sir.", + "Thank you, sir. And may I just say - it's been a pleasure serving under you, sir.", + "Godspeed, sir!" + ] + } + dontcare = { + :friendly => [ + "well you should care", + "why not", + "why don't you care", + "you should care", + "this matters, " + user, + "then you don't understand", + "caring is cool", + "caring is cool tho" + ], :formal => [ + "May I submit that you should, in fact, care?", + "I do not believe you appreciate the import of this matter.", + "This is more important than you realize.", + "I hope you will reconsider.", + "Apathy helps no one.", + "Apathy solves nothing.", + "Your apathy is shameful." + ], :military => lowrank ? [ + "Didn't your momma ever tell you caring is cool, soldier?", + "Don't give me that, "+lowranks.sample+"!", + "Drop and give me twenty, you apathetic worm!", + "You don't care? I don't care that you don't care! Drop and give me twenty!", + "No backtalk!" + ] : [ + "With all due respect, sir, caring is cool, sir!", + rank+", sir, I urgently request that you consider your position, sir!", + "Sir, with all due respect, I believe you are mistaken as to the importance of the situation, sir.", + "Sir, this situation is rapidly spiraling out of control.", + "But "+rank+", this situation is rapidly spiraling out of control." + ] + } + thankyou = { + :friendly => (mult ["np","no worries","sure thing","sure","ofc","of course","glad to help","don't worry about it","just glad to help","no problem","you got it"], ["", "!", "."]), + :formal => [ + "You're welcome.", + "You're very welcome.", + "It was no trouble.", + "It was no trouble at all.", + "It was a pleasure.", + "It was a pleasure, truly.", + "It was my honor.", + "I'm pleased to be of service.", + "Pleased to be of service.", + "Of course.", + "Don't mention it.", + "Oh, don't mention it." + ], :military => [ + "No thanks necessary, sir!", + "Just doing my job, sir.", + "It's what they pay me for, sir.", + "Sir, yes, sir!" + ] + } + insults = { + :friendly => [ + "i don't like you either, pal", + "fuck you", "fuck you too", + "get fucked", "fuck off", "suck this", + "lick my clit", "lick my tits", "suck my clit", + "suck my tits", "i'm gonna fuck you up", + "big talk coming from you, "+user, + "you're on my list now, "+user, + "go fuck yourself", + "i'll remember this", + "do you kiss your momma with that mouth?", + "die in a fire","get bent","go to hell", + "wow rude", "chill out", "take a chill pill", + "you need to calm down", "lmao", + "get bent", "does it look like i give a fuck what you think about me", + "you're problematic", "hey everyone "+user+" sucks donkey balls", + "hey everyone "+user+" jacks off to schwarzenegger movies", + "hey everyone "+user+" killed JFK", + "hey everyone "+user+"'s actually just hundreds of lizards dressed up like a person", + "hey everyone "+user+" uses diphenhydramine recreationally", + "meanie", "why are you like this", "take that back", + "you take that back", "you take that back right now", + "you hurt my feelings", "don't hurt my feelings like that", + "i thought we were friends!!", "you're a horrible person, "+user, + "please stop being mean to me", "why are you so cruel" + ], :formal => [ + "How rude!", "Goodness!", "Goodness, how rude!", "Goodness gracious!", + "You would do well to treat your betters with more respect than that.", + "You've made an enemy today, "+user+".", "I won't tolerate such language!", + "I won't tolerate such disrespect!", + "I'm sorry, I was unaware my duties would include babysitting today!", + "Please show yourself out.", "Your services will no longer be required.", + "This is hardly the place for such infantile behavior.", + "Why must you be like this?", "Unacceptable!", + "Goodness gracious, why must you be like this?" + ], :military => [ + "What the hell did you just say to me, maggot?", + "Insubordination!", + "I'll have you flogged for this!", + "You got an awful big mouth on you, "+lowranks.sample+". Let's see you wash the floor with it!", + "Insubordination will not be tolerated!", + "You'll hang for this!", + "Out of line!", + "You're out of line!", + "You're out of line, soldier!", + "Out of line, "+lowranks.sample+" "+user+"!", + "You're out of line, "+lowranks.sample+" "+user+"!" + ] + } + if param=scancmd(action,["meet","this is","these are", + "let me introduce you to","let me introduce", + "allow me to introduce you to", + "allow me to introduce", + "say hi to","say hello to", + "introduce yourself to"]) + param.sub!(/\W*$/,'') + reply [ + "pleased","nice","good", + "i'm so happy", + "i'm so glad", + "it's so nice", + "it's so good" + ].sample+" to "+[ + "meet you", + "get to meet you", + "make your acquaintance" + ].sample+", "+param+(rand(2)==0 ? ". "+user+" has told me so much about you" : "") + elsif param=scancmd(action,["good night","night","gnight","g'night","i'm going to bed","going to bed","im going to bed", "bedtime", "time for bed", "it's my bedtime","its my bedtime","nighty-night"]) + reply mult(["good night","night","sleep well","sleep tight","i wish you an enjoyable cycle of nocturnal hallucinations", "commencement of dormancy phase acknowledged"], ["", ", "+user, ", pesky flesh-creature", ", human", ", mortal"]).sample + elsif param=scancmd(action,["i don't care","it doesn't matter","don't care","idc","nevermind","never mind","nvm","i don't give a shit","i don't give a fuck", "does it look like i care"]) + reply dontcare[formality].sample + elsif param=scancmd(action,["fuck you","fuck off","go fuck yourself","get fucked","fu","get bent","diaf","die in a fire","screw you","you cunt","you bitch","you piece of shit","you scumbag","you sleazeball","you jackass","you asshole","you cockroach"]) + reply insults[formality].sample + elsif param=scancmd(action,["thanks","thank you","i appreciate it", "ty", "thx", "obliged", "much obliged","appreciated","danke","gracias","merci","merci beaucoup","shukran","shukran jazeelan","asante","asante sana","arigatou","doumo arigatou", "ありがとう", "どうもありがとう", "どうもありがとうございます","شكران", "شكران جزيلاا"]) + reply thankyou[formality].sample + elsif param=scancmd(action,["well done","good work","excellent work","good girl","nicely done","nice job","good job","perfect","you did well","excellent job","you did great","you did perfect","you did perfectly","wonderful","you did good","gj"]) + reply goodgirl[formality].sample + elsif param=scancmd(action,["who are you","who do you think you are","who even are you","tell me who you are","tell us who you are","introduce yourself"]) + reply whoareyou[formality].sample + elsif greeting=="" + if action=="" + reply nulls[formality].sample + else + result=perform(action,user) + r="" + if result != nil + result.chomp! + if formality != :friendly + r=affirmatives[formality].sample+" " + result[0] = result[0].upcase + result += "." if not result=~/\W$/ + end + reply r+result.chomp + else + reply negatives[formality].sample + end + end + else + if action=="" + if formality == :friendly + reply (nulls[:friendly] + [ + greeting+" yourself" + ]).sample + elsif formality == :formal + r = greeting + r[0]=r[0].upcase + reply r +", " + user + "." + elsif formality == :military + if lowrank + reply [ + "You're out of line, "+rank+"!", + "Cut the chatter, soldier!", + "Stow the chit-chat, "+rank+"!", + ].sample + else + reply rank+", sir!" + end + end + else + if formality == :military and lowrank + reply negatives[formality].sample + return + end + result=perform(action, user) + r="" + if result != nil + result[0] = result[0].upcase if formality != :friendly + r=affirmatives[formality].sample + result.chomp! + result += "." if not result=~/\W$/ + reply r+" "+result + else + reply negatives[formality].sample + end + end + end + end + on :message, /daddy/i do |m| + m.reply "NO DDLG" + end + on :message, /monad/i do |m| + m.reply "NO HASKELL" + end + on :message, /satan/i do |m| + lucy = ["hail satan", "ave satanas", "all glory to the prince of darkness"] + lucy += lucy.map { |x| x.upcase } + m.reply(mult(lucy, ["",".","!","!!","!!1"]).sample) + end + + on :message, /there/i do |m| + m.reply ["*they're","*their"].sample if rand(50)==0 + end + on :message, /ableis[mt]/i do |m| + m.reply ["stop saying that", "that word is banned", + "that's not a word anymore, sorry", "you don't get to say that anymore", "nope"].sample + m.reply 'if you mean "harmful to disabled people," say that' + end + on :message, /your/i do |m| + m.reply ["*you're","*yore"].sample if rand(50)==0 + end + on :online, "velartrill" do |m| + m.reply "ALL RISE" + end +end + +bot.start ADDED ritebot.ml Index: ritebot.ml ================================================================== --- ritebot.ml +++ ritebot.ml @@ -0,0 +1,181 @@ +(* please add your name/handle to the credits section here: + - velartrill + - riking27 + also see grammar at line 79 for further editing opportunities +*) +let adjs = [| "gleeful"; "putrescent"; "whimsical"; "looming"; "endless"; "infinite"; "final"; "lustful"; + "twilight"; "black"; "lunar"; "solar"; "whispering"; "sundered"; "lawless"; "threefold"; "sevenfold"; + "tenfold"; "manifest"; "heavenly"; "somber"; "shadowed"; "wandering"; "distant"; "vengeful"; + "fearful"; "mighty"; "shrieking"; "lofty"; "loathesome"; "faceless"; "silent"; "pale"; "crimson"; + "fiery"; "wondrous"; "spiteful"; "weary"; "hateful"; "forsaken"; "forbidden"; "mellifluous"; + "abyssal"; "innocent"; "bronzed"; "fine"; "poor"; "masterful"; "forgotten"; "lost"; "infernal"; + "merciful"; "merciless"; "reckless"; "wonderful"; "beloved"; "ancient"; "decrepit"; "abstract"; + "honorable"; "animated"; "bloody"; "dead"; "old"; "expired"; "new"; "fresh"; |] +let nouns = [| "orb"; "law"; "moon"; "night"; "fist"; "question"; "deceit"; "perception"; "regret"; + "wonder"; "terror"; "hope"; "lust"; "inception"; "manifestation"; "whole"; "sea"; "stone"; "earth"; + "door"; "gate"; "portal"; "tree"; "fear"; "might"; "egret"; "circle"; "pit"; "crevice"; "hand"; "face"; + "inferno"; "spite"; "loom"; "malice"; "vial"; |] +let forces = [| "prince"; "king"; "queen"; "archon"; "god"; "demon"; "lord"; "lady"; "thing"; "wind"; + "beast"; "terror"; "spirit"; "spirits"; "muse"; "sylph"; "fool"; "child"; "creature"; "drake"; |] +let kinds = [| "rite"; "ritual"; "spell"; "invocation"; "evocation"; "conjuration"; "abjuration"; "binding"; + "incantation"; "appeasement"; "craft"; "alchemy"; "transmutation"; "transmogrification"; "incitement"; + "debasement"; "blessing"; "consecrecation"; "desecration"; |] + +(* two of these are combined to form a surname *) +let people_name_elts = [| "wind"; "horn"; "fear"; "sea"; "sun"; "sky"; "star"; "hand"; "cold"; "warm"; "sand"; + "soul"; "sin"; "pale"; "dark"; "dread"; "hammer"; "lust"; "rage"; "blood"; "fire"; "flame"; "over"; "blight"; + "thunder"; "time"; "space"; "void"; "light"; "mind"; "life"; "air"; "breath"; "heir"; "doom"; "stein"; "chill"; + "cool"; "love"; "just"; "drake"; "hell"; "war"; "wright"; "bone"; |] + +(* these precede surnames *) +let forenames = [| "abigail"; "mordred"; "morgan"; "samantha"; "rachael"; "cassandra"; "jedediah"; "zebediah"; + "malachi"; "malachiah"; "charles"; "jezebel"; "simon"; "simone"; "salamandrael"; "jehosaphat"; "josiah"; + "mandrake"; "jessifer"; "sophia"; "morgause"; "winfred"; "winnifred"; "jennifer"; "carlissa"; "carlotta"; + "carissa"; "melissa"; "xylinda"; "samedra"; "damara"; "kurloz"; "hans"; "vladimir"; |] + +(* titles prefix a name, i.e. Sir Abigail Lusthammer *) +let titles = [| "sir"; "king"; "lord"; "queen"; "empress"; "dame"; "madam"; "mistress"; "master"; "lady"; + "emperor"; "archmage"; "magister"; "archmagister"; "magistress"; "magistrix"; "archmagistress"; + "archmagistrix"; "knight"; "agent"; |] + +type node = R of string array | B of node array | OL of node list | O of node | L of node list | S of string + +let pick a = a.(Random.int(Array.length a)) +let range min max = min+(Random.int(max-min)) +let rec eval n : string = match n with + | R(n) -> pick n + | OL(n) -> eval (O(L n)) + | B(n) -> eval (pick n) + | O(n) -> if range 0 2 = 0 then eval n else "" + | L(n) -> List.fold_left (fun a b -> a ^ (eval b)) "" n + | S(s) -> s + +let people = L [ R people_name_elts; R people_name_elts; ] +let force = L [R adjs; S " "; R forces] +let attrib = L[OL[R titles; S" "]; OL[R forenames; S" "]; people; OL[S" the "; R adjs;];S"'s ";] +let ritual_name = B [| + L [O attrib; OL[R adjs; S " "]; R kinds; S " of "; O(S "the "); OL[force; S "'s "]; OL[R adjs; S " "]; R nouns; ]; + L [attrib; OL[R adjs; S " "]; R nouns; ] +|] + +let agents = [| "a child"; "a bird"; "an eagle"; "a thief"; "a king"; "a conqueror"; "a fool"; "a madman"; + "an innocent"; "a murderer"; "a virgin"; "a queen"; "a pauper"; "a fox"; "a girl"; "a boy"; + "a dying man"; "a drake"; "a beast"; "a spirit"; "a sylph"; "a seer"; "the wind"; |] +let liquids = B [| S "blood"; S "ale"; S "wine"; S "water"; S"sea-water"; S"river-water"; S"lake-water"; L[S "the blood of "; R agents]; |] +let liquid_containers = [| "chalice"; "ewer"; "goblet"; "bowl"; "waterskin"; "bottle"; "cask"; |] +let object_containers = [| "bowl"; "box"; "basket"; "chest"; |] +let surfaces = [| "plinth"; "platter"; "altar"; "plate"; |] +let objects = [| "stone"; "feather"; "orb"; "quill"; "knife"; "candle"; "bow"; "bullet"; + "necklace"; "charm"; "amulet"; "biscuit"; |] +let materials = [| "crystal"; "bone"; "iron"; "steel"; "copper"; "gold"; "silver"; "sapphire"; "opal"; + "jade"; "amethyst"; "quartz"; "diamond"; "emerald"; "tin"; "zinc"; "bismuth"; "sterling"; "bronze"; "blood"; |] +(* [optional[partorigin], bodyparts] *) +let bodyparts = [| "skull"; "femur"; "blood"; "tooth"; "toe"; "eye"; "eyeball"; "skin"; "hand"; "fingernail"; + "claw"; "toenail"; "tail"; "vertebra"; "backbone"; "heart"; "liver"; "spleen"; "womb"; "fetus"; "fin"; |] +let partorigin = [| "human"; "virgin"; "cow"; "dog"; "horse"; "beast"; "wolf"; "alligator"; "goat"; "bird"; + "crow"; "eagle"; "dove"; "pigeon"; "owl"; "elephant"; "bear"; "fox"; "buzzard"; + (* posessives *) + "a beloved pet's"; "an innocent's"; "the target's"; "your"; "your"; "an intruder's"; |] + +type thingkind = Liquid_container | Object_container | Surface | Object +type thing = { + kind : thingkind; + name : string; + adj : string option; + desc : string option; +} +let times = R[| "once"; "twice"; "thrice"; |] +let places = [| "in a dreadful ravine"; "in a forsaken village"; "at the bottom of the sea"; "on the moon"; + "in a grave"; "in a mausoleum"; "beneath a tree"; "where it should not have been"; "in the sea"; + "in a dwelling"; "in a forest"; |] +let desc = + (* kinds *) B[| + (* actions *) L[ B[| + L[S"found"; + OL[S" "; R places]; + OL[S" by "; + R(Array.concat [agents; [|"one who should not have found it"; |]])]; + ]; + + L[S"lost"; + OL[S" "; + R(Array.concat [places;[|"to the sea";|]])]; + OL[S" by "; + R(Array.concat [agents; [|"one who should not have lost it"; |]])]; + ]; + L[S "stolen"; + OL[S" by "; + R(Array.concat [agents; [|"one who should not have stolen it"; |]])]; + OL[S" from "; + R(Array.concat [agents; [|"one who should not have lost it";"one who should not have stolen it"; + "one who should never have held it"; "its rightful owner"; "a vault"; "a castle"; "a beast"; |]])]; + ]; + L[S "washed"; + OL[S" "; R[| + "in the sea"; "in blood"; "beneath a waterfall"; "in a fountain"; "in a lake long-dry"; + "in tears"; "in tears of grief"; "in tears of joy";|]]; + OL[S" by "; + R(Array.concat [agents; [|"an elderly washerwoman"; |]])]; + ]; + |]; + (* circumstances *) O(B[| + S" at night"; + S" by chance"; + S" long ago"; + S" years ago"; + S" in the distant past"; + S" at noon"; + S" at dawn"; + S" in war"; + S" at war"; + S" for years"; + S" by accident"; + |]); + ]; + (* traits *) B[| + L[times; S"-blessed"]; + L[times; S"-cursed"]; + S "black as night"; + S "red as blood"; + S "white as bone"; + S "blue as the sky"; + S "green as grass"; + S "bright as gold"; + S "old as time"; + |]; +|] + +let adj_material = L[ O(OL[R adjs; S" "]); OL[R materials; S" "]; ] + +let newthing () : thing = let kind = pick [|Liquid_container; Object_container; Surface; Object;|] in { + kind = kind; + adj = pick[|None; Some(pick adjs)|]; + desc = pick[|None; Some(eval desc)|]; + name = match kind with + | Liquid_container -> eval (L[adj_material; R liquid_containers]) + | Object_container -> eval (L[adj_material; R object_containers]) + | Surface -> eval (L[adj_material; R surfaces]) + | Object -> eval (B[| + L[adj_material; R objects]; + L[OL[R partorigin; S" "]; R bodyparts;] + |])} +let descthing t = (match t.adj with Some(s) -> s^" " | None -> "")^ + (*(String.uppercase_ascii()*) t.name^ + (match t.desc with Some(s) -> ", "^s | None -> "") + + +let ritual () = + let name = eval ritual_name in + let foci = + let rec acc (times : int) : thing list = (newthing ()) :: (if times = 0 then [] else acc (times-1)) + in acc (range 0 10) + in + (String.uppercase_ascii(name))^"\n\n"^ + (pick [|"You will need:"; "Components:"; "Foci:"; "Ingredients:"; "Elements:"; "Materials:"; + "You must gather:"; "Necessary offerings:"|]) ^"\n"^ + (let rec enumerate_foci n f = match f with + | x :: rs -> ((string_of_int n) ^ ") " ^ (descthing x) ^ "\n") ^ (enumerate_foci (n+1) rs) + | [] -> "" in enumerate_foci 1 foci) + +let () = Random.self_init (); print_string (ritual ());; + ADDED sectbot.ml Index: sectbot.ml ================================================================== --- sectbot.ml +++ sectbot.ml @@ -0,0 +1,93 @@ +type word = R of string | I of string * string +type apos = Obs | Size | Attrib | Shape | Age | Mid | Color | Origin | Material | Qual +let order adj = match (let _,a = adj in a) with + | Obs -> 0 | Size -> 1 | Attrib -> 2 | Shape -> 3 | Age -> 4 + | Mid -> 5 | Color -> 6 | Origin -> 7 | Material -> 8 | Qual -> 9 +type adj = string * apos +let adjs : adj array = [| + "Sanctified", Obs; "Blasphemous", Obs; "Red", Color; "Yellow", Color; + "Ebon", Color; "Ochre", Color; "Eternal", Age; "Perpetual", Age; + "Everlasting", Age; "Black", Color; "White", Color; "Mad", Obs; + "Infinite", Attrib; "Timeless", Age; "Terrible", Obs; "Sightless", Obs; + "All-Seeing", Mid; "Third", Obs; "Second", Obs; "Endless", Obs; + "Reviled", Obs; "Absolute", Obs; "Damned", Obs; "Cursed", Obs; + "Blessed", Obs; "Lucid", Obs; "Unthinkable", Obs; "Nameless", Obs; + "Unspeakable", Obs; "Glorious", Obs; "Cold", Obs; "Burning", Obs; + "Shapeless", Shape; "Formless", Shape; "Unknowable", Obs; "Lifeless", Obs; + "Fatal", Attrib; "Infernal", Origin; "Abyssal", Origin; "Celestial", Origin; + "Implacable", Obs; "Dark", Color; "Resolute", Obs; "Resplendant", Color; + "Unstoppable", Obs; "Blood-Soaked", Material; "Endless", Size; + "Forgotten", Obs; "Iron", Material; "Bronze", Material; "Steel", Material; + "Secret", Obs; "Hidden", Obs; "Fiery", Color; "Ancient", Age; + "Silver", Material; "Silver", Color; "Screaming", Mid; "Mighty", Mid; + "Thousand-Year", Qual; "Jewelled", Material; "Damnable", Mid; + "Creeping", Mid; "All-Knowing", Mid; "All-Hearing", Mid; "Holy", Mid; + "Global", Mid; "Leering", Mid; "Forty-Second", Obs; "Divine", Mid; + "Faithful", Mid; "Ageless", Age; "Steadfast", Attrib; "Cruel", Attrib; + "Sapphire", Material; "Sapphic", Origin; "Secluded", Mid; "Scarlet", Color; + "Shrieking", Mid; "Hollow", Mid; "Mild", Mid; "Wondrous", Obs; +|] +let subjects = [| + "Order"; "Cult"; "Temple"; "Church"; "Hand"; "Eyes"; + "Source"; "Keepers"; "Maidens"; "Servants"; "Templars"; + "Followers"; "Celebrants"; "Rite"; "Sect"; "Guild"; + "Society"; "School"; "Gathering"; "Bearers"; "Guardians"; + +|] +let definite_objects = [| + "Prince"; "King"; "Master"; "Princess"; "Queen"; "Mistress"; + "Devourer"; "Obliterator"; "Destroyer"; "Portal"; + "Serpent"; "Moon"; "One"; "Two"; "Three"; "Four"; + "Five"; "Six"; "Seven"; "Eight"; "Nine"; "Ten"; "Twelve"; + "Eye"; "God"; "Horror"; "Thing"; "Flames"; "Night"; "Day"; + "Year"; "Years"; "Way"; "Realm"; "Path"; "Light"; "Fire"; + "Door"; "Gate"; "Plan"; "Terror"; "Staff"; "Window"; + "Road"; "Spire"; "Beast"; "Flesh"; "Sword"; "Mountain"; + "River";"Crown";"Scepter"; "Desecrator";"Defiler"; + "Despoiler"; "Ravager"; "Rite"; "Sea"; "Ocean"; "Chaos"; + "Goat"; "Legion"; "Pyramid"; "Dragon"; "Hand"; "Pantheon"; + "Spirit"; "Devil"; "Gods"; "Rod"; "Glitch"; "Error"; + "Perversion"; +|] +let zero_objects = [| + "Doom"; "Death"; "Torment"; "Fires"; "Pain"; "Screams"; + "Fear"; "Terror"; "Whispers"; "Failure"; "Perversion"; +|] + +let pick (r : 'a array) : 'a = r.(Random.int(Array.length r)) +let picks (r : ('b * ('a array)) list) : ('b * 'a) = + let sum = List.fold_left (fun c (_,a) -> c + Array.length a) 0 r in + let id = Random.int sum in + let rec find i (l : (bool * ('a array)) list) = + match l with (tag,a)::tl -> + let sz = Array.length a in + if sz > i then (tag, a.(i)) + else find (i-sz) tl + | _ -> assert false + in find id r;; + +let adjp () = + let flatten l = List.fold_left (fun a (s,_) -> a ^ " " ^ s) "" l in + let rec pos adj (phr : adj list) = + if (phr = []) then [adj] + else if (order adj) > order (List.hd phr) then + (List.hd phr) :: (pos adj (List.tl phr)) + else adj :: (List.tl phr) + in let rec loop phr ct = + if ct = 0 then pos (pick adjs) phr + else loop (pos (pick adjs) phr) (ct-1) + in flatten (loop [] (Random.int 4));; + +let objp () = picks [(true, definite_objects); (false, zero_objects)] +let sect () = let a = adjp() in + let a' = adjp() in + let def,o = objp() in + match Random.int 7 with (* haaack *) + | 0 -> "The " ^ (pick subjects) ^ " of the " ^ (let a,_ = pick adjs in a) + | 1 -> "The " ^ (pick subjects) ^ " of " ^ (if def then "the " else "") ^ o + | 2 -> "The" ^ a' ^ " " ^ (pick subjects) ^ " of " ^ (if def then "the " else "") ^ o + | 3 -> "The" ^ a' ^ " " ^ (pick subjects) ^ " of the " ^ (let a,_ = pick adjs in a) + | _ -> "The" ^ a' ^ " " ^ (pick subjects) ^ " of" ^ (if def then " the" else "") ^ a ^ " " ^ o + +let () = Random.self_init (); + print_string (sect()) ADDED sextbot.ml Index: sextbot.ml ================================================================== --- sextbot.ml +++ sextbot.ml @@ -0,0 +1,728 @@ +type noun = R of string * string | V of string * string | M of string | Mv of string | Pn of string | Pnv of string +let sn n = R(n, n^"s") +let nouns = [| + R("pussy", "pussies"); sn "cock"; R("penis", "penises"); sn "representative"; + R("minority","minorities"); sn "dick"; sn "breast"; sn "mouth"; sn "face"; + M "hair"; Pn "politics"; sn "soul"; sn "ear"; sn "nose"; sn "senator"; sn "kink"; + sn "girl"; sn "boy"; R("city","cities"); R("titty","titties"); sn "vagina"; sn "bot"; + sn "butt"; R("foot","feet"); R("moose","moose"); sn "daughter"; sn "cunt"; + sn "Bolshevik"; sn "goat"; sn "tentacle"; sn "uncle"; sn "queen"; sn "peer"; + R("party","parties"); R("cooch","cooches"); R("snooch","snooches"); sn "tit"; + V("ass","asses"); sn "gender"; sn "cop"; M "police"; sn "loser"; sn "king"; + sn "rifle"; sn "vibrator"; Pn "authorities"; R("box","boxes"); sn "orifice"; + sn "count"; sn "baron"; R("countess","countesses"); R("baroness","baronesses"); + R("thesis","theses"); M "praxis"; M "rope"; Pn "handcuffs"; sn "boob"; + sn "critique"; sn "slave"; sn "buttslut"; sn "idea"; sn "revolver"; sn "corpse"; + R("ideology","ideologies"); sn "beast"; sn "youth"; sn "tail"; sn "bulge"; + sn "tty"; sn "dongle"; sn "shell"; sn "result"; sn "argument"; sn "guitar"; + R("class","classes"); V("advance","advance"); sn "restraint"; sn "nipple"; + sn "orb"; M "junk"; sn "array"; R("matrix","matrices"); sn "crack"; sn "fork"; + R("mistress","mistresses"); V("assignment","assignments"); + R("switch","switches"); sn "sin"; sn "creep"; sn "Pope"; sn "weeb"; + sn "submission"; sn "strap"; sn "noun"; sn "verb"; R("cross","crosses"); sn "whip"; + M "faith"; Pn "beliefs"; Pn "panties"; V("implement","implements"); + sn "text"; sn "book"; sn "grimoire"; sn "twink"; sn "blog"; sn "scandal"; + Pn "drugs"; Mv "evil"; M "good"; sn "moron"; sn "fuck"; sn "neck"; sn "cad"; + sn "fucker"; sn "stalker"; R("beauty","beauties"); sn "jock"; sn "people"; + sn "bro"; sn "president"; sn "nerd"; sn "rival"; sn "hacker"; sn "johnson"; + V("illusion","illusions"); sn "hand"; R("ash","ashes"); M "love"; sn "father"; + sn "mother"; R("boundary","boundaries"); sn "callout"; sn "appendage"; + sn "callout post"; sn "death"; R("witch","witches"); sn "limb"; sn "loophole"; + V("attack surface","attack surfaces"); sn "claw"; M "democracy"; sn "cannon"; + R("woman","women"); M "shit"; Mv "artillery"; R("facility","facilities"); + R("man","men"); sn "blog post"; R("knife","knives"); sn "moon"; M "truth"; + R("fetish","fetishes"); R("tummy","tummies"); sn "bunker"; sn "pigeon"; + V("orgasm", "orgasms"); sn "startup"; sn "throat"; sn "wizard"; sn "robe"; + sn "spell"; sn "fanfic"; sn "rack"; sn "thumbscrew"; sn "ballot"; sn "campaign"; + sn "gay"; sn "lesbian"; sn "mommyblog"; sn "widget"; sn "spine"; sn "hell"; + sn "candidate"; sn "dog"; sn "pig"; R("Tory","Tories"); sn "prime minister"; + V("outrage","outrages"); V("elf","elves"); R("dwarf","dwarves"); V("orc","orcs"); + V("ork","orks"); M "discourse"; V("imbecile","imbeciles"); sn "monolith"; + sn "scepter"; V("obelisk","obelisks"); sn "clit"; R("clitoris","clitorises"); M "porn"; + sn "wound"; sn "relationship"; sn "probe"; sn "porn"; sn "secret"; R("lady","ladies"); + V("anxiety","anxieties"); M "scum"; M "dirt"; M "trash"; R("witch","witches"); + M "steam"; M "smoke"; R("senpai","senpai"); R("kohai","kohai"); M "vore"; + R("sensei","sensei"); sn "meat"; R("staff","staves"); sn "rod"; M "terror"; + V("anus","anuses"); R("church","churches"); sn "debate"; sn "console"; + M "bondage"; M "discipline"; sn "catboy"; sn "catgirl"; sn "top"; sn "bottom"; + sn "submissive"; sn "dom"; sn "domme"; sn "prole"; sn "car"; sn "hat"; + sn "commander"; sn "general"; sn "sergeant"; sn "lieutenant"; sn "ensign"; + sn "captain"; sn "admiral"; sn "doctor"; Pn "steel beams"; R("furry","furries"); + V("insecurity","insecurities"); sn "limit"; sn "law"; sn "enchantment"; + R("postmaster general","postmasters general"); R("wench","wenches"); + sn "shame cube"; sn "government"; sn "laser"; M "blood"; M "sex"; + sn "mace"; sn "flail"; sn "neg"; sn "dome"; V("atom","atoms"); sn "chest"; + M "space"; sn "flaw"; sn "failure"; R("booty","booties"); sn "beaver"; + sn "governor"; sn "nuke"; sn "nuclear missile"; sn "nuclear warhead"; + V("ICBM","ICBMs"); V("electrode","electrodes"); Mv "abuse"; + sn "machine"; sn "fucker"; R("boris","borises"); R("gary","garies"); + sn "doom"; sn "pimp"; sn "shitpost"; Pnv "evils"; Pn "Crime Hole"; + + R ("[REDACTED]","[REDACTED]"); + V ("[REDACTED]","[REDACTED]"); +|] +type word = A of string | An of string +let adjs = [| + A "gleaming"; A "bleeding"; A "stupid"; A "useless"; A "sexy"; + A "tight"; A "wet"; A "hard"; A "kinky"; A "pervy"; A "Republican"; + A "naughty"; A "filthy"; A "slutty"; A "revolutionary"; A"nuclear"; + A "counterrevolutionary"; A "hopeless"; A "satanic"; A "sex"; + A "nuclear sex"; A "lusty"; A "noble"; A "witty"; A "hot"; A "soft"; + A "steamy"; A "Marxist"; A "horny"; A "slutty"; A "lustful"; + A "lawful"; A "bold"; A "sophisticated"; A "winsome"; A "dumb"; + A "bulging"; A "throbbing"; A "scrawny"; A "problematic"; + A "duly appointed"; A "wondrous"; A "scandalous"; A "papal"; + A "holy"; A "whimpering"; A "Bluetooth-enabled"; A "fuckable"; + A "sentient"; A "Turing-complete"; A "redneck"; A "corrective"; + A "lawless"; A "lunar"; A "solar"; A "luminous"; A "repressive"; + A "sustainable"; A "wise"; A "wizardly"; A "sorcerous"; A "wizard"; + A "magic"; A "presidential"; A "campaign"; A "gay"; A "lesbian"; + A "regressive"; A "psychic"; A "sad"; A "happy"; A "humble"; + A "Tory"; A "sinister"; A "sick"; A "twisted"; A "moderate"; + A "horrific"; A "horrifying"; A "conservative"; A "sensible"; + A "meaningless"; A "luscious"; A "lucrative"; A "terror"; + A "secret"; A "snobby"; A "bratty"; A "mystical"; A "$300"; + A "$700"; A "$1000"; A "100-carat"; A "cool"; A "rad"; + A "radical"; A "terrorist"; A "firm"; A "dead"; A "decaying"; + A "submissive"; A "dominant"; A "moist"; A "humiliating"; + A "government sex"; A "government"; A "sext"; A "ballistic"; + A "government sext"; A "glistening"; A "blood"; A "strategic"; + A "laser"; A "government blood"; A "+1"; A "cursed"; A "space"; + A "space sex"; A "monumental"; A "restrained"; A "helpless"; + A "boring"; A "heterosexual"; A "monogamous"; A "hairy"; + A "sin"; A "sinful"; A "tactical"; A "rectal"; A "fucking"; + A "dread"; A "dread sex"; A "dread government"; A "pimp"; + A "dread government sex"; A "doom"; A "government doom"; + + An "awful"; An "electronic"; An "electric"; An "ugly"; + An "illegal"; An "unlawful"; An "arcane"; An "undulating"; + An "appropriate"; An "inappropriate"; An "appropriative"; + An "eminent"; An "ominous"; An "oppressive"; An "anal"; + An "unsustainable"; An "outrageous"; An "insensitive"; + An "elfin"; An "elvish"; An "elfin sex"; An "elvish sex"; + An "esoteric"; An "exotic"; An "abusive"; An "austere"; + An "embarrassing"; An "erotic"; An "imperial"; + An "immaculate"; An "evil"; An "evil government"; + An "evil sex"; An "evil elf"; An "evil gay"; +|] +let pick (r : 'a array) : 'a = r.(Random.int(Array.length r)) +let coin () = if Random.int 2 = 0 then true else false +let getform p noun = match noun with + | Mv (n) | M(n) -> n + | Pn (n) | Pnv(n) -> n + | V(sg,pl) -> (if p then pl else sg) + | R(sg,pl) -> (if p then pl else sg);; + +let stat noun = let plural = match noun with + | Mv (_) | M(_) -> false + | Pn (_) | Pnv(_) -> true + | _ -> coin() in + let form, vl = match noun with + | V(sg,pl) -> if plural then pl,true else sg,true + | R(sg,pl) -> if plural then pl,false else sg,false + | Mv(n) -> n,true + | M(n) -> n,false + | Pn(n) -> n,true + | Pnv(n) -> n,true in plural, form, vl;; + +let bnp force_sg : string * bool = let noun = pick nouns in + let p, form, vl = stat noun in + let plural = if force_sg then false else p in + let dets = Array.append [| "my"; "your"; "the"; "some"; |] + (if plural then [| "these"; "those"; |] else [| "this"; "that"; |]) in + let adj = if coin () then None else Some (pick adjs) in + (if Random.int 5 = 0 then + if plural then form else match adj with + | None -> if vl then "an "^form else "a "^form + | Some(A(n)) -> "a "^n^" "^form + | Some(An(n)) -> "an "^n^" "^form + else (pick dets) ^( + match adj with + | None -> "" + | Some(A(n)) | Some(An(n)) -> " "^n + )^" "^form),plural;; + + +type form = Bare | Sg | Ppl | Ing +type verb = (form -> string option -> string) +let actions' : verb array ref = ref [||] +let np () = let base, number = bnp false in + let n = match Random.int 30 with + | 0 -> base ^ " of " ^ (let b,_ = bnp false in b) + | 1 -> base ^ " of " ^ ((pick !actions') Ing (if coin() then None else Some ( + getform true (pick nouns) + ))) + | 2 -> base ^ " of " ^ (match pick adjs with A(n) | An(n) -> n) ^ + " " ^ ((pick !actions') Ing None) + | 3 -> (let b,_ = bnp true in b) ^ "'s " ^ (getform (coin()) (pick nouns)) + | _ -> base + in (n,number);; + +let strn () = let n,_ = np() in n + +let svb (sg,pl,ing,ppl) : verb = (fun f obj -> let o = match obj with + | None -> "" + | Some x -> " "^x + in (match f with + | Bare -> sg + | Sg -> pl + | Ppl -> ppl + | Ing -> ing)^o) +let phrvb (sg,pl,ing,ppl) prep = (fun f obj -> let o = match obj with + | None -> "" + | Some x -> " "^x + in (match f with + | Bare -> sg + | Sg -> pl + | Ppl -> ppl + | Ing -> ing)^o^" "^prep) +let ppvb (sg,pl,ing,ppl) prep = (fun f obj -> let o = match obj with + | None -> "" + | Some x -> " "^x + in (match f with + | Bare -> sg + | Sg -> pl + | Ppl -> ppl + | Ing -> ing)^o^" "^prep^" "^(strn())) +let svt x = (x,x^"s",x^"ing",x^"ed") +let svte x = (x^"e",x^"es",x^"ing",x^"ed") +let evt x = (x,x^"es",x^"ing",x^"ed") + +let simple_verbs : verb array = [| + svb (svt "yank"); + svb (svte "delet"); + svb (svt "compress"); + svb (svt "fuck"); + svb (svt "sext"); + svb (svt "spank"); + svb (svt "smack"); + svb (svt "fork"); + svb ("slap", "slaps", "slapping", "slapped"); + svb (evt "publish"); + svb (evt "punish"); + svb (evt "kiss"); + svb (svt "stay"); + svb (svt "laser"); + svb (svt "censor"); + svb (svt "tweet"); + svb ("vore","vores","voring","vored"); + svb ("bite","bites","biting","bitten"); + svb (evt "dox"); + svb ("police", "polices", "policing", "policed"); + svb (svt "inspect"); + svb ("defile", "defiles", "defiling", "defiled"); + svb ("@", "@s", "@'ing", "@'ed"); + svb ("shoot","shoots","shooting","shot"); + svb ("ship","ships","shipping","shipped"); + svb ("stun","stuns","stunning","stunned"); + svb (svte "mutilat"); + svb (svte "criticiz"); + svb ("debunk","debunks","debunking","debunked"); + svb (svte "critiqu"); + svb ("smite", "smites", "smiting", "smitten"); + svb ("verify", "verifies", "verifying", "verified"); + svb (svt "restrain"); + svb ("inflect", "inflects", "inflecting", "inflected"); + svb ("whip", "whips", "whipping", "whipped"); + svb (svte "squeez"); + svb (svt "pull"); + svb (svt "flatten"); + svb (svt "crush"); + svb (svte "abus"); + svb ("cut", "cuts", "cutting", "cut"); + svb ("dispel", "dispels", "dispelling", "dispelled"); + svb ("split", "splits", "splitting", "split"); + svb (svte "throttl"); + svb (svte "strangl"); + svb (svt "slaughter"); + svb (svte "grop"); + svb (svte "vap"); + svb (svt "sever"); + svb (svt "stalk"); + svb (svt "mock"); + svb ("stab", "stabs", "stabbing", "stabbed"); + svb (svt "snort"); + svb ("ban", "bans", "banning", "banned"); + svb ("oppress", "oppresses", "oppressing", "oppressed"); + svb ("suppress", "suppresses", "suppressing", "suppressed"); + svb ("depress", "depresses", "depressing", "depressed"); + svb (svt "sadden"); + svb (svte "curs"); + svb (svte "vot"); + svb (svt "disrupt"); + svb (svte "humbl"); + svb (svt "fucc"); + svb (svt "69"); + svb (svt "cuck"); + svb ("snap", "snaps", "snapping", "snapped"); + svb (svte "pleasur"); + svb (svte "pleas"); + svb (svt "cuff"); + svb (svt "melt"); + svb (svte "deprecat"); + svb (svte "debat"); + svb (svt "dick"); + svb ("bleed", "bleeds", "bleeding", "bled"); + svb (svt "finger"); + svb (svt "exploit"); + svb ("portscan", "portscans", "portscanning", "portscanned"); + svb ("bully", "bullies", "bullying", "bullied"); + svb (svt "enchant"); + svb ("steal", "steals", "stealing", "stolen"); + svb (svt "yiff"); + phrvb (svt "yiff") "up"; + svb (svt "duel"); + svb (svt "repeal"); + svb (svt "twist"); + svb (svt "abolish"); + svb (svte "punctur"); + svb (svte "roboticiz"); + svb ("wiretap", "wiretaps", "wiretapping", "wiretapped"); + svb ("do", "does", "doing", "done"); + svb (svt "dial"); + svb (svte "enslav"); + svb ("neg", "negs", "negging", "negged"); + svb (svt "slander"); + svb (svt "smear"); + svb (svt "sex"); + svb (svte "censur"); + svb (svte "exoticiz"); + svb (svte "romanticiz"); + svb (svt "bombard"); + svb (svte "seduc"); + svb (svt "despoil"); + svb (svt "destroy"); + svb (svte "ravag"); + svb (svt "ravish"); + svb (svt "plunder"); + svb ("[REDACTED]","[REDACTED]","[REDACTED]","[REDACTED]"); + svb (svte "delud"); + svb (svt "redact"); + svb (svte "denigrat"); + svb (svte "expung"); + svb (svt "insert"); + ppvb (svt "insert") "in"; + svb (svt "lick"); + svb (svt "defeat"); + svb (svt "defend"); + svb (svte "interrogat"); + svb (svte "tortur"); + svb (svt "shock"); + svb (svte "scandaliz"); + svb ("beat","beats","beating","beaten"); + svb (svt "obey"); + svb (svt "disobey"); + svb (svt "doom"); + svb (svt "pimp"); + svb (svt "dissect"); + svb (svt "transcend"); + svb (svte "exorcis"); + svb (svte "compil"); + svb (svte "decompil"); +|] + +let complex_verbs : verb array = [| + svb ("laugh at","laughs at","laughing at","laughed at"); + svb ("shoot at","shoots at","shooting at","shot at"); + svb ("shout at","shouts at","shouting at","shouted at"); + phrvb (svt "fuck") "up"; + phrvb (evt "mess") "up"; + phrvb ("hold","holds","holding","held") "down"; + phrvb (evt "push") "down"; + phrvb (svt "knock") "down"; + phrvb ("tie","ties","tying","tied") "down"; + phrvb ("tie","ties","tying","tied") "up"; + ppvb ("tie","ties","tying","tied") "up with"; + ppvb ("tie","ties","tying","tied") "to"; + phrvb ("take","takes","taking","taken") "offline"; + phrvb ("take","takes","taking","taken") "apart"; + ppvb ("take","takes","taking","taken") "out of"; + phrvb ("take","takes","taking","taken") "out"; + ppvb ("take","takes","taking","taken") "out for"; + phrvb ("beat","beats","beating","beaten") "up"; + phrvb ("beat","beats","beating","beaten") "off"; + ppvb ("beat","beats","beating","beaten") "up with"; + ppvb (svte "shov") "onto"; + ppvb (svte "shov") "off"; + ppvb (svte "shov") "out of"; + ppvb (svte "shov") "down"; + ppvb (svt "smack") "in"; + ppvb (svt "smack") "right in"; + ppvb (svt "smack") "with"; + ppvb ("slap", "slaps", "slapping", "slapped") "with"; + ppvb ("slap", "slaps", "slapping", "slapped") "in"; + ppvb ("slap", "slaps", "slapping", "slapped") "right in"; + phrvb ("slap", "slaps", "slapping", "slapped") "silly"; + phrvb ("slap", "slaps", "slapping", "slapped") "off"; + ppvb (evt "punish") "with"; + ppvb (evt "kiss") "on"; + phrvb (svt "connect") "to the internet"; + ppvb (svt "connect") "to"; + ppvb (svt "disconnect") "from"; + phrvb (svt "disconnect") "from the internet"; + ppvb ("put","puts","putting","put") "in"; + ppvb (svt "lock") "in"; + phrvb ("shoot","shoots","shooting","shot") "down"; + ppvb ("shoot","shoots","shooting","shot") "in"; + phrvb ("set","sets","setting","set") "on fire"; + phrvb ("set","sets","setting","set") "to 'stun'"; + phrvb ("get","gets","getting","gotten") "all over"; + ppvb ("get","gets","getting","gotten") "all over"; + phrvb ("spill","spills","spilling","spilt") "all over"; + ppvb ("spill","spills","spilling","spilt") "all over"; + phrvb ("strap","straps","strapping","strapped") "down"; + ppvb ("strap","straps","strapping","strapped") "to"; + phrvb ("keep","keeps","keeping","kept") "out"; + ppvb ("keep","keeps","keeping","kept") "in"; + phrvb ("keep","keeps","keeping","kept") "down"; + ppvb ("keep","keeps","keeping","kept") "out of"; + svb ("beg for","begs for","begging for","begged for"); + ppvb (svte "forc") "into"; + ppvb ("ship","ships","shipping","shipped") "with"; + svb ("submit", "submits", "submitting", "submitted"); + svb ("submit to", "submits to", "submitting to", "submitted to"); + svb ("conjugate", "conjugates", "conjugating", "conjugated"); + svb ("decline", "declines", "declining", "declined"); + ppvb ("inflict", "inflicts", "inflicting", "inflicted") "on"; + ppvb (svt "restrain") "with"; + ppvb ("whip", "whips", "whipping", "whipped") "with"; + svb ("bind", "binds", "binding", "bound"); + ppvb ("bind", "binds", "binding", "bound") "with"; + ppvb ("bind", "binds", "binding", "bound") "to"; + svb (svt "respect"); + svb (svt "disrespect"); + svb (svte "dictat"); + ppvb (svte "dictat") "to"; + svb ("control", "controls", "controlling", "controlled"); + svb (svt "follow"); + svb (svt "unfollow"); + svb (svte "simulat"); + svb (svte "stimulat"); + svb (svte "relocat"); + ppvb (svte "reloca") "to"; + svb (svte "lik"); + svb (svte "crav"); + svb ("deny", "denies", "denying", "denied"); + ppvb (svte "argu") "with"; + svb ("argue with", "argues with", "arguing with", "argued with"); + svb (svte "conjur"); + phrvb (svte "conjur") "up"; + svb ("conjure upon", "conjures upon", "conjuring upon", "conjured upon"); + svb (svt "detect"); + ppvb (svte "disabus") "of"; + ppvb ("cut", "cuts", "cutting", "cut") "with"; + ppvb ("cut", "cuts", "cutting", "cut") "up with"; + phrvb ("cut", "cuts", "cutting", "cut") "up"; + phrvb ("cut", "cuts", "cutting", "cut") "off"; + svb (svte "disassembl"); + svb (svt "clean"); + phrvb ("tidy", "tidies", "tidying", "tidied") "up"; + svb ("tidy", "tidies", "tidying", "tidied"); + ppvb (svte "disassembl") "with"; + phrvb (svt "mock") "online"; + phrvb (svt "mock") "on the internet"; + phrvb (svt "mock") "on Twitter"; + phrvb (svt "call") "out"; + phrvb (svt "call") "names"; + svb ("sin with", "sins with", "sinning with", "sinned with"); + phrvb (svt "call") "out"; + svb ("jerk it to", "jerks it to", "jerking it to", "jerked it to"); + svb ("get off on", "gets off on", "getting off on", "got off on"); + phrvb (svt "exploit") "for sex"; + svb (svte "eviscerat"); + svb (svt "dismember"); + svb (svte "dislocat"); + svb (svte "decriminaliz"); + svb (svte "legaliz"); + svb (svte "disparag"); + svb (svte "evolv"); + svb ("evolve into", "evolves into", "evolving into", "evolved into"); + svb ("devolve into", "devolves into", "devolving into", "devolved into"); + svb (svte "appropriat"); + svb (svte "downvot"); + svb (svte "upvot"); + + svb (svte "standardiz"); + svb ("commune with", "communes with", "communing with", "communed with"); + + svb (svt "devour"); + svb (svte "demoniz"); + phrvb (svte "vot") "into office"; + phrvb (svte "vor") "into office"; + svb ("vote for", "votes for", "voting for", "voted for"); + svb ("spit on", "spits on", "spitting on", "spat on"); + svb ("shit on", "shits on", "shitting on", "shat on"); + svb ("sit on", "sits on", "sitting on", "sat on"); + svb (svte "demoraliz"); + svb ("whisper to", "whispers to", "whispering to", "whispered to"); + svb (svt "discern"); + svb (svt "disgust"); + svb (svt "offend"); + svb (svt "disdain"); + svb (svt "resent"); + svb ("lie to", "lies to", "lying to", "lied to"); + + ppvb ("rub", "rubs", "rubbing", "rubbed") "with"; + ppvb ("rub", "rubs", "rubbing", "rubbed") "on"; + ppvb ("rub", "rubs", "rubbing", "rubbed") "all over"; + ppvb ("rub", "rubs", "rubbing", "rubbed") "down with"; + phrvb ("rub", "rubs", "rubbing", "rubbed") "down"; + ppvb ("grind", "grinds", "grinding", "ground") "on"; + ppvb (svt "fill") "with"; + svb (svt "fill"); + phrvb ("snap", "snaps", "snapping", "snapped") "off"; + svb ("bleed on", "bleeds on", "bleeding on", "bled on"); + svb (svt "wound"); + svb (svt "harm"); + svb (svte "prob"); + ppvb (svte "prob") "for"; + svb (svte "automat"); + svb ("watch", "watches", "watching", "watched"); + svb (svt "monitor"); + svb (svte "observ"); + svb ("expel", "expels", "expelling", "expelled"); + ppvb ("expel", "expels", "expelling", "expelled") "from"; + svb ("throw", "throws", "throwing", "thrown"); + phrvb ("throw", "throws", "throwing", "thrown") "out"; + ppvb ("throw", "throws", "throwing", "thrown") "into"; + svb ("sing about", "sings about", "singing about", "sung about"); + svb ("sing for", "sings for", "singing for", "sung for"); + svb ("sing with", "sings with", "singing with", "sung with"); + svb (svt "deflect"); + svb (svte "resembl"); + svb (svte "consol"); + svb ("write about", "writes about", "writing about", "written about"); + svb (svt "honor"); + ppvb (svt "honor") "with"; + svb (svt "dishonor"); + ppvb (svt "dishonor") "with"; + svb ("extol the virtues of", "extols the virtues of", "extolling the virtues of", "extolled in virtue"); + svb (svte "disciplin"); + svb (svte "dominat"); + svb ("top", "tops", "topping", "topped"); + svb (svte "servic"); + svb (svte "serv"); + svb (svt "download"); + svb (svt "upload"); + svb (svt "hack"); + svb (svte "friendzon"); + svb (svte "vindicat"); + svb (svte "shame cub"); + svb (svte "sham"); + svb ("fux", "fuxes", "fuxing", "fuxed"); + phrvb (svt "duel") "to the death"; + ppvb (svt "duel") "for"; + ppvb (svt "duel") "to death for"; + ppvb (svt "duel") "to the death for"; + svb (svte "kinksham"); + ppvb (svte "punctur") "with"; + ppvb (svte "penetrat") "with"; + svb (svt "enter"); + phrvb (svt "dial") "up"; + phrvb (svt "tweet") "up"; + svb ("tweet at","tweets at","tweeting at","tweeted at"); + svb (svte "placat"); +|] + +let trverbs = Array.append simple_verbs complex_verbs;; + +actions' := simple_verbs + +let trvp (f : form) : string = if Random.int 15 != 0 then ((pick trverbs) f (Some (strn ()))) + else ((pick simple_verbs) f (Some (strn ()))) ^ " to death" +let vp (f : form) : string = ((pick trverbs) f None) + +let titles = [| + "mistress"; "master"; "lady"; "lord"; "señora"; "mademoiselle"; "señor"; "monsieur"; "bro"; + "daddy"; "mommy"; "slave"; "girl"; "boy"; "fucktoy"; "senator"; "fuckslave"; "manslave"; + "slut"; "buttslut"; "uncle"; "buttslave"; "professor"; "princess"; "prince"; "father"; "sir"; + "friar"; "president"; "dear"; "your holiness"; "your grace"; "your excellency"; "your worship"; + "your honor"; "milady"; "milord"; "mister"; "missy"; "congressman"; "your eminence"; + "your imperial majesty"; "your majesty"; "miss"; "babe"; "Mr. Chairman"; "Mr. President"; + "Madam Secretary"; "Madam President"; "cuntslave"; "prime minister"; "minister"; "sire"; + "senpai"; "kohai"; "sensei"; "commander"; "general"; "sergeant"; "lieutenant"; "ma'am"; + "captain"; "admiral"; "doctor"; "ensign"; "madame"; "maîtresse"; "maître"; "cap'n"; "baby"; + "babe"; "comrade"; "citizen"; +|] +let bareadj () = match pick adjs with A(a) | An(a) -> a;; + +let clause () = let n, pl = np () in + n ^ " " ^ (trvp (if pl then Bare else Sg));; +let (^^) s c = s ^ (String.make 1 c);; +let capitalize_each s = + let rec loop (i : int) (o : string) (sp : bool) = + if i = (String.length s) then o + else match s.[i] with + | ' ' -> loop (i+1) (o^^' ') true + | 'a'..'z' as c -> if sp + then loop (i+1) (o^^(Char.uppercase_ascii c)) false + else loop (i+1) (o^^c) false + | _ as c -> loop (i+1) (o^^c) false + in loop 0 "" true +let spell () = let name = (pick trverbs) Bare (Some(match pick nouns with + | R(sg,pl) | V(sg,pl) -> pick [|sg;pl|] + | M(n) | Mv(n) | Pn(n) | Pnv(n) -> n)) in capitalize_each name +let ivb f = pick [| + (fun () -> (pick trverbs) f (Some "you")); + (fun () -> (pick trverbs) f (Some "you")); + (fun () -> (pick trverbs) f (Some "ye")); + (fun () -> (pick trverbs) f (Some "myself")); + (fun () -> (pick trverbs) f (Some "myself")); + (fun () -> (pick trverbs) f (Some "meself")); + (fun () -> (trvp f)); + (fun () -> (trvp f)); +|]();; +let uvb f = pick [| + (fun () -> (pick trverbs) f (Some "yourself")); + (fun () -> (pick trverbs) f (Some "me")); + (fun () -> (pick trverbs) f (Some "yourself")); + (fun () -> (pick trverbs) f (Some "me")); + (fun () -> (pick trverbs) f (Some "yeself")); + (fun () -> (trvp f)); +|]();; +let rec tpls = [| + (fun () -> clause()); + (fun () -> "I like "^(strn())); + (fun () -> "I'm "^(strn())); + (fun () -> "I'm always "^(strn())); + (fun () -> "I'm always a slut for "^(strn())); + (fun () -> "I'm always "^(strn())^" for "^(strn())); + (fun () -> "I'm always "^(bareadj())^" for "^(strn())); + (fun () -> "I, um, I "^(ivb Bare)); + (fun () -> "I, um, "^(ivb Bare)); + (fun () -> "you, um, you "^(uvb Bare)); + (fun () -> "you, um, "^(uvb Bare)); + (fun () -> "I like to "^(ivb Bare)); + (fun () -> "I like to, how you say, "^(ivb Bare)); + (fun () -> "I'm gonna "^((pick simple_verbs) Bare (Some "you"))^" silly and call you \""^(pick titles)^"\""); + (fun () -> "you "^((pick simple_verbs) Bare (Some "me"))^" silly and call me \""^(pick titles)^"\""); + (fun () -> ((pick simple_verbs) Bare (Some "me"))^" silly and call me \""^(pick titles)^"\""); + (fun () -> "you want to be "^((pick simple_verbs) Ppl None)^" silly and called \""^(pick titles)^"\""); + (fun () -> "I want to "^(ivb Bare)); + (fun () -> "let me "^(ivb Bare)); + (fun () -> "I wanna "^(ivb Bare)); + (fun () -> "I'm gonna "^(ivb Bare)); + (fun () -> "I'm going to "^(ivb Bare)); + (fun () -> "I need to "^(ivb Bare)); + (fun () -> "I gotta "^(ivb Bare)); + (fun () -> "you need to "^(uvb Bare)); + (fun () -> "you need to be "^((pick trverbs) Ppl None)); + (fun () -> "you gotta "^(uvb Bare)); + (fun () -> "you must not "^(uvb Bare)); + (fun () -> "you wouldn't "^(uvb Bare)); + (fun () -> "don't make me "^(ivb Bare)); + (fun () -> "I force you to "^(uvb Bare)); + (fun () -> "you force me to "^(ivb Bare)); + (fun () -> "I'm "^(bareadj ())); + (fun () -> "I'm gonna make you "^(bareadj ())); + (fun () -> "you're "^(bareadj ())); + (fun () -> "this is "^(bareadj ())); + (fun () -> "this is very "^(bareadj ())); + (fun () -> "this is deeply "^(bareadj ())); + (fun () -> "you have to "^(uvb Bare)^" if you want to be my "^(pick titles)); + (fun () -> "I "^(ivb Bare)); + (fun () -> "I cast "^(spell ())); + (fun () -> "I need to cast "^(spell ())); + (fun () -> "don't make me cast "^(spell ())); + (fun () -> "I cast "^(spell ())^" on you"); + (fun () -> "don't make me cast "^(spell ())^" on you"); + (fun () -> "I cast "^(spell ())^" on myself"); + (fun () -> "I need to cast "^(spell ())^" on myself"); + (fun () -> "you cast "^(spell ())); + (fun () -> "you need to cast "^(spell ())); + (fun () -> "you cast "^(spell ())^" on me"); + (fun () -> "you need to cast "^(spell ())^" on me"); + (fun () -> "you cast "^(spell ())^" on yourself"); + (fun () -> "you need to cast "^(spell ())^" on yourself"); + (fun () -> "I'm "^(ivb Ing)); + (fun () -> "I've "^(ivb Ppl)); + (fun () -> "you've "^(uvb Ppl)); + (fun () -> "you "^(uvb Bare)); + (fun () -> "look me in the eye when I "^(pick trverbs) Bare (Some "you")); + (fun () -> "keep your eyes on "^(strn())^" while I "^(ivb Bare)); + (fun () -> "you must really want to be "^(vp Ppl)^(if coin() then "" else " by "^(strn()))); + (fun () -> "you must really want me to "^(ivb Bare)); + (fun () -> "you must really want "^(strn())^" to "^(trvp Bare)); + (fun () -> "you're gonna get "^(vp Ppl)); + (fun () -> (if coin() then "please " else "") ^ "put "^(strn())^" in "^(strn())^(if coin() then "" else ", and then "^(trvp Bare))); + (fun () -> (trvp Bare)); + (fun () -> "please " ^ (trvp Bare)); + (fun () -> ((pick trverbs) Bare (Some "me")) ^ " and " ^ ((pick trverbs) Bare (Some "me"))); + (fun () -> (pick tpls)() ^" so I can "^(ivb Bare)); + (fun () -> (pick tpls)() ^" hard"); + (fun () -> (pick tpls)() ^" harder"); + (fun () -> (pick tpls)() ^", if that's alright"); + (fun () -> (pick tpls)() ^", in the Biblical sense"); + (fun () -> (pick tpls)() ^" - in the Biblical sense"); + (fun () -> (pick tpls)() ^", if you don't mind"); + (fun () -> (pick tpls)() ^", if you know what I mean"); + (fun () -> "um, " ^ (pick tpls)()); + (fun () -> "arrrr, " ^ (pick tpls)()); + (fun () -> "yarrr, " ^ (pick tpls)()); + (fun () -> "well, " ^ (pick tpls)()); + (fun () -> "you know, " ^ (pick tpls)()); + (fun () -> "haha, " ^ (pick tpls)()); +|] +let epithets = [| "lover"; "punk"; "slut"; "slave"; "fuck"; "fucker"; "toy"; "eater"; "snob"; "lord"; "-ass"; "boy"; "girl"; "bro"; "-man"; "man";|] +let rec mtpls = [| (* haaaaack *) + (fun () -> (pick tpls)()); + (fun () -> (pick tpls)()); + (fun () -> (pick tpls)()); + (fun () -> (pick tpls)()^"~"); + (fun () -> (pick tpls)()^"?"); + (fun () -> (pick tpls)() ^", right?"); + (fun () -> (pick tpls)() ^" - no homo"); + (fun () -> (pick tpls)() ^" - no hetero"); + (fun () -> (pick tpls)() ^", but no homo"); + (fun () -> (pick tpls)() ^", yeah?"); + (fun () -> (pick tpls)() ^", alright?"); + (fun () -> "wanna "^(uvb Bare)^"?"); + (fun () -> "wanna "^(uvb Bare)^", if you know what I mean?"); + (fun () -> (pick tpls)() ^", "^(pick titles)); + (fun () -> (pick tpls)() ^", "^(pick titles)^"~"); + (fun () -> "hey "^(pick titles)^", "^(pick tpls)()); + (fun () -> (pick tpls)() ^", "^(pick titles)^"-san"); + (fun () -> (pick tpls)() ^", "^(pick titles)^"-kun"); + (fun () -> (pick tpls)() ^", "^(pick titles)^"-sama"); + (fun () -> (pick tpls)() ^", "^(pick titles)^"-chan"); + (fun () -> (pick tpls)() ^", "^(pick titles)^"-tan"); + (fun () -> (pick tpls)() ^", "^(pick titles)^"-senpai"); + (fun () -> "please, "^(pick tpls)() ^", "^(pick titles)^"-san"); + (fun () -> "please, "^(pick titles)^"-san, "^(pick tpls)()); + (fun () -> (pick tpls)() ^", "^(match pick nouns with R(n,_) | V(n,_) | M(n) | Mv(n) | Pn(n) | Pnv(n) -> n)^"-san"); (* yeesh *) + (fun () -> (pick tpls)() ^", you "^(match pick nouns with R(n,_) | V(n,_) | M(n) | Mv(n) | Pn(n) | Pnv(n) -> n)^(if coin() then "" else (pick epithets))); (* yeesh *) + (fun () -> (pick tpls)() ^", you "^ + (match pick adjs with A(a) | An(a) -> a)^" "^ + (match pick nouns with R(n,_) | V(n,_) | M(n) | Mv(n) | Pn(n) | Pnv(n) -> n) + ^(if coin() then "" else (pick epithets))); (* yeeeeeeeeeeesh *) +|] +let rec ntpls = [| + (fun name -> (pick tpls)() ^", "^name); + (fun name -> (pick tpls)() ^", "^name); + (fun name -> (pick tpls)() ^", "^name); + (fun name -> (pick tpls)() ^", "^name); + (fun name -> (pick tpls)() ^", "^name); + (fun name -> (pick tpls)() ^", "^name^"~"); + (fun name -> (pick tpls)() ^", "^name^"~"); + (fun name -> (pick tpls)() ^", "^name^" - no homo"); + (fun name -> (pick tpls)() ^", "^name^" - no hetero"); + (fun name -> "Hey "^name^", "^(pick tpls)()); + (fun name -> "Hey "^name^", "^(pick tpls)()); + (fun name -> "Hey "^name^", "^(pick tpls)()); + (fun name -> "Hey "^name^", "^(pick tpls)()); + (fun name -> "Hey "^name^", "^(pick tpls)()^"~"); + (fun name -> "Hey "^name^", "^(pick tpls)()^" - no homo"); + (fun name -> "Hey "^name^", "^(pick tpls)()^" - no hetero"); + (fun name -> "Hey "^name^", "^(trvp Bare)); + (fun name -> "Hey "^name^", "^(trvp Bare)); + (fun name -> "Hey "^name^", "^(trvp Bare)); + (fun name -> "Hey "^name^", "^(trvp Bare)); + (fun name -> "Hey "^name^", "^(trvp Bare)^"~"); + (fun name -> "Hey "^name^", "^(trvp Bare)^" - no homo"); + (fun name -> "Hey "^name^", "^(trvp Bare)^" - no hetero"); +|] +let () = Random.self_init (); + if (Array.length Sys.argv = 1) || (Sys.argv.(1) = "") then print_string (String.capitalize_ascii ((pick mtpls)())) + else print_string (String.capitalize_ascii ((pick ntpls) (String.trim Sys.argv.(1)))); + print_string "\n"; + ADDED threat.ml Index: threat.ml ================================================================== --- threat.ml +++ threat.ml @@ -0,0 +1,34 @@ +let range min max = min+(Random.int (max-min)) +let pick ar = ar.(range 0 (Array.length ar)) +let rule (items : string list Lazy.t array) = let syntax = Lazy.force(pick items) in + List.fold_left (^) "" syntax +let choice ar = Lazy.force(pick ar) +type person = { + nom : string; + gen : string; + acc : string; +} + +let victims = [| + {nom="you";gen="your";acc="you"}; +|] +let insults = [| + "bitch"; "cunt"; "freak"; "douchebag"; + "bastard"; +|] +let action victim = rule [| + lazy ["port "; victim.acc; " to lisp"]; + lazy ["rain on "; victim.gen; " parade"]; +|] +let intros () = + let vocative () = match range 0 3 in + | 0 -> "you" + | 1 -> pick insults + | 2 -> "you, " ^ (pick insults) in + rule [| + lazy ["listen up, "; vocative (); "! +|] +let threat () = (intros()) ^ " " ^ (action (pick victims)) +let () = + Random.self_init(); + print_string (threat ()) ADDED threat.scm Index: threat.scm ================================================================== --- threat.scm +++ threat.scm @@ -0,0 +1,42 @@ +(include "bot.scm") + +(define actors + '#(me you thou they him her myself "your mother" "your mom" "your father" + "your dad" "your aunt" "your uncle" "your dog")) + +(define pronouns '( + (you (nom . "you") (acc . "you") (gen . "your") (poss . "yours") ) + (thou (nom . "thou") (acc . "thee") (gen . "thy") (poss . "thine") ) + (they (nom . "they") (acc . "them") (gen . "their") (poss . "theirs") ) + (him (nom . "he") (acc . "him") (gen . "his") (poss . "his") ) + (her (nom . "her") (acc . "her") (gen . "hers") (poss . "hers") ) + (me (nom . "I") (acc . "me") (gen . "my") (poss . "mine") ) + (myself (nom . "I") (acc . "myself") (gen . "my own") (poss . "my own")))) + +(define (conjugate v t n) + (if (eq? v 'cop) + (case (cons t n) + + +(define (inflect c n) + (if (string? n) + (case c + ((nom acc) n) + ((gen poss cop) (string-append n "'s"))) + ; else + (cdr (assq c (cdr (assq n pronouns)))))) + +(rule (action victim) + ("port " victim " to lisp") + ("rain on " victim "'s parade")) + +(rule (subject actor) + ((inflect 'cop actor) " gonna") + ((inflect 'nom actor) " swear")) + +(print + (inflect + (pick '#(nom acc gen poss)) + (pick actors))) + +;(print (action "you"))