From dd5689766d0ba521e24562e3633f3410267216bc Mon Sep 17 00:00:00 2001
From: MaxED <j.maxed@gmail.com>
Date: Mon, 23 Mar 2015 14:19:23 +0000
Subject: [PATCH] Changed, Numeric textboxes: you can now hold Ctrl or Shift
 keys while clicking a textbox buttons or using mouse wheel on a textbox to
 change value increment step. Changed, Numeric textboxes: trailing zeros are
 no longer displayed to reduce visual noise. Fixed, paired numeric controls:
 in some cases culture-specific decimal separator was not used. Fixed, map
 loading: inability to initialize D3D device is now handled a bit more
 gracefully. Fixed, main toolbar context menu: we should suppress context menu
 closing only when user clicks on a menu item while holding Shift key. Fixed,
 Game configurations: several Skulltag things were not included in many
 Zandronum game configurations.

---
 .../Includes/Skulltag_things.cfg              |  31 ++-
 .../Includes/Zandronum_things.cfg             |   2 +-
 Build/Configurations/Zandronum_DoomDoom.cfg   |   1 +
 Build/Configurations/Zandronum_DoomHexen.cfg  |   1 +
 Build/Configurations/Zandronum_DoomUDMF.cfg   |   1 +
 .../Configurations/Zandronum_HereticDoom.cfg  |   1 +
 .../Configurations/Zandronum_HereticHexen.cfg |   1 +
 .../Configurations/Zandronum_HereticUDMF.cfg  |   1 +
 Build/Configurations/Zandronum_HexenHexen.cfg |   1 +
 Build/Configurations/Zandronum_HexenUDMF.cfg  |   1 +
 Build/Configurations/Zandronum_StrifeDoom.cfg |   1 +
 .../Configurations/Zandronum_StrifeHexen.cfg  |   1 +
 Build/Configurations/Zandronum_StrifeUDMF.cfg |   1 +
 Build/Sprites/Zone.png                        | Bin 0 -> 308 bytes
 Clean Rebuild.bat                             | 139 +++++++++++
 Source/Core/Controls/AutoSelectTextbox.cs     |   8 +
 .../ButtonsNumericTextbox.Designer.cs         |   5 +
 Source/Core/Controls/ButtonsNumericTextbox.cs |  59 ++++-
 .../Core/Controls/ButtonsNumericTextbox.resx  | 219 +++++++++---------
 Source/Core/Controls/NumericTextbox.cs        |  24 +-
 .../GZBuilder/Controls/PairedFieldsControl.cs |  20 +-
 .../GZBuilder/Controls/PairedFloatControl.cs  |  13 +-
 Source/Core/General/General.cs                |  32 +--
 Source/Core/Resources/Actions.cfg             |   2 +-
 Source/Core/Windows/MainForm.cs               |   2 +-
 25 files changed, 403 insertions(+), 164 deletions(-)
 create mode 100644 Build/Sprites/Zone.png
 create mode 100644 Clean Rebuild.bat

diff --git a/Build/Configurations/Includes/Skulltag_things.cfg b/Build/Configurations/Includes/Skulltag_things.cfg
index 3b9d4b887..c1b43c314 100644
--- a/Build/Configurations/Includes/Skulltag_things.cfg
+++ b/Build/Configurations/Includes/Skulltag_things.cfg
@@ -20,8 +20,8 @@ skulltag
 			height = 16;
 		}
 	}
-  
-  flags
+
+	flags
 	{
 		color = 13;	// Light Magenta
 		arrow = 0;
@@ -32,9 +32,18 @@ skulltag
 		hangs = 0;
 		blocking = 0;
 		
-		5067 = "Skull Return Zone";
-		5068 = "Spring Pad Zone";
-  } 
+		5067
+		{
+			title = "Skull Return Zone";
+			sprite = "internal:Zone";
+		}
+		
+		5068
+		{
+			title = "Spring Pad Zone";
+			sprite = "internal:Zone";
+		}
+	}
 	
 	obstacles
 	{
@@ -76,7 +85,7 @@ skulltag
 // New things available in Doom, Heretic and Hexen; but not in Chex or Strife
 doomheretichexen
 {
-  // New powerups
+	// New powerups
 	powerups
 	{
 		color = 9;	// Light Blue
@@ -90,20 +99,20 @@ doomheretichexen
 		
 		5030
 		{
-			title = "Turbosphere";
+			title = "Turbo Sphere";
 			sprite = "TURBA0";
 			height = 45;
 		}
 		5032
 		{
-			title = "Time freeze sphere";
+			title = "Time-freeze Sphere";
 			sprite = "TIMEA0";
 			height = 45;
 		}
 		5035
 		{
-			title = "Invisibility sphere";
-			sprite = "INVSA0";
+			title = "Invisibility Sphere";
+			sprite = "SINVA0";
 			height = 45;
 		}
 		5036
@@ -114,7 +123,7 @@ doomheretichexen
 		}
 		5037
 		{
-			title = "Guardsphere";
+			title = "Guard Sphere";
 			sprite = "GARDA0";
 			height = 45;
 		}
diff --git a/Build/Configurations/Includes/Zandronum_things.cfg b/Build/Configurations/Includes/Zandronum_things.cfg
index 1b8eb5fd4..182966a1f 100644
--- a/Build/Configurations/Includes/Zandronum_things.cfg
+++ b/Build/Configurations/Includes/Zandronum_things.cfg
@@ -42,6 +42,6 @@ strife
 default
 {
 	include("Zandronum_common.cfg", "zandronum")
-  //include("Skulltag_things.cfg", "skulltag")
+	//include("Skulltag_things.cfg", "skulltag")
 }
 
diff --git a/Build/Configurations/Zandronum_DoomDoom.cfg b/Build/Configurations/Zandronum_DoomDoom.cfg
index eb4390fb9..1a3aac1e4 100644
--- a/Build/Configurations/Zandronum_DoomDoom.cfg
+++ b/Build/Configurations/Zandronum_DoomDoom.cfg
@@ -58,6 +58,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "doom");
 }
 
