Compare commits

...

10 Commits

Author SHA1 Message Date
Li 2ef6e0c65d add new setting n stuff 2024-04-12 16:50:25 +12:00
Li 58b6de3d00 Get it working on .net 8.0 and latest avalonia! 2024-04-12 14:47:18 +12:00
Li dd3431c312 Fix bugs 2024-01-11 21:29:23 +13:00
Li 97c5959caf Fix an issue where yuo cant enable using content manager again 2024-01-11 19:52:35 +13:00
Li fb8c379751 Update 'README.md' 2023-06-10 09:03:03 +00:00
Li b433e30fcc Update 'README.md' 2023-06-10 09:02:24 +00:00
Li 1c1711d844 Update 'README.md' 2023-06-10 08:59:50 +00:00
Li 2b1154a140 Update 'README.md' 2023-06-10 08:58:53 +00:00
Li fec8c58ae5 Update 'README.md' 2023-06-10 08:53:35 +00:00
Li dad692f9dd Update 'README.md' 2023-06-10 08:48:52 +00:00
40 changed files with 504 additions and 233 deletions

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<RootNamespace>ChovySign_CLI</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<_LastSelectedProfileId>C:\Users\Li\Documents\git\Chovy-Sign-v2\ChovySign-CLI\Properties\PublishProfiles\Win64.pubxml</_LastSelectedProfileId>
<_LastSelectedProfileId>C:\Users\Li\Desktop\git\chovy-sign\ChovySign-CLI\Properties\PublishProfiles\Linux64.pubxml</_LastSelectedProfileId>
</PropertyGroup>
</Project>

View File

@ -9,7 +9,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PublishDir>bin\Release\Linux</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<_TargetId>Folder</_TargetId>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>

View File

@ -9,7 +9,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PublishDir>bin\Release\Windows</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<_TargetId>Folder</_TargetId>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>

View File

