From c9bb2786f731ffa8416a7f18dde82cea52e52887 Mon Sep 17 00:00:00 2001 From: aomizu Date: Sun, 18 May 2025 20:17:11 +0900 Subject: [PATCH] applied libSiliconPatch.dll --- FyneApp.toml | 2 +- main.go | 76 +++++++++++++++++++++----------- winerosetta/libSiliconPatch.dll | Bin 0 -> 31744 bytes 3 files changed, 51 insertions(+), 27 deletions(-) create mode 100755 winerosetta/libSiliconPatch.dll diff --git a/FyneApp.toml b/FyneApp.toml index 8959402..50c8d27 100644 --- a/FyneApp.toml +++ b/FyneApp.toml @@ -2,4 +2,4 @@ Name = "TurtleSilicon" ID = "com.tairasu.turtlesilicon" Version = "0.1.0" - Build = 12 + Build = 15 diff --git a/main.go b/main.go index 63556ac..68f5416 100644 --- a/main.go +++ b/main.go @@ -201,24 +201,26 @@ func main() { turtlewowPathLabel.Refresh() winerosettaDllPath := filepath.Join(turtlewowPath, "winerosetta.dll") d3d9DllPath := filepath.Join(turtlewowPath, "d3d9.dll") + libSiliconPatchDllPath := filepath.Join(turtlewowPath, "libSiliconPatch.dll") // Added check for libSiliconPatch.dll rosettaX87DirPath := filepath.Join(turtlewowPath, "rosettax87") dllsTextFile := filepath.Join(turtlewowPath, "dlls.txt") // Check for libRuntimeRosettax87 as well rosettaX87ExePath := filepath.Join(rosettaX87DirPath, "rosettax87") libRuntimeRosettaX87Path := filepath.Join(rosettaX87DirPath, "libRuntimeRosettax87") - // Check if dlls.txt exists and contains winerosetta.dll + // Check if dlls.txt exists and contains winerosetta.dll and libSiliconPatch.dll dllsFileValid := false if pathExists(dllsTextFile) { if fileContent, err := os.ReadFile(dllsTextFile); err == nil { - if strings.Contains(string(fileContent), "winerosetta.dll") { + // Updated to check for both entries for dllsFileValid to be true + if strings.Contains(string(fileContent), "winerosetta.dll") && strings.Contains(string(fileContent), "libSiliconPatch.dll") { dllsFileValid = true } } } - if pathExists(winerosettaDllPath) && pathExists(d3d9DllPath) && dirExists(rosettaX87DirPath) && - pathExists(rosettaX87ExePath) && pathExists(libRuntimeRosettaX87Path) && dllsFileValid { + if pathExists(winerosettaDllPath) && pathExists(d3d9DllPath) && pathExists(libSiliconPatchDllPath) && dirExists(rosettaX87DirPath) && + pathExists(rosettaX87ExePath) && pathExists(libRuntimeRosettaX87Path) && dllsFileValid { patchesAppliedTurtleWoW = true } else { // patchesAppliedTurtleWoW = false @@ -319,8 +321,9 @@ func main() { // Files to copy directly into turtlewowPath filesToCopy := map[string]string{ - "winerosetta/winerosetta.dll": targetWinerosettaDll, // Adjusted path - "winerosetta/d3d9.dll": targetD3d9Dll, // Adjusted path + "winerosetta/winerosetta.dll": targetWinerosettaDll, // Adjusted path + "winerosetta/d3d9.dll": targetD3d9Dll, // Adjusted path + "winerosetta/libSiliconPatch.dll": filepath.Join(turtlewowPath, "libSiliconPatch.dll"), // Added libSiliconPatch.dll } for resourceName, destPath := range filesToCopy { @@ -433,54 +436,75 @@ func main() { // Check and update dlls.txt file log.Printf("Checking dlls.txt file at: %s", dllsTextFile) winerosettaEntry := "winerosetta.dll" - needsUpdate := true + libSiliconPatchEntry := "libSiliconPatch.dll" // New entry + needsWinerosettaUpdate := true + needsLibSiliconPatchUpdate := true - // Check if file exists and if winerosetta.dll is already in it - if fileContent, err := os.ReadFile(dllsTextFile); err == nil { + // Check if file exists and what it contains + if fileContentBytes, err := os.ReadFile(dllsTextFile); err == nil { + fileContent := string(fileContentBytes) // File exists, check if it contains winerosetta.dll - if strings.Contains(string(fileContent), winerosettaEntry) { + if strings.Contains(fileContent, winerosettaEntry) { log.Printf("dlls.txt already contains %s", winerosettaEntry) - needsUpdate = false + needsWinerosettaUpdate = false + } + // File exists, check if it contains libSiliconPatch.dll + if strings.Contains(fileContent, libSiliconPatchEntry) { + log.Printf("dlls.txt already contains %s", libSiliconPatchEntry) + needsLibSiliconPatchUpdate = false } } else { - // File doesn't exist, we'll create a new one - log.Printf("dlls.txt not found, will create a new one") + // File doesn't exist, we'll create a new one, so both need to be added + log.Printf("dlls.txt not found, will create a new one with both entries") } // Update the file if needed - if needsUpdate { - var fileContent []byte + if needsWinerosettaUpdate || needsLibSiliconPatchUpdate { + var fileContentBytes []byte + var err error if pathExists(dllsTextFile) { - var err error - fileContent, err = os.ReadFile(dllsTextFile) + fileContentBytes, err = os.ReadFile(dllsTextFile) if err != nil { - errMsg := fmt.Sprintf("failed to read dlls.txt: %v", err) + errMsg := fmt.Sprintf("failed to read dlls.txt for update: %v", err) dialog.ShowError(fmt.Errorf(errMsg), myWindow) log.Println(errMsg) // Not treating this as fatal, will try to create/overwrite } } - // Append winerosetta.dll to file content - if len(fileContent) > 0 && !strings.HasSuffix(string(fileContent), "\n") { - fileContent = append(fileContent, '\n') + currentContent := string(fileContentBytes) + updatedContent := currentContent + + // Ensure newline at the end of existing content if it's not empty + if len(updatedContent) > 0 && !strings.HasSuffix(updatedContent, "\n") { + updatedContent += "\n" + } + + if needsWinerosettaUpdate { + if !strings.Contains(updatedContent, winerosettaEntry+"\n") { // Check with newline to avoid partial matches + updatedContent += winerosettaEntry + "\n" + log.Printf("Adding %s to dlls.txt", winerosettaEntry) + } + } + if needsLibSiliconPatchUpdate { + if !strings.Contains(updatedContent, libSiliconPatchEntry+"\n") { // Check with newline + updatedContent += libSiliconPatchEntry + "\n" + log.Printf("Adding %s to dlls.txt", libSiliconPatchEntry) + } } - fileContent = append(fileContent, []byte(winerosettaEntry)...) - fileContent = append(fileContent, '\n') // Write updated content back to file - if err := os.WriteFile(dllsTextFile, fileContent, 0644); err != nil { + if err := os.WriteFile(dllsTextFile, []byte(updatedContent), 0644); err != nil { errMsg := fmt.Sprintf("failed to update dlls.txt: %v", err) dialog.ShowError(fmt.Errorf(errMsg), myWindow) log.Println(errMsg) // Not treating this as fatal for patching process } else { - log.Printf("Successfully updated dlls.txt with %s", winerosettaEntry) + log.Printf("Successfully updated dlls.txt") } } log.Println("TurtleWoW patching with bundled resources completed successfully.") - patchesAppliedTurtleWoW = true dialog.ShowInformation("Success", "TurtleWoW patching process completed using bundled resources.", myWindow) updateAllStatuses() } diff --git a/winerosetta/libSiliconPatch.dll b/winerosetta/libSiliconPatch.dll new file mode 100755 index 0000000000000000000000000000000000000000..ce0602bd6dfcda2be3137777afa37df39938e4d6 GIT binary patch literal 31744 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 SGe#ec8;bjyUgZ9d`1^nQYWEue literal 0 HcmV?d00001