From de6875ea3c529663365935da44a2bbb744146c48 Mon Sep 17 00:00:00 2001
From: harryob <55142896+harryob@users.noreply.github.com>
Date: Mon, 6 Nov 2023 12:54:35 +0000
Subject: [PATCH 1/5] fixes merge conflict markers
---
code/modules/mapping/merge_conflicts.dm | 18 ++++++++++++++++++
code/modules/unit_tests/create_and_destroy.dm | 2 ++
tools/mapmerge2/merge_driver.py | 10 +++++++---
3 files changed, 27 insertions(+), 3 deletions(-)
create mode 100644 code/modules/mapping/merge_conflicts.dm
diff --git a/code/modules/mapping/merge_conflicts.dm b/code/modules/mapping/merge_conflicts.dm
new file mode 100644
index 000000000000..4a7ffb36f50e
--- /dev/null
+++ b/code/modules/mapping/merge_conflicts.dm
@@ -0,0 +1,18 @@
+// Used by mapmerge2 to denote the existence of a merge conflict (or when it has to complete a "best intent" merge where it dumps the movable contents of an old key and a new key on the same tile).
+// We define it explicitly here to ensure that it shows up on the highest possible plane (while giving off a verbose icon) to aide mappers in resolving these conflicts.
+// DO NOT USE THIS IN NORMAL MAPPING!!! Linters WILL fail.
+
+/obj/merge_conflict_marker
+ name = "Merge Conflict Marker - DO NOT USE"
+ icon = 'icons/effects/mapping_helpers.dmi'
+ icon_state = "merge_conflict_marker"
+ desc = "If you are seeing this in-game: someone REALLY, REALLY, REALLY fucked up. They physically mapped in a fucking Merge Conflict Marker. What the shit."
+ plane = POINT_PLANE
+
+///We REALLY do not want un-addressed merge conflicts in maps for an inexhaustible list of reasons. This should help ensure that this will not be missed in case linters fail to catch it for any reason what-so-ever.
+/obj/merge_conflict_marker/Initialize(mapload)
+ . = ..()
+ var/msg = "HEY, LISTEN!!! Merge Conflict Marker detected at [AREACOORD(src)]! Please manually address all potential merge conflicts!!!"
+ log_mapping(msg)
+ to_chat(world, span_boldannounce("[msg]"))
+ warning(msg)
diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm
index eb4672b84fc9..55711ba7ecc6 100644
--- a/code/modules/unit_tests/create_and_destroy.dm
+++ b/code/modules/unit_tests/create_and_destroy.dm
@@ -19,6 +19,8 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE)
/obj/item/explosive/grenade/flashbang/cluster_piece,
/obj/effect/fake_attacker,
/atom/movable/lighting_mask, //leave it alone
+ //This is meant to fail extremely loud every single time it occurs in any environment in any context, and it falsely alarms when this unit test iterates it. Let's not spawn it in.
+ /obj/merge_conflict_marker,
)
//This turf existing is an error in and of itself
ignore += typesof(/turf/baseturf_skipover)
diff --git a/tools/mapmerge2/merge_driver.py b/tools/mapmerge2/merge_driver.py
index 39bc1f723e33..8daead9c165c 100644
--- a/tools/mapmerge2/merge_driver.py
+++ b/tools/mapmerge2/merge_driver.py
@@ -75,9 +75,13 @@ def three_way_merge(base, left, right):
print(f" C: Both sides touch the tile at {coord}")
if merged_movables is None:
- obj_name = "---Merge conflict marker---"
- merged_movables = left_movables + [f'/obj{{name = "{obj_name}"}}'] + right_movables
- print(f" Left and right movable groups are split by an `/obj` named \"{obj_name}\"")
+ # Note that if you do not have an object that matches this path in your DME, the invalid path may be discarded when the map is loaded into a map editor.
+ # To rectify this, either add an object with this same path, or create a new object/denote an existing object in the obj_path define.
+ obj_path = "/obj/merge_conflict_marker"
+ obj_name = "---Merge Conflict Marker---"
+ obj_desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete."
+ merged_movables = left_movables + [f'{obj_path}{{name = "{obj_name}";\n\tdesc = "{obj_desc}"}}'] + right_movables
+ print(f" Left and right movable groups are split by an `{obj_path}` named \"{obj_name}\"")
if merged_turfs is None:
merged_turfs = left_turfs
print(f" Saving turf: {', '.join(left_turfs)}")
From bf3eb9c34cb50fcc7e00e6a468b6f1b93191bcbb Mon Sep 17 00:00:00 2001
From: harryob <55142896+harryob@users.noreply.github.com>
Date: Mon, 6 Nov 2023 13:05:10 +0000
Subject: [PATCH 2/5] forgot to tick it
---
colonialmarines.dme | 1 +
1 file changed, 1 insertion(+)
diff --git a/colonialmarines.dme b/colonialmarines.dme
index 9c3a5868d693..8894e848b687 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -1767,6 +1767,7 @@
#include "code\modules\logging\log_category.dm"
#include "code\modules\logging\log_holder.dm"
#include "code\modules\mapping\map_template.dm"
+#include "code\modules\mapping\merge_conflicts.dm"
#include "code\modules\mapping\preloader.dm"
#include "code\modules\mapping\reader.dm"
#include "code\modules\mapping\verify.dm"
From 70d95bff043e2306e58f5cc5c6ea78c11159fc55 Mon Sep 17 00:00:00 2001
From: harryob <55142896+harryob@users.noreply.github.com>
Date: Mon, 6 Nov 2023 13:11:28 +0000
Subject: [PATCH 3/5] moves some stuff around
---
code/modules/mapping/merge_conflicts.dm | 3 +--
icons/landmarks.dmi | Bin 36857 -> 37518 bytes
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/code/modules/mapping/merge_conflicts.dm b/code/modules/mapping/merge_conflicts.dm
index 4a7ffb36f50e..f81b0a71dcd8 100644
--- a/code/modules/mapping/merge_conflicts.dm
+++ b/code/modules/mapping/merge_conflicts.dm
@@ -4,10 +4,9 @@
/obj/merge_conflict_marker
name = "Merge Conflict Marker - DO NOT USE"
- icon = 'icons/effects/mapping_helpers.dmi'
+ icon = 'icons/landmarks.dmi'
icon_state = "merge_conflict_marker"
desc = "If you are seeing this in-game: someone REALLY, REALLY, REALLY fucked up. They physically mapped in a fucking Merge Conflict Marker. What the shit."
- plane = POINT_PLANE
///We REALLY do not want un-addressed merge conflicts in maps for an inexhaustible list of reasons. This should help ensure that this will not be missed in case linters fail to catch it for any reason what-so-ever.
/obj/merge_conflict_marker/Initialize(mapload)
diff --git a/icons/landmarks.dmi b/icons/landmarks.dmi
index 8ebeaef1648b76d79f7f029055305f306518c3bb..08b23758beaa03c94cec15ae137a2fe1d1c482c2 100644
GIT binary patch
delta 10511
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