1 /*sex.cpp*/
2 
3 /* Original author unknown.  Presumably this is public domain by now.
4  * If you are the original author or know the original author, please
5  * contact <freebsd@spatula.net>
6  *
7  * Orphan code cleaned up a bit by Nick Johnson <freebsd@spatula.net>
8  * Completely rewrote how word wrapping works and added -w flag.
9  *
10  * Changed a little bit for OpenLieroX.
11  */
12 
13 #include "sex.h"
14 
15 #include "MathLib.h"
16 #include "StringUtils.h"
17 
18 
19 static const char     *faster[] = {
20   "\"Let the games begin!\"",             "\"Sweet Jesus!\"",
21   "\"Not that!\"",                        "\"At last!\"",
22   "\"Land o' Goshen!\"",                  "\"Is that all?\"",
23   "\"Cheese it, the cops!\"",             "\"I never dreamed it could be\"",
24   "\"If I do, you won't respect me!\"",   "\"Now!\"",
25   "\"Open sesame!\"",                     "\"EMR!\"",
26   "\"Again!\"",                           "\"Faster!\"",
27   "\"Harder!\"",                          "\"Help!\"",
28   "\"Fuck me harder!\"",                  "\"Is it in yet?\"",
29   "\"You aren't my father!\"",            "\"Doctor, that's not *my* shou\"",
30   "\"No, no, do the goldfish!\"",         "\"Holy Batmobile, Batman!\"",
31   "\"He's dead, he's dead!\"",            "\"Take me, Robert!\"",
32   "\"I'm a Republican!\"",                "\"Put four fingers in!\"",
33   "\"What a lover!\"",                    "\"Talk dirty, you pig!\"",
34   "\"The ceiling needs painting,\"",      "\"Suck harder!\"",
35   "\"The animals will hear!\"",           "\"Not in public!\"",
36 };
37 
38 static const char     *said[] = {
39         "bellowed",             "yelped",               "croaked",
40         "growled",              "panted",               "moaned",
41         "grunted",              "laughed",              "warbled",
42         "sighed",               "ejaculated",           "choked",
43         "stammered",            "wheezed",              "squealed",
44         "whimpered",            "salivated",            "tongued",
45         "cried",                "screamed",             "yelled",
46         "said",
47 };
48 
49 static const char     *the[] = {
50         "the",
51 };
52 
53 static const char     *fadj[] = {
54         "saucy",                "wanton",               "unfortunate",
55         "lust-crazed",          "nine-year-old",        "bull-dyke",
56         "bisexual",             "gorgeous",             "sweet",
57         "nymphomaniacal",       "large-hipped",         "freckled",
58         "forty-five year old",  "white-haired",         "large-boned",
59         "saintly",              "blind",                "bearded",
60         "blue-eyed",            "large tongued",        "friendly",
61         "piano playing",        "ear licking",          "doe eyed",
62         "sock sniffing",        "lesbian",              "hairy",
63 };
64 
65 
66 static const char     *female[] = {
67    "baggage",              "hussy",                "woman",
68    "Duchess",              "female impersonator",  "nymphomaniac",
69    "virgin",               "leather freak",        "home-coming queen",
70    "defrocked nun",        "bisexual budgie",      "cheerleader",
71    "office secretary",     "sexual deviate",       "DARPA contract monitor",
72    "little matchgirl",     "ceremonial penguin",   "femme fatale",
73    "bosses' daughter",     "construction worker",  "sausage abuser",
74    "secretary",            "Congressman's page",   "grandmother",
75    "penguin",              "German shepherd",      "stewardess",
76    "waitress",             "prostitute",           "computer science group",
77    "housewife",
78 };
79 
80 static const char     *asthe[] = {
81         "as the",
82 };
83 
84 static const char     *madjec[] = {
85    "thrashing",            "slurping",             "insatiable",
86    "rabid",                "satanic",              "corpulent",
87    "nose-grooming",        "tripe-fondling",       "dribbling",
88    "spread-eagled",        "orally fixated",       "vile",
89    "awesomely endowed",    "handsome",             "mush-brained",
90    "tremendously hung",    "three-legged",         "pile-driving",
91    "cross-dressing",       "gerbil buggering",     "bung-hole stuffing",
92    "sphincter licking",    "hair-pie chewing",     "muff-diving",
93    "clam shucking",        "egg-sucking",          "bicycle seat sniffing",
94 };
95 
96 static const char     *male[] = {
97    "rakehell",             "hunchback",            "lecherous lickspittle",
98    "archduke",             "midget",               "hired hand",
99    "great Dane",           "stallion",             "donkey",
100    "electric eel",         "paraplegic pothead",   "dirty old man",
101    "faggot butler",        "friar",                "black-power advocate",
102    "follicle fetishist",   "handsome priest",      "chicken flicker",
103    "homosexual flamingo",  "ex-celibate",          "drug sucker",
104    "ex-woman",             "construction worker",  "hair dresser",
105    "dentist",              "judge",                "social worker",
106 };
107 
108 static const char     *diddled[] = {
109    "diddled",              "devoured",             "fondled",
110    "mouthed",              "tongued",              "lashed",
111    "tweaked",              "violated",             "defiled",
112    "irrigated",            "penetrated",           "ravished",
113    "hammered",             "bit",                  "tongue slashed",
114    "sucked",               "fucked",               "rubbed",
115    "grudge fucked",        "masturbated with",     "slurped",
116 };
117 
118 static const char *her[] = {
119         "her",
120 };
121 
122 static const char     *titadj[] = {
123         "alabaster",            "pink-tipped",          "creamy",
124         "rosebud",              "moist",                "throbbing",
125         "juicy",                "heaving",              "straining",
126         "mammoth",              "succulent",            "quivering",
127         "rosey",                "globular",             "varicose",
128         "jiggling",             "bloody",               "tilted",
129         "dribbling",            "oozing",               "firm",
130         "pendulous",            "muscular",             "bovine",
131 };
132 
133 static const char     *knockers[] = {
134         "globes",               "melons",               "mounds",
135         "buds",                 "paps",                 "chubbies",
136         "protuberances",        "treasures",            "buns",
137         "bung",                 "vestibule",            "armpits",
138         "tits",                 "knockers",             "elbows",
139         "eyes",                 "hooters",              "jugs",
140         "lungs",                "headlights",           "disk drives",
141         "bumpers",              "knees",                "fried eggs",
142         "buttocks",             "charlies",             "ear lobes",
143         "bazooms",              "mammaries",
144 };
145 
146 static const char *_and[] = {
147         "and",
148 };
149 
150 static const char     *thrust[] = {
151         "plunged",              "thrust",               "squeezed",
152         "pounded",              "drove",                "eased",
153         "slid",                 "hammered",             "squished",
154         "crammed",              "slammed",              "reamed",
155         "rammed",               "dipped",               "inserted",
156         "plugged",              "augured",              "pushed",
157         "ripped",               "forced",               "wrenched",
158 };
159 
160 static const char     *his[] = {
161         "his",
162 };
163 
164 static const char     *dongadj[] = {
165         "bursting",             "jutting",              "glistening",
166         "Brobdingnagian",       "prodigious",           "purple",
167         "searing",              "swollen",              "rigid",
168         "rampaging",            "warty",                "steaming",
169         "gorged",               "trunklike",            "foaming",
170         "spouting",             "swinish",              "prosthetic",
171         "blue veined",          "engorged",             "horse like",
172         "throbbing",            "humongous",            "hole splitting",
173         "serpentine",           "curved",               "steel encased",
174         "glass encrusted",      "knobby",               "surgically altered",
175         "metal tipped",         "open sored",           "rapidly dwindling",
176         "swelling",             "miniscule",            "boney",
177 };
178 
179 static const char     *dong[] = {
180    "intruder",             "prong",                "stump",
181    "member",               "meat loaf",            "majesty",
182    "bowsprit",             "earthmover",           "jackhammer",
183    "ramrod",               "cod",                  "jabber",
184    "gusher",               "poker",                "engine",
185    "brownie",              "joy stick",            "plunger",
186    "piston",               "tool",                 "manhood",
187    "lollipop",             "kidney prodder",       "candlestick",
188    "John Thomas",          "arm",                  "testicles",
189    "balls",                "finger",               "foot",
190    "tongue",               "dick",                 "one-eyed wonder worm",
191    "canyon yodeler",       "middle leg",           "neck wrapper",
192    "stick shift",          "dong",                 "Linda Lovelace choker",
193 };
194 
195 static const char     *intoher[] = {
196         "into her",
197 };
198 
199 static const char     *twatadj[] = {
200         "pulsing",              "hungry",               "hymeneal",
201         "palpitating",          "gaping",               "slavering",
202         "welcoming",            "glutted",              "gobbling",
203         "cobwebby",             "ravenous",             "slurping",
204         "glistening",           "dripping",             "scabiferous",
205         "porous",               "soft-spoken",          "pink",
206         "dusty",                "tight",                "odiferous",
207         "moist",                "loose",                "scarred",
208         "weapon-less",          "banana stuffed",       "tire tracked",
209         "mouse nibbled",        "tightly tensed",       "oft traveled",
210         "grateful",             "festering",
211 };
212 
213 static const char     *twat[] = {
214         "swamp.",               "honeypot.",            "jam jar.",
215         "butterbox.",           "furburger.",           "cherry pie.",
216         "cush.",                "slot.",                "slit.",
217         "cockpit.",             "damp.",                "furrow.",
218         "sanctum sanctorum.",   "bearded clam.",        "continental divide.",
219         "paradise valley.",     "red river valley.",    "slot machine.",
220         "quim.",                "palace.",              "ass.",
221         "rose bud.",            "throat.",              "eye socket.",
222         "tenderness.",          "inner ear.",           "orifice.",
223         "appendix scar.",       "wound.",               "navel.",
224         "mouth.",               "nose.",                "cunt.",
225 };
226 
227 struct Table {
228         const char    **item;
229         short         len;
230 };
231 
232 #define SZ(a)           sizeof(a) / sizeof(char *)
233 
234 static Table   list[] = {
235         {faster,         SZ(faster)},     {said,           SZ(said)},
236         {the,            SZ(the)},        {fadj,           SZ(fadj)},
237         {female,         SZ(female)},     {asthe,          SZ(asthe)},
238         {madjec,         SZ(madjec)},     {male,           SZ(male)},
239         {diddled,        SZ(diddled)},    {her,            SZ(her)},
240         {titadj,         SZ(titadj)},     {knockers,       SZ(knockers)},
241         {_and,           SZ(_and)},        {thrust,         SZ(thrust)},
242         {his,            SZ(his)},        {dongadj,        SZ(dongadj)},
243         {dong,           SZ(dong)},       {intoher,        SZ(intoher)},
244         {twatadj,        SZ(twatadj)},    {twat,           SZ(twat)},
245         {(const char **)NULL,  0},
246 };
247 
sex(short wraplen)248 std::string sex(short wraplen) {
249 	Table  *ttp;
250 	const char *cp;
251 	std::string buffer;
252 	int pos = 0, lastword = 0;
253 	short lwidth = 0;
254 
255 	for (ttp = list;ttp->item;++ttp,++lwidth) {
256        for (cp = ttp->len > 1 ? ttp->item[GetRandomInt(ttp->len-1)] : *ttp->item; *cp; ++cp,++lwidth) {
257 			buffer += *cp;
258 			if ((wraplen > 0) && (lwidth >= wraplen)) {
259 				buffer[lastword] = '\n';
260 				lwidth = pos - lastword;
261 			}
262 			if (isspace(*cp)) {
263 				lastword = pos;
264 			}
265 			pos++;
266       }
267       buffer += ' ';
268       lastword = pos++;
269    }
270 
271    return buffer;
272 }
273