diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 6ddfd5281..13a347ef2 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -6846,3 +6846,33 @@ DEFINE_ACTION_FUNCTION(AActor, A_CheckTerrain) } return 0; } + +DEFINE_ACTION_FUNCTION(AActor, A_SetSize) +{ + PARAM_SELF_PROLOGUE(AActor); + PARAM_FLOAT(newradius); + PARAM_FLOAT_DEF(newheight); + PARAM_BOOL_DEF(testpos); + + if (newradius < 0.) newradius = self->radius; + if (newheight < 0.) newheight = self->Height; + + double oldradius = self->radius; + double oldheight = self->Height; + + self->UnlinkFromWorld(); + self->radius = newradius; + self->Height = newheight; + self->LinkToWorld(); + + if (testpos && !P_TestMobjLocation(self)) + { + self->UnlinkFromWorld(); + self->radius = oldradius; + self->Height = oldheight; + self->LinkToWorld(); + ACTION_RETURN_BOOL(false); + } + + ACTION_RETURN_BOOL(true); +} diff --git a/src/scripting/codegeneration/codegen.cpp b/src/scripting/codegeneration/codegen.cpp index 90fbcfe68..8e5750660 100644 --- a/src/scripting/codegeneration/codegen.cpp +++ b/src/scripting/codegeneration/codegen.cpp @@ -8955,7 +8955,7 @@ ExpEmit FxIfStatement::Emit(VMFunctionBuilder *build) size_t jumpspot = ~0u; TArray yes, no; - Condition->EmitCompare(build, false, yes, no); + Condition->EmitCompare(build, WhenTrue == nullptr, yes, no); if (WhenTrue != nullptr) { @@ -8964,11 +8964,14 @@ ExpEmit FxIfStatement::Emit(VMFunctionBuilder *build) } if (WhenFalse != nullptr) { - if (!WhenTrue->CheckReturn()) jumpspot = build->Emit(OP_JMP, 0); // no need to emit a jump if the block returns. - build->BackpatchListToHere(no); + if (WhenTrue != nullptr) + { + if (!WhenTrue->CheckReturn()) jumpspot = build->Emit(OP_JMP, 0); // no need to emit a jump if the block returns. + build->BackpatchListToHere(no); + } WhenFalse->EmitStatement(build); if (jumpspot != ~0u) build->BackpatchToHere(jumpspot); - if (WhenTrue == nullptr) build->BackpatchListToHere(yes); + if (WhenTrue == nullptr) build->BackpatchListToHere(no); } else { diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index d804a434c..0d264580a 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -793,6 +793,7 @@ class Actor : Thinker native native bool A_CopySpriteFrame(int from, int to, int flags = 0); native bool A_SetVisibleRotation(double anglestart = 0, double angleend = 0, double pitchstart = 0, double pitchend = 0, int flags = 0, int ptr = AAPTR_DEFAULT); native void A_SetTranslation(name transname); + native bool A_SetSize(double newradius, double newheight = -1, bool testpos = false); native void A_RearrangePointers(int newtarget, int newmaster = AAPTR_DEFAULT, int newtracer = AAPTR_DEFAULT, int flags=0); native void A_TransferPointer(int ptr_source, int ptr_recepient, int sourcefield, int recepientfield=AAPTR_DEFAULT, int flags=0);