Fixed Image Injection. Even tho images were fixed teh wiiu threw an issue. Till i get that fixed i implemented a workaround, which tells the user if the images have an unsupported bit depth (bit depth of auto) or if the image isnt in "Wiiu Format" (right bitdepth, right size)

ToDO:
Custom Base
Config stuff
Updater
This commit is contained in:
NicoAICP 2020-04-06 17:51:15 +02:00
parent edd7737bc4
commit e1976afd5e
7 changed files with 247 additions and 123 deletions

View file

@ -22,7 +22,7 @@ namespace UWUVCI_AIO_WPF
private static readonly string toolsPath = Path.Combine(Directory.GetCurrentDirectory(), "Tools");
/*
* GameConsole: Can either be NDS, N64, GBA, NES or SNES
* GameConsole: Can either be NDS, N64, GBA, NES, SNES or TG16
* baseRom = Name of the BaseRom, which is the folder name too (example: Super Metroid EU will be saved at the BaseRom path under the folder SMetroidEU, so the BaseRom is in this case SMetroidEU).
* customBasePath = Path to the custom Base. Is null if no custom base is used.
* injectRomPath = Path to the Rom to be injected into the Base Game.
@ -35,39 +35,12 @@ namespace UWUVCI_AIO_WPF
* iniPath = Only used for N64. Path to the INI configuration. If "blank", a blank ini will be used.
* darkRemoval = Only used for N64. Indicates whether the dark filter should be removed.
*/
/*public static void Inject(GameConsoles console, string baseRom, string customBasePath, string injectRomPath, string[] bootImages, string gameName, string iniPath = null, bool darkRemoval = false)
public static bool Inject(GameConfig Configuration, string RomPath)
{
CopyBase(baseRom, customBasePath);
switch (console)
try
{
case GameConsoles.NDS:
NDS(injectRomPath);
break;
case GameConsoles.N64:
N64(injectRomPath, iniPath, darkRemoval);
break;
case GameConsoles.GBA:
GBA(injectRomPath);
break;
case GameConsoles.NES:
NESSNES(injectRomPath);
break;
case GameConsoles.SNES:
NESSNES(RemoveHeader(injectRomPath));
break;
}
EditXML(gameName);
Images(bootImages);
//MessageBox.Show(Resources.InjectionFinishedText, Resources.InjectionFinishedCaption, MessageBoxButtons.OK, MessageBoxIcon.Information);
}*/
public static void Inject(GameConfig Configuration, string RomPath)
{
if(Configuration.BaseRom.Name != "Custom")
if (Configuration.BaseRom.Name != "Custom")
{
//Normal Base functionality here
CopyBase($"{Configuration.BaseRom.Name.Replace(":", "")} [{Configuration.BaseRom.Region.ToString()}]", null);
@ -79,8 +52,27 @@ namespace UWUVCI_AIO_WPF
}
RunSpecificInjection(Configuration, RomPath);
EditXML(Configuration.GameName);
//Images(Configuration);
Images(Configuration);
MessageBox.Show("Injection Finished, please choose how you want to export the Inject next", "Finished Injection Part", MessageBoxButton.OK, MessageBoxImage.Information);
return true;
}catch(Exception e)
{
if (e.Message.Contains("Images")){
MessageBox.Show("Injection Failed due to wrong BitDepth, please check if your Files are in a different bitdepth than 32bit or 24bit", "Injection Failed", MessageBoxButton.OK, MessageBoxImage.Error);
}
else if (e.Message.Contains("Size"))
{
MessageBox.Show("Injection Failed due to Image Issues. Please check if your Images are made using following Information:\n\niconTex: \nDimensions: 128x128\nBitDepth: 32\n\nbootDrcTex: \nDimensions: 854x480\nBitDepth: 24\n\nbootTvTex: \nDimensions: 1280x720\nBitDepth: 24\n\nbootLogoTex: \nDimensions: 170x42\nBitDepth: 32", "Injection Failed", MessageBoxButton.OK, MessageBoxImage.Error);
}
else
{
MessageBox.Show("Injection Failed due to unknown circumstances, please contact us on the UWUVCI discord", "Injection Failed", MessageBoxButton.OK, MessageBoxImage.Error);
}
return false;
}
}
private static void RunSpecificInjection(GameConfig console, string RomPath)
@ -439,83 +431,174 @@ namespace UWUVCI_AIO_WPF
}
}
private static void Images(string[] paths)
private static void ReadFileFromBin(byte[] bin, string output)
{
File.WriteAllBytes(output, bin);
}
private static void Images(GameConfig config)
{
try
{
bool tv = false;
bool drc = false;
bool icon = false;
bool logo = false;
//is an image embedded? yes => export them and check for issues
//no => using path
if (Directory.Exists(imgPath)) // sanity check
{
Directory.Delete(imgPath, true);
}
Directory.CreateDirectory(imgPath);
if (paths[0] != null)
//ICON
List<bool> Images = new List<bool>();
if (config.TGAIco.ImgBin == null)
{
tv = true;
CopyAndConvertImage(paths[0], Path.Combine(imgPath, "bootTvTex.tga"));
//use path
if (config.TGAIco.ImgPath != null)
{
Images.Add(true);
CopyAndConvertImage(config.TGAIco.ImgPath, Path.Combine(imgPath), false, 128,128,32, "iconTex.tga");
}
else
{
Images.Add(false);
}
}
else
{
ReadFileFromBin(config.TGAIco.ImgBin, $"iconTex.{config.TGAIco.extension}");
CopyAndConvertImage($"iconTex.{config.TGAIco.extension}", Path.Combine(imgPath), true, 128, 128, 32, "iconTex.tga");
Images.Add(true);
}
if (paths[1] != null)
//Drc
if (config.TGADrc.ImgBin == null)
{
drc = true;
CopyAndConvertImage(paths[1], Path.Combine(imgPath, "bootDrcTex.tga"));
//use path
if (config.TGADrc.ImgPath != null)
{
Images.Add(true);
CopyAndConvertImage(config.TGADrc.ImgPath, Path.Combine(imgPath), false, 854,480,24, "bootDrcTex.tga");
}
else
{
Images.Add(false);
}
}
else
{
ReadFileFromBin(config.TGADrc.ImgBin, $"bootDrcTex.{config.TGADrc.extension}");
CopyAndConvertImage($"bootDrcTex.{config.TGADrc.extension}", Path.Combine(imgPath), true,854,480,24, "bootDrcTex.tga");
Images.Add(true);
}
if (paths[2] != null)
//tv
if (config.TGATv.ImgBin == null)
{
icon = true;
CopyAndConvertImage(paths[2], Path.Combine(imgPath, "iconTex.tga"));
//use path
if (config.TGATv.ImgPath != null)
{
Images.Add(true);
CopyAndConvertImage(config.TGATv.ImgPath, Path.Combine(imgPath), false,1280,720,24, "bootTvTex.tga");
}
else
{
Images.Add(false);
}
}
else
{
ReadFileFromBin(config.TGATv.ImgBin, $"bootTvTex.{config.TGATv.extension}");
CopyAndConvertImage($"bootTvTex.{config.TGATv.extension}", Path.Combine(imgPath), true, 1280, 720, 24, "bootTvTex.tga");
Images.Add(true);
}
if (paths[3] != null)
//logo
if (config.TGALog.ImgBin == null)
{
logo = true;
CopyAndConvertImage(paths[3], Path.Combine(imgPath, "bootLogoTex.tga"));
//use path
if (config.TGALog.ImgPath != null)
{
Images.Add(true);
CopyAndConvertImage(config.TGALog.ImgPath, Path.Combine(imgPath), false, 170,42,32, "bootLogoTex.tga");
}
else
{
Images.Add(false);
}
}
else
{
ReadFileFromBin(config.TGALog.ImgBin, $"bootLogoTex.{config.TGALog.extension}");
CopyAndConvertImage($"bootLogoTex.{config.TGALog.extension}", Path.Combine(imgPath), true, 170, 42, 32, "bootLogoTex.tga");
Images.Add(true);
}
if (tv || drc || icon || logo) {
using (Process tgaverifyFixup = new Process())
//Fixing Images + Injecting them
if (Images[0] || Images[1] || Images[2] || Images[3])
{
tgaverifyFixup.StartInfo.UseShellExecute = false;
tgaverifyFixup.StartInfo.CreateNoWindow = true;
tgaverifyFixup.StartInfo.FileName = Path.Combine(toolsPath, "tga_verify.exe");
tgaverifyFixup.StartInfo.Arguments = $"--fixup \"{imgPath}\"";
tgaverifyFixup.Start();
tgaverifyFixup.WaitForExit();
using (Process checkIfIssue = new Process())
{
checkIfIssue.StartInfo.UseShellExecute = false;
checkIfIssue.StartInfo.CreateNoWindow = false;
checkIfIssue.StartInfo.RedirectStandardOutput = true;
checkIfIssue.StartInfo.RedirectStandardError = true;
checkIfIssue.StartInfo.FileName = $"{Path.Combine(toolsPath,"tga_verify.exe")}";
Console.WriteLine(Directory.GetCurrentDirectory());
checkIfIssue.StartInfo.Arguments = $"\"{imgPath}\"";
checkIfIssue.Start();
checkIfIssue.WaitForExit();
var s = checkIfIssue.StandardOutput.ReadToEnd();
if (s.Contains("width") || s.Contains("height") || s.Contains("depth"))
{
throw new Exception("Size");
}
var e = checkIfIssue.StandardError.ReadToEnd();
if (e.Contains("width") || e.Contains("height") || e.Contains("depth"))
{
throw new Exception("Size");
}
if (tv)
Console.ReadLine();
}
if (Images[2])
{
File.Delete(Path.Combine(baseRomPath, "meta", "bootTvTex.tga"));
File.Move(Path.Combine(imgPath, "bootTvTex.tga"), Path.Combine(baseRomPath, "meta", "bootTvTex.tga"));
}
if (drc)
if (Images[1])
{
File.Delete(Path.Combine(baseRomPath, "meta", "bootDrcTex.tga"));
File.Move(Path.Combine(imgPath, "bootDrcTex.tga"), Path.Combine(baseRomPath, "meta", "bootDrcTex.tga"));
}
if (icon)
if (Images[0])
{
File.Delete(Path.Combine(baseRomPath, "meta", "iconTex.tga"));
File.Move(Path.Combine(imgPath, "iconTex.tga"), Path.Combine(baseRomPath, "meta", "iconTex.tga"));
}
if (logo)
if (Images[3])
{
File.Delete(Path.Combine(baseRomPath, "meta", "bootLogoTex.tga"));
File.Move(Path.Combine(imgPath, "bootLogoTex.tga"), Path.Combine(baseRomPath, "meta", "bootLogoTex.tga"));
}
}
}
catch(Exception e)
{
if (e.Message.Contains("Size"))
{
throw e;
}
throw new Exception("Images");
}
private static void CopyAndConvertImage(string inputPath, string outputPath)
}
private static void CopyAndConvertImage(string inputPath, string outputPath, bool delete, int widht, int height, int bit, string newname)
{
if (inputPath.EndsWith(".tga"))
{
File.Copy(inputPath, outputPath);
File.Copy(inputPath, Path.Combine(outputPath,newname));
}
else
{
@ -524,11 +607,20 @@ namespace UWUVCI_AIO_WPF
png2tga.StartInfo.UseShellExecute = false;
png2tga.StartInfo.CreateNoWindow = true;
png2tga.StartInfo.FileName = Path.Combine(toolsPath, "png2tga.exe");
png2tga.StartInfo.Arguments = $"\"{inputPath}\" \"{outputPath}\"";
png2tga.StartInfo.Arguments = $"-i \"{inputPath}\" -o \"{outputPath}\" --width={widht} --height={height} --tga-bpp={bit} --tga-compression=none";
png2tga.Start();
png2tga.WaitForExit();
}
string name = Path.GetFileNameWithoutExtension(inputPath);
if(File.Exists(Path.Combine(outputPath , name + ".tga")))
{
File.Move(Path.Combine(outputPath, name + ".tga"), Path.Combine(outputPath, newname));
}
}
if (delete)
{
File.Delete(inputPath);
}
}

