From 70d4e0c40f262c9cd1d05ca725c8f103c09e59cf Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Sat, 31 Jan 2026 18:23:00 -0600 Subject: [PATCH 1/3] WWMix: added support for replacing entries that are duplicates --- lib/ww_mix.rb | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/ww_mix.rb b/lib/ww_mix.rb index 97f7d18..ea546f7 100644 --- a/lib/ww_mix.rb +++ b/lib/ww_mix.rb @@ -228,27 +228,34 @@ class W3DHub @encrypted end - def add_file(path:) + def add_file(path:, replace: false) return false unless File.exist?(path) return false if File.directory?(path) - info = EntryInfoHeader.new(0, 0, File.size(path)) - @entries << Entry.new(name: File.basename(path), path: path, info: info) - - true + entry = Entry.new(name: File.basename(path), path: path, info: EntryInfoHeader.new(0, 0, File.size(path))) + add_entry(entry: entry, replace: replace) end - def add_blob(path:, blob:) + def add_blob(path:, blob:, replace: false) info = EntryInfoHeader.new(0, 0, blob.size) - @entries << Entry.new(name: File.basename(path), path: path, info: info, blob: blob) + entry = Entry.new(name: File.basename(path), path: path, info: info, blob: blob) into.crc32 = @entries.last.calculate_crc32 - true + add_entry(entry: entry, replace: replace) end - def add_entry(entry:) - @entries << entry + def add_entry(entry:, replace: false) + duplicate = @entries.find { |e| e.name.upcase == entry.name.upcase } + if duplicate + if replace + @entries.delete(duplicate) + else + return false + end + end + + @entries << entry true end From ddbec8d72c1b9d327909744fe181bfe12193097e Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Sat, 31 Jan 2026 18:24:47 -0600 Subject: [PATCH 2/3] Fixed patching not preserving encryption flag of target mix --- lib/application_manager/task.rb | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/application_manager/task.rb b/lib/application_manager/task.rb index 992c4cd..0297f12 100644 --- a/lib/application_manager/task.rb +++ b/lib/application_manager/task.rb @@ -746,6 +746,8 @@ class W3DHub end patch_entry = patch_mix.entries.find { |e| e.name.casecmp?(".w3dhub.patch") || e.name.casecmp?(".bhppatch") } patch_entry.read + # "remove" patch meta file from patch before copying patch data + patch_mix.entries.delete(patch_entry) patch_info = JSON.parse(patch_entry.blob, symbolize_names: true) @@ -765,20 +767,15 @@ class W3DHub patch_info[:updatedFiles].each do |file| logger.debug(LOG_TAG) { " #{file}" } - patch = patch_mix.entries.find { |e| e.name.casecmp?(file) } - target = target_mix.entries.find { |e| e.name.casecmp?(file) } - - if target - target_mix.entries[target_mix.entries.index(target)] = patch - else - target_mix.entries << patch + patch_mix.entries.each do |entry| + target_mix.add_entry(entry: entry, replace: true) end end logger.info(LOG_TAG) { " Writing updated #{file_path}..." } if patch_info[:updatedFiles].size.positive? temp_mix_path = "#{temp_path}/#{File.basename(file_path)}" - temp_mix = W3DHub::WWMix.new(path: temp_mix_path) - target_mix.entries.each { |e| temp_mix.add_entry(entry: e) } + temp_mix = W3DHub::WWMix.new(path: temp_mix_path, encrypted: target_mix.encrypted?) + target_mix.entries.each { |e| temp_mix.add_entry(entry: e, replace: true) } unless temp_mix.save raise temp_mix.error_reason end From 68df923beab781f228a09592427cfc1c353d6d78 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Sat, 31 Jan 2026 18:25:33 -0600 Subject: [PATCH 3/3] Bump version --- lib/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/version.rb b/lib/version.rb index bf9863b..1896838 100644 --- a/lib/version.rb +++ b/lib/version.rb @@ -1,4 +1,4 @@ class W3DHub DIR_NAME = "W3DHubAlt".freeze - VERSION = "0.9.0".freeze + VERSION = "0.9.1".freeze end