Esempio n. 1
0
        /// <summary>
        /// Ensures that an editor exists at the specified map location if it is valid.
        /// </summary>
        private void EnsureEditorExists(int x, int y)
        {
            //if (x < 0 || x > 31 || y < 0 || y > 31) return;

            bool editorPresent = false;

            foreach (ScreenEditor e in editors)
            {
                if (e.MapLocation.X == x && e.MapLocation.Y == y)
                {
                    editorPresent = true;
                }
            }

            if (!editorPresent)
            {
                ScreenEditor newEditor = new ScreenEditor();
                newEditor.EditorHost  = host;
                newEditor.MapLocation = new Point(x, y);
                newEditor.RenderScreen();
                newEditor.SelectionDragged      += new EventHandler(on_EditorSelectionDragged);
                newEditor.SelectedObjectChanged += new EventHandler(on_EditorSelectedObjectChanged);
                newEditor.UserDraggedSelection  += new EventHandler <EventArgs <Point> >(newEditor_UserDraggedSelection);
                editors.Add(newEditor);
            }
        }
Esempio n. 2
0
        private void DrawScreen(int gameX, int gameY, int mapx, int mapY)
        {
            // Get currentLevelIndex and screen
            LevelIndex level        = levelMap.GetLevel(gameX, gameY);
            bool       invalidLevel = false;

            if (level == LevelIndex.None ||
                (levelFilter != LevelIndex.None && level != levelFilter))
            {
                return;
                ////if(!fillEmptySpots) return;

                ////if(levelFilter != LevelIndex.None)
                ////    level = levelFilter;
                ////else
                ////    level = GuessLevel(gameX, gameY);

                ////if(level == LevelIndex.Tourian)
                ////    level = LevelIndex.Kraid;

                ////invalidLevel = true;
            }

            Level levelData   = rom.GetLevel(level);
            int   screenIndex = rom.GetScreenIndex(gameX, gameY);

            if (screenIndex == 0xFF || invalidLevel)  // Blank screen
            {
                screenIndex = GetBlankScreenIndex(level);
            }



            Screen screen = levelData.Screens[screenIndex];

            // Load data into renderer
            renderer.Level         = levelData;
            renderer.SelectedEnemy = -1;

            // Apply paletteIndex
            //screen.ApplyLevelPalette(screenBitmap); // Sprites
            //renderer.ApplyPalette(screenBitmap, levelMap.GetAltPal(gameX, gameY)); // Backgrounds
            ScreenEditor.ApplyPalette(levelMap.GetAltPal(gameX, gameY), levelData, screenBitmap, HighlightEffect.Invert);

            // Render Screen
            renderer.DefaultPalette = screen.ColorAttributeTable;
            renderer.Clear();
            renderer.SelectedDoor = -1;
            renderer.DrawScreen(screenIndex);
            IList <EnemyInstance> enemies = hideEnemies ? null : screen.Enemies;

            renderer.Render(b, screenBitmap, enemies, screen.Doors, showPhysics);

            Rectangle source = new Rectangle(0, 0, ScreenWidth, ScreenHeight);
            Rectangle dest   = new Rectangle(
                mapx * ScreenWidth / scale, mapY * ScreenHeight / scale,
                ScreenWidth / scale, ScreenHeight / scale);

            gMap.DrawImage(screenBitmap, dest, source, GraphicsUnit.Pixel);
        }
