Re: event driven code (question, not answer)

From: Chris Herringshaw (Chris.Herringshaw@med.umich.edu)
Date: 09/20/94


Well, it'd be too hard to cut and paste everything in the engine,
but I will be more than glad to summarize.  Everything I did and do
is unique (meaning I don't keep other source codes on my machine
to cut and paste code in from...I write it *all* myself, so it may
not be pretty...)

Okay here is how I have it set up:

I have one global event queue, which gets decremented each time a
loop pass is made.  If the timer on an event reaches zero, the
event is executed.  A typical event struct looks like this:

struct event_struct {
        int     (*event)();
        int     timer;
        long    chr;
        long    obj;
        long    vict;
        int     var1; 
        int     var2;
        char    *arg;
        struct  event_struct *this;
        struct  event_struct *next;
};


Every single command, skill, and spell is an event, and when one gets
executed, it is placed into an event envelope (like above), with
the appropriate timer value.  There are some additional variables
(var1 and var2) in case ones needs them.  When an event gets enveloped,
the function to be called (ie...PlayerMove, or SkillSneak) is placed
into the (*event)(); function pointer, along with the player
who invoked the event, the victim if any, etc.  From there on
it operates like a normal command.  The advantage of things like this 
is that you can have future events placed into the queue.  For example
an incoming thunderstorm can be placed into the event system, and when
the timer runs out, print a message like "You see dark clouds and hear
a low rumbling in the distance..."; reset the event timer to some
value, store the instance of the event, then process it again.

Clearer example:

void WeatherThunderstorm(blah blah blah)
{
static instance = 0;

switch (instance++) {
 
  case 1: ResetTimer(this, 1200) /* reset timer to 5 mins */
          print "Dark clouds and thunder far far away"
          break
  case 2: ResetTimer(this, 1200) /* reset timer to 5 mins */
          print "Dark clouds thunder, lightning in distance"
          break
  case 3: ResetTimer(this, 1200) /* reset timer to 5 mins */
          print "Ominous clouds, lightning heavy thunder closeby"
          break
  case 4: ResetTimer(this, 1200) /* reset timer to 5 mins */
          print "Nasty-ass storm has hit your area"
          TakeCareOfWeatherRoutine(LightStorm)
          break;
  case 5: ResetTimer(this, 1200) /* reset timer to 5 mins */
          print "Storm gets REALLY nasty..."
          TakeCareOfWeatherRoutine(NastyStorm)
          break;
  case 6: ResetTimer(this, 1200) /* reset timer to 5 mins */
          print "Storm is moving away..."
          TakeCareOfWeatherRoutine(LightStorm)
          break
  case 7: /* We don't reset timer so event will be killed */
          print "Storm moves far off to the south"
          TakeCareOfWeatherRoutine(Normal)
          break;
  default: LogProblem(or something like that)
           break;
 } /* switch*/
}


Well, here is a simple event which handles a 35 minute long
thunderstorm.  Same can be done with caravans, or bands of orcs
raiding a village, etc.  Hope this pseudo code proves usefull
to someone!

====================================================================
Christopher Herringshaw     Networking and Special Projects Division
Medical Center Information Technology (MCIT)   xxviper@med.umich.edu
University of Michigan Medical Center, B1911 CFOB
1414 Catherine Street, Ann Arbor, MI 48109-0704       (313) 747-2778
====================================================================

On Tue, 20 Sep 1994, Mathue Moyer wrote:

> >for a long time, I feel.  I've written an event driven MUD server,
> >and now I want to make it an event driven OO server. (gee, what fun you 
> >
> 
> Hullo...  I was just wondering if you might be willing to send me an
> example of your event driven code?  Or perhaps can point me to such
> examples available on the internet?  This is entirely for my own
> edification, and not for use in any muds.  I simply want to take a
> look at event-driven code so I can see how it's done.  If you'd
> rather not for any reason, feel free to say so, of course.  :)
> 
> -- 
> -Mathue Moyer
> -mathue@ucsd.edu
> 



This archive was generated by hypermail 2b30 : 12/07/00 PST