private static void CleanUp(string outputDir, TMD tmd) { try { if (!Settings.StoreEncryptedContent) { Toolbelt.AppendLog(" - Deleting Encrypted Contents..."); foreach (var t in tmd.Contents) { if (!File.Exists(Path.Combine(outputDir, t.ContentID.ToString("x8")))) { continue; } File.Delete(Path.Combine(outputDir, t.ContentID.ToString("x8"))); } } Toolbelt.AppendLog(" - Deleting CDecrypt, libeay32, and msvcr120d..."); File.Delete(Path.Combine(outputDir, "CDecrypt.exe")); File.Delete(Path.Combine(outputDir, "libeay32.dll")); File.Delete(Path.Combine(outputDir, "msvcr120d.dll")); } catch { // ignored } }
private static int DownloadContent(TMD tmd, string outputDir, string titleUrl) { for (var i = 0; i < tmd.NumOfContents; i++) { var i1 = i; var numc = tmd.NumOfContents; var size = Toolbelt.SizeSuffix((long)tmd.Contents[i1].Size); Toolbelt.AppendLog($"Downloading Content #{i1 + 1} of {numc}... ({size})"); var contentPath = Path.Combine(outputDir, tmd.Contents[i1].ContentID.ToString("x8")); if (!Toolbelt.IsValid(tmd.Contents[i1], contentPath)) { try { var downloadUrl = $"{titleUrl}/{tmd.Contents[i1].ContentID:x8}"; Web.DownloadFile(downloadUrl, contentPath); } catch (Exception ex) { Toolbelt.AppendLog($"Downloading Content #{i1 + 1} of {numc} failed...\n{ex.Message}"); break; } } ReportProgress(0, tmd.NumOfContents - 1, i1); } ReportProgress(0, 100, 0); return(1); }
private static TMD LoadTmd(string id, string key, string outputDir, string titleUrl, string version) { var tmdFile = Path.Combine(outputDir, "tmd"); if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(key)) { return(null); } version = int.Parse(version) == 0 ? "" : $".{version}"; if (DownloadTmd(titleUrl + $"tmd{version}", tmdFile) == null) { var url = $"http://ccs.cdn.wup.shop.nintendo.net/ccs/download/{id.ToLower()}/tmd"; DownloadTmd(url, tmdFile); } var file = new FileInfo(tmdFile); if (!file.Exists || file.Length <= 0) { return(null); } return(TMD.Load(tmdFile)); }
// create an LBD tile GameObject private static GameObject createLBDTile(LBDTile tile, LBDTile[] extraTiles, int x, int y, TMD tilesTmd, List <CombineInstance> meshesCreated) { // create the GameObject for the base tile GameObject lbdTile = createSingleLBDTile(tile, x, y, tilesTmd, meshesCreated); // now see if it has any extra tiles, and create those LBDTile curTile = tile; int i = 0; while (curTile.ExtraTileIndex >= 0 && i <= 1) { LBDTile extraTile = extraTiles[curTile.ExtraTileIndex]; GameObject extraTileObj = createSingleLBDTile(extraTile, x, y, tilesTmd, meshesCreated); extraTileObj.transform.SetParent(lbdTile.transform, true); // parent them to original tile curTile = extraTile; i++; } return(lbdTile); }
private static async Task <TMD> LoadTmd(string id, string key, string outputDir, string titleUrl, string version) { var tmdFile = Path.Combine(outputDir, "tmd"); if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(key)) { return(null); } version = int.Parse(version) == 0 ? "" : $".{version}"; if (await DownloadTmd(titleUrl + $"tmd{version}", tmdFile) == null) { var url = $"http://192.99.69.253/?key={key.ToLower()}&title={id.ToLower()}&type=tmd"; await DownloadTmd(url, tmdFile); } var file = new FileInfo(tmdFile); if (!file.Exists || file.Length <= 0) { return(null); } return(TMD.Load(tmdFile)); }
public static List <IRenderable> CreateLBDTileMesh(LBDTile tile, LBDTile[] extraTiles, int x, int y, TMD tilesTmd, Shader shader, ITexture2D vram, bool headless) { List <IRenderable> returnMeshList = new List <IRenderable>(); returnMeshList.Add(createSingleLBDTileMesh(tile, x, y, tilesTmd, shader, vram, headless)); LBDTile currentTile = tile; int i = 0; while (currentTile.ExtraTileIndex >= 0 && i <= 1) { LBDTile extraTile = extraTiles[currentTile.ExtraTileIndex]; returnMeshList.Add(createSingleLBDTileMesh(extraTile, x, y, tilesTmd, shader, vram, headless)); currentTile = extraTile; i++; } return(returnMeshList); }
public DownloadItem(string name, TMD tmd, NUS.UrlFilenamePair[] URLs, byte[] ticket, string absolutePath = null, object tag = null, bool madeTicket = false) { this.name = name; this.tmd = tmd; this.ticket = ticket; this.URLs = URLs; this.absolutePath = absolutePath; this.tag = tag; this.madeTicket = madeTicket; }
public Mesh MeshFromTMD(TMD tmd) { Mesh mesh = new Mesh(); foreach (var obj in tmd.ObjectTable) { Mesh objMesh = CreateTMDObjectMesh(obj); } return(null); }
/// <summary> /// Create a list of meshes based on the contents of a TMD model file. /// </summary> /// <param name="tmd">The loaded TMD to use.</param> /// <returns>The loaded list of meshes.</returns> public static List <Mesh> CreateMeshesFromTMD(TMD tmd) { List <Mesh> meshList = new List <Mesh>(); foreach (var obj in tmd.ObjectTable) { Mesh m = MeshFromTMDObject(obj); meshList.Add(m); } return(meshList); }
public static List <IRenderable> CreateMeshesFromTMD(TMD tmd, Shader shader, ITexture2D vram, bool headless) { List <IRenderable> meshList = new List <IRenderable>(); foreach (var obj in tmd.ObjectTable) { IRenderable objMesh = MeshFromTMDObject(obj, shader, headless); objMesh.Textures.Add(vram); meshList.Add(objMesh); } return(meshList); }
public static TMD LoadTMD(string filePath) { Log.Information($"Loading TMD from: {filePath}"); TMD tmd; using (BinaryReader br = new BinaryReader(File.Open(filePath, FileMode.Open))) { tmd = new TMD(br); } Log.Information("Successfully loaded TMD"); return(tmd); }
private static TMD GenerateDummyTMD(string title) { TMD tmd; tmd = TMD.Create(new MemoryStream(Properties.Resources.rawksd_tmd)); tmd.TitleID = ((0x00010005UL << 32) | (BigEndianConverter.ToUInt32(Util.Encoding.GetBytes(title)))); tmd.Contents.RemoveAll(c => c.Index != 0); tmd.Contents[0].ContentID = 0; tmd.Contents[0].Size = Properties.Resources.rawksd_savebanner.Length; tmd.Contents[0].Hash = SHA1.Create().ComputeHash(Properties.Resources.rawksd_savebanner); tmd.Fakesign(); return(tmd); }
private FastMesh createTileMesh(LBDTile tile, TMD tilesTmd, Dictionary <TMDObject, FastMesh> tileCache) { TMDObject tileObj = tilesTmd.ObjectTable[tile.TileType]; if (tileCache.ContainsKey(tileObj)) { return(tileCache[tileObj]); } Mesh m = LibLSDUnity.MeshFromTMDObject(tileObj); FastMesh fm = new FastMesh(m, new[] { LBDDiffuse, LBDAlpha }); tileCache[tileObj] = fm; return(fm); }
public void LoadTMD(string tmdPath) { Logger.Log()(LogLevel.INFO, $"Loading TMD from: {tmdPath}"); TMD tmd; using (BinaryReader br = new BinaryReader(File.Open(tmdPath, FileMode.Open))) { tmd = new TMD(br); } Logger.Log()(LogLevel.INFO, "Successfully loaded TMD"); TMDDocument document = CreateDocument(tmd); _treeController.PopulateTreeWithDocument(document, Path.GetFileName(tmdPath)); }
private static IRenderable createSingleLBDTileMesh(LBDTile tile, int x, int y, TMD tilesTmd, Shader shader, ITexture2D vram, bool headless) { TMDObject tileObj = tilesTmd.ObjectTable[tile.TileType]; IRenderable tileMesh = MeshFromTMDObject(tileObj, shader, headless); switch (tile.TileDirection) { case LBDTile.TileDirections.Deg90: { tileMesh.Transform.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90)); break; } case LBDTile.TileDirections.Deg180: { tileMesh.Transform.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(180)); break; } case LBDTile.TileDirections.Deg270: { tileMesh.Transform.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(270)); break; } } tileMesh.Transform.Position = new Vector3(x, tile.TileHeight, y); tileMesh.Textures.Add(vram); return(tileMesh); }
private static TMD DownloadTmd(string url, string saveTo) { var data = DownloadData(url); if (data.Length <= 0) { return(null); } var tmd = TMD.Load(data); if (tmd.TitleVersion > 999) { return(null); } Toolbelt.AppendLog(" - Parsing TMD..."); Toolbelt.AppendLog($" + Title Version: {tmd.TitleVersion}"); Toolbelt.AppendLog($" + {tmd.NumOfContents} Contents"); File.WriteAllBytes(saveTo, data); return(tmd); }
public static void DownloadMissing(string tmdPath, bool autoClose = false) { if (!File.Exists(tmdPath)) { return; } FileInfo info = new FileInfo(tmdPath); TMD tmd = new TMD(File.ReadAllBytes(tmdPath)); var onlineTMDTask = NUS.DownloadTMD(tmd.TitleID); onlineTMDTask.Wait(); TMD onlineTMD = onlineTMDTask.Result; if (!tmd.rawBytes.SequenceEqual(onlineTMD.rawBytes)) { MessageBox.Show(Localization.Strings.RepairFailed, Localization.Strings.Error); return; } List <DownloadItem> queue = new List <DownloadItem> { }; var URLTask = NUS.GetTitleContentURLs(tmd, true); URLTask.Wait(); NUS.UrlFilenamePair[] URLs = URLTask.Result; AppDomain.CurrentDomain.DoCallBack(() => { frmDownload frm = new frmDownload(); frm.DownloadQueue.Add(new DownloadItem(tmd.TitleID, tmd, URLs, new byte[] { }, info.DirectoryName)); frm.AutoClose = autoClose; frm.DownloadPath = info.DirectoryName; frm.lblDownloadingMetadata.Dispose(); Program.FormContext.AddForm(frm); }); }
public static string TMDToOBJFile(TMD tmd) { int vertCount = (int)tmd.NumberOfVertices; int faceCount = 0; foreach (var tmdObj in tmd.ObjectTable) { faceCount += (int)tmdObj.NumPrimitives; } ObjBuilder obj = new ObjBuilder(); WriteOBJHeader(obj, vertCount, faceCount); List <Vector3> positions = new List <Vector3>(); List <Vector3> normals = new List <Vector3>(); foreach (var tmdObj in tmd.ObjectTable) { foreach (Vec3 vert in tmdObj.Vertices) { positions.Add(new Vector3(vert.X, vert.Y, vert.Z)); } foreach (var norm in tmdObj.Normals) { normals.Add(new Vector3(norm.X, norm.Y, norm.Z)); } } foreach (var pos in positions) { obj.Vertex(pos); } foreach (var norm in normals) { obj.Normal(norm); } foreach (var tmdObj in tmd.ObjectTable) { foreach (var prim in tmdObj.Primitives) { if (prim.PacketData is ITMDTexturedPrimitivePacket uvPacket) { for (int j = 0; j < prim.PacketData.Vertices.Length; j++) { int uvIndex = j * 2; obj.UV(new Vector2(uvPacket.UVs[uvIndex] / 255f, uvPacket.UVs[uvIndex + 1] / 255f)); } } } } ObjFaceBuilder faceBuilder = new ObjFaceBuilder(); int indexBase = 0; for (int i = 0; i < tmd.Header.NumObjects; i++) { obj.Group($"Object {i}"); int uvCount = 1; foreach (var prim in tmd.ObjectTable[i].Primitives) { ITMDPrimitivePacket primitivePacket = prim.PacketData; ITMDTexturedPrimitivePacket texPrimitivePacket = prim.PacketData as ITMDTexturedPrimitivePacket; ITMDLitPrimitivePacket litPrimitivePacket = prim.PacketData as ITMDLitPrimitivePacket; int[] indices = new int[primitivePacket.Vertices.Length]; for (int vert = 0; vert < primitivePacket.Vertices.Length; vert++) { int v = indexBase + primitivePacket.Vertices[vert] + 1; indices[vert] = v; int?t = null; int?n = null; if (texPrimitivePacket != null) { t = uvCount++; } if (litPrimitivePacket != null) { n = litPrimitivePacket.Normals[vert] + 1; } } bool isQuad = (prim.Options & TMDPrimitivePacket.OptionsFlags.Quad) != 0; bool isDoubleSided = (prim.Flags & TMDPrimitivePacket.PrimitiveFlags.DoubleSided) != 0; faceBuilder.Vertex(indices[1]); faceBuilder.Vertex(indices[0]); faceBuilder.Vertex(indices[2]); obj.Face(faceBuilder.Build()); faceBuilder.Clear(); if (isQuad) { faceBuilder.Vertex(indices[1]); faceBuilder.Vertex(indices[2]); faceBuilder.Vertex(indices[3]); obj.Face(faceBuilder.Build()); faceBuilder.Clear(); } if (isDoubleSided) { obj.Comment("DOuble sided!"); faceBuilder.Vertex(indices[0]); faceBuilder.Vertex(indices[1]); faceBuilder.Vertex(indices[2]); obj.Face(faceBuilder.Build()); faceBuilder.Clear(); if (isQuad) { faceBuilder.Vertex(indices[2]); faceBuilder.Vertex(indices[1]); faceBuilder.Vertex(indices[3]); obj.Face(faceBuilder.Build()); faceBuilder.Clear(); } } faceBuilder.Clear(); } indexBase += tmd.ObjectTable[i].Vertices.Length; } return(obj.ToString()); }
private byte[] decryptContent(byte[] content, int contentIndex, Ticket tik, TMD tmd) { Array.Resize(ref content, Shared.AddPadding(content.Length, 16)); byte[] titleKey = tik.TitleKey; byte[] iv = new byte[16]; byte[] tmp = BitConverter.GetBytes(tmd.Contents[contentIndex].Index); iv[0] = tmp[1]; iv[1] = tmp[0]; RijndaelManaged rm = new RijndaelManaged(); rm.Mode = CipherMode.CBC; rm.Padding = PaddingMode.None; rm.KeySize = 128; rm.BlockSize = 128; rm.Key = titleKey; rm.IV = iv; ICryptoTransform decryptor = rm.CreateDecryptor(); MemoryStream ms = new MemoryStream(content); CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read); byte[] decCont = new byte[content.Length]; cs.Read(decCont, 0, decCont.Length); cs.Dispose(); ms.Dispose(); return decCont; }
private static void DownloadTitle(string id, string outputDir, string contentType, string version) { #region Setup var workingId = id.ToUpper(); //download dlc if applicable if (contentType == "DLC") { workingId = $"0005000C{workingId.Substring(8).ToUpper()}"; } //download patch if applicable if (contentType == "Patch") { workingId = $"0005000E{workingId.Substring(8).ToUpper()}"; } var title = Database.FindTitleKey(workingId); if (title.titleKey.Length != 32) { throw new Exception("Could not locate the title key"); } var key = title.titleKey; var name = title.name; if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(name)) { return; } var result = MessageBoxResult.Cancel; var str = $"Download {contentType} content to the following location?\n\"{outputDir}\""; Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { result = MessageBox.Show(Application.Current.MainWindow, str, name, MessageBoxButton.YesNo); })); if (result != MessageBoxResult.Yes) { return; } if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } Toolbelt.AppendLog($"Output Directory '{outputDir}'"); #endregion #region TMD Toolbelt.AppendLog(" - Loading TMD..."); TMD tmd = null; var nusUrls = new List <string> { "http://ccs.cdn.wup.shop.nintendo.net/ccs/download/", "http://nus.cdn.shop.wii.com/ccs/download/", "http://ccs.cdn.c.shop.nintendowifi.net/ccs/download/" }; foreach (var nusUrl in nusUrls) { var titleUrl = $"{nusUrl}{workingId}/"; tmd = LoadTmd(workingId, key, outputDir, titleUrl, version); if (tmd != null) { break; } } if (tmd == null) { TextLog.MesgLog.WriteError("Could not locate TMD. Is this content request valid?"); return; } #endregion #region Ticket Toolbelt.AppendLog("Generating Ticket..."); var tikData = MapleTicket.Create(Database.FindTitleKey(workingId)); if (tikData == null) { throw new Exception("Invalid ticket data. Verify Title ID."); } var ticket = Ticket.Load(tikData); ticket.Save(Path.Combine(outputDir, "cetk")); #endregion #region Content Toolbelt.AppendLog($"[+] [{contentType}] {name} v{tmd.TitleVersion}"); Toolbelt.SetStatus($"Output Directory: {outputDir}"); foreach (var nusUrl in nusUrls) { var url = nusUrl + workingId; if (DownloadContent(tmd, outputDir, url) != 1) { continue; } Toolbelt.AppendLog(string.Empty); Toolbelt.AppendLog(" - Decrypting Content"); Toolbelt.AppendLog(" + This may take a minute. Please wait..."); Toolbelt.SetStatus("Decrypting Content. This may take a minute. Please wait...", Color.OrangeRed); if (Toolbelt.CDecrypt(outputDir) != 0) { CleanUp(outputDir, tmd); Toolbelt.AppendLog($"Error while decrypting {name}"); return; } CleanUp(outputDir, tmd); break; } #endregion Web.ResetDownloadProgressChanged(); Toolbelt.AppendLog($"[+] [{contentType}] {name} v{tmd.TitleVersion} Finished."); Toolbelt.SetStatus($"[+] [{contentType}] {name} v{tmd.TitleVersion} Finished."); }
/// <summary> /// Loads a tmd file. /// </summary> /// <param name="tmdFile"></param> /// <returns></returns> public static TMD Load(byte[] tmdFile) { TMD t = new TMD(); MemoryStream ms = new MemoryStream(tmdFile); try { t.parseTmd(ms); } catch { ms.Dispose(); throw; } ms.Dispose(); return t; }
public static void NUS(string[] args) { if (args.Length < 2) { NUS_help(); return; } if (args[1].ToUpper() == "-H" || args[1].ToUpper() == "-HELP") { NUS_help(); return; } //Set up variables string id = ""; string content = ""; string version = ""; int intver = -1; string output = ""; bool local = false; List <StoreType> store = new List <StoreType>(); bool entered = false; bool wad = false; bool NoOut = false; string ios = ""; string temp = Path.GetTempPath() + "Sharpii.tmp"; //Get arguments for (int i = 1; i < args.Length; i++) { switch (args[i].ToUpper()) { case "-ALL": store.Add(StoreType.All); entered = true; break; case "-WAD": store.Add(StoreType.WAD); entered = true; break; case "-ENCRYPT": store.Add(StoreType.EncryptedContent); entered = true; break; case "-ENCRYPTED": store.Add(StoreType.EncryptedContent); entered = true; break; case "-DECRYPT": store.Add(StoreType.DecryptedContent); entered = true; break; case "-DECRYPTED": store.Add(StoreType.DecryptedContent); entered = true; break; case "-LOCAL": local = true; break; case "-V": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No version set"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_VERSION_01"); Environment.Exit(0x00003E8B); return; } version = args[i + 1]; if (version.ToUpper() == "LATEST") { break; } if (!int.TryParse(version, out intver)) { Console.WriteLine("Invalid version {0}...", args[i + 1]); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_INVALID_VERSION_01"); Environment.Exit(0x00003E8C); return; } if (intver < 0 || intver > 65535) { Console.WriteLine("Invalid version {0}...", version); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_INVALID_VERSION_01"); Environment.Exit(0x00003E8C); return; } break; case "-VERSION": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No version set"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_VERSION_01"); Environment.Exit(0x00003E8B); return; } version = args[i + 1]; if (version.ToUpper() == "LATEST") { break; } if (!int.TryParse(version, out intver)) { Console.WriteLine("Invalid version {0}...", args[i + 1]); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_INVALID_VERSION_01"); Environment.Exit(0x00003E8C); return; } if (intver < 0 || intver > 65535) { Console.WriteLine("Invalid version {0}...", version); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_INVALID_VERSION_01"); Environment.Exit(0x00003E8C); return; } break; case "-O": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No output set"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_OUTPUT_01"); Environment.Exit(0x00003E8D); return; } output = args[i + 1]; break; case "-ID": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No ID specified"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_ID_01"); Environment.Exit(0x00003E8E); return; } id = args[i + 1]; break; case "-IOS": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No IOS specified"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_IOS_01"); Environment.Exit(0x00003E86); return; } id = "00000001000000" + Convert.ToInt32(args[i + 1]).ToString("X2"); break; case "-SINGLE": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No ID specified"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_ID_01"); Environment.Exit(0x00003E8E); return; } content = args[i + 1]; break; case "-S": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No ID specified"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_ID_01"); Environment.Exit(0x00003E8E); return; } content = args[i + 1]; break; } } //Error checking & stuff if (id == "") { Console.WriteLine("ERROR: No ID specified"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_ID_01"); Environment.Exit(0x00003E8E); return; } if (version == "") { if (BeQuiet.quiet > 2) { Console.WriteLine("No version specified, using latest", version); } version = "LATEST"; } try { if (version.ToUpper() == "LATEST") { //Grab the TMD and get the latest version NusClient grabtmd = new NusClient(); TMD tmd = grabtmd.DownloadTMD(id, ""); version = tmd.TitleVersion.ToString(); } } catch (Exception ex) { if (ex.Message == "Title ID must be 16 characters long!") { Console.WriteLine(""); Console.WriteLine("The ID needs to be 16 Characters."); Console.WriteLine(""); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_BAD_ID_01"); Console.WriteLine(""); Environment.Exit(0x00003E9C); return; } if (ex.Message == "The remote server returned an error: (404) Not Found.") { Console.WriteLine(""); Console.WriteLine("The ID is not a valid title ID"); Console.WriteLine(""); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_BAD_ID_01"); Console.WriteLine(""); Environment.Exit(0x00003E9C); return; } } if (BeQuiet.quiet > 2) { Console.WriteLine("Found latest version: v{0}", version); } if (entered == false) //Will only be false if no store type argument was given { store.Add(StoreType.All); if (BeQuiet.quiet > 2) { Console.WriteLine("No store type specified, using all"); } } if (id.Length == 16 && Convert.ToInt32(id.Substring(14, 2), 16) >= 3 && Convert.ToInt32(id.Substring(14, 2), 16) <= 255 && id.Substring(0, 14) == "00000001000000") { ios = "IOS" + Convert.ToInt32(id.Substring(14, 2), 16) + "-64-" + version + ".wad"; } if ((((output.Length >= 4 && output.Substring(output.Length - 4, 4).ToUpper() == ".WAD") || output == "") && Array.IndexOf(store.ToArray(), StoreType.WAD) != -1 && store.ToArray().Length == 1) || (output == "" && ios != "" && Array.IndexOf(store.ToArray(), StoreType.WAD) != -1 && store.ToArray().Length == 1)) { wad = true; if (Directory.Exists(temp) == true) { DeleteADir.DeleteDirectory(temp); } Directory.CreateDirectory(temp); } if (output == "") { NoOut = true; output = ios == "" ? id + "v" + version : ios.Substring(0, ios.Length - 4); if (BeQuiet.quiet > 2) { Console.WriteLine("No output specified, using {0}", output); } } //Main part, catches random/unexpected exceptions try { NusClient nus = new NusClient(); if (local == true) { if (BeQuiet.quiet > 2) { Console.WriteLine("Using local files if present..."); } nus.UseLocalFiles = true; } if (content != "") { if (BeQuiet.quiet > 1) { Console.Write("Downloading content..."); } nus.DownloadSingleContent(id, version, content, output); if (BeQuiet.quiet > 1) { Console.Write("Done!\n"); } } else { if (BeQuiet.quiet > 1) { Console.Write("Downloading title..."); } string realout = output; if (wad == true) { output = temp; } nus.DownloadTitle(id, version, output, store.ToArray()); WadIosNamingStuff(wad, temp, id, version, ios, NoOut, output, realout); if (BeQuiet.quiet > 1) { Console.Write("Done!\n"); } } if (BeQuiet.quiet > 1) { Console.WriteLine("Operation completed succesfully!"); } } catch (Exception ex) { Console.WriteLine("An unknown error occured, please try again"); Console.WriteLine(""); Console.WriteLine("ERROR DETAILS: {0}", ex.Message); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_UNKNOWN_01"); Environment.Exit(0x00003E82); return; } return; }
/// <summary> /// Loads a tmd file. /// </summary> /// <param name="tmd"></param> /// <returns></returns> public static TMD Load(Stream tmd) { TMD t = new TMD(); t.parseTmd(tmd); return t; }
public static async Task DownloadTitle(string id, string outputDir, string contentType, string version) { #region Setup var workingId = id.ToUpper(); if (contentType == "Patch") { workingId = $"0005000E{workingId.Substring(8)}"; if (Settings.Cemu173Patch) { outputDir = Path.Combine(Settings.BasePatchDir, workingId.Substring(8)); } } if (contentType == "DLC") { workingId = $"0005000C{workingId.Substring(8)}"; if (Settings.Cemu173Patch) { outputDir = Path.Combine(Settings.BasePatchDir, workingId.Substring(8), "aoc"); } } Title title; if ((title = SearchById(workingId)) == null) { throw new Exception("Could not locate the title key"); } var key = title.Key; var name = title.Name; if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(name)) { return; } if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } var str = $"Download {contentType} content to the following location?\n\"{outputDir}\""; var result = MessageBox.Show(str, name, MessageBoxButtons.YesNo); if (result != DialogResult.Yes) { return; } Toolbelt.AppendLog($"Output Directory '{outputDir}'"); #endregion #region TMD Toolbelt.AppendLog(" - Loading TMD..."); TMD tmd = null; var nusUrls = new List <string> { "http://ccs.cdn.wup.shop.nintendo.net/ccs/download/", "http://nus.cdn.shop.wii.com/ccs/download/", "http://ccs.cdn.c.shop.nintendowifi.net/ccs/download/" }; foreach (var nusUrl in nusUrls) { string titleUrl = $"{nusUrl}{workingId}/"; tmd = await LoadTmd(id, key, outputDir, titleUrl, version); if (tmd != null) { break; } } if (tmd == null) { TextLog.MesgLog.WriteError("Could not locate TMD. Is this content request valid?"); return; } #endregion #region Ticket Toolbelt.AppendLog("Generating Ticket..."); var tikData = MapleTicket.Create(SearchById(id)); if (tikData == null) { throw new Exception("Invalid ticket data. Verify Title ID."); } var ticket = Ticket.Load(tikData); ticket.Save(Path.Combine(outputDir, "cetk")); #endregion #region Content Toolbelt.AppendLog($"[+] [{contentType}] {name} v{tmd.TitleVersion}"); Toolbelt.SetStatus($"Output Directory: {outputDir}"); foreach (var nusUrl in nusUrls) { var url = nusUrl + workingId; if (await DownloadContent(tmd, outputDir, url) != 1) { continue; } Toolbelt.AppendLog(string.Empty); Toolbelt.AppendLog(" - Decrypting Content"); Toolbelt.AppendLog(" + This may take a minute. Please wait..."); Toolbelt.SetStatus("Decrypting Content. This may take a minute. Please wait...", Color.OrangeRed); if (await Toolbelt.CDecrypt(outputDir) != 0) { CleanUp(outputDir, tmd); Toolbelt.AppendLog($"Error while decrypting {name}"); return; } CleanUp(outputDir, tmd); break; } #endregion Web.ResetDownloadProgressChanged(); Toolbelt.AppendLog($"[+] [{contentType}] {name} v{tmd.TitleVersion} Finished."); Toolbelt.SetStatus($"[+] [{contentType}] {name} v{tmd.TitleVersion} Finished."); }
// create a single LBD tile GameObject (not including extra tiles) private GameObject createSingleLBDTile(LBDTile tile, int x, int y, TMD tilesTmd, List <CombineInstance> meshesCreated, Dictionary <TMDObject, Mesh> cache) { // rotate the tile based on its direction Quaternion tileRot = Quaternion.identity; switch (tile.TileDirection) { case LBDTile.TileDirections.Deg90: { tileRot = Quaternion.AngleAxis(90, Vector3.up); break; } case LBDTile.TileDirections.Deg180: { tileRot = Quaternion.AngleAxis(180, Vector3.up); break; } case LBDTile.TileDirections.Deg270: { tileRot = Quaternion.AngleAxis(270, Vector3.up); break; } } // create the GameObject and add/setup necessary components GameObject lbdTile = LBDTilePool.Summon(new Vector3(x, -tile.TileHeight, y), tileRot); MeshFilter mf = lbdTile.GetComponent <MeshFilter>(); MeshRenderer mr = lbdTile.GetComponent <MeshRenderer>(); TMDObject tileObj = tilesTmd.ObjectTable[tile.TileType]; Mesh tileMesh; if (cache.ContainsKey(tileObj)) { tileMesh = cache[tileObj]; } else { tileMesh = LibLSDUnity.MeshFromTMDObject(tileObj); cache[tileObj] = tileMesh; } mf.sharedMesh = tileMesh; // the renderer needs to use virtual PSX Vram as its materials mr.sharedMaterials = new[] { LBDDiffuse, LBDAlpha }; // set the tile's height lbdTile.transform.position = new Vector3(x, -tile.TileHeight, y); // make a CombineInstance for combining all tiles into one mesh later on var localToWorldMatrix = lbdTile.transform.localToWorldMatrix; CombineInstance combine = new CombineInstance() { mesh = tileMesh, transform = localToWorldMatrix, subMeshIndex = 0 }; meshesCreated.Add(combine); // if tile has transparent part, do the same for the transparent mesh if (tileMesh.subMeshCount > 1) { CombineInstance combineTrans = new CombineInstance() { mesh = tileMesh, transform = localToWorldMatrix, subMeshIndex = 1 }; meshesCreated.Add(combineTrans); } return(lbdTile); }
public static void NUS(string[] args, bool SecondRun) { if (args.Length < 2) { NUS_help(); return; } if (args[1].ToUpper() == "-H" || args[1].ToUpper() == "-HELP") { NUS_help(); return; } //Set up variables string id = ""; string content = ""; string version = ""; int intver = -1; string output = ""; bool local = false; List <StoreType> store = new List <StoreType>(); bool entered = false; bool wad = false; bool NoOut = false; string ios = ""; string temp = Path.GetTempPath() + "Sharpii.tmp"; bool ContinueWithoutTicket = false; //Remove need for CETK if (SecondRun == true) { ContinueWithoutTicket = true; } //Get arguments for (int i = 1; i < args.Length; i++) { switch (args[i].ToUpper()) { case "-ALL": store.Add(StoreType.All); entered = true; break; case "-WAD": store.Add(StoreType.WAD); entered = true; break; case "-ENCRYPT": store.Add(StoreType.EncryptedContent); entered = true; break; case "-ENCRYPTED": store.Add(StoreType.EncryptedContent); entered = true; break; case "-DECRYPT": store.Add(StoreType.DecryptedContent); entered = true; break; case "-DECRYPTED": store.Add(StoreType.DecryptedContent); entered = true; break; case "-LOCAL": local = true; break; case "-V": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No version set"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_VERSION"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8B); } else { Environment.Exit(0x0000000D); } return; } version = args[i + 1]; if (version.ToUpper() == "LATEST") { break; } if (!int.TryParse(version, out intver)) { Console.WriteLine("Invalid version {0}...", args[i + 1]); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_INVALID_VERSION"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8C); } else { Environment.Exit(0x0000000E); } return; } if (intver < 0 || intver > 65535) { Console.WriteLine("Invalid version {0}...", version); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_INVALID_VERSION"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8C); } else { Environment.Exit(0x0000000E); } return; } break; case "-VERSION": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No version set"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_VERSION"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8B); } else { Environment.Exit(0x0000000D); } return; } version = args[i + 1]; if (version.ToUpper() == "LATEST") { break; } if (!int.TryParse(version, out intver)) { Console.WriteLine("Invalid version {0}...", args[i + 1]); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_INVALID_VERSION"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8C); } else { Environment.Exit(0x0000000E); } return; } if (intver < 0 || intver > 65535) { Console.WriteLine("Invalid version {0}...", version); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_INVALID_VERSION"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8C); } else { Environment.Exit(0x0000000E); } return; } break; case "-O": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No output set"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_OUTPUT"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8D); } else { Environment.Exit(0x0000000F); } return; } output = args[i + 1]; break; case "-ID": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No ID specified"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_ID"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8E); } else { Environment.Exit(0x00000010); } return; } id = args[i + 1]; id = id.ToUpper(); break; case "-IOS": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No IOS specified"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_IOS"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E86); } else { Environment.Exit(0x00000008); } return; } id = "00000001000000" + Convert.ToInt32(args[i + 1]).ToString("X2"); break; case "-SINGLE": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No ID specified"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_ID"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8E); } else { Environment.Exit(0x00000010); } return; } content = args[i + 1]; break; case "-S": if (i + 1 >= args.Length) { Console.WriteLine("ERROR: No ID specified"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_ID"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8E); } else { Environment.Exit(0x00000010); } return; } content = args[i + 1]; break; } } //Error checking & stuff if (id == "") { Console.WriteLine("ERROR: No ID specified"); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_NO_ID"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E8E); } else { Environment.Exit(0x00000010); } return; } if (version == "") { if (BeQuiet.quiet > 2) { Console.WriteLine("No version specified, using latest", version); } version = "LATEST"; } try { if (version.ToUpper() == "LATEST") { //Grab the TMD and get the latest version NusClient grabtmd = new NusClient(); TMD tmd = grabtmd.DownloadTMD(id, ""); version = tmd.TitleVersion.ToString(); } } catch (Exception ex) { if (ex.Message == "Title ID must be 16 characters long!") { Console.WriteLine(""); Console.WriteLine("The ID needs to be 16 Characters."); Console.WriteLine(""); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_BAD_ID"); Console.WriteLine(""); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E9C); } else { Environment.Exit(0x0000001E); } return; } if (ex.Message == "The remote server returned an error: (404) Not Found.") { Console.WriteLine(""); Console.WriteLine("The remote server returned a 404 error. Check your Title ID."); Console.WriteLine(""); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_REMOTE_404"); Console.WriteLine(""); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E9E); } else { Environment.Exit(0x00000020); } return; } if (ExceptionListRan == 0) { Console.WriteLine("An unknown error occured, please try again"); Console.WriteLine(""); Console.WriteLine("ERROR DETAILS: {0}", ex.Message); Console.WriteLine("Error: SHARPII_NET_CORE_NUSD_UNKNOWN"); if (OperatingSystem.Windows()) { Environment.Exit(0x00003E82); } else { Environment.Exit(0x00000004); } return; } } if (BeQuiet.quiet > 2) { Console.WriteLine("Found latest version: v{0}", version); } if (entered == false) //Will only be false if no store type argument was given { store.Add(StoreType.All); if (BeQuiet.quiet > 2) { Console.WriteLine("No store type specified, using all"); } } if (id.Length == 16 && Convert.ToInt32(id.Substring(14, 2), 16) >= 3 && Convert.ToInt32(id.Substring(14, 2), 16) <= 255 && id.Substring(0, 14) == "00000001000000") { ios = "IOS" + Convert.ToInt32(id.Substring(14, 2), 16) + "-64-" + version + ".wad"; } if ((((output.Length >= 4 && output.Substring(output.Length - 4, 4).ToUpper() == ".WAD") || output == "") && Array.IndexOf(store.ToArray(), StoreType.WAD) != -1 && store.ToArray().Length == 1) || (output == "" && ios != "" && Array.IndexOf(store.ToArray(), StoreType.WAD) != -1 && store.ToArray().Length == 1)) { wad = true; if (Directory.Exists(temp) == true) { DeleteADir.DeleteDirectory(temp); } Directory.CreateDirectory(temp); } if (output == "") { NoOut = true; output = ios == "" ? id + "v" + version : ios[0..^ 4];
public override void SaveSong(PlatformData data, FormatData formatdata, ProgressIndicator progress) { string path = data.Session["maindirpath"] as string; string otitle; ushort oindex; progress.NewTask(10); using (DelayedStreamCache cache = new DelayedStreamCache()) { progress.SetNextWeight(6); string audioextension = ".mogg"; Stream audio = null; Stream preview = null; AudioFormat audioformat = null; IList <IFormat> formats = formatdata.Formats; if (formats.Contains(AudioFormatRB2Mogg.Instance)) { audio = AudioFormatRB2Mogg.Instance.GetAudioStream(formatdata); preview = AudioFormatRB2Mogg.Instance.GetPreviewStream(formatdata); audioformat = AudioFormatRB2Mogg.Instance.DecodeAudioFormat(formatdata); } else if (formats.Contains(AudioFormatRB2Bink.Instance)) { audio = AudioFormatRB2Bink.Instance.GetAudioStream(formatdata); preview = AudioFormatRB2Bink.Instance.GetPreviewStream(formatdata, progress); if (!formatdata.HasStream(preview)) { cache.AddStream(preview); } audioformat = AudioFormatRB2Bink.Instance.DecodeAudioFormat(formatdata); audioextension = ".bik"; } else { throw new NotSupportedException(); } progress.Progress(6); ChartFormat chartformat = (formatdata.GetFormat(FormatType.Chart) as IChartFormat).DecodeChart(formatdata, progress); Stream album = null; Stream chart = formatdata.GetStream(ChartFormatRB.Instance, ChartFormatRB.ChartFile); Stream pan = formatdata.GetStream(ChartFormatRB.Instance, ChartFormatRB.PanFile); Stream weights = formatdata.GetStream(ChartFormatRB.Instance, ChartFormatRB.WeightsFile); Stream milo = formatdata.GetStream(ChartFormatRB.Instance, ChartFormatRB.MiloFile); progress.SetNextWeight(2); if (chart != null && ChartFormatRB.Instance.NeedsFixing(formatdata)) { formatdata.CloseStream(chart); chart = null; } if (chart == null) { chart = new TemporaryStream(); cache.AddStream(chart); AdjustChart(formatdata.Song, audioformat, chartformat).ToMidi().ToMid().Save(chart); chart.Position = 0; } if (weights == null) { weights = new TemporaryStream(); cache.AddStream(weights); CreateWeights(weights, chartformat); weights.Position = 0; } if (pan == null) { pan = new TemporaryStream(); cache.AddStream(pan); CreatePan(pan, chartformat); pan.Position = 0; } if (milo == null) { milo = formatdata.GetStream(ChartFormatRB.Instance, ChartFormatRB.Milo3File); if (milo == null) { milo = new MemoryStream(Properties.Resources.rawksd_milo); } else { Stream milostream = new TemporaryStream(); cache.AddStream(milostream); Milo milofile = new Milo(new EndianReader(milo, Endianness.LittleEndian)); FaceFX fx = new FaceFX(new EndianReader(milofile.Data[0], Endianness.BigEndian)); TemporaryStream fxstream = new TemporaryStream(); fx.Save(new EndianReader(fxstream, Endianness.LittleEndian)); milofile.Data[0] = fxstream; milofile.Compressed = true; milofile.Save(new EndianReader(milostream, Endianness.LittleEndian)); fxstream.Close(); formatdata.CloseStream(milo); milo = milostream; milo.Position = 0; } } //if (album == null) // album = new MemoryStream(Properties.Resources.rawksd_albumart); progress.Progress(2); SongData song = new SongData(formatdata.Song); SongsDTA dta = GetSongsDTA(song, audioformat); if (album == null) { dta.AlbumArt = false; } else { dta.AlbumArt = true; } dta.Song.MidiFile = "dlc/content/songs/" + song.ID + "/" + song.ID + ".mid"; DTB.NodeTree dtb = dta.ToDTB(PlatformRawkFile.Instance.IsRawkSD2(song)); MemoryStream songsdta = new MemoryStream(); cache.AddStream(songsdta); dtb.SaveDTA(songsdta); songsdta.Position = 0; U8 appdta = new U8(); DirectoryNode dir = new DirectoryNode("content"); appdta.Root.AddChild(dir); DirectoryNode songsdir = new DirectoryNode("songs"); dir.AddChild(songsdir); DirectoryNode songdir = new DirectoryNode(song.ID); songsdir.AddChild(songdir); songdir.AddChild(new FileNode(song.ID + "_prev.mogg", preview)); songdir.AddChild(new FileNode("songs.dta", songsdta)); DirectoryNode gendir; if (dta.AlbumArt.Value && album != null) { gendir = new DirectoryNode("gen"); songdir.AddChild(gendir); gendir.AddChild(new FileNode(song.ID + "_nomip_keep.bmp_wii", album)); } U8 appsong = new U8(); dir = new DirectoryNode("content"); appsong.Root.AddChild(dir); songsdir = new DirectoryNode("songs"); dir.AddChild(songsdir); songdir = new DirectoryNode(song.ID); songsdir.AddChild(songdir); songdir.AddChild(new FileNode(song.ID + audioextension, audio)); songdir.AddChild(new FileNode(song.ID + ".mid", chart)); songdir.AddChild(new FileNode(song.ID + ".pan", pan)); gendir = new DirectoryNode("gen"); songdir.AddChild(gendir); gendir.AddChild(new FileNode(song.ID + ".milo_wii", milo)); gendir.AddChild(new FileNode(song.ID + "_weights.bin", weights)); Stream memoryDta = new TemporaryStream(); cache.AddStream(memoryDta); appdta.Save(memoryDta); Stream memorySong = new TemporaryStream(); cache.AddStream(memorySong); appsong.Save(memorySong); formatdata.CloseStream(audio); formatdata.CloseStream(preview); formatdata.CloseStream(chart); formatdata.CloseStream(album); formatdata.CloseStream(pan); formatdata.CloseStream(weights); formatdata.CloseStream(milo); FindUnusedContent(data, formatdata.Song, out otitle, out oindex); TMD tmd = GenerateDummyTMD(otitle); dta.Song.Name = "dlc/" + otitle + "/" + Util.Pad(oindex.ToString(), 3) + "/content/songs/" + song.ID + "/" + song.ID; dtb = dta.ToDTB(PlatformRawkFile.Instance.IsRawkSD2(song)); HarmonixMetadata.SetSongsDTA(song, dtb); string dirpath = Path.Combine(Path.Combine(path, "rawk"), "rb2"); if (!Directory.Exists(Path.Combine(dirpath, "customs"))) { Directory.CreateDirectory(Path.Combine(dirpath, "customs")); } Directory.CreateDirectory(Path.Combine(Path.Combine(dirpath, "customs"), song.ID)); FileStream savestream = new FileStream(Path.Combine(Path.Combine(Path.Combine(dirpath, "customs"), song.ID), "data"), FileMode.Create); dtb.Save(new EndianReader(savestream, Endianness.LittleEndian)); savestream.Close(); TmdContent contentDta = new TmdContent(); contentDta.ContentID = oindex; contentDta.Index = oindex; contentDta.Type = 0x4001; TmdContent contentSong = new TmdContent(); contentSong.ContentID = oindex + 1U; contentSong.Index = (ushort)(oindex + 1); contentSong.Type = 0x4001; memoryDta.Position = 0; contentDta.Hash = Util.SHA1Hash(memoryDta); contentDta.Size = memoryDta.Length; memorySong.Position = 0; contentSong.Hash = Util.SHA1Hash(memorySong); contentSong.Size = memorySong.Length; for (int i = 1; i <= oindex + 1; i++) { if (i == oindex) { tmd.Contents.Add(contentDta); } else if (i == oindex + 1) { tmd.Contents.Add(contentSong); } else { tmd.Contents.Add(new TmdContent() { Index = (ushort)i, ContentID = (uint)i, Size = 1, Type = 0x4001 }); } } tmd.Fakesign(); uint consoleid = GetConsoleID(path); progress.Progress(); dirpath = Path.Combine(Path.Combine(Path.Combine(Path.Combine(path, "private"), "wii"), "data"), "sZAE"); TemporaryStream binstream; DlcBin bin; if (consoleid != 0 && !File.Exists(Path.Combine(dirpath, "000.bin"))) { Directory.CreateDirectory(dirpath); binstream = new TemporaryStream(); binstream.Write(Properties.Resources.rawksd_000bin, 0, Properties.Resources.rawksd_000bin.Length); binstream.Position = 8; new EndianReader(binstream, Endianness.BigEndian).Write(consoleid); binstream.ClosePersist(); File.Move(binstream.Name, Path.Combine(dirpath, "000.bin")); binstream.Close(); } dirpath = Path.Combine(Path.Combine(Path.Combine(Path.Combine(path, "private"), "wii"), "data"), otitle); if (!Directory.Exists(dirpath)) { Directory.CreateDirectory(dirpath); } binstream = new TemporaryStream(); bin = new DlcBin(); bin.Bk.ConsoleID = consoleid; bin.TMD = tmd; bin.Content = tmd.Contents[oindex]; bin.Data = memoryDta; bin.Generate(); bin.Bk.ContentSize = bin.Bk.TotalSize = 0; bin.Bk.TitleID = 0x00010000535A4145UL; bin.Save(binstream); binstream.ClosePersist(); string dtabinpath = Path.Combine(dirpath, Util.Pad(oindex.ToString(), 3) + ".bin"); Util.Delete(dtabinpath); File.Move(binstream.Name, dtabinpath); binstream.Close(); binstream = new TemporaryStream(); bin = new DlcBin(); bin.Bk.ConsoleID = consoleid; bin.TMD = tmd; bin.Content = tmd.Contents[oindex + 1]; bin.Data = memorySong; bin.Generate(); bin.Bk.ContentSize = bin.Bk.TotalSize = 0; bin.Bk.TitleID = 0x00010000535A4145UL; bin.Save(binstream); binstream.ClosePersist(); string songbinpath = Path.Combine(dirpath, Util.Pad((oindex + 1).ToString(), 3) + ".bin"); Util.Delete(songbinpath); File.Move(binstream.Name, songbinpath); binstream.Close(); data.Mutex.WaitOne(); string mainbinpath = Path.Combine(dirpath, "000.bin"); if (!File.Exists(mainbinpath)) { binstream = new TemporaryStream(); bin = new DlcBin(); bin.Bk.ConsoleID = consoleid; bin.TMD = tmd; bin.Content = tmd.Contents[0]; bin.Data = new MemoryStream(Properties.Resources.rawksd_savebanner, false); bin.Generate(); bin.Bk.TitleID = 0x00010000535A4145UL; bin.Save(binstream); binstream.ClosePersist(); File.Move(binstream.Name, mainbinpath); binstream.Close(); } AddSongFromBins(data, song, dtabinpath, songbinpath, progress, true); SaveDTBCache(data); data.Mutex.ReleaseMutex(); cache.Dispose(); progress.Progress(); } progress.EndTask(); }
private Nullable <DownloadItem> getDownloadItem(TitleInfo item, DownloadType type) { TitleInfo info; lock (item) { info = item; } switch (type) { case DownloadType.Game: if (!info.isUpdate) { try { bool madeTicket = false; TMD titleTMD = AsyncHelpers.RunSync <TMD>(() => NUS.DownloadTMD(info.titleID)); if (info.ticket.Length == 0 && info.hasTicket) { info.ticket = AsyncHelpers.RunSync <byte[]>(() => HelperFunctions.DownloadTitleKeyWebsiteTicket(info.titleID)); } if (!info.hasTicket && info.titleKey.Length > 0) { madeTicket = true; info.ticket = info.getGeneratedTitleTicket(titleTMD.TitleVersion); } return(new DownloadItem( info.displayName + (madeTicket ? " (FakeSign)" : ""), titleTMD, AsyncHelpers.RunSync <NUS.UrlFilenamePair[]>(() => NUS.GetTitleContentURLs(titleTMD, true)), info.ticket, null, null, madeTicket )); } catch { } } break; case DownloadType.DLC: try { if (info.dlcKey.Length > 0) { TMD dlcTMD = AsyncHelpers.RunSync <TMD>(() => NUS.DownloadTMD(info.dlcID)); return(new DownloadItem( info.DisplayNameWithVersion(dlcTMD.TitleVersion, "DLC") + " (FakeSign)", dlcTMD, AsyncHelpers.RunSync <NUS.UrlFilenamePair[]>(() => NUS.GetTitleContentURLs(dlcTMD, true)), info.getDLCTicket(dlcTMD.TitleVersion), null, null, true )); } } catch { } break; case DownloadType.Update: try { TMD updateTMD = AsyncHelpers.RunSync <TMD>(() => NUS.DownloadTMD(info.updateID)); return(new DownloadItem( info.DisplayNameWithVersion(updateTMD.TitleVersion, "Update"), updateTMD, AsyncHelpers.RunSync <NUS.UrlFilenamePair[]>(() => NUS.GetTitleContentURLs(updateTMD, true)), AsyncHelpers.RunSync <byte[]>(() => NUS.DownloadTicket(info.updateID)) )); } catch { } break; } return(null); }
public TMDDocument CreateDocument(TMD tmd) { List <IRenderable> objectMeshes = LibLSDUtil.CreateMeshesFromTMD(tmd, _shader, _vramController.VRAMTexture); return(new TMDDocument(tmd, objectMeshes)); }
private async Task SaveAccessToken(TMD.Models.DomainModels.AspNetUser user, ClaimsIdentity identity) { var userclaims = await UserManager.GetClaimsAsync(user.Id); foreach (var at in ( from claims in identity.Claims where claims.Type.EndsWith("access_token") select new Claim(claims.Type, claims.Value, claims.ValueType, claims.Issuer))) { if (!userclaims.Contains(at)) { await UserManager.AddClaimAsync(user.Id, at); } } }
// create a single LBD tile GameObject (not including extra tiles) private static GameObject createSingleLBDTile(LBDTile tile, int x, int y, TMD tilesTmd, List <CombineInstance> meshesCreated) { // create the GameObject and add/setup necessary components GameObject lbdTile = new GameObject($"Tile {tile.TileType}"); MeshFilter mf = lbdTile.AddComponent <MeshFilter>(); MeshRenderer mr = lbdTile.AddComponent <MeshRenderer>(); lbdTile.AddComponent <CullMeshOnDistance>(); lbdTile.AddComponent <MeshFog>(); TMDObject tileObj = tilesTmd.ObjectTable[tile.TileType]; Mesh tileMesh = MeshFromTMDObject(tileObj); mf.mesh = tileMesh; // the renderer needs to use virtual PSX Vram as its materials mr.sharedMaterials = new[] { PsxVram.VramMaterial, PsxVram.VramAlphaBlendMaterial }; // rotate the tile based on its direction switch (tile.TileDirection) { case LBDTile.TileDirections.Deg90: { lbdTile.transform.Rotate(Vector3.up, 90); break; } case LBDTile.TileDirections.Deg180: { lbdTile.transform.Rotate(Vector3.up, 180); break; } case LBDTile.TileDirections.Deg270: { lbdTile.transform.Rotate(Vector3.up, 270); break; } } // set the tile's height lbdTile.transform.position = new Vector3(x, -tile.TileHeight, y); // make a CombineInstance for combining all tiles into one mesh later on var localToWorldMatrix = lbdTile.transform.localToWorldMatrix; CombineInstance combine = new CombineInstance() { mesh = tileMesh, transform = localToWorldMatrix, subMeshIndex = 0 }; meshesCreated.Add(combine); // if tile has transparent part, do the same for the transparent mesh if (tileMesh.subMeshCount > 1) { CombineInstance combineTrans = new CombineInstance() { mesh = tileMesh, transform = localToWorldMatrix, subMeshIndex = 1 }; meshesCreated.Add(combineTrans); } return(lbdTile); }