private void ToolStripMenuItem1_Click(object sender, EventArgs e) { var p = new Editors.PaletteEditorForm(resources); p.ShowDialog(); }
private void TsbPalette_Click(object sender, EventArgs e) { var p = new Editors.PaletteEditorForm(resources); p.ShowDialog(); }
public CFG_Editor(string[] args) { if (args.Length > 0) { int flag = Array.IndexOf(args, "-c"); if (flag >= 0) { Converter.Convert(args.Skip(flag + 1)); Environment.Exit(0); return; } } InitializeComponent(); #region map16 resources List <byte> gfx = new List <byte>(); gfx.AddRange(Enumerable.Repeat <byte>(0, 0x4000)); gfx.AddRange(GetGfxArray(0x33, 0x3000)); gfx.AddRange(Enumerable.Repeat <byte>(0, 0x800)); resources.Graphics = new Map16.SnesGraphics(gfx.ToArray()); resources.Palette = Editors.PaletteEditorForm.ColorArrayFromBytes(CFG.Properties.Resources.sprites_palettes, rows: 22); byte[] map16data = new byte[0x2000]; Array.Copy(CFG.Properties.Resources.m16Page1_3, map16data, 0x1800); #endregion ControlEnabler FileTypeEnabler = new ControlEnabler(() => FileType == FileType.CfgFile) { grpAsmActLike, grpExtraByteCount, grpExtraPropByte, tpgLm, tpgList, //saveAsToolStripMenuItem, }; ControlEnabler CustomEnabler = new ControlEnabler(() => FileType == FileType.CfgFile && Data.Type != (int)CFG_SpriteType.Normal) { grpAsmActLike, grpExtraByteCount, grpExtraPropByte, }; ControlEnabler ShooterEnabler = new ControlEnabler(() => FileType == FileType.CfgFile && Data.Type != (int)CFG_SpriteType.GeneratorShooter) { txt_1656, txt_1662, txt_166E, txt_167A, txt_1686, txt_190F, grp_1656, grp_1662, grp_166E, grp_167A, grp_1686, grp_190F, }; control_enablers.Add(FileTypeEnabler); control_enablers.Add(CustomEnabler); control_enablers.Add(ShooterEnabler); Data = new CfgFile(); Data.PropertyChanged += (_, e) => { Unsaved = true; if (e.PropertyName == nameof(Data.Type)) { control_enablers.ForEach(c => c.Evaluate()); } }; #region Default Tab cmb_1656_0F.BitsBind(Data, c => c.SelectedIndex, f => f.Addr1656, 4, 0).DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged; cmb_1662_3F.BitsBind(Data, c => c.SelectedIndex, f => f.Addr1662, 6, 0).DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged; cmb_166E_0E.BitsBind(Data, c => c.SelectedIndex, f => f.Addr166E, 3, 1).DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged; SetupBinding(Data, f => f.Addr1656, "1656", 0); SetupBinding(Data, f => f.Addr1662, "1662", 0); SetupBinding(Data, f => f.Addr166E, "166E", 0); SetupBinding(Data, f => f.Addr167A, "167A", 0); SetupBinding(Data, f => f.Addr1686, "1686", 0); SetupBinding(Data, f => f.Addr190F, "190F", 0); txt_0001.Bind(Data, c => c.Text, f => f.ExProp1, f => f.ToString("X2"), c => StringToByte(c)); txt_0002.Bind(Data, c => c.Text, f => f.ExProp2, f => f.ToString("X2"), c => StringToByte(c)); nudNormal.Bind(Data, c => c.Value, f => f.ByteCount, null, c => (byte)c); nudExtra.Bind(Data, c => c.Value, f => f.ExByteCount, null, c => (byte)c); txtASMFile.Bind(Data, c => c.Text, f => f.AsmFile); txtActLike.Bind(Data, c => c.Text, f => f.ActLike, f => f.ToString("X2"), c => StringToByte(c)); //add types to the comboboxes. foreach (CFG_SpriteType type in Enum.GetValues(typeof(CFG_SpriteType))) { types_list.Add(new ComboBoxItem(type.GetName(), (int)type)); } string[] sprite_list_lines = Properties.Resources.SpriteList.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < 201; i++) { sprites_list.Add(new ComboBoxItem(sprite_list_lines[i], i)); } cmbType.DataSource = types_list; //fetch clipping images from resources and add them to the comboboxes. for (int i = 0; i < objClip.Length; i++) { using (Stream str = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("CFG.Resources.ObjClipping." + i.ToString("X2") + ".png")) objClip[i] = ResizeImg(pcbObjClipping.Size, Image.FromStream(str)); cmb_1656_0F.Items.Add(i.ToString("X2")); } for (int i = 0; i < sprClip.Length; i++) { using (Stream str = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("CFG.Resources.SprClipping." + i.ToString("X2") + ".png")) sprClip[i] = ResizeImg(pcbSprClipping.Size, Image.FromStream(str)); cmb_1662_3F.Items.Add(i.ToString("X2")); } //draw bitmap of palette file for sprites. for (int i = 0; i < sprPal.Length; i++) { Bitmap b = new Bitmap(8 * 16, 16); using (Graphics g = Graphics.FromImage(b)) for (int pal = 0; pal < 8; pal++) { Color c = resources.Palette[i][pal]; Rectangle rec = new Rectangle(16 * pal, 0, 16, 16); g.FillRectangle(new SolidBrush(c), rec); } sprPal[i] = b; } #endregion #region Lunar Magic Tab cmbTilesets.Items.AddRange(new[] { new SpriteTileset(0x13, 0x02, "Forest"), new SpriteTileset(0x12, 0x03, "Castle"), new SpriteTileset(0x13, 0x05, "Mushroom"), new SpriteTileset(0x13, 0x04, "Underground"), new SpriteTileset(0x13, 0x06, "Water"), new SpriteTileset(0x13, 0x09, "Pokey"), new SpriteTileset(0x06, 0x11, "Ghost House"), new SpriteTileset(0x13, 0x20, "Banzai Bill"), new SpriteTileset(0x1C, 0x1D, "Overworld") { Sp1 = 0x10, Sp2 = 0x0F }, }); cmbTilesets.SelectedIndexChanged += (_, __) => { var tileset = (SpriteTileset)cmbTilesets.SelectedItem; SetDataSelectorGfx(dsSP1, tileset.Sp1); SetDataSelectorGfx(dsSP2, tileset.Sp2); SetDataSelectorGfx(dsSP3, tileset.Sp3); SetDataSelectorGfx(dsSP4, tileset.Sp4); }; dsSP1.Tag = 0x0000; dsSP2.Tag = 0x1000; dsSP3.Tag = 0x2000; dsSP4.Tag = 0x3000; cmbTilesets.SelectedIndex = 0; //Grid size combobox data + events foreach (GridSize gridSize in Enum.GetValues(typeof(GridSize)).Cast <GridSize>().Reverse()) { cmbGrid.Items.Add(new ComboBoxItem(gridSize.GetName(), (int)gridSize)); } cmbGrid.SelectedIndex = 0; cmbGrid.SelectedIndexChanged += (_, __) => spriteEditor1.GridSize = ((ComboBoxItem)cmbGrid.SelectedItem).Value; //------------------------------------------------------------------------------------------------------ //create binding source for later databinding. displaySpriteBindingSource.DataSource = Data; displaySpriteBindingSource.DataMember = nameof(CfgFile.DisplayEntries); //create databindings between display list and controls. BindToSourceDisplay(rtbDesc, displaySpriteBindingSource, ctrl => ctrl.Text, ds => ds.Description); BindToSourceDisplay(nudX, displaySpriteBindingSource, ctrl => ctrl.Value, ds => ds.X); BindToSourceDisplay(nudY, displaySpriteBindingSource, ctrl => ctrl.Value, ds => ds.Y); BindToSourceDisplay(chbExtraBit, displaySpriteBindingSource, ctrl => ctrl.Checked, ds => ds.ExtraBit); BindToSourceDisplay(chbUseText, displaySpriteBindingSource, ctrl => ctrl.Checked, ds => ds.UseText).DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged; displaySpriteBindingSource.CurrentChanged += (_, __) => spriteEditor1.Sprite = (DisplaySprite)displaySpriteBindingSource.Current; ConnectViewAndButtons(displaySpriteBindingSource, dgvDisplay, btnDisplayNew, btnDisplayClone, btnDisplayDelete); map16Editor1.Initialize(map16data, resources); map16Editor1.SelectionChanged += (_, e) => pnlEdit.Enabled = e.Tile >= 0x300; map16Editor1.In8x8ModeChanged += (_, __) => txtTopRight.Enabled = txtBottomLeft.Enabled = txtBottomRight.Enabled = !map16Editor1.In8x8Mode; //create databindings between map16 and controls. txtTopLeft.Bind(map16Editor1, c => c.Text, e => e.SelectedObject.TopLeft, i => i.ToString("X2"), StringToInt); txtTopRight.Bind(map16Editor1, c => c.Text, e => e.SelectedObject.TopRight, i => i.ToString("X2"), StringToInt); txtBottomLeft.Bind(map16Editor1, c => c.Text, e => e.SelectedObject.BottomLeft, i => i.ToString("X2"), StringToInt); txtBottomRight.Bind(map16Editor1, c => c.Text, e => e.SelectedObject.BottomRight, i => i.ToString("X2"), StringToInt); //linking palette combobox and property. //If you're wondering why I'm not using DataBinding for this... because for some reason it's insanly slow. 10 seconds slow... int trigger = 0; cmbPalette.SelectedIndexChanged += (_, __) => { if (cmbPalette.SelectedIndex >= 8 || trigger == 2) { return; } trigger = 1; map16Editor1.SelectedObject.Palette = cmbPalette.SelectedIndex; trigger = 0; }; map16Editor1.SelectionChanged += (_, __) => { if (trigger == 1) { return; } trigger = 2; cmbPalette.SelectedIndex = map16Editor1.SelectedObject.Palette; trigger = 0; }; btnX.Click += (_, __) => map16Editor1.SelectedObject.FlipX(); btnY.Click += (_, __) => map16Editor1.SelectedObject.FlipY(); //link sprite editor and map16 editor spriteEditor1.Map16Editor = map16Editor1; map16Editor1.HoverChanged += (_, e) => { tslHover.Text = $"Tile: {e.Tile:X3}"; }; tsb8x8Mode.CheckedChanged += (_, __) => map16Editor1.In8x8Mode = tsb8x8Mode.Checked; tsbGrid.CheckedChanged += (_, __) => map16Editor1.ShowGrid = tsbGrid.Checked; tsbPage.CheckedChanged += (_, __) => map16Editor1.PrintPage = tsbPage.Checked; tsbPalette.Click += (_, __) => { var palette_editor = new Editors.PaletteEditorForm(resources); palette_editor.PaletteChanged += (___, e) => map16Editor1.Map.PaletteChanged(e.Row); palette_editor.Show(); }; #endregion #region Custom List Tab //create binding source for later databinding. collectionSpriteBindingSource.DataSource = Data; collectionSpriteBindingSource.DataMember = nameof(CfgFile.CollectionEntries); //bind controlls to current selection in list BindToSourceCollection(txtListName, collectionSpriteBindingSource, ctrl => ctrl.Text, cs => cs.Name); BindToSourceCollection(chbListExtraBit, collectionSpriteBindingSource, ctrl => ctrl.Checked, cs => cs.ExtraBit); Binding[] expropbind = new Binding[] { txtListExProp1.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte1)), txtListExProp2.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte2)), txtListExProp3.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte3)), txtListExProp4.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte4)), txtListExProp5.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte5)), txtListExProp6.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte6)), txtListExProp7.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte7)), txtListExProp8.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte8)), txtListExProp9.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte9)), txtListExProp10.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte10)), txtListExProp11.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte11)), txtListExProp12.DataBindings.Add(nameof(TextBox.Text), collectionSpriteBindingSource, nameof(CollectionSprite.ExtraPropertyByte12)), }; expropbind.ForEach(b => { b.Format += (_, e) => e.Value = ((byte)e.Value).ToString("X2"); b.Parse += (_, e) => e.Value = StringToByte((string)e.Value); }); ConnectViewAndButtons(collectionSpriteBindingSource, dgvList, btnColNew, btnColClone, btnColRemove); #endregion if (args.Length == 0) { cmb_1656_0F.SelectedIndex = cmb_1662_3F.SelectedIndex = cmb_166E_0E.SelectedIndex = 0; Data.Clear(); } else { try { LoadFile(args[0]); } catch (Exception ex) { Data.Clear(); Filename = ""; Unsaved = false; cmb_1656_0F.SelectedIndex = cmb_1662_3F.SelectedIndex = cmb_166E_0E.SelectedIndex = 0; MessageBox.Show("An error occured while trying to read the file.\n\n" + ex.Message, "Unexpected Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } #if DEBUG testToolStripMenuItem.Visible = true; #endif }