/* Arf! March 1995, Chrisy
*/
string long() {
return "Arf! Try it and see...\n";
}
string prev_mess, prev_arf;
#define IS_CAPS(X) (X>='A' && X<='Z')
#define IS_LOWER(X) (X>='a' && X<='z')
#define IS_VOWEL(X) ([ 'A':2,'E':2,'I':2,'O':2,'U':2, \
'a':1,'e':1,'i':1,'o':1,'u':1, ])[X]
static int is_word_caps(string word)
{
int i, j;
i = strsrch(word, " ");
if(i==-1)
i = strlen(word);
for(j=0; j<i; j++)
if(!IS_CAPS(word[j]) && IS_LOWER(word[j]))
return 0;
return 1;
}
string do_arf(string start, string mess)
{
int i, j, k, l, cap;
string fix;
if(mess == prev_mess)
return prev_arf;
prev_mess = mess;
prev_arf = "";
l = 9999;
j = strlen(mess);
for(i=0; i<j; i++)
{
if(!i || (i && mess[i-1]==' '))
cap = is_word_caps(mess[i..j-1]);
k = IS_VOWEL(mess[i]);
if(i && k && mess[i-1] == mess[i]) k = 3;
if(mess[i..i+2] == "ing") {k = 4; i+=2;}
if(mess[i..i+2] == "igh") {k = 5; i+=2;}
if(mess[i..i+2] == "ugh") {k = 6; i+=2;}
if(mess[i..i+1] == "in") {k = 7; i+=1;}
if(mess[i..i+1] == "ou") {k = 8; i+=1;}
if(i&&k==1&& (['f':1,'s':1])[mess[i-1]]) k = 10;
switch(k)
{
case 0: fix = mess[i..i]; break;
case 1: fix = (k!=l?"ar":"er"); break;
case 2: fix = "Ar"; break;
case 3: fix = "r"; break;
case 4: fix = "in'"; break;
case 5: fix = "arr"; break;
case 6: fix = "ff"; break;
case 7: fix = "een"; break;
case 8: fix = "'s"; break;
case 10: fix = "'"; break;
default: fix = ""; break;
}
if(cap) prev_arf += upper_case(fix);
else prev_arf += fix;
l = k;
}
write("Recipients see: "+prev_arf+"\n");
return prev_arf;
}
mixed garble_tell(string start, string mess) {
return ({ start, do_arf(start, mess) });
}
mixed garble_shout(string start, string mess) {
return ({ start, do_arf(start, mess) });
}
mixed garble_say(string start, string mess) {
return ({ start, do_arf(start, mess) });
}