diff --git a/src/thingdef/thingdef_exp.h b/src/thingdef/thingdef_exp.h index 7277d48bb..b81bac4f1 100644 --- a/src/thingdef/thingdef_exp.h +++ b/src/thingdef/thingdef_exp.h @@ -389,6 +389,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 e8e3c2b67..92e34a038 100644 --- a/src/thingdef/thingdef_expression.cpp +++ b/src/thingdef/thingdef_expression.cpp @@ -488,6 +488,82 @@ ExpEmit FxFloatCast::Emit(VMFunctionBuilder *build) return to; } +//========================================================================== +// +// +// +//========================================================================== + +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; +} + + //========================================================================== // //