/**
* The inherit file for store closings. This should be inherited along with
* /std/shop or /std/item-shop. Or any other room of your choice, really.
* @author Rodion
*/
#include <weather.h>
#include <climate.h>
#include <am_time.h>
void open_up();
void close_up();
private string _keeper;
private string *_outside_rooms;
private string *_exits;
private string _burglar;
private string _file;
private int _flag;
private int _open;
private int _closed;
private nosave object _keeper_ob;
/** @ignore */
void event_weather(int whats_changed){
if(whats_changed >= 8){
if (_flag) {
call_out("night_time_check", 1);
} else {
call_out("day_time_check", 1);
}
}
} /* event_weather() */
/** @ignore */
protected void night_time_check(){
int bing;
bing = AM_TIME_HANDLER->query_am_hour(time() );
if (bing > 12 && bing < 23 && !_closed) {
_open = 0;
_closed = 1;
close_up();
}
if (bing > 0 && bing < 12 && !_open) {
_closed = 0;
_open = 1;
open_up();
}
} /* night_time_check() */
/** @ignore */
protected void day_time_check(){
int bing;
bing = AM_TIME_HANDLER->query_am_hour(time() );
if (bing > 0 && bing < 12 && !_closed) {
_open = 0;
_closed = 1;
close_up();
}
if (bing > 12 && bing < 23 && !_open) {
_closed = 0;
_open = 1;
open_up();
}
} /* day_time_check() */
/**
* This function sets up the closing code for stores. This allows you to
* close and lock up the place, update external rooms, send the shopkeepers
* home, and catch burglars who try to sneak in.
* <p>
* If the "night" flag is 1, the store will close at night. If it's 0, the
* store will close during the day.
* <p>
* The shopkeeper name should be the string filename of the shopkeeper.
* This can be set to "none" for no shopkeeper (regular
* event_person_say stuff will be used to simulate it.)
* <p>
* *outside is an array of exit, room path pairs that connect to the shop.
* That is, if you moved east to get into the shop, the exit string will be
* "east", "/path/of/room/we/got/here/from". THIS IS REQUIRED, so that
* players will be moved to the right place.
* <p>
* The burglar_func parameter is the name of a function that will be called
* when someone
* enters the shop after it is closed. It will be called with the argument
* object ob, where ob is the person who entered. For no burglar handling,
* this argument can be 0.
*
* @param night Whether the store closes during the night or day.
* @param shopkeeper The file name of the shopkeeper for the store.
* @param outside The exit, room pairs corresponding to outside rooms.
* @param burglar_func The function called when store is burgled.
* @example
* set_night_close(1, "/d/sur/chars/bob", ({"east", PATH+"flibble_room"}), "catch_thief");
* ...
* set_night_close(0, "none", ({"up", "/d/ram/Snorkle/wibble_room"}));
*/
void set_night_close(int night, string shopkeeper, string *outside,
string burglar_func){
int i;
_flag = night;
WEATHER->weather_notify( this_object(), NOTIFY_DAY );
_keeper = _file = shopkeeper;
//check to see if outside exists.
if (sizeof(outside) && !(sizeof(outside)%2)) {
_exits = allocate(sizeof(outside)/2);
_outside_rooms = allocate(sizeof(outside)/2);
//split it up so that each room outside has a corresponding
//exit, in the proper arrays... easier to deal with this way.
for(i=0; i<sizeof(outside); i++) {
if(!i%2)
_outside_rooms[i] = outside[i];
else
_exits[i-1] = outside[i];
}
}
_burglar = burglar_func;
} /* set_night_close() */
/**
* This method closes the shop! It sends the shopkeeper home, changes the
* incoming exits to be closed and locked, and moves all players in the store
* out.
*/
void close_up(){
object *obs;
object *people;
object bing;
object *keeper_ob;
int i;
if (_keeper == "none") {
event (this_object(), "person_say", "The shopkeeper says: ",
"I'm sorry, it's time to close!", "common");
tell_room (this_object(), "The shopkeeper ushers you out of "
"the store.\n");
}
else {
keeper_ob = children(_keeper);
if (!sizeof(keeper_ob)) {
return;
}
if (keeper_ob[0]->query_fighting()) {
call_out("close_up", 60);
return;
}
keeper_ob[0]->do_command("'I'm sorry, it's time to close!");
keeper_ob[0]->do_command(":ushers you out of the store.");
keeper_ob[0]->move("/room/rubbish");
}
obs = all_inventory( this_object() );
people = filter(obs, (: $1->query_property("player") :));
foreach(bing in people){
bing->move_with_look(_outside_rooms[0]);
}
for(i=0; i<sizeof(_outside_rooms); i++){
_outside_rooms[i]->modify_exit(_exits[i], ({"open", 0, "locked", 1,
"difficulty", 4}));
}
} /* close_up() */
/**
* This method opens the store, summoning the shopkeeper from the void and
* unlocking and opening the various exits.
*/
void open_up(){
int i;
for(i=0; i<sizeof(_outside_rooms); i++){
_outside_rooms[i]->modify_exit(_exits[i], ({"open", 1, "locked", 0,
"difficulty", 4}));
}
if (_keeper == "none") {
return;
}
_keeper_ob = clone_object(_file);
_keeper_ob->move(this_object());
} /* open_up() */
/** @ignore */
void event_enter(object ob, string message, object from){
if (!_burglar) {
return;
}
if (!_closed) {
return;
}
if (ob->query_creator()) {
return;
}
if (!ob->query_property("player")) {
return;
}
call_out(_burglar, 1, ob);
} /* event_enter() */
/** @ignore yes */
mapping query_dynamic_auto_load() {
return ([ "keeper ob" : _keeper_ob ]);
}
/** @ignore yes */
void init_dynamic_arg(mapping map) {
_keeper_ob = map["keeper ob"];
}