Originally Posted by munchbacca
hello. i'm playing KOTOR on my mac and i want to install a mod (super skip taris) to use with the game. the only problem is that it uses a tsl patcher to install it.
i tried just dumping all the files into the override folder and that doesn't work, how do i manually install a mod that uses tsl patcher?
If you don't have the ability to run Win32 executables you'll need to duplicate the work that the patcher does by hand instead. That would require that there are some modding tools available that can be run on a mac (2DA editor, TLK editor, GFF editor and script compiler in particular, depending on what mods you try to install). I don't know if there are any since I haven't owned a mac in 8 years.
The actual work you need to do depends on what mod it is and how complex the installer instructions for it are.
If you have the necessary tools look inside the tslpatchdata
folder for a file named changes.ini
. This is a plain text file that contains work instructions for the TSLPatcher.
There are usually five main sections in this file containing key/value pairs (and usually a fair number of sub-sections referenced by them): [TLKList]
. Sometimes there is a [HACKList]
section as well.
contains a list of tokens with their corresponding index value in the append.tlk
file (that comes with the mod and should be in the tslpatchdata
folder as well, if used). The patcher inserts these entries into the game's dialog.tlk
file and then substitutes the StrRef#
token with the dialog.tlk StrRef index the entry was inserted as, whenever the token is encountered in a 2DA, GFF or Script modifier below.
contains a list of table modifiers, specifying the name of 2DA file which needs to be changed by the mod. It looks for 2DA files in the override folder first, and if it already exists there it is modified. If it doesn't exist it's copied from the tslpatchdata folder to the override folder and then modified.
Each value in the 2DAList (for example spells.2da
) has a corresponding section (i.e. [spells.2da]
) further down the changes.ini file. In this file-specific section is a list of modifier-types as key with a section name as value. There are three types of keys, AddRow#
, followed by a unique incrementing numerical index. They behave as could be expected, AddRow
-modifiers add a new line at the end of the 2DA file, ChangeRow
modifies a cell value of an existing line and CopyRow
makes a copy of an existing row and adds it as a new line at the end of the file (usually modifying some of the cell values as well).
The values of these keys is the name of another section further down the changes.ini file that describes what changes should be made. Most of the keys in these sections are just column heading labels in the 2DA file, with the value being what should be set in the cell for that column on the row being manipulated/added. There are a few exceptions though:
modifiers, the first line contains either a RowIndex, RowLabel or LabelIndex key to inform the patcher of which line to modify (or to make a copy of, in the latter case).
- RowIndex specifies the line number in the file, starting at 0 at the top and counting down.
- RowLabel specifies the Row Label value of the line, which is a separate column in the 2DA file
- LabelIndex looks for a label column and looks for a row with a value matching what's set in that column
modifiers the first row may optionally have an ExclusiveColumn
key, which is set to the label of a column in which the value assigned to that column below in the section must not already exist for a line in the 2DA file. If it does the existing line will be modified rather than a new being inserted.
In either of these cases the keys can also be one of the 2DAMEMORY#
tokens, which are essentially memory slots where the patcher temporarily holds a value that might be assigned somewhere else later on. Those are usually used to keep track of the line number of a new row that has been created, so that it might be inserted into another 2DA, a GFF file or a script later on.
There is also a special high()
value that might be assigned, which will set the value in that column to the highest existing numerical value of all rows + 1.
contains a name of GFF files that should be modified, and each filename value here has a corresponding section below in the changes.ini file as well. This file-specific section they has a key that specifies a path/name of a field to set the value of, and the value to set to that key. For example, a key like PropertiesList\0\Subtype
would modify the Subtype
field inside the first struct inside the PropertiesList
list field in the file.
holds a list of NSS script source files that the patcher should compile. It may also contain an optional first key, !DefaultDestination
, which changes where the compiled scripts are installed. If left out they will be put in the override folder. The NSS scripts usually contains either a StrRef#
or a 2DAMEMORY#
token, which the patcher would substitute with the corresponding value before compiling. Thus you will need to replace them manually in the NSS file with the proper value before you compile the scripts.
contains a list of folder path/names within the game folder where files will just be copied unmodified. Each key
in this list has an identically named section in changes.ini, which lists the files that should be copied to that folder, and how it should behave if the file already exists at the destination (overwrite/skip).
section, if present, contains a list of NCS compiled script filenames, which a correspondingly named section below. The section contains a list of byte offsets in the file, and a value to write to that offset.