public static void ColorSmashTex0(object sender, EventArgs e) { // If this was selected via keycode when it's invalid, return without error if (!CanRunColorSmash || MainForm.Instance.resourceTree.SelectedNodes.Count <= 1) { return; } DirectoryInfo inputDir = Directory.CreateDirectory(Program.AppPath + "\\cs\\"); DirectoryInfo outputDir = Directory.CreateDirectory(Program.AppPath + "\\cs\\out\\"); try { // Clear the directories. If they aren't empty, the implementation WILL NOT work foreach (FileInfo f in outputDir.GetFiles()) { try { f.Delete(); } catch { // ignored } } foreach (FileInfo f in inputDir.GetFiles()) { try { f.Delete(); } catch { // ignored } } // Throw error if color smash directory isn't empty if (inputDir.GetFiles().Length > 0 || outputDir.GetFiles().Length > 0) { MessageBox.Show( "One or more files exist in the required Color Smash folder. Please delete these nodes manually and try again", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } short paletteCount = 0; List <TEX0Node> textureList = new List <TEX0Node>(); Dictionary <int, string> names = new Dictionary <int, string>(); BRRESNode b = (((TEX0Wrapper)MainForm.Instance.resourceTree.SelectedNodes[0]).Resource as TEX0Node)? .BRESNode; if (b == null) { MessageBox.Show( "The BRRES could not be found. Color Smashing is only supported for TEX0 nodes in BRRES groups", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } int index = int.MaxValue; foreach (TreeNode n in MainForm.Instance.resourceTree.SelectedNodes) { // If this was selected via keycode when it's invalid, return without error if (!(n is TEX0Wrapper)) { return; } if (((TEX0Wrapper)n).Resource is TEX0Node t) { if (t.BRESNode != b) { MessageBox.Show("Color Smash is only supported for nodes in the same BRRES", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } textureList.Add(t); int placement = t.Parent.Children.IndexOf(t); names.Add(placement, t.Name); if (placement < index) { index = placement; } t.Export($"{inputDir.FullName}\\{placement:D5}.png"); if (paletteCount < 256) { if (!t.HasPalette || t.GetPaletteNode() == null) { paletteCount = 256; } else if (t.HasPalette && t.GetPaletteNode() != null && t.GetPaletteNode().Palette.Entries.Length > paletteCount) { paletteCount = (short)Math.Min(t.GetPaletteNode().Palette.Entries.Length, 256); } } } } if (index == int.MaxValue) { MessageBox.Show("Could not properly get the index of the images", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (paletteCount == 0) { paletteCount = 256; } foreach (TEX0Node t in textureList) { if (t.HasPalette && t.GetPaletteNode() != null) { t.GetPaletteNode().Remove(); } t.Remove(); } Process cSmash = Process.Start(new ProcessStartInfo { FileName = Program.AppPath + "\\color_smash.exe", WindowStyle = ProcessWindowStyle.Hidden, Arguments = $"-c RGB5A3 -n {paletteCount}" }); cSmash?.WaitForExit(); textureList = new List <TEX0Node>(); int count = 0; BRESGroupNode texGroup = b.GetOrCreateFolder <TEX0Node>(); foreach (FileInfo f in outputDir.GetFiles()) { FileInfo f2 = new FileInfo($"{inputDir.FullName}\\{f.Name}"); int i = int.Parse(f.Name.Substring(0, f.Name.IndexOf(".", StringComparison.Ordinal))); using (TextureConverterDialog dlg = new TextureConverterDialog()) { dlg.ImageSource = f.FullName; dlg.ChkImportPalette.Checked = true; dlg.Automatic = true; dlg.StartingFormat = WiiPixelFormat.CI8; if (dlg.ShowDialog(MainForm.Instance, b) != DialogResult.OK) { continue; } TEX0Node t = dlg.TEX0TextureNode; t.Name = names[i]; textureList.Add(t); dlg.Dispose(); t.OriginalPath = ""; if (texGroup.Children.Count > count + 1) { texGroup.RemoveChild(t); texGroup.InsertChild(t, false, index + count); } count++; } f2.Delete(); } if (textureList.Count > 0) { textureList.Remove(textureList.Last()); foreach (TEX0Node t in textureList) { t.SharesData = true; } } if (inputDir.GetFiles().Length > 0) { MessageBox.Show( "One or more files threw an error. Please ensure all relevant textures can be Color Smashed together.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); foreach (FileInfo f in inputDir.GetFiles()) { int i = int.Parse(f.Name.Substring(0, f.Name.IndexOf(".", StringComparison.Ordinal))); using (TextureConverterDialog dlg = new TextureConverterDialog()) { dlg.ImageSource = f.FullName; dlg.Automatic = true; if (dlg.ShowDialog(MainForm.Instance, b) != DialogResult.OK) { continue; } TEX0Node t = dlg.TEX0TextureNode; t.Name = names[i]; dlg.Dispose(); t.OriginalPath = ""; if (texGroup.Children.Count > count + 1) { texGroup.RemoveChild(t); texGroup.InsertChild(t, false, index + count); } count++; } } } } finally { foreach (FileInfo f in outputDir.GetFiles()) { try { f.Delete(); } catch { // ignored } } try { outputDir.Delete(); } catch { // ignored } foreach (FileInfo f in inputDir.GetFiles()) { try { f.Delete(); } catch { // ignored } } try { inputDir.Delete(); } catch { // ignored } } }
public PAT0Node GeneratePAT0(bool force) { if (Parent == null) { return(null); } if (_resource.Parent is BRESGroupNode && _resource.Parent.Parent != null && _resource.Parent.Parent is BRRESNode) { // Check if this is part of a sequence if (Regex.Match(_resource.Name, @"(\.\d+)?$").Success&& _resource.Name.LastIndexOf(".") > 0 && _resource.Name.LastIndexOf(".") <= _resource.Name.Length && int.TryParse( _resource.Name.Substring(_resource.Name.LastIndexOf(".") + 1, _resource.Name.Length - (_resource.Name.LastIndexOf(".") + 1)), out int n)) { //Console.WriteLine(_resource.Name.Substring(0, _resource.Name.LastIndexOf(".")) + " is part of a sequence"); //Console.WriteLine(_resource.Name.Substring(_resource.Name.LastIndexOf(".") + 1, _resource.Name.Length - (_resource.Name.LastIndexOf(".") + 1))); // Determine the name to match string matchName = _resource.Name.Substring(0, _resource.Name.LastIndexOf(".")) + "."; BRESGroupNode paletteGroup = ((BRRESNode)_resource.Parent.Parent).GetFolder <PLT0Node>(); List <string> textureList = new List <string>(); List <PLT0Node> paletteList = new List <PLT0Node>(); int highestNum = -1; bool isStock = false; bool isStockEx = false; if (matchName.Equals("InfStc.", StringComparison.OrdinalIgnoreCase)) { isStock = true; if (_resource.Name.Length >= 11) { isStockEx = true; } } foreach (TEX0Node tx0 in _resource.Parent.Children) { if (tx0.Name.StartsWith(matchName) && tx0.Name.LastIndexOf(".") > 0 && tx0.Name.LastIndexOf(".") <= tx0.Name.Length && int.TryParse( tx0.Name.Substring(tx0.Name.LastIndexOf(".") + 1, tx0.Name.Length - (tx0.Name.LastIndexOf(".") + 1)), out int n2) && n2 >= 0 && !textureList.Contains(tx0.Name)) { if (isStock) { if (isStockEx && tx0.Name.Length < 11) { continue; } } // Add the matching texture to the texture list for the PAT0 textureList.Add(tx0.Name); // Determine the highest number used if (n2 > highestNum) { highestNum = n2; } Console.WriteLine(tx0.Name); Console.WriteLine(tx0.HasPalette); if (tx0.HasPalette) { paletteList.Add(tx0.GetPaletteNode()); } else { paletteList.Add(null); } } } if (textureList.Count <= 0) { return(null); } PAT0Node newPat0 = new PAT0Node { Name = _resource.Name.Substring(0, _resource.Name.LastIndexOf(".")).Equals("InfStc") ? "InfStockface_TopN__0" : _resource.Name.Substring(0, _resource.Name.LastIndexOf(".")), _numFrames = highestNum + 1 }; PAT0EntryNode pat0Entry = new PAT0EntryNode(); newPat0.AddChild(pat0Entry); pat0Entry.Name = _resource.Name.Substring(0, _resource.Name.LastIndexOf(".")).Equals("InfStc") ? "lambert87" : _resource.Name.Substring(0, _resource.Name.LastIndexOf(".")); PAT0TextureNode pat0Tex = new PAT0TextureNode((PAT0Flags)7, 0); pat0Entry.AddChild(pat0Tex); if (((BRRESNode)_resource.Parent.Parent).GetFolder <PAT0Node>() != null && ((BRRESNode)_resource.Parent.Parent).GetFolder <PAT0Node>().FindChildrenByName(newPat0.Name) .Length > 0) { if (force) { while (((BRRESNode)_resource.Parent.Parent).GetFolder <PAT0Node>() .FindChildrenByName(newPat0.Name).Length > 0) { ((BRRESNode)_resource.Parent.Parent).GetFolder <PAT0Node>() .FindChildrenByName(newPat0.Name)[0].Remove(); } } else { DialogResult d = MessageBox.Show( "Would you like to replace the currently existing \"" + newPat0.Name + "\" PAT0 animation?", "PAT0 Generator", MessageBoxButtons.YesNoCancel); if (d == DialogResult.Cancel || d == DialogResult.Abort) { return(null); } if (d == DialogResult.Yes) { while (((BRRESNode)_resource.Parent.Parent).GetFolder <PAT0Node>() .FindChildrenByName(newPat0.Name).Length > 0) { ((BRRESNode)_resource.Parent.Parent).GetFolder <PAT0Node>() .FindChildrenByName(newPat0.Name)[0].Remove(); } } } } if (isStock && !isStockEx && !textureList.Contains("InfStc.000")) { textureList.Add("InfStc.000"); paletteList.Add(null); } else if (isStock && isStockEx && !textureList.Contains("InfStc.0000")) { textureList.Add("InfStc.0000"); paletteList.Add(null); } //foreach(string s in textureList) for (int i = 0; i < textureList.Count; ++i) { string s = textureList[i]; if (float.TryParse(s.Substring(s.LastIndexOf(".") + 1, s.Length - (s.LastIndexOf(".") + 1)), out float fr)) { PAT0TextureEntryNode pat0texEntry = new PAT0TextureEntryNode(); pat0Tex.AddChild(pat0texEntry); pat0texEntry.Name = s; pat0texEntry._frame = fr; if (paletteList[i] != null) { pat0Tex.HasPalette = true; pat0texEntry._plt = paletteList[i].Name; } else if ((s == "InfStc.000" || s == "InfStc.0000") && pat0Tex.HasPalette) { pat0texEntry._plt = s; } if (fr == 0) { PAT0TextureEntryNode pat0texEntryFinal = new PAT0TextureEntryNode(); pat0Tex.AddChild(pat0texEntryFinal); pat0texEntryFinal.Name = s; pat0texEntryFinal._frame = highestNum + 1; if (paletteList[i] != null) { pat0Tex.HasPalette = true; pat0texEntryFinal.Palette = paletteList[i].Name; } else if ((s == "InfStc.000" || s == "InfStc.0000") && pat0Tex.HasPalette) { pat0texEntryFinal._plt = s; } } } //newPat0.AddChild } pat0Tex._children = pat0Tex._children.OrderBy(o => ((PAT0TextureEntryNode)o)._frame).ToList(); if (isStock && !isStockEx && newPat0.FrameCount < 501) { newPat0.FrameCount = 501; } else if (isStockEx && newPat0.FrameCount < 9201) { newPat0.FrameCount = 9201; } ((BRRESNode)_resource.Parent.Parent).GetOrCreateFolder <PAT0Node>().AddChild(newPat0); if (!force) { MainForm.Instance.TargetResource(newPat0); } return(newPat0); } else { PAT0Node newPat0 = new PAT0Node { Name = _resource.Name, _numFrames = 1 }; PAT0EntryNode pat0Entry = new PAT0EntryNode(); newPat0.AddChild(pat0Entry); pat0Entry.Name = _resource.Name; PAT0TextureNode pat0Tex = new PAT0TextureNode((PAT0Flags)7, 0); pat0Entry.AddChild(pat0Tex); PAT0TextureEntryNode pat0texEntry = new PAT0TextureEntryNode(); pat0Tex.AddChild(pat0texEntry); pat0texEntry.Name = _resource.Name; pat0texEntry._frame = 0; if (((TEX0Node)_resource).HasPalette) { pat0Tex.HasPalette = true; pat0texEntry.Palette = ((TEX0Node)_resource).GetPaletteNode().Name; } ((BRRESNode)_resource.Parent.Parent).GetOrCreateFolder <PAT0Node>().AddChild(newPat0); MainForm.Instance.TargetResource(newPat0); return(newPat0); } } return(null); }