dsI/bin/
dsI/extra/creremote/
dsI/extra/mingw/
dsI/extra/wolfpaw/
dsI/fluffos-2.7-ds2.018/
dsI/fluffos-2.7-ds2.018/ChangeLog.old/
dsI/fluffos-2.7-ds2.018/Win32/
dsI/fluffos-2.7-ds2.018/compat/
dsI/fluffos-2.7-ds2.018/compat/simuls/
dsI/fluffos-2.7-ds2.018/testsuite/
dsI/fluffos-2.7-ds2.018/testsuite/clone/
dsI/fluffos-2.7-ds2.018/testsuite/command/
dsI/fluffos-2.7-ds2.018/testsuite/data/
dsI/fluffos-2.7-ds2.018/testsuite/etc/
dsI/fluffos-2.7-ds2.018/testsuite/include/
dsI/fluffos-2.7-ds2.018/testsuite/inherit/
dsI/fluffos-2.7-ds2.018/testsuite/inherit/master/
dsI/fluffos-2.7-ds2.018/testsuite/log/
dsI/fluffos-2.7-ds2.018/testsuite/single/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
dsI/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
dsI/fluffos-2.7-ds2.018/testsuite/u/
dsI/fluffos-2.7-ds2.018/tmp/
dsI/lib/cfg/
dsI/lib/cmds/common/
dsI/lib/cmds/creators/include/
dsI/lib/cmds/creators/include/SCCS/
dsI/lib/daemon/services/
dsI/lib/doc/
dsI/lib/domains/Ylsrim/
dsI/lib/domains/Ylsrim/adm/
dsI/lib/domains/Ylsrim/armour/
dsI/lib/domains/Ylsrim/broken/
dsI/lib/domains/Ylsrim/fish/
dsI/lib/domains/Ylsrim/meal/
dsI/lib/domains/Ylsrim/npc/
dsI/lib/domains/Ylsrim/virtual/
dsI/lib/domains/Ylsrim/weapon/
dsI/lib/domains/default/creator/
dsI/lib/domains/default/etc/
dsI/lib/domains/default/room/
dsI/lib/lib/comp/
dsI/lib/lib/lvs/
dsI/lib/lib/user/
dsI/lib/lib/virtual/
dsI/lib/obj/
dsI/lib/obj/include/
dsI/lib/realms/
dsI/lib/save/kills/a/
dsI/lib/save/kills/b/
dsI/lib/save/kills/f/
dsI/lib/save/kills/m/
dsI/lib/save/kills/q/
dsI/lib/save/kills/r/
dsI/lib/secure/cfg/
dsI/lib/secure/cfg/classes/
dsI/lib/secure/cfg/races/SCCS/
dsI/lib/secure/cmds/creators/include/
dsI/lib/secure/cmds/players/
dsI/lib/secure/cmds/players/include/
dsI/lib/secure/daemon/include/
dsI/lib/secure/lib/
dsI/lib/secure/lib/include/
dsI/lib/secure/lib/net/
dsI/lib/secure/lib/net/include/
dsI/lib/secure/lib/std/
dsI/lib/secure/obj/
dsI/lib/secure/obj/include/
dsI/lib/secure/save/
dsI/lib/spells/
dsI/lib/verbs/admins/include/
dsI/lib/verbs/common/
dsI/lib/verbs/common/include/
dsI/lib/verbs/creators/
dsI/lib/verbs/creators/include/
dsI/lib/verbs/players/include/SCCS/
dsI/lib/verbs/rooms/
dsI/lib/verbs/rooms/include/
dsI/lib/www/
dsI/v22.2b14/
dsI/win32/
/*    /secure/sefun/messaging.c
 *    From the Dead Souls V Object Library
 *    Messaging efuns, based on ideas shamelessly borrowed from Lima
 *    Created by Descartes of Borg 961029
 *    Version: @(#) messaging.c 1.10@(#)
 *    Last modified: 96/12/16
 */

#include <pov.h>

