예제 #1
0
 public void cmd(string[] param)
 {
     if (param[0] == "!map") updateMap();
     if (param[0] == "!loadmap")
     {
         Map map = SaveGame.DeserializeMap<Map>(param[1]);
         level.LoadMap(map);
         ChangeLayer(0);
         ChangeTileset(0);
     }
     if (param[0] == "!addtileset")
     {
         AddTileset("maps/tilesets/" + param[1]);
     }
     if (param[0] == "!addlayer")
     {
         AddLayer(bool.Parse(param[1]));
     }
     if (param[0] == "!newmap")
     {
         NewMap(new Map(param[1], int.Parse(param[2]), int.Parse(param[3]), int.Parse(param[4]), int.Parse(param[5])));
     }
     if (param[0] == "!setlayer")
     {
         ChangeLayer(Int32.Parse(param[1]));
     }
     if (param[0] == "!savemap")
     {
         SaveGame.SerializeMap<object>(param[1], (object)level.CurrentMap);
     }
     if (param[0] == "!fill")
     {
         FillLayer(0);
     }
     if (param[0] == "!addtp")
     {
         teleporterparams = new Teleporter(new Rectangle(), int.Parse(param[1]), new Vector2(float.Parse(param[2]), float.Parse(param[3])));
         currentEditorMode = EditorMode.ObjectAdd;
         currentObjectAddmode = ObjectAddMode.Teleporter;
     }
 }
