예제 #1
0
 public frmSwap(ComboBox Entries, ROMHandler ROMFile, int bank)
 {
     InitializeComponent();
     this.entries           = Entries;
     rom                    = ROMFile;
     cboBank1.SelectedIndex = bank;
     cboBank2.SelectedIndex = bank;
 }
예제 #2
0
 public static void SetPalette(ROMHandler romFile, int entry, byte pal)
 {
     if (entry <= 0xFF || entry >= 0x26C)
     {
         int  address    = ROMInfo.palInfoAddress + (entry * 12);
         byte palSubBank = (byte)
                           (romFile.ReadByte(address) & 0xF0);
         palSubBank |= (byte)(pal & 0xF);
         romFile.WriteByte(address, palSubBank);
     }
 }
예제 #3
0
        public Tileset(ROMHandler romFile, int bank, int mainEntry)
        {
            rom = romFile;

            // Compute startPointer
            startPointer = ROMInfo.gfxStartAddress[bank] + rom.ReadWord(
                ROMInfo.gfxStartAddress[bank] + 4 + (4 * mainEntry));

            // Instantiate the cache
            tileCache = new Dictionary <int, byte[, ]>();
            //counter++;
        }
예제 #4
0
 private void CloseROM()
 {
     sprite = null;
     spriteEditor.Sprite          = null;
     spriteViewer.Sprite          = null;
     paletteSelector.Sprite       = null;
     frmProperties.Sprite         = null;
     spriteEditor.IsChanged       = false;
     spriteEditor.RenderSelection = false;
     romFile.Close();
     romFile   = null;
     romHandle = null;
     tbrTool[curTool].Checked = false;
     curTool = -1;
     EnableControls(false);
 }
예제 #5
0
        private void mnuFileOpenROM_Click(object sender, EventArgs e)
        {
            // If a file is already open, ask if they want to save changes
            //   If yes, save changes
            //   If cancel, return
            //   Close the rom
            // Open new rom

            // TODO: Generalize this stuff into one method
            if (romFile != null)
            {
                if (spriteEditor.IsChanged)
                {
                    switch (MessageBox.Show(
                                "Do you wish to save your changes?",
                                "Save changes",
                                MessageBoxButtons.YesNoCancel))
                    {
                    case DialogResult.Cancel:
                        return;

                    case DialogResult.Yes:
                        ApplyChanges();
                        break;

                    default:
                        break;
                    }
                }
                CloseROM();
            }

            if (dlgOpenROM.ShowDialog() == DialogResult.OK)
            {
                romFile = File.Open(dlgOpenROM.FileName, FileMode.Open);
                if (!ROMInfo.IsMother3ROM(romFile))
                {
                    MessageBox.Show("The selected ROM could not be identified as MOTHER 3.", "Error");
                    CloseROM();
                    return;
                }
                Application.DoEvents();
                romHandle = new ROMHandler(romFile);
                LoadFile();
            }
        }
예제 #6
0
        public Palette(ROMHandler romFile, int bank, int mainEntry, Color?transparentColor)
        {
            // Bank is irrelevant? Requires ROM research; check if the
            // [0x100, 0x26B] custom range is applicable beyond bank 0

            int palBank;

            //int palAddress;
            rom       = romFile;
            mainentry = mainEntry;

            // Compute palBank
            palBank = ((mainEntry > 0xFF) && (mainEntry < 0x26C)) ? mainEntry - 0xFF : 0;

            // Compute palSubBank
            rom.Seek(ROMInfo.palInfoAddress + (mainEntry * 12));
            palSubBank = ((mainEntry > 0xFF) && (mainEntry < 0x26C)) ? 0 : (romFile.ReadByte() & 0xF);

            // Compute palAddress
            palAddress = ROMInfo.palStartAddress + rom.ReadWord(
                ROMInfo.palStartAddress + 4 + (palBank * 4)) +
                         (palSubBank * 32);

            // Parse the palette data
            rom.Seek(palAddress);
            for (int i = 0; i < 16; i++)
            {
                if (i == 0 && transparentColor != null)
                {
                    _pal[i] = (Color)transparentColor;
                }
                else
                {
                    _pal[i] = rom.ReadColor();
                }
            }
        }
예제 #7
0
 public Palette(ROMHandler romFile, int bank, int mainEntry) : this(romFile, bank, mainEntry, null)
 {
 }
예제 #8
0
        public Sprite(ROMHandler ROMFile, int Bank, int MainEntry, int SpriteEntry)
        {
            int infoAddress;
            int entryCounter = 0;

            romFile     = ROMFile;
            bank        = Bank;
            mainEntry   = MainEntry;
            spriteEntry = SpriteEntry;

            // Instantiate the tileset and palette
            tSet = new Tileset(romFile, bank, mainEntry);
            pal  = new Palette(romFile, bank, mainEntry);

            // Parse the sub sprite information
            infoAddress = ROMInfo.sprStartAddress[bank] + romFile.ReadWord(
                ROMInfo.sprStartAddress[bank] + 4 + (mainEntry * 4)) +
                          8;
            NumSprites   = romFile.ReadHWord(infoAddress);
            infoAddress += 2;

            while (spriteEntry > entryCounter)
            {
                infoAddress += (romFile.ReadHWord(infoAddress) + 1) * 4;
                entryCounter++;
            }

            romFile.Seek(infoAddress);
            NumSubSprites = romFile.ReadHWord();
            SubSprite retVal;

            subSprites = new List <SubSprite>();
            int tmp;

            for (int i = 0; i < NumSubSprites; i++)
            {
                retVal            = new SubSprite();
                retVal.romAddress = (int)romFile.Address;
                retVal.romFile    = romFile;

                retVal.OffsetY = romFile.ReadByte();
                retVal.OffsetX = romFile.ReadByte();
                if (retVal.OffsetY >= 0x80)
                {
                    retVal.OffsetY -= 0x100;                         // Sign the offsets
                }
                if (retVal.OffsetX >= 0x80)
                {
                    retVal.OffsetX -= 0x100;
                }
                tmp           = romFile.ReadHWord();
                retVal.Tile   = (tmp & 0x3FF);
                retVal.FlipX  = (((tmp >> 10) & 1) == 1);
                retVal.FlipY  = (((tmp >> 11) & 1) == 1);
                retVal.Width  = sprWidthConst[(tmp >> 14) & 3, (tmp >> 12) & 3];
                retVal.Height = sprHeightConst[(tmp >> 14) & 3, (tmp >> 12) & 3];
                retVal.Size   = (tmp >> 12) & 3;
                retVal.Shape  = (tmp >> 14) & 3;

                retVal.tileSet = tSet;
                retVal.pal     = pal;

                subSprites.Add(retVal);
            }
        }