/* I was hoping I never had to touch this code..
* But it seems like i have to.
* Adding a "loading" property, so that players won't be able to quit before
* all equipment are loaded.
* Baldrick, nov '94
* Taniwha 1995, 1996 (ad nauseum)
*/
/* First, add a global, shame. */
static int stuff;
void auto_clone(mixed arg);
string *create_auto_load(object *obs)
{
string s, s1, s3;
mixed auto_string;
string *fname;
int i;
if(!obs) return ({ });
auto_string = ({ });
/* do this backwards, means it comes out right on logon */
for (i = sizeof(obs) -1; i >= 0; i--)
{
s = s3 = 0;
if (!catch(s=(string)obs[i]->query_auto_load()) && !s)
{
catch(s = (string)obs[i]->query_static_auto_load());
catch(s3 = (string)obs[i]->query_dynamic_auto_load());
if (!s && !s3)
continue;
/*
* Fix by Aragorn. Used to be !s below
* Name of function is a bit mismatching (query_auto_load())
* because if it returns something it won't...
*/
}
else
if (s)
continue;
else
s3 = 0;
// Taniwha, there's some evidence that things aren't SAVING maybe something dests in query_auto_load()
if(!obs[i]) continue;
fname = explode(file_name(obs[i]),"#");
s1 = fname[0];
auto_string += ({ 1, s1, ({ s, s3 }) });
}
return auto_string;
} /* create_auto_load() */
void birthday_gifts() {
if(!sizeof(find_match("birthday card", this_object())))
if(this_object()->query_is_birthday_today())
if(!catch(call_other("/obj/b_day/card", "??")) &&
!catch(call_other("/obj/b_day/demon", "??"))) {
call_out("card_arrives", 5);
}
} /* birthday_gifts() */
int query_special_day(string type)
{
string s1, s2, month;
int day;
sscanf(ctime(time()), "%s %s %d %s", s1, month, day, s2);
switch (type) {
case "cabbage day" :
if (month == "Feb" && day == 17)
return 1;
return 0;
case "test day" :
if (month == "Feb" && day == 16)
return 1;
return 0;
}
return 0;
} /* query_day_special() */
void card_arrives()
{
object card;
card = (object)"/global/cloner"->clone("/obj/b_day/card");
card->move(this_object());
tell_room(environment(), "You hear a rumbling in the distance. " +
"Then, suddenly, a malformed goblin wizzes past you, " +
"frantically pedalling a fire-engine red tricycle!\n");
write("You feel something thrust into your hand by a greener, " +
"wartier one.\n");
} /* card_arrives() */
void make_iou(mixed stuff,object dest)
{
object iou;
log_file("loader",(string)dest->query_cap_name()+" had "+(string)stuff[1]+" refuse to load .\n");
catch(iou=clone_object("/obj/misc/iou"));
if(iou)
{
iou->add_auto_string(stuff);
catch(iou->move(dest));
}
}
object *load_auto_load(string *auto_string, object dest)
{
object ob, *obs;
int i;
obs = ({ });
if (stringp(auto_string))
return ({ });
if (!auto_string || !sizeof(auto_string))
return ({ });
/* This for loop gives errors sometimes..
* should be made bulletproof..
* Baldrick.
*/
for (i=0;i<sizeof(auto_string);i+=3)
{
/* Maybe this line makes it bulletproof?
* Baldrick May '95
*/
// If there's a file name here
if (sizeof(auto_string[i+1]))
{
// Try to clone one
catch(ob = clone_object(auto_string[i+1]));
if(ob)
{
// This initializes the data in the object,and saved vars
auto_clone( ({ ob,auto_string[i+2], dest }));
// Useful this, you can tell what didn;t laod for example.
obs += ({ ob });
}
if(!ob)
{
// And if it didn't work , give em an IOU
make_iou( ({auto_string[i],auto_string[i+1],auto_string[i+2]}),dest);
}
} /* If auto_string */
} /* for */
return obs;
} /* load_auto_load() */
void auto_clone(mixed arg)
{
if(!arg[0])
{
tell_object(this_object(),"Ooops something broke.\n");
stuff --;
return;
}
if (sizeof(arg[1]) == 1 || !arg[1][1])
{
arg[0]->init_arg(arg[1][0]);
}
else
{
arg[0]->init_static_arg(arg[1][0]);
arg[0]->init_dynamic_arg(arg[1][1]);
}
// Taniwha 1995, if the container hasn't loaded, what shall we do ?
if(arg[0] && arg[2] && !(arg[0]->move(arg[2]))); // if they exist AND the move succeeds
else
{
log_file("loader",(string)this_object()->query_name()+" Dropped a "+(string)arg[0]->query_name()+" on login.\n");
tell_object(this_object(),"Oops, you dropped something.\n");
if(arg[0])
arg[0]->move(environment());
}
stuff--;
} /* auto_clone() */
/* The really stupid thingie..
* Baldrick.
*/
int query_loading()
{
if (stuff<1)
return 0;
return 1;
}
/* In case of bugs.. */
void reset_stuff()
{
stuff=0;
return;
}
/* Hamlet added me -- I'm used for the 'update' command. */
string *create_update_auto_load(object ob)
{
string s, s1, s3;
mixed auto_string;
int j;
if(!ob) return ({ });
catch(s = (string)ob->query_static_auto_load());
catch(s3 = (string)ob->query_dynamic_auto_load());
if (!s && !s3)
return ({ });
if (sscanf(file_name(ob), "%s#%d", s1, j) == 2)
auto_string = ({ 1, s1, ({ s, s3 }) });
else
auto_string = ({ 0, file_name(ob), ({ s, s3 }) });
return auto_string;
} /* create_update_auto_load() */