home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / main / kbuild.c < prev    next >
Text File  |  1998-06-08  |  8KB  |  270 lines

  1. /*
  2.  * $Source: f:/miner/source/main/editor/rcs/kbuild.c $
  3.  * $Revision: 2.0 $
  4.  * $Author: john $
  5.  * $Date: 1995/02/27 11:35:43 $
  6.  *
  7.  * Functions for building parts of mines.
  8.  *
  9.  * $Log: kbuild.c $
  10.  * Revision 2.0  1995/02/27  11:35:43  john
  11.  * Version 2.0! No anonymous unions, Watcom 10.0, with no need
  12.  * for bitmaps.tbl.
  13.  * 
  14.  * Revision 1.20  1995/02/22  11:00:47  yuan
  15.  * prototype include.
  16.  * 
  17.  * Revision 1.19  1995/02/22  10:59:01  yuan
  18.  * Save sloppy mine before punching.
  19.  * 
  20.  * Revision 1.18  1994/08/25  21:57:56  mike
  21.  * IS_CHILD stuff.
  22.  * 
  23.  * Revision 1.17  1994/05/16  12:00:52  mike
  24.  * Call med_combine_duplicate_vertices before various build functions.
  25.  * 
  26.  * Revision 1.16  1994/05/09  23:34:31  mike
  27.  * Punch all sloppy sides in a group.
  28.  * 
  29.  * Revision 1.15  1994/02/16  15:23:06  yuan
  30.  * Checking in for editor make.
  31.  * 
  32.  * Revision 1.14  1994/01/21  12:01:31  yuan
  33.  * Added clearer editor_status messages (sloppy joint vs. joint)
  34.  * 
  35.  * Revision 1.13  1994/01/14  11:59:52  yuan
  36.  * New function in build menu. 
  37.  * "Punch" through walls to force a joint formation with
  38.  * closest segment:side, if the closest segment:side allows
  39.  * a connection.
  40.  * 
  41.  * Revision 1.12  1994/01/07  17:45:05  yuan
  42.  * Just changed some tabs and formatting I believe.
  43.  * 
  44.  * Revision 1.11  1993/12/06  19:33:36  yuan
  45.  * Fixed autosave stuff so that undo restores Cursegp and
  46.  * Markedsegp
  47.  * 
  48.  * Revision 1.10  1993/12/02  12:39:15  matt
  49.  * Removed extra includes
  50.  * 
  51.  * Revision 1.9  1993/11/12  14:31:31  yuan
  52.  * Added warn_if_concave_segments.
  53.  * 
  54.  * Revision 1.8  1993/11/11  17:12:45  yuan
  55.  * Fixed display of messages, so that concave segment
  56.  * warning doesn't wipe them out immediately.
  57.  * 
  58.  * Revision 1.7  1993/11/09  12:09:28  mike
  59.  * Remove extern for mine_filename, put it in editor.h
  60.  * 
  61.  * Revision 1.6  1993/11/08  19:14:06  yuan
  62.  * Added Undo command (not working yet)
  63.  * 
  64.  * Revision 1.5  1993/11/05  17:32:36  john
  65.  * added funcs
  66.  * .,
  67.  * 
  68.  * Revision 1.4  1993/11/01  16:53:51  mike
  69.  * Add CreateAdjacentJointsSegment and CreateAdjacentJointsAll
  70.  * 
  71.  * Revision 1.3  1993/11/01  11:24:59  mike
  72.  * Add CreateJointAdjacent
  73.  * 
  74.  * Revision 1.2  1993/10/29  19:13:11  yuan
  75.  * Added diagnostic messages
  76.  * 
  77.  * Revision 1.1  1993/10/13  18:53:27  john
  78.  * Initial revision
  79.  * 
  80.  *
  81.  */
  82.  
  83. #pragma off (unreferenced)
  84. static char rcsid[] = "$Id: kbuild.c 2.0 1995/02/27 11:35:43 john Exp $";
  85. #pragma on (unreferenced)
  86.  
  87. #include <string.h>
  88.  
  89. #include "inferno.h"
  90. #include "editor.h"
  91. #include "gameseg.h"
  92. #include "gamesave.h"
  93. #include "mono.h"
  94.  
  95. //  ---------- Create a bridge segment between current segment/side and marked segment/side ----------
  96. int CreateBridge()
  97. {
  98.     if (!med_form_bridge_segment(Cursegp,Curside,Markedsegp,Markedside)) {
  99.         Update_flags |= UF_WORLD_CHANGED;
  100.         mine_changed = 1;
  101.         autosave_mine(mine_filename);
  102.         diagnostic_message("Bridge segment formed.");
  103.         strcpy(undo_status[Autosave_count], "Bridge segment UNDONE.");
  104.         warn_if_concave_segments();
  105.     }
  106.     return 1;
  107. }
  108.  
  109.  
  110.  
  111. // ---------- Form a joint between current segment:side and marked segment:side, modifying marked segment ----------
  112. int FormJoint()
  113. {
  114.     if (!Markedsegp)
  115.         diagnostic_message("Marked segment not set -- unable to form joint.");
  116.     else {
  117.         if (!med_form_joint(Cursegp,Curside,Markedsegp,Markedside)) {
  118.             Update_flags |= UF_WORLD_CHANGED;
  119.             mine_changed = 1;
  120.             autosave_mine(mine_filename);
  121.             diagnostic_message("Joint formed.");
  122.             strcpy(undo_status[Autosave_count], "Joint undone.");
  123.                 warn_if_concave_segments();
  124.         }
  125.     }
  126.  
  127.     return 1;
  128.  
  129. }
  130.  
  131. //  ---------- Create a bridge segment between current segment:side adjacent segment:side ----------
  132. int CreateAdjacentJoint()
  133. {
  134.     int        adj_side;
  135.     segment    *adj_sp;
  136.  
  137.     if (med_find_adjacent_segment_side(Cursegp, Curside, &adj_sp, &adj_side)) {
  138.         if (Cursegp->children[Curside] != adj_sp-Segments) {
  139.             med_form_joint(Cursegp,Curside,adj_sp,adj_side);
  140.             Update_flags |= UF_WORLD_CHANGED;
  141.             mine_changed = 1;
  142.          autosave_mine(mine_filename);
  143.          diagnostic_message("Joint segment formed.");
  144.          strcpy(undo_status[Autosave_count], "Joint segment undone.");
  145.             warn_if_concave_segments();
  146.         } else
  147.             editor_status("Attempted to form joint through connected side -- joint segment not formed (you bozo).");
  148.     } else
  149.         editor_status("Could not find adjacent segment -- joint segment not formed.");
  150.  
  151.     return 1;
  152. }
  153.  
  154. //  ---------- Create a bridge segment between current segment:side adjacent segment:side ----------
  155. int CreateSloppyAdjacentJoint()
  156. {
  157.     int        adj_side;
  158.     segment    *adj_sp;
  159.  
  160.     save_level("SLOPPY.LVL");
  161.  
  162.     if (med_find_closest_threshold_segment_side(Cursegp, Curside, &adj_sp, &adj_side, 20*F1_0)) {
  163.         if (Cursegp->children[Curside] != adj_sp-Segments) {
  164.             if (!med_form_joint(Cursegp,Curside,adj_sp,adj_side))
  165.                 {
  166.                 Update_flags |= UF_WORLD_CHANGED;
  167.                 mine_changed = 1;
  168.              autosave_mine(mine_filename);
  169.              diagnostic_message("Sloppy Joint segment formed.");
  170.              strcpy(undo_status[Autosave_count], "Sloppy Joint segment undone.");
  171.                 warn_if_concave_segments();
  172.                 }
  173.             else editor_status("Couldn't form sloppy joint.\n");
  174.         } else
  175.             editor_status("Attempted to form sloppy joint through connected side -- joint segment not formed (you bozo).");
  176.     } else
  177.         editor_status("Could not find close threshold segment -- joint segment not formed.");
  178.  
  179.     return 1;
  180. }
  181.  
  182.  
  183. //  -------------- Create all sloppy joints within CurrentGroup ------------------
  184. int CreateSloppyAdjacentJointsGroup()
  185. {
  186.     int        adj_side;
  187.     segment    *adj_sp;
  188.     int        num_segs = GroupList[Current_group].num_segments;
  189.     short        *segs = GroupList[Current_group].segments;
  190.     segment    *segp;
  191.     int        done_been_a_change = 0;
  192.     int        segind, sidenum;
  193.  
  194.     for (segind=0; segind<num_segs; segind++) {
  195.         segp = &Segments[segs[segind]];
  196.  
  197.         for (sidenum=0; sidenum < MAX_SIDES_PER_SEGMENT; sidenum++)
  198.             if (!IS_CHILD(segp->children[sidenum]))
  199.                 if (med_find_closest_threshold_segment_side(segp, sidenum, &adj_sp, &adj_side, 5*F1_0)) {
  200.                     if (adj_sp->group == segp->group) {
  201.                         if (segp->children[sidenum] != adj_sp-Segments)
  202.                             if (!med_form_joint(segp, sidenum, adj_sp,adj_side))
  203.                                 done_been_a_change = 1;
  204.                     }
  205.                 }
  206.     }
  207.  
  208.     if (done_been_a_change) {
  209.         Update_flags |= UF_WORLD_CHANGED;
  210.         mine_changed = 1;
  211.         autosave_mine(mine_filename);
  212.         diagnostic_message("Sloppy Joint segment formed.");
  213.         strcpy(undo_status[Autosave_count], "Sloppy Joint segment undone.");
  214.         warn_if_concave_segments();
  215.     }
  216.  
  217.     return 1;
  218. }
  219.  
  220.  
  221. //  ---------- Create a bridge segment between current segment and all adjacent segment:side ----------
  222. int CreateAdjacentJointsSegment()
  223. {
  224.     int        adj_side,s;
  225.     segment    *adj_sp;
  226.  
  227.     med_combine_duplicate_vertices(Vertex_active);
  228.  
  229.     for (s=0; s<MAX_SIDES_PER_SEGMENT; s++) {
  230.         if (med_find_adjacent_segment_side(Cursegp, s, &adj_sp, &adj_side))
  231.             if (Cursegp->children[s] != adj_sp-Segments)
  232.                     {
  233.                     med_form_joint(Cursegp,s,adj_sp,adj_side);
  234.                     Update_flags |= UF_WORLD_CHANGED;
  235.                     mine_changed = 1;
  236.                 autosave_mine(mine_filename);
  237.                 diagnostic_message("Adjacent Joint segment formed.");
  238.                 strcpy(undo_status[Autosave_count], "Adjacent Joint segment UNDONE.");
  239.                     warn_if_concave_segments();
  240.                     }
  241.     }
  242.  
  243.     return 1;
  244. }
  245.  
  246. //  ---------- Create a bridge segment between all segment:side and all adjacent segment:side ----------
  247. int CreateAdjacentJointsAll()
  248. {
  249.     int        adj_side,seg,s;
  250.     segment    *adj_sp;
  251.  
  252.     med_combine_duplicate_vertices(Vertex_active);
  253.  
  254.     for (seg=0; seg<=Highest_segment_index; seg++)
  255.         for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
  256.             if (med_find_adjacent_segment_side(&Segments[seg], s, &adj_sp, &adj_side))
  257.                 if (Segments[seg].children[s] != adj_sp-Segments)
  258.                         med_form_joint(&Segments[seg],s,adj_sp,adj_side);
  259.  
  260.     Update_flags |= UF_WORLD_CHANGED;
  261.     mine_changed = 1;
  262.    autosave_mine(mine_filename);
  263.    diagnostic_message("All Adjacent Joint segments formed.");
  264.    strcpy(undo_status[Autosave_count], "All Adjacent Joint segments UNDONE.");
  265.      warn_if_concave_segments();
  266.    return 1;
  267. }
  268.  
  269.  
  270.