Example #1
0
        private List <RadioButtonWithInfo> parseOtherListJSON(JArray array, out string blockName)
        {
            ROM rom = ROM.Instance;

            blockName = "Unknown";
            List <RadioButtonWithInfo> list   = new List <RadioButtonWithInfo>();
            uint segmentAddressForLoadingData = 0;

            byte[][] tempSegments        = new byte[0x20][];
            uint[]   tempSegmentStarts   = new uint[0x20];
            bool[]   tempSegmentsAreMIO0 = new bool[0x20];

            foreach (JObject obj in array.Children())
            {
                if (obj["Block Name"] != null)
                {
                    blockName = obj["Block Name"].ToString();
                    segmentAddressForLoadingData = 0; // Reset for every new block
                }
                else if (obj["UseSegmentAddressesFromLevelScriptStartingFrom"] != null)
                {
                    segmentAddressForLoadingData = uint.Parse(obj["UseSegmentAddressesFromLevelScriptStartingFrom"].ToString(), NumberStyles.HexNumber);
                    for (int i = 0; i < 0x20; i++)
                    {
                        tempSegments[i]        = new byte[0]; // reset segments
                        tempSegmentsAreMIO0[i] = false;
                        tempSegmentStarts[i]   = 0;
                    }
                    tempSegments[0x00]        = rom.Bytes;
                    tempSegments[0x15]        = rom.cloneSegment(0x15, (byte)level.CurrentAreaID);
                    tempSegmentStarts[0x15]   = Globals.seg15_location[0];
                    tempSegments[0x02]        = rom.cloneSegment(0x02, (byte)level.CurrentAreaID);
                    tempSegmentStarts[0x02]   = Globals.seg02_location[0];
                    tempSegmentsAreMIO0[0x02] = !rom.Seg02_isFakeMIO0;
                    //Console.WriteLine("SegOff:0x{0}", segmentAddressForLoadingData.ToString("X8"));
                    parseLevelScriptTemporarlyForSegments(tempSegments, tempSegmentStarts, tempSegmentsAreMIO0, (byte)(segmentAddressForLoadingData >> 24), segmentAddressForLoadingData & 0xFFFFFF);
                }
                else
                {
                    if (checkForValidEntry(obj))
                    {
                        int    width    = int.Parse(obj["Width"].ToString());
                        int    height   = int.Parse(obj["Height"].ToString());
                        byte   format   = TextureFormats.ConvertStringToFormat(obj["Format"].ToString());
                        uint   dataSize = (uint)((TextureFormats.getNumberOfBitsForFormat(format) * width * height) / 8);
                        byte[] data;
                        if (obj["FromSegmentAddress"] != null)
                        {
                            uint segOffset = uint.Parse(obj["FromSegmentAddress"].ToString(), NumberStyles.HexNumber);
                            if (segmentAddressForLoadingData == 0)
                            {
                                data = rom.getDataFromSegmentAddress_safe(segOffset, dataSize, (byte)level.CurrentAreaID);
                            }
                            else
                            {
                                byte segment     = (byte)(segOffset >> 24);
                                uint segment_off = segOffset & 0x00FFFFFF;
                                data = rom.getSubArray_safe(tempSegments[segment], segment_off, dataSize);
                            }
                        }
                        else
                        {
                            if (rom.Type == ROM_Type.VANILLA && obj["ForExtendedROM"] != null)
                            {
                                string forExtendedROM = obj["ForExtendedROM"].ToString().ToLower();
                                if (forExtendedROM.Equals("true"))
                                {
                                    continue;
                                }
                            }
                            uint romOff = uint.Parse(obj["FromROMAddress"].ToString(), NumberStyles.HexNumber);
                            data = rom.getSubArray_safe(rom.Bytes, romOff, dataSize);
                        }
                        Bitmap   image = TextureFormats.decodeTexture(format, data, width, height, null, true);
                        string[] tags  = (string[])image.Tag;
                        Array.Resize(ref tags, tags.Length + 3);
                        uint segOff = 0;
                        if (obj["FromSegmentAddress"] != null)
                        {
                            segOff = uint.Parse(obj["FromSegmentAddress"].ToString(), NumberStyles.HexNumber);


                            if (segmentAddressForLoadingData == 0)
                            {
                                if (!rom.isSegmentMIO0((byte)(segOff >> 24), (byte)level.CurrentAreaID))
                                {
                                    tags[tags.Length - 3] = "ROM Address: " + rom.decodeSegmentAddress(segOff, (byte)level.CurrentAreaID).ToString("X");
                                }
                                else
                                {
                                    tags[tags.Length - 3] = "ROM Address: N/A";
                                }
                            }
                            else
                            {
                                byte seg_temp        = (byte)(segOff >> 24);
                                uint seg_temp_offset = segOff & 0x00FFFFFF;
                                if (tempSegmentsAreMIO0[seg_temp])
                                {
                                    tags[tags.Length - 3] = "ROM Address: N/A";
                                }
                                else
                                {
                                    tags[tags.Length - 3] = "ROM Address: " + (tempSegmentStarts[seg_temp] + seg_temp_offset).ToString("X");
                                }
                            }

                            tags[tags.Length - 2] = "Seg Addr: " + obj["FromSegmentAddress"];
                        }
                        else
                        {
                            tags[tags.Length - 3] = "ROM Address: " + obj["FromROMAddress"];
                            tags[tags.Length - 2] = "Seg Addr: N/A";
                        }
                        tags[tags.Length - 1] = "Name: " + obj["Name"];
                        image.Tag             = tags;

                        AddNewImage(ref list, image, segOff, ot_RadioButtonWithInfo_Click);

                        //Console.WriteLine("Added Other Image: " + obj["Name"]);
                    }
                    //Bitmap image = TextureFormats.decodeTexture();
                    //AddNewImage(ref list, level.ModelIDs[modelID].builder.TextureImages[i], address, ot_RadioButtonWithInfo_Click);
                }
                //Console.WriteLine(obj.ToString());
            }
            return(list);
        }