/// <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)); }
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); } } }
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); }
/// <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); }
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; }
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); }
internal void RefreshSprite(uint[] pixels, OAM oam) { Utils.TransferBytesToWriteableBitmap(_spriteImage, pixels); OnPropertyChanged(() => SpriteImage); _spriteData = oam; OnPropertyChanged(() => SpriteData); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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); } }
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) => { }; }
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); } }
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(); }
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(); }
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(); }
/// <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])); }
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); }
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; } } }
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); }
public static Sprite GetSprite(OAM pOAM) { return(instance.findSprite(pOAM)); }
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; }
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(); }
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(); }
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(); }