@ -1,153 +1,123 @@
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ChovySign_GUI.App">
x:Class="ChovySign_GUI.App"
RequestedThemeVariant="Dark">
<Application.Styles>
<FluentTheme Mode="Light"/>
<FluentTheme/>
<!-- Checkbox Styling -->
<Style Selector="CheckBox:checked /template/ ContentPresenter">
<Setter Property="TextBlock.Foreground">
<Setter.Value>LightGreen</Setter.Value>
</Setter>
<!-- checked -->
<Style Selector="CheckBox:checked">
<Setter Property="BorderBrush" Value="LightGreen" />
<Style Selector="^ /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Foreground" Value="LightGreen" />
</Style>
<Style Selector="^ /template/ Border#NormalRectangle">
<Setter Property="BorderBrush" Value="LightGreen" />
<Setter Property="Background" Value="#3f3f3f" />
</Style>
</Style>
<Style Selector="CheckBox:checked /template/ Border#NormalRectangle">
<Setter Property="BorderBrush">
<Setter.Value>LightGreen</Setter.Value>
</Setter>
<Setter Property="Background">
<Setter.Value>#3f3f3f</Setter.Value>
</Setter>
<!-- unchecked -->
<Style Selector="CheckBox:unchecked">
<Setter Property="BorderBrush" Value="LightGreen" />
<Setter Property="Foreground" Value="LightGreen" />
<Style Selector="^ /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Foreground" Value="LightGreen" />
</Style>
<Style Selector="^ /template/ Border#NormalRectangle">
<Setter Property="BorderBrush" Value="LightGreen" />
<Setter Property="Background" Value="#3f3f3f" />
</Style>
</Style>
<Style Selector="CheckBox:pointerover /template/ Border#NormalRectangle">
<Setter Property="BorderBrush">
<Setter.Value>Green</Setter.Value>
</Setter>
<Setter Property="Background">
<Setter.Value>#1f1f1f</Setter.Value>
</Setter>
</Style>
<!-- pointerover -->
<Style Selector="CheckBox /template/ Border#NormalRectangle">
<Setter Property="BorderBrush">
<Setter.Value>Green</Setter.Value>
</Setter>
<Setter Property="Background">
<Setter.Value>#3f3f3f</Setter.Value>
</Setter>
</Style>
<Style Selector="CheckBox:pointerover">
<Setter Property="BorderBrush" Value="Green" />
<Style Selector="CheckBox:pointerover /template/ ContentPresenter">
<Setter Property="TextBlock.Foreground">
<Setter.Value>Green</Setter.Value>
</Setter>
<Style Selector="^ /template/ ContentPresenter#PART_ContentPresenter">
<Setter Property="Foreground" Value="Green" />
</Style>
<Style Selector="^ /template/ Border#NormalRectangle">
<Setter Property="BorderBrush" Value="Green" />
<Setter Property="Background" Value="#1f1f1f" />
</Style>
</Style>
<Style Selector="CheckBox">
<Setter Property="BorderBrush">
<Setter.Value>LightGreen</Setter.Value>
</Setter>
<Setter Property="Foreground">
<Setter.Value>LightGreen</Setter.Value>
</Setter>
</Style>
<!-- Button styles -->
<Style Selector="Button:disabled /template/ ContentPresenter">
<Setter Property="Background">
<Setter.Value>Black</Setter.Value>
</Setter>
<Setter Property="BorderBrush">
<Setter.Value>DarkRed</Setter.Value>
</Setter>
<Setter Property="TextBlock.Foreground">
<Setter.Value>DarkRed</Setter.Value>
</Setter>
<!-- disabled -->
<Style Selector="Button:disabled">
<Style Selector="^:disabled /template/ ContentPresenter">
<Setter Property="Background" Value="Black" />
<Setter Property="BorderBrush" Value="DarkRed" />
<Setter Property="Foreground" Value="DarkRed" />
</Style>
</Style>
<Style Selector="Button:pointerover /template/ ContentPresenter">
<Setter Property="Background">
<Setter.Value>Red</Setter.Value>
</Setter>
<Setter Property="BorderBrush">
<Setter.Value>DarkRed</Setter.Value>
</Setter>
<Setter Property="TextBlock.Foreground">
<Setter.Value>Black</Setter.Value>
</Setter>
<!-- pointerover -->
<Style Selector="Button:pointerover">
<Style Selector="^:pointerover /template/ ContentPresenter">
<Setter Property="Background" Value="Red" />
<Setter Property="BorderBrush" Value="DarkRed" />
<Setter Property="Foreground" Value="Black" />
</Style>
</Style>
<!-- regular -->
<Style Selector="Button">
<Setter Property="BorderThickness">
<Setter.Value>1</Setter.Value>
</Setter>
<Setter Property="Foreground">
<Setter.Value>Red</Setter.Value>
</Setter>
<Setter Property="BorderBrush">
<Setter.Value>Red</Setter.Value>
</Setter>
<Setter Property="Background">
<Setter.Value>Black</Setter.Value>
</Setter>
<Setter Property="Background" Value="Black" />
<Setter Property="BorderBrush" Value="Red" />
<Setter Property="Foreground" Value="Red" />
<Setter Property="BorderThickness" Value="1" />
</Style>
<!-- Textbox Styling -->
<Style Selector="TextBox:focus">
<Setter Property="Foreground">
<Setter.Value>LightGreen</Setter.Value>
</Setter>
</Style>
<Setter Property="Foreground" Value="LightGreen" />
<Style Selector="^ /template/ TextBlock">
<Setter Property="Foreground" Value="LightGreen" />
</Style>
<Style Selector="TextBox:focus /template/ TextBlock">
<Setter Property="Foreground">
<Setter.Value>LightGreen</Setter.Value>
</Setter>
</Style>
<Style Selector="TextBox:focus /template/ Border">
<Setter Property="Background">
<Setter.Value>#3f3f3f</Setter.Value>
</Setter>
<Setter Property="BorderBrush">
<Setter.Value>LightGreen</Setter.Value>
</Setter>
<Style Selector="^ /template/ Border">
<Setter Property="Background" Value="#3f3f3f" />
<Setter Property="BorderBrush" Value="LightGreen" />
</Style>
</Style>
<Style Selector="TextBox:pointerover">
<Setter Property="Foreground">
<Setter.Value>Green</Setter.Value>
</Setter>
</Style>
<Setter Property="Foreground" Value="Green" />
<Style Selector="TextBox:pointerover /template/ TextBlock">
<Setter Property="Foreground">
<Setter.Value>Green</Setter.Value>
</Setter>
<Style Selector="^ /template/ TextBlock">
<Setter Property="Foreground" Value="Green" />
</Style>
<Style Selector="^ /template/ Border">
<Setter Property="Background" Value="#1f1f1f" />
<Setter Property="BorderBrush" Value="Green" />
</Style>
</Style>
<Style Selector="TextBox:pointerover /template/ Border">
<Setter Property="Background">
<Setter.Value>#1f1f1f</Setter.Value>
</Setter>
<Setter Property="BorderBrush">
<Setter.Value>Green</Setter.Value>
</Setter>
</Style>
<Style Selector="TextBox">
<Setter Property="Foreground">
<Setter.Value>LightGreen</Setter.Value>
</Setter>
<Setter Property="Background">
<Setter.Value>#3f3f3f</Setter.Value>
</Setter>
<Setter Property="BorderBrush">
<Setter.Value>LightGreen</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="LightGreen" />
<Setter Property="Background" Value="#3f3f3f" />
<Setter Property="BorderBrush" Value="LightGreen" />
</Style>
<!-- ComboBox -->

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
<ApplicationManifest>app.manifest</ApplicationManifest>
@ -39,11 +39,11 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" Version="0.10.19" />
<PackageReference Include="Avalonia.Desktop" Version="0.10.19" />
<PackageReference Include="Avalonia" Version="11.1.0-beta1" />
<PackageReference Include="Avalonia.Desktop" Version="11.1.0-beta1" />
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="0.10.19" />
<PackageReference Include="XamlNameReferenceGenerator" Version="1.6.1" />
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="11.1.0-beta1" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.1.0-beta1" />
</ItemGroup>
<ItemGroup>