View file

@ -8,7 +8,7 @@ namespace UWUVCI_AIO_WPF.Classes
{
class PNGTGA : BaseModel
{
private string imgPath;
private string imgPath = null;
public string ImgPath
{
@ -18,6 +18,8 @@ namespace UWUVCI_AIO_WPF.Classes
}
}
public byte[] ImgBin { get; set; }
public byte[] ImgBin { get; set; } = null;
public string extension { get; set; }
}
}

View file

@ -23,7 +23,9 @@ namespace UWUVCI_AIO_WPF.Classes
"wiiurpxtool.exe",
"INICreator.exe",
"7za.exe",
"blank.ini"
"blank.ini",
"FreeImage.dll",
"BuildPcePkg.exe"
};
public static bool DoesToolsFolderExist()

View file

@ -238,7 +238,9 @@ namespace UWUVCI_AIO_WPF
}
public void Inject()
{
Injection.Inject(GameConfiguration, RomPath);
if (Injection.Inject(GameConfiguration, RomPath)) Injected = true;
else Injected = false;
}
private void BaseCheck()
{
@ -705,6 +707,24 @@ namespace UWUVCI_AIO_WPF
return false;
}
public void ImageWarning()
{
MessageBox.Show("Images need to either be in a Bit Depth of 32bit or 24bit. \nIf using Tools like paint.net do not choose the Auto function.", "Image Warning", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
public void CBaseWarning()
{
MessageBox.Show("If using Custom Bases there will be a chance that the programm crashes if adding a wrong base (example: a normal wiiu game instead of a nds vc game).\nIf you add a wrong base, we will not assist you fixing it, other than telling you to use another base.", "Custom base Warning", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
public bool CBaseConvertInfo()
{
bool ret = false;
DialogResult res = MessageBox.Show("You seem to have added a NUS format Custom Base.\nDo you want it to be converted to be used with the Injector?", "NUS Custom Base", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if(res == DialogResult.Yes)
{
ret = true;
}
return ret;
}
public TKeys getTkey(GameBases bases)
{
var temp = KeyFile.ReadBasesFromKeyFile($@"keys\{GetConsoleOfBase(bases).ToString().ToLower()}.vck");

View file

@ -50,8 +50,9 @@ namespace UWUVCI_AIO_WPF.UI.Frames.InjectFrames.Bases
private void Button_Click(object sender, RoutedEventArgs e)
{
//warning if using custom bases programm may crash
//get folder
//check if everything fine
//check if WUP or Loadiine
//if yes, enable config and create new game config
}
}

View file

@ -48,11 +48,12 @@ namespace UWUVCI_AIO_WPF.UI.Frames.InjectFrames.Configurations
private void InjectGame(object sender, RoutedEventArgs e)
{
mvm.Inject();
mvm.Injected = true;
}
private void Set_TvTex(object sender, RoutedEventArgs e)
{
mvm.ImageWarning();
string path = mvm.GetFilePath(false, false);
if (!CheckIfNull(path)) mvm.GameConfiguration.TGATv.ImgPath = path;
@ -61,18 +62,21 @@ namespace UWUVCI_AIO_WPF.UI.Frames.InjectFrames.Configurations
private void Set_DrcTex(object sender, RoutedEventArgs e)
{
mvm.ImageWarning();
string path = mvm.GetFilePath(false, false);
if (!CheckIfNull(path)) mvm.GameConfiguration.TGADrc.ImgPath = path;
}
private void Set_IconTex(object sender, RoutedEventArgs e)
{
mvm.ImageWarning();
string path = mvm.GetFilePath(false, false);
if (!CheckIfNull(path)) mvm.GameConfiguration.TGAIco.ImgPath = path;
}
private void Set_LogoTex(object sender, RoutedEventArgs e)
{
mvm.ImageWarning();
string path = mvm.GetFilePath(false, false);
if (!CheckIfNull(path)) mvm.GameConfiguration.TGALog.ImgPath = path;
}

View file

@ -50,11 +50,11 @@ namespace UWUVCI_AIO_WPF.UI.Frames.InjectFrames.Configurations
private void InjectGame(object sender, RoutedEventArgs e)
{
mvm.Inject();
mvm.Injected = true;
}
private void Set_TvTex(object sender, RoutedEventArgs e)
{
mvm.ImageWarning();
string path = mvm.GetFilePath(false, false);
if (!CheckIfNull(path)) mvm.GameConfiguration.TGATv.ImgPath = path;
@ -63,18 +63,21 @@ namespace UWUVCI_AIO_WPF.UI.Frames.InjectFrames.Configurations
private void Set_DrcTex(object sender, RoutedEventArgs e)
{
mvm.ImageWarning();
string path = mvm.GetFilePath(false, false);
if (!CheckIfNull(path)) mvm.GameConfiguration.TGADrc.ImgPath = path;
}
private void Set_IconTex(object sender, RoutedEventArgs e)
{
mvm.ImageWarning();
string path = mvm.GetFilePath(false, false);
if (!CheckIfNull(path)) mvm.GameConfiguration.TGAIco.ImgPath = path;
}
private void Set_LogoTex(object sender, RoutedEventArgs e)
{
mvm.ImageWarning();
string path = mvm.GetFilePath(false, false);
if (!CheckIfNull(path)) mvm.GameConfiguration.TGALog.ImgPath = path;
}