]> icculus.org git repositories - btb/d2x.git/blob - main/editor/kbuild.c
remove rcs tags
[btb/d2x.git] / main / editor / kbuild.c
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 /*
15  *
16  * Functions for building parts of mines.
17  *
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #include "conf.h"
22 #endif
23
24 #include <string.h>
25
26 #include "inferno.h"
27 #include "editor/editor.h"
28 #include "gameseg.h"
29 #include "gamesave.h"
30 #include "mono.h"
31
32 //  ---------- Create a bridge segment between current segment/side and marked segment/side ----------
33 int CreateBridge()
34 {
35     if (!med_form_bridge_segment(Cursegp,Curside,Markedsegp,Markedside)) {
36                 Update_flags |= UF_WORLD_CHANGED;
37                 mine_changed = 1;
38         autosave_mine(mine_filename);
39         diagnostic_message("Bridge segment formed.");
40         strcpy(undo_status[Autosave_count], "Bridge segment UNDONE.");
41         warn_if_concave_segments();
42         }
43     return 1;
44 }
45
46
47
48 // ---------- Form a joint between current segment:side and marked segment:side, modifying marked segment ----------
49 int FormJoint()
50 {
51         if (!Markedsegp)
52                 diagnostic_message("Marked segment not set -- unable to form joint.");
53         else {
54         if (!med_form_joint(Cursegp,Curside,Markedsegp,Markedside)) {
55             Update_flags |= UF_WORLD_CHANGED;
56             mine_changed = 1;
57             autosave_mine(mine_filename);
58             diagnostic_message("Joint formed.");
59             strcpy(undo_status[Autosave_count], "Joint undone.");
60                         warn_if_concave_segments();
61         }
62         }
63
64         return 1;
65
66 }
67
68 //  ---------- Create a bridge segment between current segment:side adjacent segment:side ----------
69 int CreateAdjacentJoint()
70 {
71         int             adj_side;
72         segment *adj_sp;
73
74         if (med_find_adjacent_segment_side(Cursegp, Curside, &adj_sp, &adj_side)) {
75                 if (Cursegp->children[Curside] != SEGMENT_NUMBER(adj_sp)) {
76                         med_form_joint(Cursegp,Curside,adj_sp,adj_side);
77                         Update_flags |= UF_WORLD_CHANGED;
78                         mine_changed = 1;
79          autosave_mine(mine_filename);
80          diagnostic_message("Joint segment formed.");
81          strcpy(undo_status[Autosave_count], "Joint segment undone.");
82                 warn_if_concave_segments();
83                 } else
84                         editor_status("Attempted to form joint through connected side -- joint segment not formed (you bozo).");
85         } else
86                 editor_status("Could not find adjacent segment -- joint segment not formed.");
87
88         return 1;
89 }
90
91 //  ---------- Create a bridge segment between current segment:side adjacent segment:side ----------
92 int CreateSloppyAdjacentJoint()
93 {
94         int             adj_side;
95         segment *adj_sp;
96
97         save_level("SLOPPY.LVL");
98
99         if (med_find_closest_threshold_segment_side(Cursegp, Curside, &adj_sp, &adj_side, 20*F1_0)) {
100                 if (Cursegp->children[Curside] != SEGMENT_NUMBER(adj_sp)) {
101                         if (!med_form_joint(Cursegp,Curside,adj_sp,adj_side))
102                                 {
103                                 Update_flags |= UF_WORLD_CHANGED;
104                                 mine_changed = 1;
105                  autosave_mine(mine_filename);
106                  diagnostic_message("Sloppy Joint segment formed.");
107                  strcpy(undo_status[Autosave_count], "Sloppy Joint segment undone.");
108                         warn_if_concave_segments();
109                                 }
110                         else editor_status("Couldn't form sloppy joint.\n");
111                 } else
112                         editor_status("Attempted to form sloppy joint through connected side -- joint segment not formed (you bozo).");
113         } else
114                 editor_status("Could not find close threshold segment -- joint segment not formed.");
115
116         return 1;
117 }
118
119
120 //  -------------- Create all sloppy joints within CurrentGroup ------------------
121 int CreateSloppyAdjacentJointsGroup()
122 {
123         int             adj_side;
124         segment *adj_sp;
125         int             num_segs = GroupList[current_group].num_segments;
126         short           *segs = GroupList[current_group].segments;
127         segment *segp;
128         int             done_been_a_change = 0;
129         int             segind, sidenum;
130
131         for (segind=0; segind<num_segs; segind++) {
132                 segp = &Segments[segs[segind]];
133
134                 for (sidenum=0; sidenum < MAX_SIDES_PER_SEGMENT; sidenum++)
135                         if (!IS_CHILD(segp->children[sidenum]))
136                                 if (med_find_closest_threshold_segment_side(segp, sidenum, &adj_sp, &adj_side, 5*F1_0)) {
137                                         if (adj_sp->group == segp->group) {
138                                                 if (segp->children[sidenum] != SEGMENT_NUMBER(adj_sp))
139                                                         if (!med_form_joint(segp, sidenum, adj_sp,adj_side))
140                                                                 done_been_a_change = 1;
141                                         }
142                                 }
143         }
144
145         if (done_been_a_change) {
146                 Update_flags |= UF_WORLD_CHANGED;
147                 mine_changed = 1;
148                 autosave_mine(mine_filename);
149                 diagnostic_message("Sloppy Joint segment formed.");
150                 strcpy(undo_status[Autosave_count], "Sloppy Joint segment undone.");
151                 warn_if_concave_segments();
152         }
153
154         return 1;
155 }
156
157
158 //  ---------- Create a bridge segment between current segment and all adjacent segment:side ----------
159 int CreateAdjacentJointsSegment()
160 {
161         int             adj_side,s;
162         segment *adj_sp;
163
164         med_combine_duplicate_vertices(Vertex_active);
165
166         for (s=0; s<MAX_SIDES_PER_SEGMENT; s++) {
167                 if (med_find_adjacent_segment_side(Cursegp, s, &adj_sp, &adj_side))
168                         if (Cursegp->children[s] != SEGMENT_NUMBER(adj_sp))
169                                         {
170                                         med_form_joint(Cursegp,s,adj_sp,adj_side);
171                                         Update_flags |= UF_WORLD_CHANGED;
172                                         mine_changed = 1;
173                     autosave_mine(mine_filename);
174                     diagnostic_message("Adjacent Joint segment formed.");
175                     strcpy(undo_status[Autosave_count], "Adjacent Joint segment UNDONE.");
176                                 warn_if_concave_segments();
177                                         }
178         }
179
180         return 1;
181 }
182
183 //  ---------- Create a bridge segment between all segment:side and all adjacent segment:side ----------
184 int CreateAdjacentJointsAll()
185 {
186         int             adj_side,seg,s;
187         segment *adj_sp;
188
189         med_combine_duplicate_vertices(Vertex_active);
190
191         for (seg=0; seg<=Highest_segment_index; seg++)
192                 for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
193                         if (med_find_adjacent_segment_side(&Segments[seg], s, &adj_sp, &adj_side))
194                                 if (Segments[seg].children[s] != SEGMENT_NUMBER(adj_sp))
195                                                 med_form_joint(&Segments[seg],s,adj_sp,adj_side);
196
197         Update_flags |= UF_WORLD_CHANGED;
198         mine_changed = 1;
199    autosave_mine(mine_filename);
200    diagnostic_message("All Adjacent Joint segments formed.");
201    strcpy(undo_status[Autosave_count], "All Adjacent Joint segments UNDONE.");
202         warn_if_concave_segments();
203    return 1;
204 }
205
206