Ejemplo n.º 1
0
        public void loadTilesObjects(bool floor = true)
        {
            //adddress of the room objects
            int objectPointer = (ROM.DATA[ConstantsReader.GetAddress("room_object_pointer") + 2] << 16) + (ROM.DATA[ConstantsReader.GetAddress("room_object_pointer") + 1] << 8) + (ROM.DATA[ConstantsReader.GetAddress("room_object_pointer")]);

            objectPointer = Addresses.snestopc(objectPointer);
            int room_address = objectPointer + (index * 3);
            int tile_address = (ROM.DATA[room_address + 2] << 16) +
                               (ROM.DATA[room_address + 1] << 8) +
                               ROM.DATA[room_address];

            int objects_location = Addresses.snestopc(tile_address);

            if (floor)
            {
                floor1 = (byte)(ROM.DATA[objects_location] & 0x0F);
                floor2 = (byte)((ROM.DATA[objects_location] >> 4) & 0x0F);
            }
            layout = (byte)((ROM.DATA[objects_location + 1] >> 2) & 0x07);

            List <ChestData> chests_in_room = new List <ChestData>();

            loadChests(ref chests_in_room);

            int   pos     = objects_location + 2;
            byte  b1      = 0;
            byte  b2      = 0;
            byte  b3      = 0;
            byte  posX    = 0;
            byte  posY    = 0;
            byte  sizeX   = 0;
            byte  sizeY   = 0;
            byte  sizeXY  = 0;
            short oid     = 0;
            int   layer   = 0;
            bool  door    = false;
            bool  endRead = false;

            while (endRead == false)
            {
                b1 = ROM.DATA[pos];
                b2 = ROM.DATA[pos + 1];
                if (b1 == 0xFF && b2 == 0xFF)
                {
                    pos += 2; //we jump to layer2
                    layer++;
                    door = false;
                    if (layer == 3)
                    {
                        endRead = true;
                        break;
                    }
                    continue;
                }

                if (b1 == 0xF0 && b2 == 0xFF)
                {
                    pos += 2; //we jump to layer2
                    door = true;
                    continue;
                }
                b3 = ROM.DATA[pos + 2];
                if (door)
                {
                    pos += 2;
                }
                else
                {
                    pos += 3;
                }

                if (door == false)
                {
                    if (b3 >= 0xF8)
                    {
                        oid    = (short)((b3 << 4) | 0x80 + (((b2 & 0x03) << 2) + ((b1 & 0x03))));
                        posX   = (byte)((b1 & 0xFC) >> 2);
                        posY   = (byte)((b2 & 0xFC) >> 2);
                        sizeXY = (byte)((((b1 & 0x03) << 2) + (b2 & 0x03)));
                    }
                    else //subtype1
                    {
                        oid    = b3;
                        posX   = (byte)((b1 & 0xFC) >> 2);
                        posY   = (byte)((b2 & 0xFC) >> 2);
                        sizeX  = (byte)((b1 & 0x03));
                        sizeY  = (byte)((b2 & 0x03));
                        sizeXY = (byte)(((sizeX << 2) + sizeY));
                    }
                    if (b1 >= 0xFC) //subtype2 (not scalable? )
                    {
                        oid    = (short)((b3 & 0x3F) + 0x100);
                        posX   = (byte)(((b2 & 0xF0) >> 4) + ((b1 & 0x3) << 4));
                        posY   = (byte)(((b2 & 0x0F) << 2) + ((b3 & 0xC0) >> 6));
                        sizeXY = 0;
                    }

                    tilesObjects.Add(new Room_Object(oid, posX, posY, sizeXY, (byte)layer));

                    //IF Object is a chest loaded and there's object in the list chest
                    if (oid == 0xF99)
                    {
                        if (chests_in_room.Count > 0)
                        {
                            chest_list.Add(new ChestData(chests_in_room[0].itemIn, false));
                            chests_in_room.RemoveAt(0);
                        }
                    }
                    else if (oid == 0xFB1)
                    {
                        if (chests_in_room.Count > 0)
                        {
                            chest_list.Add(new ChestData(chests_in_room[0].itemIn, true));
                            chests_in_room.RemoveAt(0);
                        }
                    }
                }
                else
                {
                    doors.Add(new DoorSave((short)((b2 << 8) + b1)));
                    continue;
                }
            }
        }
