// The New Room.c (probably old by the time you read this, of course) // Brought to you by... Buddha@TMI (where else?) // This file is part of the TMI/MudOS mudlib. Please retain the header. // Written 4-19-92 and onwards. // Doors are added in the standard door object. // The two files are seperate so that rooms without doors (ie, most) can // save 50 or so bytes. It adds up in the end... // No it doesn't. But the two things should be seperate anyway =) -ed // Rust@TMI-2 (12-01-93) <-- (happy birthday Rust's mom!) // Changed the objects property, so that you can clone // multiple copies of an object without needing an id for each copy. #include <config.h> #include <exits.h> #include <mudlib.h> #include <daemons.h> #include <priv.h> inherit OBJECT ; inherit "std/object/contents"; void reset(); void __INIT() { if (!ob_data) ob_data = ([]); } void create() { //call_out("reset", 0); // this is good for virtual rooms. //it may be good for virtual rooms, but it's bad for actual rooms, //if you goto a room and force it to load, ob_data[objects] won't //kick in when you enter. //SO: __INIT(); set("volume", 10000000, MASTER_ONLY); // Leto set("capacity", 10000000, MASTER_ONLY); // Leto if(virtualp(this_object())) call_out("reset",0); else reset(); } int use_bogus_exit() { notify_fail(BOGUS_EXIT_MSG); return 0; } string *query_exit_dirs() { return keys(ob_data["exits"]); } int valid_exit(string dir) { if (ob_data["exits"] && ob_data["exits"][dir]) return 1; } int id(string str) { if (!str) return 0; if (ob_data["item_desc"] && ob_data["item_desc"][str]) return 1; if (ob_data["item_func"] && ob_data["item_func"][str]) return 1; } void reset() { int i, j, k, tally; string name; object* inv; object ob; string *objects; if (ob_data["objects"]) { objects = keys(ob_data["objects"]); i = sizeof(objects); while(i--){ //for compatibility with the old way if(!intp(ob_data["objects"][objects[i]])){ if(!present(objects[i],this_object())){ ob = new(ob_data["objects"][objects[i]]); ob->move(this_object()); } }else{ name =((string*)find_object_or_load(objects[i])->query("id"))[0]; if(!name) continue; inv = all_inventory(this_object()); j = sizeof(inv); tally = 0; while(j--) if(inv[j]->id(name)) tally++; k = ob_data["objects"][objects[i]]; k = k-tally; for(j=0;j<k;j++){ ob = clone_object(objects[i]); ob->move(this_object()); } } } } return; } // These functions are called from move(), but don't need to do anything. // Should rooms fill up? In 99% of the cases the max capacity of a room // is irrelevant. int receive_objects(object it) { return 1; } // Is this one still called? I'm not sure. Moby, 10-3-92 int add_encumbrance(int x) { return 1; } void remove_exit(string dir) { if(ob_data["exits"][dir]) delete("exits/" + dir); } // This is here to support outside rooms. If you define a room to // be outside, then two things happen: the "outside" property is set to a // capital letter (which indicates which weather zone it's in) and // the room's light property is overridden to call_out to the daemon // to reflect outside light. varargs void set_outside (string zone) { if (!zone) zone="A" ; set ("outside", zone) ; set ("light", "@@query_ambient_light") ; // JIC we need to load the weather daemon... seteuid(getuid()) ; WEATHER_D->request_weather_notices(this_object()) ; return ; } // This calls out to the weather daemon to check the ambient light. int query_ambient_light() { return (int)WEATHER_D->query_ambient_light() ; } /* EOF */