On Sat, 28 Sep 1996, Homer Simpson wrote:
> Hiya all,
> I would like to make a new type of door. Here's how it would
> work. It starts closed. If it's opened, it will stay open for 2 seconds
> then automatically close again. Any ideas on how I can do this?
Well, I am using some event driven code that I coded some while ago which
makes it incredibly easy to do something like this, but it's still
possible without events.
The way I would do would be to make a linked list like:
struct auto_close_door_llist {
room_num in_room;
byte dir;
byte time_left;
struct auto_close_door_llist *next;
};
Then implement a new door flag (EX_TIMED). In the function that does
heartbeat handling in comm.c:
/* Put these at the top of the function */
extern struct auto_close_door_llist *Timed_Doors;
struct auto_close_door_llist *td, *temp;
struct room_exit_data *dr; /* !! See Note Below !! */
if (!(pulse % PULSE_PER_SECOND)) /* !! See Note Below !! */
if (Timed_Doors)
for (td = Timed_Doors; td; td = td->next) {
dr = world[td->in_room].dir_option[td->dir];
if (dr && IS_SET(dr->exit_info, EX_TIMED) &&
!IS_SET(dr->exit_info, EX_CLOSED)) {
SET_BIT(dr->exit_info, EX_CLOSED);
sprintf(buf, "A door to the %s closes.\r\n", dirs[dir]);
send_to_room(buf, td->in_room);
}
REMOVE_FROM_LIST(td, Timed_Doors, next);
}
You'll also need to define the global linked list in act.movement.c and in
that same file check if the door being opened is set EX_TIMED and if so
add it to the linked list. Furthermore, you should remove them when timed
exits are closed by the CLOSE command.
NOTE: I've not looked at the Circle code in at least a month, this is all
done from memory. Nor have I ever implemented anything like this so this
is just how I think it would work. I use a linked lists which is not
always neccessary, however, in this implementation I think it's best to
have a dynamic list. A few of the things in the enclosed snippets may not
be correct for CircleMUD. I cannot tell you what you must do here or
there. If there's a great amount of demand, however, I will create a
patch for this. Also, I'll upload a fix for my do_who patch. Maybe do a
few more patches, too.
<*=-+Daniel+-=*>
+-----------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://cspo.queensu.ca/~fletcher/Circle/list_faq.html |
+-----------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/18/00 PST