diff --git a/ClassicalSharp/2D/Screens/Menu/ClassicOptionsScreen.cs b/ClassicalSharp/2D/Screens/Menu/ClassicOptionsScreen.cs new file mode 100644 index 000000000..6aada5a99 --- /dev/null +++ b/ClassicalSharp/2D/Screens/Menu/ClassicOptionsScreen.cs @@ -0,0 +1,105 @@ +using System; +using System.Drawing; +using ClassicalSharp.Singleplayer; + +namespace ClassicalSharp { + + public class ClassicOptionsScreen : MenuOptionsScreen { + + public ClassicOptionsScreen( Game game ) : base( game ) { + } + + public override void Init() { + base.Init(); + INetworkProcessor network = game.Network; + + widgets = new ButtonWidget[] { + // Column 1 + Make( -140, -200, "Music", OnWidgetClick, + g => g.UseMusic ? "yes" : "no", + (g, v) => { g.UseMusic = v == "yes"; + g.AudioPlayer.SetMusic( g.UseMusic ); + Options.Set( OptionsKey.UseMusic, v == "yes" ); }), + + Make( -140, -150, "Invert mouse", OnWidgetClick, + g => g.InvertMouse ? "yes" : "no", + (g, v) => { g.InvertMouse = v == "yes"; + Options.Set( OptionsKey.InvertMouse, v == "yes" ); }), + + Make( -140, -100, "View distance", OnWidgetClick, + g => g.ViewDistance.ToString(), + (g, v) => g.SetViewDistance( Int32.Parse( v ), true ) ), + + !network.IsSinglePlayer ? null : + Make( -140, -50, "Block physics", OnWidgetClick, + g => ((SinglePlayerServer)network).physics.Enabled ? "yes" : "no", + (g, v) => { + ((SinglePlayerServer)network).physics.Enabled = v == "yes"; + Options.Set( OptionsKey.SingleplayerPhysics, v == "yes" ); + }), + + Make( -140, 0, "Mouse sensitivity", OnWidgetClick, + g => g.MouseSensitivity.ToString(), + (g, v) => { g.MouseSensitivity = Int32.Parse( v ); + Options.Set( OptionsKey.Sensitivity, v ); } ), + + // Column 2 + Make( 140, -200, "Sound", OnWidgetClick, + g => g.UseSound ? "yes" : "no", + (g, v) => { g.UseSound = v == "yes"; + g.AudioPlayer.SetSound( g.UseSound ); + Options.Set( OptionsKey.UseSound, v == "yes" ); }), + + Make( 140, -150, "Show FPS", OnWidgetClick, + g => g.ShowFPS ? "yes" : "no", + (g, v) => g.ShowFPS = v == "yes" ), + + Make( 140, -100, "View bobbing", OnWidgetClick, + g => g.ViewBobbing ? "yes" : "no", + (g, v) => { g.ViewBobbing = v == "yes"; + Options.Set( OptionsKey.ViewBobbing, v == "yes" ); }), + + Make( 140, -50, "FPS limit", OnWidgetClick, + g => g.FpsLimit.ToString(), + (g, v) => { object raw = Enum.Parse( typeof(FpsLimitMethod), v ); + g.SetFpsLimitMethod( (FpsLimitMethod)raw ); + Options.Set( OptionsKey.FpsLimit, v ); } ), + + MakeBack( false, titleFont, + (g, w) => g.SetNewScreen( new PauseScreen( g ) ) ), + null, + }; + widgets[8].Metadata = typeof(FpsLimitMethod); + MakeValidators(); + MakeDescriptions(); + okayIndex = widgets.Length - 1; + } + + void MakeValidators() { + INetworkProcessor network = game.Network; + validators = new MenuInputValidator[] { + new BooleanValidator(), + new BooleanValidator(), + new IntegerValidator( 16, 4096 ), + network.IsSinglePlayer ? new BooleanValidator() : null, + new IntegerValidator( 1, 100 ), + + new BooleanValidator(), + new BooleanValidator(), + new BooleanValidator(), + new EnumValidator(), + }; + } + + void MakeDescriptions() { + descriptions = new string[widgets.Length][]; + descriptions[8] = new[] { + "&aDetermines the method used to limit the number of FPS", + "&eVSync: &fNumber of frames rendered is at most the monitor's refresh rate.", + "&e30/60/120 FPS: &f30/60/120 frames rendered at most each second.", + "&eNoLimit: &Renders as many frames as the GPU can handle each second.", + "&cUsing NoLimit mode is discouraged for general usage.", + }; + } + } +} \ No newline at end of file diff --git a/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs b/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs index 9ef71dcff..dbe4d2e80 100644 --- a/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs @@ -58,16 +58,16 @@ namespace ClassicalSharp { titleFont = new Font( "Arial", size, FontStyle.Bold ); regularFont = new Font( "Arial", 16, FontStyle.Regular ); - inputs = new [] { MakeInput( -80 ), MakeInput( -40 ), - MakeInput( 0 ), MakeInput( 40 ) + inputs = new [] { MakeInput( -100 ), MakeInput( -60 ), + MakeInput( -20 ), MakeInput( 20 ) }; - labels = new [] { MakeLabel( -80, "Width:" ), MakeLabel( -40, "Height:" ), - MakeLabel( 0, "Length:" ), MakeLabel( 40, "Seed:" ), + labels = new [] { MakeLabel( -100, "Width:" ), MakeLabel( -60, "Height:" ), + MakeLabel( -20, "Length:" ), MakeLabel( 20, "Seed:" ), }; widgets = new [] { - ButtonWidget.Create( game, 0, 90, 250, 30, "Generate flatgrass", Anchor.Centre, + ButtonWidget.Create( game, 0, 80, 250, 35, "Generate flatgrass", Anchor.Centre, Anchor.Centre, titleFont, GenFlatgrassClick ), - ButtonWidget.Create( game, 0, 140, 250, 30, "Generate notchy", Anchor.Centre, + ButtonWidget.Create( game, 0, 130, 250, 35, "Generate notchy", Anchor.Centre, Anchor.Centre, titleFont, GenNotchyClick ), MakeBack( false, titleFont, (g, w) => g.SetNewScreen( new PauseScreen( g ) ) ), diff --git a/ClassicalSharp/2D/Screens/Menu/MiscOptionsScreen.cs b/ClassicalSharp/2D/Screens/Menu/MiscOptionsScreen.cs index 078b62fb4..1b8d0a8fe 100644 --- a/ClassicalSharp/2D/Screens/Menu/MiscOptionsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/MiscOptionsScreen.cs @@ -20,11 +20,11 @@ namespace ClassicalSharp { g => g.LocalPlayer.ReachDistance.ToString(), (g, v) => g.LocalPlayer.ReachDistance = Single.Parse( v ) ), - Make( -140, -150, "Use sound", OnWidgetClick, - g => g.UseSound ? "yes" : "no", - (g, v) => { g.UseSound = v == "yes"; - g.AudioPlayer.SetSound( g.UseSound ); - Options.Set( OptionsKey.UseSound, v == "yes" ); }), + Make( -140, -150, "Music", OnWidgetClick, + g => g.UseMusic ? "yes" : "no", + (g, v) => { g.UseMusic = v == "yes"; + g.AudioPlayer.SetMusic( g.UseMusic ); + Options.Set( OptionsKey.UseMusic, v == "yes" ); }), Make( -140, -100, "Names mode", OnWidgetClick, g => g.Players.NamesMode.ToString(), @@ -51,11 +51,11 @@ namespace ClassicalSharp { Options.Set( OptionsKey.SingleplayerPhysics, v == "yes" ); }), - Make( 140, -150, "Use music", OnWidgetClick, - g => g.UseMusic ? "yes" : "no", - (g, v) => { g.UseMusic = v == "yes"; - g.AudioPlayer.SetMusic( g.UseMusic ); - Options.Set( OptionsKey.UseMusic, v == "yes" ); }), + Make( 140, -150, "Sound", OnWidgetClick, + g => g.UseSound ? "yes" : "no", + (g, v) => { g.UseSound = v == "yes"; + g.AudioPlayer.SetSound( g.UseSound ); + Options.Set( OptionsKey.UseSound, v == "yes" ); }), Make( 140, -100, "View bobbing", OnWidgetClick, g => g.ViewBobbing ? "yes" : "no", diff --git a/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs b/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs index f1354b605..efb22942f 100644 --- a/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs @@ -69,20 +69,18 @@ namespace ClassicalSharp { void MakeClassic() { widgets = new ButtonWidget[] { MakeClassic( 0, -150, "Options", Anchor.Centre, - (g, w) => g.SetNewScreen( new MiscOptionsScreen( g ) ) ), + (g, w) => g.SetNewScreen( new ClassicOptionsScreen( g ) ) ), MakeClassic( 0, -100, "Key bindings", Anchor.Centre, (g, w) => g.SetNewScreen( new NormalKeyBindingsScreen( g ) ) ), - MakeClassic( 0, -50, "Save level", Anchor.Centre, - (g, w) => g.SetNewScreen( new SaveLevelScreen( g ) ) ), + !game.Network.IsSinglePlayer ? null : + MakeClassic( 0, -50, "Generate level", Anchor.Centre, + (g, w) => g.SetNewScreen( new GenLevelScreen( g ) ) ), !game.Network.IsSinglePlayer ? null : MakeClassic( 0, 0, "Load level", Anchor.Centre, (g, w) => g.SetNewScreen( new LoadLevelScreen( g ) ) ), - !game.Network.IsSinglePlayer ? null : - MakeClassic( 0, 50, "Generate level", Anchor.Centre, - (g, w) => g.SetNewScreen( new GenLevelScreen( g ) ) ), - MakeClassic( 0, 100, "Nostalgia options", Anchor.Centre, - (g, w) => g.SetNewScreen( new NostalgiaScreen( g ) ) ), + MakeClassic( 0, 50, "Save level", Anchor.Centre, + (g, w) => g.SetNewScreen( new SaveLevelScreen( g ) ) ), MakeBack( true, titleFont, (g, w) => g.SetNewScreen( null ) ), diff --git a/ClassicalSharp/ClassicalSharp.csproj b/ClassicalSharp/ClassicalSharp.csproj index c0119e238..296769c8f 100644 --- a/ClassicalSharp/ClassicalSharp.csproj +++ b/ClassicalSharp/ClassicalSharp.csproj @@ -95,6 +95,7 @@ + diff --git a/ClassicalSharp/Entities/EntityList.cs b/ClassicalSharp/Entities/EntityList.cs index 1f6713dc4..02c7d99ab 100644 --- a/ClassicalSharp/Entities/EntityList.cs +++ b/ClassicalSharp/Entities/EntityList.cs @@ -20,7 +20,7 @@ namespace ClassicalSharp { /// Mode of how names of hovered entities are rendered (with or without depth testing), /// and how other entity names are rendered. - public NameMode NamesMode = NameMode.AllNames; + public NameMode NamesMode = NameMode.AllNamesAndHovered; public EntityList( Game game ) { this.game = game; diff --git a/Launcher2/Gui/Screens/MainScreen.cs b/Launcher2/Gui/Screens/MainScreen.cs index cd45f1d4c..57a2de0d5 100644 --- a/Launcher2/Gui/Screens/MainScreen.cs +++ b/Launcher2/Gui/Screens/MainScreen.cs @@ -48,8 +48,8 @@ namespace Launcher2 { MakeButtonAt( "Update check", 160, buttonHeight, buttonFont, Anchor.BottomOrRight, Anchor.BottomOrRight, -10, -10, (x, y) => game.SetScreen( new UpdatesScreen( game ) ) ); - string mode = game.ClassicMode ? "Normal mode" : "Classic mode"; - MakeButtonAt( mode, 160, buttonHeight, buttonFont, + string mode = game.ClassicMode ? "Normal mode" : "Pure classic mode"; + MakeButtonAt( mode, 190, buttonHeight, buttonFont, Anchor.Centre, Anchor.BottomOrRight, 0, -10, ModeClick ); if( widgets[widgetIndex] != null ) { @@ -89,6 +89,8 @@ namespace Launcher2 { game.ClassicMode = !game.ClassicMode; Options.Load(); Options.Set( "mode-classic", game.ClassicMode ); + if( game.ClassicMode ) + Options.Set( "namesmode", "AllNamesAndHovered" ); Options.Set( "nostalgia-customblocks", !game.ClassicMode ); Options.Set( "nostalgia-usecpe", !game.ClassicMode );