Re: [CODE] Info Channel

From: James Turner (turnerjh@XTN.NET)
Date: 06/26/98


Ron Cole <rcole@EZY.NET> writes:

> >      if (TOROOM(TOROOM(rnum, i), rev_dir[i]) != rnum) {
>
> If there is no reverse exit, this will crash, or atleast return the wrong
> answer.
>
> >      if (TOROOM(rnum, i) == NOWHERE) {
> >        sprintf(retbuf + strlen(retbuf), "Room %d: door to the %s leads nowhere\r\n",
> >                world[rnum].number, dirs[i]);
>
> Isn't this not possible due to the VALID_EXIT check above?

Right on both counts.  Guess there weren't any rooms violating #1 in
my code, so a crash didn't catch it.  The other two take it into
account; just that one doesn't.  I'm fixing it up and adding other
problems.  I'll post it again in a few days.

ObCircle:

Here's a modification of the dig command.  Requires Oasis OLC 1.6.  It
will create the vnum of the room if it doesn't exist already, and it
works with diagonal directions.  Very hackish :)  It requires a slight
change to two olc functions as well.

void
redit_setup_new_quiet(DESCRIPTOR_DATA *d)
{
  OLC_ROOM(d) = (ROOM_DATA *)mud_calloc(1, sizeof(ROOM_DATA));

  OLC_ROOM(d)->name = mud_strdup("An unfinished room");
  OLC_ROOM(d)->description = mud_strdup("You are in an unfinished room.\r\n");
  OLC_VAL(d) = 0;
}

void
redit_setup_new(DESCRIPTOR_DATA *d)
{
  redit_setup_new_quiet(d);
  redit_disp_menu(d);
}

void
do_dig(CHAR_DATA *ch, char *argument, int cmd, int subcmd)
{
  char buf2[MAX_INPUT_LENGTH];
  char buf3[MAX_INPUT_LENGTH];
  char buf[MAX_INPUT_LENGTH];
  int iroom = 0, rroom = 0;
  int dir = 0;

  if (!ch->desc || IS_NPC(ch)) {
    send_to_char("Mobs can't dig!\r\n", ch);
    return;
  }

  two_arguments(argument, buf2, buf3);

  iroom = atoi(buf3);
  rroom = real_room(iroom);

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

  dir = search_block(buf2, short_dirs, FALSE);

  if (dir < 0) {
    send_to_char("That's not a valid direction\r\n", ch);
    return;
  }

  ch->desc->olc = NULL;

  if (rroom <= 0) {
    if ((iroom > 0) && (iroom < 32000)) {
      ch->desc->olc = (struct olc_data *) mud_malloc(sizeof(struct olc_data));
      OLC_NUM(ch->desc) = iroom;
      redit_setup_new_quiet(ch->desc);
      redit_save_internally(ch->desc);
      rroom = real_room(iroom);

      if (rroom <= 0) {
        send_to_char("ERROR making the new room!  Report this to Saga!\r\n", ch);
        cleanup_olc(ch->desc, CLEANUP_STRUCTS);
        return;
      }

      send_to_charf(ch, "Creating room %d...\r\n", iroom);
    }
    else {
      send_to_char("That's not a valid room to dig to or create!\r\n", ch);
      return;
    }
  }

  if (ch->desc->olc) OLC_ZNUM(ch->desc) = real_zone(iroom);

  world[rroom].dir_option[rev_dir[dir]] = (ROOM_DIRECTION_DATA *)mud_malloc(sizeof(ROOM_DIRECTION_DATA));

  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;

  world[ch->in_room].dir_option[dir] = (ROOM_DIRECTION_DATA *)mud_malloc(sizeof(ROOM_DIRECTION_DATA));

  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;

  olc_add_to_save_list(real_zone(iroom), OLC_SAVE_ROOM);
  olc_add_to_save_list(real_zone(rroom), OLC_SAVE_ROOM);

  sprintf(buf, "You make an exit %s to room %d.\r\n", buf2, iroom);
  send_to_char(buf, ch);
  if (ch->desc->olc) cleanup_olc(ch->desc, CLEANUP_STRUCTS);
}

Another ObCircle: Here's a command to find the next vnums in a given
zone.  Works well.  Yes it's inefficient as well, but it works.
One-shot commands can afford to be ineffecient :)

void
do_nextvnum(CHAR_DATA *ch, char *argument, int cmd, int subcmd)
{
  int fnum = -1, i;

  skip_spaces(argument);

  if (isdigit(*argument))
    fnum = atoi(argument);

  if (fnum <= 0 )
    fnum = (world[ch->in_room].number/100) * 100;

  for (i = fnum; real_zone(i) == real_zone(fnum); i++) {
    if (real_object(i) < 0) {
      send_to_charf(ch, "Next object  -- %4d\r\n", i);
      break;
    }
  }
  if (real_object(i) >= 0)
    send_to_char("Next object  -- none available\r\n", ch);

  for (i = fnum; real_zone(i) == real_zone(fnum); i++) {
    if (real_mobile(i) < 0) {
      send_to_charf(ch, "Next mob     -- %4d\r\n", i);
      break;
    }
  }
  if (real_mobile(i) >= 0)
    send_to_char("Next mob     -- none available\r\n", ch);

  for (i = fnum; real_zone(i) == real_zone(fnum); i++) {
    if (real_room(i) < 0) {
      send_to_charf(ch, "Next room    -- %4d\r\n", i);
      break;
    }
  }
  if (real_room(i) >= 0)
    send_to_char("Next room    -- none available\r\n", ch);

  for (i = fnum; real_zone(i) == real_zone(fnum); i++) {
    if (real_trigger(i) < 0) {
      send_to_charf(ch, "Next trigger -- %4d\r\n", i);
      break;
    }
  }
  if (real_trigger(i) >= 0)
    send_to_char("Next trigger -- none available\r\n", ch);

}

Chip

--
James Turner                turnerjh@xtn.net             UIN: 1102038
                            http://www.vuse.vanderbilt.edu/~turnerjh/


     +------------------------------------------------------------+
     | 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