On Tue, 2 Apr 1996, Daniel Muller wrote: > So basically what I need to know, is how could I get a command > to wait 30 seconds, check for the status of the victims flag > and if the flag is on teleport the victim to a battle room, or > if it is off, the whole thing abort and game play continue normally. Here's a simple way to add an event system, its a little hairy to code if your not familiar with linked lists, but the concept is easy and you should be able to tweak it to suit your needs... You need: An event_data structure... I use: struct event_data { struct char_data *ch; /* char this event happens to */ int cmd; /* command number */ char *args; /* typed in args */ int count; /* pulses to event completion */ struct event_data *next; /* next command event in list */ }; A global linked list of events waiting to happen. A fuction, event_activity(), to execute or disrupt the events. Now, inside of commands, ACMD(whatever), that I want to be delayed, I call them with SCMD_DELAY (which I have defined as 0, which is the default), If the subcmd is SCMD_DELAY, I'll call a function called add_event() using args that are already available inside of the command's function like ch, cmd and argument, then I just give it a timer for how long until the event is supposed to be executed and return. If the subcmd is not SCMD_DELAY (which means it got called from event_activity) then I assume the event is up and just execute the command normally. The function event_activity() is called from comm.c, along with the rest of the PULSE stuff like mobile_activity(), every second and just cycles the event_list and checks if any should be executed, if so, it calls the cmd and removes the event from the queue. Here's what my event_activity() function looks like... void event_activity(void) { struct event_data *event, *temp; int i; for (event = event_list, i=0; i<event_top; ++i) { --event->count; if (event->count < 1) { ((*cmd_info[event->cmd].command_pointer) (event->ch, event->line, event->cmd, SCMD_EXECUTE)); REMOVE_FROM_LIST(event, event_list, next); --event_top; } event = event->next; } } Not sure if this response was actually helpful, or just confusing... :) Goodluck, -Skylar
This archive was generated by hypermail 2b30 : 12/18/00 PST