Example #1
0
        /// <summary>
        /// Flips the given OAM and returns both (left-side-facing-right and right-side-facing-left)
        /// </summary>
        public static Tuple <byte[], byte[]> GetFlippedOAM(byte[] OAMdata)
        {
            byte[] flipped = new byte[OAMdata.Length];
            OAM    block;

            byte[] buffer = new byte[12];
            for (int i = 0; i < OAMdata.Length; i += 12)
            {
                Array.Copy(OAMdata, i, buffer, 0, 12);

                if (OAMdata[i] == 0x00)
                {
                    block = new OAM(buffer);

                    block.FlipH = !block.FlipH;

                    block.ScreenX = (Int16)((block.ScreenX + block.GetDimensions().Width * 8) * -1);

                    buffer = block.ToBytes();
                }
                Array.Copy(buffer, 0, flipped, i, 12);
            }

            return(Tuple.Create(flipped, OAMdata));
        }
Example #2
0
 int Comparision_Cell(OAM c1, OAM c2)
 {
     if (c1.obj2.priority < c2.obj2.priority)
     {
         return(1);
     }
     else if (c1.obj2.priority > c2.obj2.priority)
     {
         return(-1);
     }
     else   // Same priority
     {
         if (c1.num_cell < c2.num_cell)
         {
             return(1);
         }
         else if (c1.num_cell > c2.num_cell)
         {
             return(-1);
         }
         else // Same cell
         {
             return(0);
         }
     }
 }
Example #3
0
    int firstFree(OAM pOAM)
    {
        if (pOAM.isBackGround)
        {
            for (int i = 640; i < 1024; i++)
            {
                if (string.IsNullOrEmpty(address [i]))
                {
                    return(i);
                }
            }
        }
        else
        {
            for (int i = 0; i < 640; i++)
            {
                if (string.IsNullOrEmpty(address [i]))
                {
                    return(i);
                }
            }
        }

        return(1023);
    }
Example #4
0
    /// <summary>
    /// Кеширование текстур
    /// </summary>
    public Sprite findSprite(OAM pOAM)
    {
        string k    = pOAM.textureKey;
        int    addr = address.IndexOf(k);

        if (addr >= 0)
        {
            return(sprites [addr]);
        }

        addr = firstFree(pOAM);

        Sprite spr = sprites [addr];
        int    xx  = (int)spr.rect.x + 63;
        int    yy  = (int)spr.rect.y + 63;

        byte[,] spriteArray = console.Ppu.readSprite(pOAM);
        for (int i = 0; i < 64; i++)
        {
            for (int j = 0; j < 64; j++)
            {
                int ii = i >> 3;
                int jj = j >> 3;
                tiles.SetPixel(xx - i, yy - j, UNES.palette [spriteArray [ii, jj]]);
            }
        }
        added = true;
        tiles.Apply();
        //UnityEditor.EditorUtility.SetDirty (tiles);
        Debug.Log("added " + addr);
        address[addr] = k;
        //sprites = Resources.LoadAll<Sprite>(tiles.name);
        return(spr);
    }
Example #5
0
        private void Update_Image()
        {
            stop = true;

            OAM  oam  = bank.oams[(int)numOAM.Value];
            Size size = Actions.Get_OAMSize(oam.obj0.shape, oam.obj1.size);

            oam.width  = (ushort)size.Width;
            oam.height = (ushort)size.Height;
            bank.oams[(int)numOAM.Value] = oam;

            ushort[] objs = Actions.OAMInfo(oam);
            numObj0.Value = objs[0];
            numObj1.Value = objs[1];
            numObj2.Value = objs[2];

            if (!preview)
            {
                return;
            }

            picBox.Image = sprite.Get_Image(image, palette, bank, 512, 256, checkGrid.Checked, checkOAM.Checked,
                                            checkNumbers.Checked, checkTrans.Checked, checkImage.Checked, (checkCurrOAM.Checked ? (int)numOAM.Value : -1));
            stop = false;
        }
Example #6
0
    fieldSprite DrawSprite(bool pEvenOdd, OAM pOAM)
    {
        // сначала пытаемся найти тот же спрайт
        fieldSprite spr = sprites.Find(s => /*s.spriteNum == pOAM.spriteNum &&*/ s.EvenOdd != pEvenOdd && s.active);

        // пытаемся найти неактивный спрайт
        if (spr == null)
        {
            spr = sprites.Find(s => !s.active);
        }

        // клонируем
        if (spr == null)
        {
            spr = Instantiate(defaultSprite) as fieldSprite;
            spr.transform.SetParent(transform);
            spr.transform.localScale = Vector3.one * 10;
            sprites.Add(spr);
        }

        spr.transform.localPosition = new Vector3(0f + scale * pOAM.xTop, 0f - scale * pOAM.yTop, 0);
        spr.spriteNum     = pOAM.spriteNum;
        spr.EvenOdd       = pEvenOdd;
        spr.active        = true;
        pOAM.isBackGround = false;
        spr.DrawSprite(TileHolder.GetSprite(pOAM));
        return(spr);
    }