string create_message(int pov, string array verb, string message,
		      string subject, string subject_gen, string targets,
		      string target_gen, mapping special) {
    string array words = explode(message, " ");
    string array control = copy(words);
    int i, maxi = sizeof(words);
    int verb_count = 0;
    int c;
	
    switch(pov) {
    case POV_SUBJECT:
	for(i=0; i<maxi; i++) {
	    string punctuation = "";
	    
	    if( words[i] == "" ) {
		continue;
	    }
	    else if( words[i][0] == '\\' ) {
		if( strlen(words[i]) < 2 ) {
		    continue;
		}
		if( words[i][1] != '$' ) {
		    continue;
		}
		words[i] = words[i][1..];
		continue;
	    }
	    else if( words[i][0] != '$' ) {
		continue;
	    }
	    while( words[i] != "" ) { // break this or hang
		c = words[i][<1];
		if( c < 'a' || c > 'z' ) {
		    punctuation = words[i][<1..<1] + punctuation;
		    words[i] = words[i][0..<2];
		}
		else {
		    break;
		}
	    }
	    switch(words[i]) {
	    case "$agent_verb":
		words[i] = verb[verb_count++];
		break;
		
	    case "$agent_name": case "$agent_nominative":
	    case "$agent_objective":
		words[i] = "you";
		break;

	    case "$agent_possessive_noun":
		words[i] = "your";
		break;
		
	    case "$agent_possessive":
		words[i] = "your";
		break;

	    case "$agent_reflexive":
		words[i] = "yourself";
		break;

	    case "$target_verb":
		if( targets == subject ) {
		    words[i] = verb[verb_count];
		}
		else {
		    if( target_gen == "plural" ) {
			words[i] = verb[verb_count];
		    }
		    else {
			words[i] = pluralize(verb[verb_count]);
		    }
		}
		verb_count++;
		break;
		
	    case "$target_name":
		if( subject == targets ) { // subject? object?
		    if( i == 0 ) { // certainly subject
			words[i] = "you";
		    }
		    else if( i == sizeof(words)-1 ) { // probably object
			words[i] = "yourself";
		    }
		    else if( words[i+1] == "$target_verb" ) { // subject?
			words[i] = "you";
		    }
		    else if(member_array("$agent_verb",control[0..i]) != -1 ) {
			words[i] = "yourself"; // getting desperate here
		    }
		    else { // Oh hell
			words[i] = "you";
		    }
		}
		else {
		    words[i] = targets;
		}
		break;
	    
	    case "$target_nominative":
		if( subject == targets ) {
		    words[i] = "you";
		}
		else {
		    if( !target_gen ) {
			words[i] = targets;
		    }
		    else if( target_gen == "plural" ) {
			words[i] = "they";
		    }
		    else {
			words[i] = nominative(target_gen);
		    }
		}
		break;
		
	    case "$target_objective":
		if( subject == targets ) {
		    words[i] = "yourself";
		}
		else {
		    if( !target_gen ) {
			words[i] = targets;
		    }		    
		    else if( target_gen == "plural" ) {
			words[i] = "them";
		    }
		    else {
			words[i] = objective(target_gen);
		    }
		}
		break;
		
	    case "$target_possessive_noun":
		if( subject == targets ) {
		    words[i] = "your";
		}
		else {
		    if( !target_gen ) {
			words[i] = possessive_noun(targets);
		    }
		    else if( target_gen == "plural" ) {
			words[i] = "their";
		    }
		    else {
			words[i] = possessive_noun(targets);
		    }
		}
		break;
		
	    case "$target_possessive":
		if( subject == targets ) {
		    words[i] = "your";
		}
		else {
		    if( !target_gen ) {
			words[i] = possessive_noun(targets);
		    }
		    else if( target_gen == "plural" ) {
			words[i] = "their";
		    }
		    else {
			words[i] = possessive(target_gen);
		    }
		}
		break;
	       
	    case "$target_reflexive":
		if( subject == targets ) {
		    words[i] = "yourself";
		}
		else {
		    if( !target_gen ) {
			words[i] = targets;
		    }
		    else if( target_gen == "plural" ) {
			words[i] = "themselves";
		    }
		    else {
			words[i] = reflexive(target_gen);
		    }
		}
		break;
	    	
	    default:
		if( special[words[i]] ) {
		    words[i] = special[words[i]];
		}
	    }
	    words[i] = words[i] + punctuation;
	}
	return capitalize(implode(words, " "));

    case POV_TARGET:
	for(i=0; i<maxi; i++) {
	    string punctuation = "";
	    
	    if( words[i] == "" ) {
		continue;
	    }
	    else if( words[i][0] == '\\' ) {
		if( strlen(words[i]) < 2 ) {
		    continue;
		}
		if( words[i][1] != '$' ) {
		    continue;
		}
		words[i] = words[i][1..];
		continue;
	    }
	    else if( words[i][0] != '$' ) {
		continue;
	    }
	    while( words[i] != "" ) { // break this or hang
		c = words[i][<1];
		if( c < 'a' || c > 'z' ) {
		    punctuation = words[i][<1..<1] + punctuation;
		    words[i] = words[i][0..<2];
		}
		else {
		    break;
		}
	    }
	    switch(words[i]) {
	    case "$agent_verb":
		words[i] = pluralize(verb[verb_count++]);
		break;

	    case "$agent_name":
		words[i] = subject;
		break;

	    case "$agent_nominative":
		if( !subject_gen ) {
		    words[i] = subject;
		}
		else {
		    words[i] = nominative(subject_gen);
		}
		break;
		
	    case "$agent_objective":
		if( !subject_gen ) {
		    words[i] = subject;
		}
		else {
		    words[i] = objective(subject_gen);
		}
		break;

	    case "$agent_possessive_noun":
		words[i] = possessive_noun(subject);
		break;
		
	    case "$agent_possessive":
		if( !subject_gen ) {
		    words[i] = possessive_noun(subject);
		}
		else {
		    words[i] = possessive(subject_gen);
		}
		break;

	    case "$agent_reflexive":
		if( !subject_gen ) {
		    words[i] = subject;
		}
		else {
		    words[i] = reflexive(subject_gen);
		}
		break;

	    case "$target_verb":
		words[i] = verb[verb_count++];
		break;
		
	    case "$target_name": case "$target_nominative":
	    case "$target_objective":
		words[i] = "you";
		break;

	    case "$target_possessive_noun":
		words[i] = "your";
		break;
		
	    case "$target_possessive":
		words[i] = "your";
		break;

	    case "$target_reflexive":
		words[i] = "yourself";
		break;
		
	    default:
		if( special[words[i]] ) {
		    words[i] = special[words[i]];
		}
	    }
	    words[i] = words[i] + punctuation;
	}
	return capitalize(implode(words, " "));

    case POV_OBSERVER:
	for(i=0; i<maxi; i++) {
	    string punctuation = "";
	    
	    if( words[i] == "" ) {
		continue;
	    }
	    else if( words[i][0] == '\\' ) {
		if( strlen(words[i]) < 2 ) {
		    continue;
		}
		if( words[i][1] != '$' ) {
		    continue;
		}
		words[i] = words[i][1..];
		continue;
	    }
	    else if( words[i][0] != '$' ) {
		continue;
	    }
	    while( words[i] != "" ) { // break this or hang
		c = words[i][<1];
		if( c < 'a' || c > 'z' ) {
		    punctuation = words[i][<1..<1] + punctuation;
		    words[i] = words[i][0..<2];
		}
		else {
		    break;
		}
	    }
	    switch(words[i]) {
	    case "$agent_verb":
		words[i] = pluralize(verb[verb_count++]);
		break;
		
	    case "$agent_name":
		words[i] = subject;
		break;
		
	    case "$agent_nominative":
		if( !subject_gen ) {
		    words[i] = subject;
		}
		else {
		    words[i] = nominative(subject_gen);
		}
		break;
		
	    case "$agent_objective":
		if( !subject_gen ) {
		    words[i] = subject;
		}
		else {
		    words[i] = objective(subject_gen);
		}
		break;

	    case "$agent_possessive_noun":
		words[i] = possessive_noun(subject);
		break;
	    
	    case "$agent_possessive":
		if( !subject_gen ) {
		    words[i] = possessive_noun(subject);
		}
		else {
		    words[i] = possessive(subject_gen);
		}
		break;

	    case "$agent_reflexive":
		if( !subject_gen ) {
		    words[i] = subject;
		}
		else {
		    words[i] = reflexive(subject_gen);
		}
		break;

	    case "$target_verb":
		if( target_gen != "plural" ) {
		    words[i] = pluralize(verb[verb_count]);
		}
		else {
		    words[i] = verb[verb_count];
		}
		verb_count++;
		break;
		
	    case "$target_name": 
		words[i] = targets;
		break;

	    case "$target_nominative":
		if( !target_gen ) {
		    words[i] = targets;
		}
		else if( target_gen == "plural" ) {
		    words[i] = "they";
		}
		else {
		    words[i] = nominative(target_gen);
		}
		break;

	    case "$target_objective":
		if( !target_gen ) {
		    words[i] = targets;
		}
		else if( target_gen == "plural" ) {
		    words[i] = "them";
		}
		else {
		    words[i] = objective(target_gen);
		}
		break;

	    case "$target_possessive_noun":
		if( !target_gen ) {
		    words[i] = possessive_noun(targets);
		}
		else if( target_gen == "plural" ) {
		    words[i] = "their";
		}
		else {
		    words[i] = possessive_noun(targets);
		}
		break;
	    
	    case "$target_possessive":
		if( !target_gen ) {
		    words[i] = possessive_noun(targets);
		}
		else if( target_gen == "plural" ) {
		    words[i] = "their";
		}
		else {
		    words[i] = possessive(target_gen);
		}
		break;

	    case "$target_reflexive":
		if( !target_gen ) {
		    words[i] = targets;
		}
		else if( target_gen == "plural" ) {
		    words[i] = "themselves";
		}
		else {
		    words[i] = reflexive(target_gen);
		}
		break;

	    default:
		if( special[words[i]] ) {
		    words[i] = special[words[i]];
		}
	    }
	    words[i] = words[i] + punctuation;
	}
	return capitalize(implode(words, " "));

    default:
	error("Unknown POV type: " + pov + "\n");
    }
}

