Jump to content

Home

TSLPatcher v1.2.10b1 (mod installer)


Recommended Posts

Well it worked partially there Stoffe however it still copies files into the overide. Then it tries to patch the 2da files. When it gives it's error it also leaves the files in override. here is the installlog.

 

Hmm, that's not right, it should check right at the beginning before proceeding to do anything else. Weird it didn't do like that with the mod I used to test the 1.2.8b9 installer with. Must have moved things around improperly. I'll have another look at it tomorrow and try to fix it more reliably that time. :)

Link to comment
Share on other sites

  • Replies 312
  • Created
  • Last Reply
Well it worked partially there Stoffe however it still copies files into the overide. Then it tries to patch the 2da files. When it gives it's error it also leaves the files in override.

 

Unless I've managed to screw up again (which in itself wouldn't be surprising) the patcher should now hopefully check for required files before doing anything no matter what. I've uploaded v1.2.8b10 which should contain this fix.

Link to comment
Share on other sites

  • 3 months later...

Hey Stoffe quick question **grinning** any chance you can give lessons on this thing live over teamspeak or vent? LOL.. i want to learn and well ...sadly readme files just confuse me haha. I want to take all these old mods I have downloaded and incorporate them into a tsl patcher somehow so thatway whenever I decide to use or remove a mod its easier and I dont have to fight for days with files.

Link to comment
Share on other sites

  • 1 month later...

Ok, I think i followed your dialog tutorial step for step, but i get the following output when I run the setup file, what did I do wrong?

 

