public static void Create(Submarine sub)
        {
            int width = 4096; int height = 4096;

            Rectangle subDimensions = sub.CalculateDimensions(false);
            Vector2   viewPos       = subDimensions.Center.ToVector2();
            float     scale         = Math.Min(width / (float)subDimensions.Width, height / (float)subDimensions.Height);

            var viewMatrix = Matrix.CreateTranslation(new Vector3(width / 2.0f, height / 2.0f, 0));
            var transform  = Matrix.CreateTranslation(
                new Vector3(-viewPos.X, viewPos.Y, 0)) *
                             Matrix.CreateScale(new Vector3(scale, scale, 1)) *
                             viewMatrix;

            using (RenderTarget2D rt = new RenderTarget2D(
                       GameMain.Instance.GraphicsDevice,
                       width, height, false, SurfaceFormat.Color, DepthFormat.None))
                using (SpriteBatch spriteBatch = new SpriteBatch(GameMain.Instance.GraphicsDevice))
                {
                    Viewport prevViewport = GameMain.Instance.GraphicsDevice.Viewport;
                    GameMain.Instance.GraphicsDevice.Viewport = new Viewport(0, 0, width, height);
                    GameMain.Instance.GraphicsDevice.SetRenderTarget(rt);
                    GameMain.Instance.GraphicsDevice.Clear(Color.Transparent);

                    spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied, null, null, null, null, transform);
                    Submarine.Draw(spriteBatch);
                    Submarine.DrawFront(spriteBatch);
                    Submarine.DrawDamageable(spriteBatch, null);
                    spriteBatch.End();

                    GameMain.Instance.GraphicsDevice.SetRenderTarget(null);
                    GameMain.Instance.GraphicsDevice.Viewport = prevViewport;
                    using (FileStream fs = File.Open("wikiimage.png", System.IO.FileMode.Create))
                    {
                        rt.SaveAsPng(fs, width, height);
                    }
                }
        }
예제 #2
0
        public string CreateRoomName()
        {
            List <string> roomItems = new List <string>();

            foreach (Item item in Item.ItemList)
            {
                if (item.CurrentHull != this)
                {
                    continue;
                }
                if (item.GetComponent <Items.Components.Reactor>() != null)
                {
                    roomItems.Add("reactor");
                }
                if (item.GetComponent <Items.Components.Engine>() != null)
                {
                    roomItems.Add("engine");
                }
                if (item.GetComponent <Items.Components.Steering>() != null)
                {
                    roomItems.Add("steering");
                }
                if (item.GetComponent <Items.Components.Sonar>() != null)
                {
                    roomItems.Add("sonar");
                }
                if (item.HasTag("ballast"))
                {
                    roomItems.Add("ballast");
                }
            }

            if (roomItems.Contains("reactor"))
            {
                return(TextManager.Get("ReactorRoom"));
            }
            else if (roomItems.Contains("engine"))
            {
                return(TextManager.Get("EngineRoom"));
            }
            else if (roomItems.Contains("steering") && roomItems.Contains("sonar"))
            {
                return(TextManager.Get("CommandRoom"));
            }
            else if (roomItems.Contains("ballast"))
            {
                return(TextManager.Get("Ballast"));
            }

            if (ConnectedGaps.Any(g => !g.IsRoomToRoom && g.ConnectedDoor != null))
            {
                return(TextManager.Get("Airlock"));
            }

            Rectangle subRect = Submarine.CalculateDimensions();

            Alignment roomPos;

            if (rect.Y - rect.Height / 2 > subRect.Y + subRect.Height * 0.66f)
            {
                roomPos = Alignment.Top;
            }
            else if (rect.Y - rect.Height / 2 > subRect.Y + subRect.Height * 0.33f)
            {
                roomPos = Alignment.CenterY;
            }
            else
            {
                roomPos = Alignment.Bottom;
            }

            if (rect.Center.X < subRect.X + subRect.Width * 0.33f)
            {
                roomPos |= Alignment.Left;
            }
            else if (rect.Center.X < subRect.X + subRect.Width * 0.66f)
            {
                roomPos |= Alignment.CenterX;
            }
            else
            {
                roomPos |= Alignment.Right;
            }

            return(TextManager.Get("Sub" + roomPos.ToString()));
        }
예제 #3
0
파일: Hull.cs 프로젝트: lexuv2/Barotrauma
        public string CreateRoomName()
        {
            List <string> roomItems = new List <string>();

            foreach (Item item in Item.ItemList)
            {
                if (item.CurrentHull != this)
                {
                    continue;
                }
                if (item.GetComponent <Items.Components.Reactor>() != null)
                {
                    roomItems.Add("reactor");
                }
                if (item.GetComponent <Items.Components.Engine>() != null)
                {
                    roomItems.Add("engine");
                }
                if (item.GetComponent <Items.Components.Steering>() != null)
                {
                    roomItems.Add("steering");
                }
                if (item.GetComponent <Items.Components.Sonar>() != null)
                {
                    roomItems.Add("sonar");
                }
                if (item.HasTag("ballast"))
                {
                    roomItems.Add("ballast");
                }
            }

            if (roomItems.Contains("reactor"))
            {
                return("RoomName.ReactorRoom");
            }
            else if (roomItems.Contains("engine"))
            {
                return("RoomName.EngineRoom");
            }
            else if (roomItems.Contains("steering") && roomItems.Contains("sonar"))
            {
                return("RoomName.CommandRoom");
            }
            else if (roomItems.Contains("ballast"))
            {
                return("RoomName.Ballast");
            }

            var moduleFlags = Submarine?.Info?.OutpostModuleInfo?.ModuleFlags ?? this.moduleTags;

            if (moduleFlags != null && moduleFlags.Any() &&
                (Submarine.Info.Type == SubmarineType.OutpostModule || Submarine.Info.Type == SubmarineType.Outpost))
            {
                if (moduleFlags.Contains("airlock") &&
                    ConnectedGaps.Any(g => !g.IsRoomToRoom && g.ConnectedDoor != null))
                {
                    return("RoomName.Airlock");
                }
            }
            else
            {
                if (ConnectedGaps.Any(g => !g.IsRoomToRoom && g.ConnectedDoor != null))
                {
                    return("RoomName.Airlock");
                }
            }

            Rectangle subRect = Submarine.CalculateDimensions();

            Alignment roomPos;

            if (rect.Y - rect.Height / 2 > subRect.Y + subRect.Height * 0.66f)
            {
                roomPos = Alignment.Top;
            }
            else if (rect.Y - rect.Height / 2 > subRect.Y + subRect.Height * 0.33f)
            {
                roomPos = Alignment.CenterY;
            }
            else
            {
                roomPos = Alignment.Bottom;
            }

            if (rect.Center.X < subRect.X + subRect.Width * 0.33f)
            {
                roomPos |= Alignment.Left;
            }
            else if (rect.Center.X < subRect.X + subRect.Width * 0.66f)
            {
                roomPos |= Alignment.CenterX;
            }
            else
            {
                roomPos |= Alignment.Right;
            }

            return("RoomName.Sub" + roomPos.ToString());
        }