void send_messages(mixed verb, string message, object subject, mixed targets,
		   mixed observers, mapping special) {
    string sname = subject->GetName();
    string sgen = (subject->GetGender() || "neuter");
    string tname, tgen;
    
    if( arrayp(targets) ) {
	if( !sizeof(targets) ) {
	    tname = tgen = 0;
	}
	else if( sizeof(targets) == 1 ) {
	    if( living(targets[0]) ) {
		tname = targets[0]->GetName();
		tgen = (targets[0]->GetGender() || "neuter");
	    }
	    else {
		tname = targets[0]->GetShort();
		tgen = "neuter";
	    }
	    targets = targets[0];
	}
	else {
	    if( member_array(subject, targets) != -1 ) {
		targets -= ({ subject });
		if( sizeof(targets) == 1 ) {
		    if( living(targets[0]) ) {
			tname = targets[0]->GetName();
			tgen = (targets[0]->GetGender() || "neuter");
		    }
		    else {
			tname = targets[0]->GetShort();
			tgen = "neuter";
		    }
		    targets = targets[0];
		}
		else {
		    tname = item_list(targets);
		    tgen = "plural";
		}
	    }
	}
    }
    else if( objectp(targets) ) {
	if( living(targets) ) {
	    tname = targets->GetName();
	    tgen = (targets->GetGender() || "neuter");
	}
	else {
	    tname = targets->GetShort();
	    tgen = "neuter";
	}
    }
    else {
	tname = 0;
	tgen = 0;
    }
    if( stringp(verb) ) {
	verb = ({ verb });
    }
    if( subject ) {
	string str = create_message(POV_SUBJECT, verb, message, sname, sgen,
				    tname, tgen, special);
	
	subject->eventPrint(str);
    }
    if( targets && targets != subject ) {
	string str = create_message(POV_TARGET, verb, message, sname, sgen,
				    tname, tgen, special);

	targets->eventPrint(str);
    }
    if( observers ) {
	string str = create_message(POV_OBSERVER, verb, message, sname, sgen,
				    tname, tgen, special);
	object array exclude = ({});
	
	if( subject ) {
	    exclude = ({ subject });
	}
	if( objectp(targets) ) {
	    exclude = ({ exclude..., targets });
	}
	else if( arrayp(targets) ) {
	    exclude = ({ exclude..., targets... });
	}
	observers->eventPrint(str, exclude);
    }
}