diff --git a/src/thingdef/thingdef_exp.h b/src/thingdef/thingdef_exp.h index d3ee57345..e05c852a2 100644 --- a/src/thingdef/thingdef_exp.h +++ b/src/thingdef/thingdef_exp.h @@ -314,6 +314,25 @@ public: }; +//========================================================================== +// +// +// +//========================================================================== + +class FxFloatCast : public FxExpression +{ + FxExpression *basex; + +public: + + FxFloatCast(FxExpression *x); + ~FxFloatCast(); + FxExpression *Resolve(FCompileContext&); + + ExpVal EvalExpression (AActor *self); +}; + //========================================================================== // // FxSign diff --git a/src/thingdef/thingdef_expression.cpp b/src/thingdef/thingdef_expression.cpp index 0011f4d95..aa0486dc6 100644 --- a/src/thingdef/thingdef_expression.cpp +++ b/src/thingdef/thingdef_expression.cpp @@ -446,6 +446,82 @@ ExpVal FxIntCast::EvalExpression (AActor *self) } +//========================================================================== +// +// +// +//========================================================================== + +FxFloatCast::FxFloatCast(FxExpression *x) +: FxExpression(x->ScriptPosition) +{ + basex = x; + ValueType = VAL_Float; +} + +//========================================================================== +// +// +// +//========================================================================== + +FxFloatCast::~FxFloatCast() +{ + SAFE_DELETE(basex); +} + +//========================================================================== +// +// +// +//========================================================================== + +FxExpression *FxFloatCast::Resolve(FCompileContext &ctx) +{ + CHECKRESOLVED(); + SAFE_RESOLVE(basex, ctx); + + if (basex->ValueType == VAL_Float) + { + FxExpression *x = basex; + basex = NULL; + delete this; + return x; + } + else if (basex->ValueType == VAL_Int) + { + if (basex->isConstant()) + { + ExpVal constval = basex->EvalExpression(NULL); + FxExpression *x = new FxConstant(constval.GetFloat(), ScriptPosition); + delete this; + return x; + } + return this; + } + else + { + ScriptPosition.Message(MSG_ERROR, "Numeric type expected"); + delete this; + return NULL; + } +} + +//========================================================================== +// +// +// +//========================================================================== + +ExpVal FxFloatCast::EvalExpression (AActor *self) +{ + ExpVal baseval = basex->EvalExpression(self); + baseval.Float = baseval.GetFloat(); + baseval.Type = VAL_Float; + return baseval; +} + + //========================================================================== // //