View File

@ -176,19 +176,28 @@ namespace ChovySign_GUI.Global
}
}
public BrowseButton()
{
InitializeComponent();
this.filePath.KeyUp += onKeyPress;
this.filePath.PropertyChanged += onPropertyChanged;
this.extension = "";
this.fileTypeName = "All Files";
}
private void onKeyPress(object? sender, KeyEventArgs e)
private void onPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
{
OnFileChanged(new EventArgs());
TextBox? txt = sender as TextBox;
if (txt is null) return;
if (e.Property.Name == "Text")
{
if (txt.Text is null) return;
if (!ContainsFile) return;
OnFileChanged(new EventArgs());
}
}
}
}

View File

@ -54,13 +54,13 @@ namespace ChovySign_GUI.Global
{
get
{
string[]? strings = this.comboBox.Items as string[];
string[]? strings = this.comboBox.ItemsSource as string[];
if (strings is null) return new string[0];
return strings;
}
set
{
this.comboBox.Items = value;
this.comboBox.ItemsSource = value;
}
}

View File

@ -2,6 +2,7 @@ using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Threading;
using ChovySign_GUI.Popup.Global;
using ChovySign_GUI.Settings;
using Li.Progress;
using LibChovy;
using System;
@ -13,6 +14,8 @@ namespace ChovySign_GUI.Global
public partial class ProgressStatus : UserControl
{
public ChovySignParameters? Parameters = null;
public event EventHandler<EventArgs>? Finished;
public event EventHandler<EventArgs>? BeforeStart;
private ChovySign chovySign;
public ProgressStatus()
{
@ -21,14 +24,12 @@ namespace ChovySign_GUI.Global
chovySign = new ChovySign();
chovySign.RegisterCallback(onProgress);
}
public event EventHandler<EventArgs>? BeforeStart;
protected virtual void OnBeforeStart(EventArgs e)
{
if (BeforeStart is not null)
BeforeStart(this, e);
}
public event EventHandler<EventArgs>? Finished;
protected virtual void OnFinished(EventArgs e)
{
@ -45,8 +46,10 @@ namespace ChovySign_GUI.Global
this.goButton.IsEnabled = false;
OnBeforeStart(new EventArgs());
// sanity check it
if(Parameters is null) { await MessageBox.Show(currentWindow, "ChovySignParameters was null, cannot start!", "Invalid Parameters", MessageBoxButtons.Ok); return; }
// apply settings that are global to all signs
if(SettingsTab.Settings is not null) Parameters.BuildStreamType = SettingsTab.Settings.BuildStreamType;
try
{

View File

@ -170,7 +170,7 @@ namespace ChovySign_GUI.Popup.Global
private void reloadBackupsList()
{
this.selectBtn.IsEnabled = false;
this.backupList.Items = new string[0];
this.backupList.ItemsSource = new string[0];
try
{
string[] gameBackupDirectories = GetAllDriectories(backupSearchFolders);
@ -202,7 +202,7 @@ namespace ChovySign_GUI.Popup.Global
}
this.gameDirectories = filteredGameDirectories.ToArray();
this.backupList.Items = gameList;
this.backupList.ItemsSource = gameList;
}
catch { }
}

View File

@ -99,9 +99,12 @@ namespace ChovySign_GUI.Ps1
Title = disc.DiscName;
DiscId = disc.DiscId;
byte[] newCover = await Downloader.DownloadCover(disc);
loadIcon(newCover);
iconCache = newCover;
if (!File.Exists(this.iconFile.FilePath))
{
byte[] newCover = await Downloader.DownloadCover(disc);
loadIcon(newCover);
iconCache = newCover;
}
}
catch (Exception e) {
Window? currentWindow = this.VisualRoot as Window;

View File

@ -1,11 +1,9 @@
using Avalonia.Controls;
using Avalonia.Interactivity;
using ChovySign_GUI.Global;
using ChovySign_GUI.Popup.Global;
using ChovySign_GUI.Settings;
using GameBuilder.Psp;
using LibChovy;
using LibChovy.Config;
using System;
using System.Linq;
using Vita.ContentManager;

View File

@ -3,7 +3,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Global="clr-namespace:ChovySign_GUI.Global"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="80"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="85"
x:Class="ChovySign_GUI.Settings.ConfigDropDown">
<Grid>
<Global:LabeledComboBox Name="configComboBox" Label="Label"/>

View File

@ -85,6 +85,9 @@ namespace ChovySign_GUI.Settings
else
IsToggled = false;
}
else{
IsToggled = true;
}
}