Esempio n. 3
0
        void Render()
        {
            Text = "Screen Browser [" + BaseIndex.ToString("x") + " - " + Math.Min(BaseIndex + 15, Level.Screens.Count - 1).ToString("x") + "]";

            gBuffer.Clear(Color.Black);
            gBuffer.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
            gBuffer.PixelOffsetMode   = System.Drawing.Drawing2D.PixelOffsetMode.Half;

            renderer.Level = this.Level;
            //renderer.ApplyPalette(blitterBuffer, UseAlternatePalette);
            //var pal = blitterBuffer.Palette;
            //if (UseAlternatePalette) {
            //    Level.BgAltPalette.ApplyTable(pal.Entries,0);
            //    Level.BgAltPalette.ApplyTable(pal.Entries, 16);
            //    Level.SpriteAltPalette.ApplyTable(pal.Entries, 32);
            //} else {
            //    Level.BgPalette.ApplyTable(pal.Entries, 0);
            //    Level.BgPalette.ApplyTable(pal.Entries, 16);
            //    Level.SpritePalette.ApplyTable(pal.Entries, 32);
            //}
            //blitterBuffer.Palette = pal;
            ScreenEditor.ApplyPalette(UseAlternatePalette, Level, blitterBuffer, HighlightEffect.Invert);



            for (int x = 0; x < 4; x++)
            {
                for (int y = 0; y < 4; y++)
                {
                    int index = BaseIndex + x + y * 4;

                    if (index < Level.Screens.Count)
                    {
                        var screen = Level.Screens[index];

                        renderer.SelectedEnemy  = -1;
                        renderer.SelectedDoor   = -1;
                        renderer.DefaultPalette = screen.ColorAttributeTable;

                        renderer.Clear();
                        renderer.DrawScreen(index);
                        renderer.Render(blitter, blitterBuffer, screen.Enemies, screen.Doors, ShowPhysics);

                        Rectangle source = new Rectangle(0, 0, 256, 240);
                        Rectangle dest   = new Rectangle(cellPadding + cellSpacingX * x, cellPadding + cellSpacingY * y, cellWidth, cellHeight);

                        gBuffer.DrawImage(blitterBuffer, dest, source, GraphicsUnit.Pixel);

                        if (index == HighlightedScreen)
                        {
                            dest.Inflate(2, 2);
                            gBuffer.DrawRectangle(SystemPens.Highlight, dest);
                            dest.Inflate(1, 1);
                            gBuffer.DrawRectangle(SystemPens.Highlight, dest);
                        }
                    }
                }
            }
        }
Esempio n. 4
0
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);

            UpdateCursor();

            // If user left clicks and item and it is the item that was previously selected
            // (oldSelection), the UI will be alerted to bring it up the structure selector
            Editroid.ROM.ObjectInstance oldSelection = null;
            if (_focus != null)
            {
                oldSelection = _focus.SelectedItem;
            }

            if ((ModifierKeys & Keys.Control) == Keys.Control)
            {
                ScreenEditor clicked = screens.GetEditorAtWorld(e.X + viewX, e.Y + viewY);
                if (clicked != _focus)
                {
                    RequestFocus(clicked);
                }

                PreviewEventArgs args = new PreviewEventArgs(
                    (ModifierKeys & Keys.Shift) == Keys.Shift,
                    new Point(e.X + viewX - _focus.WorldBounds.X, e.Y + viewY - _focus.WorldBounds.Y));

                OnLaunchPreview(args);
            }
            else
            {
                // Mouse dragging occurs with middle button, or while holding shift and/or alt
                if (e.Button == MouseButtons.Middle || UserHoldingMouseScrollKey)
                {
                    BeginDrag(e.X, e.Y);
                }
                else
                {
                    screens.SendMouseDown(e.Button, e.X + viewX, e.Y + viewY);

                    if (e.Button == MouseButtons.Left)
                    {
                        // Scroll structure selector to selected structure type if user clicks twice
                        Editroid.ROM.ObjectInstance newSelection = null;
                        if (_focus != null)
                        {
                            newSelection = _focus.SelectedItem;
                        }
                        if (newSelection != null && newSelection == oldSelection)
                        {
                            RequestShowObject.Raise(this);
                        }
                    }
                }
            }
        }
Esempio n. 5
0
        public void ScrollScreen(int dx, int dy)
        {
            Point loc = _focus.WorldBounds.Location;

            loc.Offset(ScreenEditor.CellSize.Width * dx, ScreenEditor.CellSize.Height * dy);
            ScreenEditor newEditor = screens.GetEditorAtWorld(loc.X, loc.Y);

            if (newEditor != null)  // && newEditor.CanEdit) {
            {
                RequestFocus(newEditor);
                ScrollView(-ScreenEditor.CellSize.Width * dx, -ScreenEditor.CellSize.Height * dy);
            }
        }
