th3w1zard1

Members
  • Content Count

    55
  • Joined

  • Last visited

  • Days Won

    7

Everything posted by th3w1zard1

  1. Looks good to me. All of those errors are pretty self-explanatory of what the issue is. updating a field/struct directly when the struct doesn't exist, the mod's changes.ini needs to use AddField syntax. EDIT: looks like the path holopatcher's outputting is wrong actually, should rather say 'Parent field at 'Equip_ItemList\1\' does not exist'. will fix in next release
  2. How does HoloPatcher handle the mod after the syntax error is cleared up?
  3. Can you open a terminal and execute: find "~/Library/Application Support/Steam/steamapps/common/Knights of the Old Republic II/KOTOR2.app" > ~/tree_result_k2.txt && open ~/tree_result_k2.txt and post the results? This'll show me the long-awaited directory structure for the second game. For the first game: find "~/Library/Application Support/Steam/steamapps/common/swkotor/Knights of the Old Republic.app" > ~/tree_result_k1.txt && open ~/tree_result_k1.txt there's also the mac store version of the games, after someone comes along with that information, every known version will be supported.
  4. Thanks for providing the folderpath, I've put out several PSA's over this project's release asking for a user with the mac version to please share their directory structures to no avail until now. When you pointed an incorrect path, did any instructions actually run before it noticed the incorrect gamepath?
  5. Please post your logs. Should be in the same directory as KOTORModSync.app. Might be inside the .app, i.e. /KOTORModSync.app/Contents/MacOS/logs TSLpatching in that documentation is used as a verb. The action itself is supported by multiple patchers. TSLPatcher as a noun is *not* compatible with mac/linux (without wine). Use the HoloPatcher option, cross-platform compatible without requiring wine, which should be default. Actually, the validators should be making it impossible to choose the 'tslpatcher' option in any non-windows env to begin with? I'll look into that later, but for now just make sure you use HoloPatcher. Given that you're on mac you might need to unquarantine kotormodsync/holopatcher. Check System Preferences -> Security to see if it flagged holopatcher for some reason. It's difficult to tell you the issue without the logs. What I can tell you is that I tested on Sonoma/Catalina last week, using copied windows/linux kotor installations. I don't own the Mac Store/Steam versions of kotor so I haven't been able to test those.
    Thank you for your work on this. Those default dialog choices always had me rolling my eyes.
  6. We are relying on the community to help keep these instruction files up to date and mod developers to notify us when an included mod has been updated. If you notice a 'missing required archive' error please at least send the error/mod name in the future once you confirm that you indeed have the correct mod downloaded.
  7. It do be feeling like I do more testing than actually making things. That resonated deeply with me. Thank you for sharing your experience.
  8. View File Kotor AutoTranslate Tool Translate an entire mod or KOTOR install to 80 languages using Google Translate! This is a very powerful tool that can modify TLK strings and CExoLocStrings in GFFs in bulk quickly. Simply follow the prompts, point it to the GFF/TLK/Kotor directory/whatever and have it automatically translated to the language of your choice! This tool can also create those bitmap 'font packs' that users have been using to play the game in non-released languages (Many thanks to Drazgar and DarthParametric for providing the insight into the TXI files). This means the in game text will show the correct characters when playing the game. How to use: Simply run the executable. It'll ask you many things. There are 3 actions you can do with this: Set all dialog unskippable sets all dialog found in dlgs, at the chosen path, to unskippable. Includes every node. Not recommended lol Translate Will translate All CExoLocStrings (localized strings) and TLK entries at the path to the language(s) of your choice Create Fonts Will create fonts of the chosen languages to your current directory in a folder named after the language. Just drag and drop these files to your Override folder once it completes. If you point PATH1 to a KOTOR install, it will ONLY patch the Override folder, the Modules folder, the rims folder (if exists), and the dialog.tlk file. This was a design choice to improve how long the patcher takes to finish. This includes any subfolders within the aforementioned folder names. The patched files will be in the same directory as the original files with the appended language suffixed to the end of the file. For example, 'dialog_de.tlk'. You will need to rename them as their original filenames to activate them. Supported filetypes/formats: TalkTable files (TLK) Any GFF file (DLG, UTC, etc) TGA/TXI (non-translateable obviously) Any capsule (ERF, MOD, etc) DBCS languages such as Japanese/Korean/Chinese are not currently supported. This program is in beta. Please report any bugs you encounter. Source code: https://github.com/NickHugi/PyKotor/tree/master/Tools/BatchPatcher Credit: @Cortisol for creating the PyKotor library @DarthParametric for extensive testing and feature recommendations. @Drazgar for providing a ton of knowledge in regard to the TXI/TGA font packs The project would not be possible without these awesome modders. K1-translated dialog files: dialog_es.tlkdialog_sq.tlk dialog_af.tlk dialog_ar.tlk dialog_ay.tlkdialog_cs.tlkdialog_corsican.tlkdialog_chichewa.tlkdialog_catalan.tlkdialog_bulgarian.tlkdialog_belarusian.tlkdialog_basque.tlkdialog_azerbaijani.tlkdialog_aymara.tlkdialog_arabic.tlkdialog_albanian.tlkdialog_afrikaans.tlkdialog_da.tlk Submitter th3w1zard1 Submitted 11/14/2023 Category Modding Tools  
  9. View File Lightweight GUI Patcher A very simple CLI-based tool that'll take a folder of GUIs made for one resolution and patch them to work for another resolution. Please report any bugs. Simply input the path to the GUI file (or folder of GUI files) and the output location, your desired resolution, and let it work. GUI Resizer CLI Tool Overview This is a simple command-line interface (CLI) tool designed to adjust and scale GUI (Graphical User Interface) files based on different screen resolutions. The tool reads `.gui` files from the popular game Star Wars: Knights of the Old Republic and adjusts the layout to fit various resolutions and aspect ratios. It supports multiple resolutions and can handle batch processing of files. Features Multi-Resolution Support: The tool can adjust GUI files to fit several resolutions across different aspect ratios, such as 16:9, 16:10, 4:3, 5:4, 21:9, 3:2, and 1:1. Batch Processing: You can process multiple GUI files at once, making it easy to adjust a whole directory of files. Logging: Outputs logs to track the processing of files, including which resolutions were processed and where the output files are saved. Cross-Platform: Works on Windows, Linux, and macOS with Python 3.8+. Usage Basic Command To run the tool, use the following command: python3 gui_resizer.py --input <input-path> --output <output-path> --resolution <resolution> Parameters --input: The path to the `.gui` file(s) you want to process. You can specify a single file or a directory containing multiple `.gui` files. --output: The directory where the processed files will be saved. --resolution: The target resolution(s). Use the format `WIDTHxHEIGHT` (e.g., `1920x1080`). You can also specify `ALL` to process all common resolutions. Example To convert all `.gui` files in the directory `input_files/` to fit a 1920x1080 resolution and save them to the `output_files/` directory, run: python3 gui_resizer.py --input input_files/ --output output_files/ --resolution 1920x1080 Logging If logging is enabled, a log file named `output.log` will be created in the specified output directory. This file will contain details of the processing operations performed. How It Works 1. Input Handling: The tool takes in `.gui` files or directories containing these files and reads them using the `pykotor` library. 2. Resolution Scaling: The tool scales the GUI elements based on the specified target resolution(s). It calculates scale factors based on the original dimensions of the GUI and applies these factors to resize elements accordingly. 3. Output Generation: The processed GUI files are then saved to the specified output directory, organized by resolution. Credit: Cortisol for PyKotor (90% of the code) DarthParametric for testing and brainstorming the idea Submitter th3w1zard1 Submitted 11/14/2023 Category Modding Tools  
  10. View File Amazon Games's K1 Release sounds/movies fix As some of you know, K1 was released free on Amazon Games for Prime users recently. Unfortunately, the release is bugged and partially broken. Here are the steps to fix it: First, find out where your game is located on disk. Default path is: C:\Amazon Games\Library\Star Wars - Knights of the Old Download and extract the provided ZIP, and copy and replace those files into your game's miles folder, backing up if you ever want to revert the changes. backup and delete the following files from your miles folder: mssds3d.flt, msseax.flt, mssogg.asi **copy** mss32.dll from the miles folder into the same directory as swkotor.exe, overwriting when prompted. Back up the original if you want to revert. The Editable EXE is required from here on out, the amazon swkotor.exe will **not** work after these changes. Download it, backup swkotor.exe, and replace Remove Disable Movies=1 and Disable Sound = 1 from the swkotor.ini (or set them to 0) Your game should now have fully working audio and movies! The files provided here in the .zip are from the steam version of the game, other versions of the game have the exact same files. For some reason only the Amazon release is different. Submitter th3w1zard1 Submitted 11/17/2023 Category Modder's Resources  
  11. Version 0.0.0

    603 downloads

    As some of you know, K1 was released free on Amazon Games for Prime users recently. Unfortunately, the release is bugged and partially broken. Here are the steps to fix it: First, find out where your game is located on disk. Default path is: C:\Amazon Games\Library\Star Wars - Knights of the Old Download and extract the provided ZIP, and copy and replace those files into your game's miles folder, backing up if you ever want to revert the changes. backup and delete the following files from your miles folder: mssds3d.flt, msseax.flt, mssogg.asi **copy** mss32.dll from the miles folder into the same directory as swkotor.exe, overwriting when prompted. Back up the original if you want to revert. The Editable EXE is required from here on out, the amazon swkotor.exe will **not** work after these changes. Download it, backup swkotor.exe, and replace Remove Disable Movies=1 and Disable Sound = 1 from the swkotor.ini (or set them to 0) Your game should now have fully working audio and movies! The files provided here in the .zip are from the steam version of the game, other versions of the game have the exact same files. For some reason only the Amazon release is different.
  12. This is very accurate. I'd like to point out this is not just a Python problem, I have the same problems compiling my stuff in C#. Many users use Python because of it's flexibility and how quick it is to setup. Due to the ease it has a very abstract and a varying community. Many users do compile projects to an EXE. Enough people do this, and eventually someone compiles something purposefully malicious. Well... byte signatures within the file are going to match the only main Python compiler in existence, which of course isn't ran by a large industry like Microsoft, causing everyone to have this problem. The reason you don't hear about this happening much on other languages is due to the professional culture that usually surrounds compiled languages like C/C# and Java. Many of those are used by larger industries, school, and of course they have the funds to pay for signing. With python, you're more likely to run across, in an effort to bridge this back to gaming, indie-like development. Personal projects and quickly developed projects. It's a very pythonic language, for a lack of a better term. Languages such as C#/C take a bit of time to setup and install all the requirements. With python you can be setup and writing code in a couple of minutes. The volatile nature of pythonic culture is what causes the false positives. And there's nothing devs can really do besides shoveling money into signing their releases. You are always rolling the dice when you download something from the internet. As far as protection goes, Windows Defender is all you need. I'm serious. Maybe you worry about something you installed a few days ago and of some problems happening, so you download and run a malwarebytes scan. Perfectly normal, let it do its thing and then we remove it because Windows defender is all you need
  13. Version 1.0.0b1

    29 downloads

    A very simple CLI-based tool that'll take a folder of GUIs made for one resolution and patch them to work for another resolution. Please report any bugs. Simply input the path to the GUI file (or folder of GUI files) and the output location, your desired resolution, and let it work. GUI Resizer CLI Tool Overview This is a simple command-line interface (CLI) tool designed to adjust and scale GUI (Graphical User Interface) files based on different screen resolutions. The tool reads `.gui` files from the popular game Star Wars: Knights of the Old Republic and adjusts the layout to fit various resolutions and aspect ratios. It supports multiple resolutions and can handle batch processing of files. Features Multi-Resolution Support: The tool can adjust GUI files to fit several resolutions across different aspect ratios, such as 16:9, 16:10, 4:3, 5:4, 21:9, 3:2, and 1:1. Batch Processing: You can process multiple GUI files at once, making it easy to adjust a whole directory of files. Logging: Outputs logs to track the processing of files, including which resolutions were processed and where the output files are saved. Cross-Platform: Works on Windows, Linux, and macOS with Python 3.8+. Usage Basic Command To run the tool, use the following command: python3 gui_resizer.py --input <input-path> --output <output-path> --resolution <resolution> Parameters --input: The path to the `.gui` file(s) you want to process. You can specify a single file or a directory containing multiple `.gui` files. --output: The directory where the processed files will be saved. --resolution: The target resolution(s). Use the format `WIDTHxHEIGHT` (e.g., `1920x1080`). You can also specify `ALL` to process all common resolutions. Example To convert all `.gui` files in the directory `input_files/` to fit a 1920x1080 resolution and save them to the `output_files/` directory, run: python3 gui_resizer.py --input input_files/ --output output_files/ --resolution 1920x1080 Logging If logging is enabled, a log file named `output.log` will be created in the specified output directory. This file will contain details of the processing operations performed. How It Works 1. Input Handling: The tool takes in `.gui` files or directories containing these files and reads them using the `pykotor` library. 2. Resolution Scaling: The tool scales the GUI elements based on the specified target resolution(s). It calculates scale factors based on the original dimensions of the GUI and applies these factors to resize elements accordingly. 3. Output Generation: The processed GUI files are then saved to the specified output directory, organized by resolution. Credit: Cortisol for PyKotor (90% of the code) DarthParametric for testing and brainstorming the idea
  14. Version v0.7.1

    263 downloads

    Translate an entire mod or KOTOR install to 80 languages using Google Translate! This is a very powerful tool that can modify TLK strings and CExoLocStrings in GFFs in bulk quickly. Simply follow the prompts, point it to the GFF/TLK/Kotor directory/whatever and have it automatically translated to the language of your choice! This tool can also create those bitmap 'font packs' that users have been using to play the game in non-released languages (Many thanks to Drazgar and DarthParametric for providing the insight into the TXI files). This means the in game text will show the correct characters when playing the game. How to use: Simply run the executable. It'll ask you many things. There are 3 actions you can do with this: Set all dialog unskippable sets all dialog found in dlgs, at the chosen path, to unskippable. Includes every node. Not recommended lol Translate Will translate All CExoLocStrings (localized strings) and TLK entries at the path to the language(s) of your choice Create Fonts Will create fonts of the chosen languages to your current directory in a folder named after the language. Just drag and drop these files to your Override folder once it completes. If you point PATH1 to a KOTOR install, it will ONLY patch the Override folder, the Modules folder, the rims folder (if exists), and the dialog.tlk file. This was a design choice to improve how long the patcher takes to finish. This includes any subfolders within the aforementioned folder names. The patched files will be in the same directory as the original files with the appended language suffixed to the end of the file. For example, 'dialog_de.tlk'. You will need to rename them as their original filenames to activate them. Supported filetypes/formats: TalkTable files (TLK) Any GFF file (DLG, UTC, etc) TGA/TXI (non-translateable obviously) Any capsule (ERF, MOD, etc) DBCS languages such as Japanese/Korean/Chinese are not currently supported. This program is in beta. Please report any bugs you encounter. Source code: https://github.com/NickHugi/PyKotor/tree/master/Tools/BatchPatcher Credit: @Cortisol for creating the PyKotor library @DarthParametric for extensive testing and feature recommendations. @Drazgar for providing a ton of knowledge in regard to the TXI/TGA font packs The project would not be possible without these awesome modders. K1-translated dialog files: dialog_es.tlkdialog_sq.tlk dialog_af.tlk dialog_ar.tlk dialog_ay.tlkdialog_cs.tlkdialog_corsican.tlkdialog_chichewa.tlkdialog_catalan.tlkdialog_bulgarian.tlkdialog_belarusian.tlkdialog_basque.tlkdialog_azerbaijani.tlkdialog_aymara.tlkdialog_arabic.tlkdialog_albanian.tlkdialog_afrikaans.tlkdialog_da.tlk
  15. Large work has gone into ensuring the patcher can mirror TSLPatcher 1:1. Some additional features have been added by request and some TSLPatcher bugs have been fixed. Source code can be found here: https://github.com/NickHugi/PyKotor/tree/master/pykotor/tslpatcher If you've ever wondered why TSLPatcher is throwing an error with your mod or why certain patches don't seem to be applied correctly with TSLPatcher, this is a great resource to finding the problem. If you don't understand or want to learn Python, large work has gone into documenting each function and public classes. Just read the docstrings. If you ever needed to install a TSLPatcher mod on Mac or Linux, the library will run natively (without wine) on most distros of Mac and Linux - and resolve case-sensitivity issues. The PyKotor library is the same library used for the HoloPatcher and the Holocron Toolset projects. - both are inherently cross-platform KOTOR tools. This post isn't made to be a plug to HoloPatcher or the toolset, but more a general resource for users and modders alike.
  16. Aren't the StreamWaves/StreamVoices folders just .wavs? You can already diff those by pointing it to that folder and/or wav file. To clarify, there's basic pattern recognition in there that'll look for chitin.key, dialog.tlk, and several required folders to be considered an install. if you point the differ towards two installation folders, it won't diff *every* file/folder by default as that's a lot of unwanted data to diff. It'll diff Modules, Override, and the dialog.tlk. You can *absolutely* diff any file or *any* folder with the CLI by pointing it to a non-installation folder or a specific file. If PyKotor recognizes the filetype it will use its internal methods to diff them, recursing into nested DLG lists for instance. If it doesn't recognize the file, it'll compare file hashes. Lips aren't in that v0.1.0 but they're done and will be added in v0.2.0. Let me know if there's any other filetypes I forgot.
  17. View File KotorDiff A simple CLI to easily compare KOTOR file formats. This is a very simple CLI to PyKotor. If you find TSLPatcher isn't patching the resulting files in the way you want, you can use this tool to compare your manual changes to the resulting TSLPatcher result. You can also use it to compare entire installations, directories, or single files. Why KotorDiff? It is (or should be) common knowledge that Kotor Tool is not safe to use for anything besides extraction. But have you ever wondered why that is? Let's take a look at a .utc file extracted directly from the BIFs (the OG vanilla p_bastilla.utc). Extract it with KTool and name it p_bastilla_ktool.utc. Now open the same file in ktool's UTC character editor, change a single field (literally anything, hp, strength, whatever you fancy), and save it as p_bastilla_ktool_edited.utc. KotorDiff's output: Using --path1='C:\Users\nodoxxxpls\Downloads\p_bastilla_ktool_edited.utc' Using --path2='C:\Users\nodoxxxpls\Downloads\p_bastilla_ktool.utc' Using --ignore-rims=False Using --ignore-tlk=False Using --ignore-lips=False Using --compare-hashes=True Using --use-profiler=False GFFStruct: number of fields have changed at 'p_bastilla_ktool_edited.utc': '72' --> '69' Field 'Int16' is different at 'p_bastilla_ktool_edited.utc\HitPoints': --- (old)HitPoints +++ (new)HitPoints @@ -1 +1 @@ -18 +24 Field 'LocalizedString' is different at 'p_bastilla_ktool_edited.utc\FirstName': --- (old)FirstName +++ (new)FirstName @@ -1 +1 @@ -Bastila +31360 Field 'Int16' is different at 'p_bastilla_ktool_edited.utc\CurrentHitPoints': --- (old)CurrentHitPoints +++ (new)CurrentHitPoints @@ -1 +1 @@ -20 +24 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\0\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -3 +94 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\2\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -39 +98 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\3\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -43 +55 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\4\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -44 +107 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\5\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -55 +3 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\6\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -94 +39 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\7\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -98 +43 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\8\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -107 +44 Field 'LocalizedString' is different at 'p_bastilla_ktool_edited.utc\Description': --- (old)Description +++ (new)Description @@ -0,0 +1 @@ +-1 Field 'String' is different at 'p_bastilla_ktool_edited.utc\Subrace': --- (old)Subrace +++ (new)Subrace @@ -1 +0,0 @@ -0 ^ 'p_bastilla_ktool_edited.utc': GFF is different ^ --------------------------------------------------- 'p_bastilla_ktool_edited.utc' DOES NOT MATCH 'p_bastilla_ktool.utc' Sheesh! I bet you can't even guess which field I modified! Again I changed a singular field! What is all this nonsense that KTool did to my character sheet? Moral: Don't use KTool to modify files. It seems to have the incorrect field types defined internally and doesn't respect the original file when saving a new one. But KotorDiff saved the day here and outputted exactly what happened on save. How to use: Simply run the executable. It'll ask you for 3 paths: PATH1 Path to the first K1/TSL install, file, or directory to diff. PATH2 Path to the second K1/TSL install, file, or directory to diff. OUTPUT_LOG File name/path of the desired output logfile (defaults to log_install_differ.log in the current directory) If you point PATH1 and PATH2 to two KOTOR installs, it will ONLY compare the Override folder, the Modules folder, the Lips folder, the rims folder (if exists), the StreamWaves/StreamVoices folder, and the dialog.tlk file. This was a design choice to improve how long the differ takes to finish. This includes any subfolders within the aforementioned folder names. Supported filetypes/formats: TalkTable files (TLK) Any GFF file (DLG, UTC, GUI, UTP, UTD, GIT, IFO, etc) Any capsule (ERF, MOD, RIM, SAV, etc) Not supported: NCS, NSS, ITP Any file format that's not supported will have its SHA256 hash compared instead. CLI Support: This is a very flexible tool. You can send it command line arguments if you would like to use it in a 3rd party tool. Run `kotordiff.exe --help` to get a full syntax. If there's an error, the exit code will be 3 (if err is known by my code) or 1 (some sys error loading the tool). If the two paths match, the exit code will be 0. If the two paths don't match, exit code will be 2. You can utilize these error codes to utilize KotorDiff in a customized 3rd party script, or add-on to WinMerge/WinDirStat, possibilities are endless. FAQ: I am struggling to read the diff output, why is it saying +/-/@38924 and what does it mean? A: GIT Diff is a standardized output format that has been widely adopted and used since probably the 80s/90s. https://stackoverflow.com/a/2530012/4414190 is by far the best explanation i've seen, but honestly ask ChatGPT to explain it further if needed, or send me a pm if something doesn't make sense! Couldn't I just open my two files with Holocron Toolset/ERFEdit/K-GFF etc? You could, but for me it became tedious to manually compare them side by side, expanding every node etc. Leave alone completely multiple files. This tool allows you to simply input two paths and have the full differences outputted and logged. A main benefit is it'll show you the exact GFF paths that differ. Output such as `Missing struct: "EntryList\5\RepliesList\3" {contents of the struct}` has been very useful. Why is my antivirus is flagging this? This is a false-positive and there's nothing I can do. Python source scripts are compiled to executables using PyInstaller, but unfortunately some antivirus's have been known to flag anything compiled with PyInstaller this way. The problem is similar to why your browser may warn you about downloading any files with the .EXE extension. This whole tool is open source, feel free to run directly from the source script: https://github.com/NickHugi/PyKotor/blob/master/Tools/KotorDiff/src/kotordiff/__main__.py There's a well-written article explaining why the false positives happen on their issue template: https://github.com/pyinstaller/pyinstaller/blob/develop/.github/ISSUE_TEMPLATE/antivirus.md TLDR: PyInstaller is an amazing tool, but antiviruses may flag it. This is not the fault of PyInstaller or my tool, but rather the fault of how some scummy users have chosen to use PyInstaller in the past. Please report any false positives you encounter to your antivirus's website, as reports not only improve the accuracy of everybody's AV experience overall, but also indirectly supports the PyInstaller project. Source code: https://github.com/NickHugi/PyKotor/blob/master/Tools/KotorDiff/ Credit: @Cortisol for creating the PyKotor library (i.e., 90% of the code for this tool) Submitter th3w1zard1 Submitted 09/30/2023 Category Modder's Resources  
  18. Version v1.0.0b1

    35 downloads

    A simple CLI to easily compare KOTOR file formats. This is a very simple CLI to PyKotor. If you find TSLPatcher isn't patching the resulting files in the way you want, you can use this tool to compare your manual changes to the resulting TSLPatcher result. You can also use it to compare entire installations, directories, or single files. Why KotorDiff? It is (or should be) common knowledge that Kotor Tool is not safe to use for anything besides extraction. But have you ever wondered why that is? Let's take a look at a .utc file extracted directly from the BIFs (the OG vanilla p_bastilla.utc). Extract it with KTool and name it p_bastilla_ktool.utc. Now open the same file in ktool's UTC character editor, change a single field (literally anything, hp, strength, whatever you fancy), and save it as p_bastilla_ktool_edited.utc. KotorDiff's output: Using --path1='C:\Users\nodoxxxpls\Downloads\p_bastilla_ktool_edited.utc' Using --path2='C:\Users\nodoxxxpls\Downloads\p_bastilla_ktool.utc' Using --ignore-rims=False Using --ignore-tlk=False Using --ignore-lips=False Using --compare-hashes=True Using --use-profiler=False GFFStruct: number of fields have changed at 'p_bastilla_ktool_edited.utc': '72' --> '69' Field 'Int16' is different at 'p_bastilla_ktool_edited.utc\HitPoints': --- (old)HitPoints +++ (new)HitPoints @@ -1 +1 @@ -18 +24 Field 'LocalizedString' is different at 'p_bastilla_ktool_edited.utc\FirstName': --- (old)FirstName +++ (new)FirstName @@ -1 +1 @@ -Bastila +31360 Field 'Int16' is different at 'p_bastilla_ktool_edited.utc\CurrentHitPoints': --- (old)CurrentHitPoints +++ (new)CurrentHitPoints @@ -1 +1 @@ -20 +24 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\0\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -3 +94 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\2\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -39 +98 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\3\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -43 +55 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\4\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -44 +107 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\5\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -55 +3 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\6\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -94 +39 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\7\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -98 +43 Field 'UInt16' is different at 'p_bastilla_ktool_edited.utc\FeatList\8\Feat': --- (old)Feat +++ (new)Feat @@ -1 +1 @@ -107 +44 Field 'LocalizedString' is different at 'p_bastilla_ktool_edited.utc\Description': --- (old)Description +++ (new)Description @@ -0,0 +1 @@ +-1 Field 'String' is different at 'p_bastilla_ktool_edited.utc\Subrace': --- (old)Subrace +++ (new)Subrace @@ -1 +0,0 @@ -0 ^ 'p_bastilla_ktool_edited.utc': GFF is different ^ --------------------------------------------------- 'p_bastilla_ktool_edited.utc' DOES NOT MATCH 'p_bastilla_ktool.utc' Sheesh! I bet you can't even guess which field I modified! Again I changed a singular field! What is all this nonsense that KTool did to my character sheet? Moral: Don't use KTool to modify files. It seems to have the incorrect field types defined internally and doesn't respect the original file when saving a new one. But KotorDiff saved the day here and outputted exactly what happened on save. How to use: Simply run the executable. It'll ask you for 3 paths: PATH1 Path to the first K1/TSL install, file, or directory to diff. PATH2 Path to the second K1/TSL install, file, or directory to diff. OUTPUT_LOG File name/path of the desired output logfile (defaults to log_install_differ.log in the current directory) If you point PATH1 and PATH2 to two KOTOR installs, it will ONLY compare the Override folder, the Modules folder, the Lips folder, the rims folder (if exists), the StreamWaves/StreamVoices folder, and the dialog.tlk file. This was a design choice to improve how long the differ takes to finish. This includes any subfolders within the aforementioned folder names. Supported filetypes/formats: TalkTable files (TLK) Any GFF file (DLG, UTC, GUI, UTP, UTD, GIT, IFO, etc) Any capsule (ERF, MOD, RIM, SAV, etc) Not supported: NCS, NSS, ITP Any file format that's not supported will have its SHA256 hash compared instead. CLI Support: This is a very flexible tool. You can send it command line arguments if you would like to use it in a 3rd party tool. Run `kotordiff.exe --help` to get a full syntax. If there's an error, the exit code will be 3 (if err is known by my code) or 1 (some sys error loading the tool). If the two paths match, the exit code will be 0. If the two paths don't match, exit code will be 2. You can utilize these error codes to utilize KotorDiff in a customized 3rd party script, or add-on to WinMerge/WinDirStat, possibilities are endless. FAQ: I am struggling to read the diff output, why is it saying +/-/@38924 and what does it mean? A: GIT Diff is a standardized output format that has been widely adopted and used since probably the 80s/90s. https://stackoverflow.com/a/2530012/4414190 is by far the best explanation i've seen, but honestly ask ChatGPT to explain it further if needed, or send me a pm if something doesn't make sense! Couldn't I just open my two files with Holocron Toolset/ERFEdit/K-GFF etc? You could, but for me it became tedious to manually compare them side by side, expanding every node etc. Leave alone completely multiple files. This tool allows you to simply input two paths and have the full differences outputted and logged. A main benefit is it'll show you the exact GFF paths that differ. Output such as `Missing struct: "EntryList\5\RepliesList\3" {contents of the struct}` has been very useful. Why is my antivirus is flagging this? This is a false-positive and there's nothing I can do. Python source scripts are compiled to executables using PyInstaller, but unfortunately some antivirus's have been known to flag anything compiled with PyInstaller this way. The problem is similar to why your browser may warn you about downloading any files with the .EXE extension. This whole tool is open source, feel free to run directly from the source script: https://github.com/NickHugi/PyKotor/blob/master/Tools/KotorDiff/src/kotordiff/__main__.py There's a well-written article explaining why the false positives happen on their issue template: https://github.com/pyinstaller/pyinstaller/blob/develop/.github/ISSUE_TEMPLATE/antivirus.md TLDR: PyInstaller is an amazing tool, but antiviruses may flag it. This is not the fault of PyInstaller or my tool, but rather the fault of how some scummy users have chosen to use PyInstaller in the past. Please report any false positives you encounter to your antivirus's website, as reports not only improve the accuracy of everybody's AV experience overall, but also indirectly supports the PyInstaller project. Source code: https://github.com/NickHugi/PyKotor/blob/master/Tools/KotorDiff/ Credit: @Cortisol for creating the PyKotor library (i.e., 90% of the code for this tool)
  19. I am sorry about all the issues caused by v0.8 I've released v0.8.4 which I've tested on k1 and k2. If anyone runs into an issue, please ensure your app says 'KOTORModSync v0.8.4' or a later version at the top.
    With mod retextures, it seems like even just adding one retexture causes all the other textures to feel very out of place. So naturally, you go searching for more, as if you're trying to solve the puzzle. While you don't see the default hilts in the game very often (hidden by the holder's hands), when you do, they are very bland and boring, and really stick out like a sore thumb in a playthrough with multiple other ai upscales and other various retextures. This mod does a great job of adding yet another piece to the puzzle. The screenshots do not do this mod justice, this retexture is great.
  20. Yes you are correct, KOTORModSync and the default instructions file are capable of following the mod build exactly. If you uncheck or check a mod from the list, any instruction you'll see on the mod build post is respected and followed. See https://pastebin.com/7gML3zCJ for more information on how KMS handles this internally. for example, if you have the mod `HD Visas Marr` selected for install, you might remember the modbuild says that 3 specific files must be deleted for the ultimate character overhaul patches. This is how we handle that instruction: So yes, simply select the mods you want to install from the left list, press install, and let KMS worry about how to handle it all.
    These saves have been a great help to me for testing major plot-points for K1. The saves themselves are chosen in decent locations where you aren't hard locked into finishing one event first. It's a very complete list of saves for *all* classes. Everything is remarkably documented and labeled. It's a simple release, but one can tell as a end user that some extra thought was put into this. Well done.