Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ROOM_INDEX_DATA *generate_exit( ROOM_INDEX_DATA *in_room, EXIT_DATA *pexit )
- {
- EXIT_DATA *xit, *bxit;
- EXIT_DATA *orig_exit = (EXIT_DATA *) *pexit;
- ROOM_INDEX_DATA *room, *backroom;
- int brvnum;
- int serial;
- int roomnum;
- int distance = -1;
- int vdir = orig_exit->vdir;
- sh_int hash;
- bool found = FALSE;
- if ( in_room->vnum > 32767 ) /* room is virtual */
- {
- serial = in_room->vnum;
- roomnum = in_room->tele_vnum;
- if ( (serial & 65535) == orig_exit->vnum )
- {
- brvnum = serial >> 16;
- --roomnum;
- distance = roomnum;
- }
- else
- {
- brvnum = serial & 65535;
- ++roomnum;
- distance = orig_exit->distance - 1;
- }
- backroom = get_room_index( brvnum );
- }
- else
- {
- int r1 = in_room->vnum;
- int r2 = orig_exit->vnum;
- brvnum = r1;
- backroom = in_room;
- serial = (UMAX( r1, r2 ) << 16) | UMIN( r1, r2 );
- distance = orig_exit->distance - 1;
- roomnum = r1 < r2 ? 1 : distance;
- }
- hash = serial % 64;
- for ( room = vroom_hash[hash]; room; room = room->next )
- if ( room->vnum == serial && room->tele_vnum == roomnum )
- {
- found = TRUE;
- break;
- }
- if ( !found )
- {
- CREATE( room, ROOM_INDEX_DATA, 1 );
- room->area = in_room->area;
- room->vnum = serial;
- room->tele_vnum = roomnum;
- room->sector_type = in_room->sector_type;
- room->room_flags = in_room->room_flags;
- decorate_room( room );
- room->next = vroom_hash[hash];
- vroom_hash[hash] = room;
- ++top_vroom;
- }
- if ( !found || (xit=get_exit(room, vdir))==NULL )
- {
- xit = make_exit(room, orig_exit->to_room, vdir);
- xit->keyword = STRALLOC( "" );
- xit->description = STRALLOC( "" );
- xit->key = -1;
- xit->distance = distance;
- }
- if ( !found )
- {
- bxit = make_exit(room, backroom, rev_dir[vdir]);
- bxit->keyword = STRALLOC( "" );
- bxit->description = STRALLOC( "" );
- bxit->key = -1;
- if ( (serial & 65535) != orig_exit->vnum )
- bxit->distance = roomnum;
- else
- {
- EXIT_DATA *tmp = get_exit( backroom, vdir );
- int fulldist = tmp->distance;
- bxit->distance = fulldist - distance;
- }
- }
- (EXIT_DATA *) *pexit = xit;
- return room;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement