Jump to content

Wrye Bash - All Games


Utumno

Recommended Posts

9 hours ago, alt3rn1ty said:

One question on Nexus :

"So I made a slight boo boo. When dragging and dropping archived files into the installer tab I accidentally clicked the "Move to" option from the prompt and had checked the small box to not show the prompt any longer, but that was an accident. I had really wanted it keep making copies as I move the mods from their folder and into Bash as now instead it's simply moving the files completely out of their original folder and into Bash. How do I change this back so that it's always copying?"

Is this a case of having to delete one of the dat files ?, and if so I think it ought to be easier to undo via the settings icon

Ugh, I agree. I spent 4 hours last night trying to figure this one out without having to delete one of the .dat files or having the user reinstall WB. I tried to find info on how to open & view the contents of the .dat files WB uses, thinking maybe something in there could just be changed (e.g., flip a 1 to 0 or something).  I was unable to find any documentation, old thread posts with similar issue, or much of anything. (Can anyone tell me how to view the .dat file contents? (Yes, I'm inept..)) If the user had backed up their settings, I imagine this would have been included, and could have been restored, but I doubt the casual user thinks to back up their config settings on first run (or ever for that matter). An option in the settings would be a great way to go.

Link to comment
Share on other sites

I just saw that, thanks! I didn't want to suggest it without knowing for absolutely certain that it didn't contain information on files that were being tracked, even with it having a backup. Don't want to cause more harm than good in trying to be helpful.

Link to comment
Share on other sites

@hlp I just updated my Fallout 4 Template. There are two bytes after the block of plugins. I have marked it as unknown and it's just 00 00 so I don't know what it does. I loaded my Save 68 from 1.9.4 and made a new save game Save 69 and compared the bytes after the list of plugins to confirm that the offsets and the data counts are still the same.  There were minor differences in the offsets because of a few additional plugins and the two extra bytes, but all the counts including Changed Forms Count was exactly the same.  That's probably all you need to add to xEdit.

Link to comment
Share on other sites

@Utumno I don't know how easy or hard it will be to read this template. It has some 010 specific information in it. However, it can read Fallout4, Skyrim, and Skyrim SE files. The only change I have to make between Fallout 4 and Skyrim/SSE is the Magic Signature.  This would mean you should be able to define one save game format for Oblivion, and one for Fallout 4, Skyrim, and SSE however you want. Maybe you want to define one class or have a sub-class and inherit classes.  That's up to you.

I also just realized I could do if x not equal to 12 then do whatever. I am going to have to find out if there are other save game version first. For Skyrim it should be 9 or lower, for Skyrim SE it's currently 12, and for Fallout 4 it's 15.

Spoiler

 


//------------------------------------------------
//--- 010 Editor v8.0 Binary Template
//
//      File: Skyrim_SE_Save_Game_Template.bt
//   Authors: jonwd7, Sharlikran, zach@okzach.com
//   Purpose: Defines a template for
//            parsing .ess files used
//            by Skyrim SE for Save Games.
//------------------------------------------------

// wstring, as used in Skyrim/SSE Save files
typedef struct {
    uint16  size <hidden=true, fgcolor=cLtGray>;
    char    data[size];
} WSTRING <read=ReadWSTRING>;

string ReadWSTRING( WSTRING &ws ) {
    string s;
    SPrintf( s, "%s", ws.data );
    return s;
}


// RGBA Pixel used for Screenshot data
typedef struct {  // Have not verified color order, assuming RGBA for now
    ubyte   rgbRed      <name="Red", fgcolor=cRed, bgcolor=cDkBlue>;
    ubyte   rgbGreen    <name="Green", fgcolor=cGreen, bgcolor=cDkBlue>;
    ubyte   rgbBlue     <name="Blue", fgcolor=cBlue, bgcolor=cDkBlue>;
    ubyte   rgbAlpha    <name="Alpha", fgcolor=cLtGray, bgcolor=cDkBlue>;
} RGBA <read=ReadRGBA>;

string ReadRGBA( RGBA &a )
{
    string s;
    SPrintf( s, "#%02X%02X%02X%02X", a.rgbRed, a.rgbGreen, a.rgbBlue, a.rgbAlpha );
    return s;
}

// RGBA Pixel used for Screenshot data
typedef struct {  // Have not verified color order, assuming RGBA for now
    ubyte   rgbRed      <name="Red", fgcolor=cRed, bgcolor=cDkBlue>;
    ubyte   rgbGreen    <name="Green", fgcolor=cGreen, bgcolor=cDkBlue>;
    ubyte   rgbBlue     <name="Blue", fgcolor=cBlue, bgcolor=cDkBlue>;
} RGB <read=ReadRGB>;

string ReadRGB( RGB &a )
{
    string s;
    SPrintf( s, "#%02X%02X%02X", a.rgbRed, a.rgbGreen, a.rgbBlue );
    return s;
}

// Compression Type
typedef enum <ushort> {
    UNKNOWN0 = 0,
    UNKNOWN1 = 1,
    LZ4 = 2
} COMPRESSTYPE;

// Player Gender
typedef enum <uint16> {
    MALE = 0,
    FEMALE = 1
} GENDER;


// Fallout 4 Save Game File Structure
struct FO4SAVEGAME {
    // File start
    char    magic[13] <name="Signature", fgcolor=cGreen, bgcolor=cGray>;
    uint32  headerSize <name="Header Size">;

    // Header data
    struct HEADER {
        uint32  saveVersion <name="Save Version">;
        uint32  saveNumber <name="Save Number">;
        WSTRING playerName <name="Player Name", fgcolor=cRed, bgcolor=cGray>;
        uint32  playerLevel <name="Player Level", fgcolor=cGreen>;
        WSTRING playerLocation <name="Player Location", fgcolor=cYellow, bgcolor=cGray>;
        WSTRING gameTime <name="Game Time", fgcolor=cAqua, bgcolor=cGray>;
        WSTRING playerRace <name="Player Race", fgcolor=cPurple, bgcolor=cGray>;
        GENDER  playerGender <name="Player Gender">;
        float   playerExp <name="Experience earned">;
        float   levelExp <name="Experience required">;
        FILETIME    filetime <name="filetime">;
        uint32  screenshotWidth <name="Screenshot Width", fgcolor=cWhite, bgcolor=cDkBlue>;
        uint32  screenshotHeight <name="Screenshot Height", fgcolor=cWhite, bgcolor=cDkBlue>;
        if (( header.saveVersion > 9 ) && ( header.saveVersion < 15 ))
            COMPRESSTYPE compressionType <name="Compression Type">;
    } header <open=true, name="Header">;

    // RGBA Screenshot Data
    if ( header.saveVersion > 9 )
        struct SCREENSHOTRGBA {
            RGBA    data[ header.screenshotWidth * header.screenshotHeight ] <name="RGBA Pixel">;
        } screenshotRGBA <name="RGBA Screenshot">;

    // RGB Screenshot Data
    if ( header.saveVersion < 12 )
        struct SCREENSHOTRGB {
            RGB    data[ header.screenshotWidth * header.screenshotHeight ] <name="RGB Pixel">;
        } screenshotRGB <name="RGB Screenshot">;

    if (( header.saveVersion > 9 ) && ( header.saveVersion < 15 ))
        struct COMPRESSED {
            uint uncompressedSize;
            uint compressedSize;
            char data[compressedSize];
        } compressed <name="Compressed">;

    if (( header.saveVersion < 12 ) || ( header.saveVersion > 12 ))
        ubyte   formVersion <name="Form Version">;
    if ( header.saveVersion > 12 )
        WSTRING gameVersion <name="Game Version">;

    // Plugin list
    if (( header.saveVersion < 12 ) || ( header.saveVersion > 12 ))
        uint32  pluginListSize <name="Plugin List Size">;
    if (( header.saveVersion < 12 ) || ( header.saveVersion > 12 ))
        struct PLUGINLIST {
            ubyte   count <name="Plugin File Count">;
            WSTRING pluginList[count] <optimize=false, name="Plugin Files">;
        } pluginlist <open=true, name="Plugin File List">;

    if ((header.saveVersion > 12) && (formVersion == 68))
        ushort unknown <name="unknown", fgcolor=cGreen, bgcolor=cGray>;

    // File Map
    if (( header.saveVersion < 12 ) || ( header.saveVersion > 12 ))
        struct FILEMAP {
            uint32 refIDArrayCountOffset <name="RefID Array Count Offset", fgcolor=cBlack, bgcolor=cDkPurple>;
            uint32 unknownOffset <name="Unknown Table Offset", fgcolor=cBlack, bgcolor=cDkPurple>;
            uint32 globalData1Offset <name="Global Data 1 Offset", fgcolor=cGreen, bgcolor=cDkPurple>;
            uint32 globalData2Offset <name="Global Data 2 Offset", fgcolor=cGreen, bgcolor=cDkPurple>;
            uint32 changeFormsOffset <name="Change Forms Offset", fgcolor=cYellow, bgcolor=cDkPurple>;
            uint32 globalData3Offset <name="Global Data 3 Offset", fgcolor=cGreen, bgcolor=cDkPurple>;
            uint32 globalData1Count <name="Global Data 1 Count", fgcolor=cDkGreen, bgcolor=cDkPurple>;
            uint32 globalData2Count <name="Global Data 2 Count", fgcolor=cDkGreen, bgcolor=cDkPurple>;
            uint32 globalData3Count <name="Global Data 3 Count", fgcolor=cDkGreen, bgcolor=cDkPurple>;
            uint32 changeFormsCount <name="Change Forms Count", fgcolor=cYellow, bgcolor=cDkPurple>;
        } filemap <open=true, name="File Map">;

} fo4savegame <open=true, name="Fallout 4 Save Game">;

// Global Data
typedef struct {
    uint32  id;
    uint32  size;
    if( size > 0 )
        ubyte   data[size];
} DATABLOCK <read=ReadDATABLOCK, name="Data Block">;

string ReadDATABLOCK( DATABLOCK &b ) {
    string s;
    SPrintf( s, "ID: %d", b.id );
    return s;
}


// Global Data 1
if (( fo4savegame.header.saveVersion < 12 ) || ( fo4savegame.header.saveVersion > 12 )) {
    FSeek( fo4savegame.filemap.globalData1Offset );
    struct GLOBALDATA1 {
        DATABLOCK   dataBlock[fo4savegame.filemap.globalData1Count] <optimize=false>;
    } globaldata1 <name="Global Data 1">;
    // Global Data 2
    FSeek( fo4savegame.filemap.globalData2Offset );
    struct GLOBALDATA2 {
        DATABLOCK   dataBlock[fo4savegame.filemap.globalData2Count] <optimize=false>;
    } globaldata2 <name="Global Data 2">;
    // Global Data 3
    FSeek( fo4savegame.filemap.globalData3Offset );
    struct GLOBALDATA3 {
        DATABLOCK   dataBlock[fo4savegame.filemap.globalData3Count] <optimize=false>;
    } globaldata3 <name="Global Data 3">;
}

// Change Forms
typedef struct {
    ubyte   refID[3]    <name="RefID">;  // FormID is 4 bytes, RefID is only 3
    uint32  changeFlags <name="Change Flags">;
    ubyte   type        <name="Type">;
    ubyte   version     <name="Version">;
    local uint32 lenType;
    lenType = type >> 6;
    switch( lenType ) {
        case 0:
            ubyte   deflatedSize;
            ubyte   inflatedSize;
            break;
        case 1:
            uint16  deflatedSize;
            uint16  inflatedSize;
            break;
        case 2:
            uint32  deflatedSize;
            uint32  inflatedSize;
            break;
    }
    if( deflatedSize > 0 )
        ubyte   data[deflatedSize];
} CHANGEFORM <read=ReadCHANGEFORM, name="Change Form Block">;

string ReadCHANGEFORM( CHANGEFORM &c ) {
    string s;
    SPrintf( s, "id: %02X %02X %02X", c.refID[0], c.refID[1], c.refID[2] );
    return s;
}

if (( fo4savegame.header.saveVersion < 12 ) || ( fo4savegame.header.saveVersion > 12 )) {
    FSeek( fo4savegame.filemap.changeFormsOffset );
    struct CHANGEFORMS {
        CHANGEFORM  changeForm[fo4savegame.filemap.changeFormsCount] <optimize=false>;
    } changeforms <name="Change Forms">;
}

// Player Stats
typedef struct {
    WSTRING stat <name="Player Stat", fgcolor=cGreen, bgcolor=cGray>;
    ubyte   category <name="Category", fgcolor=cDkGreen>;
    uint32  value <name="Stat Value", fgcolor=cGreen, bgcolor=cLtGray>;
} PLAYERSTAT <read=ReadPLAYERSTAT, name="Player Stat">;

string ReadPLAYERSTAT( PLAYERSTAT &p ) {
    string s;
    SPrintf( s, "%s: %d", p.stat.data, p.value);
    return s;
}

// Extract the Player Stats from the first Global Data 1 block
if (( fo4savegame.header.saveVersion < 12 ) || ( fo4savegame.header.saveVersion > 12 )) {
    FSeek( startof( globaldata1.dataBlock[0].data ) );
    struct PLAYERSTATS {
        uint32 count <hidden=true>;
        PLAYERSTAT stats[count] <optimize=false>;
    } playerstats <name="Player Stats">;
}

 

If you want to test this yourself, you can download 010 it has a 30 day trial, but you have to change the magic signature to 12 for Fallout 4 and 13 for Skyrim/SSE. Also this doesn't show the compressed data for SSE.

For anyone that wants to use this with Fallout 4 (Until Wrye Flash is updated) to see how the ESL files sort feel free to ask questions I'm happy to help.

Link to comment
Share on other sites

@hlp I'm working on the Oblivion/FO3/FNV headers now.  I noticed that for Oblvion -Saves isn't supported.  I only have up to the Milliseconds properly defined because I'm looking at TES4EditSaves code, the Wrye Bash/Flash code, and this Wiki page for Oblivion. So my head is exploding.

In a comment above to Utumno, I mentioned that I don't know all the versions of the Save games. I have Skyrim Save games with 9, Skyrim SE with 12, and Fallout 4 with 15. What others are there for FO4/TES5/SSE?

Link to comment
Share on other sites

Re: new FO4 files - so do I have to include anything in allBethFiles @Arthmoor?

Re: saves - I get "Save game masters size (227) not as expected (229)." for these this saves - so what changed exactly ? They added two bytes in the masters block ?

Re: move vs copy in installers DnD - yep can't revert this except by deleting the BashSettings.dat/bak (reverting all UI settings along ad (bug) saved active plugins lists) - you ca fill up an enhancement for this - 308.

 

EDIT: hmm more complex than that:

__init__.py 1411 refresh: Failed to load Exitsave0_53D2DC46M476F72646F6E_NationalGuardTrainingYard03_000032_20170828180529_1_2.fos: Save game masters size (227) not as expected (229).
__init__.py 1411 refresh: Failed to load Save1_53D2DC46M476F72646F6E_NationalGuardTrainingYard03_000032_20170829001656_1_2.fos: Save game masters size (204) not as expected (229).

FO4 versions are 11 (used to work) and 15 (this new one). Any chance we have compression in there ?

Link to comment
Share on other sites

I know you asked Arthmoor but the answer about this is here. There are no new files. If you have the Beta it is adding some Creation Club mods. Those are part of the standard Beta install to test things. Normally you would install them like any other mod so they are just mods, not official DLC or Beth content.

Your other question about compression, no just changes of where bytes are located. They add things. Possibly things they think they will need at some point, but may not be using. I don't know.

I know that the template might be hard to read.  It is very complex for the following reasons:

  • One game mode has two bytes for the compression type
  • One game mode has 3 bytes for the screen shot and the others have 4
  • Certain games have the Form Version of the Save Game prior to the plugin list but Skyrim SE has it within the compressed data
  • One game has a string which is the version of the Game the save game was made with, after the Form Version
  • One game has two bytes after the list of plugins and before the Offsets. You need to be in the correct location to change the offsets when changing the file names or it will break the save game.

Your current code doesn't read to the correct places and set variables after reading the correct amount of bytes because each game mode needs something different.

I wonder if there are any other Save Game versions for Skyrim SE, or is it just 12? Does anyone know?

Link to comment
Share on other sites

My current code reads to the correct places all saves formats except the new one - of course there is different code per game in saves_files.py. What I don't know is what exactly are the changes in version 15 of FO4 saves. That is what positions changed and what info is stored there.

Link to comment
Share on other sites

I can't just tell you add a line here because I don't completely understand the new save game code.  What is happening is the same thing that happens when reading the plugins.  Bethesda added bytes of data but you need to know the Form Version so you can set the proper condition to read them.  The same as what I was talking about with Form Version 44 and 43 for Skyrim SE.  Form Version 43 was 16 bytes and Form Version 44 is 24.  In version 43 you had a ubyte but now it's a uint.

I will have to show you.  I'll let you know when I'm done making the changes.  I didn't have access to 010 previously so I didn't know what was in the Save Game.  I couldn't really see the Hex Bytes of data.  The old save game code ignores the Form Version but now you need it to read the two bytes Bethesda added to Save Game version 15 Form Version 68. Also the other unknown data isn't unknown anymore so that changes where you will be when you arrive at the block of Plugin names. The two bytes are added are after the plugins names not before. It really changes things.

Link to comment
Share on other sites

2 hours ago, Sharlikran said:

I know you asked Arthmoor but the answer about this is here. There are no new files. If you have the Beta it is adding some Creation Club mods. Those are part of the standard Beta install to test things. Normally you would install them like any other mod so they are just mods, not official DLC or Beth content.

I wonder if there are any other Save Game versions for Skyrim SE, or is it just 12? Does anyone know?

Ehm I came out of the beta, and the CC BA2's which came with the beta were deleted ..

But then the following day the Public release came down the pipe, along with those same bunch of CC files.

It is out of beta, and they are installed (without me buying any Creation Club items)

So I would say they have become official content. It may well be a mistake on Bethesda's part, but right now they are sitting on my hard drive and I have to beware using Clean Data if the game engine expects them to be installed currently. They would probably just re-install at some point if steam notices the diff, and I dont really care if they are deleted or not, I will never personally use them, but they are auto-installing in the new patch release.

Save Games for Skyrim SE I reckon will probably go the same way as FO4 next month when the Creation Club starts to be patched into that game aswell, it may also probably get a bunch of redundant CC files .. Time will tell on both issues I think.

 

Also since the public release of the FO4 patch, I made a few more saves and they are still giving errors (ie no difference between Beta new patch saves and Public release of the new patch saves)

The saves listed as giving errors also do not show up on the saves tab in Wrye Bash

Link to comment
Share on other sites

50 minutes ago, alt3rn1ty said:

Ehm I came out of the beta, and the CC BA2's which came with the beta were deleted ..

But then the following day the Public release came down the pipe, along with those same bunch of CC files.

It is out of beta, and they are installed (without me buying any Creation Club items)

So I would say they have become official content. It may well be a mistake on Bethesda's part, but right now they are sitting on my hard drive and I have to beware using Clean Data if the game engine expects them to be installed currently. They would probably just re-install at some point if steam notices the diff, and I dont really care if they are deleted or not, I will never personally use them, but they are auto-installing in the new patch release.

Save Games for Skyrim I reckon will probably go the same way as FO4 next month when the Creation Club starts to be patched into that game aswell, it may also probably get a bunch of redundant CC files .. Time will tell on both issues I think.

Grrr Bethesda, why did they do that? I have been so busy with the save games that I didn't know that it went out of Beta. I can ask the community manager but the problem is, he is busy, and might not get back to me. There needs to be a way to ask these questions without bothering Bethesda Employees. The forums are not enough. Because as you mentioned we don't know whether or not they will suddenly disappear.

Link to comment
Share on other sites

7 minutes ago, Sharlikran said:

There needs to be a way to ask these questions without bothering Bethesda Employees. The forums are not enough. Because as you mentioned we don't know whether or not they will suddenly disappear.

I'm fairly surprised that they don't have a community outreach manager dedicated to handling interactions between modding tool makers and the Bethesda team. That would make everyones lives a lot easier.  

Link to comment
Share on other sites

Nobody official is coming up with any answers yet https://bethesda.net/community/topic/88724/why-is-fo4-auto-downloading-creation-club-ba2s?page=1

Thats really not surprising though. Its on page 3 or 4 of that topic where people started to realise the files were not just part of the beta, but were going live in the public release. That part of the official forums is full of similar topics right now. FO4 on Steam is being down repped to hell.

Link to comment
Share on other sites

I'm trying to think of who we could bug at Bethesda to ask them who to talk to about finding out about the save game format etc. If I was dealing with any other software vendor (part of my RL job) I would bug the living piss out of them until they put me in contact with someone. 

Edit: ok I think they do have a handful of people we may be able to reach out to. I don't want to do it on my regular twitter account though because I have a pirate as an avatar on there. Not a good idea. :P

Link to comment
Share on other sites

6 hours ago, Beermotor said:

I'm trying to think of who we could bug at Bethesda to ask them who to talk to about finding out about the save game format etc.

The only dev I know about that visiting the forum on regular basis is SmkViper at least he was one dev that often posted on the old forum.

Link to comment
Share on other sites

6 hours ago, Beermotor said:

I'm fairly surprised that they don't have a community outreach manager dedicated to handling interactions between modding tool makers and the Bethesda team. That would make everyones lives a lot easier.  

They do Cartogriffi and gstaff and I can e-mail them (I know their real names, and anyone who has been part of a beta has their e-mail possibly) but I already asked about early access to the creation club, and they couldn't because they planned on having a public beta. Preparations took up all their time just for that. I don't want to be an annoyance. Later this evening I am going  to post on the forums about this though. Because I have an outstanding bug that should be able to make it into the Skyrim SE CK that they release for CC.

Link to comment
Share on other sites

7 hours ago, alt3rn1ty said:

Nobody official is coming up with any answers yet https://bethesda.net/community/topic/88724/why-is-fo4-auto-downloading-creation-club-ba2s?page=1

Thats really not surprising though. Its on page 3 or 4 of that topic where people started to realise the files were not just part of the beta, but were going live in the public release. That part of the official forums is full of similar topics right now. FO4 on Steam is being down repped to hell.

Love it. Your topic is up to 5 pages already. :lol:

Link to comment
Share on other sites

@Utumno The new save game format has changed more then I thought. So you asked what changed, then you asked on GitHub if Jon had some insight hoping it would be an easy fix. I mentioned in my previous post that it wasn't as easy as telling you just add ins.read(2) and simply read and write two bytes. But that's the short answer.  There are two extra bytes after the list of plugins, just before the Offests. I could not figure out why Bethesda would just throw two bytes at the end of the list, and for no apparent reason.

In my previous post I also said you need to know the Form Version.  In this case it has nothing to do with the plugin or issue #342. You have to decode more of the Save Game header and use the Form Version as a condition to read the extra bytes.  The Mysterious two bytes were simply 00 00. I had not enabled any ESL files yet because I was still decoding the save game, and didn't want that interfering with things.  However, as I kept writing out the Save Game for Fallout 4 at first it kept corrupting it. Then I was able to get everything perfect except the plugin list size. I had to add a hack of newsize+2 in order to set that and later add two bytes which were just 00 00. The more I fiddled with it I know that hack didn't make sense.

I disabled all my addons, I went in game, then loaded a new save game with only the DLC and saved it. Went to the in game Mods menu and enabled my ESL file, loaded the save game, checked that the mod was enabled by using the Holotape I include with the mod, and made a new save. Nothing seemed to be wrong, the ESL file was Active, and the Game didn't crash because it was loading my BA2 file.

Then I opened 010 and the Save game without the ESL file still decoded just fine, but the one with the ESL file active has a larger plugin list size and I couldn't see where the ESL file was listed, and the two bytes changed from 00 00 to 01 00. Then I scanned to that location and sure enough, there was the ESL file. The extra Mysterious two bytes are part of the list of plugins. It's the count of ESL files and then the ESL files follow. After that are the offsets.

So you have to read in two lists of files instead of one. I'm still testing.

For Example

        #--Masters
        if (( header.version < 12 ) or ( header.version > 12 )):
            mastersSize, = struct.unpack('I',ins.read(4))
            header.mastersStart = ins.tell()
            del header.masters[:]
            numMasters, = struct.unpack('B',ins.read(1))
            for count in xrange(numMasters):
                header.masters.append(unpack_str16())
            if ((header.version > 12) and (header.formVersion == 68)):
                numEslMasters, = struct.unpack('H',ins.read(2))
                for count in xrange(numEslMasters):
                    header.masters.append(unpack_str16())
            if ins.tell() != header.mastersStart + mastersSize: raise Exception(
                u'Save game masters size (%i) not as expected (%i).' % (
                    ins.tell() - header.mastersStart, mastersSize))

The Problem is the Write Masters when you rename something.  Currently when Wrye Bash goes to write the file names it seeks to the point where you write the new size of the Plugin List. Then immediately after that the comments say the code is going to skip the old masters, then write the new masters.  Hmmm. How do I do that with two lists, that are all part of one long list of 144 or 2541 bytes.  It's two separate lists in one array more or less. Once you pack the first list then when the second list is present you will need to start packing at where you left off, won't you?

This code seems like it will fail.

        #  Skip old masters
        oldMasters = []
        numMasters, = unpack('B',1)
        pack('B',len(header.masters))
        for x in xrange(numMasters):
            size, = unpack('H',2)
            oldMasters.append(ins.read(size))
        #  Write new masters
        for master in header.masters:
            pack('H',len(master))
            out.write(master.s)

--->>> Everything is fine up until here <<<---

I will have written the new file names for the first block of files but
the characters I added or removed will cause the file to change in size.
Will I be reading (but skipping) the old info, then writing the ESL file list?
                                              
        #  Skip old ESL masters
        if ((header.version > 12) and (header.formVersion == 68)):
            oldESLMasters = []
            numESLMasters, = unpack('H',2)
            pack('H',len(header.masters))
            for x in xrange(numESLMasters):
                size, = unpack('H',2)
                oldESLMasters.append(ins.read(size))
            #  Write new ESL masters
            for master in header.masters: <<<--- This is what worries me
                pack('H',len(master))
                out.write(master.s)

 

Link to comment
Share on other sites

ESL Files are stored in the save game header after the ESP files simply by design. Also I'm wondering, since you can't make an ESM file with the CK and you can't edit ESM files with the CK, can you make an ESL file the master of an ESP. If you do, how will that work in game? Where is it in the load order? Is it injected basically?

EDIT2: I hex edited the ESP file and I'm going to load it into the CK.

EDIT3: It worked I will have to add some keywords so they items can be built in my settlement.  I need to do more testing.

Link to comment
Share on other sites

On 22/08/2017 at 3:26 AM, Sharlikran said:

So basically Microsoft killed both Vortex and MO.  Well that is disappointing. I don't like NMM, MO/MO2, and probably wouldn't have used Vortex.  However, I would never want to see them fail as there are many people who do prefer them. I would never want to see users options limited no matter what my personal preferences are.

 

Sorry to raise an old topic but I just came across this and wanted to drop to clear this up:

What's breaking MO isn't actually the VRAM fix MS did, they also changed some other stuff in filesystem-related APIs and that's breaking MO. It's not too hard to fix so I wouldn't bet on MO being dead. ;) The fix isn't coming from me though.

MO2 isn't affected because it's hooking into lower level APIs that weren't changed. Vortex isn't affected because it's not hooking anything but uses OS functionality.

Link to comment
Share on other sites

Hi @Tannin :)

Guys/girls I just pushed a bunch of new stuff in my utumno-wip:

- support for esl (not sure about load order handling yet)

- support for new save formats - read write (do test)

- fixups in Save Details refreshes and duplicate save file

- small BAIN refactorings

- scandir support

Please test while I smooth things for stable branch

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...