Example #7
0
        internal void RefreshSprite(uint[] pixels, OAM oam)
        {
            Utils.TransferBytesToWriteableBitmap(_spriteImage, pixels);
            OnPropertyChanged(() => SpriteImage);

            _spriteData = oam;
            OnPropertyChanged(() => SpriteData);
        }
Example #8
0
        private void DrawMosaic_CheckBox_CheckedChanged(Object sender, EventArgs e)
        {
            OAM oam = Current[Entry_NumBox.Value];

            oam.DrawMosaic = DrawMosaic_CheckBox.Checked;
            Current[Entry_NumBox.Value] = oam;

            Core_Write();
        }
Example #9
0
        private void FlipV_CheckBox_CheckedChanged(Object sender, EventArgs e)
        {
            OAM oam = Current[Entry_NumBox.Value];

            oam.FlipV = FlipV_CheckBox.Checked;
            Current[Entry_NumBox.Value] = oam;

            Core_Write();
        }
Example #10
0
        private void Affine_Index_NumBox_ValueChanged(Object sender, EventArgs e)
        {
            OAM oam = Current[Entry_NumBox.Value];

            oam.AffineIndex             = Affine_Index_NumBox.Value;
            Current[Entry_NumBox.Value] = oam;

            Core_Write();
        }
Example #11
0
        private void SheetY_NumBox_ValueChanged(Object sender, EventArgs e)
        {
            OAM oam = Current[Entry_NumBox.Value];

            oam.SheetY = (byte)SheetY_NumBox.Value;
            Current[Entry_NumBox.Value] = oam;

            Core_Write();
        }
Example #12
0
        private void Priority_NumBox_ValueChanged(Object sender, EventArgs e)
        {
            OAM oam = Current[Entry_NumBox.Value];

            oam.Priority = (byte)Priority_NumBox.Value;
            Current[Entry_NumBox.Value] = oam;

            Core_Write();
        }
Example #13
0
        private void OBJ_Mode_ComboBox_SelectedIndexChanged(Object sender, EventArgs e)
        {
            OAM oam = Current[Entry_NumBox.Value];

            oam.OBJMode = (OAM_OBJMode)OBJ_Mode_ComboBox.SelectedValue;
            Current[Entry_NumBox.Value] = oam;

            Core_Write();
        }
Example #14
0
        private void Size_ComboBox_SelectedIndexChanged(Object sender, EventArgs e)
        {
            OAM oam = Current[Entry_NumBox.Value];

            oam.SpriteSize = (OAM_Size)Size_ComboBox.SelectedValue;
            Current[Entry_NumBox.Value] = oam;

            Core_Write();
        }
Example #15
0
        private void ScreenY_NumBox_ValueChanged(Object sender, EventArgs e)
        {
            OAM oam = Current[Entry_NumBox.Value];

            oam.ScreenY = (Int16)ScreenY_NumBox.Value;
            Current[Entry_NumBox.Value] = oam;

            Core_Write();
        }
Example #16
0
        static void Main(string[] args)
        {
            string[] OAMs = Directory.GetFiles("OAMS_Comprimidos");

            foreach (string OAM in OAMs)
            {
                File.Create(OAM.Replace(".bin", ".new")).Close();
                Chunck(OAM);
            }
        }
Example #17
0
                    public PPU( )
                    {
                        m_VRAM          = new byte[0x2000]; // 8 KB
                        m_OAM           = new OAM();
                        m_operationMode = 0;
                        m_scanlineTotalCyclesElapsed = 0;
                        m_cyclesElapsed = 0;

                        m_lcdControlInfo = new LCDControlInfo();
                        m_lcdControlInfo.Set(0);

                        // Temp binding
                        RequestIRQ = (aIRQ_flag) => { };
                    }
Example #18
0
 int Comparision_Cell2(OAM c1, OAM c2)
 {
     if (c1.num_cell > c2.num_cell)
     {
         return(1);
     }
     else if (c1.num_cell < c2.num_cell)
     {
         return(-1);
     }
     else
     {
         return(0);
     }
 }
Example #19
0
        private void btnRemOAM_Click(object sender, EventArgs e)
        {
            OAM[] newOAM = new OAM[bank.oams.Length - 1];
            int   j      = 0;

            for (int i = 0; i < bank.oams.Length; i++)
            {
                if (i != numOAM.Value)
                {
                    newOAM[j++] = bank.oams[i];
                }
            }
            bank.oams = newOAM;

            numOAM.Maximum = bank.oams.Length - 1;
            label12.Text   = "of " + numOAM.Maximum.ToString();
            Read_Info((int)numOAM.Value);
            Update_Image();
        }
