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