diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bc7ee527e..e0a5bcd70 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -229,7 +229,7 @@ target_link_libraries(SRB2SDL2 PRIVATE glad::glad) target_link_libraries(SRB2SDL2 PRIVATE fmt) target_link_libraries(SRB2SDL2 PRIVATE imgui::imgui) -target_link_libraries(SRB2SDL2 PRIVATE acsvm::acsvm) +target_link_libraries(SRB2SDL2 PRIVATE acsvm) set(SRB2_HAVE_THREADS ON) target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_THREADS) diff --git a/src/command.c b/src/command.c index 8b8001363..651540b5f 100644 --- a/src/command.c +++ b/src/command.c @@ -730,7 +730,7 @@ static void COM_ExecuteString(char *ptext) // check cvars // Hurdler: added at Ebola's request ;) // (don't flood the console in software mode with bad gl_xxx command) - if (!CV_Command() && con_destlines) + if (!CV_Command() && (con_destlines || dedicated)) CONS_Printf(M_GetText("Unknown command '%s'\n"), COM_Argv(0)); } diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 32f46bda3..d729439cc 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5362,21 +5362,24 @@ static void HWR_ProjectSprite(mobj_t *thing) if (thing->renderflags & RF_SHADOWEFFECTS) { mobj_t *caster = thing->target; - interpmobjstate_t casterinterp = {0}; - - if (R_UsingFrameInterpolation() && !paused) - { - R_InterpolateMobjState(caster, rendertimefrac, &casterinterp); - } - else - { - R_InterpolateMobjState(caster, FRACUNIT, &casterinterp); - } if (caster && !P_MobjWasRemoved(caster)) { - fixed_t groundz = R_GetShadowZ(thing, NULL); - fixed_t floordiff = abs(((thing->eflags & MFE_VERTICALFLIP) ? caster->height : 0) + casterinterp.z - groundz); + interpmobjstate_t casterinterp = {0}; + fixed_t groundz; + fixed_t floordiff; + + if (R_UsingFrameInterpolation() && !paused) + { + R_InterpolateMobjState(caster, rendertimefrac, &casterinterp); + } + else + { + R_InterpolateMobjState(caster, FRACUNIT, &casterinterp); + } + + groundz = R_GetShadowZ(thing, NULL); + floordiff = abs(((thing->eflags & MFE_VERTICALFLIP) ? caster->height : 0) + casterinterp.z - groundz); shadowheight = FIXED_TO_FLOAT(floordiff); shadowscale = FIXED_TO_FLOAT(FixedMul(FRACUNIT - floordiff/640, casterinterp.scale)); diff --git a/src/k_bot.c b/src/k_bot.c index e6604d338..56b9a8c1f 100644 --- a/src/k_bot.c +++ b/src/k_bot.c @@ -1397,7 +1397,10 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) } } - turnamt = K_HandleBotTrack(player, cmd, predict, destangle); + if (predict != NULL) + { + turnamt = K_HandleBotTrack(player, cmd, predict, destangle); + } cmd->buttons &= ~(BT_ACCELERATE|BT_BRAKE); cmd->forwardmove = 0; trySpindash = true; @@ -1431,7 +1434,10 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) } } - turnamt = K_HandleBotTrack(player, cmd, predict, destangle); + if (predict != NULL) + { + turnamt = K_HandleBotTrack(player, cmd, predict, destangle); + } } } else @@ -1450,7 +1456,10 @@ void K_BuildBotTiccmd(player_t *player, ticcmd_t *cmd) } } - turnamt = K_HandleBotTrack(player, cmd, predict, destangle); + if (predict != NULL) + { + turnamt = K_HandleBotTrack(player, cmd, predict, destangle); + } } if (trySpindash == true) diff --git a/src/menus/transient/level-select.c b/src/menus/transient/level-select.c index 3ccbd7a7e..b4cf228cf 100644 --- a/src/menus/transient/level-select.c +++ b/src/menus/transient/level-select.c @@ -251,7 +251,7 @@ boolean M_LevelListFromGametype(INT16 gt) if (cupgrid.cappages == 0) { cupgrid.cappages = 2; - cupgrid.builtgrid = Z_Calloc( + cupgrid.builtgrid = Z_Malloc( cupgrid.cappages * pagelen, PU_STATIC, NULL); @@ -288,7 +288,6 @@ boolean M_LevelListFromGametype(INT16 gt) I_Error("M_LevelListFromGametype: Not enough memory to reallocate builtgrid"); } - memset(cupgrid.builtgrid + firstlen, 0, firstlen); cupgrid.cappages *= 2; } diff --git a/src/p_floor.c b/src/p_floor.c index a81287102..2d25e8208 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -591,7 +591,6 @@ void T_BounceCheese(bouncecheese_t *bouncer) if (bouncer->sector->crumblestate == CRUMBLE_RESTORE || bouncer->sector->crumblestate == CRUMBLE_WAIT || bouncer->sector->crumblestate == CRUMBLE_ACTIVATED) // Oops! Crumbler says to remove yourself! { - bouncer->sector->crumblestate = CRUMBLE_WAIT; bouncer->sector->ceilingdata = NULL; bouncer->sector->ceilspeed = 0; bouncer->sector->floordata = NULL; @@ -2149,12 +2148,11 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover) } } -#undef controlsec - - // soundorg z height never gets set normally, so MEH. - sec->soundorg.z = sec->floorheight; + sec->soundorg.z = (controlsec->floorheight + controlsec->ceilingheight)/2; S_StartSound(&sec->soundorg, mobjinfo[type].activesound); +#undef controlsec + // Find the outermost vertexes in the subsector for (i = 0; i < sec->linecount; i++) { diff --git a/src/p_inter.c b/src/p_inter.c index c1bcb5b8e..b6a864a0d 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2337,13 +2337,11 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da break; } - if (type != DMG_STING && type != DMG_STUMBLE) + if (type != DMG_STUMBLE) { - player->flashing = K_GetKartFlashing(player); - } + if (type != DMG_STING) + player->flashing = K_GetKartFlashing(player); - if (ringburst > 0) - { P_PlayRinglossSound(target); P_PlayerRingBurst(player, ringburst); } @@ -2356,7 +2354,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da } else { - K_DropHnextList(player, false); + K_DropHnextList(player, (type != DMG_STUMBLE)); } if (type != DMG_STUMBLE) diff --git a/src/p_setup.c b/src/p_setup.c index 70c386a7a..2d4e2d54d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -4589,7 +4589,7 @@ static void P_ConvertBinaryLinedefTypes(void) //Flags if (lines[i].flags & ML_BLOCKPLAYERS) lines[i].args[6] |= TMFR_REVERSE; - if (lines[i].flags & ML_BLOCKPLAYERS) + if (lines[i].flags & ML_NOCLIMB) lines[i].args[6] |= TMFR_SPINDASH; lines[i].special = 190; @@ -6018,7 +6018,9 @@ static void P_ConvertBinarySectorTypes(void) case 8: //Instakill sectors[i].damagetype = SD_INSTAKILL; break; - case 9: // Stumble + //case 9: -- Ring Drainer (Floor Touch) + //case 10: -- Ring Drainer (No Floor Touch) + case 11: // Stumble sectors[i].damagetype = SD_STUMBLE; break; case 12: //Wall sector diff --git a/src/p_slopes.c b/src/p_slopes.c index 5b4ead3e3..4a4e84332 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -201,10 +201,14 @@ void P_ReconfigureViaVertexes (pslope_t *slope, const vector3_t v1, const vector static void ReconfigureViaConstants (pslope_t *slope, const fixed_t a, const fixed_t b, const fixed_t c, const fixed_t d) { fixed_t m; + fixed_t o = 0; vector3_t *normal = &slope->normal; + if (c) + o = abs(c) <= FRACUNIT ? -FixedMul(d, FixedDiv(FRACUNIT, c)) : -FixedDiv(d, c); + // Set origin. - FV3_Load(&slope->o, 0, 0, c ? -FixedDiv(d, c) : 0); + FV3_Load(&slope->o, 0, 0, o); // Get slope's normal. FV3_Load(normal, a, b, c); diff --git a/src/p_spec.c b/src/p_spec.c index 4438401a6..40501ff62 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1608,7 +1608,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller // "Trigger on X calls" linedefs reset if args[2] is set if (specialtype == 321 && triggerline->args[2]) - triggerline->callcount = triggerline->args[3]; + triggerline->callcount = triggerline->args[1]; else { // These special types work only once diff --git a/src/screen.c b/src/screen.c index f1b53a7f2..9b1036d7c 100644 --- a/src/screen.c +++ b/src/screen.c @@ -675,7 +675,13 @@ void SCR_ClosedCaptions(void) y = basey-((i + 2)*10); if (closedcaptions[i].b) - y -= (closedcaptions[i].b--)*vid.dupy; + { + y -= closedcaptions[i].b * vid.dupy; + if (renderisnewtic) + { + closedcaptions[i].b--; + } + } if (closedcaptions[i].t < CAPTIONFADETICS) flags |= (((CAPTIONFADETICS-closedcaptions[i].t)/2)*V_10TRANS); diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index 3a37bae85..479fd26a9 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -22,86 +22,7 @@ include("cpm-discordrpc.cmake") include("cpm-xmp-lite.cmake") include("cpm-fmt.cmake") include("cpm-imgui.cmake") - -if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") - CPMAddPackage( - NAME acsvm - VERSION 0 - URL "https://github.com/DavidPH/ACSVM/archive/7011af443dd03e8592d7810b0b91f46c49bdde59.zip" - EXCLUDE_FROM_ALL ON - DOWNLOAD_ONLY YES - ) - - if(acsvm_ADDED) - # Sal -- While ACSVM can be built as a shared library, a lot of its options are - # tied to directories existing, because the project suggests just copying it into - # your own project directly. I don't want us to do that, so I made our own target. - set( - acsvm_SOURCES - - ACSVM/Action.cpp - ACSVM/Action.hpp - ACSVM/Array.cpp - ACSVM/Array.hpp - ACSVM/BinaryIO.cpp - ACSVM/BinaryIO.hpp - ACSVM/CallFunc.cpp - ACSVM/CallFunc.hpp - ACSVM/Code.hpp - ACSVM/CodeData.cpp - ACSVM/CodeData.hpp - ACSVM/CodeList.hpp - ACSVM/Environment.cpp - ACSVM/Environment.hpp - ACSVM/Error.cpp - ACSVM/Error.hpp - ACSVM/Function.cpp - ACSVM/Function.hpp - ACSVM/HashMap.hpp - ACSVM/HashMapFixed.hpp - ACSVM/ID.hpp - ACSVM/Init.cpp - ACSVM/Init.hpp - ACSVM/Jump.cpp - ACSVM/Jump.hpp - ACSVM/Module.cpp - ACSVM/Module.hpp - ACSVM/ModuleACS0.cpp - ACSVM/ModuleACSE.cpp - ACSVM/PrintBuf.cpp - ACSVM/PrintBuf.hpp - ACSVM/Scope.cpp - ACSVM/Scope.hpp - ACSVM/Script.cpp - ACSVM/Script.hpp - ACSVM/Serial.cpp - ACSVM/Serial.hpp - ACSVM/Stack.hpp - ACSVM/Store.hpp - ACSVM/String.cpp - ACSVM/String.hpp - ACSVM/Thread.cpp - ACSVM/Thread.hpp - ACSVM/ThreadExec.cpp - ACSVM/Tracer.cpp - ACSVM/Tracer.hpp - ACSVM/Types.hpp - ACSVM/Vector.hpp - - Util/Floats.cpp - Util/Floats.hpp - ) - list(TRANSFORM acsvm_SOURCES PREPEND "${acsvm_SOURCE_DIR}/") - add_library(acsvm "${SRB2_INTERNAL_LIBRARY_TYPE}" ${acsvm_SOURCES}) - - target_compile_features(acsvm PRIVATE cxx_std_11) - - target_include_directories(acsvm INTERFACE "${acsvm_SOURCE_DIR}") - - target_link_libraries(acsvm PRIVATE acsvm::acsvm) - add_library(acsvm::acsvm ALIAS acsvm) - endif() -endif() +include("cpm-acsvm.cmake") add_subdirectory(tcbrindle_span) add_subdirectory(stb_vorbis) diff --git a/thirdparty/cpm-acsvm.cmake b/thirdparty/cpm-acsvm.cmake new file mode 100644 index 000000000..2318050bb --- /dev/null +++ b/thirdparty/cpm-acsvm.cmake @@ -0,0 +1,77 @@ +CPMAddPackage( + NAME acsvm + VERSION 0 + URL "https://github.com/DavidPH/ACSVM/archive/7011af443dd03e8592d7810b0b91f46c49bdde59.zip" + EXCLUDE_FROM_ALL ON + DOWNLOAD_ONLY YES +) + +if(acsvm_ADDED) + # Sal -- While ACSVM can be built as a shared library, a lot of its options are + # tied to directories existing, because the project suggests just copying it into + # your own project directly. I don't want us to do that, so I made our own target. + set( + acsvm_SOURCES + + ACSVM/Action.cpp + ACSVM/Action.hpp + ACSVM/Array.cpp + ACSVM/Array.hpp + ACSVM/BinaryIO.cpp + ACSVM/BinaryIO.hpp + ACSVM/CallFunc.cpp + ACSVM/CallFunc.hpp + ACSVM/Code.hpp + ACSVM/CodeData.cpp + ACSVM/CodeData.hpp + ACSVM/CodeList.hpp + ACSVM/Environment.cpp + ACSVM/Environment.hpp + ACSVM/Error.cpp + ACSVM/Error.hpp + ACSVM/Function.cpp + ACSVM/Function.hpp + ACSVM/HashMap.hpp + ACSVM/HashMapFixed.hpp + ACSVM/ID.hpp + ACSVM/Init.cpp + ACSVM/Init.hpp + ACSVM/Jump.cpp + ACSVM/Jump.hpp + ACSVM/Module.cpp + ACSVM/Module.hpp + ACSVM/ModuleACS0.cpp + ACSVM/ModuleACSE.cpp + ACSVM/PrintBuf.cpp + ACSVM/PrintBuf.hpp + ACSVM/Scope.cpp + ACSVM/Scope.hpp + ACSVM/Script.cpp + ACSVM/Script.hpp + ACSVM/Serial.cpp + ACSVM/Serial.hpp + ACSVM/Stack.hpp + ACSVM/Store.hpp + ACSVM/String.cpp + ACSVM/String.hpp + ACSVM/Thread.cpp + ACSVM/Thread.hpp + ACSVM/ThreadExec.cpp + ACSVM/Tracer.cpp + ACSVM/Tracer.hpp + ACSVM/Types.hpp + ACSVM/Vector.hpp + + Util/Floats.cpp + Util/Floats.hpp + ) + list(TRANSFORM acsvm_SOURCES PREPEND "${acsvm_SOURCE_DIR}/") + add_library(acsvm "${SRB2_INTERNAL_LIBRARY_TYPE}" ${acsvm_SOURCES}) + + target_compile_features(acsvm PRIVATE cxx_std_11) + + target_include_directories(acsvm INTERFACE "${acsvm_SOURCE_DIR}") + + target_link_libraries(acsvm PRIVATE acsvm::acsvm) + add_library(acsvm::acsvm ALIAS acsvm) +endif()