! --------------[ Inform Shakespearean Insult Generator v1.0]----------------
! Possibly the most gratiutiously vulgar, flatulent use of Inform yet devised!
! ---------------------------------------------------------------------------
! This routine is based roughly on a "shakespearean insult" scheme posted on
! usenet created by Jerry McGuire (a high school English teacher, no less).
! There are several WWW pages that feature the use of this "algorithm"....
! ---------------------------------------------------------------------------
! Warning: Extremely sloppy code follows! I have to admit, i scarcely have
! any idea what I'm doing. I coded this in Pascal first, and then, largely
! by a semi-painful process of trial and error, transmogrified it into Inform
! code that actually works! It is of course a very silly thing, but perhaps
! some my find it more amusing (for a few minutes) than sawing at their wrists
! with saftey razors that they have frantically and desperately smashed free
! with their shaving mirror.... um... Anyone that has far too little content
! in their Inform adventures, and is looking for more totally vacuous filler
! material, is free to use any of this code they can manage to steal....
! ---------------------------------------------------------------------------
! You'll probably need to use $BUFFER_LENGTH=3000 on commmandline to compile.
! --------------------[ Tim Middleton [email protected] ]--------------------

Switches dsv5x;
Constant DEBUG;

Constant Story "Shakespearean Insult-o-Rondez-Vous-with-Rama^";
Constant Headline "^";

Include "Parser";

Object LibraryMessages "lm"                      ! patch library messages...
     with
       before
       [; Prompt: sh_insult("^What now, ", "> "); rtrue;
       ];

Include "VerbLib";

Global Sh_Ads table "artless" "base-court"       ! table of insult adjectives
             "bawdy"         "bat-fowling"
             "beslubbering"  "beef-witted"      ! number of entries is read
             "bootless"      "beetle-headed"    ! from sh_ads-->0
             "churlish"      "boil-brained"
             "cockered"      "clapper-clawed"
             "clouted"       "clay-brained"
             "craven"        "common-kissing"
             "currish"       "crook-pated"
             "dankish"       "dismal-dreaming"
             "dissembling"   "dizzy-eyed"
             "droning"       "doghearted"
             "errant"        "dread-bolted"
             "fawning"       "earth-vexing"
             "fobbing"       "elf-skinned"
             "froward"       "fat-kidneyed"
             "frothy"        "fen-sucked"
             "gleeking"      "flap-mouthed"
             "goatish"       "fly-bitten"
             "gorbellied"    "folly-fallen"
             "impertinent"   "fool-born"
             "infectious"    "full-gorged"
             "jarring"       "guts-griping"
             "loggerheaded"  "half-faced"
             "lumpish"       "hasty-witted"
             "mammering"     "hedge-born"
             "mangled"       "hell-hated"
             "mewling"       "idle-headed"
             "paunchy"       "ill-breeding"
             "pribbling"     "ill-nurtured"
             "puking"        "knotty-pated"
             "puny"          "milk-livered"
             "quailing"      "motley-minded"
             "rank"          "onion-eyed"
             "reeky"         "plume-plucked"
             "roguish"       "pottle-deep"
             "ruttish"       "pox-marked"
             "saucy"         "reeling-ripe"
             "spleeny"       "rough-hewn"
             "spongy"        "rude-growing"
             "surly"         "rump-fed"
             "tottering"     "shard-borne"
             "unmuzzled"     "sheep-biting"
             "vain"          "spur-galled"
             "venomed"       "swag-bellied"
             "villainous"    "tardy-gaited"
             "warped"        "tickle-brained"
             "wayward"       "toad-spotted"
             "weedy"         "unchin-snouted"
             "yeasty"        "weather-bitten";

Global Sh_Nms table                              ! table of insult names
              "apple-john"
              "baggage"
              "barnacle"
              "bladder"
              "boar-pig"
              "bugbear"
              "bum-bailey"
              "canker-blossom"
              "clack-dish"
              "clotpole"
              "coxcomb"
              "codpiece"
              "death-token"
              "dewberry"
              "flap-dragon"
              "flax-wench"
              "flirt-gill"
              "foot-licker"
              "fustilarian"
              "giglet"
              "gudgeon"
              "haggard"
              "harpy"
              "hedge-pig"
              "horn-beast"
              "hugger-mugger"
              "jolthead"
              "lewdster"
              "lout"
              "maggot-pie"
              "malt-worm"
              "mammet"
              "measle"
              "minnow"
              "miscreant"
              "moldwarp"
              "mumble-news"
              "nut-hook"
              "pigeon-egg"
              "pignut"
              "puttock"
              "pumpion"
              "ratsbane"
              "scut"
              "skainsmate"
              "strumpet"
              "varlot"
              "vassal"
              "whey-face"
              "wagtail";

Global sh_ar -> 0 0 0;                           ! temp array to hold adjs.
                                                ! note: *3* maximum.
object Room "A Room"                             ! A room to be insulted in.
   with
   description "Not much here...",              ! Doesn't take much to be
   has light;                                   ! insulted. (-:
nearby Chair "chair"                             ! better sit down for this.
   with
   name "chair" "seat" "throne",
   description "Looks sittable!",
   has supporter;                               ! or can be thrown around...

[ sh_dupe_chk an l ret;                          ! filter duplicate insults.
ret=random(sh_ads-->0);                         ! random adjective to try.
if (an>0) {                                     ! more than one adj to check?
    for (l=0:l<an:l++) {                        ! loop though picked adjs.
        if (sh_ar ->l == ret) return -1;        ! duplicate found... exit.
    }
}
return ret;                                     ! no duplicate, return value.
];

[ sh_insult pre post an y c;                     ! generate insult.
c = random(3);                                  ! 1 to *3* adjectives.
for (an=0:an<c:an++) {                          ! loop to pick adjectives.
    do { y=sh_dupe_chk(an) } until (y>-1);      ! loop until adj unique.
    sh_ar ->an = y;                             ! add adj value to tmp array.
}
if (pre~=0) print (string) pre;                 ! address the victim!
for (an=0:an<c:an++) {                          ! loop through picked adjs.
    print (string) sh_ads-->(sh_ar->an), " ";   ! print adjectives, then
}                                               ! ....
y = random(sh_nms-->0);                         ! pick the vile sobriquet
print (string) sh_nms-->(y);                    ! and print it...
if (post~=0) print (string) post;               ! with post string, if any.
];

[ sh_insSub; sh_insult("Thou ", "!^"); ];        ! for the insult command...
                                                ! note the space, and ^....
[ Initialise;
Location = Room;                                ! here we are.
print "^^";
style bold;                                     ! bold colour print mode.
sh_insult("Wherefore art thou, thou ", "?!^");  ! A pet name for Romeo...?
style roman;                                    ! back to normal printing.
print "  --Romeo And Juliet, II.ii.35 (paraphrased)^^";
return 2;                                       ! Don't print game banner
];

Include "Grammar";

verb "insult" "ins" *      -> sh_ins;            ! make a quick insult cmd

! ************************************************************************
!  My humble apologies to all Shakespeare fans and admirers everywhere!!!
!  What would the Immortal Bard say if he could see this!? Shameful!! (-;
! ************************************************************************