Jump to content

Corrupt Saves - StrCount > 0xFFFF - CTD on load


bcsp

Recommended Posts

  • Replies 204
  • Created
  • Last Reply

Top Posters In This Topic

Hmm, ok. So if the string table were to overflow MCMs should definitely be adversely affected.

I modified the variables version of the save breaker. Added another script with 20,000 variables for a total of 80,000 strings. In theory should guarantee the string table is completely overwritten if the game engine can only handle a strCounf of 0xFFFF. Also initialized the variables to 1 just in case.

 

Loaded that old save. MCMs check out. No oddness that I can notice. Papyrus log size and number of lines are less than earlier tests.

Is there a particular data type I should be using instead of integers maybe?

Seems unlikely but what if the pointer does not wrap around like we'd think and only strings above 65,535 are affected? Not sure how to test for that.

Link to comment
Share on other sites

Bah, results are somewhat inconclusive. Added a debug trace to output the first and last variable of each script during the wait loop.

Loading the mod on to an already saved game results in the scripts ending up on the suspended stack again. => Strings not created => save not corrupt.

Starting a new game, the mod loads ok. MCMs look ok. Saves are messed up.

 

Papyrus log output of script variables:

 

 

[03/28/2016 - 07:30:48PM] Script4: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:48PM] Script2: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:48PM] Script1: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:48PM] Script3: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:53PM] Script4: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:53PM] Script2: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:53PM] Script1: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:53PM] Script3: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:56PM] [DLC2PillarBuilderActorScript < (040177DB)>]OnPackageStart()
[03/28/2016 - 07:30:58PM] Script4: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:58PM] Script2: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:58PM] Script1: First variable = 1. Last variable = 1
[03/28/2016 - 07:30:58PM] Script3: First variable = 1. Last variable = 1
[03/28/2016 - 07:31:03PM] Script4: First variable = 1. Last variable = 1
[03/28/2016 - 07:31:03PM] Script1: First variable = 1. Last variable = 1
[03/28/2016 - 07:31:03PM] Script2: First variable = 1. Last variable = 1
[03/28/2016 - 07:31:03PM] Script3: First variable = 1. Last variable = 1

Link to comment
Share on other sites

Are these local variables or properties? If the former, are you taking measures to ensure they all exist concurrently?

 

May be worth trying with string variables specifically; failing to access a string *value* should definitely trigger an error.

Link to comment
Share on other sites

Local variables held persistent with a wait loop.

Variable contents are outputted to the papyrus log every 5 seconds and that section of the log is from some time after the game had loaded so they definitely exist concurrently.

 

I'd be a little concerned that due to the time division processing nature of the papyrus VM there is a chance that with a new game that race conditions exist with regard to string creation. I need to get those scripts off the suspended stack when loading the mod on an already saved game.

 

Anyone got any thoughts on why that is happening?

 

Will try with strings later.

Link to comment
Share on other sites

Holy moly this is depressing. Ok. (rolls up sleeves). One more thing to test before I get my epic game underway. So just to confirm let's say I perfect my modlist, load up into Alternate Starts loading cell, and make a save. I open that save with the TESV ESS Files Editor and follow the steps you listed out under How Close My Saves Are To Imploding? And if I'm under 65k I am ok for the moment but I should pay attention to have quickly its growing?

 

(sobs)

 

Considering the fact that I had close to 400 esps in my load order before I began working on merging them down I think I'm going to need to be very careful about all of this.

Link to comment
Share on other sites

Ha, if you are just under the 65k mark I'd give you five minutes. You are going to need a certain amount of 'cushion'. How much we just don't know yet. Depends on the mods. But at least now if/when your saves stop loading you'll know what the problem is. I spent ages banging my head off my keyboard :D

In one way you're better off being way over the limit. Nothing worse than being over the limit after 50 hours. In fact, I've not actually played any skyrim since this has been discovered :(

Edited by bcsp
Link to comment
Share on other sites

Finally managed to get the mod loaded onto an existing save. Had to reduce the number of variables per script down to 9000. Not sure why I can load 20,000 at the start of a new game and only 9,000 on a save.

No matter, I added 7 more scripts to the quest so total scripts = 11. 9000 variables per script = 99,000 strings. I'm installing it on to a save with 45,608 existing strings.

65,535 - 45,608 = 19,927 strings needed to fill the string table to 0xFFFF, which leaves

99,000 - 19,927 = 79,073 strings for the pointer wrap around.

It should, in theory, obliterate the existing string table.

 

Nope. MCMs look fine. Opened some sliders. Set some values. Exited. Returned to MCM and everything is the way I left it.

Debug traces to the papyrus log from the 11 active scripts are correctly reporting back a value of 1 for the first and last variable in each script.

Papyrus log size: 135KB. Lines: 959

 

 

[03/29/2016 - 04:44:25AM] Script5: First variable = 1. Last variable = 1
[03/29/2016 - 04:44:25AM] Script1: First variable = 1. Last variable = 1
[03/29/2016 - 04:44:25AM] Script7: First variable = 1. Last variable = 1
[03/29/2016 - 04:44:25AM] Script6: First variable = 1. Last variable = 1
[03/29/2016 - 04:44:25AM] Script11: First variable = 1. Last variable = 1
[03/29/2016 - 04:44:25AM] Script2: First variable = 1. Last variable = 1
[03/29/2016 - 04:44:25AM] Script10: First variable = 1. Last variable = 1
[03/29/2016 - 04:44:25AM] Script4: First variable = 1. Last variable = 1
[03/29/2016 - 04:44:25AM] Script8: First variable = 1. Last variable = 1
[03/29/2016 - 04:44:25AM] Script3: First variable = 1. Last variable = 1
[03/29/2016 - 04:44:25AM] Script9: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:40AM] [DLC2PillarBuilderActorScript < (040177DB)>]OnPackageStart()
[03/29/2016 - 04:45:51AM] Script1: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:51AM] Script5: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:51AM] Script6: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:51AM] Script11: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:51AM] Script7: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:51AM] Script2: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:51AM] Script10: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:51AM] Script9: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:51AM] Script8: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:51AM] Script4: First variable = 1. Last variable = 1
[03/29/2016 - 04:45:51AM] Script3: First variable = 1. Last variable = 1

I will try with string variables next.
Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...