2016-11-01 22:17:26 +11:00

144 lines
4.7 KiB
C#

// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
using System;
using System.Drawing;
using System.IO;
using ClassicalSharp.Generator;
using ClassicalSharp.Gui.Widgets;
using ClassicalSharp.Singleplayer;
using OpenTK.Input;
namespace ClassicalSharp.Gui.Screens {
public sealed class GenLevelScreen : MenuScreen {
public GenLevelScreen( Game game ) : base( game ) {
}
MenuInputWidget selected;
public override bool HandlesMouseClick( int mouseX, int mouseY, MouseButton button ) {
return HandleMouseClick( widgets, mouseX, mouseY, button );
}
public override bool HandlesKeyPress( char key ) {
return selected == null ? true :
selected.HandlesKeyPress( key );
}
public override bool HandlesKeyDown( Key key ) {
if( key == Key.Escape ) {
game.Gui.SetNewScreen( null );
return true;
}
return selected == null ? (key < Key.F1 || key > Key.F35) :
selected.HandlesKeyDown( key );
}
public override bool HandlesKeyUp( Key key ) {
return selected == null ? true :
selected.HandlesKeyUp( key );
}
public override void Init() {
game.Keyboard.KeyRepeat = true;
titleFont = new Font( game.FontName, 16, FontStyle.Bold );
regularFont = new Font( game.FontName, 16, FontStyle.Regular );
widgets = new Widget[] {
MakeInput( -80, false, game.World.Width.ToString() ),
MakeInput( -40, false, game.World.Height.ToString() ),
MakeInput( 0, false, game.World.Length.ToString() ),
MakeInput( 40, true, "" ),
MakeLabel( -150, -80, "Width:" ), MakeLabel( -150, -40, "Height:" ),
MakeLabel( -150, 0, "Length:" ), MakeLabel( -140, 40, "Seed:" ),
TextWidget.Create( game, "Generate new level", regularFont )
.SetLocation( Anchor.Centre, Anchor.Centre, 0, -130 ),
ButtonWidget.Create( game, 201, 40, "Flatgrass", titleFont, GenFlatgrassClick )
.SetLocation( Anchor.Centre, Anchor.Centre, -120, 100 ),
ButtonWidget.Create( game, 201, 40, "Vanilla", titleFont, GenNotchyClick )
.SetLocation( Anchor.Centre, Anchor.Centre, 120, 100 ),
MakeBack( false, titleFont,
(g, w) => g.Gui.SetNewScreen( new PauseScreen( g ) ) ),
};
}
InputWidget MakeInput( int y, bool seed, string value ) {
MenuInputValidator validator = seed ? new SeedValidator() : new IntegerValidator( 1, 8192 );
InputWidget input = MenuInputWidget.Create( game, 200, 30, value,
regularFont, validator )
.SetLocation( Anchor.Centre, Anchor.Centre, 0, y );
input.Active = false;
input.OnClick = InputClick;
return input;
}
TextWidget MakeLabel( int x, int y, string text ) {
TextWidget label = TextWidget.Create( game, text, regularFont )
.SetLocation( Anchor.Centre, Anchor.Centre, x, y );
label.XOffset = -110 - label.Width / 2;
label.CalculatePosition();
label.Colour = new FastColour( 224, 224, 224 );
return label;
}
public override void Dispose() {
game.Keyboard.KeyRepeat = false;
base.Dispose();
}
void InputClick( Game game, Widget widget, MouseButton btn, int x, int y ) {
if( btn != MouseButton.Left ) return;
if( selected != null ) selected.ShowCaret = false;
selected = (MenuInputWidget)widget;
selected.HandlesMouseClick( x, y, btn );
selected.ShowCaret = true;
}
void GenFlatgrassClick( Game game, Widget widget, MouseButton btn, int x, int y ) {
if( btn != MouseButton.Left ) return;
GenerateMap( new FlatGrassGenerator() );
}
void GenNotchyClick( Game game, Widget widget, MouseButton btn, int x, int y ) {
if( btn != MouseButton.Left ) return;
GenerateMap( new NotchyGenerator() );
}
void GenerateMap( IMapGenerator gen ) {
SinglePlayerServer server = (SinglePlayerServer)game.Server;
int width = GetInt( 0 ), height = GetInt( 1 );
int length = GetInt( 2 ), seed = GetSeedInt( 3 );
long volume = (long)width * height * length;
if( volume > 800 * 800 * 800 ) {
game.Chat.Add( "&cThe generated map's volume is too big." );
} else if( width == 0 || height == 0 || length == 0 ) {
game.Chat.Add( "&cOne of the map dimensions is invalid.");
} else {
server.GenMap( width, height, length, seed, gen );
}
}
int GetInt( int index ) {
MenuInputWidget input = (MenuInputWidget)widgets[index];
string text = input.Text.ToString();
if( !input.Validator.IsValidValue( text ) )
return 0;
return text == "" ? 0 : Int32.Parse( text );
}
int GetSeedInt( int index ) {
MenuInputWidget input = (MenuInputWidget)widgets[index];
string text = input.Text.ToString();
if( text == "" ) return new Random().Next();
if( !input.Validator.IsValidValue( text ) )
return 0;
return text == "" ? 0 : Int32.Parse( text );
}
}
}