ds2.4.1/bin/
ds2.4.1/extra/creremote/
ds2.4.1/extra/wolfpaw/
ds2.4.1/lib/cmds/admins/
ds2.4.1/lib/cmds/common/
ds2.4.1/lib/cmds/creators/include/
ds2.4.1/lib/cmds/creators/include/SCCS/
ds2.4.1/lib/daemon/services/
ds2.4.1/lib/doc/
ds2.4.1/lib/doc/efun/all/
ds2.4.1/lib/doc/efun/arrays/
ds2.4.1/lib/doc/efun/buffers/
ds2.4.1/lib/doc/efun/compile/
ds2.4.1/lib/doc/efun/floats/
ds2.4.1/lib/doc/efun/functions/
ds2.4.1/lib/doc/efun/general/
ds2.4.1/lib/doc/efun/mixed/
ds2.4.1/lib/doc/efun/numbers/
ds2.4.1/lib/doc/efun/parsing/
ds2.4.1/lib/doc/faq/
ds2.4.1/lib/doc/hbook/
ds2.4.1/lib/doc/help/classes/
ds2.4.1/lib/doc/help/races/
ds2.4.1/lib/doc/lfun/
ds2.4.1/lib/doc/lfun/all/
ds2.4.1/lib/doc/lfun/lib/abilities/
ds2.4.1/lib/doc/lfun/lib/armor/
ds2.4.1/lib/doc/lfun/lib/bot/
ds2.4.1/lib/doc/lfun/lib/clay/
ds2.4.1/lib/doc/lfun/lib/clean/
ds2.4.1/lib/doc/lfun/lib/client/
ds2.4.1/lib/doc/lfun/lib/combat/
ds2.4.1/lib/doc/lfun/lib/connect/
ds2.4.1/lib/doc/lfun/lib/corpse/
ds2.4.1/lib/doc/lfun/lib/creator/
ds2.4.1/lib/doc/lfun/lib/daemon/
ds2.4.1/lib/doc/lfun/lib/damage/
ds2.4.1/lib/doc/lfun/lib/deterioration/
ds2.4.1/lib/doc/lfun/lib/donate/
ds2.4.1/lib/doc/lfun/lib/door/
ds2.4.1/lib/doc/lfun/lib/equip/
ds2.4.1/lib/doc/lfun/lib/file/
ds2.4.1/lib/doc/lfun/lib/fish/
ds2.4.1/lib/doc/lfun/lib/flashlight/
ds2.4.1/lib/doc/lfun/lib/follow/
ds2.4.1/lib/doc/lfun/lib/ftp_client/
ds2.4.1/lib/doc/lfun/lib/ftp_data_connection/
ds2.4.1/lib/doc/lfun/lib/fuel/
ds2.4.1/lib/doc/lfun/lib/genetics/
ds2.4.1/lib/doc/lfun/lib/id/
ds2.4.1/lib/doc/lfun/lib/interactive/
ds2.4.1/lib/doc/lfun/lib/lamp/
ds2.4.1/lib/doc/lfun/lib/leader/
ds2.4.1/lib/doc/lfun/lib/light/
ds2.4.1/lib/doc/lfun/lib/limb/
ds2.4.1/lib/doc/lfun/lib/living/
ds2.4.1/lib/doc/lfun/lib/look/
ds2.4.1/lib/doc/lfun/lib/manipulate/
ds2.4.1/lib/doc/lfun/lib/meal/
ds2.4.1/lib/doc/lfun/lib/messages/
ds2.4.1/lib/doc/lfun/lib/npc/
ds2.4.1/lib/doc/lfun/lib/player/
ds2.4.1/lib/doc/lfun/lib/poison/
ds2.4.1/lib/doc/lfun/lib/position/
ds2.4.1/lib/doc/lfun/lib/potion/
ds2.4.1/lib/doc/lfun/lib/room/
ds2.4.1/lib/doc/lfun/lib/server/
ds2.4.1/lib/doc/lfun/lib/spell/
ds2.4.1/lib/doc/lfun/lib/torch/
ds2.4.1/lib/doc/lfun/lib/vendor/
ds2.4.1/lib/doc/lfun/lib/virt_sky/
ds2.4.1/lib/doc/lfun/lib/weapon/
ds2.4.1/lib/doc/lfun/lib/worn_storage/
ds2.4.1/lib/doc/lpc/basic/
ds2.4.1/lib/doc/lpc/concepts/
ds2.4.1/lib/doc/lpc/constructs/
ds2.4.1/lib/doc/lpc/etc/
ds2.4.1/lib/doc/lpc/intermediate/
ds2.4.1/lib/doc/lpc/types/
ds2.4.1/lib/doc/misc/
ds2.4.1/lib/doc/old/
ds2.4.1/lib/domains/Praxis/adm/
ds2.4.1/lib/domains/Praxis/attic/
ds2.4.1/lib/domains/Praxis/cemetery/mon/
ds2.4.1/lib/domains/Praxis/data/
ds2.4.1/lib/domains/Praxis/death/
ds2.4.1/lib/domains/Praxis/mountains/
ds2.4.1/lib/domains/Praxis/obj/armour/
ds2.4.1/lib/domains/Praxis/obj/magic/
ds2.4.1/lib/domains/Praxis/obj/weapon/
ds2.4.1/lib/domains/Praxis/orc_valley/
ds2.4.1/lib/domains/Ylsrim/
ds2.4.1/lib/domains/Ylsrim/adm/
ds2.4.1/lib/domains/Ylsrim/armor/
ds2.4.1/lib/domains/Ylsrim/broken/
ds2.4.1/lib/domains/Ylsrim/fish/
ds2.4.1/lib/domains/Ylsrim/meal/
ds2.4.1/lib/domains/Ylsrim/npc/
ds2.4.1/lib/domains/Ylsrim/obj/
ds2.4.1/lib/domains/Ylsrim/virtual/
ds2.4.1/lib/domains/Ylsrim/weapon/
ds2.4.1/lib/domains/campus/adm/
ds2.4.1/lib/domains/campus/etc/
ds2.4.1/lib/domains/campus/meals/
ds2.4.1/lib/domains/campus/npc/
ds2.4.1/lib/domains/campus/save/
ds2.4.1/lib/domains/campus/txt/ai/charles/
ds2.4.1/lib/domains/campus/txt/ai/charles/bak2/
ds2.4.1/lib/domains/campus/txt/ai/charles/bak2/bak1/
ds2.4.1/lib/domains/campus/txt/ai/charly/
ds2.4.1/lib/domains/campus/txt/ai/charly/bak/
ds2.4.1/lib/domains/campus/txt/jenny/
ds2.4.1/lib/domains/default/creator/
ds2.4.1/lib/domains/default/doors/
ds2.4.1/lib/domains/default/etc/
ds2.4.1/lib/domains/default/weap/
ds2.4.1/lib/domains/town/doors/
ds2.4.1/lib/domains/town/txt/shame/
ds2.4.1/lib/domains/town/virtual/
ds2.4.1/lib/lib/comp/
ds2.4.1/lib/lib/lvs/
ds2.4.1/lib/lib/user/
ds2.4.1/lib/lib/virtual/
ds2.4.1/lib/log/
ds2.4.1/lib/obj/book_source/
ds2.4.1/lib/obj/include/
ds2.4.1/lib/realms/template/
ds2.4.1/lib/realms/template/adm/
ds2.4.1/lib/realms/template/area/armor/
ds2.4.1/lib/realms/template/area/npc/
ds2.4.1/lib/realms/template/area/obj/
ds2.4.1/lib/realms/template/area/room/
ds2.4.1/lib/realms/template/area/weap/
ds2.4.1/lib/realms/template/bak/
ds2.4.1/lib/realms/template/cmds/
ds2.4.1/lib/save/kills/o/
ds2.4.1/lib/secure/cfg/
ds2.4.1/lib/secure/cfg/classes/
ds2.4.1/lib/secure/cmds/creators/include/
ds2.4.1/lib/secure/cmds/players/
ds2.4.1/lib/secure/cmds/players/include/
ds2.4.1/lib/secure/daemon/include/
ds2.4.1/lib/secure/lib/
ds2.4.1/lib/secure/lib/include/
ds2.4.1/lib/secure/lib/net/include/
ds2.4.1/lib/secure/lib/std/
ds2.4.1/lib/secure/modules/
ds2.4.1/lib/secure/npc/
ds2.4.1/lib/secure/obj/include/
ds2.4.1/lib/secure/room/
ds2.4.1/lib/secure/save/
ds2.4.1/lib/secure/save/boards/
ds2.4.1/lib/secure/save/players/g/
ds2.4.1/lib/secure/scripts/
ds2.4.1/lib/secure/tmp/
ds2.4.1/lib/secure/upgrades/files/
ds2.4.1/lib/secure/verbs/creators/
ds2.4.1/lib/shadows/
ds2.4.1/lib/spells/
ds2.4.1/lib/std/board/
ds2.4.1/lib/std/lib/
ds2.4.1/lib/tmp/
ds2.4.1/lib/verbs/admins/include/
ds2.4.1/lib/verbs/common/
ds2.4.1/lib/verbs/common/include/
ds2.4.1/lib/verbs/creators/include/
ds2.4.1/lib/verbs/players/include/SCCS/
ds2.4.1/lib/verbs/rooms/
ds2.4.1/lib/verbs/rooms/include/
ds2.4.1/lib/www/errors/
ds2.4.1/lib/www/images/
ds2.4.1/v22.2b14/
ds2.4.1/v22.2b14/ChangeLog.old/
ds2.4.1/v22.2b14/Win32/
ds2.4.1/v22.2b14/compat/
ds2.4.1/v22.2b14/compat/simuls/
ds2.4.1/v22.2b14/include/
ds2.4.1/v22.2b14/testsuite/
ds2.4.1/v22.2b14/testsuite/clone/
ds2.4.1/v22.2b14/testsuite/command/
ds2.4.1/v22.2b14/testsuite/data/
ds2.4.1/v22.2b14/testsuite/etc/
ds2.4.1/v22.2b14/testsuite/include/
ds2.4.1/v22.2b14/testsuite/inherit/
ds2.4.1/v22.2b14/testsuite/inherit/master/
ds2.4.1/v22.2b14/testsuite/log/
ds2.4.1/v22.2b14/testsuite/single/
ds2.4.1/v22.2b14/testsuite/single/tests/compiler/
ds2.4.1/v22.2b14/testsuite/single/tests/efuns/
ds2.4.1/v22.2b14/testsuite/single/tests/operators/
ds2.4.1/v22.2b14/testsuite/u/
ds2.4.1/v22.2b14/tmp/
ds2.4.1/win32/
/*    /secure/cmds/adm/decre.c 
 *    from the Dead Souls LPC Library
 *    turns a creator into a player
 *    created by Descartes of Borg 950323
 */

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

