Re: [OLC] [Dig Command]

From: Peter Ajamian (
Date: 09/07/00

Matthew Kuebbeler wrote:
>     case 'ne':
>     case 'NE':
>       dir = NORTHEAST;
>       break;
>     case 'nw':
>     case 'NW':
>       dir = NORTHWEST;
>       break;
>     case 'se':
>     case 'SE':
>       dir = SOUTHEAST;
>       break;
>     case 'sw':
>     case 'SW':
>       dir = SOUTHWEST;
>       break;

::mutters because someone re-invented the wheel, only he made it square
instead of round::

Well, unfortunately the snippets on Ceramic Mouse and the FTP site are
not checked for decent programming and many, even most are poorly
written and have to be fixed (and many practically re-written) to even
work anywhere except for the author's own MUD which it came out of.
Well, I'll skip the rest of the rant and get on with it...

The switch in this function is a hack, and one which only works for
stock directions.  There is a much better mechanism for getting a
direction from an arg and it is already built into the CircleMUD source,
with a little bit of modification it can work for diagonals as well.

The following is the modified do_dig from my own MUD, it will only work
if you used my directions snippet which is posted to Ceramic Mouse at it also has
added checks to make sure that both the rooms are in the zone of the
builder doing the dig, plus it logs the dig, plus it fixes a memory leak
and a possible seg fault in the original dig.

/* Only works if you have Oasis OLC */
extern void olc_add_to_save_list(int zone, byte type);

  char buf3[MAX_INPUT_LENGTH];
  int iroom = 0, rroom = 0;
  int dir = 0;
  /* struct room_data *room; */

  any_two_arg(argument, buf2, buf3);
  /* buf2 is the direction, buf3 is the room */
  iroom = atoi(buf3);
  rroom = real_room(iroom);

  if (!*buf3) {
    send_to_char("Format: dig <dir> <room number>\r\n", ch);
    return; }

  if (rroom <= 0) {
    sprintf(buf, "There is no room with the number %d", iroom);
    send_to_char(buf, ch);
    return; }

   * Everyone but IMPLs can only edit zones they have been assigned.
  if ((GET_LEVEL(ch) < LVL_IMPL) && (world[rroom].zone !=
       world[IN_ROOM(ch)].zone != GET_OLC_ZONE(ch))) {
    send_to_char("You do not have permission to edit this zone.\r\n",

/* Main stuff */
  if ((dir = search_block(buf2, dirs, FALSE)) == -1)
    if ((dir = search_block(buf2, abbr_dirs, FALSE)) == -1) {
      sprintf(buf, "Invalid direction %s.", buf2);
      send_to_char(buf, ch);
  if (!world[rroom].dir_option[rev_dir[dir]]) /* If statement to patch
                                                 apparent memory leak */
           struct room_direction_data,1);
  world[rroom].dir_option[rev_dir[dir]]->general_description = NULL;
  world[rroom].dir_option[rev_dir[dir]]->keyword = NULL;
  world[rroom].dir_option[rev_dir[dir]]->to_room = ch->in_room;

  if (!world[ch->in_room].dir_option[dir]) /* If statement to patch up
                                              memory leak */
    CREATE(world[ch->in_room].dir_option[dir], struct
  world[ch->in_room].dir_option[dir]->general_description = NULL;
  world[ch->in_room].dir_option[dir]->keyword = NULL;
  world[ch->in_room].dir_option[dir]->to_room = rroom;

  /* Only works if you have Oasis OLC */
  olc_add_to_save_list((iroom/100), OLC_SAVE_ROOM);

  sprintf(buf, "You make an exit %s to room %d.\r\n", dirs[dir], iroom);
  send_to_char(buf, ch);
  sprintf(buf, "OLC: %s dug an exit %s from room %d to room %d",
          dirs[dir], world[IN_ROOM(ch)].number, iroom);
  mudlog(buf, CMP, LVL_IMMORT, TRUE);

     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     |  |

This archive was generated by hypermail 2b30 : 04/11/01 PDT