1. ganons

    ganons GBAtemp Addict
    Member

    Joined:
    Jun 12, 2005
    Messages:
    2,931
    Country:
    doesnt look like they dumped street fighter 30th anniversary in nsp
     
  2. subcon959

    subcon959 teh retro
    Member

    Joined:
    Dec 24, 2008
    Messages:
    3,422
    Country:
    I doubt they will release nsp versions of anything already released as xci.
     
  3. tubebar

    tubebar GBAtemp Regular
    Member

    Joined:
    May 17, 2009
    Messages:
    227
    Country:
    United States
    The extra added xml files are generated from the NCAs during the NSP packing, hence you can repack ANY NSP and generate these files. The files are required for developers and for submission to Nintendo for review. Since we are not developing the game (it's already finished) and we are not submitting it to Nintendo for review (it's on the EShop) these are totally useless.

    Unlike what you may think NSP's are NOT what eShop uses. eShop does NOT use a container file, they are raw separate files just like all Nintendo systems use. This was the case with Wii, 3DS and Wii U they are all raw files downloaded from eShop (not WADS, CIAS or NSPS). The containers were used for developers and submissions NOT for piracy and these extra files are useless and should be abandoned as the "proper way" to do retail pirated games.
     
  4. blahblah
    This message by blahblah has been removed from public view by x65943, Sep 4, 2018, Reason: Off topic.
    Sep 4, 2018
  5. Deathscreton
    This message by Deathscreton has been removed from public view by x65943, Sep 4, 2018, Reason: Off topic.
    Sep 4, 2018
  6. blahblah
    This message by blahblah has been removed from public view by x65943, Sep 4, 2018, Reason: Off topic.
    Sep 4, 2018
  7. Deathscreton
    This message by Deathscreton has been removed from public view by x65943, Sep 4, 2018, Reason: off topic.
    Sep 4, 2018
  8. comput3rus3r
    This message by comput3rus3r has been removed from public view by x65943, Sep 4, 2018, Reason: Off topic.
    Sep 4, 2018
  9. jakkal
    This message by jakkal has been removed from public view by x65943, Sep 4, 2018, Reason: Off topic.
    Sep 4, 2018
  10. comput3rus3r
    This message by comput3rus3r has been removed from public view by x65943, Sep 4, 2018, Reason: off topic.
    Sep 4, 2018
  11. jakkal
    This message by jakkal has been removed from public view by x65943, Sep 4, 2018, Reason: Off topic.
    Sep 4, 2018
  12. comput3rus3r
    This message by comput3rus3r has been removed from public view by x65943, Sep 4, 2018, Reason: Off topic.
    Sep 4, 2018
  13. Deathscreton
    This message by Deathscreton has been removed from public view by x65943, Sep 4, 2018, Reason: off topic.
    Sep 4, 2018
  14. Quicksilver88

    Quicksilver88 GBAtemp Advanced Fan
    Member

    Joined:
    Jan 26, 2013
    Messages:
    616
    Country:
    United States
    Dude 6.x is already patched by SX and free CFW and there is a method to update your firmware (offline) and not burn you fuses (so you can downgrade). So if you have an exploitable model Switch there isn't crap N is going to be able to do about it going forward. Viva La CFW!

    — Posts automatically merged - Please don't double post! —

    Yeah but even if thats true what difference does it make? If you run any user installed .nsp it doesn't have a properly signed ticket and they know you are pirating. They don't need to track and care about random little files missing from install package. Plus apparently even if you run an .nro Nintendo knows that and can ban you. I have played a lot of .nsp installed games from CDN, scene, and .xci convert and no crashes or issues. I mean sure if I am collecting for 'posterity' then I would care but my hard drives are being burned on my funeral pyre so no concerns there.

    Hopefully some form of EmuNand is coming soon and then all of us that saved our 'virgin' nand and stayed offline should have dual OFW/CFW capabilities and that's about as good as its gonna get. I don't think getting CFW playing online (like X360 dvd hack got to) is gonna be possible, unless maybe its by mounted .xci with proper certificate data.
     
    Albytrozz likes this.
  15. comput3rus3r

    comput3rus3r GBAtemp Psycho!
    Member

    Joined:
    Aug 20, 2016
    Messages:
    3,567
    Country:
    United States
    856 Mercenary Kings Limited Run Games, Inc. [​IMG] en BigBlueBox 2 LA-H-AEUWA 0100F900046C4000 391F4040 bbb-h-aeuwa Mercenary.Kings.USA.NSW-BigBlueBox 637452800 3.0.1 NSW Game 1

    523 Mercenary Kings Tribute Games Inc. [​IMG] en BigBlueBox 1 LA-N-AEUWA 0100F900046C4000 C1CCCDFB bbb-n-aeuwa Mercenary.Kings.eShop.NSW-BigBlueBox 251521886 3.0.1 eShop 1

    what's the difference between north america and usa?
     
  16. rrocha

    rrocha Developer
    Developer

    Joined:
    Nov 21, 2016
    Messages:
    129
    Country:
    Portugal
    I'm yet to put my hands on the switch scene rules nfo (if someone has it, please PM me) but I believe that XCI trumps NSP by scene standards. That being said, whenever a game is released in NSP/eShop format, a subsequent release in XCI is allowed. If it's the opposite, the NSP will be considered a dupe and will get nuked (unless it's an INTERNAL or PROPER release). Take a look at the WiiU scene rules for referrence:

    1.3) WUD and File Format releases are acceptable.
    1.3.1) WUD trumps SCRUBBED releases.
    1.3.2) File Format rips must be tagged as SCRUBBED
    1.3.3) WUD after SCRUBBED is allowed. SCRUBBED after WUD is not allowed. ​

    1.8) All previous File Format releases can be re-released as WUD.
    1.8.1) Only WUD re-releases need to be tagged as COMPLETE. Future releases are unaffected.
    1.8.2) All WUD re-releases can have region dupes. ​
     
  17. JupiterJesus

    JupiterJesus Member
    Newcomer

    Joined:
    Jul 14, 2018
    Messages:
    43
    Country:
    United States
    This is basically what I said earlier in the thread, but with fewer words, before I forgot about this thread.

    I've been working lately on adding NSP extraction tools to my CDN program and finally got around to downloading a BBB release to see what the contents were for myself, and my suspicions (and your statements) were confirmed. The additional files are:

    LEGAL-NCA-ID.legalinfo.xml
    PROGRAM-NCA-ID.programinfo.xml
    CONTROL-NCA-ID.nacp.xml
    META-NCA-ID.cnmt.xml (this one does come in CDNSP repacks)

    Also, the jpegs are in the format CONTROL-NCA-ID.nx.LANGUAGE.jpg

    Every title comes with a Program type NCA, a Control type NCA and a LegalInformation type NCA.

    The control NCA contains several icons, all in the form "icon_LANGUAGE.bin". They are actually jpegs, and you can rename .bin to .jpg. The control NCA also contains a file called control.nacp. This file contains localization stuff, like languages supported, the name of the title, developer, producer and lots of other metadata-type stuff. The XXX.nacp.xml file is generated by parsing this control.nacp file and spitting out the same information in XML format.

    The legal information NCA contains a bunch of html files with documentation - IP information, legal notices, licensing, support, stuff like that. There's also a legalinfo.xml file. This legalinfo.xml file is COPIED DIRECTLY into the XXX.legalinfo.xml file, so it isn't even generated by parsing other data. It is copied over just like the jpegs are, but renamed.

    The program one is the big one and contains the executable and most/all of the data. It is basically "the game". I don't know yet where the data in it comes from (there's no XML file to copy over, and there's no single obvious file that I've found like control.nacp). It contains highly technical information specific to the executable. Things like SDK version, build type (debug, release), middleware libraries (unity, unreal). It also seems to contain "UnresolvedApi" entries. I'm not sure what they're for - perhaps methods called by the executable that need to be resolved into library/middleware API calls during compilation? I don't know why that would be in an XML file though.

    The Meta/cnmt file is included, and it is just data parsed from the Application_TITLEID.cnmt file inside of the Meta type NCA. It contains metadata (duh) like Title ID, Key Revision, Patch ID (the ID used to download patches from the CDN, which is pretty much always just TITLEID ORed with 0x800) and other system-level metadata. More importantly, it contains a list of all the OTHER NCAs in the program. So the CNMT must be downloaded first, then you use the NCA list to download the individual NCAs from the CDN by their IDs. It is just as redundant to include in the NSP as any of the other info, but it is cool to be able to see it in plain text. The actual game files are all binary files and impossible to read without a hex editor and a lot of patience.

    A lot of the info needed to parse and include those files isn't widely available. I get my info from switchbrew, and the documentation there for Control.NACP is full of "Unknowns". In contrast, the BBB release has an nacp.xml file FULL of information that isn't even mentioned in the switchbrew documentation, never mind the programinfo.xml (I have no idea yet where that comes from).

    I'm going to go at that control.nacp with a hex editor and the xml file, trying to find what goes where, so I can properly parse the control.nacp file myself and generate the XML. I may even be able to read some metadata from it without having to try and access the eshop for title information. For example, the developer is in the NACP file, something I'd otherwise have to enter manually or read from the eshop.

    It isn't necessary to have those files, but I plan to fully implement them just for completeness sake, and then repack all of my personal NSPs with the new files. Just because. Programmers have weird motivations.
     
    Brawl345, tiliarou and rrocha like this.
  18. tubebar

    tubebar GBAtemp Regular
    Member

    Joined:
    May 17, 2009
    Messages:
    227
    Country:
    United States
    I can only take credit for the words, the actual technical details on what I said came from discussing with CaithSith2 when he was asked to add it in SD to NSP. Since users do not download these files from the eshop onto their Switch they are not required for end users.

    Now - if we get "technical" for completeness (GoodSets, NoIntro, MAME, TOSEC etc.) I suppose they belong within an NSP container as it's part of the NSP specs (we can safely assume this much) Without documentation its hard to confirm. We need to get in contact w/ someone who has a Switch Dev kit and official specs and would "leak" that info (bet BBB has that but aren't sharing).

    But if you want to put the extra work into it, I'd use it and repack for completeness. Unlike trimmed XCI's which are damaged data and certainly incomplete, these are simply optional. I have no strong opinion of saying don't do it - I just think they are not required and need not be any standard.
     
  19. hippy dave

    hippy dave BBMB
    Member

    Joined:
    Apr 30, 2012
    Messages:
    6,531
    Country:
    United Kingdom
    I believe the NA is actually "not applicable", used to mean region-free or multi-region, as opposed to north america. So the eshop release is the same for multiple/all regions, whereas the Limited Run cart release is a USA release (but still works on Switches from every region as the console itself is region-free).
     
    tiliarou and comput3rus3r like this.
  20. JupiterJesus

    JupiterJesus Member
    Newcomer

    Joined:
    Jul 14, 2018
    Messages:
    43
    Country:
    United States
    Okay, so today I spent some time comparing control.nacp with *.nacp.xml (I used the game Flat Heroes... no particular reason). I finished writing my control file parser class. I figured I'd share, since I haven't been able to find any complete parsing code out there. It may exist and I'm bad at searching, and I'm sure there's private code out there, not to mention the Nintendo SDK.

    Also, there may be errors. Some parts were obvious, while others I had to make educated guesses. I mean, if you know there are 96 bytes and 8 fields, you kinda have to guestimate the sizes of the fields sometimes. I also don't know all of the possible values for every field that has multiple possible values, so there are some places with made up enum values. If there's a source for the real values, I'd love to see it.

    The final few fields in particular are a crapshoot. The end of the file is reserved and mostly 0s, but some chunk of it at the beginning is actually used - but all the values happened to be 0. 9 of the fields were 64-bit numbers, while 4 were enums and one was an arbitrary number (no idea the size). I went with 32-bit numbers for all 5, because that made the total size 0x60 bytes (and made the useable data end on a nice even 0x31A0 bytes), but those enums could be only a byte each for all I know...

    Anyway, here's the C# class. I'm not including any of the support classes it needs - I'm sure anyone who cares about this would have no trouble adapting the code as-is. There isn't much commenting, but I did add comments on each data read with the address of the data, the length and what is supposed to be there. If anyone wants to update http://switchbrew.org/index.php?title=Control.nacp with that info, feel free. I probably won't.

    The class is also tagged with XML attributes, so it automatically serializes correctly to the format expected by *.nacp.xml. Most of the XML attributes are redundant (element name is the same as the property name, which is the default) but I like to be thorough.

    Code:
        [XmlRoot("Application", Namespace = null, IsNullable = false)]
        public class ControlData
        {
            private static readonly ILog logger = LogManager.GetLogger(typeof(ControlData));
    
            [XmlElement(ElementName = "Title")]
            public ControlTitle[] Titles { get; set; }
    
            [XmlElement(ElementName = "SupportedLanguage")]
            public string[] SupportedLanguages
            {
                get
                {
                    List<string> r = new List<string>();
                    for (uint i = 0, mask = 1; i < Titles.Length; i++, mask <<= 1)
                    {
                        if ((SupportedLanguagesFlag & mask) != 0)
                            r.Add(((SwitchLanguage)i).ToString());
                    }
    
                    return r.ToArray();
                }
                set
                {
                    int flag = 0;
                    for (uint i = 0; i < value.Length; i++)
                    {
                        string l = value[i];
                        if (!string.IsNullOrWhiteSpace(l))
                        {
                            if (Enum.TryParse(l, out SwitchLanguage lang))
                            {
                                flag |= (1 << (int)lang);
                            }
                        }
                    }
    
                    SupportedLanguagesFlag = flag;
                }
            }
    
            [XmlIgnore]
            public int SupportedLanguagesFlag { get; private set; }
           
            [XmlElement(ElementName = "ParentalControl")]
            public ParentalControlOption ParentalControl { get; set; }
    
            [XmlElement(ElementName = "Isbn")]
            public string Isbn { get; set; }
    
            [XmlElement(ElementName = "StartupUserAccount")]
            public StartupUserAccountOption StartupUserAccount { get; set; }
    
            [XmlElement(ElementName = "Screenshot")]
            public ScreenshotOption Screenshot { get; set; }
    
            [XmlElement(ElementName = "VideoCapture")]
            public VideoCaptureOption VideoCapture { get; set; }
    
            [XmlElement(ElementName = "TouchScreenUsagae")]
            public TouchScreenUsageOption TouchScreenUsage { get; set; }
    
            [XmlElement(ElementName = "PlayLogPolicy")]
            public PlayLogPolicyOption PlayLogPolicy { get; set; }
    
            [XmlElement(ElementName = "DataLossConfirmation")]
            public DataLossConfirmationOption DataLossConfirmation { get; set; }
    
            [XmlElement(ElementName = "Attribute")]
            public AttributeOption Attribute { get; set; }
    
            [XmlElement(ElementName = "PresenceGroupId")]
            public string PresenceGroupId { get; set; }
    
            [XmlElement(ElementName = "DisplayVersion")]
            public string DisplayVersion { get; set; }
    
            [XmlElement(ElementName = "AddOnContentBaseId")]
            public string AddOnContentBaseId { get; set; }
    
            [XmlElement(ElementName = "SaveDataOwnerId")]
            public string SaveDataOwnerId { get; set; }
    
            [XmlElement(ElementName = "UserAccountSaveDataSize")]
            public string UserAccountSaveDataSize { get; set; }
    
            [XmlElement(ElementName = "UserAccountSaveDataJournalSize")]
            public string UserAccountSaveDataJournalSize { get; set; }
    
            [XmlElement(ElementName = "DeviceSaveDataSize")]
            public string DeviceSaveDataSize { get; set; }
    
            [XmlElement(ElementName = "Rating")]
            public ControlRating[] Ratings { get; set; }
    
            [XmlElement(ElementName = "LocalCommunicationId")]
            public string[] LocalCommunicationIds { get; set; }
    
            [XmlElement(ElementName = "SeedForPseudoDeviceId")]
            public string SeedForPseudoDeviceId { get; set; }
    
            [XmlElement(ElementName = "BcatPassphrase")]
            public string BcatPassphrase { get; set; }
    
            [XmlElement(ElementName = "DeviceSaveDataJournalSize")]
            public string DeviceSaveDataJournalSize { get; set; }
    
            [XmlElement(ElementName = "BcatDeliveryCacheStorageSize")]
            public string BcatDeliveryCacheStorageSize { get; set; }
    
            [XmlElement(ElementName = "ApplicationErrorCodeCategory")]
            public string ApplicationErrorCodeCategory { get; set; }
    
            [XmlElement(ElementName = "LogoType")]
            public LogoTypeOption LogoType { get; set; }
    
            [XmlElement(ElementName = "LogoHandling")]
            public LogoHandlingOption LogoHandling { get; set; }
    
            [XmlElement(ElementName = "Icon")]
            public List<ControlIcon> Icons { get; set; }
    
            [XmlElement(ElementName = "CrashReport")]
            public CrashReportOption CrashReport { get; set; }
    
            [XmlElement(ElementName = "RuntimeAddOnContentInstall")]
            public RuntimeAddOnContentInstallOption RuntimeAddOnContentInstall { get; set; }
    
            [XmlElement(ElementName = "PlayLogQueryCapability")]
            public PlayLogQueryCapabilityOption PlayLogQueryCapability { get; set; }
    
            [XmlElement(ElementName = "ProgramIndex")]
            public uint ProgramIndex { get; set; }
    
            [XmlElement(ElementName = "AddOnContentRegistrationType")]
            public AddOnContentRegistrationTypeOption AddOnContentRegistrationType { get; set; }
    
            [XmlElement(ElementName = "UserAccountSaveDataSizeMax")]
            public string UserAccountSaveDataSizeMax { get; set; }
    
            [XmlElement(ElementName = "UserAccountSaveDataJournalSizeMax")]
            public string UserAccountSaveDataJournalSizeMax { get; set; }
    
            [XmlElement(ElementName = "DeviceSaveDataSizeMax")]
            public string DeviceSaveDataSizeMax { get; set; }
    
            [XmlElement(ElementName = "DeviceSaveDataJournalSizeMax")]
            public string DeviceSaveDataJournalSizeMax { get; set; }
    
            [XmlElement(ElementName = "TemporaryStorageSize")]
            public string TemporaryStorageSize { get; set; }
    
            [XmlElement(ElementName = "CacheStorageSize")]
            public string CacheStorageSize { get; set; }
    
            [XmlElement(ElementName = "CacheStorageJournalSize")]
            public string CacheStorageJournalSize { get; set; }
    
            [XmlElement(ElementName = "CacheStorageDataAndJournalSizeMax")]
            public string CacheStorageDataAndJournalSizeMax { get; set; }
    
            [XmlElement(ElementName = "CacheStorageIndexMax")]
            public string CacheStorageIndexMax { get; set; }
    
            [XmlElement(ElementName = "Hdcp")]
            public HdcpOption Hdcp { get; set; }
    
            [XmlIgnore]
            public byte[] Reserved { get; set; }
    
            public ControlData()
            {
            }
    
            public static ControlData Parse(string file)
            {
                using (var fs = File.OpenRead(file))
                {
                    using (BinaryReader br = new BinaryReader(fs))
                    {
                        ControlData data = new ControlData();
    
                        // Reading switch title control file (control.nacp)
                        // See http://switchbrew.org/index.php?title=Control.nacp
    
                        string parent = Path.GetDirectoryName(file);
                        data.Titles = new ControlTitle[0x10];
                        data.Icons = new List<ControlIcon>();
    
                        // 0x0 + 0x3000 (0x10 entries of 0x300 each) - language entries for developer (or publisher?) name and title name
                        for (int i = 0; i < data.Titles.Length; i++)
                        {
                            ControlTitle title = new ControlTitle();
                            title.Name = br.ReadUTF8NullTerminated(0x200);
                            title.Publisher = br.ReadUTF8NullTerminated(0x100);
                            title.Language = (SwitchLanguage)i;
    
                            if (!string.IsNullOrWhiteSpace(title.Name))
                                data.Titles[i] = title;
    
                            string icon = parent + Path.DirectorySeparatorChar + "icon_" + title.Language + ".bin";
                            if (File.Exists(icon))
                            {
                                string hash = Crypto.ComputeHash(File.OpenRead(icon)).ToHex();
                                data.Icons.Add(new ControlIcon { Language = title.Language, NxIconHash = hash });
                            }
                        }
    
                        // 0x3000 + 0x25 ISBN
                        data.Isbn = br.ReadUTF8NullTerminated(0x25);
                        if (string.IsNullOrWhiteSpace(data.Isbn)) data.Isbn = null;
    
                        // 0x3025 + 0x3 TouchScreenUsage, StartupUserAccount, ???
                        byte sa = br.ReadByte(); data.StartupUserAccount = (StartupUserAccountOption)sa;
                        byte t = br.ReadByte(); data.TouchScreenUsage = (TouchScreenUsageOption)t;
                        br.ReadByte();
    
                        // 0x3028 + 0x4 Attribute? None, Demo
                        uint a = br.ReadUInt32(); data.Attribute = (AttributeOption)a;
    
                        // 0x302C + 0x4 Supported languages, one bit for each supported language
                        // AmericanEnglish is the LSB, value&1. There are only 15 languages, so the 17 MS bits are 0
                        // If all languages are supported, the value if 00 00 7F FF (FF 7F 00 00 when written to disk)
                        data.SupportedLanguagesFlag = br.ReadInt32();
    
                        // 0x3030 + 0x4 Parental Control options flag
                        data.ParentalControl = (ParentalControlOption)br.ReadInt32();
    
                        // 0x3034 + 0x4 VideoCapture, Screenshot, DataLossConfirmation, PlayLogPolicy
                        byte v = br.ReadByte(); data.VideoCapture = (VideoCaptureOption)v;
                        byte s = br.ReadByte(); data.Screenshot = (ScreenshotOption)s;
                        byte d = br.ReadByte(); data.DataLossConfirmation = (DataLossConfirmationOption)d;
                        byte p = br.ReadByte(); data.PlayLogPolicy = (PlayLogPolicyOption)p;
    
                        // 0x3038 + 0x8 presence group ID or savedataownerid
                        data.PresenceGroupId = "0x" + br.ReadHex64();
    
                        // 0x3040 + 0x20 RatingAge
                        byte[] rating = br.ReadBytes(0x20);
                        data.Ratings = new ControlRating[rating.Length];
                        for (int i = 0; i < rating.Length; i++)
                        {
                            byte r = rating[i];
                            if (r == 0xFF) // not a valid age thus not supported
                                data.Ratings[i] = null;
                            else
                                data.Ratings[i] = new ControlRating { Organisation = (RatingOrganisation)i, Age = r, };
                        }
    
                        // 0x3060 + 0x10 Application version string
                        data.DisplayVersion = br.ReadUTF8NullTerminated(0x10);
    
                        // 0x3070 + 0x8 Base titleID for DLC, set even when DLC is not used. Usually app_titleID+0x1000
                        data.AddOnContentBaseId = "0x" + br.ReadHex64();
    
                        // 0x3078 + 0x8 presence group ID or savedataownerid
                        data.SaveDataOwnerId = "0x" + br.ReadHex64();
    
                        // 0x3080 + 0x8 UserAccountSaveDataSize
                        data.UserAccountSaveDataSize = "0x" + br.ReadHex64();
    
                        // 0x3088 + 0x8 UserAccountSaveDataSize
                        data.UserAccountSaveDataJournalSize = "0x" + br.ReadHex64();
    
                        // 0x3090 + 0x8 DeviceSaveDataSize
                        data.DeviceSaveDataSize = "0x" + br.ReadHex64();
    
                        // 0x3098 + 0x8 DeviceSaveDataJournalSize
                        data.DeviceSaveDataJournalSize = "0x" + br.ReadHex64();
    
                        // 0x30A0 + 0x8 BcatDeliveryCacheStorageSize
                        data.BcatDeliveryCacheStorageSize = "0x" + br.ReadHex64();
    
                        // 0x30A8 + 0x8 ApplicationErrorCodeCategory
                        data.ApplicationErrorCodeCategory = br.ReadUTF8NullTerminated(0x8);
                        if (string.IsNullOrWhiteSpace(data.ApplicationErrorCodeCategory)) data.ApplicationErrorCodeCategory = null;
    
                        // 0x30b0 + (0x8) * 0x8 LocalCommunicationId (array of 8) - just the title ID 8 times?
                         data.LocalCommunicationIds = new string[0x8];
                        for (int i = 0; i < 0x8; i++)
                            data.LocalCommunicationIds[i] = "0x" + br.ReadHex64();
    
                        // 0x30F0 + 0x4 LogoType ??
    
                        data.LogoType = (LogoTypeOption)br.ReadByte();
    
                        // Things get really shaky past here, I don't really know what anything does or how big it is
    
                        // 0x30F1 + 0x1 LogoHandling ??
                        data.LogoHandling = (LogoHandlingOption)br.ReadByte();
    
                        br.ReadBytes(6); // I dunno, but the ID that comes next is at 30F8
    
                        // 0x30F8 + 0x8 SeedForPseudoDeviceId
                        data.SeedForPseudoDeviceId = "0x" + br.ReadHex64();
    
                        // 0x3100 + 0x40 BcatPassphrase (0 when unused)
                        data.BcatPassphrase = br.ReadUTF8NullTerminated(0x40);
                        if (string.IsNullOrWhiteSpace(data.BcatPassphrase)) data.BcatPassphrase = null;
    
                        // The following fields are not for sure. I just guessed at their sizes. The fact that
                        // they all added up to exactly 0x60 bytes made me feel confident about it
    
                        data.AddOnContentRegistrationType = (AddOnContentRegistrationTypeOption)br.ReadUInt32();
    
                        data.UserAccountSaveDataSizeMax = "0x" + br.ReadHex64();
    
                        data.UserAccountSaveDataJournalSizeMax = "0x" + br.ReadHex64();
    
                        data.DeviceSaveDataSizeMax = "0x" + br.ReadHex64();
    
                        data.DeviceSaveDataJournalSizeMax = "0x" + br.ReadHex64();
    
                        data.TemporaryStorageSize = "0x" + br.ReadHex64();
    
                        data.CacheStorageSize = "0x" + br.ReadHex64();
    
                        data.CacheStorageJournalSize = "0x" + br.ReadHex64();
    
                        data.CacheStorageDataAndJournalSizeMax = "0x" + br.ReadHex64();
    
                        data.CacheStorageIndexMax = "0x" + br.ReadHex64();
    
                        data.Hdcp = (HdcpOption)br.ReadUInt32();
    
                        data.CrashReport = (CrashReportOption)br.ReadUInt32();
    
                        data.RuntimeAddOnContentInstall = (RuntimeAddOnContentInstallOption)br.ReadUInt32();
    
                        data.PlayLogQueryCapability = (PlayLogQueryCapabilityOption)br.ReadUInt32();
    
                        data.ProgramIndex = br.ReadUInt32();
                       
                        // 0x31A0 + 0xE60 Normally all-zero?
                        data.Reserved = br.ReadBytes(0xE60);
    
                        return data;
                    }
                }
            }
    
            internal void GenerateXml(string controlXmlFile)
            {
                // Create a new file stream to write the serialized object to a file
                using (TextWriter writer = new StreamWriter(controlXmlFile))
                {
                    XmlSerializer xmls = new XmlSerializer(typeof(ControlData));
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add("", "");
                    xmls.Serialize(writer, this, ns);
                }
    
                logger.Info($"Generated XML file {Path.GetFileName(controlXmlFile)}!");
            }
        }
    
        [XmlRoot(ElementName = "Title")]
        public class ControlTitle
        {
            [XmlElement(ElementName = "Language")]
            public SwitchLanguage Language { get; set; }
    
            [XmlElement(ElementName = "Name")]
            public string Name { get; set; }
    
            [XmlElement(ElementName = "Publisher")]
            public string Publisher { get; set; }
        }
    
        [XmlRoot(ElementName = "Rating")]
        public class ControlRating
        {
            [XmlElement(ElementName = "Organisation")]
            public RatingOrganisation Organisation { get; set; }
    
            [XmlElement(ElementName = "Age")]
            public byte Age { get; set; }
        }
    
        [XmlRoot(ElementName = "Icon")]
        public class ControlIcon
        {
            [XmlElement(ElementName = "Language")]
            public SwitchLanguage Language { get; set; }
    
            [XmlElement(ElementName = "NxIconHash")]
            public string NxIconHash { get; set; }
        }
    
        public enum VideoCaptureOption { Deny, Allow }
        public enum ScreenshotOption { Allow, Deny }
        public enum StartupUserAccountOption { None, Required, RequiredWithNetworkServiceAccountAvailable }
        public enum TouchScreenUsageOption { None, Supported, Required }
        public enum AttributeOption { None, Demo }
        public enum PlayLogPolicyOption { All, LogOnly, PL_None }
        public enum DataLossConfirmationOption { None, Required }
        public enum ParentalControlOption { None, FreeCommunication }
        public enum LogoTypeOption { LicensedByNintendo, DistributedByNintendo, Nintendo }
        public enum LogoHandlingOption { Auto, Unknown_1, Unknown_2, Unknown_3, Unknown_4 } // I have no source for what this should be called
        public enum AddOnContentRegistrationTypeOption { OnDemand, Unknown_1, Unknown_2, Unknown_3, Unknown_4 }
        public enum HdcpOption { None, Unknown_1, Unknown_2, Unknown_3, Unknown_4 }
        public enum CrashReportOption { Deny, Allow, Unknown_2, Unknown_3, Unknown_4 }
        public enum RuntimeAddOnContentInstallOption { Deny, Allow, Unknown_2, Unknown_3, Unknown_4 }
        public enum PlayLogQueryCapabilityOption { None, Unknown_1, Unknown_2, Unknown_3, Unknown_4 }
    
     
    Last edited by JupiterJesus, Sep 9, 2018
    Brawl345 and peteruk like this.
  21. Bellebite2000

    Bellebite2000 GBAtemp Regular
    Member

    Joined:
    Jul 31, 2018
    Messages:
    180
    Country:
    Afghanistan
    Finally someone with a clue posting something not completely inaccurate.

    If you want to pirate game, nsp from eshop is more than enough. If you are into the "preservation dream" (and believe me, you are not), then sure, you can collect other useless garbage crap files. BigBlackBalls should also add a .txt file mentioning the main color of the retail package, while they are at it... To make it COMPLETE. LOL.
     
    tiliarou likes this.
  22. Mr. Wizard

    Mr. Wizard Ending the spread of bullshit one thread at a time
    Member

    Joined:
    Mar 20, 2015
    Messages:
    1,814
    Country:
    Canada
    Big Blue Waffle needs to put in a png of the retail or gtfo.
     
    RayPanimals likes this.
  23. tubebar

    tubebar GBAtemp Regular
    Member

    Joined:
    May 17, 2009
    Messages:
    227
    Country:
    United States
    LOL
     
  24. Lilith Valentine

    Lilith Valentine GBATemp's Official Cubi™ Genderfluid Gang!
    Member

    Joined:
    Sep 13, 2009
    Messages:
    23,568
    Country:
    Antarctica
    So why do you always lie to the general public? The only thing slightly true is the CDN changes, which were already known beforehand. Why do you always lie when time always exposes your lies?
     
    Last edited by Lilith Valentine, Sep 19, 2018
    blahblah and tiliarou like this.
Draft saved Draft deleted
Loading...

Hide similar threads Similar threads with keywords - BigBlueBox, Wrong,