• Patch operation started...
• Copying file "upcrystals.2da" to Override folder...
• Modifying 2DA file upcrystals.2da...
• Finished updating 2DA file C:\Program Files\LucasArts\SWKotOR2\override\upcrystals.2da.
• Copying file "globalcat.2da" to Override folder...
• Modifying 2DA file globalcat.2da...
• Finished updating 2DA file C:\Program Files\LucasArts\SWKotOR2\override\globalcat.2da.
• Modifying GFF blueprints...
• Copying file "atton.dlg" to Override folder...
• Modifying GFF file atton.dlg...
• Unable to find a field label matching "AddField0" in atton.dlg, skipping...
• Unable to find a field label matching "AddField1" in atton.dlg, skipping...
• Unable to find a field label matching "AddField2" in atton.dlg, skipping...
• Unable to find a field label matching "AddField3" in atton.dlg, skipping...
• Unable to find a field label matching "AddField4" in atton.dlg, skipping...
• Unable to find a field label matching "AddField5" in atton.dlg, skipping...
• Unable to find a field label matching "AddField6" in atton.dlg, skipping...
• Unable to find a field label matching "AddField7" in atton.dlg, skipping...
• Unable to find a field label matching "AddField8" in atton.dlg, skipping...
• Unable to find a field label matching "AddField9" in atton.dlg, skipping...
• Unable to find a field label matching "AddField10" in atton.dlg, skipping...
• Unable to find a field label matching "AddField11" in atton.dlg, skipping...
• Unable to find a field label matching "AddField12" in atton.dlg, skipping...
• Unable to find a field label matching "AddField13" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY2 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY1" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY4 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY3" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY6 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY5" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY8 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY7" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY10 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY9" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY12 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY11" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY14 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY13" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY16 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY15" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY18 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY17" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY20 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY19" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY22 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY21" in atton.dlg, skipping...
• Invalid memory token 2DAMEMORY24 encountered, unable to insert a proper value in the 2da!
• Unable to find a field label matching "2DAMEMORY23" in atton.dlg, skipping...
• Finished updating GFF file atton.dlg
• Installing unmodified files...
• Copying file "pc_colo_101.uti" to the "Override" folder...
• Copying file "pc_colo_102.uti" to the "Override" folder...
• Copying file "pc_colo_103.uti" to the "Override" folder...
• Copying file "pc_colo_104.uti" to the "Override" folder...
• Copying file "pc_dblsbr100.uti" to the "Override" folder...
• Copying file "pc_dblsbr101.uti" to the "Override" folder...
• Copying file "pc_dblsbr102.uti" to the "Override" folder...
• Copying file "pc_dblsbr103.uti" to the "Override" folder...
• Copying file "pc_dblsbr104.uti" to the "Override" folder...
• Copying file "pc_lghtsbr100.uti" to the "Override" folder...
• Copying file "pc_lghtsbr101.uti" to the "Override" folder...
• Copying file "pc_lghtsbr102.uti" to the "Override" folder...
• Copying file "pc_lghtsbr103.uti" to the "Override" folder...
• Copying file "pc_lghtsbr104.uti" to the "Override" folder...
• Copying file "t7_atton01.tga" to the "Override" folder...
• Copying file "t7_atton01.txi" to the "Override" folder...
• Copying file "t7_maul01.tga" to the "Override" folder...
• Copying file "t7_maul01.txi" to the "Override" folder...
• Copying file "vis_lghtsbr01.uti" to the "Override" folder...
• Copying file "vis_lghtsbr02.uti" to the "Override" folder...
• Copying file "visas1.ncs" to the "Override" folder...
• Copying file "visas2.ncs" to the "Override" folder...
• Copying file "w_dblsbr_200.mdl" to the "Override" folder...
• Copying file "w_dblsbr_200.mdx" to the "Override" folder...
• Copying file "w_dblsbr_201.mdl" to the "Override" folder...
• Copying file "w_dblsbr_201.mdx" to the "Override" folder...
• Copying file "w_dblsbr_202.mdl" to the "Override" folder...
• Copying file "w_dblsbr_202.mdx" to the "Override" folder...
• Copying file "w_dblsbr_203.mdl" to the "Override" folder...
• Copying file "w_dblsbr_203.mdx" to the "Override" folder...
• Copying file "w_dblsbr_204.mdl" to the "Override" folder...
• Copying file "w_dblsbr_204.mdx" to the "Override" folder...
• Copying file "w_lghtsbr_101.mdl" to the "Override" folder...
• Copying file "w_lghtsbr_101.mdx" to the "Override" folder...
• Copying file "w_lghtsbr_226.mdl" to the "Override" folder...
• Copying file "w_lghtsbr_226.mdx" to the "Override" folder...
• Copying file "w_lghtsbr_228.mdl" to the "Override" folder...
• Copying file "w_lghtsbr_228.mdx" to the "Override" folder...
• Copying file "w_lghtsbr_229.mdl" to the "Override" folder...
• Copying file "w_lghtsbr_229.mdx" to the "Override" folder...
• Copying file "w_lghtsbr_230.mdl" to the "Override" folder...
• Copying file "w_lghtsbr_230.mdx" to the "Override" folder...
• Copying file "Aleek.tga" to the "Override" folder...
• Copying file "Aleek.txi" to the "Override" folder...
• Copying file "atton1.ncs" to the "Override" folder...
• Copying file "atton2.ncs" to the "Override" folder...
• Copying file "atton_lghtsbr01.uti" to the "Override" folder...
• Copying file "atton_lghtsbr02.uti" to the "Override" folder...
• Copying file "bao_dblsbr01.uti" to the "Override" folder...
• Copying file "bao_dblsbr02.uti" to the "Override" folder...
• Copying file "baodur1.ncs" to the "Override" folder...
• Copying file "baodur2.ncs" to the "Override" folder...
• Copying file "baosaber.dlg" to the "Override" folder...
• Copying file "disc_lghtsbr01.uti" to the "Override" folder...
• Copying file "disc_lghtsbr02.uti" to the "Override" folder...
• Copying file "disciple1.ncs" to the "Override" folder...
• Copying file "disciple2.ncs" to the "Override" folder...
• Copying file "iw_dblsbr_200.tga" to the "Override" folder...
• Copying file "iw_dblsbr_201.tga" to the "Override" folder...
• Copying file "iw_dblsbr_202.tga" to the "Override" folder...
• Copying file "iw_dblsbr_203.tga" to the "Override" folder...
• Copying file "iw_dblsbr_204.tga" to the "Override" folder...
• Copying file "iw_lghtsbr_101.tga" to the "Override" folder...
• Copying file "iw_lghtsbr_226.tga" to the "Override" folder...
• Copying file "iw_lghtsbr_228.tga" to the "Override" folder...
• Copying file "iw_lghtsbr_229.tga" to the "Override" folder...
• Copying file "iw_lghtsbr_230.tga" to the "Override" folder...
• Copying file "iw_SbrCrstl_100.tga" to the "Override" folder...
• Copying file "iw_SbrCrstl_101.tga" to the "Override" folder...
• Copying file "iw_SbrCrstl_102.tga" to the "Override" folder...
• Copying file "iw_SbrCrstl_103.tga" to the "Override" folder...
• Copying file "iw_SbrCrstl_104.tga" to the "Override" folder...
• Copying file "maiden1.ncs" to the "Override" folder...
• Copying file "maiden2.ncs" to the "Override" folder...
• Copying file "maiden_dblsbr01.uti" to the "Override" folder...
• Copying file "maiden_dblsbr02.uti" to the "Override" folder...
• Copying file "mira1.ncs" to the "Override" folder...
• Copying file "mira2.ncs" to the "Override" folder...
• Copying file "mira_lghtsbr01.uti" to the "Override" folder...
• Copying file "mira_lghtsbr02.uti" to the "Override" folder...
• Copying file "pc_colo_100.uti" to the "Override" folder...
• Done. All changes have been applied.

 