diff --git a/Build/Configurations/Zandronum_DoomHexen.cfg b/Build/Configurations/Zandronum_DoomHexen.cfg
index 98a83a4aa..28cb87564 100644
--- a/Build/Configurations/Zandronum_DoomHexen.cfg
+++ b/Build/Configurations/Zandronum_DoomHexen.cfg
@@ -62,6 +62,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "doom");
 }
 
diff --git a/Build/Configurations/Zandronum_DoomUDMF.cfg b/Build/Configurations/Zandronum_DoomUDMF.cfg
index e1a96369b..06707bfbb 100644
--- a/Build/Configurations/Zandronum_DoomUDMF.cfg
+++ b/Build/Configurations/Zandronum_DoomUDMF.cfg
@@ -67,6 +67,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "doom");
 }
 
diff --git a/Build/Configurations/Zandronum_HereticDoom.cfg b/Build/Configurations/Zandronum_HereticDoom.cfg
index 98ff72028..49ddfebc9 100644
--- a/Build/Configurations/Zandronum_HereticDoom.cfg
+++ b/Build/Configurations/Zandronum_HereticDoom.cfg
@@ -57,6 +57,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "heretic");
 }
 
diff --git a/Build/Configurations/Zandronum_HereticHexen.cfg b/Build/Configurations/Zandronum_HereticHexen.cfg
index 06f8ccb45..028dd5311 100644
--- a/Build/Configurations/Zandronum_HereticHexen.cfg
+++ b/Build/Configurations/Zandronum_HereticHexen.cfg
@@ -61,6 +61,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "heretic");
 }
 
diff --git a/Build/Configurations/Zandronum_HereticUDMF.cfg b/Build/Configurations/Zandronum_HereticUDMF.cfg
index 46975e43e..4a28627ff 100644
--- a/Build/Configurations/Zandronum_HereticUDMF.cfg
+++ b/Build/Configurations/Zandronum_HereticUDMF.cfg
@@ -66,6 +66,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "heretic");
 }
 
diff --git a/Build/Configurations/Zandronum_HexenHexen.cfg b/Build/Configurations/Zandronum_HexenHexen.cfg
index 5f61eee29..0ccc4c4ca 100644
--- a/Build/Configurations/Zandronum_HexenHexen.cfg
+++ b/Build/Configurations/Zandronum_HexenHexen.cfg
@@ -61,6 +61,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "hexen");
 }
 
diff --git a/Build/Configurations/Zandronum_HexenUDMF.cfg b/Build/Configurations/Zandronum_HexenUDMF.cfg
index 11bf596a0..8748dc4ca 100644
--- a/Build/Configurations/Zandronum_HexenUDMF.cfg
+++ b/Build/Configurations/Zandronum_HexenUDMF.cfg
@@ -66,6 +66,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "hexen");
 }
 
diff --git a/Build/Configurations/Zandronum_StrifeDoom.cfg b/Build/Configurations/Zandronum_StrifeDoom.cfg
index a4939a9e1..981117760 100644
--- a/Build/Configurations/Zandronum_StrifeDoom.cfg
+++ b/Build/Configurations/Zandronum_StrifeDoom.cfg
@@ -57,6 +57,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "strife");
 }
 
diff --git a/Build/Configurations/Zandronum_StrifeHexen.cfg b/Build/Configurations/Zandronum_StrifeHexen.cfg
index 3f03a4846..f133d2ee0 100644
--- a/Build/Configurations/Zandronum_StrifeHexen.cfg
+++ b/Build/Configurations/Zandronum_StrifeHexen.cfg
@@ -61,6 +61,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "strife");
 }
 
diff --git a/Build/Configurations/Zandronum_StrifeUDMF.cfg b/Build/Configurations/Zandronum_StrifeUDMF.cfg
index b207728b4..a82613717 100644
--- a/Build/Configurations/Zandronum_StrifeUDMF.cfg
+++ b/Build/Configurations/Zandronum_StrifeUDMF.cfg
@@ -66,6 +66,7 @@ thingtypes
 	// Standard ZDoom actors
 	include("Includes\\ZDoom_things.cfg", "zdoom");
 	// Additional actors from the engine
+	include("Includes\\Zandronum_things.cfg", "default");
 	include("Includes\\Zandronum_things.cfg", "strife");
 }
 
diff --git a/Build/Sprites/Zone.png b/Build/Sprites/Zone.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d60661ba0824b8ba094c526986658df1aa89ce1
GIT binary patch
literal 308
zcmV-40n7f0P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUy)=5M`RCwCNQ#%fWFbp+_YvmFgAQMYE
zFtRbRF=l8M#J~aAxEvp)JWEDJv_N5~rQoOJ`RO?(f%l&7L`XLyYMSObXLF&}X{{er
z*R}8a{^x}{v>%P*$Z}bhaZb~ethKwiEK8C)7LbcH#?UYfoDrX}bB_6o01mK`Bni#d
z4jTs#eAMw21XNYU0!IrxakO%PIO72E?jS-DHsUxwB>*1y!VSei+qS1#0B>^#(n8mD
ze1QB7Z(5Ks7DchxR7&mQ)flH~a(SL#`jzns{{9+Y0t^7y*eVQ}+XF2C0000<MNUMn
GLSTXsy?X!v

literal 0
HcmV?d00001

diff --git a/Clean Rebuild.bat b/Clean Rebuild.bat
new file mode 100644
index 000000000..2d958f50a
--- /dev/null
+++ b/Clean Rebuild.bat	
@@ -0,0 +1,139 @@
+@ECHO OFF
+
+ECHO.
+ECHO.     This build script requires the following software to be installed:
+ECHO.       - Microsoft Visual Studio 2008
+ECHO.
+
+SET STUDIODIR=c:\Program Files (x86)\Microsoft Visual Studio 9.0
+
+CALL "%STUDIODIR%\Common7\Tools\vsvars32.bat"
+
+DEL /F /Q "Build\Plugins\*.pdb" > NUL
+
+ECHO.
+ECHO Compiling GZDoom Builder core...
+ECHO.
+IF EXIST "Build\Builder.exe" DEL /F /Q "Build\Builder.exe" > NUL
+IF EXIST "Source\Core\obj" RD /S /Q "Source\Core\obj"
+msbuild "Source\Core\Builder.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Builder.exe" GOTO FILEFAIL
+
+ECHO.
+ECHO Setting /LARGEADDRESSAWARE flag...
+ECHO.
+"%STUDIODIR%\VC\bin\editbin.exe" /LARGEADDRESSAWARE "Build\Builder.exe"
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+
+ECHO.
+ECHO Compiling Builder Effects plugin...
+ECHO.
+IF EXIST "Build\Plugins\BuilderEffects.dll" DEL /F /Q "Build\Plugins\BuilderEffects.dll" > NUL
+IF EXIST "Source\Plugins\BuilderEffects\obj" RD /S /Q "Source\Plugins\BuilderEffects\obj"
+msbuild "Source\Plugins\BuilderEffects\BuilderEffects.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Plugins\BuilderEffects.dll" GOTO FILEFAIL
+
+ECHO.
+ECHO Compiling Builder Modes plugin...
+ECHO.
+IF EXIST "Build\Plugins\BuilderModes.dll" DEL /F /Q "Build\Plugins\BuilderModes.dll" > NUL
+IF EXIST "Source\Plugins\BuilderModes\obj" RD /S /Q "Source\Plugins\BuilderModes\obj"
+msbuild "Source\Plugins\BuilderModes\BuilderModes.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Plugins\BuilderModes.dll" GOTO FILEFAIL
+
+ECHO.
+ECHO Compiling Color Picker plugin...
+ECHO.
+IF EXIST "Build\Plugins\ColorPicker.dll" DEL /F /Q "Build\Plugins\ColorPicker.dll" > NUL
+IF EXIST "Source\Plugins\ColorPicker\obj" RD /S /Q "Source\Plugins\ColorPicker\obj"
+msbuild "Source\Plugins\ColorPicker\ColorPicker.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Plugins\ColorPicker.dll" GOTO FILEFAIL
+
+ECHO.
+ECHO Compiling Comments Panel plugin...
+ECHO.
+IF EXIST "Build\Plugins\CommentsPanel.dll" DEL /F /Q "Build\Plugins\CommentsPanel.dll" > NUL
+IF EXIST "Source\Plugins\CommentsPanel\obj" RD /S /Q "Source\Plugins\CommentsPanel\obj"
+msbuild "Source\Plugins\CommentsPanel\CommentsPanel.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Plugins\CommentsPanel.dll" GOTO FILEFAIL
+
+ECHO.
+ECHO Compiling Nodes Viewer plugin...
+ECHO.
+IF EXIST "Build\Plugins\NodesViewer.dll" DEL /F /Q "Build\Plugins\NodesViewer.dll" > NUL
+IF EXIST "Source\Plugins\NodesViewer\obj" RD /S /Q "Source\Plugins\NodesViewer\obj"
+msbuild "Source\Plugins\NodesViewer\NodesViewer.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Plugins\NodesViewer.dll" GOTO FILEFAIL
+
+ECHO.
+ECHO Compiling Sound Propagation Mode plugin...
+ECHO.
+IF EXIST "Build\Plugins\SoundPropagationMode.dll" DEL /F /Q "Build\Plugins\SoundPropagationMode.dll" > NUL
+IF EXIST "Source\Plugins\SoundPropagationMode\obj" RD /S /Q "Source\Plugins\SoundPropagationMode\obj"
+msbuild "Source\Plugins\SoundPropagationMode\SoundPropagation.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Plugins\SoundPropagationMode.dll" GOTO FILEFAIL
+
+ECHO.
+ECHO Compiling Stair Sector Builder plugin...
+ECHO.
+IF EXIST "Build\Plugins\StairSectorBuilder.dll" DEL /F /Q "Build\Plugins\StairSectorBuilder.dll" > NUL
+IF EXIST "Source\Plugins\StairSectorBuilder\obj" RD /S /Q "Source\Plugins\StairSectorBuilder\obj"
+msbuild "Source\Plugins\StairSectorBuilder\StairSectorBuilder.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Plugins\StairSectorBuilder.dll" GOTO FILEFAIL
+
+ECHO.
+ECHO Compiling Tag Explorer plugin...
+ECHO.
+IF EXIST "Build\Plugins\TagExplorer.dll" DEL /F /Q "Build\Plugins\TagExplorer.dll" > NUL
+IF EXIST "Source\Plugins\TagExplorer\obj" RD /S /Q "Source\Plugins\TagExplorer\obj"
+msbuild "Source\Plugins\TagExplorer\TagExplorer.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Plugins\TagExplorer.dll" GOTO FILEFAIL
+
+ECHO.
+ECHO Compiling Tag Range plugin...
+ECHO.
+IF EXIST "Build\Plugins\TagRange.dll" DEL /F /Q "Build\Plugins\TagRange.dll" > NUL
+IF EXIST "Source\Plugins\TagRange\obj" RD /S /Q "Source\Plugins\TagRange\obj"
+msbuild "Source\Plugins\TagRange\TagRange.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Plugins\TagRange.dll" GOTO FILEFAIL
+
+ECHO.
+ECHO Compiling Visplane Explorer plugin...
+ECHO.
+IF EXIST "Build\Plugins\VisplaneExplorer.dll" DEL /F /Q "Build\Plugins\VisplaneExplorer.dll" > NUL
+IF EXIST "Source\Plugins\VisplaneExplorer\obj" RD /S /Q "Source\Plugins\VisplaneExplorer\obj"
+msbuild "Source\Plugins\VisplaneExplorer\VisplaneExplorer.csproj" /t:Rebuild /p:Configuration=Release /p:Platform=x86 /v:minimal
+IF %ERRORLEVEL% NEQ 0 GOTO ERRORFAIL
+IF NOT EXIST "Build\Plugins\VisplaneExplorer.dll" GOTO FILEFAIL
+
+ECHO.
+ECHO.     BUILD DONE !
+ECHO.
+PAUSE > NUL
+GOTO LEAVE
+
+:ERRORFAIL
+ECHO.
+ECHO.     BUILD FAILED (Tool returned error %ERRORLEVEL%)
+ECHO.
+PAUSE > NUL
+GOTO LEAVE
+
+:FILEFAIL
+ECHO.
+ECHO.     BUILD FAILED (Output file was not built)
+ECHO.
+PAUSE > NUL
+GOTO LEAVE
+
+:LEAVE
diff --git a/Source/Core/Controls/AutoSelectTextbox.cs b/Source/Core/Controls/AutoSelectTextbox.cs
index 3105a58ec..b96fb04d3 100644
--- a/Source/Core/Controls/AutoSelectTextbox.cs
+++ b/Source/Core/Controls/AutoSelectTextbox.cs
@@ -79,6 +79,14 @@ namespace CodeImp.DoomBuilder.Controls
 			base.OnKeyDown(e);
 			eventcount++;
 		}
+
+		//mxd
+		new public bool Focus()
+		{
+			bool result = base.Focus();
+			this.Select(0, 0);
+			return result;
+		}
 		
 		#endregion
 	}
diff --git a/Source/Core/Controls/ButtonsNumericTextbox.Designer.cs b/Source/Core/Controls/ButtonsNumericTextbox.Designer.cs
index fead3e51a..c9ae97fe8 100644
--- a/Source/Core/Controls/ButtonsNumericTextbox.Designer.cs
+++ b/Source/Core/Controls/ButtonsNumericTextbox.Designer.cs
@@ -28,7 +28,9 @@ namespace CodeImp.DoomBuilder.Controls
 		/// </summary>
 		private void InitializeComponent()
 		{
+			this.components = new System.ComponentModel.Container();
 			this.buttons = new System.Windows.Forms.VScrollBar();
+			this.tooltip = new System.Windows.Forms.ToolTip(this.components);
 			this.textbox = new CodeImp.DoomBuilder.Controls.NumericTextbox();
 			this.SuspendLayout();
 			// 
@@ -42,12 +44,14 @@ namespace CodeImp.DoomBuilder.Controls
 			this.buttons.Size = new System.Drawing.Size(18, 24);
 			this.buttons.TabIndex = 1;
 			this.buttons.ValueChanged += new System.EventHandler(this.buttons_ValueChanged);
+			this.buttons.MouseEnter += new System.EventHandler(this.buttons_MouseEnter);
 			// 
 			// textbox
 			// 
 			this.textbox.AllowDecimal = false;
 			this.textbox.AllowNegative = false;
 			this.textbox.AllowRelative = false;
+			this.textbox.ForeColor = System.Drawing.SystemColors.WindowText;
 			this.textbox.ImeMode = System.Windows.Forms.ImeMode.Off;
 			this.textbox.Location = new System.Drawing.Point(0, 2);
 			this.textbox.Name = "textbox";
@@ -75,5 +79,6 @@ namespace CodeImp.DoomBuilder.Controls
 
 		private NumericTextbox textbox;
 		private System.Windows.Forms.VScrollBar buttons;
+		private System.Windows.Forms.ToolTip tooltip;
 	}
 }
diff --git a/Source/Core/Controls/ButtonsNumericTextbox.cs b/Source/Core/Controls/ButtonsNumericTextbox.cs
index fa0d277a2..fc5b50d12 100644
--- a/Source/Core/Controls/ButtonsNumericTextbox.cs
+++ b/Source/Core/Controls/ButtonsNumericTextbox.cs
@@ -18,6 +18,7 @@
 
 using System;
 using System.ComponentModel;
+using System.Globalization;
 using System.Windows.Forms;
 
 #endregion
@@ -41,21 +42,27 @@ namespace CodeImp.DoomBuilder.Controls
 		private StepsList steps;
 		private int stepsize = 1;
 		private float stepsizeFloat = 1.0f; //mxd
+		private float stepsizeBig = 10.0f; //mxd
+		private float stepsizeSmall = 0.1f; //mxd
 		private bool wrapsteps; //mxd
+		private bool usemodifierkeys; //mxd
 		
 		#endregion
 
 		#region ================== Properties
 
-		public bool AllowDecimal { get { return textbox.AllowDecimal; } set { textbox.AllowDecimal = value; } }
+		public bool AllowDecimal { get { return textbox.AllowDecimal; } set { textbox.AllowDecimal = value; UpdateButtonsTooltip(); } }
 		public bool AllowNegative { get { return textbox.AllowNegative; } set { textbox.AllowNegative = value; } }
 		public bool AllowRelative { get { return textbox.AllowRelative; } set { textbox.AllowRelative = value; } }
 		public int ButtonStep { get { return stepsize; } set { stepsize = value; } }
 		public float ButtonStepFloat { get { return stepsizeFloat; } set { stepsizeFloat = value; } } //mxd. This is used when AllowDecimal is true
+		public float ButtonStepBig { get { return stepsizeBig; } set { stepsizeBig = value; } } //mxd
+		public float ButtonStepSmall { get { return stepsizeSmall; } set { stepsizeSmall = value; } } //mxd
 		override public string Text { get { return textbox.Text; } set { textbox.Text = value; } }
 		internal NumericTextbox Textbox { get { return textbox; } }
-		public StepsList StepValues { get { return steps; } set { steps = value; } }
+		public StepsList StepValues { get { return steps; } set { steps = value; UpdateButtonsTooltip(); } }
 		public bool ButtonStepsWrapAround { get { return wrapsteps; } set { wrapsteps = value; } }
+		public bool ButtonStepsUseModifierKeys { get { return usemodifierkeys; } set { usemodifierkeys = value; UpdateButtonsTooltip(); } }
 
 		#endregion
 		
@@ -67,6 +74,7 @@ namespace CodeImp.DoomBuilder.Controls
 			InitializeComponent();
 			buttons.Value = 0;
 			textbox.MouseWheel += textbox_MouseWheel;
+			UpdateButtonsTooltip(); //mxd
 		}
 
 		#endregion
@@ -110,7 +118,7 @@ namespace CodeImp.DoomBuilder.Controls
 				ignorebuttonchange = true;
 				if(!textbox.CheckIsRelative())
 				{
-					if(steps != null)
+					if(steps != null && (!usemodifierkeys || (!textbox.ControlPressed && !textbox.ShiftPressed)))
 					{
 						if(buttons.Value < 0)
 							textbox.Text = steps.GetNextHigherWrap(textbox.GetResult(0), wrapsteps).ToString(); //mxd
@@ -119,13 +127,25 @@ namespace CodeImp.DoomBuilder.Controls
 					}
 					else if(textbox.AllowDecimal)
 					{
-						float newvalue = (float)Math.Round(textbox.GetResultFloat(0.0f) - (buttons.Value * stepsizeFloat), General.Map.FormatInterface.VertexDecimals);
+						float stepsizemod; //mxd
+						if(usemodifierkeys)
+							stepsizemod = (textbox.ControlPressed ? stepsizeSmall : (textbox.ShiftPressed ? stepsizeBig : stepsizeFloat));
+						else
+							stepsizemod = stepsizeFloat;
+						
+						float newvalue = (float)Math.Round(textbox.GetResultFloat(0.0f) - (buttons.Value * stepsizemod), General.Map.FormatInterface.VertexDecimals);
 						if((newvalue < 0.0f) && !textbox.AllowNegative) newvalue = 0.0f;
-						textbox.Text = newvalue.ToString("0.0");
+						textbox.Text = newvalue.ToString();
 					}
 					else
 					{
-						int newvalue = textbox.GetResult(0) - (buttons.Value * stepsize);
+						int stepsizemod; //mxd
+						if(usemodifierkeys) 
+							stepsizemod = (textbox.ControlPressed ? (int)stepsizeSmall : (textbox.ShiftPressed ? (int)stepsizeBig : stepsize));
+						else
+							stepsizemod = stepsize;
+						
+						int newvalue = textbox.GetResult(0) - (buttons.Value * stepsizemod);
 						if((newvalue < 0) && !textbox.AllowNegative) newvalue = 0;
 						textbox.Text = newvalue.ToString();
 					}
@@ -140,10 +160,16 @@ namespace CodeImp.DoomBuilder.Controls
 			}
 		}
 
+		//mxd
+		private void buttons_MouseEnter(object sender, EventArgs e) 
+		{
+			textbox.Focus();
+		}
+
 		// Mouse wheel used
 		private void textbox_MouseWheel(object sender, MouseEventArgs e)
 		{
-			if(steps != null)
+			if(steps != null && (!usemodifierkeys || (!textbox.ControlPressed && !textbox.ShiftPressed)))
 			{
 				if(e.Delta > 0)
 					textbox.Text = steps.GetNextHigher(textbox.GetResult(0)).ToString();
@@ -185,7 +211,24 @@ namespace CodeImp.DoomBuilder.Controls
 		{
 			return textbox.GetResultFloat(original);
 		}
-		
+
+		//mxd
+		public void UpdateButtonsTooltip()
+		{
+			if(usemodifierkeys)
+			{
+				string tip = "Hold Ctrl to change value by " + stepsizeSmall.ToString(CultureInfo.InvariantCulture) + "." + Environment.NewLine +
+				             "Hold Shift to change value by " + stepsizeBig.ToString(CultureInfo.InvariantCulture) + ".";
+				tooltip.SetToolTip(buttons, tip);
+				textbox.UpdateTextboxStyle(tip);
+			}
+			else
+			{
+				tooltip.RemoveAll();
+				textbox.UpdateTextboxStyle();
+			}
+		}
+
 		#endregion
 	}
 }
diff --git a/Source/Core/Controls/ButtonsNumericTextbox.resx b/Source/Core/Controls/ButtonsNumericTextbox.resx
index c225af085..d7c401628 100644
--- a/Source/Core/Controls/ButtonsNumericTextbox.resx
+++ b/Source/Core/Controls/ButtonsNumericTextbox.resx
@@ -1,129 +1,132 @@
 <?xml version="1.0" encoding="utf-8"?>
 <root>
   <!-- 
