diff --git a/Help/gc_argumentsettings.html b/Help/gc_argumentsettings.html
index 6c2400af..f550d9ee 100644
--- a/Help/gc_argumentsettings.html
+++ b/Help/gc_argumentsettings.html
@@ -103,6 +103,27 @@ arg0
Allows to specify a color used by rendering shape. Supported values are hex color (like "FF0000"), HTML-formatted hex color (like "#F00" or "#FF0000") or color name (like "Red").
By default rendering shapes will use Event line editor color.
This property must be used in conjunction with the "renderstyle" property.
+
+ minrange (integer) - GZDB only
+ Allows to specify minimum range for the rendering shape.
+ By default minimum range shapes will use Indication editor color.
+ This property must be used in conjunction with the "renderstyle" property.
+
+ minrangecolor (integer) - GZDB only
+ Allows to specify the color used when rendering the minimum range shape. Supported values are hex color (like "FF0000"), HTML-formatted hex color (like "#F00" or "#FF0000") or color name (like "Red").
+By default minimum range shapes will use Indication editor color.
+ This property must be used in conjunction with "renderstyle" and "minrange" properties.
+
+ maxrange (integer) - GZDB only
+ Allows to specify maximum range for the rendering shape.
+ By default maximum range shapes will use Indication editor color.
+ This property must be used in conjunction with the "renderstyle" property.
+
+ maxrangecolor (integer) - GZDB only
+ Allows to specify the color used when rendering the maximum range shape. Supported values are hex color (like "FF0000"), HTML-formatted hex color (like "#F00" or "#FF0000") or color name (like "Red").
+By default maximum range shapes will use Indication editor color.
+ This property must be used in conjunction with "renderstyle" and "maxrange" properties.
+
flags (structure or string) - GZDB only
Provides a list of predefined bit flag values to display for this argument. Used only when argument type is 26.
The value can be either a name of a predefined enum or an explicit definition.
diff --git a/Help/gc_decoratekeys.html b/Help/gc_decoratekeys.html
index 184b8b34..6bff0d05 100644
--- a/Help/gc_decoratekeys.html
+++ b/Help/gc_decoratekeys.html
@@ -73,6 +73,29 @@
This property must be used in conjunction with "//$ArgN" and "//$ArgNRenderStyle" properties.
+ //$ArgNMinRange <integer> - GZDB only.
+ Allows to specify minimum range for the rendering shape.
+ By default minimum range shapes will use Indication editor color.
+ This property must be used in conjunction with "//$ArgN" and "//$ArgNRenderStyle" properties.
+
+
+ //$ArgNMinRangeColor <integer> - GZDB only.
+ Allows to specify the color used when rendering the minimum range shape. Supported values are hex color (like "FF0000"), HTML-formatted hex color (like "#F00" or "#FF0000") or color name (like "Red").
+ By default minimum range shapes will use Indication editor color.
+ This property must be used in conjunction with "//$ArgN", "//$ArgNRenderStyle" and "//$ArgNMinRange" properties.
+
+
+ //$ArgNMaxRange <integer> - GZDB only.
+ Allows to specify maximum range for the rendering shape.
+ By default maximum range shapes will use Indication editor color.
+ This property must be used in conjunction with "//$ArgN" and "//$ArgNRenderStyle" properties.
+
+
+ //$ArgNMaxRangeColor <integer> - GZDB only.
+ Allows to specify the color used when rendering the maximum range shape. Supported values are hex color (like "FF0000"), HTML-formatted hex color (like "#F00" or "#FF0000") or color name (like "Red").
+ By default maximum range shapes will use Indication editor color.
+ This property must be used in conjunction with "//$ArgN", "//$ArgNRenderStyle" and "//$ArgNMaxRange" properties.
+
//$ArgNEnum <string or structure> - GZDB only.
Allows to specify an enum for this argument. This can be either a name of an enum defined in the Game Configuration, or an explicit enum definition. This property must be used in conjunction with the "//$ArgN" property.
@@ -136,15 +159,21 @@ Actor ChexShield : ResistanceRune replaces ResistanceRune 5104
//$Arg3Default 32
//$Arg3RenderStyle "Circle"
//$Arg3RenderColor #ff00ff
+ //$Arg3MinRange 32
+ //$Arg3MaxRange 512
+ //$Arg3MinRangeColor #0000ff
+ //$Arg3MaxRangeColor #ff0000
//$Arg4 "Height"
//$Arg4Type 24
//$Arg4Default 64
+
Height 44
Radius 26
RenderStyle None
Inventory.PickupMessage "Picked up the energized Chex armor!"
+
States
{
diff --git a/Source/Core/Config/ArgumentInfo.cs b/Source/Core/Config/ArgumentInfo.cs
index 0291b0ee..093b24ec 100644
--- a/Source/Core/Config/ArgumentInfo.cs
+++ b/Source/Core/Config/ArgumentInfo.cs
@@ -34,6 +34,7 @@ namespace CodeImp.DoomBuilder.Config
#region ================== Constants
private const int HELPER_SHAPE_ALPHA = 192; //mxd
+ private const int RANGE_SHAPE_ALPHA = 96; //mxd
#endregion
@@ -60,6 +61,10 @@ namespace CodeImp.DoomBuilder.Config
private readonly HashSet targetclasses; //mxd
private readonly ArgumentRenderStyle renderstyle; //mxd
private readonly PixelColor rendercolor; //mxd
+ private readonly PixelColor minrangecolor; //mxd
+ private readonly PixelColor maxrangecolor; //mxd
+ private readonly int minrange; //mxd
+ private readonly int maxrange; //mxd
#endregion
@@ -75,6 +80,10 @@ namespace CodeImp.DoomBuilder.Config
public object DefaultValue { get { return defaultvalue; } } //mxd
public ArgumentRenderStyle RenderStyle { get { return renderstyle; } } //mxd
public PixelColor RenderColor { get { return rendercolor; } } //mxd
+ public PixelColor MinRangeColor { get { return minrangecolor; } } //mxd
+ public PixelColor MaxRangeColor { get { return maxrangecolor; } } //mxd
+ public int MinRange { get { return minrange; } } //mxd
+ public int MaxRange { get { return maxrange; } } //mxd
#endregion
@@ -110,22 +119,54 @@ namespace CodeImp.DoomBuilder.Config
if(this.renderstyle != ArgumentRenderStyle.NONE)
{
+ // Get rendercolor
string rendercolor = cfg.ReadSetting(argspath + ".arg" + istr + ".rendercolor", string.Empty);
- if(!string.IsNullOrEmpty(rendercolor))
+ this.rendercolor = General.Colors.InfoLine;
+
+ if(!string.IsNullOrEmpty(rendercolor) && !ZDTextParser.GetColorFromString(rendercolor, ref this.rendercolor))
+ General.ErrorLogger.Add(ErrorType.Error, "\"" + argspath + ".arg" + istr + "\": action argument \"" + this.title + "\": unable to get rendercolor from value \"" + rendercolor + "\"!");
+
+ this.rendercolor.a = HELPER_SHAPE_ALPHA;
+
+ // Get minrange settings
+ string minrange = cfg.ReadSetting(argspath + ".arg" + istr + ".minrange", string.Empty);
+ if(int.TryParse(minrange, NumberStyles.Integer, CultureInfo.InvariantCulture, out this.minrange) && this.minrange > 0f)
{
- if(!ZDTextParser.GetColorFromString(rendercolor, ref this.rendercolor))
- {
- General.ErrorLogger.Add(ErrorType.Error, "\"" + argspath + ".arg" + istr + "\": action argument \"" + this.title + "\": unable to get rendercolor from value \"" + rendercolor + "\"!");
- this.rendercolor = General.Colors.InfoLine.WithAlpha(HELPER_SHAPE_ALPHA);
- }
- else
- {
- this.rendercolor.a = HELPER_SHAPE_ALPHA;
- }
+ // Get minrangecolor
+ string minrangecolor = cfg.ReadSetting(argspath + ".arg" + istr + ".minrangecolor", string.Empty);
+ this.minrangecolor = General.Colors.Indication;
+
+ if(!string.IsNullOrEmpty(minrangecolor) && !ZDTextParser.GetColorFromString(minrangecolor, ref this.minrangecolor))
+ General.ErrorLogger.Add(ErrorType.Error, "\"" + argspath + ".arg" + istr + "\": action argument \"" + this.title + "\": unable to get minrangecolor from value \"" + minrangecolor + "\"!");
+
+ this.minrangecolor.a = RANGE_SHAPE_ALPHA;
}
- else
+
+ // Get maxrange settings
+ string maxrange = cfg.ReadSetting(argspath + ".arg" + istr + ".maxrange", string.Empty);
+ if(int.TryParse(maxrange, NumberStyles.Integer, CultureInfo.InvariantCulture, out this.maxrange) && this.maxrange > 0f)
{
- this.rendercolor = General.Colors.InfoLine.WithAlpha(HELPER_SHAPE_ALPHA);
+ // Get minrangecolor
+ string maxrangecolor = cfg.ReadSetting(argspath + ".arg" + istr + ".maxrangecolor", string.Empty);
+ this.maxrangecolor = General.Colors.Indication;
+
+ if(!string.IsNullOrEmpty(maxrangecolor) && !ZDTextParser.GetColorFromString(maxrangecolor, ref this.maxrangecolor))
+ General.ErrorLogger.Add(ErrorType.Error, "\"" + argspath + ".arg" + istr + "\": action argument \"" + this.title + "\": unable to get maxrangecolor from value \"" + maxrangecolor + "\"!");
+
+ this.maxrangecolor.a = RANGE_SHAPE_ALPHA;
+ }
+
+ // Update tooltip?
+ if(this.minrange > 0f || this.maxrange > 0f)
+ {
+ if(!string.IsNullOrEmpty(this.tooltip)) this.tooltip += Environment.NewLine;
+
+ if(this.minrange > 0f && this.maxrange > 0f)
+ this.tooltip += "Range: " + this.minrange + " - " + this.maxrange;
+ else if(this.minrange > 0f)
+ this.tooltip += "Minimum range: " + this.minrange;
+ else
+ this.tooltip += "Maximum range: " + this.maxrange;
}
}
@@ -196,6 +237,7 @@ namespace CodeImp.DoomBuilder.Config
//mxd. Constructor for an argument info defined in DECORATE
internal ArgumentInfo(string actorname, string argtitle, string tooltip, string renderstyle, string rendercolor,
+ string minrange, string minrangecolor, string maxrange, string maxrangecolor,
int type, int defaultvalue, string enumstr, IDictionary enums)
{
this.used = true;
@@ -218,21 +260,49 @@ namespace CodeImp.DoomBuilder.Config
if(this.renderstyle != ArgumentRenderStyle.NONE)
{
- if(!string.IsNullOrEmpty(rendercolor))
+ // Get rendercolor
+ this.rendercolor = General.Colors.InfoLine;
+
+ if(!string.IsNullOrEmpty(rendercolor) && !ZDTextParser.GetColorFromString(rendercolor, ref this.rendercolor))
+ General.ErrorLogger.Add(ErrorType.Error, actorname + ": action argument \"" + argtitle + "\": unable to get rendercolor from value \"" + rendercolor + "\"!");
+
+ this.rendercolor.a = HELPER_SHAPE_ALPHA;
+
+ // Get minrange settings
+ if(int.TryParse(minrange, NumberStyles.Integer, CultureInfo.InvariantCulture, out this.minrange) && this.minrange > 0f)
{
- if(!ZDTextParser.GetColorFromString(rendercolor, ref this.rendercolor))
- {
- General.ErrorLogger.Add(ErrorType.Error, actorname + ": action argument \"" + argtitle + "\": unable to get rendercolor from value \"" + rendercolor + "\"!");
- this.rendercolor = General.Colors.InfoLine.WithAlpha(HELPER_SHAPE_ALPHA);
- }
- else
- {
- this.rendercolor.a = HELPER_SHAPE_ALPHA;
- }
+ // Get minrangecolor
+ this.minrangecolor = General.Colors.Indication;
+
+ if(!string.IsNullOrEmpty(minrangecolor) && !ZDTextParser.GetColorFromString(minrangecolor, ref this.minrangecolor))
+ General.ErrorLogger.Add(ErrorType.Error, actorname + ": action argument \"" + this.title + "\": unable to get minrangecolor from value \"" + minrangecolor + "\"!");
+
+ this.minrangecolor.a = RANGE_SHAPE_ALPHA;
}
- else
+
+ // Get maxrange settings
+ if(int.TryParse(maxrange, NumberStyles.Integer, CultureInfo.InvariantCulture, out this.maxrange) && this.maxrange > 0f)
{
- this.rendercolor = General.Colors.InfoLine.WithAlpha(HELPER_SHAPE_ALPHA);
+ // Get minrangecolor
+ this.maxrangecolor = General.Colors.Indication;
+
+ if(!string.IsNullOrEmpty(maxrangecolor) && !ZDTextParser.GetColorFromString(maxrangecolor, ref this.maxrangecolor))
+ General.ErrorLogger.Add(ErrorType.Error, actorname + ": action argument \"" + this.title + "\": unable to get maxrangecolor from value \"" + maxrangecolor + "\"!");
+
+ this.maxrangecolor.a = RANGE_SHAPE_ALPHA;
+ }
+
+ // Update tooltip?
+ if(this.minrange > 0f || this.maxrange > 0f)
+ {
+ if(!string.IsNullOrEmpty(this.tooltip)) this.tooltip += Environment.NewLine + Environment.NewLine;
+
+ if(this.minrange > 0f && this.maxrange > 0f)
+ this.tooltip += "Expected range: " + this.minrange + " - " + this.maxrange;
+ else if(this.minrange > 0f)
+ this.tooltip += "Minimum: " + this.minrange;
+ else
+ this.tooltip += "Maximum: " + this.maxrange;
}
}
diff --git a/Source/Core/Config/ThingTypeInfo.cs b/Source/Core/Config/ThingTypeInfo.cs
index 51c0d411..a0d66cdd 100644
--- a/Source/Core/Config/ThingTypeInfo.cs
+++ b/Source/Core/Config/ThingTypeInfo.cs
@@ -477,8 +477,23 @@ namespace CodeImp.DoomBuilder.Config
int defaultvalue = actor.GetPropertyValueInt("$arg" + i + "default", 0);
string argenum = ZDTextParser.StripQuotes(actor.GetPropertyAllValues("$arg" + i + "enum"));
string argrenderstyle = ZDTextParser.StripQuotes(actor.GetPropertyAllValues("$arg" + i + "renderstyle"));
- string argrendercolor = ZDTextParser.StripQuotes(actor.GetPropertyAllValues("$arg" + i + "rendercolor"));
- args[i] = new ArgumentInfo(title, argtitle, argtooltip, argrenderstyle, argrendercolor, argtype, defaultvalue, argenum, General.Map.Config.Enums);
+ string argrendercolor, minrange, maxrange, minrangecolor, maxrangecolor;
+ if(!string.IsNullOrEmpty(argrenderstyle))
+ {
+ argrendercolor = ZDTextParser.StripQuotes(actor.GetPropertyAllValues("$arg" + i + "rendercolor"));
+ minrange = ZDTextParser.StripQuotes(actor.GetPropertyAllValues("$arg" + i + "minrange"));
+ minrangecolor = ZDTextParser.StripQuotes(actor.GetPropertyAllValues("$arg" + i + "minrangecolor"));
+ maxrange = ZDTextParser.StripQuotes(actor.GetPropertyAllValues("$arg" + i + "maxrange"));
+ maxrangecolor = ZDTextParser.StripQuotes(actor.GetPropertyAllValues("$arg" + i + "maxrangecolor"));
+ }
+ else
+ {
+ argrendercolor = string.Empty; minrange = string.Empty; maxrange = string.Empty; minrangecolor = string.Empty; maxrangecolor = string.Empty;
+ }
+
+ args[i] = new ArgumentInfo(title, argtitle, argtooltip, argrenderstyle, argrendercolor,
+ minrange, minrangecolor, maxrange, maxrangecolor,
+ argtype, defaultvalue, argenum, General.Map.Config.Enums);
}
//mxd. Some SLADE compatibility
diff --git a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs
index e038a926..1ea0f7ca 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/ThingsMode.cs
@@ -1081,6 +1081,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Update ambient sound radii
ambientsoundshapes = GetAmbientSoundShapes(General.Map.Map.Things);
+
+ // Update argument range shapes
+ persistenteventlines.AddRange(GetArgumentRangeShapes(General.Map.Map.Things));
}
//mxd
@@ -1219,6 +1222,43 @@ namespace CodeImp.DoomBuilder.BuilderModes
return circles;
}
+ private List GetArgumentRangeShapes(IEnumerable things)
+ {
+ List lines = new List();
+ const int numsides = 24;
+
+ foreach(Thing t in things)
+ {
+ ThingTypeInfo info = General.Map.Data.GetThingInfoEx(t.Type);
+ if(info == null) continue;
+
+ // Process argument based range finders
+ for(int i = 0; i < t.Args.Length; i++)
+ {
+ if(t.Args[i] == 0) continue; // Avoid visual noise
+
+ var a = info.Args[i];
+ switch(a.RenderStyle)
+ {
+ case ArgumentInfo.ArgumentRenderStyle.CIRCLE:
+ if(a.MinRange > 0) lines.AddRange(LinksCollector.MakeCircleLines(t.Position, a.MinRangeColor, a.MinRange, numsides));
+ if(a.MaxRange > 0) lines.AddRange(LinksCollector.MakeCircleLines(t.Position, a.MaxRangeColor, a.MaxRange, numsides));
+ break;
+
+ case ArgumentInfo.ArgumentRenderStyle.RECTANGLE:
+ if(a.MinRange > 0) lines.AddRange(LinksCollector.MakeRectangleLines(t.Position, a.MinRangeColor, a.MinRange));
+ if(a.MaxRange > 0) lines.AddRange(LinksCollector.MakeRectangleLines(t.Position, a.MaxRangeColor, a.MaxRange));
+ break;
+
+ case ArgumentInfo.ArgumentRenderStyle.NONE:break;
+ default: throw new NotImplementedException("Unknown ArgumentRenderStyle");
+ }
+ }
+ }
+
+ return lines;
+ }
+
#endregion
#region ================== Actions