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