View File

@ -17,16 +17,41 @@
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Settings:ConfigToggle Name="devkitAccount" ConfigKey="USE_DEVKIT_ACCOUNT_ID" Label="Devkit Mode (Use 0x0000000000000000 Account ID)"
Prompt="This option will force the CMA Account ID to be all 0's&#x0a;Which is how it is on Devkit, Testkit and IDU Firmware&#x0a;Enabling this if you have a retail firmware will result in the games just *not* showing up&#x0a;&#x0a;If you DON'T know what this means, DON'T enable this.&#x0a;do you want to continue?"
HorizontalAlignment="Stretch" Grid.Row="0"/>
<Settings:ConfigToggle Name="devkitAccount"
ConfigKey="USE_DEVKIT_ACCOUNT_ID"
Label="Devkit Mode (Use 0x0000000000000000 Account ID)"
Prompt="This option will force the CMA Account ID to be all 0's&#x0a;Which is how it is on Devkit, Testkit and IDU Firmware&#x0a;Enabling this if you have a retail firmware will result in the games just *not* showing up&#x0a;&#x0a;If you DON'T know what this means, DON'T enable this.&#x0a;do you want to continue?"
HorizontalAlignment="Stretch"
Default="false"
Grid.Row="0"/>
<Settings:ConfigToggle Name="packagePsvimg" ConfigKey="USE_CMA_PSVIMG" Label="Use Content Manager (Package to PSVIMG)" Default="true" HorizontalAlignment="Stretch" Grid.Row="1"/>
<Settings:ConfigToggle Name="packagePsvimg"
ConfigKey="USE_CMA_PSVIMG"
Label="Use Content Manager (Package to PSVIMG)"
Default="true"
HorizontalAlignment="Stretch"
Grid.Row="1"/>
<Settings:ConfigPath Name="cmaDirectory" ConfigKey="USE_CMA_DIRECTORY" IsDirectory="True" Label="Output Folder:" HorizontalAlignment="Stretch" Grid.Row="2"/>
<Settings:ConfigPath Name="cmaDirectory"
ConfigKey="USE_CMA_DIRECTORY"
IsDirectory="true"
Label="Output Folder:"
HorizontalAlignment="Stretch"
Grid.Row="2"/>
<Settings:ConfigDropDown Name="libCryptMode" ConfigKey="USE_LIBCRYPT_METHOD" Label="LibCrypt Method:" HorizontalAlignment="Stretch" Grid.Row="3"/>
<Settings:ConfigDropDown Name="libCryptMode"
ConfigKey="USE_LIBCRYPT_METHOD"
Label="LibCrypt Method:"
HorizontalAlignment="Stretch"
Grid.Row="3"/>
<Settings:ConfigDropDown Name="streamType"
ConfigKey="USE_STREAM_TYPE"
Label="Build Stream Type:"
HorizontalAlignment="Stretch"
Grid.Row="4"/>
</Grid>
</Grid>

View File

@ -1,5 +1,6 @@
using Avalonia.Controls;
using GameBuilder.Pops.LibCrypt;
using GameBuilder;
using System.IO;
using Vita.ContentManager;
@ -9,6 +10,14 @@ namespace ChovySign_GUI.Settings
{
public static SettingsTab? Settings;
public StreamType BuildStreamType
{
get
{
return (StreamType) this.streamType.SelectedIndex;
}
}
public LibCryptMethod LibcryptMode
{
get
@ -51,10 +60,12 @@ namespace ChovySign_GUI.Settings
InitializeComponent();
libCryptMode.Items = new string[2] { "Magic Word in ISO Header", "Sub Channel PGD" };
streamType.Items = new string[2] { "MemoryStream - Create EBOOT in memory, faster, but high memory usage", "FileStream - Create EBOOT with temporary files, slower, but less memory usage" };
if (!Directory.Exists(this.CmaDirectory))
cmaDirectory.Value = SettingsReader.BackupsFolder;
Settings = this;
}
}

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

133
GameBuilder/BuildStream.cs Normal file
View File

