Re: Previous: Room Traps

From: Daniel Koepke (dkoepke@CALIFORNIA.COM)
Date: 05/22/98


On Fri, 22 May 1998, Chuck Carson wrote:

->of him has a spec_proc assigned and is room flagged
->ROOM_HASTRAP, how could I lookup what spec_proc the
->room has assigned and how would I execute it (as well
->as pass arguments to it)?

Although it's not politcally correct to do so, any longer, I'm going
to say, "RTFC."  I took a look into the room_data structure, and
lo-and-behold, there is a SPECIAL(*func) -- a pointer to a the special
procedure function!  We could then do,

  /* we want to do the check to the room the person is going to? */
  if (ROOM_FLAGGED(EXIT(ch, dir)->to_room, ROOM_HASTRAP)) {
    int spec_room = EXIT(ch, dir)->to_room;
    if (GET_ROOM_SPEC(spec_room) != NULL)
      (GET_ROOM_SPEC(spec_room) (ch, world+spec_room, 0, 0));
  }

If we want to check _what_ the spec-proc is, that is easily
accomplished by,

  SPECIAL(my_trap_fun);

  if (GET_ROOM_SPEC(spec_room) == my_trap_fun) {
  }

But, is it _really_ necessary to do this _here_?  I don't think so.
Room special procedures are called on commands -- including movement,
so you don't gain anything from all this code except a more direct
path to the room with the special procedure.

  SPECIAL(move_trap)
  {
    /* trap on the north exit */
    if (!CMD_IS("north"))
      return FALSE;

    /* perform the movement */
    perform_move(ch, cmd - 1, 0);

    /* ehh -- it'd be bad if the player just moved into a DT ... */
    send_to_char("Ahh!  A trap ...\r\n", ch);
    act("$n just got snagged by a trap!", FALSE, ch, 0, 0, TO_ROOM);
    .
    .
    .
    return TRUE;
  }

This trap works as one on a doorway, so going through the exit results
in the trap being set off.  The person makes it to the otherside of
the doorway, but the trap is set off in the process of going through
the door and they suffer whatever ill-effects you had planned for the
trap.  Note that you don't need a ROOM_ flag for this at all.

The only limitation I can see right now is that exiting from the room
through the trapped door will set off the trap, but not entering
through that door.

But, I wouldn't really do this with spec-procs.  It seems like it'd be
much easier and make much more sense to just have types of traps that
you can set in rooms.  It'd take a few new variables.  The upside,
however, is that you can allow players to set and disarm traps
wherever they wish, and implementing new trap types (especially ones
that just damage the victim and give a spiffy message) can be made an
online job for the builders.  Maybe a few days worth of hacking away.

-dak


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



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