diff --git a/src/namedef.h b/src/namedef.h index e7af230254..323d6f29c4 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -673,3 +673,7 @@ xx(Max_Exp) xx(Mant_Dig) xx(Min_10_Exp) xx(Max_10_Exp) + +xx(__decorate_internal_int__) +xx(__decorate_internal_bool__) +xx(__decorate_internal_state__) \ No newline at end of file diff --git a/src/thingdef/thingdef.h b/src/thingdef/thingdef.h index a9703ffa63..e2d8eb1f41 100644 --- a/src/thingdef/thingdef.h +++ b/src/thingdef/thingdef.h @@ -192,6 +192,7 @@ void ParseFunctionParameters(FScanner &sc, PClassActor *cls, TArray *args, TArray *argflags, PClassActor *cls, DWORD funcflags); @@ -357,8 +358,8 @@ int MatchString (const char *in, const char **strings); } -#define ACTION_RETURN_STATE(state) if (numret > 0) { assert(ret != NULL); ret->SetPointer(state, ATAG_STATE); return 1; } return 0 -#define ACTION_RETURN_INT(v) if (numret > 0) { assert(ret != NULL); ret->SetInt(v); return 1; } return 0 +#define ACTION_RETURN_STATE(v) do { FState *state = v; if (numret > 0) { assert(ret != NULL); ret->SetPointer(state, ATAG_STATE); return 1; } return 0; } while(0) +#define ACTION_RETURN_INT(v) do { int u = v; if (numret > 0) { assert(ret != NULL); ret->SetInt(u); return 1; } return 0; } while(0) #define ACTION_RETURN_BOOL(v) ACTION_RETURN_INT(v) // Checks to see what called the current action function diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp index e0d0fa5419..7119b577d9 100644 --- a/src/thingdef/thingdef_codeptr.cpp +++ b/src/thingdef/thingdef_codeptr.cpp @@ -325,13 +325,13 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, GetDistance) //=========================================================================== // -// A_State +// __decorate_internal_state__ // // Returns the state passed in. // //=========================================================================== -DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_State) +DEFINE_ACTION_FUNCTION_PARAMS(AActor, __decorate_internal_state__) { PARAM_PROLOGUE; PARAM_OBJECT(self, AActor); @@ -341,13 +341,13 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_State) //=========================================================================== // -// A_Int +// __decorate_internal_int__ // // Returns the int passed in. // //=========================================================================== -DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Int) +DEFINE_ACTION_FUNCTION_PARAMS(AActor, __decorate_internal_int__) { PARAM_PROLOGUE; PARAM_OBJECT(self, AActor); @@ -357,13 +357,13 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Int) //=========================================================================== // -// A_Bool +// __decorate_internal_bool__ // // Returns the bool passed in. // //=========================================================================== -DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Bool) +DEFINE_ACTION_FUNCTION_PARAMS(AActor, __decorate_internal_bool__) { PARAM_PROLOGUE; PARAM_OBJECT(self, AActor); @@ -1969,8 +1969,6 @@ static bool DoGiveInventory(AActor *receiver, bool orresult, VM_ARGS) return false; } - bool res = true; - if (amount <= 0) { amount = 1; @@ -2008,15 +2006,13 @@ static bool DoGiveInventory(AActor *receiver, bool orresult, VM_ARGS) DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_GiveInventory) { PARAM_ACTION_PROLOGUE; - bool result = DoGiveInventory(self, false, VM_ARGS_NAMES); - ACTION_RETURN_BOOL(result); + ACTION_RETURN_BOOL(DoGiveInventory(self, false, VM_ARGS_NAMES)); } DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_GiveToTarget) { PARAM_ACTION_PROLOGUE; - bool result = DoGiveInventory(self->target, false, VM_ARGS_NAMES); - ACTION_RETURN_BOOL(result); + ACTION_RETURN_BOOL(DoGiveInventory(self->target, false, VM_ARGS_NAMES)); } DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_GiveToChildren) @@ -2096,15 +2092,13 @@ bool DoTakeInventory(AActor *receiver, bool orresult, VM_ARGS) DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_TakeInventory) { PARAM_ACTION_PROLOGUE; - bool result = DoTakeInventory(self, false, VM_ARGS_NAMES); - ACTION_RETURN_BOOL(result); + ACTION_RETURN_BOOL(DoTakeInventory(self, false, VM_ARGS_NAMES)); } DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_TakeFromTarget) { PARAM_ACTION_PROLOGUE; - bool result = DoTakeInventory(self->target, false, VM_ARGS_NAMES); - ACTION_RETURN_BOOL(result); + ACTION_RETURN_BOOL(DoTakeInventory(self->target, false, VM_ARGS_NAMES)); } DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_TakeFromChildren) @@ -2405,8 +2399,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnItem) AActor *mo = Spawn( missile, self->Vec3Angle(distance, self->angle, -self->floorclip + self->GetBobOffset() + zheight), ALLOW_REPLACE); int flags = (transfer_translation ? SIXF_TRANSFERTRANSLATION : 0) + (useammo ? SIXF_SETMASTER : 0); - bool result = InitSpawnedItem(self, mo, flags); - ACTION_RETURN_BOOL(result); // for an inventory item's use state + ACTION_RETURN_BOOL(InitSpawnedItem(self, mo, flags)); // for an inventory item's use state } //=========================================================================== @@ -3255,8 +3248,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_JumpIf) PARAM_BOOL (condition); PARAM_STATE (jump); - if (!condition) jump = NULL; - ACTION_RETURN_STATE(jump); + ACTION_RETURN_STATE(condition ? jump : NULL); } //=========================================================================== diff --git a/src/thingdef/thingdef_states.cpp b/src/thingdef/thingdef_states.cpp index f90b34c47f..50b03eb27b 100644 --- a/src/thingdef/thingdef_states.cpp +++ b/src/thingdef/thingdef_states.cpp @@ -372,7 +372,7 @@ void AddImplicitReturn(FxSequence *code, const PPrototype *proto, FScanner &sc) else { // Something was returned earlier in the sequence. Make it an error // instead of adding an implicit one. - sc.ScriptError("Action list must return a value"); + sc.ScriptError("Not all paths return a value"); } } @@ -555,7 +555,9 @@ FxVMFunctionCall *ParseAction(FScanner &sc, FState state, FString statestring, B return call; } - PFunction *afd = dyn_cast(bag.Info->Symbols.FindSymbol(FName(sc.String, true), true)); + FName symname = FName(sc.String, true); + symname = CheckCastKludges(symname); + PFunction *afd = dyn_cast(bag.Info->Symbols.FindSymbol(symname, true)); if (afd != NULL) { FArgumentList *args = new FArgumentList; @@ -678,3 +680,24 @@ void ParseFunctionParameters(FScanner &sc, PClassActor *cls, TArray itemtype, int ptr_select = AAPTR_DEFAULT); native float GetDistance(bool checkz, int ptr = AAPTR_DEFAULT); - native state A_State(state returnme); - native int A_Int(int returnme); - native bool A_Bool(bool returnme); - // Action functions // Meh, MBF redundant functions. Only for DeHackEd support. action native A_Turn(float angle = 0); @@ -353,4 +349,9 @@ ACTOR Actor native //: Thinker POL5 A -1 Stop } + + // Internal functions + native state __decorate_internal_state__(state); + native int __decorate_internal_int__(int); + native bool __decorate_internal_bool__(bool); }