Snoop room

From: Mike Breuer (
Date: 11/09/01

----- Original Message -----
From: "George Greer" <greerga@CIRCLEMUD.ORG>

> Hm, "snoop room" sounds like an interesting command.  Makes me want to
> each room an output queue, where everything in that room then gets the
> output instead of just being per thing inside.  sigh

One of my favorite concepts from Java is that of listener objects.  An
object (such as a room) has a number of things it can report, and other
objects (such as characters) register an interest in listening to those
reports (events).  While it can be a little difficult to carry
object-oriented concepts into a procedural language like C, it is not
impossible.  Much of the object/listener concept could be accomplished using
callbacks.  For example:

#define ROOM_LISTENER(name) \
  void (name)(const char *msg, void *receiver)

struct room_listener_queue {
  void *receiver;
  struct room_listener_queue *next;

struct room_data {
+ struct room_listener_queue *listeners;

void add_room_listener(room_rnum room, void *receiver,
  struct room_listener_queue *queue;

  CREATE(queue, struct room_listener_queue, 1);
  queue->callback = callback;
  queue->receiver = receiver;

  queue->next = world[room].listeners;
  world[room].listeners = queue;

  struct descriptor_data *d = (struct descriptor_data *)receiver;

  SEND_TO_Q(msg, d);

Whenever a char enters a room:
add_room_listener(room, ch->desc, char_listener);

Then, things like act(..., TO_ROOM) can walk the listener queue instead of
the "people" list.  Obviously, there is some sanity checking and other
supporting functions (like remove_room_listener) that need to be added, but
this should be enough to get the concept across.  A structure like this
would make snooping trivial, although it would take a lot of work to make it
trivial.  :-)


   | FAQ: |
   | Archives: |

This archive was generated by hypermail 2b30 : 12/06/01 PST