Example #20
0
        private void btnAddOAM_Click(object sender, EventArgs e)
        {
            int length = bank.oams.Length;

            OAM[] newOAM = new OAM[length + 1];
            Array.Copy(bank.oams, newOAM, length);
            // New oam
            newOAM[length] = new OAM();
            newOAM[length].obj0.yOffset = -128;
            newOAM[length].obj1.xOffset = -256;
            if (checkAddFirst.Checked)
            {
                newOAM[length].num_cell = 0;            // Set this OAM as the first, with more priority in this layer so visible
                for (int i = 0; i < length; i++)        // And increment the number of each OAM to fix that
                {
                    newOAM[i].num_cell++;
                }
            }
            else
            {
                newOAM[length].num_cell = (ushort)length;   // Set to the background of the layer
            }
            bank.oams = newOAM;
            OAM oam = newOAM[length];

            // Reorder the cells due to the new num_cell and priority
            List <OAM> cells = new List <OAM>();

            cells.AddRange(bank.oams);
            cells.Sort(Actions.Comparision_OAM);
            bank.oams = cells.ToArray();

            // Update
            numOAM.Maximum = bank.oams.Length - 1;
            label12.Text   = "of " + numOAM.Maximum.ToString();

            numOAM.Value = Array.IndexOf(bank.oams, oam);
            Read_Info((int)numOAM.Value);
            Update_Image();
        }
Example #21
0
        private void numNumOAM_ValueChanged(object sender, EventArgs e)
        {
            if (stop)
            {
                return;
            }

            bank.oams[(int)numOAM.Value].num_cell = (ushort)numNumOAM.Value;

            OAM currOAM = bank.oams[(int)numOAM.Value];

            // Reorder the cells due to the new priority
            List <OAM> cells = new List <OAM>();

            cells.AddRange(bank.oams);
            cells.Sort(Actions.Comparision_OAM);
            bank.oams = cells.ToArray();

            numOAM.Value = Array.IndexOf(bank.oams, currOAM);
            Read_Info((int)numOAM.Value);
            Update_Image();
        }
Example #22
0
        /// <summary>
        /// Adds an affine sprite to the given frame, positioned at 'screen' coordinates, transformed by 'vectors'
        /// </summary>
        void AddAffine(bool bigAffine, int frame, Point screen, float[] vectors, Point sheet, Size size)
        {
            var shapesize = OAM.GetShapeSize(size);

            Frames[frame].Sprites.Add(new OAM(
                                          shapesize.Item1, shapesize.Item2,
                                          (Int16)(screen.X - BattleAnimation.SCREEN_OFFSET_X_R),
                                          (Int16)(screen.Y - BattleAnimation.SCREEN_OFFSET_Y),
                                          0x00, 0x00,
                                          OAM_GFXMode.Normal,
                                          (bigAffine) ? OAM_OBJMode.BigAffine : OAM_OBJMode.Affine,
                                          false,
                                          false,
                                          (byte)sheet.X, (byte)sheet.Y,
                                          (byte)Frames[frame].Affines.Count));

            Frames[frame].Affines.Add(new OAM_Affine(
                                          vectors[0],
                                          vectors[1],
                                          vectors[2],
                                          vectors[3]));
        }