@ -0,0 +1,133 @@
using DiscUtils.Streams;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameBuilder
{
public class BuildStream : Stream
{
public static StreamType BuildUsingStreamType = StreamType.TYPE_MEMORY_STREAM;
private Stream underylingStream;
private StreamType uStreamType;
private string? filename = null;
private void init()
{
this.uStreamType = BuildUsingStreamType;
if (this.uStreamType == StreamType.TYPE_MEMORY_STREAM)
{
this.underylingStream = new MemoryStream();
}
else if (this.uStreamType == StreamType.TYPE_FILE_STREAM)
{
string tmpFolder = Path.Combine(Path.GetTempPath(), "chovysign2");
Directory.CreateDirectory(tmpFolder);
this.filename = Path.Combine(tmpFolder, Guid.NewGuid().ToString());
this.underylingStream = File.Create(this.filename);
}
else
{
throw new Exception("unknown stream type");
}
}
public BuildStream(byte[] data)
{
init();
this.Write(data, 0, data.Length);
this.Seek(0x00, SeekOrigin.Begin);
}
public BuildStream()
{
init();
}
public override bool CanRead {
get {
return underylingStream.CanRead;
}
}
public override bool CanSeek {
get {
return underylingStream.CanSeek;
}
}
public override bool CanWrite {
get {
return underylingStream.CanWrite;
}
}
public override long Length {
get {
return underylingStream.Length;
}
}
public override long Position {
get {
return underylingStream.Position;
}
set {
underylingStream.Position = value;
}
}
public override void Close()
{
this.underylingStream.Close();
if(this.uStreamType == StreamType.TYPE_FILE_STREAM && this.filename is not null)
File.Delete(this.filename);
base.Close();
}
public override void Flush()
{
underylingStream.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
return underylingStream.Read(buffer, offset, count);
}
public override long Seek(long offset, SeekOrigin origin)
{
return underylingStream.Seek(offset, origin);
}
public override void SetLength(long value)
{
underylingStream.SetLength(value);
}
public override void Write(byte[] buffer, int offset, int count)
{
underylingStream.Write(buffer, offset, count);
}
public byte[] ToArray()
{
long oldLocation = this.Position;
this.Seek(0x00, SeekOrigin.Begin);
byte[] rdData = new byte[this.Length];
this.Read(rdData, 0x00, rdData.Length);
this.Seek(oldLocation, SeekOrigin.Begin);
return rdData;
}
}
}

View File