Esempio n. 6
0
        public void PaintScans(RectangleF[] scans, Graphics g)
        {
            // List of invalid regions, one for each editor
            Rectangle[] invalidWorldRects = new Rectangle[editors.Count];
            Rectangle   BlankRect         = new Rectangle();

            // Invalidate editors
            for (int scanIndex = 0; scanIndex < scans.Length; scanIndex++)
            {
                Rectangle invalidWorldRect = Rectangle.Truncate(scans[scanIndex]);
                invalidWorldRect.X += host.WorldViewport.X;
                invalidWorldRect.Y += host.WorldViewport.Y;
                invalidWorldRect.Inflate(1, 1);

                // Check this invalid scan against each editor's bounds.
                for (int i = 0; i < editors.Count; i++)
                {
                    ScreenEditor e = editors[i];
                    Rectangle    editorWorldRect = e.WorldBounds;

                    // If they overlap, invalidate the editor
                    if (invalidWorldRect.IntersectsWith(editorWorldRect))
                    {
                        Rectangle invalidClippedWorldRect = editorWorldRect;
                        invalidClippedWorldRect.Intersect(invalidWorldRect);

                        if (invalidWorldRects[i] == BlankRect)
                        {
                            // Initialize the editor with its first invalid rect
                            invalidWorldRects[i] = invalidClippedWorldRect;
                        }
                        else
                        {
                            // Or expand the editor's invalid rect to include this invalid scan.
                            invalidWorldRects[i] = Rectangle.Union(invalidWorldRects[i], invalidWorldRect);
                        }
                    }
                }
            }

            for (int i = 0; i < editors.Count; i++)
            {
                ScreenEditor e = editors[i];
                if (invalidWorldRects[i] != BlankRect)
                {
                    e.Paint(invalidWorldRects[i], g);
                }
            }
        }
Esempio n. 7
0
 internal void SendMouseMove(System.Windows.Forms.MouseButtons buttons, int x, int y)
 {
     if (mouseCapture == null)
     {
         ScreenEditor mouseEditor = GetEditorAtWorld(x, y);
         if (mouseEditor != null)
         {
             mouseEditor.OnMouseMove(buttons, x, y);
         }
     }
     else
     {
         mouseCapture.OnMouseMove(buttons, x, y);
     }
 }
Esempio n. 8
0
        private void CreateAndDestroyEditors()
        {
            if (host == null)
            {
                return;
            }
            Rectangle view = host.WorldViewport;

            // Destroy editors out of view
            for (int i = 0; i < editors.Count; i++)
            {
                ScreenEditor editor = editors[i];

                Rectangle bounds = editor.WorldBounds;
                if (!bounds.IntersectsWith(view) && host.FocusedEditor != editor)
                {
                    editor.Dispose();
                    editor.SelectionDragged      -= new EventHandler(on_EditorSelectionDragged);
                    editor.SelectedObjectChanged -= new EventHandler(on_EditorSelectedObjectChanged);
                    editor.UserDraggedSelection  -= new EventHandler <EventArgs <Point> >(newEditor_UserDraggedSelection);
                    editors.RemoveAt(i);
                    i--;
                }
            }

            int gridLeft = view.X / ScreenEditor.CellSize.Width; //Math.Max(view.xTile / ScreenEditor.CellSize.Width, 0);

            if (view.X < 0)
            {
                gridLeft--;
            }
            int gridRight = view.Right / ScreenEditor.CellSize.Width; //Math.Min(view.Right / ScreenEditor.CellSize.Width, 31);
            int gridTop   = view.Y / ScreenEditor.CellSize.Height;    //Math.Max(view.yTile / ScreenEditor.CellSize.Height, 0);

            if (view.Y < 0)
            {
                gridTop--;
            }
            int gridBottom = view.Bottom / ScreenEditor.CellSize.Height;//Math.Min(view.Bottom / ScreenEditor.CellSize.Height, 31);

            for (int x = gridLeft; x <= gridRight; x++)
            {
                for (int y = gridTop; y <= gridBottom; y++)
                {
                    EnsureEditorExists(x, y);
                }
            }
        }
