Added instructions

This commit is contained in:
2026-05-31 12:31:22 +02:00
parent ab391186f2
commit 329fde7d75
3 changed files with 189 additions and 12 deletions

View File

@@ -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\&lt;userID&gt;\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"

View File

@@ -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;
} }

View File

@@ -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;
} }
} }