inherit LIB_DAEMON;

string home_dir, PlayerName;
object ob, player_ob;

mixed cmd(string args) {
    object *inv, *purge_array;
    string nom, file;

    if( !((int)master()->valid_apply(({ PRIV_ASSIST, PRIV_SECURE, LIB_CONNECT }))) )
	error("Illegal decre attempt: "+get_stack()+" "+identify(previous_object(-1)));

    ob = 0;
    player_ob = 0;

    if( args == "" || !stringp(args) ) 
	return "Who do you want to make a player?";
    nom = convert_name(args);
    if( !user_exists(nom) ) return capitalize(nom) + " is not a member of " +
	possessive_noun(mud_name()) + " reality.";
    if( !strsrch(file = save_file(nom), DIR_PLAYERS) )
	return "You cannot make "+capitalize(args)+" a player.";

    if(ob == this_player()){
	return "Nonsense.";
    }

    if(!ob = find_player(nom)){
	PLAYERS_D->RemovePendingEncre(lower_case(nom));
	PLAYERS_D->AddPendingDecre(lower_case(nom));
	write(capitalize(nom)+" will be demoted on their next login.");
	return 1;
    }

    else {
	mixed attrape;
	home_dir = homedir(ob);
	write("You decre "+capitalize(nom)+".");
	PlayerName = nom;

	//Try to remove inventory and move the guy to the pod
	//
	ob->eventMove(ROOM_POD);
	inv = deep_inventory(ob);
	//tc("ob location: "+identify(environment(ob)));
	//tc("ob inventory: "+identify(inv),"green");
	if(sizeof(inv))
	    foreach(object thing in inv){
	    if(thing) {
		//tc("thing: "+identify(thing));
		//tc("Thing's env: "+identify(environment(thing)),"green");
		thing->eventMove(ROOM_FURNACE);
		//tc("Thing's env: "+identify(environment(thing)),"cyan");
	    }
	}	//Save the user to sync its state with his inventory
	unguarded( (: ob->save_player((string)ob->GetKeyName()) :) );

	//Move the user file to the player dir
	//
	   if( file_size(DIR_PLAYERS+"/"+nom[0..0]) != -2) 
	mkdir(DIR_PLAYERS+"/"+nom[0..0]);
	if(rename(file+__SAVE_EXTENSION__, DIR_PLAYERS+"/"+nom[0..0]+"/"+nom+__SAVE_EXTENSION__))
	    return "You failed due to lack of write access to "+DIR_PLAYERS+".";
	//Remove their homedir, save it to a backup dir.
	if(home_dir && directory_exists(home_dir))
	    rename(home_dir,"/secure/save/decre/"+nom+"."+timestamp());
	//Remove their name from the creator list in the player daemon, add it to the player list.
	PLAYERS_D->eventDecre(lower_case(nom));

	//Try to create the new player object
	//
	attrape = catch(player_ob = (object)master()->player_object(nom));
	PlayerName = 0;
	if( attrape || !player_ob ) {
	    message("system", "\nFailed to create a player object.", 
	      this_player());
	    message("system", "Please log out and log back in.", ob);
	    return 1;
	}

	//Do the decre
	//
	exec(player_ob, ob);
	player_ob->Setup();

	//Remove creator channels and such
	//
	foreach(string channel in player_ob->GetChannels())
	player_ob->RemoveChannel(channel);
	if( avatarp(player_ob) ) player_ob->AddChannel(({ "avatar" }));
	if( high_mortalp(player_ob) ) player_ob->AddChannel( ({ "hm" }) );
	if( newbiep(player_ob) ) player_ob->AddChannel( ({ "newbie" }) );
	player_ob->AddChannel( ({ "gossip" }) );
	if( councilp(player_ob) ) player_ob->AddChannel( ({ "council" }) );
	player_ob->AddChannel(player_ob->GetClass());

	//Destroy any objects loaded from their homedir
	//
	purge_array = filter(objects(), (: !strsrch(base_name($1), home_dir) :) );
	foreach(object tainted in purge_array){
	    if(clonep(tainted)){
		tainted->eventMove(ROOM_FURNACE);
		purge_array -= ({ tainted });
	    }
	}
	foreach(object tainted in purge_array){
	    tainted->eventDestruct();
	}
    }
    call_out( (: ob->eventMove(ROOM_FURNACE) :), 1 );
    player_ob->eventMoveLiving(ROOM_START);
    player_ob->SetLoginSite(ROOM_START);
    unguarded( (: player_ob->save_player((string)player_ob->GetKeyName()) :) );
    message("system", "You are now a player.", player_ob);
    message("system", (string)player_ob->GetName() + " is now a player!",
      this_player());
    return 1;
}

string GetKeyName() { return PlayerName; }
void help() {
    message("help",
      "Syntax: decre <person>\n\n"
      "Demotes the specified creator to player status. "
      "If the target is not "
      "logged in, they will be made a player when "
      "they next log in."
      "\n\n"
      "See also: encre, rid", this_player()
    );
}