Example #23
0
        public override void Read(string fileIn)
        {
            //System.Xml.Linq.XElement xml = Tools.Helper.GetTranslation("NCER");
            //Console.WriteLine("NCER {0}<pre>", Path.GetFileName(file));
            BinaryReader br = new BinaryReader(File.OpenRead(fileIn));

            ncer = new sNCER();

            // Generic header
            ncer.header.id        = br.ReadChars(4);
            ncer.header.endianess = br.ReadUInt16();
            if (ncer.header.endianess == 0xFFFE)
            {
                ncer.header.id.Reverse <char>();
            }
            ncer.header.constant    = br.ReadUInt16();
            ncer.header.file_size   = br.ReadUInt32();
            ncer.header.header_size = br.ReadUInt16();
            ncer.header.nSection    = br.ReadUInt16();

            // CEBK (CEll BanK)
            ncer.cebk.id           = br.ReadChars(4);
            ncer.cebk.section_size = br.ReadUInt32();
            ncer.cebk.nBanks       = br.ReadUInt16();
            ncer.cebk.tBank        = br.ReadUInt16();
            ncer.cebk.constant     = br.ReadUInt32();
            ncer.cebk.block_size   = br.ReadUInt32() & 0xFF;
            ncer.cebk.unknown1     = br.ReadUInt32();
            ncer.cebk.unknown2     = br.ReadUInt64();
            ncer.cebk.banks        = new sNCER.Bank[ncer.cebk.nBanks];

            //Console.WriteLine(xml.Element("S0B").Value + ": 0x{0:X}", ncer.cebk.block_size);
            //Console.WriteLine(xml.Element("S0C").Value + ": 0x{0:X}", ncer.cebk.unknown1);
            //Console.WriteLine(xml.Element("S09").Value + ": {0}", ncer.cebk.tBank.ToString());
            //Console.WriteLine(xml.Element("S08").Value + ": {0}", ncer.cebk.nBanks.ToString());

            uint tilePos = 0x00; // If unknown1 != 0x00

            #region Read banks
            for (int i = 0; i < ncer.cebk.nBanks; i++)
            {
                ncer.cebk.banks[i].nCells      = br.ReadUInt16();
                ncer.cebk.banks[i].unknown1    = br.ReadUInt16();
                ncer.cebk.banks[i].cell_offset = br.ReadUInt32();

                if (ncer.cebk.tBank == 0x01)
                {
                    ncer.cebk.banks[i].xMax = br.ReadInt16();
                    ncer.cebk.banks[i].yMax = br.ReadInt16();
                    ncer.cebk.banks[i].xMin = br.ReadInt16();
                    ncer.cebk.banks[i].yMin = br.ReadInt16();
                }

                long posicion = br.BaseStream.Position;
                if (ncer.cebk.tBank == 0x00)
                {
                    br.BaseStream.Position += (ncer.cebk.nBanks - (i + 1)) * 8 + ncer.cebk.banks[i].cell_offset;
                }
                else
                {
                    br.BaseStream.Position += (ncer.cebk.nBanks - (i + 1)) * 0x10 + ncer.cebk.banks[i].cell_offset;
                }

                //Console.WriteLine("<br>--------------");
                //Console.WriteLine(xml.Element("S01").Value + " {0}:", i.ToString());
                //Console.WriteLine("|_" + xml.Element("S19").Value + ": {0}", ncer.cebk.banks[i].nCells.ToString());
                //Console.WriteLine("|_" + xml.Element("S1A").Value + ": {0}", ncer.cebk.banks[i].unknown1.ToString());
                //Console.WriteLine("|_" + xml.Element("S1B").Value + ": {0}", ncer.cebk.banks[i].cell_offset.ToString());

                ncer.cebk.banks[i].oams = new OAM[ncer.cebk.banks[i].nCells];
                #region Read cells
                for (int j = 0; j < ncer.cebk.banks[i].nCells; j++)
                {
                    ushort obj0 = br.ReadUInt16();
                    ushort obj1 = br.ReadUInt16();
                    ushort obj2 = br.ReadUInt16();

                    ncer.cebk.banks[i].oams[j]          = Actions.OAMInfo(new ushort[] { obj0, obj1, obj2 });
                    ncer.cebk.banks[i].oams[j].num_cell = (ushort)j;

                    if (ncer.cebk.unknown1 != 0x00)
                    {
                        ncer.cebk.banks[i].oams[j].obj2.tileOffset += tilePos;
                    }

                    // Calculate the size
                    Size cellSize = Actions.Get_OAMSize(ncer.cebk.banks[i].oams[j].obj0.shape, ncer.cebk.banks[i].oams[j].obj1.size);
                    ncer.cebk.banks[i].oams[j].height = (ushort)cellSize.Height;
                    ncer.cebk.banks[i].oams[j].width  = (ushort)cellSize.Width;
                    //if (ncer.cebk.banks[i].oams[j].obj0.doubleSize == 1)
                    //{
                    //    ncer.cebk.banks[i].oams[j].width *= 2;
                    //    ncer.cebk.banks[i].oams[j].height *= 2;
                    //}

                    //Console.WriteLine("|_" + xml.Element("S1C").Value + " {0}:", j.ToString());
                    //Console.WriteLine("    " + xml.Element("S1D").Value + ": {0}", ncer.cebk.banks[i].cells[j].obj0.yOffset.ToString());
                    //Console.WriteLine("    " + xml.Element("S1E").Value + ": {0}", ncer.cebk.banks[i].cells[j].obj1.xOffset.ToString());
                    //Console.WriteLine("    " + xml.Element("S1F").Value + ": {0}", ncer.cebk.banks[i].cells[j].width.ToString());
                    //Console.WriteLine("    " + xml.Element("S20").Value + ": {0}", ncer.cebk.banks[i].cells[j].height.ToString());
                    //Console.WriteLine("    " + xml.Element("S21").Value + ": {0}", ncer.cebk.banks[i].cells[j].obj2.index_palette.ToString());
                    //Console.WriteLine("    " + xml.Element("S22").Value + ": {0}", (obj2 & 0x03FF).ToString());
                    //Console.WriteLine("    " + xml.Element("S23").Value + ": {0}", ncer.cebk.banks[i].cells[j].obj2.tileOffset.ToString());
                    //Console.WriteLine("    " + "Object priority" + ": {0}", ncer.cebk.banks[i].cells[j].obj2.priority.ToString());
                }
                #endregion

                // Sort the oam using the priority value
                List <OAM> oams = new List <OAM>();
                oams.AddRange(ncer.cebk.banks[i].oams);
                oams.Sort(Comparision_Cell);
                ncer.cebk.banks[i].oams = oams.ToArray();

                // Calculate the next tileOffset if unknonw1 != 0
                if (ncer.cebk.unknown1 != 0x00 && ncer.cebk.banks[i].nCells != 0x00)
                {
                    OAM last_oam = Get_LastOAM(ncer.cebk.banks[i]);

                    int ultimaCeldaSize = (int)(last_oam.height * last_oam.width);
                    ultimaCeldaSize /= (int)(64 << (byte)ncer.cebk.block_size);
                    if (last_oam.obj0.depth == 1)
                    {
                        ultimaCeldaSize *= 2;
                    }
                    if (ultimaCeldaSize == 0)
                    {
                        ultimaCeldaSize = 1;
                    }

                    tilePos += (uint)((last_oam.obj2.tileOffset - tilePos) + ultimaCeldaSize);

                    //if (ncer.cebk.unknown1 == 0x160 && i == 5) // I don't know why it works
                    //    tilePos -= 3;
                    //if (ncer.cebk.unknown1 == 0x110 && i == 4) // (ncer.cebk.unknown1 & FC0) >> 6 (maybe ?)
                    //    tilePos -= 7;
                }
                br.BaseStream.Position = posicion;
                //Console.WriteLine("--------------");
            }
            #endregion

            #region LABL
            br.BaseStream.Position = ncer.header.header_size + ncer.cebk.section_size;
            List <uint>   offsets = new List <uint>();
            List <String> names   = new List <string>();
            ncer.labl.names = new string[ncer.cebk.nBanks];

            ncer.labl.id = br.ReadChars(4);
            if (new String(ncer.labl.id) != "LBAL")
            {
                goto Tercera;
            }
            ncer.labl.section_size = br.ReadUInt32();

            // Name offset
            for (int i = 0; i < ncer.cebk.nBanks; i++)
            {
                uint offset = br.ReadUInt32();
                if (offset >= ncer.labl.section_size - 8)
                {
                    br.BaseStream.Position -= 4;
                    break;
                }

                offsets.Add(offset);
            }
            ncer.labl.offset = offsets.ToArray();

            // Names
            for (int i = 0; i < ncer.labl.offset.Length; i++)
            {
                names.Add("");
                byte c = br.ReadByte();
                while (c != 0x00)
                {
                    names[i] += (char)c;
                    c         = br.ReadByte();
                }
            }
Tercera:
            for (int i = 0; i < ncer.cebk.nBanks; i++)
            {
                if (names.Count > i)
                {
                    ncer.labl.names[i] = names[i];
                }
                else
                {
                    ncer.labl.names[i] = i.ToString();
                }
            }
            #endregion

            #region UEXT
            ncer.uext.id = br.ReadChars(4);
            if (new String(ncer.uext.id) != "TXEU")
            {
                goto Fin;
            }

            ncer.uext.section_size = br.ReadUInt32();
            ncer.uext.unknown      = br.ReadUInt32();
            #endregion

Fin:
            br.Close();
            //Console.WriteLine("</pre>EOF");

            Set_Banks(Convert_Banks(), ncer.cebk.block_size, true);
        }
