Added instructions
This commit is contained in:
@@ -71,6 +71,10 @@
|
|||||||
<DataTemplate><!-- tabs only used for header switching --></DataTemplate>
|
<DataTemplate><!-- tabs only used for header switching --></DataTemplate>
|
||||||
</TabControl.ContentTemplate>
|
</TabControl.ContentTemplate>
|
||||||
|
|
||||||
|
<TabItem Header="📖 Instructions - Steam" Style="{StaticResource DarkTabItem}"
|
||||||
|
x:Name="TabInstructionsSteam"/>
|
||||||
|
<TabItem Header="📖 Instructions - Cracked" Style="{StaticResource DarkTabItem}"
|
||||||
|
x:Name="TabInstructionsCracked"/>
|
||||||
<TabItem Header="⚙ Resign Save" Style="{StaticResource DarkTabItem}"
|
<TabItem Header="⚙ Resign Save" Style="{StaticResource DarkTabItem}"
|
||||||
x:Name="TabResign"/>
|
x:Name="TabResign"/>
|
||||||
<TabItem Header="🔓 Decrypt / Inspect" Style="{StaticResource DarkTabItem}"
|
<TabItem Header="🔓 Decrypt / Inspect" Style="{StaticResource DarkTabItem}"
|
||||||
@@ -84,7 +88,168 @@
|
|||||||
|
|
||||||
<Grid Grid.Row="2">
|
<Grid Grid.Row="2">
|
||||||
|
|
||||||
<!-- RESIGN PANEL -->
|
<!-- INSTRUCTIONS - STEAM PANEL -->
|
||||||
|
<ScrollViewer x:Name="PanelInstructionsSteam" VerticalScrollBarVisibility="Auto"
|
||||||
|
HorizontalScrollBarVisibility="Disabled">
|
||||||
|
<StackPanel Margin="32,28,32,28">
|
||||||
|
<TextBlock Text="007: First Light - Save Game Transfer Instructions (Steam)"
|
||||||
|
Foreground="{StaticResource TextPrimaryBrush}"
|
||||||
|
FontSize="16" FontWeight="Bold" Margin="0,0,0,20"/>
|
||||||
|
|
||||||
|
<TextBlock Text="STEPS TO RESIGN YOUR SAVE FILES"
|
||||||
|
Style="{StaticResource FieldLabel}"/>
|
||||||
|
|
||||||
|
<StackPanel Margin="0,0,0,20">
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8">
|
||||||
|
<Run FontWeight="Bold">1.</Run> Select your folder using the 'Browse' button with your NEW savegame (folder which contains index.save and data.save)
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8">
|
||||||
|
<Run FontWeight="Bold">2.</Run> Insert your steam Id which you want to set.
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8">
|
||||||
|
<Run FontWeight="Bold">3.</Run> Click on 'Resign Save Files'
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,20">
|
||||||
|
<Run FontWeight="Bold">4.</Run> Place the savegame files in your original save directory.
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<TextBlock Text="STEAM SAVEGAME FILE LOCATION"
|
||||||
|
Style="{StaticResource FieldLabel}"/>
|
||||||
|
<Border Background="#0D1E30" CornerRadius="8" Padding="12" Margin="0,0,0,20"
|
||||||
|
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1">
|
||||||
|
<TextBlock Foreground="{StaticResource TextSecondaryBrush}" FontSize="12"
|
||||||
|
FontFamily="Consolas" TextWrapping="Wrap"
|
||||||
|
Text="C:\Program Files (x86)\Steam\userdata\<userID>\3768760\remote\KntSlotSaveFile-x"/>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<TextBlock Foreground="{StaticResource TextMutedBrush}" FontSize="11" Margin="0,0,0,20">
|
||||||
|
(x is your save slot number)
|
||||||
|
</TextBlock>
|
||||||
|
|
||||||
|
<TextBlock Text="YOUR STEAM ID"
|
||||||
|
Style="{StaticResource FieldLabel}"/>
|
||||||
|
<Border Background="#0D1E30" CornerRadius="8" Padding="12" Margin="0,0,0,20"
|
||||||
|
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1">
|
||||||
|
<TextBlock Foreground="{StaticResource TextSecondaryBrush}" FontSize="12"
|
||||||
|
FontFamily="Consolas"
|
||||||
|
Text="76561197960272671"/>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<TextBlock Text="EXTRA STEPS NEEDED FOR STEAM VERSION"
|
||||||
|
Style="{StaticResource FieldLabel}"/>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,12">
|
||||||
|
Please note if using the steam version, you also need to do these extra steps:
|
||||||
|
</TextBlock>
|
||||||
|
|
||||||
|
<StackPanel Margin="0,0,0,20">
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8">
|
||||||
|
<Run FontWeight="Bold">1.</Run> Click on the VDF Generator tab
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8">
|
||||||
|
<Run FontWeight="Bold">2.</Run> Browse to your remote folder
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,20">
|
||||||
|
<Run FontWeight="Bold">3.</Run> Click on 'Generate VDF'
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<Border Background="#1A3A52" CornerRadius="8" Padding="16,12"
|
||||||
|
BorderBrush="{StaticResource AccentGoldBrush}" BorderThickness="1">
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" TextWrapping="Wrap">
|
||||||
|
<Run FontWeight="Bold">Now startup your game, the saves should show</Run>
|
||||||
|
</TextBlock>
|
||||||
|
</Border>
|
||||||
|
</StackPanel>
|
||||||
|
</ScrollViewer>
|
||||||
|
|
||||||
|
<!-- INSTRUCTIONS - CRACKED PANEL -->
|
||||||
|
<ScrollViewer x:Name="PanelInstructionsCracked" Visibility="Collapsed"
|
||||||
|
VerticalScrollBarVisibility="Auto"
|
||||||
|
HorizontalScrollBarVisibility="Disabled">
|
||||||
|
<StackPanel Margin="32,28,32,28">
|
||||||
|
<TextBlock Text="007: First Light - Save Game Transfer Instructions (Cracked)"
|
||||||
|
Foreground="{StaticResource TextPrimaryBrush}"
|
||||||
|
FontSize="16" FontWeight="Bold" Margin="0,0,0,20"/>
|
||||||
|
|
||||||
|
<TextBlock Text="STEPS TO RESIGN YOUR SAVE FILES"
|
||||||
|
Style="{StaticResource FieldLabel}"/>
|
||||||
|
|
||||||
|
<StackPanel Margin="0,0,0,20">
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8">
|
||||||
|
<Run FontWeight="Bold">1.</Run> Select your folder using the 'Browse' button with your NEW savegame (folder which contains index.save and data.save)
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8">
|
||||||
|
<Run FontWeight="Bold">2.</Run> Insert your steam Id which you want to set.
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8">
|
||||||
|
<Run FontWeight="Bold">3.</Run> Click on 'Resign Save Files'
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,20">
|
||||||
|
<Run FontWeight="Bold">4.</Run> Place the savegame files in your original save directory.
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<TextBlock Text="CRACKED VERSION SAVE FILE LOCATION"
|
||||||
|
Style="{StaticResource FieldLabel}"/>
|
||||||
|
<Border Background="#0D1E30" CornerRadius="8" Padding="12" Margin="0,0,0,20"
|
||||||
|
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1">
|
||||||
|
<TextBlock Foreground="{StaticResource TextSecondaryBrush}" FontSize="12"
|
||||||
|
FontFamily="Consolas" TextWrapping="Wrap"
|
||||||
|
Text="C:\Users\[username]\AppData\Roaming\GSE Saves\3768760\remote\KntSlotSaveFile-0"/>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<TextBlock Text="YOUR STEAM ID"
|
||||||
|
Style="{StaticResource FieldLabel}"/>
|
||||||
|
<Border Background="#0D1E30" CornerRadius="8" Padding="12" Margin="0,0,0,20"
|
||||||
|
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1">
|
||||||
|
<TextBlock Foreground="{StaticResource TextSecondaryBrush}" FontSize="12"
|
||||||
|
FontFamily="Consolas"
|
||||||
|
Text="76561197960272671"/>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<TextBlock Text="EXTRA STEPS NEEDED FOR CRACKED VERSION"
|
||||||
|
Style="{StaticResource FieldLabel}"/>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,12">
|
||||||
|
Please note that if using the cracked version you would possibly also need the userdata.zip
|
||||||
|
</TextBlock>
|
||||||
|
|
||||||
|
<StackPanel Margin="0,0,0,20">
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8" TextWrapping="Wrap">
|
||||||
|
Extract the contents of the zip in <Run FontFamily="Consolas">[YOUR 007 FIRST LIGHT INSTALLATION FOLDER]\Retail</Run>
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8">
|
||||||
|
Overwrite the existing steam_settings and userdata.
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<Border Background="#3A2A1A" CornerRadius="8" Padding="16,12"
|
||||||
|
BorderBrush="#CC6600" BorderThickness="1" Margin="0,0,0,20">
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock Foreground="#FF9933" FontSize="13" FontWeight="Bold" Margin="0,0,0,6">
|
||||||
|
⚠ IMPORTANT WARNING
|
||||||
|
</TextBlock>
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="12" TextWrapping="Wrap">
|
||||||
|
CREATE A BACKUP FIRST OF THE FOLDERS YOU'RE OVERWRITING AS YOU COULD GET INVALID TOKEN ERRORS IF DONE INCORRECTLY!
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<TextBlock Foreground="{StaticResource TextMutedBrush}" FontSize="11" Margin="0,0,0,20">
|
||||||
|
Please note that the steam_settings and the userdata folders are from the v1.0.1 version of the game.
|
||||||
|
</TextBlock>
|
||||||
|
|
||||||
|
<TextBlock Foreground="{StaticResource TextPrimaryBrush}" FontSize="13" Margin="0,0,0,8">
|
||||||
|
See
|
||||||
|
<Hyperlink NavigateUri="https://www.nexusmods.com/007firstlight/mods/44"
|
||||||
|
RequestNavigate="Hyperlink_RequestNavigate"
|
||||||
|
Foreground="{StaticResource AccentGoldBrush}">
|
||||||
|
nexusmods.com/007firstlight/mods/44
|
||||||
|
</Hyperlink>
|
||||||
|
for the userdata.zip
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
</ScrollViewer>
|
||||||
<ScrollViewer x:Name="PanelResign" VerticalScrollBarVisibility="Auto"
|
<ScrollViewer x:Name="PanelResign" VerticalScrollBarVisibility="Auto"
|
||||||
HorizontalScrollBarVisibility="Disabled">
|
HorizontalScrollBarVisibility="Disabled">
|
||||||
<StackPanel Margin="32,28,32,28">
|
<StackPanel Margin="32,28,32,28">
|
||||||
@@ -110,7 +275,7 @@
|
|||||||
Style="{StaticResource FieldLabel}"/>
|
Style="{StaticResource FieldLabel}"/>
|
||||||
<TextBox x:Name="TxtTargetSID" Style="{StaticResource DarkTextBox}"
|
<TextBox x:Name="TxtTargetSID" Style="{StaticResource DarkTextBox}"
|
||||||
Margin="0,0,0,6"
|
Margin="0,0,0,6"
|
||||||
ToolTip="Your SteamID64 — find it at steamid.io"
|
ToolTip="Your SteamID64 - find it at steamid.io"
|
||||||
PreviewTextInput="NumericOnly_PreviewInput"/>
|
PreviewTextInput="NumericOnly_PreviewInput"/>
|
||||||
<TextBlock Foreground="{StaticResource TextMutedBrush}" FontSize="11"
|
<TextBlock Foreground="{StaticResource TextMutedBrush}" FontSize="11"
|
||||||
Margin="0,0,0,18">
|
Margin="0,0,0,18">
|
||||||
@@ -120,11 +285,11 @@
|
|||||||
Foreground="{StaticResource AccentGoldBrush}">
|
Foreground="{StaticResource AccentGoldBrush}">
|
||||||
steamid.io
|
steamid.io
|
||||||
</Hyperlink>
|
</Hyperlink>
|
||||||
— it looks like 76561197960272671
|
- it looks like 76561197960272671
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
|
|
||||||
<!-- Source SteamID64 (optional) -->
|
<!-- Source SteamID64 (optional) -->
|
||||||
<TextBlock Text="SOURCE STEAMID64 (optional — leave blank to auto-detect)"
|
<TextBlock Text="SOURCE STEAMID64 (optional - leave blank to auto-detect)"
|
||||||
Style="{StaticResource FieldLabel}"/>
|
Style="{StaticResource FieldLabel}"/>
|
||||||
<TextBox x:Name="TxtSourceSID" Style="{StaticResource DarkTextBox}"
|
<TextBox x:Name="TxtSourceSID" Style="{StaticResource DarkTextBox}"
|
||||||
Margin="0,0,0,6"
|
Margin="0,0,0,6"
|
||||||
@@ -199,7 +364,7 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<!-- SteamID64 -->
|
<!-- SteamID64 -->
|
||||||
<TextBlock Text="STEAMID64 (optional — leave blank to auto-detect)"
|
<TextBlock Text="STEAMID64 (optional - leave blank to auto-detect)"
|
||||||
Style="{StaticResource FieldLabel}"/>
|
Style="{StaticResource FieldLabel}"/>
|
||||||
<TextBox x:Name="TxtDecryptSID" Style="{StaticResource DarkTextBox}"
|
<TextBox x:Name="TxtDecryptSID" Style="{StaticResource DarkTextBox}"
|
||||||
Margin="0,0,0,6"
|
Margin="0,0,0,6"
|
||||||
@@ -324,7 +489,7 @@
|
|||||||
<ColumnDefinition Width="Auto"/>
|
<ColumnDefinition Width="Auto"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<TextBlock x:Name="TxtStatusBar"
|
<TextBlock x:Name="TxtStatusBar"
|
||||||
Text="Select a folder and enter your Target SteamID64 to get started."
|
Text="Click the 'Resign Save' tab and select a folder and enter your Target SteamID64 to get started."
|
||||||
Foreground="{StaticResource TextMutedBrush}" FontSize="11"
|
Foreground="{StaticResource TextMutedBrush}" FontSize="11"
|
||||||
VerticalAlignment="Center"/>
|
VerticalAlignment="Center"/>
|
||||||
<TextBlock Grid.Column="1"
|
<TextBlock Grid.Column="1"
|
||||||
|
|||||||
@@ -32,11 +32,23 @@ public partial class MainWindow : Window
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PanelInstructionsSteam.Visibility = Visibility.Collapsed;
|
||||||
|
PanelInstructionsCracked.Visibility = Visibility.Collapsed;
|
||||||
PanelResign.Visibility = Visibility.Collapsed;
|
PanelResign.Visibility = Visibility.Collapsed;
|
||||||
PanelDecrypt.Visibility = Visibility.Collapsed;
|
PanelDecrypt.Visibility = Visibility.Collapsed;
|
||||||
PanelVdf.Visibility = Visibility.Collapsed;
|
PanelVdf.Visibility = Visibility.Collapsed;
|
||||||
PanelLog.Visibility = Visibility.Collapsed;
|
PanelLog.Visibility = Visibility.Collapsed;
|
||||||
|
|
||||||
|
if (tab == TabInstructionsSteam)
|
||||||
|
{
|
||||||
|
PanelInstructionsSteam.Visibility = Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tab == TabInstructionsCracked)
|
||||||
|
{
|
||||||
|
PanelInstructionsCracked.Visibility = Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
if (tab == TabResign)
|
if (tab == TabResign)
|
||||||
{
|
{
|
||||||
PanelResign.Visibility = Visibility.Visible;
|
PanelResign.Visibility = Visibility.Visible;
|
||||||
@@ -126,7 +138,7 @@ public partial class MainWindow : Window
|
|||||||
if (!string.IsNullOrEmpty(sourceText))
|
if (!string.IsNullOrEmpty(sourceText))
|
||||||
{
|
{
|
||||||
if (!ulong.TryParse(sourceText, out ulong s))
|
if (!ulong.TryParse(sourceText, out ulong s))
|
||||||
{ ShowBanner(ResignResultBanner, ResignResultText, "Source SteamID64 is invalid — leave blank to auto-detect.", BannerKind.Error); return; }
|
{ ShowBanner(ResignResultBanner, ResignResultText, "Source SteamID64 is invalid - leave blank to auto-detect.", BannerKind.Error); return; }
|
||||||
userSourceSid = s;
|
userSourceSid = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ public static class SaveCore
|
|||||||
{
|
{
|
||||||
for (int b3 = 0; b3 < 256; b3++)
|
for (int b3 = 0; b3 < 256; b3++)
|
||||||
{
|
{
|
||||||
// Key bytes 0..7 — tail bytes 4..7 fixed as [0x01,0x00,0x10,0x01]
|
// Key bytes 0..7 - tail bytes 4..7 fixed as [0x01,0x00,0x10,0x01]
|
||||||
// (matches the game's SteamID encoding pattern)
|
// (matches the game's SteamID encoding pattern)
|
||||||
byte[] key = [b0, b1, (byte)b2, (byte)b3, 0x01, 0x00, 0x10, 0x01];
|
byte[] key = [b0, b1, (byte)b2, (byte)b3, 0x01, 0x00, 0x10, 0x01];
|
||||||
|
|
||||||
@@ -156,7 +156,7 @@ public static class SaveCore
|
|||||||
using var zs2 = new ZLibStream(ms2, CompressionMode.Decompress);
|
using var zs2 = new ZLibStream(ms2, CompressionMode.Decompress);
|
||||||
using var output = new MemoryStream();
|
using var output = new MemoryStream();
|
||||||
zs2.CopyTo(output);
|
zs2.CopyTo(output);
|
||||||
// success — reconstruct ulong SteamID64 from key bytes
|
// success - reconstruct ulong SteamID64 from key bytes
|
||||||
ulong steamId = BitConverter.ToUInt64(key, 0);
|
ulong steamId = BitConverter.ToUInt64(key, 0);
|
||||||
return steamId;
|
return steamId;
|
||||||
}
|
}
|
||||||
@@ -225,7 +225,7 @@ public static class SaveCore
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
log.Add($" [ERROR] Decompression failed — source SteamID may be wrong. {ex.Message}");
|
log.Add($" [ERROR] Decompression failed - source SteamID may be wrong. {ex.Message}");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,7 +273,7 @@ public static class SaveCore
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log.Add(" [WARN] 'SSaveGameHeader' not found — SteamID may be incorrect.");
|
log.Add(" [WARN] 'SSaveGameHeader' not found - SteamID may be incorrect.");
|
||||||
}
|
}
|
||||||
|
|
||||||
string outPath = filePath + ".decrypted";
|
string outPath = filePath + ".decrypted";
|
||||||
@@ -323,7 +323,7 @@ public static class SaveCore
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
log.Add($" [ERROR] Decompression failed — SteamID {steamSid} may be incorrect. {ex.Message}");
|
log.Add($" [ERROR] Decompression failed - SteamID {steamSid} may be incorrect. {ex.Message}");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user