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/
#include <lib.h>
#include <daemons.h>
#include <rooms.h>
#include <modules.h>
#include <commands.h>

inherit LIB_VERB;

mixed do_copy_obj_str(object ob, string str);

int success;
string sourcefile, targetfile;

static void create() {
    verb::create();
    SetVerb("copy");
    SetRules("STR", "OBJ STR");
    SetErrorMessage("Copy what?");
    SetHelp("Syntax: <copy [OBJ] [NAME]>\n"
      "        <copy [FILENAME]\n\n"
      "With a room's filename as an argument, this command "
      "copies everything about that room (except exits) into "
      "your current room.\n\n"
      "When you specify an object and provide a filename, this "
      "command makes a copy of the object's file and gives it "
      "the name you provide.\n\n"
      "\nSee also: create, delete, modify, reload, initfix, add" );
}

mixed can_copy_obj_str(object ob, string str) { return 1; }
mixed can_copy_str(string str) { return 1; }

mixed do_copy_obj_str(object ob, string str) {
    object staff;
    staff = present("tanstaafl",this_player());
    if(!staff) {
	write("You must be holding the creator staff in order to use this command.");
	write("If you don't know where you put it, get another one from the chest ");
	write("in your workroom.");
	return 1;
    }
    //debug("str: ",str);
    //debug("path_prefix(str): ",path_prefix(str));
    if(userp(ob)){
	write("No.");
	return 1;
    }
    success = 0;
    sourcefile = "";
    targetfile = "";
    if(last(str,2) != ".c") str += ".c";
    str = absolute_path((string)this_player()->query_cwd(), str);
    //debug("str: ",str);
    //debug("path_prefix(str): ",path_prefix(str));
    if( !directory_exists(path_prefix(str)) ) {
	write("Directory not found.");
	return 1;
    }

    sourcefile = base_name(ob)+".c";
    targetfile = str;
    if(!check_privs(this_player(),str) || 
      (!check_privs(this_player(),sourcefile) && 
	strsrch(sourcefile,"/obj/"))){
	write("You lack sufficient privileges for this operation. Copy failed.");
	return 0;
    }
    if(!file_exists(sourcefile)) {
	write("That file no longer exists.");
	return 0;
    }
    //else unguarded( (: success = cp(sourcefile, targetfile) :) );
    else unguarded( (: success = cp(sourcefile, targetfile) :) );
    if(success) {
	write("Copy successful.");
	return 1;
    }
    else write("Copy failed.");
    return 0;
}

mixed do_copy_str(string str) {
    string str2, tmp, new_room;
    mixed source_update;
    object staff;
    staff = present("tanstaafl",this_player());
    if(!staff) {
	write("You must be holding the creator staff in order to use this command.");
	write("If you don't know where you put it, get another one from the chest ");
	write("in your workroom.");
	return 1;
    }
    //debug("str: ",str,"yellow");
    str2 = str;
    str = absolute_path((string)this_player()->query_cwd(), str);
    //debug("str: ",str,"yellow");

    //debug("path_prefix(str): ",path_prefix(str),"green");

    if(last(str,2) != ".c") str += ".c";
    //debug("str: ",str,"yellow");

    if( !file_exists(str) ){
	str = path_prefix(base_name(environment(this_player())))+"/"+str2;
	if(last(str,2) != ".c") str += ".c";
    }

    if( !file_exists(str) ){
	write("Directory not found.");
	return 1;
    }

    else if( !(tmp = read_file(str)) || !tmp || tmp == ""){
	write("Unable to read file " + str + ".");
	return 1;
    }

    if((!check_privs(this_player(),str) && strsrch(str,"/obj/") ) || 
      !check_privs(this_player(),base_name(environment(this_player()))+".c")){
	write("You lack sufficient privileges for this operation. Copy failed.");
	return 1;
    }
    source_update = load_object("/secure/cmds/creators/update")->cmd("-a "+str);
    if(!source_update || !intp(source_update) || source_update == 0) {
	write("Your source file doesn't update correctly. Fix it first. Copy aborted.");
	return 1;
    }

    if(!inherits("/lib/std/room",load_object(str))) {
	write("The file you want to copy isn't a recognized room. Copy aborted.");
	return 1;
    }

    new_room = base_name(environment(this_player()));

    load_object("/secure/cmds/creators/bk")->cmd(new_room+".c");
    write("Backed up this room. To restore from this backup, type: ");
    write("restore "+last_string_element(new_room,"/"));
    write("Then: update");

    staff->eventCopyRoom(str,new_room+".c");
    load_object("/secure/cmds/creators/update")->cmd("-a "+new_room);
    this_player()->eventMoveLiving(new_room);
    write("Room copy complete.");
    return 1;
}