void GenerateRoomComponents() { if (Room == null) { return; } roomComponents = new List <RoomComponent>(); hoveringComponent = null; // We only draw the 1 component if we're editing a warp destination if (EditingWarpDestination != null) { WarpDestRoomComponent com = new WarpDestRoomComponent(this, EditingWarpDestination); com.SelectedEvent += (sender, args) => { WarpEditor.SetSelectedWarp(com.warp); }; roomComponents.Add(com); goto addedAllComponents; // I love being evil } if (ViewObjects && ObjectGroupEditor.TopObjectGroup != null) { foreach (ObjectGroup group in ObjectGroupEditor.TopObjectGroup.GetAllGroups()) { for (int i = 0; i < group.GetNumObjects(); i++) { ObjectDefinition obj = group.GetObject(i); if (!obj.HasXY()) { continue; } ObjectRoomComponent com = new ObjectRoomComponent(obj); com.SelectedEvent += (sender, args) => { ObjectGroupEditor.SelectObject(obj.ObjectGroup, obj.Index); }; roomComponents.Add(com); } } } if (ViewWarps) { int index = 0; WarpGroup group = room.GetWarpGroup(); foreach (Warp warp in group.GetWarps()) { Action <int, int, int, int> addWarpComponent = (x, y, width, height) => { var rect = new Cairo.Rectangle(x, y, width, height); var com = new WarpSourceRoomComponent(this, warp, index, rect); com.SelectedEvent += (sender, args) => { WarpEditor.SetWarpIndex(com.index); }; roomComponents.Add(com); }; if (warp.WarpSourceType == WarpSourceType.Standard) { int middle; if (Room.Width == 15) // Large room { middle = ((Room.Width + 1) / 2) * 16; } else // Small room { middle = ((Room.Width + 1) / 2) * 16 + 8; } int right = Room.Width * 16; int bottom = Room.Height * 16 - 8; if (warp.TopLeft) { addWarpComponent(0, -8, middle, 16); } if (warp.TopRight) { addWarpComponent(middle, -8, right - middle, 16); } if (warp.BottomLeft) { addWarpComponent(0, bottom, middle, 16); } if (warp.BottomRight) { addWarpComponent(middle, bottom, right - middle, 16); } if (!warp.TopLeft && !warp.TopRight && !warp.BottomLeft && !warp.BottomRight) { addWarpComponent(0, 16 * 13, Room.Width * 16, 32); } } else if (warp.WarpSourceType == WarpSourceType.Pointed) { addWarpComponent(warp.SourceX * TileWidth, warp.SourceY * TileHeight, TileWidth, TileHeight); } index++; } } if (ViewChests) { if (Room.Chest != null) { ChestRoomComponent com = new ChestRoomComponent(Room.Chest); roomComponents.Add(com); } } addedAllComponents: // The "selectedComponent" now refers to an old object. Look for the corresponding new // object. RoomComponent newSelectedComponent = null; foreach (RoomComponent com in roomComponents) { if (com.Compare(selectedComponent)) { newSelectedComponent = com; break; } } selectedComponent = newSelectedComponent; QueueDraw(); }
protected void OnWarpsActionActivated(object sender, EventArgs e) { if (openedWarpEditor) return; WarpEditor editor = new WarpEditor(Project); editor.SetMap(roomSpinButton.ValueAsInt >> 8, roomSpinButton.ValueAsInt & 0xff); Gtk.Window win = new Window(WindowType.Toplevel); win.Modal = false; win.Add(editor); editor.Destroyed += delegate(object sender2, EventArgs e2) { win.Destroy(); }; win.Destroyed += delegate(object sender2, EventArgs e2) { openedWarpEditor = false; }; openedWarpEditor = true; win.ShowAll(); }