mud/lib/secure/cmds/builders/unvirt.c
2020-09-06 05:43:07 -07:00

102 lines
4.2 KiB
C

#include <lib.h>
#include <objects.h>
#include <daemons.h>
inherit LIB_DAEMON;
string *features = ({ "GetLong", "GetShort", "GetAmbientLight",
"GetDayLight", "GetNightLight", "GetDayLong", "GetNightLong",
"GetDayShort", "GetNightShort", "GetExitMap", "GetFlyRoom",
"GetSinkRoom", "GetClimate", "GetTerrainType",
"GetItemsMap", "GetProperties", "GetSmellMap", "GetListenMap",
"GetGravity", "GetMedium", "GetPlayerKill", "GetTown",
});
mixed cmd(string str){
mapping RoomElements = ([]);
object here = environment(this_player());
object staff = present("tanstaafl",this_player());
if(!here) return 0;
if(!staff){
write("You must be holding the Creator Staff in order to use this command.");
return 1;
}
if(file_exists(base_name(here)+".c")){
write("This environment is already not virtual.");
return 1;
}
foreach(string feature in features){
RoomElements[feature] = call_other(here, feature);
}
cp("/obj/room.c", base_name(here)+".c");
reload(base_name(here));
foreach(mixed key, mixed val in RoomElements){
string tmp, file_contents;
write("%^RED%^"+key+"%^RESET%^: "+identify(val));
if(!val || ((mapp(val) || stringp(val)) && !sizeof(val)) ) true();
else {
//write(key+": "+identify(val));
key = replace_string(key,"Get","Set",1);
switch(key){
case "SetExitMap" : key = "SetExits"; break;
case "SetItemsMap" : key = "SetItems"; break;
case "SetSmellMap" : key = "SetSmell"; break;
case "SetListenMap" : key = "SetListen"; break;
default :
}
if(key == "SetTerrainType"){
tmp = implode(TYPES_D->eventCalculateTypes("terrain",val),"|");
tmp = "SetTerrainType("+tmp+");";
staff->eventDelete(environment(this_player()), "SetTerrainType");
file_contents = staff->eventAppendLast(base_name(environment(this_player()))+".c", "create", tmp);
rm(base_name(environment(this_player()))+".c");
if(!grepp(file_contents,"terrain_types.h")){
write_file(base_name(environment(this_player()))+".c",
"#include <terrain_types.h>\n",1);
}
write_file(base_name(environment(this_player()))+".c",file_contents);
}
else if(key == "SetMedium"){
tmp = TYPES_D->eventCalculateTypes("medium",val);
tmp = "SetMedium("+tmp+");";
staff->eventDelete(environment(this_player()), "SetMedium");
file_contents = staff->eventAppendLast(base_name(environment(this_player()))+".c", "create", tmp);
rm(base_name(environment(this_player()))+".c");
if(!grepp(file_contents,"medium.h")){
write_file(base_name(environment(this_player()))+".c",
"#include <medium.h>\n",1);
}
write_file(base_name(environment(this_player()))+".c",file_contents);
}
else if(mapp(val)){
val = staff->eventStringifyMap(val);
tmp = key + "( "+val+" );";
staff->eventDelete(environment(this_player()), key);
file_contents = staff->eventAppendLast(base_name(environment(this_player()))+".c", "create", tmp);
write_file(base_name(environment(this_player()))+".c",file_contents,1);
}
else staff->eventModify(environment(this_player()),lower_case(key)+" "+val);
}
staff->eventModify(environment(this_player()),"setshort "+RoomElements["GetShort"]);
}
return 1;
}
string GetHelp() {
return ("Syntax: unvirt\n\n"
"This command will gather the room data of the virtual room you "
"are standing in, and try to make a non-virtual room with it, "
"writing to the file that the virtual room is pretending to use. "
"If you lack write permissions to that file, the command will fail "
"in a rather ugly way.\n"
"See also: modify, create, delete, copy, areaclone, "
"areagoto, arealist");
}