diff --git a/OpenRA.Game/Graphics/Sheet.cs b/OpenRA.Game/Graphics/Sheet.cs index b6a6c0a764..d2ecc2418b 100644 --- a/OpenRA.Game/Graphics/Sheet.cs +++ b/OpenRA.Game/Graphics/Sheet.cs @@ -27,7 +27,7 @@ namespace OpenRA.Graphics Size = size; } - internal Sheet(string filename) + public Sheet(string filename) { bitmap = (Bitmap)Image.FromStream(FileSystem.Open(filename)); Size = bitmap.Size; diff --git a/OpenRA.Game/ModData.cs b/OpenRA.Game/ModData.cs index ae3fab2980..54b18f2a4f 100755 --- a/OpenRA.Game/ModData.cs +++ b/OpenRA.Game/ModData.cs @@ -29,14 +29,13 @@ namespace OpenRA public ModData( params string[] mods ) { Manifest = new Manifest( mods ); - FileSystem.LoadFromManifest( Manifest ); - ChromeProvider.Initialize( Manifest.Chrome ); - ObjectCreator = new ObjectCreator( Manifest ); - LoadScreen = ObjectCreator.CreateObject(Manifest.LoadScreen); + LoadScreen.Init(); LoadScreen.Display(); + FileSystem.LoadFromManifest( Manifest ); + ChromeProvider.Initialize( Manifest.Chrome ); SheetBuilder = new SheetBuilder( TextureChannel.Red ); CursorSheetBuilder = new CursorSheetBuilder( this ); AvailableMaps = FindMaps( mods ); @@ -79,5 +78,5 @@ namespace OpenRA } } - public interface ILoadScreen { void Display(); } + public interface ILoadScreen { void Display(); void Init(); } } diff --git a/OpenRA.Mods.RA/NullLoadScreen.cs b/OpenRA.Mods.RA/NullLoadScreen.cs index e49a0d8f78..ae082585aa 100644 --- a/OpenRA.Mods.RA/NullLoadScreen.cs +++ b/OpenRA.Mods.RA/NullLoadScreen.cs @@ -12,11 +12,13 @@ namespace OpenRA.Mods.RA { public class NullLoadScreen : ILoadScreen { + public void Init() {} public void Display() { if (Game.Renderer == null) return; + // Draw a black screen Game.Renderer.BeginFrame(float2.Zero); Game.Renderer.EndFrame(); } diff --git a/OpenRA.Mods.RA/RALoadScreen.cs b/OpenRA.Mods.RA/RALoadScreen.cs index 5a49403813..2d48d12ca4 100644 --- a/OpenRA.Mods.RA/RALoadScreen.cs +++ b/OpenRA.Mods.RA/RALoadScreen.cs @@ -19,16 +19,38 @@ namespace OpenRA.Mods.RA { public class RALoadScreen : ILoadScreen { - static string[] loadComments = new[] { "Filling Crates...", "Charging Capacitors...", "Reticulating Splines...", + static string[] Comments = new[] { "Filling Crates...", "Charging Capacitors...", "Reticulating Splines...", "Planting Trees...", "Building Bridges...", "Aging Empires...", "Compiling EVA...", "Constructing Pylons...", "Activating Skynet...", "Splitting Atoms..." }; - static Stopwatch lastLoadScreen = new Stopwatch(); + Stopwatch lastLoadScreen = new Stopwatch(); + Rectangle StripeRect; + Sprite Stripe, Logo; + float2 LogoPos; + + Renderer r; + SpriteFont Font; + public void Init() + { + // Avoid standard loading mechanisms so we + // can display loadscreen as early as possible + r = Game.Renderer; + if (r == null) return; + Font = r.BoldFont; + + var s = new Sheet("mods/ra/loadscreen.png"); + Logo = new Sprite(s, new Rectangle(0,0,256,256), TextureChannel.Alpha); + Stripe = new Sprite(s, new Rectangle(256,0,256,256), TextureChannel.Alpha); + StripeRect = new Rectangle(0, Renderer.Resolution.Height/2 - 128, Renderer.Resolution.Width, 256); + LogoPos = new float2(Renderer.Resolution.Width/2 - 128, Renderer.Resolution.Height/2 - 128); + } + + public void Display() { - if (Game.Renderer == null) + if (r == null) return; // Update text at most every 0.5 seconds @@ -36,22 +58,13 @@ namespace OpenRA.Mods.RA return; lastLoadScreen.Reset(); + var text = Comments.Random(Game.CosmeticRandom); + var textSize = Font.Measure(text); - var r = Game.Renderer; - var font = r.BoldFont; r.BeginFrame(float2.Zero); - - WidgetUtils.FillRectWithSprite(new Rectangle(0, Renderer.Resolution.Height/2 - 64, Renderer.Resolution.Width, 128), ChromeProvider.GetImage("loadscreen", "stripe")); - - var logo = ChromeProvider.GetImage("loadscreen","logo"); - var logoPos = new float2((Renderer.Resolution.Width - logo.size.X)/2,(Renderer.Resolution.Height - logo.size.Y)/2); - r.RgbaSpriteRenderer.DrawSprite(logo, logoPos); - - var text = loadComments.Random(Game.CosmeticRandom); - var textSize = font.Measure(text); - - font.DrawText(text, new float2(Renderer.Resolution.Width - textSize.X - 20, Renderer.Resolution.Height - textSize.Y - 20), Color.White); - + WidgetUtils.FillRectWithSprite(StripeRect, Stripe); + r.RgbaSpriteRenderer.DrawSprite(Logo, LogoPos); + Font.DrawText(text, new float2(Renderer.Resolution.Width - textSize.X - 20, Renderer.Resolution.Height - textSize.Y - 20), Color.White); r.RgbaSpriteRenderer.Flush(); r.EndFrame(); } diff --git a/mods/ra/chrome.xml b/mods/ra/chrome.xml index ce0e659fd0..1b74499780 100644 --- a/mods/ra/chrome.xml +++ b/mods/ra/chrome.xml @@ -208,8 +208,4 @@ - - - - diff --git a/mods/ra/dialog.png b/mods/ra/dialog.png index 77b83b1e51..b7047caefa 100644 Binary files a/mods/ra/dialog.png and b/mods/ra/dialog.png differ diff --git a/mods/ra/loadscreen.png b/mods/ra/loadscreen.png new file mode 100644 index 0000000000..699b07ac28 Binary files /dev/null and b/mods/ra/loadscreen.png differ