Oh what do you know, i've been working on this for 20 hours straight now.

LOL

 

thanks any help would be appreciated

 

ciao for now

Link to comment
Share on other sites

  • 1 month later...

Ok so I've been thinking about trying to ensure the compatibility of one of my mods with TSLRP when its released. Dashus recently explained to me that TG is apparently putting all their files (.2da's, .jrl, .dlg's, etc.) in a subfolder within the "override" folder. Now TSLPatcher could get at almost any file within that subfolder that a modder may need to edit except for .2da files. Now I was under the impression that .2da files couldn't be placed within a subfolder and still work (I thought that's why TSLPatcher didn't let you modify the location where .2da's were placed) but over here http://www.lucasforums.com/showthread.php?p=2346623#post2346623 Pavlos told me that I was wrong and, as I said, Dashus, if I read his PM right, told me that TG was doing just that. They're smart cookies so I guess I'm convinced.

What I want to know is:

If the game will read them, why can't we direct TSLPatcher to edit or place .2da files wherever we want?

Also, again if it is possible, is there some workaround? Could I manually edit the "changes.ini" to direct TSLPatcher to put my changes wherever I want?

Sorry for the long, rambling, post.

Link to comment
Share on other sites

What I want to know is:

If the game will read them, why can't we direct TSLPatcher to edit or place .2da files wherever we want?

 

It's a sort of brute force way of resolving ambiguity as to which file to modify. If you place 2DA files (or pretty much any file) in sub-folders you allow for a condition where the ResRef (filename) of that resource is no longer unique within the override scope.

 

For example, if you have 20 different mods using sub-folders for their data in the override folder you could technically have 20 different appearance.2da files in your override folder, of which the game will only load one and completely ignore the rest (causing all the mods whose 2DA file was ignored to malfunction in the process). Since I don't know how the game determines which file to use if it encounters multiple copies of the same file within the override folder and its sub-folders this is a kind of forced way to resolve that ambiguity. It would be a relatively simple matter to make the TSLPatcher look inside sub-folders as well and pick the first match it finds, but handling the consequences of doing so would not be as simple.

 

Sub-folders within the override folder is a mixed blessing. It makes it easier to organize the files belonging to different mods, but at the same time it makes it a lot harder to detect and avoid mod conflicts where different mods modify the same standard game files (or add new files that are named the same). If you have everything in the override folder directly you'll immediately notice if a file you attempt to copy there already exists.

 

So in short, the TSLPatcher not looking in sub-folders is a "feature" since I couldn't think of any better ideas how to resolve such ambiguities. If anyone has a better idea of how to handle that I'm all ears. :)

Link to comment
Share on other sites

Thanks for your rationale.

So what do people think is the best way for me to try and ensure compatibility with TSLRP if I'm using TSLPatcher? I guess I'll grab people's attention with the "info.rtf" file telling them if they have TSLRP installed they'll have to move the files I need to the override folder manually like Pavlos suggested on the other thread. I guess that's not a huge hassle... If someone has another idea let me know.

Thanks again stoffe

Link to comment
Share on other sites

So what do people think is the best way for me to try and ensure compatibility with TSLRP if I'm using TSLPatcher?

 

Personally I think it would be best to wait until the Restoration Project mod has been released. It's hard to know what needs to be done from a compatibility standpoint before knowing what they have changed, what files are affected and how they are organized.

 

In more general terms I've always put it in the info.rtf instructions that all standard files required by the mod must be moved into the main override folder if they already exist there in sub-folders. Can't make it much more eye-catching than that, so if people still don't read the instructions it's their own fault if they mess up the game by installing the mod improperly.