Example #24
0
                    public void RenderSprites(PPU aPPU, int aScanline)
                    {
                        Color[] displayPixels = gbDisplay.Pixels;
                        byte[]  vram          = aPPU.VRAM;
                        int     texWid        = gbDisplay.TextureWidth;

                        OAM aOAM = aPPU.OAM;

                        int objHeight = aPPU.LCDControlInfo.SpriteMode;

                        int i           = aScanline;
                        int renderedObj = 0;

                        aOAM.SortByPosX(i, objHeight);

                        for (int objIdx = 10; objIdx >= 0; --objIdx)
                        {
                            OAM.ObjAttributes obj = aOAM.GetObjAttributesSorted(objIdx);

                            if (obj == null)
                            {
                                continue;
                            }

                            int yPos    = obj.PosY - 16;
                            int xPos    = obj.PosX - 8;
                            int tileIdx = obj.TileIdx;
                            int palData = (obj.ObjPalIdx == 1) ? aPPU.ObjectPalette1 : aPPU.ObjectPalette0;

                            if (i >= yPos && i < (yPos + objHeight))
                            {
                                for (int j = 0; j < 8; ++j)
                                {
                                    int line  = (obj.FlipV) ? ((objHeight - 1) - (aPPU.CurScanline - yPos)) : (aPPU.CurScanline - yPos);
                                    int pixel = xPos + j;

                                    if (pixel < 0 || pixel > 159 || i < 0 || i > 143)
                                    {
                                        continue;
                                    }

                                    int lineDataL = vram[(tileIdx * 16) + (2 * line)];
                                    int lineDataH = vram[(tileIdx * 16) + (2 * line) + 1];
                                    int colData   = (obj.FlipH) ? (1 << j) : (1 << (7 - j));
                                    int palIdx    = (((lineDataL & colData) > 0) ? 1 : 0) + (((lineDataH & colData) > 0) ? 2 : 0);

                                    int colorIdx = 0;
                                    int hi       = 0;
                                    int lo       = 0;

                                    // which bits of the colour palette does the colour id map to?
                                    switch (palIdx)
                                    {
                                    case 0: hi = 1; lo = 0; break;

                                    case 1: hi = 3; lo = 2; break;

                                    case 2: hi = 5; lo = 4; break;

                                    case 3: hi = 7; lo = 6; break;
                                    }

                                    // use the palette to get the colour
                                    int color = 0;
                                    color  = ((palData >> hi) & 0x1) << 1;
                                    color |= ((palData >> lo) & 0x1);

                                    if (palIdx > 0)
                                    {
                                        // Only appears above BG color0
                                        if (obj.BGPriority == 1)
                                        {
                                            if (m_bgRowColors[pixel] == 0)
                                            {
                                                displayPixels[(i * texWid) + pixel] = m_LCDColor[color];
                                            }
                                        }
                                        else
                                        {
                                            displayPixels[(i * texWid) + pixel] = m_LCDColor[color];
                                        }
                                    }
                                }

                                ++renderedObj;
                            }

                            // Check limit of 10 sprites per scanline
                            if (renderedObj >= 10)
                            {
                                break;
                            }
                        }
                    }