예제 #2
0
        public void Update()
        {
            Vector2 mousePos = input.MousePos;
            Vector2 tilesetPos = TilesetView.ScreenToWorld(input.MousePos);
            Vector2 mapPos = input.GetMapPos(input.MousePos);

            if (!tilesetScroll)
            {
                if (input.CurrentMouseState.ScrollWheelValue > input.PreviousMouseState.ScrollWheelValue && input.KeyDown(Keys.LeftControl)) Global.camera.AdjustZoom(0.2f);
                if (input.CurrentMouseState.ScrollWheelValue < input.PreviousMouseState.ScrollWheelValue && input.KeyDown(Keys.LeftControl)) Global.camera.AdjustZoom(-0.2f);
            }

            if (input.KeyPressed(Keys.Z) && input.KeyDown(Keys.LeftControl)) Undo();


            if (input.KeyPressed(Microsoft.Xna.Framework.Input.Keys.C) || input.MouseRightButtonPressed())
            {
                currentItemIDs = new int[0, 0];
                sourceRectangle = new Rectangle();
                currentEditorMode = EditorMode.Default;
            }

            foreach (var button in components)
            {
                button.update(input);
            }

            if (input.KeyPressed(Keys.E))
            {
                currentItemIDs = new int[1, 1] { { 0 } };
                sourceRectangle = new Rectangle();
                currentEditorMode = EditorMode.Rubber;
            }

            if (mousePos.X > TileSelectorField.X && mousePos.X < TileSelectorField.X + TileSelectorField.Width && mousePos.Y > TileSelectorField.Y && mousePos.Y < TileSelectorField.Y + TileSelectorField.Height)
            {
                if (input.CurrentMouseState.ScrollWheelValue > input.PreviousMouseState.ScrollWheelValue && input.KeyDown(Keys.LeftControl)) zoomTileset(0.2f);
                if (input.CurrentMouseState.ScrollWheelValue < input.PreviousMouseState.ScrollWheelValue && input.KeyDown(Keys.LeftControl)) zoomTileset(-0.2f);
                tilesetScroll = true;    
                if (input.ButtonDown(input.CurrentMouseState.LeftButton))
                {
                    currentEditorMode = EditorMode.TileSelector;
                }
            }else
            {
                tilesetScroll = false;
            }
            

            if(currentEditorMode == EditorMode.TileSelector)
            {
                if (mousePos.X > TileSelectorField.X && mousePos.X < TileSelectorField.X + TileSelectorField.Width && mousePos.Y > TileSelectorField.Y && mousePos.Y < TileSelectorField.Y + TileSelectorField.Height)
                {
                    if (input.ButtonDown(input.CurrentMouseState.LeftButton))
                    {
                        if (!Drag)
                        {
                            startID = ((int)tilesetPos.X / level.CurrentMap.TileWidth) + ((int)tilesetPos.Y - TileSelectorField.Y) / level.CurrentMap.TileHeight * (currentTileset.width) + 1;
                            Drag = true;
                        }
                    }
                    if (!input.ButtonDown(input.CurrentMouseState.LeftButton))
                    {
                        if (Drag)
                        {
                            endID = ((int)tilesetPos.X / level.CurrentMap.TileWidth) + ((int)tilesetPos.Y - TileSelectorField.Y) / level.CurrentMap.TileHeight * (currentTileset.width) + 1;


                            Rectangle endid = new Rectangle(level.CurrentMap.getSourceRectangle(endID, currentTileset).X / level.CurrentMap.TileWidth + 1, level.CurrentMap.getSourceRectangle(endID, currentTileset).Y / level.CurrentMap.TileHeight, level.CurrentMap.TileHeight, level.CurrentMap.TileHeight);
                            Rectangle startid = new Rectangle(level.CurrentMap.getSourceRectangle(startID, currentTileset).X / level.CurrentMap.TileWidth + 1, level.CurrentMap.getSourceRectangle(startID, currentTileset).Y / level.CurrentMap.TileHeight, level.CurrentMap.TileHeight, level.CurrentMap.TileHeight);
                            if (startID > endID || startid.X > endid.X || startid.Y > endid.Y) return;
                            currentItemIDs = new int[endid.X - startid.X + 1, endid.Y - startid.Y + 1];
                            for (int y = startid.Y; y <= endid.Y; y++)
                            {
                                for (int x = startid.X; x <= endid.X; x++)
                                {
                                    currentItemIDs[x - startid.X, y - startid.Y] = Tiles[x + y * currentTileset.width]-1;
                                }
                            };
                            sourceRectangle = new Rectangle((startid.X-1) * level.CurrentMap.TileWidth, startid.Y * level.CurrentMap.TileHeight, (endid.X - startid.X) * level.CurrentMap.TileWidth + level.CurrentMap.TileWidth, (endid.Y - startid.Y) * level.CurrentMap.TileHeight + level.CurrentMap.TileHeight);
                            Drag = false;
                            currentEditorMode = EditorMode.Place;
                        }
                    }
                }
            }

            if (input.MousePos.X < TileSelectorBackground.Width) return; // STOP IF CURSOR IS AT OVERLAY

            switch (currentEditorMode)
            {
                case EditorMode.Default:
                   
                    break;

                case EditorMode.Place:
                  
                    if (input.ButtonDown(input.CurrentMouseState.LeftButton))
                    {
                        int mapX = (int)(mapPos.X) / level.CurrentMap.TileWidth;
                        int mapY = (int)(mapPos.Y) / level.CurrentMap.TileHeight;
                        if (mapX < 0 || mapY < 0 || mapX + currentItemIDs.GetLength(0) > level.CurrentMap.MapWidth || mapY + currentItemIDs.GetLength(1) > level.CurrentMap.MapHeight) return;
                        int[,] restoreIDs = new int[currentItemIDs.GetLength(0), currentItemIDs.GetLength(1)];
                        bool change = false;

                        for (int y = mapY; y < mapY + currentItemIDs.GetLength(1); y++)
                        {
                            for (int x = mapX; x < mapX + currentItemIDs.GetLength(0); x++)
                            {
                                if (currentLayer[x + y * level.CurrentMap.MapWidth] != currentItemIDs[x - mapX, y - mapY]) change = true;
                                restoreIDs[x - mapX, y - mapY] = currentLayer[x + y * level.CurrentMap.MapWidth];
                                currentLayer[x + y * level.CurrentMap.MapWidth] = currentItemIDs[x - mapX, y - mapY];
                            }
                        }

                        if (change) undo.Push(new Backup(new Vector2(mapX, mapY), restoreIDs, currentLayerID));

                    }

                    break;

                case EditorMode.Rubber:

                    if (input.ButtonDown(input.CurrentMouseState.LeftButton))
                    {
                        int mapX = (int)(mapPos.X) / level.CurrentMap.TileWidth;
                        int mapY = (int)(mapPos.Y) / level.CurrentMap.TileHeight;
                        if (mapX < 0 || mapY < 0 || mapX + currentItemIDs.GetLength(0) > level.CurrentMap.MapWidth || mapY + currentItemIDs.GetLength(1) > level.CurrentMap.MapHeight) return;
                        int[,] restoreIDs = new int[1, 1];
                        bool change = false;

                        if (currentLayer[mapX + mapY * level.CurrentMap.MapWidth] != 0) change = true;
                        restoreIDs[0, 0] = currentLayer[mapX + mapY * level.CurrentMap.MapWidth];
                        currentLayer[mapX + mapY * level.CurrentMap.MapWidth] = 0;
                                             
                        if (change) undo.Push(new Backup(new Vector2(mapX, mapY), restoreIDs, currentLayerID));
                    }

                    break;
               
                case EditorMode.ObjectAdd:
                    if (input.ButtonDown(input.CurrentMouseState.LeftButton) && !objectdrag)
                    {
                        objectposition.X = (int)mapPos.X;
                        objectposition.Y = (int)mapPos.Y;
                        objectdrag = true;
                    }
                    if (objectdrag)
                    {
                        objectposition.Width = (int)mapPos.X - objectposition.X;
                        objectposition.Height = (int)mapPos.Y - objectposition.Y;
                    }

                    if (!input.ButtonDown(input.CurrentMouseState.LeftButton) && objectdrag)
                    {
                        if (objectposition.X < 0)
                        {
                            objectposition.Width += objectposition.X;
                            objectposition.X = 0;
                        }
                        if (objectposition.Y < 0)
                        {
                            objectposition.Height += objectposition.Y;
                            objectposition.Y = 0;
                        }
                        if (objectposition.Width + objectposition.X > level.CurrentMap.MapWidth * level.CurrentMap.TileWidth) objectposition.Width = level.CurrentMap.MapWidth * level.CurrentMap.TileWidth - objectposition.X;
                        if (objectposition.Height + objectposition.Y > level.CurrentMap.MapHeight * level.CurrentMap.TileHeight) objectposition.Height = level.CurrentMap.MapHeight * level.CurrentMap.TileHeight - objectposition.Y;

                        if (objectposition.Width > 0 && objectposition.Height > 0)
                        {
                            if (currentObjectAddmode == ObjectAddMode.Collision) level.CurrentMap.collisions.Add(objectposition);
                            else if (currentObjectAddmode == ObjectAddMode.Teleporter)
                            {
                                level.CurrentMap.teleporters.Add(new Teleporter(objectposition, teleporterparams.mapID, teleporterparams.tpCoordinates));
                                currentEditorMode = EditorMode.Default;
                            }

                            //ADD COllison or teleporter
                        }
                        objectposition = new Rectangle();
                        objectdrag = false;
                    }
                    break;

                case EditorMode.ObjectEdit:

                    if (input.MouseLeftButtonPressed())
                    {
                        Rectangle obj = new Rectangle();
                        foreach (var coll in level.CurrentMap.collisions)
                        {
                            if (CollisionDetector.Collison(coll, mapPos))
                            {
                                obj = coll;
                                break;
                            }
                        }
                        Furniture fur = null;
                        foreach (var coll in level.CurrentMap.entities)
                        {
                            if (CollisionDetector.Collison(new Rectangle((int)coll.Position.X + coll.clickbox.X, (int)coll.Position.Y + coll.clickbox.Y, coll.clickbox.Width, coll.clickbox.Height), mapPos))
                            {
                                fur = coll;
                                break;
                            }
                        }
                        Teleporter tp = null;
                        foreach (var coll in level.CurrentMap.teleporters)
                        {
                            if (CollisionDetector.Collison(coll.position, mapPos))
                            {
                                tp = coll;
                                break;
                            }
                        }
                        if (obj.Width != 0)
                        {
                            level.CurrentMap.collisions.Remove(obj);
                        }
                        if (fur != null)
                        {
                            level.CurrentMap.entities.Remove(fur);
                            level.entities.Remove(fur);
                        }
                        if (tp != null)
                        {
                            level.CurrentMap.teleporters.Remove(tp);
                        }
                    }
                    break;
            }       
        }