/// <summary> /// Creates a deep copy of this instance. /// </summary> /// <returns></returns> public MinecartObject Copy() { MinecartObject copy = new MinecartObject(Type, X, Y, Count); copy.Location = Location; return(copy); }
private void pictureBoxScreens_MouseMove(object sender, MouseEventArgs e) { int x = e.X - diffX; int y = e.Y - diffY; if (x > picture.Width - 1) { x = picture.Width - 1; } if (x < 0) { x = 0; } if (y > picture.Height - 1) { y = picture.Height - 1; } if (y < 0) { y = 0; } // if (mouseDownObject >= 0 && e.Button == MouseButtons.Left) { objectsForm.X.Value = Math.Max(256, x); objectsForm.Y.Value = y; } else if (toggleObjects.Checked) { for (int i = 0; i < MinecartObjects.Count; i++) { MinecartObject mco = MinecartObjects[i]; if (x >= mco.X && x < mco.X + mco.Width && y >= mco.Y && y < mco.Y + 16) { picture.Cursor = Cursors.Hand; mouseOverObject = i; break; } else { picture.Cursor = Cursors.Arrow; mouseOverObject = -1; } } } }
// Collection editing private void newObject_Click(object sender, EventArgs e) { if (minecartObjects.Count >= 255) { MessageBox.Show("Cannot have more than 255 objects."); return; } int index = ObjectIndex; int x = Math.Abs(screensForm.ScreensPanel.AutoScrollPosition.X); MinecartObject newObject = new MinecartObject(1, Math.Max(272, x + 16), 16, 1); minecartObjects.Insert(ObjectIndex + 1, newObject); listBoxObjects.Items.Clear(); for (int i = 0; i < minecartObjects.Count; i++) { listBoxObjects.Items.Add("Object " + i); } ObjectIndex = index + 1; }
// Read/write ROM private void ReadFromROM() { // mode7 objects int offset = Bits.GetShort(Buffer, 0); Mode7ObjectsA = new MinecartObject[8]; Mode7ObjectsB = new MinecartObject[8]; for (int i = 0; i < 8; i++) { Mode7ObjectsA[i] = new MinecartObject(Buffer[offset++], Buffer[offset++]); } for (int i = 0; i < 8; i++) { Mode7ObjectsB[i] = new MinecartObject(Buffer[offset++], Buffer[offset++]); } // side-scrolling objects A SSObjectsA = new List <MinecartObject>(); offset = Bits.GetShort(Buffer, 2); WidthA = Bits.GetShort(Buffer, offset); offset += 2; while (Bits.GetShort(Buffer, offset) != 0xFFFF) { int x = Bits.GetShort(Buffer, offset) + 256; offset += 2; int type = Buffer[offset++]; int size = Buffer[offset++]; int y = Buffer[offset++]; SSObjectsA.Add(new MinecartObject(type, x, y, size)); } // side-scrolling objects B SSObjectsB = new List <MinecartObject>(); offset = Bits.GetShort(Buffer, 4); WidthB = Bits.GetShort(Buffer, offset); offset += 2; while (Bits.GetShort(Buffer, offset) != 0xFFFF) { int x = Bits.GetShort(Buffer, offset) + 256; offset += 2; int type = Buffer[offset++]; int size = Buffer[offset++]; int y = Buffer[offset++]; SSObjectsB.Add(new MinecartObject(type, x, y, size)); } // side-scrolling L1 screens L1Screens = new List <int>(); offset = Bits.GetShort(Buffer, 6); while (offset != Bits.GetShort(Buffer, 8)) { L1Screens.Add(Buffer[offset++]); } // side-scrolling L2 screens L2Screens = new List <int>(); offset = Bits.GetShort(Buffer, 8); while (offset != Bits.GetShort(Buffer, 10)) { L2Screens.Add(Buffer[offset++]); } // side-scrolling rail screens (2nd map) RailScreens = new List <int>(); offset = Bits.GetShort(Buffer, 10); while (offset < Buffer.Length) { RailScreens.Add(Buffer[offset++]); } }
// Picture private void pictureBoxScreens_Paint(object sender, PaintEventArgs e) { if (L1Indexes.Count == 0) { return; } e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bicubic; Rectangle dst; Rectangle src; // Draw screens for (int i = 0; i < L1Indexes.Count; i++) { dst = new Rectangle(i * 256, 0, 256, 256); if (L1Indexes[i] < L1Indexes.Count) { src = new Rectangle(0, 0, 256, 256); if (screenIndex < screenImages.Count) { if (Index == 3 && i % 2 == 0) { if (ScreenBGImage == null) { int[] BGPixels = Do.TilesetToPixels(BGTileset.Tileset_tiles, 32, 16, 0, false); ScreenBGImage = Do.PixelsToImage(BGPixels, 512, 256); } dst.Width = 512; src.Width = 512; e.Graphics.DrawImage(ScreenBGImage, dst, src, GraphicsUnit.Pixel); dst.Width = 256; src.Width = 256; } e.Graphics.DrawImage(screenImages[i], dst, src, GraphicsUnit.Pixel); } } else { Font font = new Font("Tahoma", 10F, FontStyle.Bold); SizeF size = e.Graphics.MeasureString("(INVALID SCREEN INDEX)", font, new PointF(0, 0), StringFormat.GenericDefault); Point point = new Point(((256 - (int)size.Width) / 2) + (i * 256), (256 - (int)size.Height) / 2); Do.DrawString(e.Graphics, point, "(INVALID SCREEN INDEX)", Color.Black, Color.Red, font); } if (this.screenIndex == i) { Pen pen = new Pen(new SolidBrush(Color.Gray), 2); pen.DashStyle = DashStyle.Dot; e.Graphics.DrawRectangle(pen, new Rectangle(i * 256, 0, 256 - 1, 256 - 1)); } } // Draw objects for (int i = 0; toggleObjects.Checked && i < MinecartObjects.Count; i++) { MinecartObject obj = MinecartObjects[i]; Pen pen; if (objectIndex == i) { pen = new Pen(Color.Red, 2); } else { pen = new Pen(Color.Red, 1); } e.Graphics.DrawRectangle(pen, new Rectangle(obj.X - 1, obj.Y - 1, obj.Count * 32 - 16 + 2, 16 + 2)); Bitmap image = obj.Type == 1 ? MinecartData.Coin : MinecartData.Mushroom; for (int x = 0; x < obj.Count; x++) { e.Graphics.DrawImage(image, x * 32 + obj.X, obj.Y, 16, 16); } } }