diff --git a/src/deh_tables.c b/src/deh_tables.c index dd6d7d69ff722bedd843456a4b5a7963889a1269..73ccc4f96093af6423a7866d65928a9f3df609ec 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -219,6 +219,7 @@ actionpointer_t actionpointers[] = {{A_SetTargetsTarget}, "A_SETTARGETSTARGET"}, {{A_SetObjectFlags}, "A_SETOBJECTFLAGS"}, {{A_SetObjectFlags2}, "A_SETOBJECTFLAGS2"}, + {{A_SetBlendMode}, "A_SETBLENDMODE"}, {{A_RandomState}, "A_RANDOMSTATE"}, {{A_RandomStateRange}, "A_RANDOMSTATERANGE"}, {{A_DualAction}, "A_DUALACTION"}, diff --git a/src/info.h b/src/info.h index 60e9702463fb50db9934d6aea9e6eab28a562983..5aac16e3bb77910b193ceb4a04cb256e05a496aa 100644 --- a/src/info.h +++ b/src/info.h @@ -175,6 +175,7 @@ enum actionnum A_SETTARGETSTARGET, A_SETOBJECTFLAGS, A_SETOBJECTFLAGS2, + A_SETBLENDMODE, A_RANDOMSTATE, A_RANDOMSTATERANGE, A_DUALACTION, @@ -441,6 +442,7 @@ void A_ZThrust(); void A_SetTargetsTarget(); void A_SetObjectFlags(); void A_SetObjectFlags2(); +void A_SetBlendMode(); void A_RandomState(); void A_RandomStateRange(); void A_DualAction(); diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 65adceb154cb66424c73b3415253891307a9f706..994f6a789a854508839c4b87c222fe9a0fc68725 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -12,6 +12,7 @@ #include "doomdef.h" #include "fastcmp.h" +#include "r_data.h" #include "r_skins.h" #include "p_local.h" #include "g_game.h" @@ -654,8 +655,13 @@ static int mobj_set(lua_State *L) break; } case mobj_blendmode: - mo->blendmode = (INT32)luaL_checkinteger(L, 3); + { + INT32 blendmode = (INT32)luaL_checkinteger(L, 3); + if (blendmode < 0 || blendmode > AST_OVERLAY) + return luaL_error(L, "mobj.blendmode %d out of range (0 - %d).", blendmode, AST_OVERLAY); + mo->blendmode = blendmode; break; + } case mobj_bnext: return NOSETPOS; case mobj_bprev: diff --git a/src/p_enemy.c b/src/p_enemy.c index 59176d6cc8ba44cc31d710ef6a87da801a1e62d8..19030567b17d33504d7a591f11230c469e070a7b 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -197,6 +197,7 @@ void A_ZThrust(mobj_t *actor); void A_SetTargetsTarget(mobj_t *actor); void A_SetObjectFlags(mobj_t *actor); void A_SetObjectFlags2(mobj_t *actor); +void A_SetBlendMode(mobj_t *actor); void A_RandomState(mobj_t *actor); void A_RandomStateRange(mobj_t *actor); void A_DualAction(mobj_t *actor); @@ -9085,6 +9086,29 @@ void A_SetObjectFlags2(mobj_t *actor) actor->flags2 = locvar1; } +// Function: A_SetBlendMode +// +// Description: Sets the blend mode of an object +// +// var1 = blend mode to set +// var2 = unused +// +void A_SetBlendMode(mobj_t *actor) +{ + INT32 locvar1 = var1; + + if (LUA_CallAction(A_SETBLENDMODE, actor)) + return; + + if (locvar1 < 0 || locvar1 > AST_OVERLAY) + { + CONS_Debug(DBG_GAMELOGIC, "Blend mode %d out of range!\n", locvar1); + return; + } + + actor->blendmode = locvar1; +} + // Function: A_BossJetFume // // Description: Spawns jet fumes/other attachment miscellany for the boss. To only be used when he is spawned. diff --git a/src/r_draw.c b/src/r_draw.c index 9a835ee5840c7e087256109f87ffef9f01bcf22c..00ffe34dcd1c9ec104047263a01e36292a0c615b 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -341,7 +341,7 @@ UINT8 *R_GetBlendTable(int style, INT32 alphalevel) { size_t offs; - if (style == AST_COPY || style == AST_OVERLAY) + if (style <= AST_COPY || style >= AST_OVERLAY) return NULL; offs = (ClipBlendLevel(style, alphalevel) << FF_TRANSSHIFT);