Ejemplo n.º 2
0
        public void LoadOverworldSprites()
        {
            Room_Sprite[][] all_spritesOW = new Room_Sprite[3][];
            all_spritesOW[0] = JsonConvert.DeserializeObject <Room_Sprite[]>(File.ReadAllText(path + @"//Overworld//Sprites//Beginning Sprites.json"));
            all_spritesOW[1] = JsonConvert.DeserializeObject <Room_Sprite[]>(File.ReadAllText(path + @"//Overworld//Sprites//ZeldaRescued Sprites.json"));
            all_spritesOW[2] = JsonConvert.DeserializeObject <Room_Sprite[]>(File.ReadAllText(path + @"//Overworld//Sprites//AgahnimDefeated Sprites.json"));

            //Restore sprites by room //64, 143
            for (int i = 0; i < 64; i++)
            {
                roomSpritesBeginning[i] = new List <Room_Sprite>();
                for (int j = 0; j < all_spritesOW[0].Length; j++)
                {
                    if (all_spritesOW[0][j].roomMapId == i)
                    {
                        roomSpritesBeginning[i].Add(all_spritesOW[0][j]);
                    }
                }
            }

            for (int i = 0; i < 143; i++)
            {
                roomSpritesZelda[i]   = new List <Room_Sprite>();
                roomSpritesAgahnim[i] = new List <Room_Sprite>();

                for (int j = 0; j < all_spritesOW[1].Length; j++)
                {
                    if (all_spritesOW[1][j].roomMapId == i)
                    {
                        roomSpritesZelda[i].Add(all_spritesOW[1][j]);
                    }
                }

                for (int j = 0; j < all_spritesOW[2].Length; j++)
                {
                    if (all_spritesOW[2][j].roomMapId == i)
                    {
                        roomSpritesAgahnim[i].Add(all_spritesOW[2][j]);
                    }
                }
            }



            //data location range spritedata = AED length : 2797
            //0x4CB41 starting data location (1st is just a FF for empty pointers)
            //real starting location = 0x4CB42
            //ROM.DATA[0x4CB41] = 0xFF;//Ensure the first data is a return so maps with no sprites can use that
            ROM.DATA[(0x1F0001 + DataOffset)] = 0xFF; ROM.DATA[(0x1F0000 + DataOffset)] = 0xFF;
            int emptyPointer = 0x0000;

            int dataPos = (0x1F0002 + DataOffset);
            //int dataPos = 0x4CB42;
            int beginningPointers = ConstantsReader.GetAddress("overworldSpritesBegining");
            int zeldaPointers     = ConstantsReader.GetAddress("overworldSpritesZelda");
            int agahnimPointers   = ConstantsReader.GetAddress("overworldSpritesAgahnim");

            for (int i = 0; i < 64; i++)
            {
                if (roomSpritesBeginning[i].Count != 0)
                {
                    int snesaddr = Addresses.pctosnes(dataPos);
                    ROM.DATA[beginningPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
                    ROM.DATA[beginningPointers + (i * 2)]     = (byte)((snesaddr) & 0xFF);
                    foreach (Room_Sprite spr in roomSpritesBeginning[i])
                    {
                        byte b1 = spr.y;
                        byte b2 = spr.x;
                        byte b3 = spr.id;
                        ROM.DATA[dataPos++] = b1;
                        ROM.DATA[dataPos++] = b2;
                        ROM.DATA[dataPos++] = b3;
                    }
                    //add FF to end the room
                    ROM.DATA[dataPos++] = 0xFF;

                    if (dataPos >= ((0x1F1200 + DataOffset)))
                    {
                        Console.WriteLine("Too many Overworld sprites !");
                        break;
                    }
                }
                else
                {
                    int snesaddr = Addresses.pctosnes(emptyPointer);
                    ROM.DATA[beginningPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
                    ROM.DATA[beginningPointers + (i * 2)]     = (byte)((snesaddr) & 0xFF);
                }
            }

            for (int i = 0; i < 143; i++)
            {
                if (roomSpritesZelda[i].Count != 0)
                {
                    int snesaddr = Addresses.pctosnes(dataPos);
                    ROM.DATA[zeldaPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
                    ROM.DATA[zeldaPointers + (i * 2)]     = (byte)((snesaddr) & 0xFF);
                    foreach (Room_Sprite spr in roomSpritesZelda[i])
                    {
                        byte b1 = spr.y;
                        byte b2 = spr.x;
                        byte b3 = spr.id;
                        ROM.DATA[dataPos++] = b1;
                        ROM.DATA[dataPos++] = b2;
                        ROM.DATA[dataPos++] = b3;
                    }
                    //add FF to end the room
                    ROM.DATA[dataPos++] = 0xFF;

                    if (dataPos >= (0x1F1200 + DataOffset))
                    {
                        Console.WriteLine("Too many Overworld sprites ! (Zelda)");
                        break;
                    }
                }
                else
                {
                    int snesaddr = Addresses.pctosnes(emptyPointer);
                    ROM.DATA[zeldaPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
                    ROM.DATA[zeldaPointers + (i * 2)]     = (byte)((snesaddr) & 0xFF);
                }
            }


            for (int i = 0; i < 143; i++)
            {
                if (roomSpritesAgahnim[i].Count != 0)
                {
                    int snesaddr = Addresses.pctosnes(dataPos);
                    ROM.DATA[agahnimPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
                    ROM.DATA[agahnimPointers + (i * 2)]     = (byte)((snesaddr) & 0xFF);
                    foreach (Room_Sprite spr in roomSpritesAgahnim[i])
                    {
                        byte b1 = spr.y;
                        byte b2 = spr.x;
                        byte b3 = spr.id;
                        ROM.DATA[dataPos++] = b1;
                        ROM.DATA[dataPos++] = b2;
                        ROM.DATA[dataPos++] = b3;
                    }
                    //add FF to end the room
                    ROM.DATA[dataPos++] = 0xFF;

                    if (dataPos >= (0x1F1200 + DataOffset))
                    {
                        Console.WriteLine("Too many Overworld sprites ! (Agah) room : " + i);
                        break;
                    }
                }
                else
                {
                    int snesaddr = Addresses.pctosnes(emptyPointer);
                    ROM.DATA[agahnimPointers + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
                    ROM.DATA[agahnimPointers + (i * 2)]     = (byte)((snesaddr) & 0xFF);
                }
            }
        }
Ejemplo n.º 3
0
        public static void readAllText()
        {
            int maxMessage = 0;
            int pos        = 0xE0000;
            int msgid      = 0;

            while (true)
            {
                messages.Add("");
                messagesPos[msgid] = pos;
                messages[msgid]    = "";
                byte byteRead = ROM.DATA[pos];
                if (byteRead == 0xFF)
                {
                    break;
                }
                while (byteRead != 0x7F) //7F = end of string
                {
                    if (byteRead == 0x80)
                    {
                        pos      = 0x75F40;
                        byteRead = ROM.DATA[pos];
                    }

                    if (getTextCharacter(byteRead, msgid))
                    {
                        pos++;
                    }

                    //Commands
                    else if (byteRead == 0x67) // $67[NextPic] command
                    {
                        messages[msgid] += "[PIC]";
                        pos++;
                    }
                    else if (byteRead == 0x68) //$68[Choose] command
                    {
                        messages[msgid] += "[CHS]";
                        pos++;
                    }
                    else if (byteRead == 0x69) //$69[Item] command(for waterfall of wishing)
                    {
                        messages[msgid] += "[ITM]";
                        pos++;
                    }
                    else if (byteRead == 0x6A) //$6A[Name] command(insert's player's name)
                    {
                        messages[msgid] += "[NAM]";
                        pos++;
                    }
                    else if (byteRead == 0x6B) //$6B[Window XX] command(takes next byte as argument)
                    {
                        messages[msgid] += "[WND=";
                        pos++;
                        byteRead         = ROM.DATA[pos];
                        messages[msgid] += byteRead.ToString("X2") + "]";
                        pos++;
                    }
                    else if (byteRead == 0x6C) // $6C[Number XX] command(takes next byte as argument)
                    {
                        messages[msgid] += "[NBR=";
                        pos++;
                        byteRead         = ROM.DATA[pos];
                        messages[msgid] += byteRead.ToString("X2") + "]";
                        pos++;
                    }
                    else if (byteRead == 0x6D) // $6D[Position XX] command(takes next byte as argument)
                    {
                        messages[msgid] += "[POS=";
                        pos++;
                        byteRead         = ROM.DATA[pos];
                        messages[msgid] += byteRead.ToString("X2") + "]";
                        pos++;
                    }
                    else if (byteRead == 0x6E) //$6E[ScrollSpd XX] command(takes next byte as argument)
                    {
                        messages[msgid] += "[SSP=";
                        pos++;
                        byteRead         = ROM.DATA[pos];
                        messages[msgid] += byteRead.ToString("X2") + "]";
                        pos++;
                    }
                    else if (byteRead == 0x6F) //$6F[SelChng] command
                    {
                        messages[msgid] += "[SCH]";
                        pos++;
                    }
                    else if (byteRead == 0x70) //$70 (Crash)
                    {
                        messages[msgid] += "[REM]";
                        pos++;
                    }
                    else if (byteRead == 0x71) //$71[Choose2] command
                    {
                        messages[msgid] += "[CH1]";
                        pos++;
                    }
                    else if (byteRead == 0x72) //$71[Choose3] command
                    {
                        messages[msgid] += "[CH2]";
                        pos++;
                    }
                    else if (byteRead == 0x73) //$73[SCROLL] command
                    {
                        messages[msgid] += "[SCL]";
                        pos++;
                    }
                    else if (byteRead == 0x74) //$74[1] command(aka[Line1])
                    {
                        messages[msgid] += "[LN1]";
                        pos++;
                    }
                    else if (byteRead == 0x75) //$75[1] command(aka[Line2])
                    {
                        messages[msgid] += "[LN2]";
                        pos++;
                    }
                    else if (byteRead == 0x76) //$76[1] command(aka[Line3])
                    {
                        messages[msgid] += "[LN3]";
                        pos++;
                    }
                    else if (byteRead == 0x77) //$77[Color XX] command(takes next byte as argument)
                    {
                        messages[msgid] += "[COL=";
                        pos++;
                        byteRead         = ROM.DATA[pos];
                        messages[msgid] += byteRead.ToString("X2") + "]";
                        pos++;
                    }
                    else if (byteRead == 0x78) //$78[Wait  XX] command(takes next byte as argument)
                    {
                        messages[msgid] += "[WAI=";
                        pos++;
                        byteRead         = ROM.DATA[pos];
                        messages[msgid] += byteRead.ToString("X2") + "]";
                        pos++;
                    }
                    else if (byteRead == 0x79) //$79[Sound XX] command(takes next byte as argument)
                    {
                        messages[msgid] += "[SND=";
                        pos++;
                        byteRead         = ROM.DATA[pos];
                        messages[msgid] += byteRead.ToString("X2") + "]";
                        pos++;
                    }
                    else if (byteRead == 0x7A) //$7A[Speed XX] command(takes next byte as argument)
                    {
                        messages[msgid] += "[SPD=";
                        pos++;
                        byteRead         = ROM.DATA[pos];
                        messages[msgid] += byteRead.ToString("X2") + "]";
                        pos++;
                    }
                    else if (byteRead == 0x7E) //$7A[Speed XX] command(takes next byte as argument)
                    {
                        messages[msgid] += "[WFK]";
                        pos++;
                    }
                    else if (byteRead == 0x80)
                    {
                        pos++;
                        break;
                    }
                    else if (byteRead >= 0x88 && byteRead <= 0xF9)
                    {
                        //Dictionary
                        byte dictionaryIndex = (byte)(byteRead - 0x88);
                        byte a0            = 0x0E;
                        byte a1            = ROM.DATA[0x74703 + (dictionaryIndex * 2) + 1];
                        byte a2            = ROM.DATA[0x74703 + (dictionaryIndex * 2)];
                        int  dictionaryPos = Addresses.snestopc(((a0 << 16) | (a1 << 8) | (a2)));

                        a0 = 0x0E;
                        a1 = ROM.DATA[0x74703 + (dictionaryIndex * 2) + 3];
                        a2 = ROM.DATA[0x74703 + (dictionaryIndex * 2) + 2];
                        int dictionaryNextPos = Addresses.snestopc(((a0 << 16) | (a1 << 8) | (a2)));

                        byte length = (byte)(dictionaryNextPos - dictionaryPos);

                        for (int i = 0; i < length; i++)
                        {
                            getTextCharacter(ROM.DATA[dictionaryPos + i], msgid);
                        }
                        pos++;
                    }
                    else
                    {
                        //Console.WriteLine(byteRead.ToString("X2"));
                        break;
                    }
                    byteRead = ROM.DATA[pos];

                    if (pos >= 0xE8000)
                    {
                        maxMessage = msgid;
                        break;
                    }

                    continue;
                }

                if (pos >= 0xE8000)
                {
                    maxMessage = msgid;
                    break;
                }

                pos++;
                msgid++;
                byteRead = ROM.DATA[pos];
            }
        }
Ejemplo n.º 4
0
        public void LoadOverworldItems()
        {
            roomPotSave[]        items     = JsonConvert.DeserializeObject <roomPotSave[]>(File.ReadAllText(path + @"//Overworld//Items//Items.json"));
            List <roomPotSave>[] roomItems = new List <roomPotSave> [128];

            for (int i = 0; i < 128; i++)
            {
                roomItems[i] = new List <roomPotSave>();
                for (int j = 0; j < items.Length; j++)
                {
                    if (i == items[j].roomMapId)
                    {
                        roomItems[i].Add(items[j]);
                    }
                }
            }

            ROM.DATA[(0x1F1201 + DataOffset)] = 0xFF; ROM.DATA[(0x1F1202 + DataOffset)] = 0xFF;
            short emptyPointer = 0x1201;
            int   dataPos      = (0x1F1203 + DataOffset);

            int pointeraddr = ConstantsReader.GetAddress("overworldItemsPointers");

            for (int i = 0; i < 128; i++)
            {
                if (roomItems[i].Count != 0)
                {
                    int snesaddr = Addresses.pctosnes(dataPos);
                    ROM.DATA[pointeraddr + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
                    ROM.DATA[pointeraddr + (i * 2)]     = (byte)((snesaddr) & 0xFF);
                    foreach (roomPotSave item in roomItems[i])
                    {
                        //Console.WriteLine(item.x);

                        short mapPos = (short)(((item.y << 6) + item.x) << 1);

                        byte b1 = (byte)((mapPos >> 8)); //1111 1111 0000 0000
                        byte b2 = (byte)(mapPos & 0xFF); //0000 0000 1111 1111
                        byte b3 = (byte)(item.id);

                        ROM.DATA[dataPos++] = b2;
                        ROM.DATA[dataPos++] = b1;
                        ROM.DATA[dataPos++] = b3;
                    }
                    ROM.DATA[dataPos++] = 0xFF;
                    ROM.DATA[dataPos]   = 0xFF;
                    if (dataPos >= (0x1F2800 + DataOffset))
                    {
                        Console.WriteLine("Too many Overworld items !");
                        break;
                    }
                    dataPos++;
                }
                else
                {
                    int snesaddr = Addresses.pctosnes(emptyPointer);
                    ROM.DATA[pointeraddr + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
                    ROM.DATA[pointeraddr + (i * 2)]     = (byte)((snesaddr) & 0xFF);
                    //Save Empty Pointer
                }
            }
        }
Ejemplo n.º 5
0
        public void loadOverworldOverlays()
        {
            //first one == 0xFF 0xFF for the empty
            int dataPos  = ConstantsReader.GetAddress("overlayNewCode"); //empty pointer = overlayNewCode
            int emptyPos = ConstantsReader.GetAddress("overlayNewCode");;

            ROM.DATA[dataPos++] = 0xFF;
            ROM.DATA[dataPos++] = 0xFF;
            List <OverlayData>[] overlaysData = JsonConvert.DeserializeObject <List <OverlayData>[]>(File.ReadAllText(path + @"//Overworld//Overlays.json"));
            int pointeraddr = ConstantsReader.GetAddress("overlayPointers");

            for (int i = 0; i < 128; i++)
            {
                if (vanillaOverlays[i] == true)
                {
                    int snesaddr = Addresses.pctosnes(dataPos);
                    ROM.DATA[pointeraddr + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
                    ROM.DATA[pointeraddr + (i * 2)]     = (byte)((snesaddr) & 0xFF);
                    // Format: iiiipppp pppppppp iiiiiiii - p = position, i = tile id
                    foreach (OverlayData od in overlaysData[i])
                    {
                        short pos = (short)((((od.y * 64) + od.x)) << 1);
                        byte  b1  = (byte)((pos & 0xFF00) >> 8);
                        byte  b2  = (byte)((pos & 0x00FF));
                        byte  b3  = (byte)((od.tileId & 0xFF00) >> 8);
                        byte  b4  = (byte)(od.tileId & 0xFF);
                        ROM.DATA[dataPos++] = b2;
                        ROM.DATA[dataPos++] = b1;
                        ROM.DATA[dataPos++] = b4;
                        ROM.DATA[dataPos++] = b3;
                    }

                    ROM.DATA[dataPos++] = 0xFF;
                    ROM.DATA[dataPos++] = 0xFF;
                }
                else
                {
                    int snesaddr = Addresses.pctosnes(emptyPos);
                    ROM.DATA[pointeraddr + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
                    ROM.DATA[pointeraddr + (i * 2)]     = (byte)((snesaddr) & 0xFF);
                }
            }



            /*ROM.DATA[pointeraddr + (i * 2) + 1] = (byte)((snesaddr >> 8) & 0xFF);
             * ROM.DATA[pointeraddr + (i * 2)] = (byte)((snesaddr) & 0xFF);
             * foreach (roomPotSave item in roomItems[i])
             * {
             *
             *  //Console.WriteLine(item.x);
             *
             *  short mapPos = (short)(((item.y << 6) + item.x) << 1);
             *
             *  byte b1 = (byte)((mapPos >> 8));//1111 1111 0000 0000
             *  byte b2 = (byte)(mapPos & 0xFF);//0000 0000 1111 1111
             *  byte b3 = (byte)(item.id);
             *
             *  ROM.DATA[dataPos++] = b2;
             *  ROM.DATA[dataPos++] = b1;
             *  ROM.DATA[dataPos++] = b3;
             * }
             * ROM.DATA[dataPos++] = 0xFF;
             * ROM.DATA[dataPos] = 0xFF;
             * if (dataPos >= (0x1F2800 + DataOffset))
             * {
             *  Console.WriteLine("Too many Overworld items !");
             *  break;
             * }
             * dataPos++;
             *
             * }
             *  else
             *  {
             *      int snesaddr = Addresses.pctosnes(emptyPointer);
             * ROM.DATA[pointeraddr + (i * 2) + 1] = (byte) ((snesaddr >> 8) & 0xFF);
             *      ROM.DATA[pointeraddr + (i * 2)] = (byte) ((snesaddr) & 0xFF);
             *      //Save Empty Pointer
             *  }*/
        }
Ejemplo n.º 6
0
        public int getLongPointerSnestoPc(int pos)
        {
            int p = (ROM.DATA[pos + 2] << 16) + (ROM.DATA[pos + 1] << 8) + (ROM.DATA[pos]);

            return(Addresses.snestopc(p));
        }
Ejemplo n.º 7
0
        public void writeOverworldSprites(string path)
        {
            if (!Directory.Exists(path + "Overworld//Sprites"))
            {
                Directory.CreateDirectory(path + "Overworld//Sprites");
            }


            List <Room_Sprite> sprites = new List <Room_Sprite>();

            int spritesAddress = ConstantsReader.GetAddress("overworldSpritesBegining");

            //09 bank ? Need to check if HM change that
            for (int i = 0; i < 64; i++)
            {
                if (all_maps[i].largeMap == true)
                {
                    if (mapParent[i] != (byte)i)
                    {
                        continue;
                    }
                }
                int sprite_address_snes = (09 << 16) +
                                          (ROM.DATA[spritesAddress + (i * 2) + 1] << 8) +
                                          ROM.DATA[spritesAddress + (i * 2)];
                int sprite_address = Addresses.snestopc(sprite_address_snes);



                while (true)
                {
                    byte b1 = ROM.DATA[sprite_address];
                    byte b2 = ROM.DATA[sprite_address + 1];
                    byte b3 = ROM.DATA[sprite_address + 2];

                    if (b1 == 0xFF)
                    {
                        break;
                    }

                    sprites.Add(new Room_Sprite(b3, (byte)(b2 & 0x3F), (byte)(b1 & 0x3F), (ushort)i, Sprites_Names.name[b3], 0, 0, 0, 0));
                    sprite_address += 3;
                }
            }
            File.WriteAllText(path + "Overworld//Sprites//Beginning Sprites.json", JsonConvert.SerializeObject(sprites));

            sprites.Clear();
            spritesAddress = ConstantsReader.GetAddress("overworldSpritesZelda");



            for (int i = 0; i < 143; i++)
            {
                if (all_maps[i].largeMap == true)
                {
                    if (mapParent[i] != (byte)i)
                    {
                        continue;
                    }
                }
                int sprite_address_snes = (09 << 16) +
                                          (ROM.DATA[spritesAddress + (i * 2) + 1] << 8) +
                                          ROM.DATA[spritesAddress + (i * 2)];
                int sprite_address = Addresses.snestopc(sprite_address_snes);
                while (true)
                {
                    byte b1 = ROM.DATA[sprite_address];
                    byte b2 = ROM.DATA[sprite_address + 1];
                    byte b3 = ROM.DATA[sprite_address + 2];

                    if (b1 == 0xFF)
                    {
                        break;
                    }

                    sprites.Add(new Room_Sprite(b3, (byte)(b2 & 0x3F), (byte)(b1 & 0x3F), (ushort)i, Sprites_Names.name[b3], 0, 0, 0, 0));
                    sprite_address += 3;
                }
            }
            File.WriteAllText(path + "Overworld//Sprites//ZeldaRescued Sprites.json", JsonConvert.SerializeObject(sprites));

            sprites.Clear();
            spritesAddress = ConstantsReader.GetAddress("overworldSpritesAgahnim");


            for (int i = 0; i < 143; i++)
            {
                if (all_maps[i].largeMap == true)
                {
                    if (mapParent[i] != (byte)i)
                    {
                        continue;
                    }
                }
                int sprite_address_snes = (09 << 16) +
                                          (ROM.DATA[spritesAddress + (i * 2) + 1] << 8) +
                                          ROM.DATA[spritesAddress + (i * 2)];
                int sprite_address = Addresses.snestopc(sprite_address_snes);
                while (true)
                {
                    byte b1 = ROM.DATA[sprite_address];
                    byte b2 = ROM.DATA[sprite_address + 1];
                    byte b3 = ROM.DATA[sprite_address + 2];

                    if (b1 == 0xFF)
                    {
                        break;
                    }

                    sprites.Add(new Room_Sprite(b3, (byte)(b2 & 0x3F), (byte)(b1 & 0x3F), (ushort)i, Sprites_Names.name[b3], 0, 0, 0, 0));
                    sprite_address += 3;
                }
            }

            File.WriteAllText(path + "Overworld//Sprites//AgahnimDefeated Sprites.json", JsonConvert.SerializeObject(sprites));
        }
Ejemplo n.º 8
0
        public void writeOverlays(string path)
        {
            for (int index = 0; index < 128; index++)
            {
                overlaysDatas[index] = new List <OverlayData>();
                //overlayPointers
                int addr = (ConstantsReader.GetAddress("overlayPointersBank") << 16) +
                           (ROM.DATA[ConstantsReader.GetAddress("overlayPointers") + (index * 2) + 1] << 8) +
                           ROM.DATA[ConstantsReader.GetAddress("overlayPointers") + (index * 2)];
                addr = Addresses.snestopc(addr);

                int a   = 0;
                int x   = 0;
                int sta = 0;
                //16-bit mode :
                //A9 (LDA #$)
                //A2 (LDX #$)
                //8D (STA $xxxx)
                //9D (STA $xxxx ,x)
                //8F (STA $xxxxxx)
                //1A (INC A)
                //4C (JMP)
                //60 (END)
                byte b = 0;
                while (b != 0x60)
                {
                    b = ROM.DATA[addr];
                    if (b == 0xFF)
                    {
                        break;
                    }
                    else if (b == 0xA9) //LDA #$xxxx (Increase addr+3)
                    {
                        a = (ROM.DATA[addr + 2] << 8) +
                            ROM.DATA[addr + 1];
                        addr += 3;
                        continue;
                    }
                    else if (b == 0xA2) //LDX #$xxxx (Increase addr+3)
                    {
                        x = (ROM.DATA[addr + 2] << 8) +
                            ROM.DATA[addr + 1];
                        addr += 3;
                        continue;
                    }
                    else if (b == 0x8D) //STA $xxxx (Increase addr+3)
                    {
                        sta = (ROM.DATA[addr + 2] << 8) +
                              ROM.DATA[addr + 1];

                        //draw tile at sta position
                        //Console.WriteLine("Draw Tile" + a + " at " + sta.ToString("X4"));
                        //64
                        sta = sta & 0x1FFF;
                        int yp = ((sta / 2) / 0x40);
                        int xp = (sta / 2) - (yp * 0x40);
                        overlaysDatas[index].Add(new OverlayData((byte)xp, (byte)yp, (ushort)a));
                        addr += 3;
                        continue;
                    }
                    else if (b == 0x9D) //STA $xxxx, x (Increase addr+3)
                    {
                        sta = (ROM.DATA[addr + 2] << 8) +
                              ROM.DATA[addr + 1];
                        //draw tile at sta,X position
                        //Console.WriteLine("Draw Tile" + a + " at " + (sta + x).ToString("X4"));

                        int stax = (sta & 0x1FFF) + x;
                        int yp   = ((stax / 2) / 0x40);
                        int xp   = (stax / 2) - (yp * 0x40);
                        overlaysDatas[index].Add(new OverlayData((byte)xp, (byte)yp, (ushort)a));

                        addr += 3;
                        continue;
                    }
                    else if (b == 0x8F) //STA $xxxxxx (Increase addr+4)
                    {
                        sta = (ROM.DATA[addr + 2] << 8) +
                              ROM.DATA[addr + 1];
                        //draw tile at sta,X position
                        //Console.WriteLine("Draw Tile" + a + " at " + (sta + x).ToString("X4"));

                        int stax = (sta & 0x1FFF) + x;
                        int yp   = ((stax / 2) / 0x40);
                        int xp   = (stax / 2) - (yp * 0x40);
                        overlaysDatas[index].Add(new OverlayData((byte)xp, (byte)yp, (ushort)a));

                        addr += 4;
                        continue;
                    }
                    else if (b == 0x1A) //INC A (Increase addr+1)
                    {
                        a    += 1;
                        addr += 1;
                        continue;
                    }
                    else if (b == 0x4C) //JMP $xxxx (move addr to the new address)
                    {
                        addr = (ConstantsReader.GetAddress("overlayPointersBank") << 16) +
                               (ROM.DATA[addr + 2] << 8) +
                               ROM.DATA[addr + 1];
                        addr = Addresses.snestopc(addr);
                        continue;
                    }
                    else if (b == 0x60) //RTS
                    {
                        break;          //just to be sure
                    }
                }
            }

            File.WriteAllText(path + "Overworld//Overlays.json", JsonConvert.SerializeObject(overlaysDatas));
        }