1 /* $Id: kbuild.c,v 1.2 2004-12-19 14:52:48 btb Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
17 * Functions for building parts of mines.
22 static char rcsid[] = "$Id: kbuild.c,v 1.2 2004-12-19 14:52:48 btb Exp $";
28 #include "editor/editor.h"
33 // ---------- Create a bridge segment between current segment/side and marked segment/side ----------
36 if (!med_form_bridge_segment(Cursegp,Curside,Markedsegp,Markedside)) {
37 Update_flags |= UF_WORLD_CHANGED;
39 autosave_mine(mine_filename);
40 diagnostic_message("Bridge segment formed.");
41 strcpy(undo_status[Autosave_count], "Bridge segment UNDONE.");
42 warn_if_concave_segments();
49 // ---------- Form a joint between current segment:side and marked segment:side, modifying marked segment ----------
53 diagnostic_message("Marked segment not set -- unable to form joint.");
55 if (!med_form_joint(Cursegp,Curside,Markedsegp,Markedside)) {
56 Update_flags |= UF_WORLD_CHANGED;
58 autosave_mine(mine_filename);
59 diagnostic_message("Joint formed.");
60 strcpy(undo_status[Autosave_count], "Joint undone.");
61 warn_if_concave_segments();
69 // ---------- Create a bridge segment between current segment:side adjacent segment:side ----------
70 int CreateAdjacentJoint()
75 if (med_find_adjacent_segment_side(Cursegp, Curside, &adj_sp, &adj_side)) {
76 if (Cursegp->children[Curside] != adj_sp-Segments) {
77 med_form_joint(Cursegp,Curside,adj_sp,adj_side);
78 Update_flags |= UF_WORLD_CHANGED;
80 autosave_mine(mine_filename);
81 diagnostic_message("Joint segment formed.");
82 strcpy(undo_status[Autosave_count], "Joint segment undone.");
83 warn_if_concave_segments();
85 editor_status("Attempted to form joint through connected side -- joint segment not formed (you bozo).");
87 editor_status("Could not find adjacent segment -- joint segment not formed.");
92 // ---------- Create a bridge segment between current segment:side adjacent segment:side ----------
93 int CreateSloppyAdjacentJoint()
98 save_level("SLOPPY.LVL");
100 if (med_find_closest_threshold_segment_side(Cursegp, Curside, &adj_sp, &adj_side, 20*F1_0)) {
101 if (Cursegp->children[Curside] != adj_sp-Segments) {
102 if (!med_form_joint(Cursegp,Curside,adj_sp,adj_side))
104 Update_flags |= UF_WORLD_CHANGED;
106 autosave_mine(mine_filename);
107 diagnostic_message("Sloppy Joint segment formed.");
108 strcpy(undo_status[Autosave_count], "Sloppy Joint segment undone.");
109 warn_if_concave_segments();
111 else editor_status("Couldn't form sloppy joint.\n");
113 editor_status("Attempted to form sloppy joint through connected side -- joint segment not formed (you bozo).");
115 editor_status("Could not find close threshold segment -- joint segment not formed.");
121 // -------------- Create all sloppy joints within CurrentGroup ------------------
122 int CreateSloppyAdjacentJointsGroup()
126 int num_segs = GroupList[current_group].num_segments;
127 short *segs = GroupList[current_group].segments;
129 int done_been_a_change = 0;
132 for (segind=0; segind<num_segs; segind++) {
133 segp = &Segments[segs[segind]];
135 for (sidenum=0; sidenum < MAX_SIDES_PER_SEGMENT; sidenum++)
136 if (!IS_CHILD(segp->children[sidenum]))
137 if (med_find_closest_threshold_segment_side(segp, sidenum, &adj_sp, &adj_side, 5*F1_0)) {
138 if (adj_sp->group == segp->group) {
139 if (segp->children[sidenum] != adj_sp-Segments)
140 if (!med_form_joint(segp, sidenum, adj_sp,adj_side))
141 done_been_a_change = 1;
146 if (done_been_a_change) {
147 Update_flags |= UF_WORLD_CHANGED;
149 autosave_mine(mine_filename);
150 diagnostic_message("Sloppy Joint segment formed.");
151 strcpy(undo_status[Autosave_count], "Sloppy Joint segment undone.");
152 warn_if_concave_segments();
159 // ---------- Create a bridge segment between current segment and all adjacent segment:side ----------
160 int CreateAdjacentJointsSegment()
165 med_combine_duplicate_vertices(Vertex_active);
167 for (s=0; s<MAX_SIDES_PER_SEGMENT; s++) {
168 if (med_find_adjacent_segment_side(Cursegp, s, &adj_sp, &adj_side))
169 if (Cursegp->children[s] != adj_sp-Segments)
171 med_form_joint(Cursegp,s,adj_sp,adj_side);
172 Update_flags |= UF_WORLD_CHANGED;
174 autosave_mine(mine_filename);
175 diagnostic_message("Adjacent Joint segment formed.");
176 strcpy(undo_status[Autosave_count], "Adjacent Joint segment UNDONE.");
177 warn_if_concave_segments();
184 // ---------- Create a bridge segment between all segment:side and all adjacent segment:side ----------
185 int CreateAdjacentJointsAll()
190 med_combine_duplicate_vertices(Vertex_active);
192 for (seg=0; seg<=Highest_segment_index; seg++)
193 for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
194 if (med_find_adjacent_segment_side(&Segments[seg], s, &adj_sp, &adj_side))
195 if (Segments[seg].children[s] != adj_sp-Segments)
196 med_form_joint(&Segments[seg],s,adj_sp,adj_side);
198 Update_flags |= UF_WORLD_CHANGED;
200 autosave_mine(mine_filename);
201 diagnostic_message("All Adjacent Joint segments formed.");
202 strcpy(undo_status[Autosave_count], "All Adjacent Joint segments UNDONE.");
203 warn_if_concave_segments();