I can help a bit here.
First: All values are longwords (4 Byte), it's quite easy to find them at character creation.
Second: You can use dnSpy to modify the game library to create savefiles / load savefiles without encryption. Which results in cleartext XML files.
One thing about it: the game can't do both! Save/load unencrypted AND encrypted saves! So you modify the dll and THEN start a new game, your encrypted saves would NOT load or even show up!
To do so, start dnSpy, load the assembly-casrp.dll from
EMPYRE Dukes of the Far Frontier\Empyre2_Data\Managed and then search for "
SaveData". Doubleclick the result and you will get the source. It will look like this:
Code: Select all
public static void SaveData(Stream aStream, string aFilePath, bool aUseEncrypt, bool aUseCompress)
{
using (FileStream fileStream = cgFileManager.OpenFile(aFilePath, FileMode.Create))
{
using (Stream stream = cgEncrypter.Compress(aStream, aUseCompress))
{
if (aUseEncrypt)
{
using (ICryptoTransform cryptoTransform = cgEncrypter.CreateEncrypter())
{
using (CryptoStream cryptoStream = new CryptoStream(fileStream, cryptoTransform, CryptoStreamMode.Write))
{
cgEncrypter.WriteData(stream, cryptoStream);
return;
}
}
}
cgEncrypter.WriteData(stream, fileStream);
}
}
}
The dll this code is located at is the
COG_gamelib.dll.
After making and compiling the changes, save it.
I also attached the modified dll to this post. This was the initial release version of the game (reminder for the future).
The password is:
wintermutex
Now add the line
aUseEncrypt = false; before the
if (aUseEncrypt) statement like this:
Code: Select all
using (Stream stream = cgEncrypter.Compress(aStream, aUseCompress))
{
aUseEncrypt = false;
if (aUseEncrypt)
{
Repeat this for the next class shown in dnSpy which is "
LoadData".
When you start a new game every save will be an unencrypted XML file. It is minified, so use Notepad++ with the XML plugin to use the "pretty print" function to get it human readable.
Pro tip: when creating the character choose a very unique name for the character profession so you find your character in the VAST(30+MB!) XML file!
In the XML look for:
<field name="mName" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" value="GeneratedCharacter"/>
<field name="mTitle" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" value="<YOUR-PROFESSION-NAME>"/>
From this location search BACKWARDS for the string
value="Melee" to find the character stats.
<field name="key" type="game.data.controller.entity.instance.cgEntityInstanceSkillController+eSkillType, Assembly-CSharp, Version=1.4.1.0, Culture=neutral, PublicKeyToken=null" value="Melee"/>
<object name="value" type="game.data.controller.entity.instance.component.cgEntitySkillItem, Assembly-CSharp, Version=1.4.1.0, Culture=neutral, PublicKeyToken=null">
<field name="mIsMain" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" value="True"/>
<field name="cgaEntityComponentItem+mBase" type="System.Single, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" value="80"/>
<field name="cgaEntityComponentItem+mPermanentAdditive" type="System.Single, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" value="20"/>
<field name="cgaEntityComponentItem+mPermanentMultiplier" type="System.Single, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" value="1"/>
In my example I set the BaseValue for Melee to 80 and I add an modifier of 20 to it.
You can do this for all main skills and subskills (which you can review by hovering over a skill to see the tooltip).
You can fine the attributes too, but they are less easy to find. And you can also add perks to your char, I added a bunch later to get the special dialogue options. But adding perks this way is a pita as you have to add them at 3 positions and use GUIDs which you have to extract from the asset file of the game.
Password for attachment:
wintermutex