#include <type.h> varargs string *compose_message( object who, string msg, object target, mixed *objs) { string *words; string us; string them; string others; int punc; int i; int objnum; words = explode( msg, " " ); us = ""; them = ""; others = ""; for( i = 0; i < sizeof( words ); i++ ) { if( words[i] == "" ) continue; if( words[i][0] == '$' && strlen( words[i] ) >=2 ) { if( words[i][strlen(words[i])-1] == '.' || words[i][strlen(words[i])-1] == ',' || words[i][strlen(words[i])-1] == '!' || words[i][strlen(words[i])-1] == '?' ) { punc = words[i][strlen(words[i])-1]; words[i] = words[i][..strlen(words[i])-2]; } else { punc = 0; } switch( words[i][1] ) { case 'N': if( who->is_living() ) { if( who->query_proper_name() == 0 ) { us += "you "; them += "the " + who->query_id() + " "; others += "the " + who->query_id() + " "; } else { us += "you "; them += who->query_proper_name() + " "; others += who->query_proper_name() + " "; } } else { us += "you "; them += "the " + who->query_id() + " "; others += "the " + who->query_id() + " "; } break; case 'n': us += "you "; them += who->query_gender_pronoun() + " "; others += who->query_gender_pronoun() + " "; break; case 'p': us += "your "; them += who->query_gender_possessive() + " "; others += who->query_gender_possessive() + " "; break; case 'v': if( strlen( words[i] ) < 3 ) break; us += words[i][2..] + " "; if( words[i][2..] == "are" ) { them += "is "; others += "is "; } else if( words[i][2..] == "say:" ) { them += "says: "; others += "says: "; } else if( words[i][2..] == "ask:" ) { them += "asks: "; others += "asks: "; } else if( words[i][2..] == "remark:" ) { them += "remarks: "; others += "remarks: "; } else if( words[i][2..] == "mumble:" ) { them += "mumble: "; others += "mumble: "; } else if( words[i][2..] == "shout:" ) { them += "shouts: "; others += "shouts: "; } else if( words[i][2..] == "ponder:" ) { them += "ponders: "; others += "ponders: "; } else if( words[i][2..] == "whisper:" ) { them += "whispers: "; others += "whispers: "; } else if( words[i][2..] == "exclaim:" ) { them += "exclaims: "; others += "exclaims: "; } else if( words[i][2..] == "mutter:" ) { them += "mutters: "; others += "mutters: "; } else if( words[i][2..] == "say" ) { them += "says "; others += "says "; } else if( words[i][strlen(words[i])-1] == 'o' ) { them += words[i][2..] + "es "; others += words[i][2..] + "es "; } else if( words[i][strlen(words[i])-1] == 'h' && words[i][strlen(words[i])-2] != 'g' ) { them += words[i][2..] + "es "; others += words[i][2..] + "es "; } else if( words[i][strlen(words[i])-1] == 'y' ) { them += words[i][2..strlen(words[i])-2] + "ies "; others += words[i][2..strlen(words[i])-2] + "ies "; } else if( words[i][strlen(words[i])-1] == 's' ) { them += words[i][2..] + "es "; others += words[i][2..] + "es "; } else { them += words[i][2..] + "s "; others += words[i][2..] + "s "; } break; case 'T': if( who == target ) { /* Doing something to ourselves. */ us += "yourself "; them += who->query_gender_reflexive() + " "; others += who->query_gender_reflexive() + " "; } else { if( target->is_living() ) { if( target->query_proper_name() == 0 ) { us += "the " + target->query_id() + " "; them += "you "; others += "the " + target->query_id() + " "; } else { us += target->query_proper_name() + " "; them += "you "; others += target->query_proper_name() + " "; } } else { us += "the " + target->query_id() + " "; them += "you " + target->query_id() + " "; others += "the " + target->query_id() + " "; } } break; case 't': if( who == target ) { /* Doing something to ourselves. */ us += "yourself "; them += who->query_gender_reflexive() + " "; others += who->query_gender_reflexive() + " "; } else { if( target->is_living() ) { if( target->query_proper_name() == 0 ) { us += "the " + target->query_id() + " "; them += "you "; others += "the " + target->query_id() + " "; } else { us += target->query_proper_name() + " "; them += "you "; others += target->query_proper_name() + " "; } } else { us += "the " + target->query_id() + " "; them += "you " + target->query_id() + " "; others += "the " + target->query_id() + " "; } } break; case 'o': if( strlen( words[i] ) > 2 && words[i][2] >= '0' && words[i][2] <= '9' ) { objnum = words[i][2] - '0'; } else { objnum = 0; } if( objs == 0 || objs[objnum] == 0 ) break; if( typeof( objs[objnum] ) == T_STRING ) { us += objs[objnum] + " "; them += objs[objnum] + " "; others += objs[objnum] + " "; } else { us += "the " + objs[objnum]->query_id() + " "; them += "the " + objs[objnum]->query_id() + " "; others += "the " + objs[objnum]->query_id() + " "; } break; } if( punc != 0 ) { us[strlen(us)-1] = punc; them[strlen(them)-1] = punc; others[strlen(others)-1] = punc; us += " "; them += " "; others += " "; } } else { us += words[i] + " "; them += words[i] + " "; others += words[i] + " "; } } if( us[strlen(us)-1] == ' ' ) { /* We need to strip the final space. */ us = us[..strlen(us)-2]; them = them[..strlen(them)-2]; others = others[..strlen(others)-2]; } return( ({ us, them, others }) ); } varargs void simple_action( string msg, mixed objs...) { string *result; result = compose_message( this_player(), msg, 0, objs ); this_environment()->tell_room( this_object(), result[2] ); write( capitalize( result[0] ) ); } varargs targetted_action( string msg, object target, mixed objs...) { string *result; result = compose_message( this_player(), msg, target, objs ); this_environment()->tell_room( this_player(), result[2], target ); this_object()->message( capitalize( result[0] ) ); if( target != 0 && target->is_living() && target != this_player() ) { target->message( capitalize( result[1] ) ); target->outside_message( capitalize( result[1] ) ); } } varargs other_action( object who, string msg, object target, mixed objs...) { string *result; result = compose_message( who, msg, target, objs ); if( this_object()->query_environment() == 0 ) return; this_object()->query_environment()->tell_room( who, result[2], target ); /* who->write( capitalize( result[0] ) ); */ if( target != 0 && target->is_living() && target != who ) { target->message( capitalize( result[1] ) ); } }