Advertisement
Guest User

Untitled

a guest
Aug 18th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. ROOM_INDEX_DATA *generate_exit( ROOM_INDEX_DATA *in_room, EXIT_DATA *pexit )
  2. {
  3. EXIT_DATA *xit, *bxit;
  4. EXIT_DATA *orig_exit = (EXIT_DATA *) *pexit;
  5. ROOM_INDEX_DATA *room, *backroom;
  6. int brvnum;
  7. int serial;
  8. int roomnum;
  9. int distance = -1;
  10. int vdir = orig_exit->vdir;
  11. sh_int hash;
  12. bool found = FALSE;
  13.  
  14. if ( in_room->vnum > 32767 ) /* room is virtual */
  15. {
  16. serial = in_room->vnum;
  17. roomnum = in_room->tele_vnum;
  18. if ( (serial & 65535) == orig_exit->vnum )
  19. {
  20. brvnum = serial >> 16;
  21. --roomnum;
  22. distance = roomnum;
  23. }
  24. else
  25. {
  26. brvnum = serial & 65535;
  27. ++roomnum;
  28. distance = orig_exit->distance - 1;
  29. }
  30. backroom = get_room_index( brvnum );
  31. }
  32. else
  33. {
  34. int r1 = in_room->vnum;
  35. int r2 = orig_exit->vnum;
  36.  
  37. brvnum = r1;
  38. backroom = in_room;
  39. serial = (UMAX( r1, r2 ) << 16) | UMIN( r1, r2 );
  40. distance = orig_exit->distance - 1;
  41. roomnum = r1 < r2 ? 1 : distance;
  42. }
  43. hash = serial % 64;
  44. for ( room = vroom_hash[hash]; room; room = room->next )
  45. if ( room->vnum == serial && room->tele_vnum == roomnum )
  46. {
  47. found = TRUE;
  48. break;
  49. }
  50. if ( !found )
  51. {
  52. CREATE( room, ROOM_INDEX_DATA, 1 );
  53. room->area = in_room->area;
  54. room->vnum = serial;
  55. room->tele_vnum = roomnum;
  56. room->sector_type = in_room->sector_type;
  57. room->room_flags = in_room->room_flags;
  58. decorate_room( room );
  59. room->next = vroom_hash[hash];
  60. vroom_hash[hash] = room;
  61. ++top_vroom;
  62. }
  63. if ( !found || (xit=get_exit(room, vdir))==NULL )
  64. {
  65. xit = make_exit(room, orig_exit->to_room, vdir);
  66. xit->keyword = STRALLOC( "" );
  67. xit->description = STRALLOC( "" );
  68. xit->key = -1;
  69. xit->distance = distance;
  70. }
  71. if ( !found )
  72. {
  73. bxit = make_exit(room, backroom, rev_dir[vdir]);
  74. bxit->keyword = STRALLOC( "" );
  75. bxit->description = STRALLOC( "" );
  76. bxit->key = -1;
  77. if ( (serial & 65535) != orig_exit->vnum )
  78. bxit->distance = roomnum;
  79. else
  80. {
  81. EXIT_DATA *tmp = get_exit( backroom, vdir );
  82. int fulldist = tmp->distance;
  83. bxit->distance = fulldist - distance;
  84. }
  85. }
  86. (EXIT_DATA *) *pexit = xit;
  87. return room;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement