mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-26 22:01:45 +00:00
Added RandomFloat Universal field type. To use it, change Filed type to "Decimal (random)" and enter a value as 'min max'.
This commit is contained in:
parent
354be81d27
commit
8de9ad6b24
4 changed files with 108 additions and 1 deletions
|
@ -788,6 +788,7 @@
|
|||
<Compile Include="Rendering\SurfaceEntryCollection.cs" />
|
||||
<Compile Include="Rendering\SurfaceManager.cs" />
|
||||
<Compile Include="Rendering\SurfaceUpdate.cs" />
|
||||
<Compile Include="Types\RandomFloatHandler.cs" />
|
||||
<Compile Include="Types\RandomIntegerHandler.cs" />
|
||||
<Compile Include="Types\ThingClassHandler.cs" />
|
||||
<Compile Include="Types\ThingTypeHandler.cs" />
|
||||
|
|
|
@ -1573,6 +1573,11 @@ namespace CodeImp.DoomBuilder
|
|||
return random.Next(min, max);
|
||||
}
|
||||
|
||||
//mxd
|
||||
public static float Random(float min, float max) {
|
||||
return (float)Math.Round(min + (max - min) * random.NextDouble(), 2);
|
||||
}
|
||||
|
||||
// This returns an element from a collection by index
|
||||
public static T GetByIndex<T>(ICollection<T> collection, int index)
|
||||
{
|
||||
|
|
100
Source/Core/Types/RandomFloatHandler.cs
Normal file
100
Source/Core/Types/RandomFloatHandler.cs
Normal file
|
@ -0,0 +1,100 @@
|
|||
#region ================== Namespaces
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using CodeImp.DoomBuilder.Config;
|
||||
|
||||
#endregion
|
||||
|
||||
namespace CodeImp.DoomBuilder.Types
|
||||
{
|
||||
[TypeHandler(UniversalType.RandomFloat, "Decimal (Random)", true)]
|
||||
internal class RandomFloatHandler : TypeHandler
|
||||
{
|
||||
#region ================== Constants
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Variables
|
||||
|
||||
private float value;
|
||||
private bool randomValue;
|
||||
private float min;
|
||||
private float max;
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Properties
|
||||
|
||||
#endregion
|
||||
|
||||
#region ================== Methods
|
||||
|
||||
public override void SetupArgument(TypeHandlerAttribute attr, ArgumentInfo arginfo) {
|
||||
base.SetupArgument(attr, arginfo);
|
||||
|
||||
//mxd. We don't want to store this type
|
||||
index = (int)UniversalType.Float;
|
||||
}
|
||||
|
||||
public override void SetupField(TypeHandlerAttribute attr, UniversalFieldInfo fieldinfo) {
|
||||
base.SetupField(attr, fieldinfo);
|
||||
|
||||
//mxd. We don't want to store this type
|
||||
index = (int)UniversalType.Float;
|
||||
}
|
||||
|
||||
public override void SetValue(object value) {
|
||||
float result;
|
||||
|
||||
// Null?
|
||||
if(value == null) {
|
||||
this.value = 0.0f;
|
||||
}
|
||||
// Compatible type?
|
||||
else if((value is int) || (value is float) || (value is bool)) {
|
||||
// Set directly
|
||||
this.value = Convert.ToSingle(value);
|
||||
} else {
|
||||
// Try parsing as string
|
||||
if(float.TryParse(value.ToString(), NumberStyles.Float, CultureInfo.CurrentCulture, out result)) {
|
||||
this.value = result;
|
||||
} else {
|
||||
//mxd. Try to parse value as random range
|
||||
string[] parts = value.ToString().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
if(parts.Length == 2) {
|
||||
if(float.TryParse(parts[0], NumberStyles.Float, CultureInfo.CurrentCulture, out min) &&
|
||||
float.TryParse(parts[1], NumberStyles.Float, CultureInfo.CurrentCulture, out max)) {
|
||||
randomValue = (min != max);
|
||||
|
||||
if(min == max)
|
||||
this.value = min;
|
||||
else if(min > max)
|
||||
General.Swap(ref min, ref max);
|
||||
}
|
||||
}
|
||||
|
||||
this.value = 0.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override object GetValue() {
|
||||
if(randomValue) return General.Random(min, max); //mxd
|
||||
return this.value;
|
||||
}
|
||||
|
||||
public override int GetIntValue() {
|
||||
if(randomValue) return (int)General.Random(min, max); //mxd
|
||||
return (int)this.value;
|
||||
}
|
||||
|
||||
public override string GetStringValue() {
|
||||
if(randomValue) return General.Random(min, max).ToString(); //mxd
|
||||
return this.value.ToString();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -42,6 +42,7 @@ namespace CodeImp.DoomBuilder.Types
|
|||
AngleDegreesFloat = 17,
|
||||
ThingType = 18,
|
||||
ThingClass = 19,
|
||||
RandomInteger = 20 //mxd
|
||||
RandomInteger = 20, //mxd
|
||||
RandomFloat = 21 //mxd
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue