Пример #1
0
        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
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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));
        }
Пример #4
0
        // 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);
        }
Пример #5
0
        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));
        }
Пример #6
0
        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);
        }
Пример #7
0
 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;
 }
Пример #8
0
        public Mesh MeshFromTMD(TMD tmd)
        {
            Mesh mesh = new Mesh();

            foreach (var obj in tmd.ObjectTable)
            {
                Mesh objMesh = CreateTMDObjectMesh(obj);
            }

            return(null);
        }
Пример #9
0
        /// <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);
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
        }
Пример #12
0
        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);
        }
Пример #14
0
        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));
        }
Пример #15
0
        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);
        }
Пример #16
0
        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);
        }
Пример #17
0
        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);
            });
        }
Пример #18
0
        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());
        }
Пример #19
0
            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;
            }
Пример #20
0
        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.");
        }
Пример #21
0
            /// <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;
            }
Пример #22
0
        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;
        }
Пример #23
0
 /// <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;
 }
Пример #24
0
        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.");
        }
Пример #25
0
        // 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);
        }
Пример #26
0
        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];
Пример #27
0
        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();
        }
Пример #28
0
        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);
        }
Пример #29
0
        public TMDDocument CreateDocument(TMD tmd)
        {
            List <IRenderable> objectMeshes = LibLSDUtil.CreateMeshesFromTMD(tmd, _shader, _vramController.VRAMTexture);

            return(new TMDDocument(tmd, objectMeshes));
        }
Пример #30
0
        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);
                }
            }
        }
Пример #31
0
        // 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);
        }