Initial version

This commit is contained in:
2026-05-31 07:38:10 +02:00
parent e363eb1491
commit ec7031d9fd
8 changed files with 1360 additions and 0 deletions

292
007SaveTool/MainWindow.xaml Normal file
View File

@@ -0,0 +1,292 @@
<Window x:Class="EonaCat.FirstLight.SaveTransfer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:EonaCat.FirstLight.SaveTransfer"
Title="EonaCat FirstLight SaveTransfer"
Height="760" Width="920"
MinHeight="680" MinWidth="820"
WindowStartupLocation="CenterScreen"
Background="{StaticResource BgDarkBrush}"
FontFamily="Segoe UI">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolVis"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<!-- header -->
<RowDefinition Height="Auto"/>
<!-- tabs bar -->
<RowDefinition Height="*"/>
<!-- content -->
<RowDefinition Height="Auto"/>
<!-- status bar -->
</Grid.RowDefinitions>
<!-- ═══════════════════════════════════════════════════════════
HEADER
════════════════════════════════════════════════════════════════ -->
<Border Grid.Row="0" Background="{StaticResource BgMidBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="0,0,0,1">
<Grid Margin="28,18,28,18">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center">
<!-- Bond logo / bullet icon -->
<Border Width="36" Height="36" CornerRadius="18"
Background="{StaticResource AccentGoldBrush}"
Margin="0,0,14,0">
<TextBlock Text="007" FontWeight="Bold" FontSize="11"
Foreground="#1A1A2E"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<StackPanel VerticalAlignment="Center">
<TextBlock Text="EonaCat FirstLight SaveTransfer"
Foreground="{StaticResource TextPrimaryBrush}"
FontSize="18" FontWeight="Bold"/>
<TextBlock Text="Resign · Decrypt · Inspect"
Foreground="{StaticResource TextMutedBrush}"
FontSize="11" Margin="0,2,0,0"/>
</StackPanel>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<Border Background="#0D2035" CornerRadius="6" Padding="10,5" Margin="0,0,10,0">
<TextBlock x:Name="TxtStatus" Text="Ready"
Foreground="{StaticResource TextSecondaryBrush}"
FontSize="12" VerticalAlignment="Center"/>
</Border>
</StackPanel>
</Grid>
</Border>
<!-- ═══════════════════════════════════════════════════════════
TAB BAR
════════════════════════════════════════════════════════════════ -->
<Border Grid.Row="1" Background="{StaticResource BgMidBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="0,0,0,1">
<TabControl x:Name="MainTabs" Style="{StaticResource DarkTabControl}"
Background="Transparent" Margin="14,0,14,0">
<TabControl.ContentTemplate>
<DataTemplate><!-- tabs only used for header switching --></DataTemplate>
</TabControl.ContentTemplate>
<TabItem Header="⚙ Resign Save" Style="{StaticResource DarkTabItem}"
x:Name="TabResign"/>
<TabItem Header="🔓 Decrypt / Inspect" Style="{StaticResource DarkTabItem}"
x:Name="TabDecrypt"/>
<TabItem Header="📋 Log" Style="{StaticResource DarkTabItem}"
x:Name="TabLog"/>
</TabControl>
</Border>
<!-- ═══════════════════════════════════════════════════════════
CONTENT PANELS
════════════════════════════════════════════════════════════════ -->
<Grid Grid.Row="2">
<!-- ── RESIGN PANEL ──────────────────────────────────────── -->
<ScrollViewer x:Name="PanelResign" VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled">
<StackPanel Margin="32,28,32,28">
<!-- Save Folder -->
<TextBlock Text="SAVE FOLDER" Style="{StaticResource FieldLabel}"/>
<Grid Margin="0,0,0,18">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="TxtResignFolder" Style="{StaticResource DarkTextBox}"
IsReadOnly="True" Grid.Column="0"
Text="Click Browse to select your save folder…"
Foreground="{StaticResource TextMutedBrush}"/>
<Button Grid.Column="1" Content="Browse…"
Style="{StaticResource OutlineButton}"
Margin="10,0,0,0" Click="BrowseResignFolder_Click"/>
</Grid>
<!-- Target SteamID64 -->
<TextBlock Text="TARGET STEAMID64 (the account you want to resign TO)"
Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="TxtTargetSID" Style="{StaticResource DarkTextBox}"
Margin="0,0,0,6"
ToolTip="Your SteamID64 — find it at steamid.io"
PreviewTextInput="NumericOnly_PreviewInput"/>
<TextBlock Foreground="{StaticResource TextMutedBrush}" FontSize="11"
Margin="0,0,0,18">
Find your SteamID64 at
<Hyperlink NavigateUri="https://steamid.io"
RequestNavigate="Hyperlink_RequestNavigate"
Foreground="{StaticResource AccentGoldBrush}">
steamid.io
</Hyperlink>
— it looks like 76561197960272671
</TextBlock>
<!-- Source SteamID64 (optional) -->
<TextBlock Text="SOURCE STEAMID64 (optional — leave blank to auto-detect)"
Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="TxtSourceSID" Style="{StaticResource DarkTextBox}"
Margin="0,0,0,6"
ToolTip="Only needed if auto-detect fails. The original account's SteamID64."
PreviewTextInput="NumericOnly_PreviewInput"/>
<TextBlock Foreground="{StaticResource TextMutedBrush}" FontSize="11"
Margin="0,0,0,24">
When left blank the tool will auto-detect from <Run FontFamily="Consolas">index.save</Run>
and bruteforce the <Run FontFamily="Consolas">data.save</Run> key.
</TextBlock>
<!-- Mismatch option -->
<Border Background="#0D1E30" CornerRadius="8" Padding="16,12"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1"
Margin="0,0,0,24">
<StackPanel>
<CheckBox x:Name="ChkAutoConfirm"
Foreground="{StaticResource TextPrimaryBrush}"
FontSize="13" IsChecked="False">
<TextBlock TextWrapping="Wrap">
Auto-confirm SteamID mismatches between
<Run FontFamily="Consolas">index.save</Run> and
<Run FontFamily="Consolas">data.save</Run>
</TextBlock>
</CheckBox>
</StackPanel>
</Border>
<!-- Action Button -->
<Button x:Name="BtnResign" Content="🔑 Resign Save Files"
Style="{StaticResource GoldButton}"
HorizontalAlignment="Stretch" Height="48"
Click="BtnResign_Click"/>
<!-- Progress -->
<ProgressBar x:Name="ResignProgress" Height="4" Margin="0,14,0,0"
Background="#0D1E30" Foreground="{StaticResource AccentGoldBrush}"
BorderThickness="0" Visibility="Collapsed" IsIndeterminate="True"/>
<!-- Inline result banner -->
<Border x:Name="ResignResultBanner" Visibility="Collapsed"
CornerRadius="8" Padding="16,12" Margin="0,14,0,0">
<StackPanel>
<TextBlock x:Name="ResignResultText"
Foreground="White" FontSize="13"
TextWrapping="Wrap"/>
</StackPanel>
</Border>
</StackPanel>
</ScrollViewer>
<!-- ── DECRYPT PANEL ─────────────────────────────────────── -->
<ScrollViewer x:Name="PanelDecrypt" Visibility="Collapsed"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled">
<StackPanel Margin="32,28,32,28">
<!-- Save Folder -->
<TextBlock Text="SAVE FOLDER" Style="{StaticResource FieldLabel}"/>
<Grid Margin="0,0,0,18">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="TxtDecryptFolder" Style="{StaticResource DarkTextBox}"
IsReadOnly="True" Grid.Column="0"
Text="Click Browse to select your save folder…"
Foreground="{StaticResource TextMutedBrush}"/>
<Button Grid.Column="1" Content="Browse…"
Style="{StaticResource OutlineButton}"
Margin="10,0,0,0" Click="BrowseDecryptFolder_Click"/>
</Grid>
<!-- SteamID64 -->
<TextBlock Text="STEAMID64 (optional — leave blank to auto-detect)"
Style="{StaticResource FieldLabel}"/>
<TextBox x:Name="TxtDecryptSID" Style="{StaticResource DarkTextBox}"
Margin="0,0,0,6"
PreviewTextInput="NumericOnly_PreviewInput"/>
<TextBlock Foreground="{StaticResource TextMutedBrush}" FontSize="11"
Margin="0,0,0,24">
Leave blank to auto-detect from <Run FontFamily="Consolas">index.save</Run>.
Output files will be saved next to the originals with a <Run FontFamily="Consolas">.decrypted</Run> extension.
</TextBlock>
<!-- Action Button -->
<Button x:Name="BtnDecrypt" Content="🔓 Decrypt Save Files"
Style="{StaticResource GoldButton}"
HorizontalAlignment="Stretch" Height="48"
Click="BtnDecrypt_Click"/>
<!-- Progress -->
<ProgressBar x:Name="DecryptProgress" Height="4" Margin="0,14,0,0"
Background="#0D1E30" Foreground="{StaticResource AccentGoldBrush}"
BorderThickness="0" Visibility="Collapsed" IsIndeterminate="True"/>
<!-- Inline result -->
<Border x:Name="DecryptResultBanner" Visibility="Collapsed"
CornerRadius="8" Padding="16,12" Margin="0,14,0,0">
<TextBlock x:Name="DecryptResultText" Foreground="White"
FontSize="13" TextWrapping="Wrap"/>
</Border>
</StackPanel>
</ScrollViewer>
<!-- ── LOG PANEL ─────────────────────────────────────────── -->
<Grid x:Name="PanelLog" Visibility="Collapsed" Margin="32,28,32,28">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="OPERATION LOG"
Style="{StaticResource FieldLabel}" Margin="0,0,0,10"/>
<Border Grid.Row="1" Background="#080F18" CornerRadius="8"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="1">
<ScrollViewer x:Name="LogScroll"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
Padding="4">
<TextBlock x:Name="TxtLog"
FontFamily="Consolas" FontSize="12"
Foreground="{StaticResource TextSecondaryBrush}"
Padding="12" TextWrapping="Wrap"/>
</ScrollViewer>
</Border>
<Button Grid.Row="2" Content="🗑 Clear Log"
Style="{StaticResource OutlineButton}"
HorizontalAlignment="Right" Margin="0,10,0,0"
Click="ClearLog_Click"/>
</Grid>
</Grid>
<!-- ═══════════════════════════════════════════════════════════
STATUS BAR
════════════════════════════════════════════════════════════════ -->
<Border Grid.Row="3" Background="{StaticResource BgMidBrush}"
BorderBrush="{StaticResource BorderBrush}" BorderThickness="0,1,0,0"
Padding="28,8">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="TxtStatusBar"
Text="Select a folder and enter your Target SteamID64 to get started."
Foreground="{StaticResource TextMutedBrush}" FontSize="11"
VerticalAlignment="Center"/>
<TextBlock Grid.Column="1"
Text="EonaCat.FirstLight.SaveTransfer"
Foreground="{StaticResource TextMutedBrush}" FontSize="11"
VerticalAlignment="Center"/>
</Grid>
</Border>
</Grid>
</Window>