dsIIr4/bin/
dsIIr4/extra/creremote/
dsIIr4/extra/wolfpaw/
dsIIr4/lib/cmds/admins/
dsIIr4/lib/cmds/common/
dsIIr4/lib/cmds/creators/include/
dsIIr4/lib/cmds/creators/include/SCCS/
dsIIr4/lib/daemon/services/
dsIIr4/lib/doc/
dsIIr4/lib/domains/Ylsrim/
dsIIr4/lib/domains/Ylsrim/adm/
dsIIr4/lib/domains/Ylsrim/armor/
dsIIr4/lib/domains/Ylsrim/broken/
dsIIr4/lib/domains/Ylsrim/fish/
dsIIr4/lib/domains/Ylsrim/meal/
dsIIr4/lib/domains/Ylsrim/npc/
dsIIr4/lib/domains/Ylsrim/virtual/
dsIIr4/lib/domains/Ylsrim/weapon/
dsIIr4/lib/domains/campus/adm/
dsIIr4/lib/domains/campus/etc/
dsIIr4/lib/domains/campus/meals/
dsIIr4/lib/domains/campus/npc/
dsIIr4/lib/domains/campus/save/
dsIIr4/lib/domains/campus/txt/
dsIIr4/lib/domains/campus/txt/ai/charles/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/
dsIIr4/lib/domains/campus/txt/ai/charles/bak2/bak1/
dsIIr4/lib/domains/campus/txt/ai/charly/
dsIIr4/lib/domains/campus/txt/ai/charly/bak/
dsIIr4/lib/domains/campus/txt/jenny/
dsIIr4/lib/domains/default/creator/
dsIIr4/lib/domains/default/doors/
dsIIr4/lib/domains/default/etc/
dsIIr4/lib/domains/default/virtual/
dsIIr4/lib/domains/default/weap/
dsIIr4/lib/domains/town/virtual/
dsIIr4/lib/lib/comp/
dsIIr4/lib/lib/lvs/
dsIIr4/lib/lib/user/
dsIIr4/lib/lib/virtual/
dsIIr4/lib/log/
dsIIr4/lib/obj/book_source/
dsIIr4/lib/obj/include/
dsIIr4/lib/realms/template/
dsIIr4/lib/realms/template/adm/
dsIIr4/lib/realms/template/area/armor/
dsIIr4/lib/realms/template/area/npc/
dsIIr4/lib/realms/template/area/obj/
dsIIr4/lib/realms/template/area/room/
dsIIr4/lib/realms/template/area/weap/
dsIIr4/lib/realms/template/bak/
dsIIr4/lib/realms/template/cmds/
dsIIr4/lib/save/
dsIIr4/lib/save/kills/o/
dsIIr4/lib/secure/cfg/classes/
dsIIr4/lib/secure/cmds/creators/include/
dsIIr4/lib/secure/cmds/players/
dsIIr4/lib/secure/cmds/players/include/
dsIIr4/lib/secure/daemon/include/
dsIIr4/lib/secure/lib/
dsIIr4/lib/secure/lib/include/
dsIIr4/lib/secure/lib/net/include/
dsIIr4/lib/secure/lib/std/
dsIIr4/lib/secure/modules/
dsIIr4/lib/secure/npc/
dsIIr4/lib/secure/obj/include/
dsIIr4/lib/secure/room/
dsIIr4/lib/secure/save/
dsIIr4/lib/secure/save/boards/
dsIIr4/lib/secure/save/players/g/
dsIIr4/lib/secure/tmp/
dsIIr4/lib/secure/verbs/creators/
dsIIr4/lib/shadows/
dsIIr4/lib/spells/
dsIIr4/lib/std/board/
dsIIr4/lib/std/lib/
dsIIr4/lib/tmp/
dsIIr4/lib/verbs/admins/include/
dsIIr4/lib/verbs/common/
dsIIr4/lib/verbs/common/include/
dsIIr4/lib/verbs/creators/include/
dsIIr4/lib/verbs/players/include/SCCS/
dsIIr4/lib/verbs/rooms/
dsIIr4/lib/verbs/rooms/include/
dsIIr4/lib/www/
dsIIr4/v22.2b14-dsouls2/
dsIIr4/v22.2b14-dsouls2/ChangeLog.old/
dsIIr4/v22.2b14-dsouls2/Win32/
dsIIr4/v22.2b14-dsouls2/compat/
dsIIr4/v22.2b14-dsouls2/compat/simuls/
dsIIr4/v22.2b14-dsouls2/include/
dsIIr4/v22.2b14-dsouls2/mudlib/
dsIIr4/v22.2b14-dsouls2/testsuite/
dsIIr4/v22.2b14-dsouls2/testsuite/clone/
dsIIr4/v22.2b14-dsouls2/testsuite/command/
dsIIr4/v22.2b14-dsouls2/testsuite/data/
dsIIr4/v22.2b14-dsouls2/testsuite/etc/
dsIIr4/v22.2b14-dsouls2/testsuite/include/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/
dsIIr4/v22.2b14-dsouls2/testsuite/inherit/master/
dsIIr4/v22.2b14-dsouls2/testsuite/log/
dsIIr4/v22.2b14-dsouls2/testsuite/single/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/compiler/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/efuns/
dsIIr4/v22.2b14-dsouls2/testsuite/single/tests/operators/
dsIIr4/v22.2b14-dsouls2/testsuite/u/
dsIIr4/v22.2b14-dsouls2/tmp/
dsIIr4/win32/
/*    /cmds/player/title.c
 *    from the Dead Souls LPC Library
 *    allows someone to set their titles
 *    created by Descartes of Borg 950716
 */

#include <lib.h>
#include <daemons.h>

inherit LIB_DAEMON;

static void eventOrderTitles(string *titles, int maxi);
static void GetTitle(string which, string *titles, int maxi);
static void GetDest(string which, string *titles, int i, int maxi);

mixed cmd(string args) {
    string *titles;
    int maxi;

    if( creatorp(this_player()) || avatarp(this_player()) ) {
	if( !args || args == "" ) return "Change your title to what?";
	else args = (string)this_player()->SetShort(args);
	message("system", "Title changed to: " + args, this_player());
	this_player()->save_player((string)this_player()->GetKeyName());
	update("/secure/daemon/finger");
	return 1;
    }
    if( !(maxi = sizeof(titles = (string *)this_player()->GetTitles())) ) 
	return "You are totally unaccomplished.";
    if( args == "1" || args == "2" ) {
	this_player()->SetTitleLength(to_int(args));
	this_player()->SetShort("foo");
	this_player()->eventPrint("Number of titles in your descriptions changed to " + args + ".");
	this_player()->save_player((string)this_player()->GetKeyName());
	update("/secure/daemon/finger");
	return 1;
    }
    if( maxi == 1 ) {
	message("system", "You have only one title: " + titles[0], 
	  this_player());
	return 1;
    }
    else if( maxi == 2 ) {
	function f;

	f = function(string yn, string *titles) {
	    yn = (yn || "n");
	    if( yn != "y" ) {
		message("system", "Titles remain unchanged.", this_player());
		return;
	    }
	    this_player()->SetTitles( ({ titles[1], titles[0] }) );
	    message("system", "Titles reversed.", this_player());
	    this_player()->save_player((string)this_player()->GetKeyName());
	    update("/secure/daemon/finger");
	};
	message("system", "You have the following titles:\n\t" +
	  titles[0] + "\n\t" + titles[1], this_player());
	message("prompt", "Do you wish to reverse them? [n] ", this_player());
	input_to(f, titles);
	return 1;
    }
    else eventOrderTitles(titles, maxi);
    return 1;
}

static void eventOrderTitles(string *titles, int maxi) {
    int i;

    message("system", "You have the following titles:", this_player());
    for(i=0; i<maxi; i++)
	message("system", "\t" + (i+1) + " " + titles[i], this_player());
    message("prompt", "Move which (q to quit)? [" + (maxi) + "] ", 
      this_player());
    input_to((: GetTitle :), titles, maxi);
}

static void GetTitle(string which, string *titles, int maxi) {
    int x;

    if( which == "q" ) {
	this_player()->SetTitles(titles);
	message("system", "Done.", this_player());
	return;
    }
    else if( which == "" || !which ) which = "" + maxi;
    x = to_int(which);
    if( x < 1 || x > maxi ) {
	message("system", "Illegal title number.", this_player());
	eventOrderTitles(titles, maxi);
	return;
    }
    x--;
    message("prompt", "Move \"" + titles[x] + "\" to position? [1] ",
      this_player());
    input_to( (: GetDest :), titles, x, maxi );
}

static void GetDest(string which, string *titles, int i, int maxi) {
    string *tmp;
    int j, maxj, x;

    if( which == "q" ) {
	this_player()->SetTitles(titles);
	message("system", "Done.", this_player());
	this_player()->save_player((string)this_player()->GetKeyName());
	update("/secure/daemon/finger");
	return;
    }
    else if( which == "" || !which ) which = "1";
    x = to_int(which);
    if( x < 1 || x > maxi || x == i+1 ) {
	message("system", "Illegal title number.", this_player());
	eventOrderTitles(titles, maxi);
	return;
    }
    x--;
    tmp = allocate(maxj = sizeof(titles));
    for(j=0; j<maxj; j++) {
	if( j == x ) tmp[j] = titles[i];
	else if( (j < x && j < i) || (j > x && j > i) ) tmp[j] = titles[j];
	else if( j > x && j <= i ) tmp[j] = titles[j-1];
	else tmp[j] = titles[j+1];
    }
    eventOrderTitles(tmp, maxi);
}

void help() {
    if( creatorp(this_player()) ) {
	message("help", "Syntax: <title [title]>\n\n"
	  "Allows you to change your title.  You must include the "
	  "token $N in your title, which will be replaced with your "
	  "name as appropriate.  For example:\n"
	  "\ttitle We are $N of Borg\n"
	  "would make my short appear as:\n"
	  "\tWe are Descartes of Borg.\n\n", this_player());
    }
    else {
	message("help", "Syntax: <title>\n\n"
	  "Allows you to reorder your titles.  Your first two titles "
	  "appear in your short description.  This command is "
	  "interactive, meaning it prompts you for what to do.  "
	  "hit 'q' at any point to save your changes and exit out of "
	  "this command.\nYou can also type (title 1) or (title 2) "
	  "to change how many titles appear in your description.",
	  this_player() );
    }
}