Example #25
0
        public override void Read(string fileIn)
        {
            ncob = new sNCOB();
            BinaryReader br = new BinaryReader(File.OpenRead(fileIn));

            // Read the header
            ncob.generic.id          = br.ReadChars(4);
            ncob.generic.endianess   = br.ReadUInt16();
            ncob.generic.constant    = br.ReadUInt16();
            ncob.generic.file_size   = br.ReadUInt32();
            ncob.generic.header_size = br.ReadUInt16();
            ncob.generic.nSection    = br.ReadUInt16();

            for (int i = 0; i < ncob.generic.nSection; i++)
            {
                string type = new String(br.ReadChars(4));

                switch (type)
                {
                case "CELL":
                    ncob.cell.type      = "CELL".ToCharArray();
                    ncob.cell.size      = br.ReadUInt32();
                    ncob.cell.num_banks = br.ReadUInt32();
                    ncob.cell.banks     = new Ekona.Images.Bank[ncob.cell.num_banks];

                    for (int b = 0; b < ncob.cell.num_banks; b++)
                    {
                        ncob.cell.banks[b]      = new Ekona.Images.Bank();
                        ncob.cell.banks[b].oams = new OAM[br.ReadUInt32()];

                        for (int o = 0; o < ncob.cell.banks[b].oams.Length; o++)
                        {
                            OAM oam = new OAM();
                            oam.obj1.xOffset = br.ReadInt16();
                            oam.obj0.yOffset = br.ReadInt16();
                            ushort unk1 = br.ReadUInt16();
                            if (unk1 != 0)
                            {
                                System.Windows.Forms.MessageBox.Show("Unk1 different to 0");
                            }
                            oam.obj1.flipX = br.ReadByte();
                            oam.obj1.flipY = br.ReadByte();
                            uint unk2 = br.ReadUInt32();
                            if (unk2 != 0)
                            {
                                System.Windows.Forms.MessageBox.Show("Unk2 different to 0");
                            }
                            oam.obj0.shape         = br.ReadByte();
                            oam.obj1.size          = br.ReadByte();
                            oam.obj2.priority      = br.ReadByte();
                            oam.obj2.index_palette = br.ReadByte();
                            oam.obj2.tileOffset    = br.ReadUInt32();

                            oam.width    = (ushort)Actions.Get_OAMSize(oam.obj0.shape, oam.obj1.size).Width;
                            oam.height   = (ushort)Actions.Get_OAMSize(oam.obj0.shape, oam.obj1.size).Height;
                            oam.num_cell = (ushort)o;

                            ncob.cell.banks[b].oams[o] = oam;
                        }
                    }
                    break;

                case "CHAR":
                    ncob.chars.type      = "CHAR".ToCharArray();
                    ncob.chars.size      = br.ReadUInt32();
                    ncob.chars.unknown   = br.ReadUInt32();
                    ncob.chars.data_size = br.ReadUInt32();
                    ncob.chars.data      = br.ReadBytes((int)ncob.chars.data_size);

                    break;

                default:
                    uint size = br.ReadUInt32();
                    br.BaseStream.Position += size - 8;
                    break;
                }
            }

            br.Close();

            img = new RawImage(ncob.chars.data, TileForm.Horizontal, ColorFormat.colors16,
                               0x20, ncob.chars.data.Length / 0x20, false);
            Set_Banks(ncob.cell.banks, 0, false);
        }
