patch_engine: don't emit path-typed patch addresses as hex

save_patches always emitted the address element as fmt::format("0x%.8x"),
but for move_file and hide_file that element is a VFS path: load() keeps the
text in original_offset and skips u32 validation for those two types.
Round-tripping such a patch through save_patches replaced the source path
with 0x00000000.

The entry stays syntactically valid and keeps loading, so the patch is still
listed and can still be toggled in the Patch Manager while silently matching
no file. Re-downloading does not repair it either, since append_patches
discards an incoming patch whose Patch Version is not strictly greater.

Gate the emit on patch_type_uses_hex_offset, the predicate that already
existed for this and was used only on the load side. The numeric branch
keeps using offset rather than original_offset on purpose: an address
modifier is folded into offset at load time and the flat form emitted here
has nowhere to put it.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
Antonino Di Guardo
2026-09-24 13:45:26 +02:00
committed by Megamouse
co-authored by Claude Opus 5
parent dc3c7327d8
commit 0c382f4fc9
+11 -1
View File
@@ -1907,7 +1907,17 @@ bool patch_engine::save_patches(const patch_map& patches, const std::string& pat
out << YAML::Flow;
out << YAML::BeginSeq;
out << fmt::format("%s", data.type);
out << fmt::format("0x%.8x", data.offset);
if (patch_type_uses_hex_offset(data.type))
{
out << fmt::format("0x%.8x", data.offset);
}
else
{
// This element is a path for move_file and hide_file, not an address
out << data.original_offset;
}
out << data.original_value;
out << YAML::EndSeq;
}