]> icculus.org git repositories - btb/d2x.git/blob - main/editor/kbuild.c
Move old logs to ChangeLog-old
[btb/d2x.git] / main / editor / kbuild.c
1 /* $Id: kbuild.c,v 1.2 2004-12-19 14:52:48 btb Exp $ */
2 /*
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.
13 */
14
15 /*
16  *
17  * Functions for building parts of mines.
18  *
19  */
20
21 #ifdef RCS
22 static char rcsid[] = "$Id: kbuild.c,v 1.2 2004-12-19 14:52:48 btb Exp $";
23 #endif
24
25 #include <string.h>
26
27 #include "inferno.h"
28 #include "editor/editor.h"
29 #include "gameseg.h"
30 #include "gamesave.h"
31 #include "mono.h"
32
33 //  ---------- Create a bridge segment between current segment/side and marked segment/side ----------
34 int CreateBridge()
35 {
36     if (!med_form_bridge_segment(Cursegp,Curside,Markedsegp,Markedside)) {
37                 Update_flags |= UF_WORLD_CHANGED;
38                 mine_changed = 1;
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();
43         }
44     return 1;
45 }
46
47
48
49 // ---------- Form a joint between current segment:side and marked segment:side, modifying marked segment ----------
50 int FormJoint()
51 {
52         if (!Markedsegp)
53                 diagnostic_message("Marked segment not set -- unable to form joint.");
54         else {
55         if (!med_form_joint(Cursegp,Curside,Markedsegp,Markedside)) {
56             Update_flags |= UF_WORLD_CHANGED;
57             mine_changed = 1;
58             autosave_mine(mine_filename);
59             diagnostic_message("Joint formed.");
60             strcpy(undo_status[Autosave_count], "Joint undone.");
61                         warn_if_concave_segments();
62         }
63         }
64
65         return 1;
66
67 }
68
69 //  ---------- Create a bridge segment between current segment:side adjacent segment:side ----------
70 int CreateAdjacentJoint()
71 {
72         int             adj_side;
73         segment *adj_sp;
74
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;
79                         mine_changed = 1;
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();
84                 } else
85                         editor_status("Attempted to form joint through connected side -- joint segment not formed (you bozo).");
86         } else
87                 editor_status("Could not find adjacent segment -- joint segment not formed.");
88
89         return 1;
90 }
91
92 //  ---------- Create a bridge segment between current segment:side adjacent segment:side ----------
93 int CreateSloppyAdjacentJoint()
94 {
95         int             adj_side;
96         segment *adj_sp;
97
98         save_level("SLOPPY.LVL");
99
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))
103                                 {
104                                 Update_flags |= UF_WORLD_CHANGED;
105                                 mine_changed = 1;
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();
110                                 }
111                         else editor_status("Couldn't form sloppy joint.\n");
112                 } else
113                         editor_status("Attempted to form sloppy joint through connected side -- joint segment not formed (you bozo).");
114         } else
115                 editor_status("Could not find close threshold segment -- joint segment not formed.");
116
117         return 1;
118 }
119
120
121 //  -------------- Create all sloppy joints within CurrentGroup ------------------
122 int CreateSloppyAdjacentJointsGroup()
123 {
124         int             adj_side;
125         segment *adj_sp;
126         int             num_segs = GroupList[current_group].num_segments;
127         short           *segs = GroupList[current_group].segments;
128         segment *segp;
129         int             done_been_a_change = 0;
130         int             segind, sidenum;
131
132         for (segind=0; segind<num_segs; segind++) {
133                 segp = &Segments[segs[segind]];
134
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;
142                                         }
143                                 }
144         }
145
146         if (done_been_a_change) {
147                 Update_flags |= UF_WORLD_CHANGED;
148                 mine_changed = 1;
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();
153         }
154
155         return 1;
156 }
157
158
159 //  ---------- Create a bridge segment between current segment and all adjacent segment:side ----------
160 int CreateAdjacentJointsSegment()
161 {
162         int             adj_side,s;
163         segment *adj_sp;
164
165         med_combine_duplicate_vertices(Vertex_active);
166
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)
170                                         {
171                                         med_form_joint(Cursegp,s,adj_sp,adj_side);
172                                         Update_flags |= UF_WORLD_CHANGED;
173                                         mine_changed = 1;
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();
178                                         }
179         }
180
181         return 1;
182 }
183
184 //  ---------- Create a bridge segment between all segment:side and all adjacent segment:side ----------
185 int CreateAdjacentJointsAll()
186 {
187         int             adj_side,seg,s;
188         segment *adj_sp;
189
190         med_combine_duplicate_vertices(Vertex_active);
191
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);
197
198         Update_flags |= UF_WORLD_CHANGED;
199         mine_changed = 1;
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();
204    return 1;
205 }
206
207