Example #26
0
 public static Sprite GetSprite(OAM pOAM)
 {
     return(instance.findSprite(pOAM));
 }
Example #27
0
        private void Read_Info(int i)
        {
            OAM oam = bank.oams[i];

            stop = true;

            // Obj0
            numYoffset.Value = oam.obj0.yOffset;
            if (oam.obj0.rs_flag == 0)
            {
                checkRSflag.Checked     = false;
                checkObjdisable.Enabled = true;
                checkDoubleSize.Enabled = false;

                checkFlipX.Enabled   = true;
                checkFlipY.Enabled   = true;
                numSelectPar.Enabled = false;
            }
            else
            {
                checkRSflag.Checked     = true;
                checkObjdisable.Enabled = false;
                checkDoubleSize.Enabled = true;

                checkFlipX.Enabled   = false;
                checkFlipY.Enabled   = false;
                numSelectPar.Enabled = true;
            }
            checkDoubleSize.Checked    = (oam.obj0.doubleSize == 0) ? false : true;
            checkObjdisable.Checked    = (oam.obj0.objDisable == 0) ? false : true;
            comboObjMode.SelectedIndex = oam.obj0.objMode;
            checkMosaic.Checked        = (oam.obj0.mosaic_flag == 0) ? false : true;
            comboDepth.SelectedIndex   = oam.obj0.depth;
            comboShape.SelectedIndex   = oam.obj0.shape;

            // Obj1
            numXpos.Value      = oam.obj1.xOffset;
            numSelectPar.Value = oam.obj1.select_param;
            checkFlipX.Checked = (oam.obj1.flipX == 0) ? false : true;
            checkFlipY.Checked = (oam.obj1.flipY == 0) ? false : true;
            numSize.Value      = oam.obj1.size;

            // Obj2
            numOffset.Value = oam.obj2.tileOffset;
            numPrio.Value   = oam.obj2.priority;
            numPal.Value    = oam.obj2.index_palette;

            // Auto size
            switch (oam.obj0.shape)
            {
            case 0:
                if (oam.obj1.size == 0)
                {
                    comboSize.SelectedIndex = 0;
                }
                else if (oam.obj1.size == 1)
                {
                    comboSize.SelectedIndex = 1;
                }
                else if (oam.obj1.size == 2)
                {
                    comboSize.SelectedIndex = 2;
                }
                else if (oam.obj1.size == 3)
                {
                    comboSize.SelectedIndex = 3;
                }
                break;

            case 1:
                if (oam.obj1.size == 0)
                {
                    comboSize.SelectedIndex = 4;
                }
                else if (oam.obj1.size == 1)
                {
                    comboSize.SelectedIndex = 5;
                }
                else if (oam.obj1.size == 2)
                {
                    comboSize.SelectedIndex = 6;
                }
                else if (oam.obj1.size == 3)
                {
                    comboSize.SelectedIndex = 7;
                }
                break;

            case 2:
                if (oam.obj1.size == 0)
                {
                    comboSize.SelectedIndex = 8;
                }
                else if (oam.obj1.size == 1)
                {
                    comboSize.SelectedIndex = 9;
                }
                else if (oam.obj1.size == 2)
                {
                    comboSize.SelectedIndex = 10;
                }
                else if (oam.obj1.size == 3)
                {
                    comboSize.SelectedIndex = 11;
                }
                break;
            }

            numNumOAM.Value = oam.num_cell;
            stop            = false;
        }