-	Microsoft ResX Schema 
-	
-	Version 2.0
-	
-	The primary goals of this format is to allow a simple XML format 
-	that is mostly human readable. The generation and parsing of the 
-	various data types are done through the TypeConverter classes 
-	associated with the data types.
-	
-	Example:
-	
-	... ado.net/XML headers & schema ...
-	<resheader name="resmimetype">text/microsoft-resx</resheader>
-	<resheader name="version">2.0</resheader>
-	<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-	<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-	<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-	<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-	<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-		<value>[base64 mime encoded serialized .NET Framework object]</value>
-	</data>
-	<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-		<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-		<comment>This is a comment</comment>
-	</data>
-				
-	There are any number of "resheader" rows that contain simple 
-	name/value pairs.
-	
-	Each data row contains a name, and value. The row also contains a 
-	type or mimetype. Type corresponds to a .NET class that support 
-	text/value conversion through the TypeConverter architecture. 
-	Classes that don't support this are serialized and stored with the 
-	mimetype set.
-	
-	The mimetype is used for serialized objects, and tells the 
-	ResXResourceReader how to depersist the object. This is currently not 
-	extensible. For a given mimetype the value must be set accordingly:
-	
-	Note - application/x-microsoft.net.object.binary.base64 is the format 
-	that the ResXResourceWriter will generate, however the reader can 
-	read any of the formats listed below.
-	
-	mimetype: application/x-microsoft.net.object.binary.base64
-	value   : The object must be serialized with 
-			: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-			: and then encoded with base64 encoding.
-	
-	mimetype: application/x-microsoft.net.object.soap.base64
-	value   : The object must be serialized with 
-			: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-			: and then encoded with base64 encoding.
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
 
-	mimetype: application/x-microsoft.net.object.bytearray.base64
-	value   : The object must be serialized into a byte array 
-			: using a System.ComponentModel.TypeConverter
-			: and then encoded with base64 encoding.
-	-->
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
   <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-	<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-	<xsd:element name="root" msdata:IsDataSet="true">
-	  <xsd:complexType>
-		<xsd:choice maxOccurs="unbounded">
-		  <xsd:element name="metadata">
-			<xsd:complexType>
-			  <xsd:sequence>
-				<xsd:element name="value" type="xsd:string" minOccurs="0" />
-			  </xsd:sequence>
-			  <xsd:attribute name="name" use="required" type="xsd:string" />
-			  <xsd:attribute name="type" type="xsd:string" />
-			  <xsd:attribute name="mimetype" type="xsd:string" />
-			  <xsd:attribute ref="xml:space" />
-			</xsd:complexType>
-		  </xsd:element>
-		  <xsd:element name="assembly">
-			<xsd:complexType>
-			  <xsd:attribute name="alias" type="xsd:string" />
-			  <xsd:attribute name="name" type="xsd:string" />
-			</xsd:complexType>
-		  </xsd:element>
-		  <xsd:element name="data">
-			<xsd:complexType>
-			  <xsd:sequence>
-				<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-				<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-			  </xsd:sequence>
-			  <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-			  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-			  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-			  <xsd:attribute ref="xml:space" />
-			</xsd:complexType>
-		  </xsd:element>
-		  <xsd:element name="resheader">
-			<xsd:complexType>
-			  <xsd:sequence>
-				<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-			  </xsd:sequence>
-			  <xsd:attribute name="name" type="xsd:string" use="required" />
-			</xsd:complexType>
-		  </xsd:element>
-		</xsd:choice>
-	  </xsd:complexType>
-	</xsd:element>
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
   </xsd:schema>
   <resheader name="resmimetype">
-	<value>text/microsoft-resx</value>
+    <value>text/microsoft-resx</value>
   </resheader>
   <resheader name="version">
-	<value>2.0</value>
+    <value>2.0</value>
   </resheader>
   <resheader name="reader">
-	<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-	<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <metadata name="buttons.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-	<value>True</value>
+    <value>True</value>
+  </metadata>
+  <metadata name="tooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
   </metadata>
   <metadata name="textbox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-	<value>True</value>
+    <value>True</value>
   </metadata>
   <metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-	<value>True</value>
+    <value>True</value>
   </metadata>
 </root>
\ No newline at end of file
diff --git a/Source/Core/Controls/NumericTextbox.cs b/Source/Core/Controls/NumericTextbox.cs
index 62b443717..7c21f266b 100644
--- a/Source/Core/Controls/NumericTextbox.cs
+++ b/Source/Core/Controls/NumericTextbox.cs
@@ -38,6 +38,7 @@ namespace CodeImp.DoomBuilder.Controls
 		private bool allowrelative;		// Allow ++, --, * and / prefix for relative changes
 		private bool allowdecimal;		// Allow decimal (float) numbers
 		private bool controlpressed;
+		private bool shiftpressed; //mxd
 		private readonly ToolTip tooltip; //mxd
 		
 		#endregion
@@ -48,6 +49,9 @@ namespace CodeImp.DoomBuilder.Controls
 		public bool AllowRelative { get { return allowrelative; } set { allowrelative = value; UpdateTextboxStyle(); } }
 		public bool AllowDecimal  { get { return allowdecimal; } set { allowdecimal = value; } }
 
+		public bool ControlPressed { get { return controlpressed; } } //mxd
+		public bool ShiftPressed { get { return shiftpressed; } } //mxd
+
 		#endregion
 
 		#region ================== Constructor / Disposer
@@ -69,6 +73,7 @@ namespace CodeImp.DoomBuilder.Controls
 		protected override void OnKeyDown(KeyEventArgs e)
 		{
 			controlpressed = e.Control;
+			shiftpressed = e.Shift; //mxd
 			base.OnKeyDown(e);
 		}
 
@@ -76,6 +81,7 @@ namespace CodeImp.DoomBuilder.Controls
 		protected override void OnKeyUp(KeyEventArgs e)
 		{
 			controlpressed = e.Control;
+			shiftpressed = e.Shift; //mxd
 			base.OnKeyUp(e);
 		}
 		
