home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / main / ksegsel.c < prev    next >
C/C++ Source or Header  |  1998-06-08  |  6KB  |  241 lines

  1. /*
  2.  * $Source: f:/miner/source/main/editor/rcs/ksegsel.c $
  3.  * $Revision: 2.0 $
  4.  * $Author: john $
  5.  * $Date: 1995/02/27 11:35:33 $
  6.  *
  7.  * Functions for selecting segments
  8.  *
  9.  * $Log: ksegsel.c $
  10.  * Revision 2.0  1995/02/27  11:35:33  john
  11.  * Version 2.0! No anonymous unions, Watcom 10.0, with no need
  12.  * for bitmaps.tbl.
  13.  * 
  14.  * Revision 1.12  1994/08/25  21:57:02  mike
  15.  * IS_CHILD stuff.
  16.  * 
  17.  * Revision 1.11  1994/05/23  14:48:35  mike
  18.  * make current segment be add segment.
  19.  * 
  20.  * Revision 1.10  1993/12/06  19:33:43  yuan
  21.  * Fixed autosave stuff so that undo restores Cursegp and
  22.  * Markedsegp
  23.  * 
  24.  * Revision 1.9  1993/12/02  12:39:37  matt
  25.  * Removed extra includes
  26.  * 
  27.  * Revision 1.8  1993/11/12  13:08:17  yuan
  28.  * Fixed warning for concave segment so it appears after any
  29.  * "less important" diagnostic messages.
  30.  * 
  31.  * Revision 1.7  1993/11/05  17:32:49  john
  32.  * added funcs
  33.  * .,
  34.  * 
  35.  * Revision 1.6  1993/11/01  09:53:18  mike
  36.  * Write functions get_next_segment and get_previous_segment.
  37.  * 
  38.  * Revision 1.5  1993/10/31  18:06:56  mike
  39.  * Only set_view_target_from_segment if in that mode.
  40.  * 
  41.  * Revision 1.4  1993/10/28  15:01:09  matt
  42.  * Mucked with update flags
  43.  * 
  44.  * Revision 1.3  1993/10/14  18:07:47  mike
  45.  * Change use of CONNECTIVITY to MAX_SIDES_PER_SEGMENT
  46.  * 
  47.  * Revision 1.2  1993/10/14  11:47:34  john
  48.  * *** empty log message ***
  49.  * 
  50.  * Revision 1.1  1993/10/13  18:53:39  john
  51.  * Initial revision
  52.  * 
  53.  *
  54.  */
  55.  
  56. #pragma off (unreferenced)
  57. static char rcsid[] = "$Id: ksegsel.c 2.0 1995/02/27 11:35:33 john Exp $";
  58. #pragma on (unreferenced)
  59.  
  60. #include <string.h>
  61.  
  62. #include "inferno.h"
  63. #include "editor.h"
  64.  
  65.  
  66. // ---------------------------------------------------------------------------------------
  67. // Select previous segment.
  68. //    If there is a connection on the side opposite to the current side, then choose that segment.
  69. // If there is no connecting segment on the opposite face, try any segment.
  70. void get_previous_segment(int curseg_num, int curside,int *newseg_num, int *newside)
  71. {
  72.     int     s;
  73.  
  74.     *newseg_num = curseg_num;
  75.  
  76.     if (IS_CHILD(Segments[curseg_num].children[Side_opposite[curside]]))
  77.         *newseg_num = Segments[curseg_num].children[Side_opposite[curside]];
  78.     else        // no segment on opposite face, connect to anything
  79.         for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
  80.             if ((s != curside) && IS_CHILD(Segments[curseg_num].children[s]))
  81.                 *newseg_num = Segments[curseg_num].children[s];
  82.  
  83.     // Now make Curside point at the segment we just left (unless we couldn't leave it).
  84.     if (*newseg_num != curseg_num)
  85.         *newside = find_connect_side(&Segments[curseg_num],&Segments[*newseg_num]);
  86.     else
  87.         *newside = curside;
  88. }
  89.  
  90.  
  91. // --------------------------------------------------------------------------------------
  92. // Select next segment.
  93. //    If there is a connection on the current side, then choose that segment.
  94. // If there is no connecting segment on the current side, try any segment.
  95. void get_next_segment(int curseg_num, int curside, int *newseg_num, int *newside)
  96. {
  97.     int    s;
  98.  
  99.     if (IS_CHILD(Segments[curseg_num].children[curside])) {
  100.  
  101.         *newseg_num = Segments[curseg_num].children[Curside];
  102.  
  103.         // Find out what side we came in through and favor side opposite that
  104.         *newside = Side_opposite[find_connect_side(&Segments[curseg_num],&Segments[*newseg_num])];
  105.  
  106.         // If there is nothing attached on the side opposite to what we came in (*newside), pick any other side
  107.         if (!IS_CHILD(Segments[*newseg_num].children[*newside]))
  108.             for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
  109.                 if ((Segments[*newseg_num].children[s] != curseg_num) && IS_CHILD(Segments[*newseg_num].children[s]))
  110.                     *newside = s;
  111.     } else {
  112.         *newseg_num = curseg_num;
  113.         *newside = curside;
  114.     }
  115.  
  116. }
  117.  
  118. // ---------- select current segment ----------
  119. int SelectCurrentSegForward()
  120. {
  121.     int    newseg_num,newside;
  122.  
  123.     get_next_segment(Cursegp-Segments,Curside,&newseg_num,&newside);
  124.  
  125.     if (newseg_num != Cursegp-Segments) {
  126.         Cursegp = &Segments[newseg_num];
  127.         Curside = newside;
  128.         Update_flags |= UF_ED_STATE_CHANGED;
  129.         if (Lock_view_to_cursegp)
  130.             set_view_target_from_segment(Cursegp);
  131.  
  132.         med_create_new_segment_from_cursegp();
  133.         mine_changed = 1;
  134.     }
  135.  
  136.     return 1;
  137. }
  138.  
  139. // -------------------------------------------------------------------------------------
  140. int SelectCurrentSegBackward()
  141. {
  142.     int    newseg_num,newside;
  143.  
  144.     get_previous_segment(Cursegp-Segments,Curside,&newseg_num,&newside);
  145.  
  146.     Cursegp = &Segments[newseg_num];
  147.     Curside = newside;
  148.  
  149.     if (Lock_view_to_cursegp)
  150.         set_view_target_from_segment(Cursegp);
  151.     Update_flags |= UF_ED_STATE_CHANGED;
  152.     mine_changed = 1;
  153.     med_create_new_segment_from_cursegp();
  154.  
  155.     return 1;
  156. }
  157.  
  158.  
  159. // ---------- select next/previous side on current segment ----------
  160. int SelectNextSide()
  161. {
  162.     if (++Curside >= MAX_SIDES_PER_SEGMENT)
  163.         Curside = 0;
  164.     Update_flags |= UF_ED_STATE_CHANGED;
  165.     mine_changed = 1;
  166.     return 1;
  167. }
  168.  
  169. int SelectPrevSide()
  170. {
  171.     if (--Curside < 0)
  172.         Curside = MAX_SIDES_PER_SEGMENT-1;
  173.     Update_flags |= UF_ED_STATE_CHANGED;
  174.     mine_changed = 1;
  175.     return 1;
  176. }
  177.  
  178. //  ---------- Copy current segment and side to marked segment and side ----------
  179.  
  180. int CopySegToMarked()
  181. {
  182.    autosave_mine(mine_filename);
  183.    strcpy(undo_status[Autosave_count], "Mark Segment UNDONE.");
  184.     Markedsegp = Cursegp;
  185.     Markedside = Curside;
  186.     Update_flags |= UF_ED_STATE_CHANGED;
  187.     mine_changed = 1;
  188.     return 1;
  189. }
  190.  
  191. // ---------- select absolute face on segment ----------
  192.  
  193. int SelectBottom()
  194. {
  195.     Curside = WBOTTOM;
  196.     Update_flags |= UF_ED_STATE_CHANGED;
  197.     mine_changed = 1;
  198.     return 1;
  199. }
  200.  
  201. int SelectFront()
  202. {
  203.     Curside = WFRONT;
  204.     Update_flags |= UF_ED_STATE_CHANGED;
  205.     mine_changed = 1;
  206.     return 1;
  207. }
  208.  
  209. int SelectTop()
  210. {
  211.     Curside = WTOP;
  212.     Update_flags |= UF_ED_STATE_CHANGED;
  213.     mine_changed = 1;
  214.     return 1;
  215. }
  216.  
  217. int SelectBack()
  218. {
  219.     Curside = WBACK;
  220.     Update_flags |= UF_ED_STATE_CHANGED;
  221.     mine_changed = 1;
  222.     return 1;
  223. }
  224.  
  225. int SelectLeft()
  226. {
  227.     Curside = WLEFT;
  228.     Update_flags |= UF_ED_STATE_CHANGED;
  229.     mine_changed = 1;
  230.     return 1;
  231. }
  232.  
  233. int SelectRight()
  234. {
  235.     Curside = WRIGHT;
  236.     Update_flags |= UF_ED_STATE_CHANGED;
  237.     mine_changed = 1;
  238.     return 1;
  239. }
  240.  
  241.