inherit "/obj/clock";
int our_offset,
their_offset,
last_time,
cur_alarm,
offset_alarm,
alarm;
mixed *alarms;
string *alarm_write,
alarm_name;
object our_player;
varargs int get_text(string line);
void setup() {
set_name("watch");
add_adjective("demonic");
add_alias("watch");
set_main_plural("demonic watches");
set_short("demonic watch");
set_long("A small wrist attackable living quaters for a demon "+
"the demon looks pretty harried about giveing out the "+
"time all the time, and the pay is lousy..\n");
set_value(20000);
our_offset = 0;
their_offset = 8;
last_time = time();
call_out("check_alarm",60);
alarms = ({ });
}
/*
string long(string word, int dark) {
if (our_offset == their_offset)
return ::long()+".\n"+get_time()+".\n";
else
return ::long()+"\n"+get_time()+"\nMud time: "+ctime(time())+".\n";
}
string query_read() {
if (our_offset == their_offset)
return get_time()+".\n";
else
return get_time()+"\nMud time: "+ctime(time())+".\n";
}
*/
void init() {
add_command("time", "");
add_command("gmt", "<word'offset'>", (:this_object()->set_gmt($4[0]):));
add_command("use", "<direct:object>", (:this_object()->use():));
this_player()->add_command("read", this_object());
}
int use(string arg) {
if (!alarms)
alarms = ({ });
printf("%-=80s","You look into the watch and fiddle with several buttons, "+
"Finally a light lights up in the top corner say you have "+
"the security clearance to modify the settings.\n"+
"You can \"set\" an alarm \"remove\" an alarm \"list\" the "+
"set alarms. You can \"quit\" also.\n");
write("What do you wish to do ? ");
input_to("the_command");
return 1;
}
int the_command(string arg) {
string s1;
int i;
if (arg == "quit") {
write("Thank you for using this wonderful watch.\n");
return 1;
}
if (sscanf(arg,"set%s",s1)) {
int hour, min;
string name;
if (sscanf(s1," %s %d:%d%s",name,hour,min,s1)!=4)
write("Usage: set <name> <hour>:<min> [+]\n");
else {
if ((i=member_array(name,alarms))<0)
alarms += ({ name, hour, min, 0 });
else
if (i%4)
write("Oooooopps, you cannot use that name as an alarm\n");
else {
alarms[i+1] = hour;
alarms[i+2] = min;
}
if (s1 == " +") {
if (i==-1)
i = sizeof(alarms)-4;
cur_alarm = i;
get_text();
return 1;
}
}
}
if (sscanf(arg,"remove%s",s1)) {
string frog;
if (sscanf(s1," %s",frog)!=1)
write("Usage: remove <name>\n");
else
if ((i=member_array(frog,alarms))<0)
write("You must remove an existing alarm\n");
else
if (i%4)
write("Ohhh dear.\n");
else {
alarms = delete(alarms,i);
alarms = delete(alarms,i);
alarms = delete(alarms,i);
alarms = delete(alarms,i);
}
}
if (sscanf(arg,"list%s",s1)) {
string chicken;
if (sscanf(s1," %s",chicken)!=1) {
for (i=0;i<sizeof(alarms);i+=4) {
write("Alarm "+alarms[i]+" is set for "+alarms[i+1]+":"+alarms[i+2]+"\n");
}
} else {
if ((i=member_array(chicken,alarms))<0)
write("That alarm does not exist.\n");
else
if (i%4)
write("Bing basicly");
else
write("You have set alarm "+chicken+" to go off at "+alarms[i+1]+":"+
alarms[i+2]+"\n");
}
}
return 1;
}
varargs int get_text(string line) {
string text;
if (!line) {
text = "";
write(sprintf("%-=80s","Please enter the text you wish to be displayed "+
"when the alarm goes off (. to finish)"));
} else if (line==".") {
alarms[cur_alarm+3] = text+"\n";
write("What do you wish to do ? ");
input_to("the_command");
return 1;
} else
text += line+"\n";
write("] ");
input_to("get_text");
return 1;
}
mixed query_auto_load() {
mixed ret;
if (!alarms)
alarms = ({ });
ret = ({ their_offset, alarms });
return ret;
}
void init_arg(mixed *arg) {
their_offset = arg[0];
alarms = arg[1];
if (!alarms)
alarms = ({ });
}
void check_alarm() {
int the_time, offset, i;
int tmp;
the_time = time();
offset = (the_time/(3600*24))*3600*24 - our_offset*3600;
for (i=0;i<sizeof(alarms);i+=4) {
tmp = offset + (alarms[i+1]-our_offset+their_offset)*3600 + alarms[i+2]*60;
if (the_time>tmp && tmp>last_time) {
/* we go off. bounce */
alarm = 6;
alarm_name = alarms[i];
if (alarms[i+3])
alarm_write = explode(alarms[i+3],"\n");
else
alarm_write = ({
"Beep Beep Beep, Your "+alarms[i]+" alarm has gone off.\n",
"Beep Beep Beep, Your "+alarms[i]+" alarm has gone off.\n",
"Beep Beep Beep, Your "+alarms[i]+" alarm has gone off.\n",
"Beep Beep Beep, Your "+alarms[i]+" alarm has gone off.\n",
"Beep Beep Beep, Your "+alarms[i]+" alarm has gone off.\n",
"Beep Beep Beep, Your "+alarms[i]+" alarm has gone off.\n",
});
offset_alarm = 0;
set_heart_beat(1);
}
}
last_time = the_time;
call_out("check_alarm",60);
}
void heart_beat() {
if (our_player)
our_player->event_say(this_object(), "The watch goes: "+
alarm_write[offset_alarm++]+"\n");
if (offset_alarm>sizeof(alarm_write))
set_heart_beat(0);
}
int move(object ob) {
int i;
i = ::move(ob);
our_player = environment();
return i;
}