255 lines
10 KiB
C
255 lines
10 KiB
C
#include <lib.h>
|
|
#include <modules.h>
|
|
#include <daemons.h>
|
|
#include ROOMS_H
|
|
|
|
int eventGetArray(string str);
|
|
int eventDoAddition(string str);
|
|
|
|
string globalstr, globalstr2, temporary, func, v2, repstr;
|
|
object target;
|
|
string *NewArr = ({});
|
|
string *array_val = ({});
|
|
mapping InvMap = ([]);
|
|
|
|
mixed gmake(string str) {
|
|
string thingy, filename, val, dir, area_dir;
|
|
string creation;
|
|
string *legal_dirs;
|
|
object template;
|
|
|
|
if(sscanf(str, "%s %s %s",thingy, val, filename) == 3) true();
|
|
else if(sscanf(str,"%s %s",thingy, filename) !=2) thingy = str;
|
|
switch(thingy){
|
|
case "item" : creation = "thing"; dir = "obj";break;
|
|
case "book" : creation = "book"; dir = "obj";break;
|
|
case "thing" : creation = "thing"; dir = "obj";break;
|
|
case "weap" : creation = "weapon"; dir = "weap";break;
|
|
case "weapon" : creation = "weapon"; dir = "weap";break;
|
|
case "armor" : creation = "armor"; dir = "armor";break;
|
|
case "arm" : creation = "armor"; dir = "armor";break;
|
|
case "chair" : creation = "chair"; dir = "obj";break;
|
|
case "bed" : creation = "bed"; dir = "obj";break;
|
|
case "storage" : creation = "container"; dir = "obj";break;
|
|
case "container" : creation = "container"; dir = "obj";break;
|
|
case "table" : creation = "table"; dir = "obj";break;
|
|
case "door" : creation = "door"; dir = "doors";break;
|
|
case "barkeep" : creation = "barkeep"; dir = "npc";break;
|
|
case "vendor" : creation = "vendor"; dir = "npc";break;
|
|
case "trainer" : creation = "trainer"; dir = "npc";break;
|
|
case "npc" : creation = "npc"; dir = "npc";break;
|
|
case "mob" : creation = "npc"; dir = "npc";break;
|
|
case "mon" : creation = "npc"; dir = "npc";break;
|
|
case "monst" : creation = "npc"; dir = "npc";break;
|
|
case "monster" : creation = "npc"; dir = "npc";break;
|
|
case "meal" : creation = "meal"; dir = "meals";break;
|
|
case "food" : creation = "meal"; dir = "meals";break;
|
|
case "drink" : creation = "drink"; dir = "meals";break;
|
|
case "worn" : creation = "worn_storage"; dir = "armor";break;
|
|
case "wornstorage" : creation = "worn_storage"; dir = "armor";break;
|
|
case "worn_storage" : creation = "worn_storage"; dir = "armor";break;
|
|
default : true();
|
|
}
|
|
|
|
legal_dirs = ({"meals","doors", "obj","armor","weap","npc"});
|
|
if(member_array(dir, legal_dirs) == -1) {
|
|
write("That is not a valid argument. You may create the following: room, npc, "+
|
|
"door, weapon, armor, container, item, table, chair, bed, meal, worn_storage.");
|
|
return 1;
|
|
}
|
|
|
|
else if(!filename || filename == ""){
|
|
write("You must specify a filename. For example: create "+creation+
|
|
" "+thingy+"_14.c");
|
|
write("or: create "+thingy+" /realms/my_name/area/"+dir+"/my_first_"+creation+".c");
|
|
return 1;
|
|
}
|
|
|
|
filename = replace_string(filename, " ", "_");
|
|
|
|
if(last(filename,2) != ".c") filename += ".c";
|
|
|
|
if(!this_player()->query_cwd()){
|
|
write("You have no current working directory. Please type: cd\nthen try again.");
|
|
return 1;
|
|
}
|
|
|
|
if(grepp(filename,"/") && directory_exists(path_prefix(filename)) &&
|
|
check_privs(this_player(), filename)){
|
|
write("Ok, using yer filename: "+filename);
|
|
}
|
|
else if(last_string_element(this_player()->query_cwd(),"/") == dir &&
|
|
check_privs(this_player(), this_player()->query_cwd())){
|
|
write("Using your cwd: "+this_player()->query_cwd()+"/"+filename);
|
|
filename = this_player()->query_cwd()+"/"+filename;
|
|
}
|
|
else if(this_player()->query_cwd() != "/" &&
|
|
member_array(dir,get_dir(this_player()->query_cwd()+"/")) != -1 &&
|
|
check_privs(this_player(), this_player()->query_cwd()+"/"+dir)){
|
|
write("Using your cwd plus "+dir+": "+this_player()->query_cwd()+"/"+dir+"/"+filename);
|
|
filename = this_player()->query_cwd()+"/"+dir+"/"+filename;
|
|
}
|
|
else if(member_array(dir,get_dir(path_prefix(this_player()->query_cwd())+"/")) != -1 &&
|
|
check_privs(this_player(), path_prefix(this_player()->query_cwd())+"/"+dir)){
|
|
write("Using your cwd plus ../"+dir+": "+path_prefix(this_player()->query_cwd())+"/"+dir+"/"+filename);
|
|
filename = path_prefix(this_player()->query_cwd())+"/"+dir+"/"+filename;
|
|
}
|
|
else {
|
|
area_dir = homedir(this_player())+"/area";
|
|
write("I'm going to go with the appropriate area directory: "+area_dir+"/"+dir+"/"+
|
|
replace_string(filename,"/",""));
|
|
filename = area_dir+"/"+dir+"/"+replace_string(filename,"/","");
|
|
|
|
}
|
|
|
|
creation = "/obj/"+creation+".c";
|
|
if(file_exists(creation) && cp(creation,filename)) true();
|
|
else {
|
|
write("Creation failed.");
|
|
return 1;
|
|
}
|
|
|
|
if(thingy != "door") {
|
|
template = new(filename);
|
|
template->eventMove(environment(this_player()));
|
|
write("You wave your hand mysteriously and "+template->GetShort()+" materializes!");
|
|
say(this_player()->GetCapName()+" waves "+possessive(this_player())+" hand mysteriously and "+template->GetShort()+" materializes!");
|
|
}
|
|
|
|
else {
|
|
write("You wave your hand mysteriously and a new door begins to materialize.");
|
|
say(this_player()->GetCapName()+" waves "+possessive(this_player())+" hand mysteriously and a new door begins to materialize.");
|
|
this_object()->eventCreateDoor(val, filename);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
varargs int eventStartGenericQuestions(object ob, string tempfile, string *new_arr, string what){
|
|
target = ob;
|
|
temporary = tempfile;
|
|
NewArr -= ({ 0 });
|
|
NewArr = new_arr;
|
|
func = what;
|
|
write("This setting takes multiple values. If you have no more values to "+
|
|
"enter, then enter a dot on a blank line. To cancel, enter a single q on "+
|
|
"a blank line.");
|
|
if(NewArr && sizeof(NewArr)) array_val = NewArr;
|
|
else array_val = ({});
|
|
array_val -= ({0});
|
|
array_val -= ({"0"});
|
|
if(sizeof(array_val))
|
|
write("You may now enter the next value. So far, we have: "+identify(array_val));
|
|
else write("You may now enter the next value. So far, it is blank.");
|
|
write("If you're done entering values, enter a dot on a blank line.");
|
|
|
|
input_to( (: eventGetArray :) );
|
|
return 1;
|
|
}
|
|
|
|
int eventGetArray(string str){
|
|
if(!str || str == "" || str == "."){
|
|
write("Entries complete. Final array is: "+identify(array_val));
|
|
NewArr = array_val;
|
|
if(!sizeof(array_val)){
|
|
write("Blank array. Modification cancelled.");
|
|
return 1;
|
|
}
|
|
if(target->GetDoor() || inherits(LIB_DOOR,target)){
|
|
this_object()->eventReceiveId(target, NewArr);
|
|
}
|
|
else this_object()->eventResumeArrayMod(target, temporary, NewArr, func);
|
|
array_val = ({});
|
|
return 1;
|
|
}
|
|
else {
|
|
array_val += ({str});
|
|
array_val -= ({0});
|
|
array_val -= ({"0"});
|
|
if(sizeof(array_val))
|
|
write("You may now enter the next value. So far, we have: "+identify(array_val));
|
|
else write("You may now enter the next value. So far, it is blank.");
|
|
write("If you're done entering values, enter a dot on a blank line.");
|
|
input_to( (: eventGetArray :) );
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
int eventDeleteItem(object ob1, object ob2){
|
|
string name, tmpname;
|
|
mapping Inventory;
|
|
|
|
name = base_name(ob1);
|
|
if(!check_privs(this_player(), base_name(ob2)) ){
|
|
write("Insufficient privileges. Addition halted.");
|
|
return 1;
|
|
}
|
|
|
|
tmpname = generate_tmp();
|
|
Inventory = this_object()->QueryMap("SetInventory",ob2);
|
|
if(sizeof(Inventory[name])) map_delete(Inventory,name);
|
|
else if(sizeof(Inventory[name+".c"])) map_delete(Inventory,name+".c");
|
|
map_delete(Inventory,name);
|
|
map_delete(Inventory,name+".c");
|
|
globalstr = tmpname;
|
|
globalstr2 = base_name(ob2)+".c";
|
|
unguarded( (: cp(globalstr2, globalstr) :) );
|
|
this_object()->eventResumeMappingChange(ob2, tmpname, Inventory, "SetInventory");
|
|
unguarded( (: rm(globalstr) :) );
|
|
return 1;
|
|
}
|
|
|
|
int eventAddItem(object ob, string addendum){
|
|
target = ob;
|
|
v2 = addendum;
|
|
if(!check_privs(this_player(), base_name(target))){
|
|
write("Insufficient privileges. Addition halted.");
|
|
return 1;
|
|
}
|
|
this_object()->eventGeneralStuff(base_name(ob)+".c");
|
|
|
|
InvMap = this_object()->QueryMap("SetInventory",ob);
|
|
if(!inherits(LIB_NPC,ob)){
|
|
write("Please enter the number of these that you want to add:");
|
|
}
|
|
else write("Please enter a command for the NPC to perform with this "+
|
|
"item. If you have no such command to enter, enter the number of "+
|
|
"these items you want to add:");
|
|
input_to( (: eventDoAddition :) );
|
|
return 1;
|
|
}
|
|
|
|
int eventDoAddition(string str){
|
|
this_object()->GetTheValue("AUTOMATED",target, generate_tmp(target), v2, str, InvMap, "SetInventory");
|
|
return 1;
|
|
}
|
|
|
|
int eventGeneralStuff(string str){
|
|
string fpath = path_prefix(str);
|
|
mixed player = this_player();
|
|
repstr = "";
|
|
globalstr = str;
|
|
unguarded( (: globalstr2 = read_file(globalstr) :) );
|
|
unguarded( (: this_object()->eventAddInit(globalstr) :) );
|
|
if(sscanf(globalstr, "/realms/%s/workroom.c", player)){
|
|
globalstr2 = replace_string(globalstr2, "./area/customdefs.h",
|
|
"/realms/"+player+"/area/customdefs.h");
|
|
}
|
|
if(query_verb() != "copy"){
|
|
if(grepp(globalstr2,"./customdefs.h")){
|
|
string j1, j2, tmppath;
|
|
sscanf(globalstr2,"%sinclude \"%scustomdefs.h%s",j1,tmppath,j2);
|
|
if(tmppath) repstr = absolute_path(fpath,tmppath+"customdefs.h");
|
|
unguarded( (: globalstr2 = replace_line(globalstr2 ,({"./customdefs.h"}), "#include \""+repstr+"\"") :) );
|
|
}
|
|
}
|
|
globalstr2 = replace_string(globalstr2,"\n\n\n","\n\n");
|
|
globalstr2 = replace_string(globalstr2,"//funs","");
|
|
globalstr2 = replace_string(globalstr2,"//snuf","");
|
|
globalstr2 = replace_string(globalstr2,"//extras","");
|
|
unguarded( (: write_file(globalstr, globalstr2, 1) :) );
|
|
write("Indenting file...");
|
|
unguarded( (: indent_file(globalstr) :) );
|
|
repstr = "";
|
|
return 1;
|
|
}
|