@ -269,7 +269,7 @@ namespace GameBuilder.Cue
public byte[] CreateToc()
{
using (MemoryStream toc = new MemoryStream())
using (BuildStream toc = new BuildStream())
{
StreamUtil tocUtil = new StreamUtil(toc);
tocUtil.WriteBytes(createDummyTracks());

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

View File

@ -26,8 +26,8 @@ namespace GameBuilder.Pops
this.disc = disc;
this.cue = new CueReader(disc.CueFile);
this.IsoHeader = new MemoryStream();
this.CompressedIso = new MemoryStream();
this.IsoHeader = new BuildStream();
this.CompressedIso = new BuildStream();
this.isoHeaderUtil = new StreamUtil(IsoHeader);
this.atrac3Encoder = encoder;
@ -189,9 +189,9 @@ namespace GameBuilder.Pops
writeCDAEntry(Convert.ToInt32(CompressedIso.Position), atracData.Length, key);
using (MemoryStream atracStream = new MemoryStream(atracData))
using (BuildStream atracStream = new BuildStream(atracData))
{
using (MemoryStream encryptedAtracStream = new MemoryStream())
using (BuildStream encryptedAtracStream = new BuildStream())
{
AtracCrypto.ScrambleAtracData(atracStream, encryptedAtracStream, key);
encryptedAtracStream.Seek(0x00, SeekOrigin.Begin);
@ -241,8 +241,8 @@ namespace GameBuilder.Pops
private CueReader cue;
private PopsImg srcImg;
public MemoryStream IsoHeader;
public MemoryStream CompressedIso;
public BuildStream IsoHeader;
public BuildStream CompressedIso;
private StreamUtil isoHeaderUtil;
private IAtracEncoderBase atrac3Encoder;

View File

@ -12,7 +12,7 @@ namespace GameBuilder.Pops.LibCrypt
{
public static byte[] CreateSubchannelDat(int magicWord)
{
using(MemoryStream subChannels = new MemoryStream())
using(BuildStream subChannels = new BuildStream())
{
StreamUtil subChannelsUtil = new StreamUtil(subChannels);
// this header seems to mark the start of the sub channel data.

View File

@ -17,7 +17,7 @@ namespace GameBuilder.Pops
public PopsImg(NpDrmInfo versionKey) : base(versionKey)
{
simple = new MemoryStream();
simple = new BuildStream();
simpleUtil = new StreamUtil(simple);
this.StartDat = NpDrmPsar.CreateStartDat(Resources.STARTDATPOPS);
@ -86,7 +86,7 @@ namespace GameBuilder.Pops
return loaderEnc.ToArray();
}
private MemoryStream simple;
private BuildStream simple;
private StreamUtil simpleUtil;
public byte[] EbootElf;

View File

@ -50,10 +50,10 @@ namespace GameBuilder.Pops
}
isoMap = new MemoryStream();
isoMap = new BuildStream();
isoMapUtil = new StreamUtil(isoMap);
isoPart = new MemoryStream();
isoPart = new BuildStream();
isoPartUtil = new StreamUtil(isoPart);
@ -174,10 +174,10 @@ namespace GameBuilder.Pops
private PSInfo[] discs;
private DiscCompressor[] compressors;
private MemoryStream isoPart;
private BuildStream isoPart;
private StreamUtil isoPartUtil;
private MemoryStream isoMap;
private BuildStream isoMap;
private StreamUtil isoMapUtil;
}
}

View File

@ -17,19 +17,19 @@ namespace GameBuilder.Psp
{
DrmInfo = npDrmInfo;
Psar = new MemoryStream();
Psar = new BuildStream();
psarUtil = new StreamUtil(Psar);
}
public NpDrmInfo DrmInfo;
public MemoryStream Psar;
public BuildStream Psar;
internal StreamUtil psarUtil;
public abstract void CreatePsar();
public abstract byte[] GenerateDataPsp();
public static byte[] CreateStartDat(byte[] image)
{
using(MemoryStream startDatStream = new MemoryStream())
using(BuildStream startDatStream = new BuildStream())
{
StreamUtil startDatUtil = new StreamUtil(startDatStream);

View File

@ -21,16 +21,16 @@ namespace GameBuilder.Psp
{
this.compress = compress;
this.npHdr = new MemoryStream();
this.npHdr = new BuildStream();
this.npHdrUtil = new StreamUtil(npHdr);
this.npHdrBody = new MemoryStream();
this.npHdrBody = new BuildStream();
this.npHdrBodyUtil = new StreamUtil(npHdrBody);
this.npTbl = new MemoryStream();
this.npTbl = new BuildStream();
this.npTblUtil = new StreamUtil(npTbl);
this.isoData = new MemoryStream();
this.isoData = new BuildStream();
this.isoDataUtil = new StreamUtil(isoData);
this.headerKey = Rng.RandomBytes(0x10);
@ -101,7 +101,7 @@ namespace GameBuilder.Psp
public override byte[] GenerateDataPsp()
{
byte[] startDat = CreateStartDat(umdImage.Minis ? Resources.STARTDATMINIS : Resources.STARTDATPSP);
using (MemoryStream dataPsp = new MemoryStream())
using (BuildStream dataPsp = new BuildStream())
{
StreamUtil dataPspUtil = new StreamUtil(dataPsp);
byte[] signature = signParamSfo(umdImage.DataFiles["PARAM.SFO"]);
@ -288,16 +288,16 @@ namespace GameBuilder.Psp
private byte[] dataKey;
private MemoryStream npHdr;
private BuildStream npHdr;
private StreamUtil npHdrUtil;
private MemoryStream npHdrBody;
private BuildStream npHdrBody;
private StreamUtil npHdrBodyUtil;
private MemoryStream isoData;
private BuildStream isoData;
private StreamUtil isoDataUtil;
private MemoryStream npTbl;
private BuildStream npTbl;
private StreamUtil npTblUtil;
}
}

View File

@ -18,7 +18,7 @@ namespace GameBuilder.Psp
private byte[]? snd0At3;
private NpDrmPsar psar;
private short pbpVersion;
private MemoryStream pbpStream;
private BuildStream pbpStream;
public PbpBuilder(byte[] paramSfo, byte[] icon0Png, byte[]? icon1Pmf,
byte[]? pic0Png, byte[]? pic1Png, byte[]? snd0At3,
@ -33,11 +33,11 @@ namespace GameBuilder.Psp
this.psar = dataPsar;
this.pbpVersion = version;
pbpStream = new MemoryStream();
pbpStream = new BuildStream();
psar.RegisterCallback(onProgress);
}
public MemoryStream PbpStream
public BuildStream PbpStream
{
get
{

14
GameBuilder/StreamType.cs Normal file
View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GameBuilder
{
public enum StreamType : uint
{
TYPE_MEMORY_STREAM,
TYPE_FILE_STREAM
}
}

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

View File

@ -1,4 +1,5 @@
using GameBuilder.Pops;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using System;
using System.Collections.Generic;

View File

@ -1,4 +1,6 @@
using System;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

View File

@ -1,4 +1,5 @@
using GameBuilder.Pops;
using GameBuilder;
using GameBuilder.Pops;
using GameBuilder.Psp;
using Li.Progress;
using PspCrypto;
@ -149,6 +150,8 @@ namespace LibChovy
SceNpDrm.Aid = parameters.DrmRif.AccountId;
BuildStream.BuildUsingStreamType = parameters.BuildStreamType;
if (!Directory.Exists(parameters.OutputFolder))
Directory.CreateDirectory(parameters.OutputFolder);

View File

@ -1,4 +1,5 @@
using GameBuilder.Psp;
using GameBuilder;
using GameBuilder.Psp;
using LibChovy.Config;
using System;
using System.Collections.Generic;
@ -19,6 +20,7 @@ namespace LibChovy
this.Account = new Account(DrmRif.AccountId);
this.CreatePsvImg = true;
this.FirmwareVersion = 0x3600000;
this.BuildStreamType = StreamType.TYPE_MEMORY_STREAM;
}
public int FirmwareVersion;
@ -27,7 +29,8 @@ namespace LibChovy
public NpDrmRif DrmRif;
public Account Account;
public ChovyTypes Type;
public StreamType BuildStreamType;
protected string? outputFolderOverride;

77
LibChovy/ChovyStream.cs Normal file
View File

@ -0,0 +1,77 @@
using DiscUtils.Streams;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LiLib
{
public class ChovyStream : Stream
{
private Stream underylingStream;
public ChovyStream()
{
underylingStream = new MemoryStream();
}
public override bool CanRead {
get {
return underylingStream.CanRead;
}
}
public override bool CanSeek {
get {
return underylingStream.CanSeek;
}
}
public override bool CanWrite {
get {
return underylingStream.CanWrite;
}
}
public override long Length {
get {
return underylingStream.Length;
}
}
public override long Position {
get {
return underylingStream.Position;
}
set {
underylingStream.Position = value;
}
}
public override void Flush()
{
underylingStream.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
return underylingStream.Read(buffer, offset, count);
}
public override long Seek(long offset, SeekOrigin origin)
{
return underylingStream.Seek(offset, origin);
}
public override void SetLength(long value)
{
underylingStream.SetLength(value);
}
public override void Write(byte[] buffer, int offset, int count)
{
underylingStream.Write(buffer, offset, count);
}
}
}

View File

@ -2,13 +2,13 @@
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SixLabors.ImageSharp" Version="3.0.1" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.4" />
</ItemGroup>
<ItemGroup>

View File

@ -2,12 +2,12 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.HighPerformance" Version="8.1.0" />
<PackageReference Include="CommunityToolkit.HighPerformance" Version="8.2.2" />
</ItemGroup>
<ItemGroup>

View File

@ -6,10 +6,10 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<PublishDir>bin\Release\net6.0\publish\win-x64\</PublishDir>
<PublishDir>bin\Release\net8.0\publish\win-x64\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<_TargetId>Folder</_TargetId>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<PublishSingleFile>true</PublishSingleFile>

View File

@ -1,12 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BouncyCastle.Cryptography" Version="2.2.1" />
<PackageReference Include="BouncyCastle.Cryptography" Version="2.3.0" />
<PackageReference Include="DotNetZip" Version="1.16.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0" />
</ItemGroup>

View File

@ -1,64 +1,83 @@
#ChovyProject v2
Now with PS1 Support !
\- chovy-sign is an application to allow you to convert PSP and PS1 ISO's to be playable on unmodified PSVita's
**chovy-sign is an application to allow you to convert PSP and PS1 ISO's to be playable on unmodified PSVita***
Setups:
You need a valid (offical) PSP or PS1 license,
You need an (offical) PSP or PS1 license;
i recommend getting; Petz Saddle Club, LocoRoco Midnight Carnival, or Ape Quest Starter Pack
atleast one of these are free in *most* regions;
because atleast one of these are free in *most* regions;
however failing that, you can also use a PSP DLC license-
-- if you don't have a hacked PSVita:
----
**-- If you don't have a modded PSVita:**
Copy the offical game to your PC using Content Manager,
*you will need:*
- Any PS1 or PSP game (or demo) from the PS Store. (Petz Saddle Club, LocoRoco Midnight Carnival, etc..)
- Ability to connect PSVita to PC Content Manager (USB or WiFi)
open chovy-sign2 and click the "Get Keys" button
*obtaining keys:*
- Copy an offical PS1 or PSP game to your PC using Content Manager,
- open chovy-sign2
- select either PSP or PS1 and click the "Get Keys" button
- click "EBOOT.PBP method",
- select the offical PS1 or PSP game you copied;
- click on select "Content Manager" backup
select "EBOOT.PBP" method,
- you should see the RIF and KEY fields populate,
select the offical game;
*chovy-sign2 will remember this information for later so you only have to do this part one time;*
click on select "Content Manager" backup
*getting psp or ps1 games:*
- select either a PS1 BIN/CUE image or a UMD ISO image.
- click "go"
- once it finishes, you should be able to find the game availible to be copied over from Content Manager.
(note: there may be some issues if you try this while having DLC for the game installed ...)
note: *there may be some issues if you try this while having DLC for the game installed .*
you should see the RIF and KEY fields populate, and your good to go!
----
**-- If you have a modded PSVita:**
-- If you have a hacked PSVita:
note: *you can still use the unmodified vita method on a hacked vita; if you would like *
note: you can still use the unhacked vita method if you would like
note2: *bubbles created using the hacked vita method will still *work* on any unmodified vita, *
*using the same PSN Account; however it requires a hacked vita to *obtain* some of the files, *
*that are required for this method;*
note2: bubbles created using the hacked vita method will still *work* on any unhacked vita,
using the same PSN Account; however it requires a hacked vita to *obtain* some of the files,
that are required for this method;
you will need:
*you will need:*
- Your ConsoleID/IDPS, Yoti has a tool to dump this availible [here](https://github.com/Yoti/psv_idpsdump/releases/)
- Your Consoles activation data file (located at tm0:/npdrm/act.dat)
- Any PSP/PS1 License file for your account (located at ux0:/pspemu/PSP/LICENSE/*.rif, or ux0:/bgdl/t/XXXXXX/temp.dat if you have a pending download)
- Your Consoles activation data file (located at ``tm0:/npdrm/act.dat``)
- Any offical PSP/PS1 License file for your account (located at ``ux0:/pspemu/PSP/LICENSE/*.rif``, or ``ux0:/bgdl/t/XXXXXX/temp.dat`` for downloads)
*you can also use PocketStation license or a PSP DLC license*
YOUTUBERS: if you are planning on making a youtube tutorial on this, please note that your consoles IDPS is
also used to identify your console on the playstation network,
and sharing it would allow anyone to impersonate your console on the PSN!,
do not just blindly give this out to people.
(this would not give them access to your PSN Account however)
note: *your IDPS is unique to your PSVita and is used to identify your console on the PSN, so do not share it with other people*
Open the CHOVY-SIGN2 application, under PSP click GET KEYS
put in your IDPS into the ConsoleID/IDPS field; in hex (if you used yotis tool, its in ux0:/data/idps.txt)
browse to your act.dat file, and rif file, and click Generate.
this will populate the key and rif field;
now do the same thing for the PS1 Option, using the same license and activation file as before.
*obtaining keys:*
- open chovy-sign2
- select either PSP or PS1 and click the "Get Keys" button
- select "IDPS+RIF+ACT Method",
- copy in your IDPS
- browse for your license rif file
- browse for our act.dat file
- click generate keys
*chovy-sign2 will remember this information for later so you only have to do this part one time;*
*getting psp or ps1 games:*
- select either a PS1 BIN/CUE image or a UMD ISO image.
- click "go"
- once it finishes, you should be able to find the game availible to be copied over from Content Manager.
- alternatively, you can disable the "Use CMA" option in settings, and then copy the resulting **TITLEID** folder to ``ux0:/pspemu/PSP/GAME``, then delete ``ux0:/id.dat``, and reboot to trigger an app database update.
a diagram explaining the 3 key obtaining methods is below:
-----
so overall there are 3 methods to obtain keys,
![image](https://silica.codes/SilicaAndPina/chovy-sign/raw/branch/master/Methods.png)
--
note: *keys.txt is basically pointless now, in the bast it wasn't known how to use psp eboot to create ps1 games*
----
Credits:
SquallATF (for "PspCrypto" and "PBPResigner", and making PS1 Game signing possible,
@ -70,7 +89,6 @@ Developing the GUI, finding the original psp bubbles method and,
Writing the PS1 Disc Compresison algorithm, making it possible to use custom ISOs,
Writing C# Implementation of PSVIMGTOOLS,
Being transgender)
dots-tb (for [chovy-gen](https://github.com/dots-tb/chovy-gen) (\_\_sce_ebootpbp signing)
@ -81,16 +99,14 @@ yifanlu & xyz for the original [psvimgtools](https://github.com/yifanlu/psvimgto
Mathieulh (Found psp signing keys?)
Motoharu (For helping dots with \_\_sce_ebootpbp)
Davee (For finding the PS1 Signing Key)
xlenore (For [PS1 Cover Art](https://github.com/xlenore/psx-covers))
RupertAvery (For their fork of DiscUtils to add PS1 Support)
SquallATF's PBPResigner and PSPCrypto were derived from :
xdotnano ([PSXTract](https://github.com/xdotnano/PSXtract))
swarzesherz ([sign_np](https://github.com/swarzesherz/sign_np))
tpunix ([kirk_engine](https://github.com/tpunix/kirk_engine))

View File

@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BouncyCastle.Cryptography" Version="2.2.0" />
<PackageReference Include="BouncyCastle.Cryptography" Version="2.3.0" />
<PackageReference Include="DotNetZip" Version="1.16.0" />
</ItemGroup>