@@ -185,7 +191,7 @@ namespace CodeImp.DoomBuilder.Controls
 				if(float.TryParse(textpart, NumberStyles.Float, CultureInfo.CurrentCulture, out value)) 
 				{
 					if(value == Math.Round(value))
-						this.Text = this.Text.Replace(textpart, value.ToString("0.0"));
+						this.Text = this.Text.Replace(textpart, value.ToString());
 				}
 			}
 			
@@ -302,7 +308,7 @@ namespace CodeImp.DoomBuilder.Controls
 				if(this.Text.StartsWith("/")) 
 				{
 					// Divide original by number
-					if (!float.TryParse(textpart, NumberStyles.Float, CultureInfo.CurrentCulture, out result)) return original;
+					if(!float.TryParse(textpart, NumberStyles.Float, CultureInfo.CurrentCulture, out result)) return original;
 					float newvalue = (float)Math.Round(original / result, 3);
 					if(!allownegative && (newvalue < 0)) newvalue = 0;
 					return newvalue;
@@ -319,12 +325,22 @@ namespace CodeImp.DoomBuilder.Controls
 		}
 
 		//mxd
-		private void UpdateTextboxStyle() 
+		public void UpdateTextboxStyle()
+		{
+			UpdateTextboxStyle(string.Empty);
+		}
+
+		//mxd
+		public void UpdateTextboxStyle(string tip) 
 		{
 			this.ForeColor = (allowrelative ? SystemColors.HotTrack : SystemColors.WindowText);
 			if (allowrelative)
 			{
-				tooltip.SetToolTip(this, "Use ++ or -- prefixes to change\r\nexisting values by given value.\r\nUse * or / prefixes to multiply\r\nor divide existing values by given value.");
+				tooltip.SetToolTip(this, "Use ++ or -- prefixes to change\r\nexisting values by given value.\r\nUse * or / prefixes to multiply\r\nor divide existing values by given value." + Environment.NewLine + tip);
+			}
+			else if(!string.IsNullOrEmpty(tip))
+			{
+				tooltip.SetToolTip(this, tip);
 			}
 			else
 			{
diff --git a/Source/Core/GZBuilder/Controls/PairedFieldsControl.cs b/Source/Core/GZBuilder/Controls/PairedFieldsControl.cs
index 951c98f35..ebed86814 100644
--- a/Source/Core/GZBuilder/Controls/PairedFieldsControl.cs
+++ b/Source/Core/GZBuilder/Controls/PairedFieldsControl.cs
@@ -1,6 +1,7 @@
 #region ================== Namespaces
 
 using System;
+using System.Globalization;
 using System.Windows.Forms;
 using CodeImp.DoomBuilder.Map;
 using CodeImp.DoomBuilder.GZBuilder.Tools;
@@ -40,6 +41,9 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls
 		public bool AllowDecimal { get { return value1.AllowDecimal; } set { value1.AllowDecimal = value; value2.AllowDecimal = value; } }
 		public int ButtonStep { get { return value1.ButtonStep; } set { value1.ButtonStep = value; value2.ButtonStep = value; } }
 		public float ButtonStepFloat { get { return value1.ButtonStepFloat; } set { value1.ButtonStepFloat = value; value2.ButtonStepFloat = value; } }
+		public float ButtonStepBig { get { return value1.ButtonStepBig; } set { value1.ButtonStepBig = value; value2.ButtonStepBig = value; } }
+		public float ButtonStepSmall { get { return value1.ButtonStepSmall; } set { value1.ButtonStepSmall = value; value2.ButtonStepSmall = value; } }
+		public bool ButtonStepsUseModifierKeys { get { return value1.ButtonStepsUseModifierKeys; } set { value1.ButtonStepsUseModifierKeys = value; value2.ButtonStepsUseModifierKeys = value; } }
 		public bool AllowValueLinking { get { return allowValueLinking; } set { allowValueLinking = value; UpdateButtons(); } }
 		public bool LinkValues { get { return linkValues; } set { linkValues = value; UpdateButtons(); } }
 
@@ -66,16 +70,13 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls
 
 			if(AllowDecimal) 
 			{
-				float val1 = UDMFTools.GetFloat(fields, field1, defaultValue);
-				newValue1 = (val1 == Math.Round(val1) ? val1.ToString("0.0") : val1.ToString());
-
-				float val2 = UDMFTools.GetFloat(fields, field2, defaultValue);
-				newValue2 = (val2 == Math.Round(val2) ? val2.ToString("0.0") : val2.ToString());
+				newValue1 = ((float)Math.Round(UDMFTools.GetFloat(fields, field1, defaultValue), 2)).ToString();
+				newValue2 = ((float)Math.Round(UDMFTools.GetFloat(fields, field2, defaultValue), 2)).ToString();
 			} 
 			else 
 			{
-				newValue1 = UDMFTools.GetFloat(fields, field1, defaultValue).ToString();
-				newValue2 = UDMFTools.GetFloat(fields, field2, defaultValue).ToString();
+				newValue1 = ((float)Math.Round(UDMFTools.GetFloat(fields, field1, defaultValue))).ToString();
+				newValue2 = ((float)Math.Round(UDMFTools.GetFloat(fields, field2, defaultValue))).ToString();
 			}
 
 			if(first) 
@@ -142,9 +143,8 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls
 
 		private void bReset_Click(object sender, EventArgs e) 
 		{
-			string newValue = value1.AllowDecimal ? String.Format("{0:0.0}", defaultValue) : defaultValue.ToString();
-			value1.Text = newValue;
-			value2.Text = newValue;
+			value1.Text = defaultValue.ToString(CultureInfo.CurrentCulture);
+			value2.Text = defaultValue.ToString(CultureInfo.CurrentCulture);
 			CheckValues();
 		}
 
diff --git a/Source/Core/GZBuilder/Controls/PairedFloatControl.cs b/Source/Core/GZBuilder/Controls/PairedFloatControl.cs
index c930891f0..bb6250cc0 100644
--- a/Source/Core/GZBuilder/Controls/PairedFloatControl.cs
+++ b/Source/Core/GZBuilder/Controls/PairedFloatControl.cs
@@ -27,6 +27,9 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls
 		public bool NonDefaultValue { get { return changed; } }
         public float DefaultValue { get { return defaultValue; } set { defaultValue = value; } }
         public float ButtonStep { get { return value1.ButtonStepFloat; } set { value1.ButtonStepFloat = value; value2.ButtonStepFloat = value; } }
+		public float ButtonStepBig { get { return value1.ButtonStepBig; } set { value1.ButtonStepBig = value; value2.ButtonStepBig = value; } }
+		public float ButtonStepSmall { get { return value1.ButtonStepSmall; } set { value1.ButtonStepSmall = value; value2.ButtonStepSmall = value; } }
+		public bool ButtonStepsUseModifierKeys { get { return value1.ButtonStepsUseModifierKeys; } set { value1.ButtonStepsUseModifierKeys = value; value2.ButtonStepsUseModifierKeys = value; } }
 
         #endregion
         
@@ -41,15 +44,15 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls
 
             if (first) 
 			{
-                value1.Text = val1.ToString(CultureInfo.InvariantCulture);
-                value2.Text = val2.ToString(CultureInfo.InvariantCulture);
+                value1.Text = val1.ToString(CultureInfo.CurrentCulture);
+				value2.Text = val2.ToString(CultureInfo.CurrentCulture);
             } 
 			else 
 			{
-                if (!string.IsNullOrEmpty(value1.Text) && value1.Text != val1.ToString(CultureInfo.InvariantCulture))
+				if(!string.IsNullOrEmpty(value1.Text) && value1.Text != val1.ToString(CultureInfo.CurrentCulture))
                     value1.Text = string.Empty;
 
-                if (!string.IsNullOrEmpty(value2.Text) && value2.Text != val2.ToString(CultureInfo.InvariantCulture))
+				if(!string.IsNullOrEmpty(value2.Text) && value2.Text != val2.ToString(CultureInfo.CurrentCulture))
                     value2.Text = string.Empty;
             }
 
@@ -79,7 +82,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.Controls
 
         private void bReset_Click(object sender, EventArgs e)
         {
-            string newValue = String.Format("{0:0.0}", defaultValue);
+	        string newValue = defaultValue.ToString(CultureInfo.CurrentCulture);
             value1.Text = newValue;
             value2.Text = newValue;
             CheckValues();
diff --git a/Source/Core/General/General.cs b/Source/Core/General/General.cs
index 0cf89362f..2da64f9b0 100644
--- a/Source/Core/General/General.cs
+++ b/Source/Core/General/General.cs
@@ -1056,7 +1056,23 @@ namespace CodeImp.DoomBuilder
 					
 					// Create map manager with given options
 					map = new MapManager();
-					if(!map.InitializeNewMap(newoptions))
+					if(map.InitializeNewMap(newoptions))
+					{
+						settings.FindDefaultDrawSettings(); //mxd
+
+						// Let the plugins know
+						plugins.OnMapNewEnd();
+
+						// All done
+						mainwindow.SetupInterface();
+						mainwindow.RedrawDisplay();
+						mainwindow.UpdateThingsFilters();
+						mainwindow.UpdateInterface();
+						mainwindow.AddHintsDocker(); //mxd
+						mainwindow.UpdateGZDoomPanel(); //mxd
+						mainwindow.HideInfo(); //mxd
+					}
+					else
 					{
 						// Unable to create map manager
 						map.Dispose();
@@ -1066,20 +1082,6 @@ namespace CodeImp.DoomBuilder
 						mainwindow.ShowSplashDisplay();
 					}
 
-					settings.FindDefaultDrawSettings(); //mxd
-
-					// Let the plugins know
-					plugins.OnMapNewEnd();
-
-					// All done
-					mainwindow.SetupInterface();
-					mainwindow.RedrawDisplay();
-					mainwindow.UpdateThingsFilters();
-					mainwindow.UpdateInterface();
-					mainwindow.AddHintsDocker(); //mxd
-					mainwindow.UpdateGZDoomPanel(); //mxd
-					mainwindow.HideInfo(); //mxd
-
 					if(errorlogger.IsErrorAdded)
 					{
 						// Show any errors if preferred
diff --git a/Source/Core/Resources/Actions.cfg b/Source/Core/Resources/Actions.cfg
index cfba04b3a..55854e409 100644
--- a/Source/Core/Resources/Actions.cfg
+++ b/Source/Core/Resources/Actions.cfg
@@ -1231,7 +1231,7 @@ movethingback
 
 placethingatcursor
 {
-	title = "Move Thing To Cursor Location";
+	title = "Move Thing to Cursor Location";
 	category = "visual";
 	description = "Moves selected Things to cursor location preserving relative offsets in Visual Modes.";
 	allowkeys = true;
diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs
index 63b09ba29..040d8ef93 100644
--- a/Source/Core/Windows/MainForm.cs
+++ b/Source/Core/Windows/MainForm.cs
@@ -2083,7 +2083,7 @@ namespace CodeImp.DoomBuilder.Windows
 
 		private void toolbarContextMenu_Closing(object sender, ToolStripDropDownClosingEventArgs e) 
 		{
-			e.Cancel = toolbarContextMenuShiftPressed;
+			e.Cancel = (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked && toolbarContextMenuShiftPressed);
 		}
 
 		private void toolbarContextMenu_KeyDown(object sender, KeyEventArgs e) 
-- 
GitLab