diff --git a/src/acs/call-funcs.cpp b/src/acs/call-funcs.cpp index 0e131a3fb..f5e0ca5a2 100644 --- a/src/acs/call-funcs.cpp +++ b/src/acs/call-funcs.cpp @@ -1408,3 +1408,52 @@ bool CallFunc_PodiumFinish(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM K_FinishCeremony(); return false; } + +/*-------------------------------------------------- + bool CallFunc_SetLineRenderStyle(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC) + + Changes a linedef's blend mode and alpha. +--------------------------------------------------*/ +bool CallFunc_SetLineRenderStyle(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC) +{ + mtag_t tag = 0; + patchalphastyle_t blend = AST_COPY; + fixed_t alpha = FRACUNIT; + + INT32 lineId = -1; + + tag = argV[0]; + + switch (argV[1]) + { + case TMB_TRANSLUCENT: + default: + blend = AST_COPY; + break; + case TMB_ADD: + blend = AST_ADD; + break; + case TMB_SUBTRACT: + blend = AST_SUBTRACT; + break; + case TMB_REVERSESUBTRACT: + blend = AST_REVERSESUBTRACT; + break; + case TMB_MODULATE: + blend = AST_MODULATE; + break; + } + + alpha = argV[2]; + alpha = std::clamp(alpha, 0, FRACUNIT); + + TAG_ITER_LINES(tag, lineId) + { + line_t *line = &lines[lineId]; + + line->blendmode = blend; + line->alpha = alpha; + } + + return false; +} diff --git a/src/acs/call-funcs.hpp b/src/acs/call-funcs.hpp index 04e4b59b7..f508d6e95 100644 --- a/src/acs/call-funcs.hpp +++ b/src/acs/call-funcs.hpp @@ -88,4 +88,6 @@ bool CallFunc_EncoreMode(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM:: bool CallFunc_PodiumPosition(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); bool CallFunc_PodiumFinish(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); +bool CallFunc_SetLineRenderStyle(ACSVM::Thread *thread, const ACSVM::Word *argV, ACSVM::Word argC); + #endif // __SRB2_ACS_CALL_FUNCS_HPP__ diff --git a/src/acs/environment.cpp b/src/acs/environment.cpp index 470774f22..6d3c44670 100644 --- a/src/acs/environment.cpp +++ b/src/acs/environment.cpp @@ -165,6 +165,7 @@ Environment::Environment() addFuncDataACS0( 500, addCallFunc(CallFunc_CameraWait)); addFuncDataACS0( 501, addCallFunc(CallFunc_PodiumPosition)); addFuncDataACS0( 502, addCallFunc(CallFunc_PodiumFinish)); + addFuncDataACS0( 503, addCallFunc(CallFunc_SetLineRenderStyle)); } ACSVM::Thread *Environment::allocThread()