Esempio n. 9
0
        public void RequestFocus(ScreenEditor editor)
        {
            if (_focus != null)
            {
                ScreenEditor oldFocus = _focus;
                _focus = null;
                oldFocus.LoseFocus();
            }

            _focus = editor;

            if (_focus != null)
            {
                _focus.GetFocus();
                InitializeFocus();
            }
        }
Esempio n. 10
0
        public void Display(ScreenEditor editor)
        {
            this.currentEditor = editor;

            // Get state
            bool editableScreenSelected    = editor.CanEdit && editor.LevelIndex != LevelIndex.None;
            bool somethingInScreenSelected = editableScreenSelected && editor.SelectedItem != null;
            bool structSelected            = somethingInScreenSelected && editor.SelectedItem is StructInstance;
            bool enemySelected             = somethingInScreenSelected && editor.SelectedItem is EnemyInstance;
            bool hasPasswordData           = editableScreenSelected && editor.Rom.PasswordData.HasDataFor(editor.MapLocation);
            bool hasMusic = editableScreenSelected && editor.Rom.GetLevel(editor.LevelIndex).AlternateMusicRooms.Contians((byte)editor.ScreenIndex);

            // Set visibilities
            IndexLabel.Visible         = PaletteLabel.Visible = (enemySelected || structSelected);
            SlotImage.Visible          = SlotLabel.Visible = enemySelected;
            LayoutLabel.Visible        = FreespaceLabel.Visible = editableScreenSelected;
            musicButton.Visible        = editableScreenSelected;
            PasswordDataToggle.Visible = hasPasswordData;


            // Update values
            if (enemySelected)
            {
                SlotLabel.Text = ((EnemyInstance)editor.SelectedItem).SpriteSlot.ToString();
            }
            if (enemySelected || structSelected)
            {
                int typeIndex = -1;
                int palette   = -1;

                if (enemySelected)
                {
                    typeIndex = ((EnemyInstance)editor.SelectedItem).EnemyType;
                    palette   = ((EnemyInstance)editor.SelectedItem).DifficultByteValue;
                }
                if (structSelected)
                {
                    typeIndex = ((StructInstance)editor.SelectedItem).ObjectType;
                    palette   = ((StructInstance)editor.SelectedItem).PalData;
                }

                IndexLabel.Text   = FormatHex(typeIndex);
                PaletteLabel.Text = palette.ToString();
            }
            musicButton.State = hasMusic;
            if (editableScreenSelected)
            {
                slotAvailableForCreepyMusicRoom = editor.Rom.GetLevel(editor.LevelIndex).AlternateMusicRooms.UsedEntryCount < currentEditor.Level.Format.AltMusicRoomCount;
                LayoutLabel.Text = FormatHex(editor.ScreenIndex);
                if (editor.Rom.RomFormat == RomFormats.MMC3)
                {
                    FreespaceLabel.Text = "~" + FormatHex(Math.Max(0, editor.Rom.GetLevel(editor.LevelIndex).FreeScreenData));
                }
                else
                {
                    FreespaceLabel.Text = FormatHex(Math.Max(0, editor.Rom.GetLevel(editor.LevelIndex).FreeScreenData));
                }

                lblMapLocation.Text = FormatHex(editor.MapLocation.X) + ", " + FormatHex(editor.MapLocation.Y);
                lblDefaultPal.Text  = editor.Screen.ColorAttributeTable.ToString();
            }
        }
Esempio n. 11
0
 public void RequestUnfocus(ScreenEditor editor)
 {
     RequestFocus(null);
 }