Example #28
0
        public override void Write(string fileOut, ImageBase image, PaletteBase palette)
        {
            Update_Struct();

            BinaryWriter bw = new BinaryWriter(File.OpenWrite(fileOut));

            // Generic header
            bw.Write(ncer.header.id);
            bw.Write(ncer.header.endianess);
            bw.Write(ncer.header.constant);
            bw.Write(ncer.header.file_size);
            bw.Write(ncer.header.header_size);
            bw.Write(ncer.header.nSection);

            // CEBK section (CEll BanK)
            bw.Write(ncer.cebk.id);
            bw.Write(ncer.cebk.section_size);
            bw.Write(ncer.cebk.nBanks);
            bw.Write(ncer.cebk.tBank);
            bw.Write(ncer.cebk.constant);
            bw.Write(ncer.cebk.block_size);
            bw.Write(0x00); // I don't like when it's different to 0 ;)
            bw.Write(ncer.cebk.unknown2);

            // Banks
            for (int i = 0; i < ncer.cebk.banks.Length; i++)
            {
                bw.Write(ncer.cebk.banks[i].nCells);
                bw.Write(ncer.cebk.banks[i].unknown1);
                bw.Write(ncer.cebk.banks[i].cell_offset);

                if (ncer.cebk.tBank == 1)
                {
                    bw.Write(ncer.cebk.banks[i].xMax);
                    bw.Write(ncer.cebk.banks[i].yMax);
                    bw.Write(ncer.cebk.banks[i].xMin);
                    bw.Write(ncer.cebk.banks[i].yMin);
                }
            }

            // OAMs
            for (int i = 0; i < ncer.cebk.banks.Length; i++)
            {
                for (int j = 0; j < ncer.cebk.banks[i].nCells; j++)
                {
                    OAM      oam = ncer.cebk.banks[i].oams[j];
                    ushort[] obj = Actions.OAMInfo(oam);

                    bw.Write(BitConverter.GetBytes(obj[0]));
                    bw.Write(BitConverter.GetBytes(obj[1]));
                    bw.Write(BitConverter.GetBytes(obj[2]));
                }
            }

            while (bw.BaseStream.Position % 4 != 0)
            {
                bw.Write((byte)0x00);
            }

            // LBAL section
            if (new string(ncer.labl.id) == "LBAL" || new string(ncer.labl.id) == "LABL")
            {
                bw.Write(ncer.labl.id);
                bw.Write(ncer.labl.section_size);
                for (int i = 0; i < ncer.labl.offset.Length; i++)
                {
                    bw.Write(ncer.labl.offset[i]);
                }
                for (int i = 0; i < ncer.labl.offset.Length; i++)
                {
                    bw.Write((ncer.labl.names[i] + '\0').ToCharArray());
                }
            }

            // UEXT section
            if (new string(ncer.uext.id) == "UEXT" || new string(ncer.uext.id) == "TXEU")
            {
                bw.Write(ncer.uext.id);
                bw.Write(ncer.uext.section_size);
                bw.Write(ncer.uext.unknown);
            }

            bw.Flush();
            bw.Close();
        }
Example #29
0
        private void btnAddOAM_Click(object sender, EventArgs e)
        {
            int length = bank.oams.Length;

            OAM[] newOAM = new OAM[length + 1];
            Array.Copy(bank.oams, newOAM, length);
            // New oam
            newOAM[length] = new OAM();
            newOAM[length].obj0.yOffset = -128;
            newOAM[length].obj1.xOffset = -256;
            if (checkAddFirst.Checked)
            {
                newOAM[length].num_cell = 0;            // Set this OAM as the first, with more priority in this layer so visible
                for (int i = 0; i < length; i++)        // And increment the number of each OAM to fix that
                    newOAM[i].num_cell++;
            }
            else
                newOAM[length].num_cell = (ushort)length;   // Set to the background of the layer
            bank.oams = newOAM;
            OAM oam = newOAM[length];

            // Reorder the cells due to the new num_cell and priority
            List<OAM> cells = new List<OAM>();
            cells.AddRange(bank.oams);
            cells.Sort(Actions.Comparision_OAM);
            bank.oams = cells.ToArray();

            // Update
            numOAM.Maximum = bank.oams.Length - 1;
            label12.Text = "of " + numOAM.Maximum.ToString();

            numOAM.Value = Array.IndexOf(bank.oams, oam);
            Read_Info((int)numOAM.Value);
            Update_Image();
        }
Example #30
0
        private void btnRemOAM_Click(object sender, EventArgs e)
        {
            OAM[] newOAM = new OAM[bank.oams.Length - 1];
            int j = 0;
            for (int i = 0; i < bank.oams.Length; i++)
                if (i != numOAM.Value)
                    newOAM[j++] = bank.oams[i];
            bank.oams = newOAM;

            numOAM.Maximum = bank.oams.Length - 1;
            label12.Text = "of " + numOAM.Maximum.ToString();
            Read_Info((int)numOAM.Value);
            Update_Image();
        }