diff --git a/src/namedef.h b/src/namedef.h index 5478349e6..fc0ebad24 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -332,6 +332,7 @@ xx(Radius) xx(ReactionTime) xx(MeleeRange) xx(Speed) +xx(Clamp) // Various actor names which are used internally xx(MapSpot) diff --git a/src/thingdef/thingdef_exp.cpp b/src/thingdef/thingdef_exp.cpp index 7ef93563c..8cfd737b9 100644 --- a/src/thingdef/thingdef_exp.cpp +++ b/src/thingdef/thingdef_exp.cpp @@ -57,6 +57,7 @@ static FxExpression *ParseRandomPick(FScanner &sc, FName identifier, PClassActor static FxExpression *ParseRandom2(FScanner &sc, PClassActor *cls); static FxExpression *ParseAbs(FScanner &sc, PClassActor *cls); static FxExpression *ParseMinMax(FScanner &sc, FName identifier, PClassActor *cls); +static FxExpression *ParseClamp(FScanner &sc, PClassActor *cls); // // ParseExpression @@ -381,6 +382,8 @@ static FxExpression *ParseExpression0 (FScanner &sc, PClassActor *cls) case NAME_Min: case NAME_Max: return ParseMinMax(sc, identifier, cls); + case NAME_Clamp: + return ParseClamp(sc, cls); case NAME_Abs: return ParseAbs(sc, cls); default: @@ -521,3 +524,23 @@ static FxExpression *ParseMinMax(FScanner &sc, FName identifier, PClassActor *cl } return new FxMinMax(list, identifier, sc); } + +static FxExpression *ParseClamp(FScanner &sc, PClassActor *cls) +{ + FxExpression *src = ParseExpressionM(sc, cls); + sc.MustGetToken(','); + FxExpression *min = ParseExpressionM(sc, cls); + sc.MustGetToken(','); + FxExpression *max = ParseExpressionM(sc, cls); + sc.MustGetToken(')'); + + // Build clamp(a,x,y) as min(max(a,x),y) + TArray list(2); + list.Reserve(2); + list[0] = src; + list[1] = min; + FxExpression *maxexpr = new FxMinMax(list, NAME_Max, sc); + list[0] = maxexpr; + list[1] = max; + return new FxMinMax(list, NAME_Min, sc); +}