mud/lib/cmds/players/title.c
2020-09-06 05:43:07 -07:00

149 lines
5.1 KiB
C

/* /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 = this_player()->SetShort(args);
message("system", "Title changed to: " + args, this_player());
this_player()->save_player(this_player()->GetKeyName());
update("/secure/daemon/finger");
return 1;
}
if( !(maxi = sizeof(titles = 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(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(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(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);
}
string GetHelp() {
if( creatorp(this_player()) ) {
return ("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.");
}
else {
return ("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.");
}
}