You could.. or you could just write a function to renumber an area.

(Works on my mud, you WILL need to change it to work on yours)

void do_renumber(CHAR_DATA *ch, char *argument)
{
   extern int port;
   char arg[MSL];
   char test[1];
   long base, difference, vnum, room;
   AREA_DATA *pArea;

   if (port == 1536 || port == 1538){
      ptc(ch, "This command cannot be used on live or build.\n\r");
            return;
   }

   if (IS_WILDERNESS(ch->in_room)){
      ptc(ch, "Not in the wilderness.\n\r");
      return;
   }

   test[0]=1;
   if (argument[0] == 0 || arg[0] == 0){
      ptc(ch, "Syntax: renumber <min vnum>\n\r");
      return;
   }

   if (atol(argument) == 0){
      ptc(ch, "Sorry, not supporting 0 as an argument.\n\r");
      return;
   }
     base  = atol(argument);
           do_links(ch, test);

   if (test[0] == 'Y'){
      ptc(ch, "Cannot renumber areas with links.\n\r");
      return;
   }

   for (pArea = area_first; pArea; pArea = pArea->next){
      if (pArea->min_vnum <= base && pArea->max_vnum >=base){
         ptc(ch, "Area '%s' conflicts with base vnum.\n\r",
pArea->file_name);
         return;
      }
   }

   difference = base - ch->in_room->area->min_vnum;
   room = ch->in_room->vnum + difference;
   /* renumber rooms */
   for (vnum = ch->in_room->area->min_vnum;
vnum<ch->in_room->area->max_vnum; vnum++){
      ROOM_INDEX_DATA *r;
      OBJ_INDEX_DATA  *o;
      MOB_INDEX_DATA  *m;
      PROG_LIST  *mplist;
      PROG_CODE  *mpcode;
      RESET_DATA  *reset;
      EXIT_DATA *exits;
      int i;
      r = pRoomArray[vnum];
      if (r){
         pRoomArray[vnum + difference] = r;
         pRoomArray[vnum + difference]->vnum += difference;
         /* and do the resets */
         for ( reset = get_room_reset(pRoomArray[vnum+difference]); reset;
reset = reset->next ){
            reset->arg1 += difference;
            reset->arg3 += difference;
         }
         pRoomArray[vnum] = NULL;
         /* go through the exits, change keys! */
         for (i=0; i<MAX_DIR; i++){
            exits = get_exit(0, r, i);
            if (!exits) continue;
            if (exits->key>0){
               if (exits->key >= ch->in_room->area->min_vnum && exits->key
<= ch->in_room->area->max_vnum)
                 exits->key+=difference;
            }
         }
      }

      /* renumber the object */
      o = pObjArray[vnum];
      if (o){
         pObjArray[vnum + difference] = o;
         pObjArray[vnum + difference]->vnum += difference;
         pObjArray[vnum] = NULL;
         if (o->item_type == ITEM_PORTAL){
            if (o->value[3] >= ch->in_room->area->min_vnum && o->value[3] <=
ch->in_room->area->max_vnum)
              o->value[3]+=difference;
         }
      }

      /* renumber the mob */
      m = pMobArray[vnum];
      if (m){
         pMobArray[vnum + difference] = m;
         pMobArray[vnum + difference]->vnum += difference;
         /* mprog list */
         for (mplist = pMobArray[vnum+difference]->mprogs; mplist != NULL;
mplist = mplist->next)
           mplist->vnum += difference;

         /* shop time */
         if (pMobArray[vnum+difference]->pShop)
           pMobArray[vnum+difference]->pShop->keeper += difference;

         pMobArray[vnum] = NULL;
            }

      /* renumber mob progs */
      mpcode = pMprogArray[vnum];
      if (mpcode){
         pMprogArray[vnum + difference] = mpcode;
         pMprogArray[vnum + difference]->vnum += difference;
         pMprogArray[vnum] = NULL;
      }
   }
   /*now make area changes */
   ch->in_room->area->min_vnum += difference;
   ch->in_room->area->max_vnum += difference;

   ch->in_room = pRoomArray[room];
   ptc(ch, "Done. Base vnum of '%s' is %ld.\n\r", ch->in_room->area->name,
base);
   ptc(ch, "Saving the world....\n\r");
   process_output(ch->desc, FALSE);
     do_asave(ch, "world");
}

/* this function will go through the current areas vnums and report what
 * vnums have links to other areas */
void do_links (CHAR_DATA *ch, char *argument)
{

   long i;
   sh_int exits;
   EXIT_DATA *pexit;
   OBJ_DATA *obj;
   bool passed = TRUE;
   if (IS_WILDERNESS(ch->in_room)){
      ptc(ch, "Not used in the wilderness\n\r");
      return;
   }

     if (argument[0]==0)
         /* command executed 
            * Not 0 means it was passed from another command, like renumber
*/
         passed=FALSE;

   for (i=ch->in_room->area->min_vnum; i<=ch->in_room->area->max_vnum; i++){
      /* check for the room */
      if (pRoomArray[i]){
         for(exits=0; exits<MAX_DIR; exits++){
            pexit = get_exit(ch, pRoomArray[i], exits);
                if (!pexit) continue;
                if (pexit->u1.to_room->vnum < ch->in_room->area->min_vnum ||
                        pexit->u1.to_room->vnum >
ch->in_room->area->max_vnum){
                     if (!passed)
                         ptc(ch, "Room %ld links to %ld [%s].\n\r", i,
pexit->u1.to_room->vnum,  dir_name[exits]);
                     else
                         argument[0]='Y';
                }
         }
                if (!passed){
                   for (obj = get_room_objs(pRoomArray[i]); obj; obj =
obj->next_content){
                      if (obj->item_type == ITEM_PORTAL){
                         if (obj->value[3] < ch->in_room->area->min_vnum ||
                             obj->value[3] > ch->in_room->area->max_vnum){
                            ptc(ch, "Room %ld has a portal to %ld.\n\r", i,
obj->value[3]);
                         }
                         
                      }  
                   }
                }
      }
   }
}

> -----Original Message-----
> From: Matthew Kerwin [mailto:[EMAIL PROTECTED]
> Sent: Monday, January 07, 2002 11:02 AM
> To: [email protected]
> Subject: New VNums
> 
> 
> It's late, I'm tired, and I haven't touched my little ROM for 
> a few months. 
> That said, I was just about to head to bed when I had an 
> idea. You know how 
> there are (probably) several really groovy little non-stock 
> area files 
> floating around there, right? And like some of them more than 
> likely have 
> overlapping VNums, right? Which means the person who uses 
> them has to go 
> through and change every single number in the file.. would it 
> be feasible to 
> use relative numbers? Like if I had a little area that had a 
> little mob in a 
> little room with a little sword, I could assign them all as '0' (or 
> whatever), and then whoever downloads my little area could simply set 
> somewhere the 'add the vnum to this base' number, to get a 
> totally unique id 
> for each thingy.
> 
> I know that could potentially make saving pfiles annoying if 
> you're in the 
> habit of continually adding/removing/changing area files, but 
> then again 
> it's already annoying isn't it?
> 
> Matty
> Brainstorming too late on too little Coke
> -----
> I'm not dead.
> 
> _________________________________________________________________
> Chat with friends online, try MSN Messenger: http://messenger.msn.com
> 
> 
> -- 
> ROM mailing list
> [email protected]
> http://www.rom.org/cgi-bin/mailman/listinfo/rom
> 

Reply via email to