Link to comment
Share on other sites

  • 3 weeks later...
Hi Stoffe :)

 

Is there a way to check if a field already exists in a gff file before actually adding a new one? (Like the ExclusiveColumn token for 2da's.) The point being I'd like to avoid adding the exact same field if it already exists.

 

I've made a quick modification to how the TSLPatcher modifies GFF files. If it now encounters a field with the same label, data type and position in the GFF tree as one it tried to add it will not add a new field, but modify the existing field instead, setting the values the new field would have been given.

 

The exception is structs added to a List field since they have no label, but are rather accessed by the list index they are added as, which would be dynamic if some mod has already modified the same file earlier.

 

I've uploaded version 1.2.9b which contains this change. See the first post (or the SWK Modding tools page) for a download link.

 

Same disclaimer as usual: This has only been minimally tested so use it at your own risk. It seemed to work as intended when I tried it, but there might be bugs and oversights. If you notice anything odd please let me know.

Link to comment
Share on other sites

hi,

 

can anyone help me with this problem?

I downloaded several mods from filefront and a few of them included TSLPatcher as easy installation. those include Jedi Temple on Coruscant, HK Factory Reconstructed, and New Force Powers. the problem is that whenever i click the install mod it says "An unhandled Error Occurred!" :(

 

I tried to download the latest patcher and unzip it to the mod folder but it still didnt work. Right now i cant install any of the mods that include the patcher and since i dont have any moding abilities i cant do it manually. if anyone can help it would be much appreciated!!

Link to comment
Share on other sites

can anyone help me with this problem?

I downloaded several mods from filefront and a few of them included TSLPatcher as easy installation. those include Jedi Temple on Coruscant, HK Factory Reconstructed, and New Force Powers. the problem is that whenever i click the install mod it says "An unhandled Error Occurred!" :(

 

Without knowing more exactly how you do things it's impossible to say what could be wrong. A few things:

  1. Do you extract the downloaded mod to a folder on your harddrive or are you trying to run the installer from within a zip file?
  2. If you extract the mod files, to where do you extract them?
  3. If you extracted them from ZIP files did you preserve the folder structure within the archive? (WinZip has a nasty habit of flattening the folder hierarchy within an archive if you just drag and drop files out from it.)
  4. Does your user account on the computer have write access to the KOTOR/TSL game folder?
  5. When does that message occur? Directly when you start the installer? When you click the "Install" button in the installer? Some time during the installation process?
  6. If you get to the start if the installation process did you select the correct destination folder if asked? It should be the KOTOR/TSL game folder, not the override folder.

Link to comment
Share on other sites

1, i extracted the mod into a folder before i tried to run it

2, i extracted my files to F:Games\Star Wars KOTOR 2 stuff\HK-Factory Reconstructed (the other mods are extracted to the same place within the folder Star Wars KOTOR 2 stuff, but with a different folder name ex: F:...\...\Jedi Temple)

3, I used WinRAR and i always extract them fully, so i'm pretty sure that its not flattened or something like that

4, i have an admin account on my windows xp (as opposed to limited) so i should have full access. and i installed the star wars games from this account

5, the error occurrs right after i click the install button in the installer. it doesnt even ask for my game folder

6, i never got to that part because i think the error happens right before it asks me, but i know its the game folder and not the override that i should be inputing

 

Its happening to my KOTOR I mods now too. i cant use the super skip taris mod and its the same error. hope this helps

Link to comment
Share on other sites

5, the error occurrs right after i click the install button in the installer. it doesnt even ask for my game folder

 

Hmm, weird. Does the confirmation dialog box appear after you click the Install button? Does the mod info text box get cleared and any line posted in the progress log there, or does it crash before anything else seemingly happens?

 

You could try opening the changes.ini file found inside the tslpatchdata folder of the mod you try to install, and under the [settings] section change the value of the PlaintextLog key from 0 to 1, save and then try to run the installer again. Does that make any difference?

Link to comment
Share on other sites

Err... excuse me, wanted to ask something about TSL Patcher.

Actually, it's about the .2da files.

 

I have difficulty in using the ChangesEdit, about adding new lines for .2da files. Here's the case. I want the TSL patcher to create new lines for the .2da files (spells, upcrystals, and baseitems), so I choose the .2da files selection on the changes.ini tree. After that I add the .2da files I wrote above. Then it shows a blank modifier. I have read the readme file, and it tell me about comparing something. So I've tried to compare by clicking the "finger button" on the TSL patcher.

 

After that, the "Select ORIGINAL .2da to compare against" window appear. So I choose the upcrystal.2da that places in my Override folder. Then the "Select MODIFIED .2da to compare against ORIGINAL" window appear. So I choose the upcrystal.2da from the mod I have in the TSL Patcher folder.

 

After that it shows a bunch of lines. From there, I don't understand what to do next. How to make the installer add a new lines for the mod each time it's installed? I'm getting confused at this...

 

Thank you very much for your time... and your help. :)

Link to comment
Share on other sites

  • 2 weeks later...

Hi stoffe :)

 

I have some questions about using TSLP for integrating dialog files. (I absolutely love this idea, btw). I used the meditation.rar file that you supplied as an example, So...

 

From what I gather, if the parent of the branch you want to add is an entry the Path var would be EntryList\<entry#>\RepliesList

 

What is the Path var syntax if the parent is a reply?

What is the Path var syntax if the branch you want to add is in the StartingList?

 

One last thing. I noticed you pretty much hard coded the entry and reply indexes into the changes.ini file. Suppose for arguments sake, that these indexes already existed (as in someone had already added to the dialog file). Is there a token to determine the count of the EntryList and ReplyList? Or does TSLP check for this and adjust as needed?

Link to comment
Share on other sites

From what I gather, if the parent of the branch you want to add is an entry the Path var would be EntryList\<entry#>\RepliesList

 

What is the Path var syntax if the parent is a reply?

What is the Path var syntax if the branch you want to add is in the StartingList?

 

The RepliesList field under each Entry struct in the EntryList contains an index link to a struct in the ReplyList for each Reply that comes below that Entry.

 

The EntriesList field under each Reply struct in the ReplyList contains an index link to a struct in the EntryList for each Entry that comes below that Reply.

 

So, to add a new Reply node below an existing Entry in the DLG file, you find the list index of the parent Entry (#) within the EntryList and set the parent like EntryList\#\RepliesList for your new node.

 

To add a new Entry node below an existing Reply in the DLG file you find the list index of the parent Reply (#) within the ReplyList and set the parent like ReplyList\#\EntriesList for your new node.

 

Consequently, since the patcher needs to know the index of the parent node in the ReplyList or EntryList this means the patching will fail if the user has a heavily modified version of the DLG file in their install destination (override or ERF/RIM file) since those indexes may no longer exist, or they may have been renumbered if a DLG editor that doesn't preserve the indexing order of the nodes was used to modify it.

 

In other words this isn't as safe to do as for example TLK or 2DA patching since it assumes a certain structure of the source file but has no way of verifying if this actually is the case, but in the instances that it does work it should save the user some trouble having to merge things manually. :)

 

 

One last thing. I noticed you pretty much hard coded the entry and reply indexes into the changes.ini file.

 

If you mean the Value of the Index fields those aren't really hardcoded, since the values assigned when the fields are created will be overwritten further down, during the convoluted modifying of the fields that have been added before.

 

For example, if you look at these modifiers (relevant parts highlighted):

[gff_kreia_Index_0]
FieldType=DWORD
Label=Index
Value=738
[color=Yellow][b]2DAMEMORY8=!FieldPath[/b][/color]


[gff_kreia_ReplyList_738_0]
FieldType=Struct
Path=ReplyList
Label=
TypeId=ListIndex
AddField0=gff_kreia_Listener_3
AddField1=gff_kreia_AnimList_3
AddField2=gff_kreia_Text_3
AddField3=gff_kreia_VO_ResRef_3
AddField4=gff_kreia_Script_3
AddField5=gff_kreia_Delay_3
AddField6=gff_kreia_Comment_3
AddField7=gff_kreia_Sound_3
AddField8=gff_kreia_Quest_3
AddField9=gff_kreia_PlotIndex_3
AddField10=gff_kreia_PlotXPPercentage_3
AddField11=gff_kreia_WaitFlags_3
AddField12=gff_kreia_CameraAngle_3
AddField13=gff_kreia_FadeType_3
AddField14=gff_kreia_EntriesList_0
AddField15=gff_kreia_SoundExists_3
AddField16=gff_kreia_ActionParam1_3
AddField17=gff_kreia_ActionParam1b_3
AddField18=gff_kreia_ActionParam2_3
AddField19=gff_kreia_ActionParam2b_3
AddField20=gff_kreia_ActionParam3_3
AddField21=gff_kreia_ActionParam3b_3
AddField22=gff_kreia_ActionParam4_3
AddField23=gff_kreia_ActionParam4b_3
AddField24=gff_kreia_ActionParam5_3
AddField25=gff_kreia_ActionParam5b_3
AddField26=gff_kreia_ActionParamStrA_3
AddField27=gff_kreia_ActionParamStrB_3
AddField28=gff_kreia_AlienRaceNode_3
AddField29=gff_kreia_CamVidEffect_3
AddField30=gff_kreia_Changed_3
AddField31=gff_kreia_Emotion_3
AddField32=gff_kreia_FacialAnim_3
AddField33=gff_kreia_NodeID_3
AddField34=gff_kreia_NodeUnskippable_3
AddField35=gff_kreia_PostProcNode_3
AddField36=gff_kreia_RecordNoOverri_3
AddField37=gff_kreia_RecordVO_3
AddField38=gff_kreia_Script2_3
AddField39=gff_kreia_VOTextChanged_3
AddField40=gff_kreia_CameraID_3
AddField41=gff_kreia_RecordNoVOOverri_3
[color=Yellow][b]2DAMEMORY7=ListIndex[/b][/color]


[kreia.dlg]
AddField0=gff_kreia_RepliesList_3_0
AddField1=gff_kreia_EntryList_627_0
AddField2=gff_kreia_EntryList_628_0
AddField3=gff_kreia_EntryList_629_0
AddField4=gff_kreia_ReplyList_738_0
AddField5=gff_kreia_ReplyList_739_0
AddField6=gff_kreia_ReplyList_740_0
2DAMEMORY2=2DAMEMORY1
2DAMEMORY4=2DAMEMORY3
2DAMEMORY6=2DAMEMORY5
[color=Yellow][b]2DAMEMORY8=2DAMEMORY7[/b][/color]
2DAMEMORY10=2DAMEMORY9
2DAMEMORY12=2DAMEMORY11

 

In the first one, the line 2DAMEMORY8=!FieldPath stores the full field path to the new Reply-link node that was just added in the 2DAMEMORY8 token (needed since you don't know beforehand what list index it will end up as).

 

In the second one, the line 2DAMEMORY7=ListIndex stores the list index the new struct that is inserted ends up as in the ReplyList in the 2DAMEMORY7 token.

 

In the third one, the line 2DAMEMORY8=2DAMEMORY7 links these two stored pieces of info together. It assigns the value in the 2DAMEMORY7 token (the list index) to the field at the path stored in the 2DAMEMORY8 token.

 

For example, say that the RepliesList link to your new Reply node that is added to entry 587 in the EntryList gets added as EntryList\587\RepliesList\4\Index. And that your new reply node struct added to the ReplyList (which the previous link should point to) gets added at list index 600 in the Reply List.

 

Then the third highlighted modifier above would read, when parsed by the patcher:

Assign the value 600 to the field EntryList\587\RepliesList\4\Index

 

Thus the initial value that was assigned when the Index field was created above (738) would be overwritten by the actual value (600) soon afterwards, and it's no longer hardcoded but dynamic. :)

 

Very convoluted and primitive, but at least it works (in the cases I've tested) until someone can figure out a better way of doing it. :)

 

(Wish I had used XML instead of INI as format for the patcher config file back when I first made it. Would have made it a lot easier to structure this sort of thing logically in the configuration. :( )

Link to comment
Share on other sites

  • 3 weeks later...

I've uploaded TSLPatcher v1.2.10b1 and ChangeEdit v1.0.5b1 to correct a problem I just noticed, download link is in the first post in this thread as usual.

 

These updates fixes a bug/oversight with ExoString fields and ExoLocString field substrings containing linefeeds or carriage return characters when patching GFF format files. Earlier the INI file would get messed up and only the text before the first LF/CR would be added to the GFF files. Now all the text should be properly added even with multiple paragraphs.

 

INI config files already broken by this bug (*nudge* Brotherhood of Shadow mod *nudge*) can be fixed manually with a text editor by removing the newlines so all the text in following a lang# key is on the same line in the INI file, and then insert <#LF#> where the newlines should be. (Make sure you turn off word/line wrapping in the text editor first) E.g this...

 

lang0=The quick brown fox

 

jumps over the lazy dog!

 

...would have to be changed to look like this:

 

lang0=The quick brown fox<#LF#><#LF#>jumps over the lazy dog!

 

...which would end up like this in the GFF substring after patching the file:

 

The quick brown fox

 

jumps over the lazy dog

 

If you don't do this fix, the text in the GFF substring after patching would just be:

 

The quick brown fox

 

 

 

Note: This only applies to changes.ini files that have already been broken due to this bug. ChangeEdit has been updated to handle this automatically when creating new files, or creating new GFF file modifiers in an existing one.

Link to comment
Share on other sites

  • 1 month later...

Hi I'm using the patcher (newest version) and trying to assing a new value thourgh a memory token for an item's BaseItem field. What I want is to copy an existent line on baseitems.2da and modify somethings inside it and I want the memory token to save the new line by its number in the index. Then an item will get modified and use that token as the value for it's BaseItem field. However everytime I do it the field ends up with the original value (that's the value of the line that's being copied) instead of the new one. Here's the relevant part of the code (since it's too large to post here):

 

(Tlk StrRef and other bunch of things)...

[2DAList]
(...)
Table1=baseitems.2da
(...)


[GFFList]
(...)
File13=w_melee_19.uti

(...)

[baseitems.2da]
(...)
CopyRow1=baseitems_add_ryyk_blade
(...)

[baseitems_add_ryyk_blade]
RowIndex=4
ExclusiveColumn=label
2DAMEMORY137=RowLabel
label=Ryyk_Blade
name=StrRef431
damageflags=4
numdice=3
dietoroll=4
critthreat=1
crithitmult=3
reqfeat0=2DAMEMORY27
specfeat=2DAMEMORY29
focfeat=2DAMEMORY28

 

That created the new line, it works, the new line appears as I wanted it on baseitems.2da, however when I read the log it says that what's being saved is the value "4" (original value), instead of the new value which should be "107", at the end of the table.

 

(...)
[w_melee_19.uti]
BaseItem=2DAMEMORY137
LocalizedName(strref)=StrRef431
DescIdentified(strref)=StrRef432
UpgradeLevel=3
!ReplaceFile=1

 

That modifies the weapon, however as the value being stored is "4" instead of the new line...Well it doesn't work.

 

I've taken a look to Chainz Bao Dur armor, but he adds a new line from scratch instead of copying it.

 

So any thoughts?

 

EDIT: Never mind problem solved. I had to put the 2DAMEMORY creation after I set the label for the base item. Then it stored it correctly. Thanks anyway.

Link to comment
Share on other sites

trying to assing a new value thourgh a memory token for an item's BaseItem field. What I want is to copy an existent line on baseitems.2da and modify somethings inside it and I want the memory token to save the new line by its number in the index. Then an item will get modified and use that token as the value for it's BaseItem field.

 

The problem is with the line...

 

2DAMEMORY137=RowLabel

 

...as this will save the value in the (Row Label) column, while the baseitems.2da file is indexed by line number. So you should use...

 

2DAMEMORY137=RowIndex

 

...instead, since this will save the line number your new line gets added as in the token.

 

 

 

Generally there are three key values you can use to identify a particular row in most cases:

 

RowIndex - the line number of the row

RowLabel - The label of the row, displayed as a (Row Label) column in KotorTool.

LabelIndex - The value in the label column of the row. This obviously only works with 2DA files that have a label column, and is mostly used for editing/copying existing rows where you don't know what the row label or line number is (usually since the target lines were dynamically added by a mod earlier).

Link to comment
Share on other sites

The problem is with the line...

 

2DAMEMORY137=RowLabel

 

...as this will save the value in the (Row Label) column, while the baseitems.2da file is indexed by line number. So you should use...

 

2DAMEMORY137=RowIndex

 

...instead, since this will save the line number your new line gets added as in the token.

 

 

 

Generally there are three key values you can use to identify a particular row in most cases:

 

RowIndex - the line number of the row

RowLabel - The label of the row, displayed as a (Row Label) column in KotorTool.

LabelIndex - The value in the label column of the row. This obviously only works with 2DA files that have a label column, and is mostly used for editing/copying existing rows where you don't know what the row label or line number is (usually since the target lines were dynamically added by a mod earlier).

Thanks stoffe, though as I said it worked with RowLabel I just had to put the 2DAMEMORY line after the itemtype was created.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.


×
×
  • Create New...