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

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