The code needs to be refactored anyway to allow better crosshair control but this also seemed to affect global render state, considering how poorly it was all implemented.
All games combined there's 11(!!!) scene render blocks, not counting the sub-blocks for ROR and mirrors.
Does it surprise anyone that most of these sub-blocks do not feature all engine capabilities?
rotatesprite is now directly called, instead of going through the
overwritesprite wrapper, in order to trim the smoke sprites,
so they don't leave the map's boundaries in widescreen.
A technical side-effect is that picanm[tilenum].sf is not temporarily
set to 0, as done in overwritesprite.
The call to videoClearScreen is still required, in case the console is
shown and then hidden. It's now called after HandleAsync, just for the
sake of it (less useful in case of quit, and maybe also in another scenario).
- Replace direct calls to strtok with calls to a new wrapper function,
safeStrtok. Whenever strtok returns a null pointer, safeStrtok returns
an empty string instead. This should assist with replicating
the behaviors with the DOS EXE, without leading to crashes.
- This way, the "GOTO" and "CREATURE" codes are fixed.
The code handling "LEVEL" is additionally simplified.
- The code executed if nStringLen == 0 || pToken == NULL is now gone.
As is the case under DOS, if you enter a non-empty string which isn't
matched at all, sHollyStr will be emptified, but you'll otherwise
still be able to enter a code, with no need to retype "HOLLY".
Include cstdlib for abs() with an int argument. Fixes the following
compile error with libc++.
source/exhumed/src/trigdat.cpp:159:9: error: call to 'abs' is ambiguous
if (abs(diff) > c)
^~~
/usr/include/c++/v1/math.h:761:1: note: candidate function
abs(float __lcpp_x) _NOEXCEPT {return ::fabsf(__lcpp_x);}
^
/usr/include/c++/v1/math.h:765:1: note: candidate function
abs(double __lcpp_x) _NOEXCEPT {return ::fabs(__lcpp_x);}
^
/usr/include/c++/v1/math.h:769:1: note: candidate function
abs(long double __lcpp_x) _NOEXCEPT {return ::fabsl(__lcpp_x);}
^
1 error generated.
malloc.h is a non-standard header and isn't required here
fixes build on OpenBSD which has no malloc.h
# Conflicts:
# source/exhumed/src/enginesubs.cpp
With the new backend there will always be just one page, never more, so the RS_PERMS case will never be entered.
In addition, since the software renderer has already been nonfunctional due to lacking support from the 2D drawer, its 2D components have also been removed. Its main remaining purpose, drawing camera textures, remains unaffected by this.
The data organization here is a mess, no wonder that this game could only save at the beginning of a level.
Fortunately it's all static so no allocations and pointers to track.
- fixed a crash in the 2D drawer when two consecutively allocated vertex buffers had the same address. Strangely this only occured with Exhumed but not the other games
- fixed Exhumed crashing with sound disabled.
The regular sounds are not a big deal, but this game contains two special effects that were problematic to port. We'll have to wait and see if they work as intended - the original panning effect is not 3D compatible so I had to redo it.