599ac9dee0
Previously, valptridx used PREFIX for allow-invalid+mutable, c#PREFIX for allow-invalid+const, v#PREFIX for require-valid+mutable, vc#PREFIX for require-valid+const. Convert the types, factories, and all usage sites to specify a qualifier for all four combinations: im#PREFIX -> allow-invalid+mutable ic#PREFIX -> allow-invalid+const vm#PREFIX -> require-valid+mutable vc#PREFIX -> require-valid+const Changes to common/include/valptridx.h and common/include/fwd-valptridx.h are manual. All other changes are generated by: git grep -lz -e '\(obj\|seg\|clwall\|wall\|actdoor\|trg\)\(ptridx\|ptr\|idx\)\(_t\)\?\>' | xargs -0 sed -i -e 's/\<\(v\?\)\(\(obj\|seg\|clwall\|wall\|actdoor\|trg\)\(ptridx\|ptr\|idx\)\(_t\)\?\)\>/\1m\2/g' for the 'm' prefix and: git grep -lz -e '\(obj\|seg\|clwall\|wall\|actdoor\|trg\)\(ptridx\|ptr\|idx\)\(_t\)\?\>' | xargs -0 sed -i -e 's/\<\([cm]\(obj\|seg\|clwall\|wall\|actdoor\|trg\)\(ptridx\|ptr\|idx\)\(_t\)\?\)\>/i&/g' for the 'i' prefix.
217 lines
6.5 KiB
C++
217 lines
6.5 KiB
C++
/*
|
|
* Portions of this file are copyright Rebirth contributors and licensed as
|
|
* described in COPYING.txt.
|
|
* Portions of this file are copyright Parallax Software and licensed
|
|
* according to the Parallax license below.
|
|
* See COPYING.txt for license details.
|
|
|
|
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
|
|
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
|
|
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
|
|
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
|
|
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
|
|
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
|
|
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
|
|
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
|
|
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
|
|
COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
|
*/
|
|
|
|
/*
|
|
*
|
|
* Functions for building parts of mines.
|
|
*
|
|
*/
|
|
|
|
#include <string.h>
|
|
#include "inferno.h"
|
|
#include "editor/editor.h"
|
|
#include "editor/esegment.h"
|
|
#include "gameseg.h"
|
|
#include "gamesave.h"
|
|
#include "kdefs.h"
|
|
#include "compiler-range_for.h"
|
|
|
|
// ---------- Create a bridge segment between current segment/side and marked segment/side ----------
|
|
int CreateBridge()
|
|
{
|
|
if (!Markedsegp) {
|
|
editor_status("No marked side.");
|
|
return 0;
|
|
}
|
|
|
|
if (!med_form_bridge_segment(Cursegp,Curside,Markedsegp,Markedside)) {
|
|
Update_flags |= UF_WORLD_CHANGED;
|
|
mine_changed = 1;
|
|
autosave_mine(mine_filename);
|
|
diagnostic_message("Bridge segment formed.");
|
|
undo_status[Autosave_count] = "Bridge segment UNDONE.";
|
|
warn_if_concave_segments();
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
// ---------- Form a joint between current segment:side and marked segment:side, modifying marked segment ----------
|
|
int FormJoint()
|
|
{
|
|
if (!Markedsegp)
|
|
diagnostic_message("Marked segment not set -- unable to form joint.");
|
|
else {
|
|
if (!med_form_joint(Cursegp,Curside,Markedsegp,Markedside)) {
|
|
Update_flags |= UF_WORLD_CHANGED;
|
|
mine_changed = 1;
|
|
autosave_mine(mine_filename);
|
|
diagnostic_message("Joint formed.");
|
|
undo_status[Autosave_count] = "Joint undone.";
|
|
warn_if_concave_segments();
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
// ---------- Create a bridge segment between current segment:side adjacent segment:side ----------
|
|
int CreateAdjacentJoint()
|
|
{
|
|
int adj_side;
|
|
imsegptridx_t adj_sp = segment_none;
|
|
|
|
if (med_find_adjacent_segment_side(Cursegp, Curside, adj_sp, &adj_side)) {
|
|
if (Cursegp->children[Curside] != adj_sp) {
|
|
med_form_joint(Cursegp,Curside,adj_sp,adj_side);
|
|
Update_flags |= UF_WORLD_CHANGED;
|
|
mine_changed = 1;
|
|
autosave_mine(mine_filename);
|
|
diagnostic_message("Joint segment formed.");
|
|
undo_status[Autosave_count] = "Joint segment undone.";
|
|
warn_if_concave_segments();
|
|
} else
|
|
editor_status("Attempted to form joint through connected side -- joint segment not formed (you bozo).");
|
|
} else
|
|
editor_status("Could not find adjacent segment -- joint segment not formed.");
|
|
|
|
return 1;
|
|
}
|
|
|
|
// ---------- Create a bridge segment between current segment:side adjacent segment:side ----------
|
|
int CreateSloppyAdjacentJoint()
|
|
{
|
|
int adj_side;
|
|
imsegptridx_t adj_sp = segment_none;
|
|
|
|
save_level("SLOPPY.LVL");
|
|
|
|
if (med_find_closest_threshold_segment_side(Cursegp, Curside, adj_sp, &adj_side, 20*F1_0)) {
|
|
if (Cursegp->children[Curside] != adj_sp) {
|
|
if (!med_form_joint(Cursegp,Curside,adj_sp,adj_side))
|
|
{
|
|
Update_flags |= UF_WORLD_CHANGED;
|
|
mine_changed = 1;
|
|
autosave_mine(mine_filename);
|
|
diagnostic_message("Sloppy Joint segment formed.");
|
|
undo_status[Autosave_count] = "Sloppy Joint segment undone.";
|
|
warn_if_concave_segments();
|
|
}
|
|
else editor_status("Could not form sloppy joint.\n");
|
|
} else
|
|
editor_status("Attempted to form sloppy joint through connected side -- joint segment not formed (you bozo).");
|
|
} else
|
|
editor_status("Could not find close threshold segment -- joint segment not formed.");
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
// -------------- Create all sloppy joints within CurrentGroup ------------------
|
|
int CreateSloppyAdjacentJointsGroup()
|
|
{
|
|
int adj_side;
|
|
int done_been_a_change = 0;
|
|
range_for(const auto &gs, GroupList[current_group].segments)
|
|
{
|
|
auto segp = vmsegptridx(gs);
|
|
|
|
for (int sidenum=0; sidenum < MAX_SIDES_PER_SEGMENT; sidenum++)
|
|
if (!IS_CHILD(segp->children[sidenum]))
|
|
{
|
|
imsegptridx_t adj_sp = segment_none;
|
|
if (med_find_closest_threshold_segment_side(segp, sidenum, adj_sp, &adj_side, 5*F1_0)) {
|
|
if (adj_sp->group == segp->group) {
|
|
if (segp->children[sidenum] != adj_sp)
|
|
if (!med_form_joint(segp, sidenum, adj_sp,adj_side))
|
|
done_been_a_change = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (done_been_a_change) {
|
|
Update_flags |= UF_WORLD_CHANGED;
|
|
mine_changed = 1;
|
|
autosave_mine(mine_filename);
|
|
diagnostic_message("Sloppy Joint segment formed.");
|
|
undo_status[Autosave_count] = "Sloppy Joint segment undone.";
|
|
warn_if_concave_segments();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
// ---------- Create a bridge segment between current segment and all adjacent segment:side ----------
|
|
int CreateAdjacentJointsSegment()
|
|
{
|
|
int adj_side;
|
|
|
|
med_combine_duplicate_vertices(Vertex_active);
|
|
|
|
for (int s=0; s<MAX_SIDES_PER_SEGMENT; s++) {
|
|
imsegptridx_t adj_sp = segment_none;
|
|
if (med_find_adjacent_segment_side(Cursegp, s, adj_sp, &adj_side))
|
|
if (Cursegp->children[s] != adj_sp)
|
|
{
|
|
med_form_joint(Cursegp,s,adj_sp,adj_side);
|
|
Update_flags |= UF_WORLD_CHANGED;
|
|
mine_changed = 1;
|
|
autosave_mine(mine_filename);
|
|
diagnostic_message("Adjacent Joint segment formed.");
|
|
undo_status[Autosave_count] = "Adjacent Joint segment UNDONE.";
|
|
warn_if_concave_segments();
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
// ---------- Create a bridge segment between all segment:side and all adjacent segment:side ----------
|
|
int CreateAdjacentJointsAll()
|
|
{
|
|
int adj_side;
|
|
|
|
med_combine_duplicate_vertices(Vertex_active);
|
|
|
|
range_for (const auto &&segp, vmsegptridx)
|
|
{
|
|
for (int s=0; s<MAX_SIDES_PER_SEGMENT; s++)
|
|
{
|
|
imsegptridx_t adj_sp = segment_none;
|
|
if (med_find_adjacent_segment_side(segp, s, adj_sp, &adj_side))
|
|
if (segp->children[s] != adj_sp)
|
|
med_form_joint(segp,s,adj_sp,adj_side);
|
|
}
|
|
}
|
|
|
|
Update_flags |= UF_WORLD_CHANGED;
|
|
mine_changed = 1;
|
|
autosave_mine(mine_filename);
|
|
diagnostic_message("All Adjacent Joint segments formed.");
|
|
undo_status[Autosave_count] = "All Adjacent Joint segments UNDONE.";
|
|
warn_if_concave_segments();
|
|
return 1;
|
|
}
|
|
|
|
|