Re: Vehicles

From: Daniel A. Koepke (dkoepke@circlemud.org)
Date: 01/27/01


On Sat, 27 Jan 2001, Brian Hartvigsen wrote:

> What about doing it similar to a mount patch?  An IN_VEH(ch) check and
> VER_ID(ch) to see if characters are in the same vehicle.  It would
> require that you only have 1 of each Vehicle ID but it would stop the
> problem of people in other vehicles.  This would also keep you from
> having to extract them from the world list.

If IN_VEH(ch) is a pointer to the vehicle they're in, then IN_VEH(ch) can
have (a) a 'people' linked list -- you would need, however, a
next_in_vehicle pointer on the character, or make the object duplicate the
room code wherever necessary [at that point, it'd be better to just use a
separate room], or (b) be compared against another IN_VEH(ch) pointer to
see if the person is in the same room.

A better solution might be to create a special room, vehicle_room, where
anyone in a vehicle anywhere is placed, and setup a spec_proc on it to
catch all of the room-based commands.  You can then either handle them
specially, or move the player to IN_VEH(ch)->in_room, execute the command,
and move them back.

  SPECIAL(vehicles)
  {
    char buf[MAX_STRING_LENGTH];
    char arg[MAX_INPUT_LENGTH];
    struct char_data *ich;

    if (CMD_IS("look")) {
      if (AFF_FLAGGED(ch, AFF_BLIND))
        return (FALSE);

      one_argument(argument, arg);

      if (!str_cmp(arg, "out")) {
        act("You look out of $p . . .", FALSE, ch, IN_VEH(ch), 0, TO_CHAR);
        return (FALSE);
      }

      send_to_char(CCCYN(ch, C_NRM), ch);
      act("Inside of $p", FALSE, ch, IN_VEH(ch), 0, TO_CHAR);
      send_to_char(CCNRM(ch, C_NRM), ch);

      for (ich = ch->in_room->people; ich; ich = ich->next_in_room)
        if (ich != ch && IN_VEH(ich) == IN_VEH(ch) && CAN_SEE(ich))
          list_one_char(ich, ch);

      list_obj_to_char(obj->contains, ch, 2, TRUE);
      return (TRUE);
    } else if (CMD_IS("drop")) {
      /* drop adds it to the vehicle's contains rather than to the
       * room. */
    } else if (CMD_IS("get")) {
      /* from the rooms contains */
    } else if (...)
    .
    .
    .
  }

You get the idea.  That leaves the code nicely encapsulated and general.


-dak

--
   +---------------------------------------------------------------+
   | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
   | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
   +---------------------------------------------------------------+



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