mirror of
https://github.com/ZDoom/Raze.git
synced 2024-11-29 15:32:24 +00:00
Merge branch 'master' into whaven
# Conflicts: # source/build/include/buildtypes.h # source/core/console/c_notifybuffer.cpp # source/core/d_protocol.h # source/core/version.h # wadsrc/static/zscript.txt
This commit is contained in:
commit
671d200aa7
236 changed files with 7029 additions and 5557 deletions
8
.github/workflows/continuous_integration.yml
vendored
8
.github/workflows/continuous_integration.yml
vendored
|
@ -43,10 +43,10 @@ jobs:
|
|||
build_type: "RelWithDebInfo"
|
||||
}
|
||||
- {
|
||||
name: "Linux GCC 10",
|
||||
name: "Linux GCC 11",
|
||||
os: ubuntu-20.04,
|
||||
extra_options: "-DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10",
|
||||
deps_cmdline: "sudo apt update && sudo apt install g++-10 libsdl2-dev libvpx-dev libgtk-3-dev",
|
||||
extra_options: "-DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11",
|
||||
deps_cmdline: "sudo apt update && sudo apt install g++-11 libsdl2-dev libvpx-dev libgtk-3-dev",
|
||||
build_type: "MinSizeRel"
|
||||
}
|
||||
- {
|
||||
|
@ -54,7 +54,7 @@ jobs:
|
|||
os: ubuntu-20.04,
|
||||
extra_options: "-DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 \
|
||||
-DDYN_FLUIDSYNTH=OFF -DDYN_OPENAL=OFF -DDYN_SNDFILE=OFF -DDYN_MPG123=OFF",
|
||||
deps_cmdline: "sudo apt update && sudo apt install clang-6.0 libsdl2-dev libvpx-dev libopenal-dev libfluidsynth-dev libmpg123-dev libsndfile1-dev",
|
||||
deps_cmdline: "sudo apt update && sudo apt remove gcc-11 libgcc-11-dev g++-11 libstdc++-11-dev && sudo apt install clang-6.0 libstdc++-9-dev libsdl2-dev libvpx-dev libopenal-dev libfluidsynth-dev libmpg123-dev libsndfile1-dev",
|
||||
build_type: "Debug"
|
||||
}
|
||||
- {
|
||||
|
|
|
@ -234,7 +234,7 @@ if( MSVC )
|
|||
set( ALL_C_FLAGS "${ALL_C_FLAGS} /wd4996 /DUNICODE /D_UNICODE /D_WIN32_WINNT=0x0600" )
|
||||
|
||||
# These must be silenced because the code is full of them. Expect some of undefined behavior hidden in this mess. :(
|
||||
set( ALL_C_FLAGS "${ALL_C_FLAGS} /wd4244 /wd4018 /wd4267" )
|
||||
#set( ALL_C_FLAGS "${ALL_C_FLAGS} /wd4244 /wd4018 /wd4267" )
|
||||
|
||||
|
||||
# Most of these need to be cleaned out. The source is currently infested with far too much conditional compilation which is a constant source of problems.
|
||||
|
|
|
@ -828,8 +828,6 @@ set( NOT_COMPILED_SOURCE_FILES
|
|||
games/duke/src/render.cpp
|
||||
games/duke/src/savegame.cpp
|
||||
games/duke/src/sbar.cpp
|
||||
games/duke/src/sbar_d.cpp
|
||||
games/duke/src/sbar_r.cpp
|
||||
games/duke/src/sectors.cpp
|
||||
games/duke/src/sectors_d.cpp
|
||||
games/duke/src/sectors_r.cpp
|
||||
|
|
|
@ -392,7 +392,7 @@ void neartag(int32_t xs, int32_t ys, int32_t zs, int16_t sectnum, int16_t ange
|
|||
int32_t (*blacklist_sprite_func)(int32_t) = nullptr) ATTRIBUTE((nonnull(6,7,8)));
|
||||
int32_t cansee(int32_t x1, int32_t y1, int32_t z1, int16_t sect1,
|
||||
int32_t x2, int32_t y2, int32_t z2, int16_t sect2);
|
||||
int32_t inside(int32_t x, int32_t y, int16_t sectnum);
|
||||
int32_t inside(int32_t x, int32_t y, int sectnum);
|
||||
void dragpoint(int16_t pointhighlight, int32_t dax, int32_t day, uint8_t flags = 0);
|
||||
int32_t try_facespr_intersect(uspriteptr_t const spr, vec3_t const in,
|
||||
int32_t vx, int32_t vy, int32_t vz,
|
||||
|
@ -420,9 +420,9 @@ inline int32_t krand(void)
|
|||
int32_t krand(void);
|
||||
#endif
|
||||
|
||||
inline int32_t ksqrt(uint32_t num)
|
||||
inline int32_t ksqrt(uint64_t num)
|
||||
{
|
||||
return int(sqrt((float)num));
|
||||
return int(sqrt(double(num)));
|
||||
}
|
||||
|
||||
int32_t getangle(int32_t xvect, int32_t yvect);
|
||||
|
@ -461,36 +461,36 @@ void yax_getzsofslope(int sectNum, int playerX, int playerY, int32_t* pCeilZ, in
|
|||
int32_t yax_getceilzofslope(int const sectnum, vec2_t const vect);
|
||||
int32_t yax_getflorzofslope(int const sectnum, vec2_t const vect);
|
||||
|
||||
inline int32_t getceilzofslope(int16_t sectnum, int32_t dax, int32_t day)
|
||||
inline int32_t getceilzofslope(int sectnum, int32_t dax, int32_t day)
|
||||
{
|
||||
return getceilzofslopeptr((usectorptr_t)§or[sectnum], dax, day);
|
||||
}
|
||||
|
||||
inline int32_t getflorzofslope(int16_t sectnum, int32_t dax, int32_t day)
|
||||
inline int32_t getflorzofslope(int sectnum, int32_t dax, int32_t day)
|
||||
{
|
||||
return getflorzofslopeptr((usectorptr_t)§or[sectnum], dax, day);
|
||||
}
|
||||
|
||||
inline void getzsofslope(int16_t sectnum, int32_t dax, int32_t day, int32_t *ceilz, int32_t *florz)
|
||||
inline void getzsofslope(int sectnum, int32_t dax, int32_t day, int32_t *ceilz, int32_t *florz)
|
||||
{
|
||||
getzsofslopeptr((usectorptr_t)§or[sectnum], dax, day, ceilz, florz);
|
||||
}
|
||||
|
||||
inline void getcorrectzsofslope(int16_t sectnum, int32_t dax, int32_t day, int32_t *ceilz, int32_t *florz)
|
||||
inline void getcorrectzsofslope(int sectnum, int32_t dax, int32_t day, int32_t *ceilz, int32_t *florz)
|
||||
{
|
||||
vec2_t closest = { dax, day };
|
||||
getsectordist(closest, sectnum, &closest);
|
||||
getzsofslopeptr((usectorptr_t)§or[sectnum], closest.x, closest.y, ceilz, florz);
|
||||
}
|
||||
|
||||
inline int32_t getcorrectceilzofslope(int16_t sectnum, int32_t dax, int32_t day)
|
||||
inline int32_t getcorrectceilzofslope(int sectnum, int32_t dax, int32_t day)
|
||||
{
|
||||
vec2_t closest = { dax, day };
|
||||
getsectordist(closest, sectnum, &closest);
|
||||
return getceilzofslopeptr((usectorptr_t)§or[sectnum], closest.x, closest.y);
|
||||
}
|
||||
|
||||
inline int32_t getcorrectflorzofslope(int16_t sectnum, int32_t dax, int32_t day)
|
||||
inline int32_t getcorrectflorzofslope(int sectnum, int32_t dax, int32_t day)
|
||||
{
|
||||
vec2_t closest = { dax, day };
|
||||
getsectordist(closest, sectnum, &closest);
|
||||
|
@ -706,8 +706,8 @@ extern int32_t(*changespritestat_replace)(int16_t spritenum, int16_t newstatnum)
|
|||
enum EHitBits
|
||||
{
|
||||
kHitNone = 0,
|
||||
kHitTypeMask = 0xE000,
|
||||
kHitIndexMask = 0x1FFF,
|
||||
kHitTypeMask = 0xC000,
|
||||
kHitIndexMask = 0x3FFF,
|
||||
kHitSector = 0x4000,
|
||||
kHitWall = 0x8000,
|
||||
kHitSprite = 0xC000,
|
||||
|
|
|
@ -79,14 +79,14 @@ struct sectortype
|
|||
int ceilingypan() const { return int(ceilingypan_); }
|
||||
int floorxpan() const { return int(floorxpan_); }
|
||||
int floorypan() const { return int(floorypan_); }
|
||||
void setfloorxpan(float val) { floorxpan_ = fmod(val + 512, 256); } // +512 is for handling negative offsets
|
||||
void setfloorypan(float val) { floorypan_ = fmod(val + 512, 256); } // +512 is for handling negative offsets
|
||||
void setceilingxpan(float val) { ceilingxpan_ = fmod(val + 512, 256); } // +512 is for handling negative offsets
|
||||
void setceilingypan(float val) { ceilingypan_ = fmod(val + 512, 256); } // +512 is for handling negative offsets
|
||||
void addfloorxpan(float add) { floorxpan_ = fmod(floorxpan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
void addfloorypan(float add) { floorypan_ = fmod(floorypan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
void addceilingxpan(float add) { ceilingxpan_ = fmod(ceilingxpan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
void addceilingypan(float add) { ceilingypan_ = fmod(ceilingypan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
void setfloorxpan(float val) { floorxpan_ = fmodf(val + 512, 256); } // +512 is for handling negative offsets
|
||||
void setfloorypan(float val) { floorypan_ = fmodf(val + 512, 256); } // +512 is for handling negative offsets
|
||||
void setceilingxpan(float val) { ceilingxpan_ = fmodf(val + 512, 256); } // +512 is for handling negative offsets
|
||||
void setceilingypan(float val) { ceilingypan_ = fmodf(val + 512, 256); } // +512 is for handling negative offsets
|
||||
void addfloorxpan(float add) { floorxpan_ = fmodf(floorxpan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
void addfloorypan(float add) { floorypan_ = fmodf(floorypan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
void addceilingxpan(float add) { ceilingxpan_ = fmodf(ceilingxpan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
void addceilingypan(float add) { ceilingypan_ = fmodf(ceilingypan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
};
|
||||
|
||||
//cstat:
|
||||
|
@ -130,10 +130,10 @@ struct walltype
|
|||
|
||||
int xpan() const { return int(xpan_); }
|
||||
int ypan() const { return int(ypan_); }
|
||||
void setxpan(float val) { xpan_ = fmod(val + 512, 256); } // +512 is for handling negative offsets
|
||||
void setypan(float val) { ypan_ = fmod(val + 512, 256); } // +512 is for handling negative offsets
|
||||
void addxpan(float add) { xpan_ = fmod(xpan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
void addypan(float add) { ypan_ = fmod(ypan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
void setxpan(float add) { xpan_ = fmodf(add + 512, 256); } // +512 is for handling negative offsets
|
||||
void setypan(float add) { ypan_ = fmodf(add + 512, 256); } // +512 is for handling negative offsets
|
||||
void addxpan(float add) { xpan_ = fmodf(xpan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
void addypan(float add) { ypan_ = fmodf(ypan_ + add + 512, 256); } // +512 is for handling negative offsets
|
||||
|
||||
#if 0
|
||||
// make sure we do not accidentally copy this
|
||||
|
|
|
@ -295,7 +295,7 @@ static inline int32_t cliptrace(vec2_t const pos, vec2_t * const goal)
|
|||
{
|
||||
int32_t hitwall = -1;
|
||||
|
||||
for (native_t z=clipnum-1; z>=0; z--)
|
||||
for (int z=clipnum-1; z>=0; z--)
|
||||
{
|
||||
vec2_t const p1 = { clipit[z].x1, clipit[z].y1 };
|
||||
vec2_t const p2 = { clipit[z].x2, clipit[z].y2 };
|
||||
|
@ -716,13 +716,13 @@ int32_t clipmove(vec3_t * const pos, int16_t * const sectnum, int32_t xvect, int
|
|||
int32_t hitwalls[4], hitwall;
|
||||
int32_t clipReturn = 0;
|
||||
|
||||
native_t cnt = clipmoveboxtracenum;
|
||||
int cnt = clipmoveboxtracenum;
|
||||
|
||||
do
|
||||
{
|
||||
if (enginecompatibility_mode == ENGINECOMPATIBILITY_NONE && (xvect|yvect))
|
||||
{
|
||||
for (native_t i=clipnum-1;i>=0;--i)
|
||||
for (int i=clipnum-1;i>=0;--i)
|
||||
{
|
||||
if (!bitmap_test(clipignore, i) && clipinsideboxline(pos->x, pos->y, clipit[i].x1, clipit[i].y1, clipit[i].x2, clipit[i].y2, walldist))
|
||||
{
|
||||
|
@ -750,7 +750,7 @@ int32_t clipmove(vec3_t * const pos, int16_t * const sectnum, int32_t xvect, int
|
|||
int32_t const templl2
|
||||
= (int32_t)clamp(compat_maybe_truncate_to_int32((int64_t)(goal.x - vec.x) * clipr.x + (int64_t)(goal.y - vec.y) * clipr.y), INT32_MIN, INT32_MAX);
|
||||
int32_t const i = (enginecompatibility_mode == ENGINECOMPATIBILITY_19950829 || (abs(templl2)>>11) < templl) ?
|
||||
DivScaleL(templl2, templl, 20) : 0;
|
||||
(int)DivScaleL(templl2, templl, 20) : 0;
|
||||
|
||||
goal = { MulScale(clipr.x, i, 20)+vec.x, MulScale(clipr.y, i, 20)+vec.y };
|
||||
}
|
||||
|
@ -807,7 +807,7 @@ int32_t clipmove(vec3_t * const pos, int16_t * const sectnum, int32_t xvect, int
|
|||
|
||||
int32_t tempint2, tempint1 = INT32_MAX;
|
||||
*sectnum = -1;
|
||||
for (native_t j=numsectors-1; j>=0; j--)
|
||||
for (int j=numsectors-1; j>=0; j--)
|
||||
if (inside(pos->x, pos->y, j) == 1)
|
||||
{
|
||||
if (enginecompatibility_mode != ENGINECOMPATIBILITY_19950829 && (sector[j].ceilingstat&2))
|
||||
|
@ -819,7 +819,8 @@ int32_t clipmove(vec3_t * const pos, int16_t * const sectnum, int32_t xvect, int
|
|||
{
|
||||
if (tempint2 < tempint1)
|
||||
{
|
||||
*sectnum = j; tempint1 = tempint2;
|
||||
*sectnum = (int16_t)j;
|
||||
tempint1 = tempint2;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -831,12 +832,13 @@ int32_t clipmove(vec3_t * const pos, int16_t * const sectnum, int32_t xvect, int
|
|||
|
||||
if (tempint2 <= 0)
|
||||
{
|
||||
*sectnum = j;
|
||||
*sectnum = (int16_t)j;
|
||||
return clipReturn;
|
||||
}
|
||||
if (tempint2 < tempint1)
|
||||
{
|
||||
*sectnum = j; tempint1 = tempint2;
|
||||
*sectnum = (int16_t)j;
|
||||
tempint1 = tempint2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1257,9 +1259,9 @@ static int32_t hitscan_trysector(const vec3_t *sv, usectorptr_t sec, hitdata_t *
|
|||
{
|
||||
if (tmp==NULL)
|
||||
{
|
||||
if (inside(x1,y1,sec-sector) == 1)
|
||||
if (inside(x1,y1,int(sec-sector)) == 1)
|
||||
{
|
||||
hit_set(hit, sec-sector, -1, -1, x1, y1, z1);
|
||||
hit_set(hit, int(sec-sector), -1, -1, x1, y1, z1);
|
||||
hitscan_hitsectcf = (how+1)>>1;
|
||||
}
|
||||
}
|
||||
|
@ -1267,12 +1269,12 @@ static int32_t hitscan_trysector(const vec3_t *sv, usectorptr_t sec, hitdata_t *
|
|||
{
|
||||
const int32_t curidx=(int32_t)tmp[0];
|
||||
auto const curspr=(spritetype *)tmp[1];
|
||||
const int32_t thislastsec = tmp[2];
|
||||
const int32_t thislastsec = (int32_t)tmp[2];
|
||||
|
||||
if (!thislastsec)
|
||||
{
|
||||
if (inside(x1,y1,sec-sector) == 1)
|
||||
hit_set(hit, curspr->sectnum, -1, curspr-sprite, x1, y1, z1);
|
||||
if (inside(x1,y1,int(sec-sector)) == 1)
|
||||
hit_set(hit, int(curspr->sectnum), -1, int(curspr-sprite), x1, y1, z1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -778,7 +778,7 @@ int32_t inside_old(int32_t x, int32_t y, int16_t sectnum)
|
|||
return -1;
|
||||
}
|
||||
|
||||
int32_t inside(int32_t x, int32_t y, int16_t sectnum)
|
||||
int32_t inside(int32_t x, int32_t y, int sectnum)
|
||||
{
|
||||
switch (enginecompatibility_mode)
|
||||
{
|
||||
|
|
|
@ -19,6 +19,12 @@
|
|||
#include "hw_voxels.h"
|
||||
#include "../../glbackend/glbackend.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
// just make it shut up. Most of this file will go down the drain anyway soon.
|
||||
#pragma warning(disable:4244)
|
||||
#pragma warning(disable:4267)
|
||||
#endif
|
||||
|
||||
static int32_t curextra=MAXTILES;
|
||||
|
||||
#define MIN_CACHETIME_PRINT 10
|
||||
|
|
|
@ -28,6 +28,10 @@ Ken Silverman's official web site: http://www.advsys.net/ken
|
|||
#include "gamestruct.h"
|
||||
#include "hw_voxels.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
// just make it shut up. Most of this file will go down the drain anyway soon.
|
||||
#pragma warning(disable:4244)
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
union { double x; double d; };
|
||||
|
@ -309,7 +313,7 @@ static void polymost_updaterotmat(void)
|
|||
renderSetVisibility(g_visibility * fxdimen * (1.f / (65536.f)) / r_ambientlight);
|
||||
}
|
||||
|
||||
const vec2_16_t tileSize(size_t index)
|
||||
const vec2_16_t tileSize(int index)
|
||||
{
|
||||
vec2_16_t v = { (int16_t)tileWidth(index), (int16_t)tileHeight(index) };
|
||||
return v;
|
||||
|
|
|
@ -929,12 +929,7 @@ void SoundEngine::StopSound(int sourcetype, const void* actor, int channel, int
|
|||
void SoundEngine::StopActorSounds(int sourcetype, const void* actor, int chanmin, int chanmax)
|
||||
{
|
||||
const bool all = (chanmin == 0 && chanmax == 0);
|
||||
if (!all && chanmax > chanmin)
|
||||
{
|
||||
const int temp = chanmax;
|
||||
chanmax = chanmin;
|
||||
chanmin = temp;
|
||||
}
|
||||
if (chanmax < chanmin) std::swap(chanmin, chanmax);
|
||||
|
||||
FSoundChan* chan = Channels;
|
||||
while (chan != nullptr)
|
||||
|
|
|
@ -293,8 +293,8 @@ CCMD (md5sum)
|
|||
}
|
||||
for (int i = 1; i < argv.argc(); ++i)
|
||||
{
|
||||
FileReader fr = fileSystem.OpenFileReader(argv[i]);
|
||||
if (!fr.isOpen())
|
||||
FileReader fr;
|
||||
if (!fr.OpenFile(argv[i]))
|
||||
{
|
||||
Printf("%s: %s\n", argv[i], strerror(errno));
|
||||
}
|
||||
|
|
|
@ -1108,3 +1108,4 @@ xy(menu_advance, "menu/advance")
|
|||
|
||||
xx(zoomsize)
|
||||
xx(ScreenJobRunner)
|
||||
xx(RazeStatusBar)
|
||||
|
|
|
@ -145,6 +145,12 @@ public:
|
|||
return true;
|
||||
}
|
||||
|
||||
bool GetFloat(float& var, bool evaluate = false)
|
||||
{
|
||||
if (!GetFloat(evaluate)) return false;
|
||||
var = float(Float);
|
||||
return true;
|
||||
}
|
||||
|
||||
void MustGetFloat(bool evaluate = false);
|
||||
bool CheckFloat(bool evaluate = false);
|
||||
|
|
|
@ -232,7 +232,6 @@ DEFINE_ACTION_FUNCTION(FSavegameManager, LoadSavegame)
|
|||
|
||||
void FSavegameManagerBase::DoSave(int Selected, const char *savegamestring)
|
||||
{
|
||||
RemoveNewSaveNode();
|
||||
if (Selected != 0)
|
||||
{
|
||||
auto node = SaveGames[Selected];
|
||||
|
|
|
@ -314,7 +314,7 @@ void DObject::Release()
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void DObject:: Destroy ()
|
||||
void DObject::Destroy ()
|
||||
{
|
||||
// We cannot call the VM during shutdown because all the needed data has been or is in the process of being deleted.
|
||||
if (PClass::bVMOperational)
|
||||
|
|
|
@ -449,13 +449,14 @@ DFrameBuffer *SDLVideo::CreateFrameBuffer ()
|
|||
device = new VulkanDevice();
|
||||
fb = new VulkanFrameBuffer(nullptr, vid_fullscreen, device);
|
||||
}
|
||||
catch (CVulkanError const&)
|
||||
catch (CVulkanError const &error)
|
||||
{
|
||||
if (Priv::window != nullptr)
|
||||
{
|
||||
Priv::DestroyWindow();
|
||||
}
|
||||
|
||||
Printf(TEXTCOLOR_RED "Initialization of Vulkan failed: %s\n", error.what());
|
||||
Priv::vulkanEnabled = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1006,6 +1006,22 @@ DEFINE_ACTION_FUNCTION_NATIVE(FDynArray_String, Push, ArrayPush<FDynArray_String
|
|||
ACTION_RETURN_INT(self->Push(val));
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(FDynArray_String, PushV)
|
||||
{
|
||||
PARAM_SELF_STRUCT_PROLOGUE(FDynArray_String);
|
||||
PARAM_VA_POINTER(va_reginfo); // Get the hidden type information array
|
||||
VMVa_List args = { param + 1, 0, numparam - 2, va_reginfo + 1 };
|
||||
while (args.curindex < args.numargs)
|
||||
{
|
||||
if (args.reginfo[args.curindex] == REGT_STRING)
|
||||
{
|
||||
self->Push(args.args[args.curindex++].s());
|
||||
}
|
||||
else ThrowAbortException(X_OTHER, "Invalid parameter in pushv, string expected");
|
||||
}
|
||||
ACTION_RETURN_INT(self->Size() - 1);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(FDynArray_String, Pop, ArrayPop<FDynArray_String>)
|
||||
{
|
||||
PARAM_SELF_STRUCT_PROLOGUE(FDynArray_String);
|
||||
|
|
|
@ -81,10 +81,10 @@ DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, StatusbarToRealCoords, StatusbarTo
|
|||
return MIN(4, numret);
|
||||
}
|
||||
|
||||
void SBar_DrawTexture(DStatusBarCore* self, int texid, double x, double y, int flags, double alpha, double w, double h, double scaleX, double scaleY, int style)
|
||||
void SBar_DrawTexture(DStatusBarCore* self, int texid, double x, double y, int flags, double alpha, double w, double h, double scaleX, double scaleY, int style, int color, int translation, double clipwidth)
|
||||
{
|
||||
if (!twod->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function");
|
||||
self->DrawGraphic(FSetTextureID(texid), x, y, flags, alpha, w, h, scaleX, scaleY, ERenderStyle(style));
|
||||
self->DrawGraphic(FSetTextureID(texid), x, y, flags, alpha, w, h, scaleX, scaleY, ERenderStyle(style), color, translation, clipwidth);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, DrawTexture, SBar_DrawTexture)
|
||||
|
@ -100,14 +100,17 @@ DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, DrawTexture, SBar_DrawTexture)
|
|||
PARAM_FLOAT(scaleX);
|
||||
PARAM_FLOAT(scaleY);
|
||||
PARAM_INT(style);
|
||||
SBar_DrawTexture(self, texid, x, y, flags, alpha, w, h, scaleX, scaleY, style);
|
||||
PARAM_INT(col);
|
||||
PARAM_INT(trans);
|
||||
PARAM_FLOAT(clipwidth);
|
||||
SBar_DrawTexture(self, texid, x, y, flags, alpha, w, h, scaleX, scaleY, style, col, trans, clipwidth);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SBar_DrawImage(DStatusBarCore* self, const FString& texid, double x, double y, int flags, double alpha, double w, double h, double scaleX, double scaleY, int style)
|
||||
void SBar_DrawImage(DStatusBarCore* self, const FString& texid, double x, double y, int flags, double alpha, double w, double h, double scaleX, double scaleY, int style, int color, int translation, double clipwidth)
|
||||
{
|
||||
if (!twod->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function");
|
||||
self->DrawGraphic(TexMan.CheckForTexture(texid, ETextureType::Any), x, y, flags, alpha, w, h, scaleX, scaleY, ERenderStyle(style));
|
||||
self->DrawGraphic(TexMan.CheckForTexture(texid, ETextureType::Any), x, y, flags, alpha, w, h, scaleX, scaleY, ERenderStyle(style), color, translation, clipwidth);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, DrawImage, SBar_DrawImage)
|
||||
|
@ -123,10 +126,62 @@ DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, DrawImage, SBar_DrawImage)
|
|||
PARAM_FLOAT(scaleX);
|
||||
PARAM_FLOAT(scaleY);
|
||||
PARAM_INT(style);
|
||||
SBar_DrawImage(self, texid, x, y, flags, alpha, w, h, scaleX, scaleY, style);
|
||||
PARAM_INT(col);
|
||||
PARAM_INT(trans);
|
||||
PARAM_FLOAT(clipwidth);
|
||||
SBar_DrawImage(self, texid, x, y, flags, alpha, w, h, scaleX, scaleY, style, col, trans, clipwidth);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SBar_DrawImageRotated(DStatusBarCore* self, const FString& texid, double x, double y, int flags, double angle, double alpha, double scaleX, double scaleY, int style, int color, int translation)
|
||||
{
|
||||
if (!twod->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function");
|
||||
self->DrawRotated(TexMan.CheckForTexture(texid, ETextureType::Any), x, y, flags, angle, alpha, scaleX, scaleY, color, translation, (ERenderStyle)style);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, DrawImageRotated, SBar_DrawImageRotated)
|
||||
{
|
||||
PARAM_SELF_PROLOGUE(DStatusBarCore);
|
||||
PARAM_STRING(texid);
|
||||
PARAM_FLOAT(x);
|
||||
PARAM_FLOAT(y);
|
||||
PARAM_INT(flags);
|
||||
PARAM_FLOAT(angle);
|
||||
PARAM_FLOAT(alpha);
|
||||
PARAM_FLOAT(scaleX);
|
||||
PARAM_FLOAT(scaleY);
|
||||
PARAM_INT(style);
|
||||
PARAM_INT(col);
|
||||
PARAM_INT(trans);
|
||||
SBar_DrawImageRotated(self, texid, x, y, flags, angle, alpha, scaleX, scaleY, style, col, trans);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SBar_DrawTextureRotated(DStatusBarCore* self, int texid, double x, double y, int flags, double angle, double alpha, double scaleX, double scaleY, int style, int color, int translation)
|
||||
{
|
||||
if (!twod->HasBegun2D()) ThrowAbortException(X_OTHER, "Attempt to draw to screen outside a draw function");
|
||||
self->DrawRotated(FSetTextureID(texid), x, y, flags, alpha, scaleX, scaleY, color, translation, style);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, DrawTextureRotated, SBar_DrawTextureRotated)
|
||||
{
|
||||
PARAM_SELF_PROLOGUE(DStatusBarCore);
|
||||
PARAM_INT(texid);
|
||||
PARAM_FLOAT(x);
|
||||
PARAM_FLOAT(y);
|
||||
PARAM_INT(flags);
|
||||
PARAM_FLOAT(angle);
|
||||
PARAM_FLOAT(alpha);
|
||||
PARAM_FLOAT(scaleX);
|
||||
PARAM_FLOAT(scaleY);
|
||||
PARAM_INT(style);
|
||||
PARAM_INT(col);
|
||||
PARAM_INT(trans);
|
||||
SBar_DrawTextureRotated(self, texid, x, y, flags, angle, alpha, scaleX, scaleY, style, col, trans);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void SBar_DrawString(DStatusBarCore* self, DHUDFont* font, const FString& string, double x, double y, int flags, int trans, double alpha, int wrapwidth, int linespacing, double scaleX, double scaleY, int translation, int style);
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(DStatusBarCore, DrawString, SBar_DrawString)
|
||||
|
|
|
@ -51,7 +51,7 @@ FGameTexture* CrosshairImage;
|
|||
static int CrosshairNum;
|
||||
|
||||
|
||||
IMPLEMENT_CLASS(DStatusBarCore, true, false)
|
||||
IMPLEMENT_CLASS(DStatusBarCore, false, false)
|
||||
IMPLEMENT_CLASS(DHUDFont, false, false);
|
||||
|
||||
|
||||
|
@ -458,7 +458,7 @@ void DStatusBarCore::DrawGraphic(FTextureID texture, double x, double y, int fla
|
|||
return;
|
||||
|
||||
FGameTexture* tex = TexMan.GetGameTexture(texture, !(flags & DI_DONTANIMATE));
|
||||
DrawGraphic(tex, x, y, flags, Alpha, boxwidth, boxheight, scaleX, scaleY, style, color, translation);
|
||||
DrawGraphic(tex, x, y, flags, Alpha, boxwidth, boxheight, scaleX, scaleY, style, color, translation, clipwidth);
|
||||
}
|
||||
|
||||
void DStatusBarCore::DrawGraphic(FGameTexture* tex, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY, ERenderStyle style, PalEntry color, int translation, double clipwidth)
|
||||
|
@ -577,6 +577,10 @@ void DStatusBarCore::DrawGraphic(FGameTexture* tex, double x, double y, int flag
|
|||
x += orgx;
|
||||
y += orgy;
|
||||
}
|
||||
if (clipwidth != -1)
|
||||
{
|
||||
int a = 0;
|
||||
}
|
||||
DrawTexture(twod, tex, x, y,
|
||||
DTA_TopOffset, 0,
|
||||
DTA_LeftOffset, 0,
|
||||
|
@ -594,7 +598,7 @@ void DStatusBarCore::DrawGraphic(FGameTexture* tex, double x, double y, int flag
|
|||
DTA_FillColor, (flags & DI_ALPHAMAPPED) ? 0 : -1,
|
||||
DTA_FlipX, !!(flags & DI_MIRROR),
|
||||
DTA_FlipY, !!(flags& DI_MIRRORY),
|
||||
DTA_LegacyRenderStyle, style,
|
||||
DTA_LegacyRenderStyle, (flags & DI_ALPHAMAPPED) ? STYLE_Shaded : style,
|
||||
TAG_DONE);
|
||||
}
|
||||
|
||||
|
|
2
source/common/thirdparty/base64.cpp
vendored
2
source/common/thirdparty/base64.cpp
vendored
|
@ -89,8 +89,8 @@ TArray<uint8_t> base64_encode(unsigned char const* bytes_to_encode, size_t in_le
|
|||
while((i++ < 3))
|
||||
reta.Push('=');
|
||||
|
||||
reta.Push(0);
|
||||
}
|
||||
reta.Push(0);
|
||||
|
||||
return reta;
|
||||
|
||||
|
|
|
@ -185,7 +185,7 @@ static void CalcMapBounds()
|
|||
void AutomapControl()
|
||||
{
|
||||
static int nonsharedtimer;
|
||||
int ms = screen->FrameTime;
|
||||
int ms = (int)screen->FrameTime;
|
||||
int interval;
|
||||
int panvert = 0, panhorz = 0;
|
||||
|
||||
|
@ -197,7 +197,7 @@ void AutomapControl()
|
|||
{
|
||||
interval = 0;
|
||||
}
|
||||
nonsharedtimer = screen->FrameTime;
|
||||
nonsharedtimer = ms;
|
||||
|
||||
if (System_WantGuiCapture())
|
||||
return;
|
||||
|
|
|
@ -362,22 +362,37 @@ inline binangle bvectangbam(int32_t x, int32_t y)
|
|||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
inline int32_t interpolatedvalue(int32_t oval, int32_t val, double const smoothratio, int const scale = 16)
|
||||
inline constexpr int32_t interpolatedvalue(int32_t oval, int32_t val, double const smoothratio, int const scale = 16)
|
||||
{
|
||||
return oval + MulScale(val - oval, int(smoothratio), scale);
|
||||
}
|
||||
|
||||
inline constexpr int32_t interpolatedvalue(int32_t oval, int32_t val, int const smoothratio, int const scale = 16)
|
||||
{
|
||||
return oval + MulScale(val - oval, smoothratio, scale);
|
||||
}
|
||||
|
||||
inline double interpolatedvaluef(double oval, double val, double const smoothratio, int const scale = 16)
|
||||
inline constexpr double interpolatedvaluef(double oval, double val, double const smoothratio, int const scale = 16)
|
||||
{
|
||||
return oval + MulScaleF(val - oval, smoothratio, scale);
|
||||
}
|
||||
|
||||
inline int32_t interpolatedangle(int32_t oang, int32_t ang, double const smoothratio, int const scale = 16)
|
||||
inline constexpr int32_t interpolatedangle(int32_t oang, int32_t ang, double const smoothratio, int const scale = 16)
|
||||
{
|
||||
return oang + MulScale(((ang + 1024 - oang) & 2047) - 1024, int(smoothratio), scale);
|
||||
}
|
||||
|
||||
inline constexpr int32_t interpolatedangle(int32_t oang, int32_t ang, int const smoothratio, int const scale = 16)
|
||||
{
|
||||
return oang + MulScale(((ang + 1024 - oang) & 2047) - 1024, smoothratio, scale);
|
||||
}
|
||||
|
||||
inline binangle interpolatedangle(binangle oang, binangle ang, double const smoothratio, int const scale = 16)
|
||||
inline constexpr binangle interpolatedangle(binangle oang, binangle ang, double const smoothratio, int const scale = 16)
|
||||
{
|
||||
return bamang(oang.asbam() + MulScale(((ang.asbam() + 0x80000000 - oang.asbam()) & 0xFFFFFFFF) - 0x80000000, int(smoothratio), scale));
|
||||
}
|
||||
|
||||
inline constexpr binangle interpolatedangle(binangle oang, binangle ang, int const smoothratio, int const scale = 16)
|
||||
{
|
||||
return bamang(oang.asbam() + MulScale(((ang.asbam() + 0x80000000 - oang.asbam()) & 0xFFFFFFFF) - 0x80000000, smoothratio, scale));
|
||||
}
|
||||
|
|
|
@ -196,7 +196,7 @@ CCMD(give)
|
|||
if (!CheckCheatmode(true, true))
|
||||
{
|
||||
Net_WriteByte(DEM_GIVE);
|
||||
Net_WriteByte(found);
|
||||
Net_WriteByte((uint8_t)found);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -9,3 +9,4 @@ EXTERN_CVAR(Bool, sv_cheats)
|
|||
void genericCheat(int player, uint8_t** stream, bool skip);
|
||||
void changeMap(int player, uint8_t** stream, bool skip);
|
||||
void endScreenJob(int player, uint8_t** stream, bool skip);
|
||||
void startSaveGame(int player, uint8_t** stream, bool skip);
|
||||
|
|
|
@ -116,10 +116,10 @@ void FNotifyBuffer::DrawNative()
|
|||
|
||||
FFont* font = isBlood() ? SmallFont2 : SmallFont;
|
||||
|
||||
int line = isBlood() ? Top : (g_gameType & GAMEFLAG_SW) ? 40 : (g_gameType & GAMEFLAG_WHALL)? 18 : font->GetDisplacement();
|
||||
double line = isBlood() ? Top : (g_gameType & GAMEFLAG_SW) ? 40 : (g_gameType & GAMEFLAG_WHALL)? 18 : font->GetDisplacement();
|
||||
bool canskip = isBlood();
|
||||
double scale = 1 / (NotifyFontScale * con_notifyscale);
|
||||
int lineadv = font->GetHeight() / NotifyFontScale;
|
||||
double lineadv = font->GetHeight() / NotifyFontScale;
|
||||
int textleft = (g_gameType & GAMEFLAG_WHALL) ? 18 : 0;
|
||||
|
||||
for (unsigned i = topline; i < Text.Size(); ++i)
|
||||
|
@ -193,8 +193,8 @@ void FNotifyBuffer::Draw()
|
|||
double nfscale = (generic_ui? 0.7 : NotifyFontScale);
|
||||
double scale = 1 / ( * con_notifyscale);
|
||||
|
||||
int line = Top + font->GetDisplacement() / nfscale;
|
||||
int lineadv = font->GetHeight () / nfscale;
|
||||
double line = Top + font->GetDisplacement() / nfscale;
|
||||
double lineadv = font->GetHeight () / nfscale;
|
||||
|
||||
for (unsigned i = 0; i < Text.Size(); ++ i)
|
||||
{
|
||||
|
|
|
@ -1674,6 +1674,7 @@ bool D_CheckNetGame (void)
|
|||
Net_SetCommandHandler(DEM_GENERICCHEAT, genericCheat);
|
||||
Net_SetCommandHandler(DEM_CHANGEMAP, changeMap);
|
||||
Net_SetCommandHandler(DEM_ENDSCREENJOB, endScreenJob);
|
||||
Net_SetCommandHandler(DEM_SAVEGAME, startSaveGame);
|
||||
|
||||
for (i = 0; i < MAXNETNODES; i++)
|
||||
{
|
||||
|
|
|
@ -90,6 +90,7 @@ enum EDemoCommand
|
|||
DEM_GIVE,
|
||||
DEM_CHANGEMAP,
|
||||
DEM_ENDSCREENJOB,
|
||||
DEM_SAVEGAME,
|
||||
DEM_SPELL, //Witchaven
|
||||
|
||||
DEM_MAX
|
||||
|
|
|
@ -135,7 +135,7 @@ static void parseTexturePaletteBlock(FScanner& sc, int tile)
|
|||
|
||||
int pal = -1, xsiz = 0, ysiz = 0;
|
||||
FString fn;
|
||||
double alphacut = -1.0, xscale = 1.0, yscale = 1.0, specpower = 1.0, specfactor = 1.0;
|
||||
float alphacut = -1.0, xscale = 1.0, yscale = 1.0, specpower = 1.0, specfactor = 1.0;
|
||||
|
||||
if (!sc.GetNumber(pal, true)) return;
|
||||
|
||||
|
@ -178,7 +178,7 @@ static void parseTextureSpecialBlock(FScanner& sc, int tile, int pal)
|
|||
FScriptPosition pos = sc;
|
||||
|
||||
FString fn;
|
||||
double xscale = 1.0, yscale = 1.0, specpower = 1.0, specfactor = 1.0;
|
||||
float xscale = 1.0, yscale = 1.0, specpower = 1.0, specfactor = 1.0;
|
||||
|
||||
if (sc.StartBraces(&blockend)) return;
|
||||
while (!sc.FoundEndBrace(blockend))
|
||||
|
@ -653,6 +653,7 @@ void parseVoxel(FScanner& sc, FScriptPosition& pos)
|
|||
FScanner::SavedPos blockend;
|
||||
int tile0 = MAXTILES, tile1 = -1;
|
||||
FString fn;
|
||||
bool error = false;
|
||||
|
||||
if (!sc.GetString(fn)) return;
|
||||
|
||||
|
@ -661,17 +662,16 @@ void parseVoxel(FScanner& sc, FScriptPosition& pos)
|
|||
if (nextvoxid == MAXVOXELS)
|
||||
{
|
||||
pos.Message(MSG_ERROR, "Maximum number of voxels (%d) already defined.", MAXVOXELS);
|
||||
return;
|
||||
error = true;
|
||||
}
|
||||
|
||||
if (voxDefine(nextvoxid, fn))
|
||||
else if (voxDefine(nextvoxid, fn))
|
||||
{
|
||||
pos.Message(MSG_ERROR, "Unable to load voxel file \"%s\"", fn.GetChars());
|
||||
return;
|
||||
error = true;
|
||||
}
|
||||
|
||||
int lastvoxid = nextvoxid++;
|
||||
|
||||
|
||||
if (sc.StartBraces(&blockend)) return;
|
||||
while (!sc.FoundEndBrace(blockend))
|
||||
{
|
||||
|
@ -679,13 +679,16 @@ void parseVoxel(FScanner& sc, FScriptPosition& pos)
|
|||
if (sc.Compare("tile"))
|
||||
{
|
||||
sc.GetNumber(true);
|
||||
if (ValidateTilenum("voxel", sc.Number, pos)) tiletovox[sc.Number] = lastvoxid;
|
||||
if (ValidateTilenum("voxel", sc.Number, pos))
|
||||
{
|
||||
if (!error) tiletovox[sc.Number] = lastvoxid;
|
||||
}
|
||||
}
|
||||
if (sc.Compare("tile0")) sc.GetNumber(tile0, true);
|
||||
if (sc.Compare("tile1"))
|
||||
{
|
||||
sc.GetNumber(tile1, true);
|
||||
if (ValidateTileRange("voxel", tile0, tile1, pos))
|
||||
if (ValidateTileRange("voxel", tile0, tile1, pos) && !error)
|
||||
{
|
||||
for (int i = tile0; i <= tile1; i++) tiletovox[i] = lastvoxid;
|
||||
}
|
||||
|
@ -693,9 +696,9 @@ void parseVoxel(FScanner& sc, FScriptPosition& pos)
|
|||
if (sc.Compare("scale"))
|
||||
{
|
||||
sc.GetFloat(true);
|
||||
voxscale[lastvoxid] = (float)sc.Float;
|
||||
if (!error) voxscale[lastvoxid] = (float)sc.Float;
|
||||
}
|
||||
if (sc.Compare("rotate")) voxrotate.Set(lastvoxid);
|
||||
if (sc.Compare("rotate") && !error) voxrotate.Set(lastvoxid);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -834,7 +837,7 @@ void parseMapinfo(FScanner& sc, FScriptPosition& pos)
|
|||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
char smallbuf[3] = { sc.String[2 * i], sc.String[2 * i + 1], 0 };
|
||||
mhk.md4[i] = strtol(smallbuf, nullptr, 16);
|
||||
mhk.md4[i] = (uint8_t)strtol(smallbuf, nullptr, 16);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1772,7 +1775,7 @@ static bool parseModelFrameBlock(FScanner& sc, FixedBitArray<1024>& usedframes)
|
|||
bool ok = true;
|
||||
int pal = -1;
|
||||
int starttile = -1, endtile = -1;
|
||||
double smoothduration = 0.1f;
|
||||
float smoothduration = 0.1f;
|
||||
|
||||
if (sc.StartBraces(&blockend)) return false;
|
||||
while (!sc.FoundEndBrace(blockend))
|
||||
|
@ -1855,7 +1858,7 @@ static bool parseModelSkinBlock(FScanner& sc, int pal)
|
|||
|
||||
FString filename;
|
||||
int surface = 0;
|
||||
double param = 1.0, specpower = 1.0, specfactor = 1.0;
|
||||
float param = 1.0, specpower = 1.0, specfactor = 1.0;
|
||||
int flags = 0;
|
||||
|
||||
if (sc.StartBraces(&blockend)) return false;
|
||||
|
@ -1887,7 +1890,7 @@ static bool parseModelSkinBlock(FScanner& sc, int pal)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (pal == DETAILPAL) param = 1. / param;
|
||||
if (pal == DETAILPAL) param = 1.f / param;
|
||||
int res = md_defineskin(mdglobal.lastmodelid, filename, pal, max(0, mdglobal.modelskin), surface, param, specpower, specfactor, flags);
|
||||
if (res < 0)
|
||||
{
|
||||
|
|
|
@ -586,14 +586,14 @@ DEFINE_MAP_OPTION(ex_ramses_pup, false)
|
|||
{
|
||||
parse.ParseAssign();
|
||||
parse.sc.MustGetString();
|
||||
info->ex_ramses_pup = parse.sc.Number;
|
||||
info->ex_ramses_pup = parse.sc.String;
|
||||
}
|
||||
|
||||
DEFINE_MAP_OPTION(ex_ramses_text, false)
|
||||
{
|
||||
parse.ParseAssign();
|
||||
parse.sc.MustGetString();
|
||||
info->ex_ramses_text = parse.sc.Number;
|
||||
info->ex_ramses_text = parse.sc.String;
|
||||
}
|
||||
|
||||
int ex_ramses_horiz = 11;
|
||||
|
@ -925,7 +925,7 @@ MapRecord *FMapInfoParser::ParseMapHeader(MapRecord &defaultinfo)
|
|||
if (map != &sink && map->name.IsEmpty()) sc.ScriptError("Missing level name");
|
||||
sc.UnGet();
|
||||
}
|
||||
if (!map->levelNumber) map->levelNumber = GetDefaultLevelNum(map->labelName);
|
||||
if (map->levelNumber <= 0) map->levelNumber = GetDefaultLevelNum(map->labelName);
|
||||
return map;
|
||||
}
|
||||
|
||||
|
@ -1128,6 +1128,14 @@ void FMapInfoParser::ParseGameInfo()
|
|||
sc.SetCMode(false);
|
||||
globalCutscenes.MPSummaryScreen = sc.String;
|
||||
}
|
||||
else if (sc.Compare("statusbarclass"))
|
||||
{
|
||||
ParseAssign();
|
||||
sc.SetCMode(false);
|
||||
sc.MustGetString();
|
||||
sc.SetCMode(false);
|
||||
globalCutscenes.StatusBarClass = sc.String;
|
||||
}
|
||||
else if (!ParseCloseBrace())
|
||||
{
|
||||
// Unknown
|
||||
|
|
|
@ -140,7 +140,7 @@ void PostLoadSetup();
|
|||
void FontCharCreated(FGameTexture* base, FGameTexture* untranslated, FGameTexture* translated);
|
||||
void LoadVoxelModels();
|
||||
|
||||
DBaseStatusBar* StatusBar;
|
||||
DStatusBarCore* StatusBar;
|
||||
|
||||
|
||||
bool AppActive = true;
|
||||
|
@ -477,9 +477,6 @@ void CheckUserMap()
|
|||
namespace Duke3d
|
||||
{
|
||||
::GameInterface* CreateInterface();
|
||||
DBaseStatusBar* CreateDukeStatusBar();
|
||||
DBaseStatusBar* CreateRedneckStatusBar();
|
||||
|
||||
}
|
||||
namespace Blood
|
||||
{
|
||||
|
@ -810,32 +807,15 @@ void InitLanguages()
|
|||
|
||||
void CreateStatusBar()
|
||||
{
|
||||
int flags = g_gameType;
|
||||
PClass* stbarclass = nullptr;
|
||||
|
||||
GC::AddMarkerFunc([]() { GC::Mark(StatusBar); });
|
||||
if (flags & GAMEFLAG_BLOOD)
|
||||
{
|
||||
stbarclass = PClass::FindClass("BloodStatusBar");
|
||||
}
|
||||
else if (flags & GAMEFLAG_SW)
|
||||
{
|
||||
stbarclass = PClass::FindClass("SWStatusBar");
|
||||
}
|
||||
else if (flags & GAMEFLAG_PSEXHUMED)
|
||||
{
|
||||
stbarclass = PClass::FindClass("ExhumedStatusBar");
|
||||
}
|
||||
else
|
||||
{
|
||||
StatusBar = isRR() ? Duke3d::CreateRedneckStatusBar() : Duke3d::CreateDukeStatusBar();
|
||||
return;
|
||||
}
|
||||
auto stbarclass = PClass::FindClass(globalCutscenes.StatusBarClass);
|
||||
if (!stbarclass)
|
||||
{
|
||||
I_FatalError("No status bar defined");
|
||||
}
|
||||
StatusBar = static_cast<DBaseStatusBar*>(stbarclass->CreateNew());
|
||||
StatusBar = static_cast<DStatusBarCore*>(stbarclass->CreateNew());
|
||||
StatusBar->SetSize(0, 320, 200);
|
||||
InitStatusBar();
|
||||
GC::AddMarkerFunc([]() { GC::Mark(StatusBar); });
|
||||
}
|
||||
|
||||
|
||||
|
@ -1075,7 +1055,7 @@ int RunGame()
|
|||
void updatePauseStatus()
|
||||
{
|
||||
// This must go through the network in multiplayer games.
|
||||
if (M_Active() || System_WantGuiCapture())
|
||||
if (M_Active() || System_WantGuiCapture() || !AppActive)
|
||||
{
|
||||
paused = 1;
|
||||
}
|
||||
|
@ -1224,10 +1204,10 @@ void S_SetSoundPaused(int state)
|
|||
if (paused == 0)
|
||||
{
|
||||
S_ResumeSound(true);
|
||||
if (GSnd != nullptr)
|
||||
{
|
||||
GSnd->SetInactive(SoundRenderer::INACTIVE_Active);
|
||||
}
|
||||
}
|
||||
if (GSnd != nullptr)
|
||||
{
|
||||
GSnd->SetInactive(SoundRenderer::INACTIVE_Active);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -1537,7 +1517,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Raze, MusicEnabled, MusicEnabled)
|
|||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, GetTimeFrac, I_GetTimeFrac)
|
||||
{
|
||||
ACTION_RETURN_INT(I_GetTimeFrac());
|
||||
ACTION_RETURN_FLOAT(I_GetTimeFrac());
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_Raze, PlayerName)
|
||||
|
@ -1563,6 +1543,25 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Raze, bcos, bcos)
|
|||
ACTION_RETURN_INT(bcos(v, shift));
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(_Raze, GetBuildTime, I_GetBuildTime)
|
||||
{
|
||||
ACTION_RETURN_INT(I_GetBuildTime());
|
||||
}
|
||||
|
||||
bool PickTexture(FRenderState* state, FGameTexture* tex, int paletteid, TexturePick& pick);
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_Raze, PickTexture)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
PARAM_INT(texid);
|
||||
TexturePick pick;
|
||||
if (PickTexture(nullptr, TexMan.GetGameTexture(FSetTextureID(texid)), TRANSLATION(Translation_Remap, 0), pick))
|
||||
{
|
||||
ACTION_RETURN_INT(pick.texture->GetID().GetIndex());
|
||||
}
|
||||
ACTION_RETURN_INT(texid);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_MapRecord, GetCluster)
|
||||
{
|
||||
PARAM_SELF_STRUCT_PROLOGUE(MapRecord);
|
||||
|
@ -1578,6 +1577,8 @@ DEFINE_GLOBAL(demoplayback)
|
|||
DEFINE_GLOBAL(consoleplayer)
|
||||
DEFINE_GLOBAL(currentLevel)
|
||||
DEFINE_GLOBAL(paused)
|
||||
DEFINE_GLOBAL(automapMode)
|
||||
DEFINE_GLOBAL(PlayClock)
|
||||
|
||||
DEFINE_FIELD_X(ClusterDef, ClusterDef, name)
|
||||
DEFINE_FIELD_X(ClusterDef, ClusterDef, InterBackground)
|
||||
|
|
|
@ -12,6 +12,10 @@
|
|||
#include "i_time.h"
|
||||
#include "palentry.h"
|
||||
|
||||
extern bool sendsave;
|
||||
extern FString savedescription;
|
||||
extern FString savegamefile;
|
||||
|
||||
extern FString currentGame;
|
||||
extern FString LumpFilter;
|
||||
extern int PlayClock;
|
||||
|
|
|
@ -146,7 +146,7 @@ CCMD(sizeup)
|
|||
}
|
||||
else
|
||||
{
|
||||
hud_scalefactor = hud_scalefactor + 0.04;
|
||||
hud_scalefactor = hud_scalefactor + 0.04f;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -162,7 +162,7 @@ CCMD(sizedown)
|
|||
}
|
||||
else
|
||||
{
|
||||
hud_scalefactor = hud_scalefactor - 0.04;
|
||||
hud_scalefactor = hud_scalefactor - 0.04f;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -131,7 +131,7 @@ bool calcChaseCamPos(int* px, int* py, int* pz, spritetype* pspr, short *psectnu
|
|||
*pz += MulScale(nz, cameradist, 16);
|
||||
|
||||
// Caculate clock using GameTicRate so it increases the same rate on all speed computers.
|
||||
int myclock = PlayClock + MulScale(120 / GameTicRate, smoothratio, 16);
|
||||
int myclock = PlayClock + MulScale(120 / GameTicRate, int(smoothratio), 16);
|
||||
if (cameraclock == INT_MIN)
|
||||
{
|
||||
// Third person view was just started.
|
||||
|
@ -154,7 +154,7 @@ bool calcChaseCamPos(int* px, int* py, int* pz, spritetype* pspr, short *psectnu
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void PlanesAtPoint(const sectortype* sec, float dax, float day, float* pceilz, float* pflorz)
|
||||
void PlanesAtPoint(const sectortype* sec, int dax, int day, float* pceilz, float* pflorz)
|
||||
{
|
||||
float ceilz = float(sec->ceilingz);
|
||||
float florz = float(sec->floorz);
|
||||
|
@ -164,13 +164,13 @@ void PlanesAtPoint(const sectortype* sec, float dax, float day, float* pceilz, f
|
|||
auto wal = &wall[sec->wallptr];
|
||||
auto wal2 = &wall[wal->point2];
|
||||
|
||||
float dx = wal2->x - wal->x;
|
||||
float dy = wal2->y - wal->y;
|
||||
float dx = float(wal2->x - wal->x);
|
||||
float dy = float(wal2->y - wal->y);
|
||||
|
||||
int i = (int)sqrt(dx * dx + dy * dy) << 5; // length of sector's first wall.
|
||||
if (i != 0)
|
||||
{
|
||||
float const j = (dx * (day - wal->y) - dy * (dax - wal->x)) * (1.f / 8.f);
|
||||
float const j = (dx * (float(day - wal->y)) - dy * (float(dax - wal->x))) * (1.f / 8.f);
|
||||
if (sec->ceilingstat & CSTAT_SECTOR_SLOPE) ceilz += (sec->ceilingheinum * j) / i;
|
||||
if (sec->floorstat & CSTAT_SECTOR_SLOPE) florz += (sec->floorheinum * j) / i;
|
||||
}
|
||||
|
|
|
@ -9,7 +9,11 @@ extern int cameradist, cameraclock;
|
|||
void loaddefinitionsfile(const char* fn, bool cumulative = false);
|
||||
|
||||
bool calcChaseCamPos(int* px, int* py, int* pz, spritetype* pspr, short *psectnum, binangle ang, fixedhoriz horiz, double const smoothratio);
|
||||
void PlanesAtPoint(const sectortype* sec, float dax, float day, float* ceilz, float* florz);
|
||||
void PlanesAtPoint(const sectortype* sec, int dax, int day, float* ceilz, float* florz);
|
||||
inline void PlanesAtPoint(const sectortype* sec, float dax, float day, float* ceilz, float* florz) // this is just for warning evasion.
|
||||
{
|
||||
PlanesAtPoint(sec, int(dax), int(day), ceilz, florz);
|
||||
}
|
||||
void setWallSectors();
|
||||
void GetWallSpritePosition(const spritetype* spr, vec2_t pos, vec2_t* out, bool render = false);
|
||||
void GetFlatSpritePosition(const spritetype* spr, vec2_t pos, vec2_t* out, bool render = false);
|
||||
|
|
|
@ -61,7 +61,7 @@ binangle getincanglebam(binangle a, binangle na)
|
|||
if(cura > INT32_MAX) cura -= UINT32_MAX;
|
||||
}
|
||||
|
||||
return bamang(newa-cura);
|
||||
return bamang(uint32_t(newa-cura));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
@ -133,7 +133,7 @@ void processMovement(InputPacket* currInput, InputPacket* inputBuffer, ControlIn
|
|||
if (buttonMap.ButtonDown(gamefunc_Strafe) && allowstrafe)
|
||||
currInput->svel -= xs_CRoundToInt((hidInput->mousemovex * mousevelscale) + (scaleAdjust * hidInput->dyaw * keymove * cntrlvelscale));
|
||||
else
|
||||
currInput->avel += hidInput->mouseturnx + (scaleAdjust * hidInput->dyaw * hidspeed * turnscale);
|
||||
currInput->avel += float(hidInput->mouseturnx + (scaleAdjust * hidInput->dyaw * hidspeed * turnscale));
|
||||
|
||||
if (!(inputBuffer->actions & SB_AIMMODE))
|
||||
currInput->horz -= hidInput->mouseturny;
|
||||
|
@ -147,7 +147,7 @@ void processMovement(InputPacket* currInput, InputPacket* inputBuffer, ControlIn
|
|||
currInput->avel = -currInput->avel;
|
||||
|
||||
// process remaining controller input.
|
||||
currInput->horz -= scaleAdjust * hidInput->dpitch * hidspeed;
|
||||
currInput->horz -= float(scaleAdjust * hidInput->dpitch * hidspeed);
|
||||
currInput->svel += xs_CRoundToInt(scaleAdjust * hidInput->dx * keymove * cntrlvelscale);
|
||||
currInput->fvel += xs_CRoundToInt(scaleAdjust * hidInput->dz * keymove * cntrlvelscale);
|
||||
|
||||
|
@ -177,12 +177,12 @@ void processMovement(InputPacket* currInput, InputPacket* inputBuffer, ControlIn
|
|||
if (buttonMap.ButtonDown(gamefunc_Turn_Left) || (buttonMap.ButtonDown(gamefunc_Strafe_Left) && !allowstrafe))
|
||||
{
|
||||
updateTurnHeldAmt(scaleAdjust);
|
||||
currInput->avel -= scaleAdjust * (isTurboTurnTime() ? turnamount : preambleturn);
|
||||
currInput->avel -= float(scaleAdjust * (isTurboTurnTime() ? turnamount : preambleturn));
|
||||
}
|
||||
else if (buttonMap.ButtonDown(gamefunc_Turn_Right) || (buttonMap.ButtonDown(gamefunc_Strafe_Right) && !allowstrafe))
|
||||
{
|
||||
updateTurnHeldAmt(scaleAdjust);
|
||||
currInput->avel += scaleAdjust * (isTurboTurnTime() ? turnamount : preambleturn);
|
||||
currInput->avel += float(scaleAdjust * (isTurboTurnTime() ? turnamount : preambleturn));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -263,7 +263,7 @@ static void DeleteStuff(FileSystem &fileSystem, const TArray<FString>& deletelum
|
|||
str.Truncate(ndx);
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < fileSystem.GetNumEntries(); i++)
|
||||
for (int i = 0; i < fileSystem.GetNumEntries(); i++)
|
||||
{
|
||||
int cf = fileSystem.GetFileContainer(i);
|
||||
auto fname = fileSystem.GetFileFullName(i, false);
|
||||
|
@ -343,8 +343,8 @@ void InitFileSystem(TArray<GrpEntry>& groups)
|
|||
|
||||
D_AddConfigFiles(Files, "Global.Autoload", "*.grp", GameConfig);
|
||||
|
||||
long len;
|
||||
int lastpos = 0;
|
||||
size_t len;
|
||||
size_t lastpos = 0;
|
||||
|
||||
while (lastpos < LumpFilter.Len() && (len = strcspn(LumpFilter.GetChars() + lastpos, ".")) > 0)
|
||||
{
|
||||
|
|
|
@ -106,10 +106,14 @@ int oldentertics;
|
|||
int gametic;
|
||||
int intermissiondelay;
|
||||
|
||||
FString savename;
|
||||
FString BackupSaveGame;
|
||||
|
||||
void DoLoadGame(const char* name);
|
||||
|
||||
bool sendsave;
|
||||
FString savedescription;
|
||||
FString savegamefile;
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
|
@ -119,6 +123,14 @@ void DoLoadGame(const char* name);
|
|||
|
||||
void G_BuildTiccmd(ticcmd_t* cmd)
|
||||
{
|
||||
if (sendsave)
|
||||
{
|
||||
sendsave = false;
|
||||
Net_WriteByte(DEM_SAVEGAME);
|
||||
Net_WriteString(savegamefile);
|
||||
Net_WriteString(savedescription);
|
||||
savegamefile = "";
|
||||
}
|
||||
cmd->ucmd = {};
|
||||
I_GetEvent();
|
||||
auto input = CONTROL_GetInput();
|
||||
|
@ -138,6 +150,7 @@ void NewGame(MapRecord* map, int skill, bool ns = false)
|
|||
newGameStarted = true;
|
||||
ShowIntermission(nullptr, map, nullptr, [=](bool) {
|
||||
gi->NewGame(map, skill, ns);
|
||||
ResetStatusBar();
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -187,6 +200,7 @@ static void GameTicker()
|
|||
gi->FreeLevelData();
|
||||
gameaction = ga_level;
|
||||
gi->NextLevel(g_nextmap, g_nextskill);
|
||||
ResetStatusBar();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -199,6 +213,7 @@ static void GameTicker()
|
|||
gi->FreeLevelData();
|
||||
gameaction = ga_level;
|
||||
gi->NextLevel(g_nextmap, g_nextskill);
|
||||
ResetStatusBar();
|
||||
break;
|
||||
|
||||
case ga_newgame:
|
||||
|
@ -240,8 +255,16 @@ static void GameTicker()
|
|||
break;
|
||||
|
||||
case ga_savegame:
|
||||
// We only need this for multiplayer saves that need to go through the network.
|
||||
// gi->SaveGame();
|
||||
G_DoSaveGame(true, false, savegamefile, savedescription);
|
||||
gameaction = ga_nothing;
|
||||
savegamefile = "";
|
||||
savedescription = "";
|
||||
break;
|
||||
|
||||
case ga_loadgame:
|
||||
case ga_loadgamehidecon:
|
||||
//case ga_autoloadgame:
|
||||
G_DoLoadGame();
|
||||
break;
|
||||
|
||||
case ga_autosave:
|
||||
|
@ -340,6 +363,7 @@ static void GameTicker()
|
|||
gameupdatetime.Reset();
|
||||
gameupdatetime.Clock();
|
||||
gi->Ticker();
|
||||
TickStatusBar();
|
||||
levelTextTime--;
|
||||
gameupdatetime.Unclock();
|
||||
break;
|
||||
|
|
|
@ -168,7 +168,7 @@ MapRecord* FindNextSecretMap(MapRecord* thismap)
|
|||
bool SetMusicForMap(const char* mapname, const char* music, bool namehack)
|
||||
{
|
||||
static const char* specials[] = { "intro", "briefing", "loading" };
|
||||
for (int i = 0; i < 3; i++)
|
||||
for (unsigned i = 0; i < 3; i++)
|
||||
{
|
||||
if (!stricmp(mapname, specials[i]))
|
||||
{
|
||||
|
|
|
@ -104,6 +104,7 @@ struct GlobalCutscenes
|
|||
CutsceneDef LoadingScreen;
|
||||
FString MPSummaryScreen;
|
||||
FString SummaryScreen;
|
||||
FString StatusBarClass;
|
||||
};
|
||||
|
||||
struct ClusterDef
|
||||
|
|
|
@ -208,7 +208,7 @@ static void SetWallPalV5()
|
|||
|
||||
static void ValidateSprite(spritetype& spr)
|
||||
{
|
||||
int index = &spr - sprite;
|
||||
int index = int(&spr - sprite);
|
||||
bool bugged = false;
|
||||
if ((unsigned)spr.statnum >= MAXSTATUS)
|
||||
{
|
||||
|
|
|
@ -114,12 +114,12 @@ void FSavegameManager::ReadSaveStrings()
|
|||
|
||||
void FSavegameManager::PerformLoadGame(const char *f, bool s)
|
||||
{
|
||||
G_LoadGame(f);
|
||||
G_LoadGame(f, s);
|
||||
}
|
||||
|
||||
void FSavegameManager::PerformSaveGame(const char *f, const char *s)
|
||||
{
|
||||
G_SaveGame(f, s, true, false);
|
||||
G_SaveGame(f, s);
|
||||
}
|
||||
|
||||
FString FSavegameManager::BuildSaveName(const char* fn, int slot)
|
||||
|
|
|
@ -192,16 +192,10 @@ bool M_SetSpecialMenu(FName& menu, int param)
|
|||
|
||||
void M_StartControlPanel(bool makeSound, bool)
|
||||
{
|
||||
static bool created = false;
|
||||
// intro might call this repeatedly
|
||||
if (CurrentMenu != NULL)
|
||||
return;
|
||||
|
||||
if (!created) // Cannot do this earlier.
|
||||
{
|
||||
created = true;
|
||||
M_CreateMenus();
|
||||
}
|
||||
GSnd->SetSfxPaused(true, PAUSESFX_MENU);
|
||||
gi->MenuOpened();
|
||||
if (makeSound && menu_sounds) gi->MenuSound(ActivateSound);
|
||||
|
@ -309,7 +303,7 @@ CCMD(quicksave)
|
|||
// [mxd]. Just save the game, no questions asked.
|
||||
if (!saveloadconfirmation)
|
||||
{
|
||||
G_SaveGame(savegameManager.quickSaveSlot->Filename, savegameManager.quickSaveSlot->SaveTitle, true, true);
|
||||
G_SaveGame(savegameManager.quickSaveSlot->Filename, savegameManager.quickSaveSlot->SaveTitle);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -320,7 +314,7 @@ CCMD(quicksave)
|
|||
DMenu* newmenu = CreateMessageBoxMenu(CurrentMenu, tempstring, 0, false, NAME_None, []()
|
||||
{
|
||||
M_ClearMenus();
|
||||
G_SaveGame(savegameManager.quickSaveSlot->Filename, savegameManager.quickSaveSlot->SaveTitle, true, true);
|
||||
G_SaveGame(savegameManager.quickSaveSlot->Filename, savegameManager.quickSaveSlot->SaveTitle);
|
||||
});
|
||||
|
||||
M_ActivateMenu(newmenu);
|
||||
|
@ -416,7 +410,7 @@ static void BuildEpisodeMenu()
|
|||
}
|
||||
|
||||
ld->mSelectedItem = gDefaultVolume + ld->mItems.Size(); // account for pre-added items
|
||||
int y = ld->mYpos;
|
||||
double y = ld->mYpos;
|
||||
|
||||
// Volume definitions should be sorted by intended menu order.
|
||||
for (auto &vol : volumes)
|
||||
|
@ -473,7 +467,7 @@ static void BuildEpisodeMenu()
|
|||
}
|
||||
if (isBlood()) gDefaultSkill = 2;
|
||||
ld->mSelectedItem = gDefaultSkill + ld->mItems.Size(); // account for pre-added items
|
||||
int y = ld->mYpos;
|
||||
double y = ld->mYpos;
|
||||
|
||||
for (int i = 0; i < MAXSKILLS; i++)
|
||||
{
|
||||
|
|
|
@ -419,7 +419,7 @@ public:
|
|||
{
|
||||
if (soundtrack > 0)
|
||||
{
|
||||
Mus_Play(nullptr, fileSystem.GetFileFullName(soundtrack, false), false);
|
||||
Mus_Play(fileSystem.GetFileFullName(soundtrack, false), false);
|
||||
}
|
||||
animtex.SetSize(AnimTexture::YUV, width, height);
|
||||
}
|
||||
|
@ -519,7 +519,6 @@ class SmkPlayer : public MoviePlayer
|
|||
AnimTextures animtex;
|
||||
TArray<uint8_t> pFrame;
|
||||
TArray<uint8_t> audioBuffer;
|
||||
int nFrameRate;
|
||||
int nFrames;
|
||||
bool fullscreenScale;
|
||||
uint64_t nFrameNs;
|
||||
|
@ -571,8 +570,8 @@ public:
|
|||
flags = flags_;
|
||||
Smacker_GetFrameSize(hSMK, nWidth, nHeight);
|
||||
pFrame.Resize(nWidth * nHeight + std::max(nWidth, nHeight));
|
||||
nFrameRate = Smacker_GetFrameRate(hSMK);
|
||||
nFrameNs = 1'000'000'000 / nFrameRate;
|
||||
float frameRate = Smacker_GetFrameRate(hSMK);
|
||||
nFrameNs = uint64_t(1'000'000'000 / frameRate);
|
||||
nFrames = Smacker_GetNumFrames(hSMK);
|
||||
Smacker_GetPalette(hSMK, palette);
|
||||
|
||||
|
@ -617,7 +616,7 @@ public:
|
|||
|
||||
bool Frame(uint64_t clock) override
|
||||
{
|
||||
int frame = clock / nFrameNs;
|
||||
int frame = int(clock / nFrameNs);
|
||||
|
||||
twod->ClearScreen();
|
||||
if (frame > nFrame)
|
||||
|
@ -698,7 +697,7 @@ MoviePlayer* OpenMovie(const char* filename, TArray<int>& ans, const int* framet
|
|||
if (!fr.isOpen()) fr = fileSystem.OpenFileReader(filename);
|
||||
if (!fr.isOpen())
|
||||
{
|
||||
int nLen = strlen(filename);
|
||||
size_t nLen = strlen(filename);
|
||||
// Strip the drive letter and retry.
|
||||
if (nLen >= 3 && isalpha(filename[0]) && filename[1] == ':' && filename[2] == '/')
|
||||
{
|
||||
|
|
|
@ -252,7 +252,7 @@ bool InterplayDecoder::RunFrame(uint64_t clock)
|
|||
{
|
||||
nTimerRate = fr.ReadUInt32();
|
||||
nTimerDiv = fr.ReadUInt16();
|
||||
nFrameDuration = ((double)nTimerRate * nTimerDiv) * 1000;
|
||||
nFrameDuration = ((uint64_t)nTimerRate * nTimerDiv) * 1000;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -346,7 +346,7 @@ bool InterplayDecoder::RunFrame(uint64_t clock)
|
|||
|
||||
case OPCODE_AUDIO_FRAME:
|
||||
{
|
||||
int nStart = fr.Tell();
|
||||
int nStart = (int)fr.Tell();
|
||||
uint16_t seqIndex = fr.ReadUInt16();
|
||||
uint16_t streamMask = fr.ReadUInt16();
|
||||
uint16_t nSamples = fr.ReadUInt16(); // number of samples this chunk
|
||||
|
@ -380,7 +380,7 @@ bool InterplayDecoder::RunFrame(uint64_t clock)
|
|||
ch ^= audio.nChannels - 1;
|
||||
}
|
||||
|
||||
int nEnd = fr.Tell();
|
||||
int nEnd = (int)fr.Tell();
|
||||
int nRead = nEnd - nStart;
|
||||
assert(opcodeSize == nRead);
|
||||
break;
|
||||
|
@ -449,14 +449,14 @@ bool InterplayDecoder::RunFrame(uint64_t clock)
|
|||
}
|
||||
}
|
||||
|
||||
int nRead = fr.Read(decodeMap.pData, opcodeSize);
|
||||
int nRead = (int)fr.Read(decodeMap.pData, opcodeSize);
|
||||
assert(nRead == opcodeSize);
|
||||
break;
|
||||
}
|
||||
|
||||
case OPCODE_VIDEO_DATA:
|
||||
{
|
||||
int nStart = fr.Tell();
|
||||
int nStart = (int)fr.Tell();
|
||||
|
||||
// need to skip 14 bytes
|
||||
fr.Seek(14, FileReader::SeekCur);
|
||||
|
@ -536,7 +536,7 @@ bool InterplayDecoder::RunFrame(uint64_t clock)
|
|||
}
|
||||
}
|
||||
|
||||
int nEnd = fr.Tell();
|
||||
int nEnd = (int)fr.Tell();
|
||||
int nSkipBytes = opcodeSize - (nEnd - nStart); // we can end up with 1 byte left we need to skip
|
||||
assert(nSkipBytes <= 1);
|
||||
|
||||
|
|
|
@ -52,13 +52,11 @@ enum SICommands
|
|||
SI_MusicVolume,
|
||||
SI_MidiDevice,
|
||||
SI_MusicAlias,
|
||||
SI_LevelMusic,
|
||||
};
|
||||
|
||||
|
||||
// This specifies whether Timidity or Windows playback is preferred for a certain song (only useful for Windows.)
|
||||
extern MusicAliasMap MusicAliases;
|
||||
extern MusicAliasMap LevelMusicAliases;
|
||||
extern MidiDeviceMap MidiDevices;
|
||||
extern MusicVolumeMap MusicVolumes;
|
||||
|
||||
|
@ -80,7 +78,6 @@ static const char *SICommandStrings[] =
|
|||
"$musicvolume",
|
||||
"$mididevice",
|
||||
"$musicalias",
|
||||
"$levelmusic",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@ -140,7 +137,7 @@ static void S_AddSNDINFO (int lump)
|
|||
sc.MustGetString();
|
||||
FName musname (sc.String);
|
||||
sc.MustGetFloat();
|
||||
MusicVolumes[musname] = sc.Float;
|
||||
MusicVolumes[musname] = (float)sc.Float;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -172,20 +169,6 @@ static void S_AddSNDINFO (int lump)
|
|||
}
|
||||
break;
|
||||
|
||||
case SI_LevelMusic: {
|
||||
sc.MustGetString();
|
||||
FName alias = sc.String;
|
||||
sc.MustGetString();
|
||||
FName mapped = sc.String;
|
||||
|
||||
// only set the alias if the lump it maps to exists.
|
||||
if (mapped == NAME_None || fileSystem.FindFile(sc.String) >= 0)
|
||||
{
|
||||
LevelMusicAliases[alias] = mapped;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SI_MidiDevice: {
|
||||
sc.MustGetString();
|
||||
FName nm = sc.String;
|
||||
|
|
|
@ -49,7 +49,6 @@ static FString lastStartedMusic;
|
|||
TArray<FString> specialmusic;
|
||||
|
||||
MusicAliasMap MusicAliases;
|
||||
MusicAliasMap LevelMusicAliases;
|
||||
|
||||
CVAR(Bool, printmusicinfo, false, 0)
|
||||
CVAR(Bool, mus_extendedlookup, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||
|
@ -191,31 +190,18 @@ static FString LookupMusicCB(const char* musicname, int& order)
|
|||
}
|
||||
|
||||
|
||||
static FString lastMusicLevel, lastMusic;
|
||||
int Mus_Play(const char *mapname, const char *fn, bool loop)
|
||||
static FString lastMusic;
|
||||
int Mus_Play(const char *fn, bool loop)
|
||||
{
|
||||
if (mus_blocked) return 1; // Caller should believe it succeeded.
|
||||
if (*fn == '/') fn++;
|
||||
// Store the requested names for resuming.
|
||||
lastMusicLevel = mapname;
|
||||
lastMusic = fn;
|
||||
|
||||
if (!MusicEnabled())
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Allow per level music substitution.
|
||||
// For most cases using $musicalias would be sufficient, but that method only works if a level actually has some music defined at all.
|
||||
// This way it can be done with an add-on definition lump even in cases like Redneck Rampage where no music definitions exist
|
||||
// or where music gets reused for multiple levels but replacement is wanted individually.
|
||||
if (mapname && *mapname)
|
||||
{
|
||||
if (*mapname == '/') mapname++;
|
||||
FName *check = LevelMusicAliases.CheckKey(FName(mapname, true));
|
||||
if (check) fn = check->GetChars();
|
||||
}
|
||||
|
||||
return S_ChangeMusic(fn, 0, loop, true);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ extern TArray<FString> specialmusic;
|
|||
// Totally minimalistic interface - should be all the game modules need.
|
||||
void Mus_InitMusic();
|
||||
void Mus_UpdateMusic();
|
||||
int Mus_Play(const char *mapname, const char *fn, bool loop);
|
||||
int Mus_Play(const char *fn, bool loop);
|
||||
void Mus_Stop();
|
||||
bool Mus_IsPlaying();
|
||||
void Mus_SetPaused(bool on);
|
||||
|
|
|
@ -57,6 +57,7 @@ void BunchDrawer::Init(HWDrawInfo *_di, Clipper* c, vec2_t& view, binangle a1, b
|
|||
{
|
||||
ang1 = a1;
|
||||
ang2 = a2;
|
||||
angrange = ang2 - ang1;
|
||||
di = _di;
|
||||
clipper = c;
|
||||
viewx = view.x * (1/ 16.f);
|
||||
|
@ -108,10 +109,11 @@ bool BunchDrawer::StartBunch(int sectnum, int linenum, binangle startan, binangl
|
|||
|
||||
bunch->sectnum = sectnum;
|
||||
bunch->startline = bunch->endline = linenum;
|
||||
bunch->startangle = (startan.asbam() - ang1.asbam()) > ANGLE_180? ang1 :startan;
|
||||
bunch->endangle = (endan.asbam() - ang2.asbam()) < ANGLE_180 ? ang2 : endan;
|
||||
bunch->startangle = startan;
|
||||
bunch->endangle = endan;
|
||||
bunch->portal = portal;
|
||||
return bunch->endangle != ang2;
|
||||
assert(bunch->endangle.asbam() > bunch->startangle.asbam());
|
||||
return bunch->endangle != angrange;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
@ -123,8 +125,10 @@ bool BunchDrawer::StartBunch(int sectnum, int linenum, binangle startan, binangl
|
|||
bool BunchDrawer::AddLineToBunch(int line, binangle newan)
|
||||
{
|
||||
Bunches[LastBunch].endline++;
|
||||
Bunches[LastBunch].endangle = (newan.asbam() - ang2.asbam()) < ANGLE_180 ? ang2 : newan;
|
||||
return Bunches[LastBunch].endangle != ang2;
|
||||
assert(newan.asbam() > Bunches[LastBunch].endangle.asbam());
|
||||
Bunches[LastBunch].endangle = newan;
|
||||
assert(Bunches[LastBunch].endangle.asbam() > Bunches[LastBunch].startangle.asbam());
|
||||
return Bunches[LastBunch].endangle != angrange;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
@ -202,8 +206,8 @@ int BunchDrawer::ClipLine(int aline, bool portal)
|
|||
int section = cline->section;
|
||||
int line = cline->wall;
|
||||
|
||||
auto startAngleBam = wall[cline->startpoint].clipangle;
|
||||
auto endAngleBam = wall[cline->endpoint].clipangle;
|
||||
auto startAngleBam = ClipAngle(cline->startpoint);
|
||||
auto endAngleBam = ClipAngle(cline->endpoint);
|
||||
|
||||
// Back side, i.e. backface culling - read: endAngle <= startAngle!
|
||||
if (startAngleBam.asbam() - endAngleBam.asbam() < ANGLE_180)
|
||||
|
@ -213,10 +217,10 @@ int BunchDrawer::ClipLine(int aline, bool portal)
|
|||
if (line >= 0 && blockwall[line]) return CL_Draw;
|
||||
|
||||
// convert to clipper coordinates and clamp to valid range.
|
||||
int startAngle = startAngleBam.asbam() - ang1.asbam();
|
||||
int endAngle = endAngleBam.asbam() - ang1.asbam();
|
||||
int startAngle = startAngleBam.asbam();
|
||||
int endAngle = endAngleBam.asbam();
|
||||
if (startAngle < 0) startAngle = 0;
|
||||
if (endAngle < 0) endAngle = INT_MAX;
|
||||
if (endAngle < 0 || endAngle > (int)angrange.asbam()) endAngle = angrange.asbam();
|
||||
|
||||
// since these values are derived from previous calls of this function they cannot be out of range.
|
||||
int sectStartAngle = sectionstartang[section];
|
||||
|
@ -380,9 +384,6 @@ int BunchDrawer::WallInFront(int line1, int line2)
|
|||
|
||||
//==========================================================================
|
||||
//
|
||||
// This is a bit more complicated than it looks because angles can wrap
|
||||
// around so we can only compare angle differences.
|
||||
//
|
||||
// Rules:
|
||||
// 1. Any bunch can span at most 180°.
|
||||
// 2. 2 bunches can never overlap at both ends
|
||||
|
@ -395,15 +396,15 @@ int BunchDrawer::BunchInFront(FBunch* b1, FBunch* b2)
|
|||
{
|
||||
binangle anglecheck, endang;
|
||||
|
||||
if (b2->startangle.asbam() - b1->startangle.asbam() < b1->endangle.asbam() - b1->startangle.asbam())
|
||||
if (b2->startangle.asbam() >= b1->startangle.asbam() && b2->startangle.asbam() < b1->endangle.asbam())
|
||||
{
|
||||
// we have an overlap at b2->startangle
|
||||
anglecheck = b2->startangle - b1->startangle;
|
||||
anglecheck = b2->startangle;
|
||||
|
||||
// Find the wall in b1 that overlaps b2->startangle
|
||||
for (int i = b1->startline; i <= b1->endline; i++)
|
||||
{
|
||||
endang = wall[wall[i].point2].clipangle - b1->startangle;
|
||||
endang = ClipAngle(wall[i].point2);
|
||||
if (endang.asbam() > anglecheck.asbam())
|
||||
{
|
||||
// found a line
|
||||
|
@ -412,15 +413,15 @@ int BunchDrawer::BunchInFront(FBunch* b1, FBunch* b2)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (b1->startangle.asbam() - b2->startangle.asbam() < b2->endangle.asbam() - b2->startangle.asbam())
|
||||
else if (b1->startangle.asbam() >= b2->startangle.asbam() && b1->startangle.asbam() < b2->endangle.asbam())
|
||||
{
|
||||
// we have an overlap at b1->startangle
|
||||
anglecheck = b1->startangle - b2->startangle;
|
||||
anglecheck = b1->startangle;
|
||||
|
||||
// Find the wall in b2 that overlaps b1->startangle
|
||||
for (int i = b2->startline; i <= b2->endline; i++)
|
||||
{
|
||||
endang = wall[wall[i].point2].clipangle - b2->startangle;
|
||||
endang = ClipAngle(wall[i].point2);
|
||||
if (endang.asbam() > anglecheck.asbam())
|
||||
{
|
||||
// found a line
|
||||
|
@ -500,7 +501,6 @@ void BunchDrawer::ProcessSection(int sectionnum, bool portal)
|
|||
gotsection2.Set(sectionnum);
|
||||
|
||||
bool inbunch;
|
||||
binangle startangle;
|
||||
|
||||
SetupSprite.Clock();
|
||||
|
||||
|
@ -548,31 +548,29 @@ void BunchDrawer::ProcessSection(int sectionnum, bool portal)
|
|||
{
|
||||
auto thisline = §ionLines[section->lines[i]];
|
||||
|
||||
#ifdef _DEBUG
|
||||
// For displaying positions in debugger
|
||||
//DVector2 start = { WallStartX(thiswall), WallStartY(thiswall) };
|
||||
//DVector2 end = { WallStartX(thiswall->point2), WallStartY(thiswall->point2) };
|
||||
#endif
|
||||
binangle walang1 = wall[thisline->startpoint].clipangle;
|
||||
binangle walang2 = wall[thisline->endpoint].clipangle;
|
||||
binangle walang1 = ClipAngle(thisline->startpoint);
|
||||
binangle walang2 = ClipAngle(thisline->endpoint);
|
||||
|
||||
// outside the visible area or seen from the backside.
|
||||
if ((walang1.asbam() - ang1.asbam() > ANGLE_180 && walang2.asbam() - ang1.asbam() > ANGLE_180) ||
|
||||
(walang1.asbam() - ang2.asbam() < ANGLE_180 && walang2.asbam() - ang2.asbam() < ANGLE_180) ||
|
||||
if ((walang1.asbam() > angrange.asbam() && walang2.asbam() > angrange.asbam() && walang1.asbam() < walang2.asbam()) ||
|
||||
(walang1.asbam() - walang2.asbam() < ANGLE_180))
|
||||
{
|
||||
inbunch = false;
|
||||
}
|
||||
else if (!inbunch)
|
||||
{
|
||||
startangle = walang1;
|
||||
//Printf("Starting bunch:\n\tWall %d\n", sect->wallptr + i);
|
||||
inbunch = StartBunch(sectnum, section->lines[i], walang1, walang2, portal);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Printf("\tWall %d\n", sect->wallptr + i);
|
||||
inbunch = AddLineToBunch(section->lines[i], walang2);
|
||||
if (walang1.asbam() >= angrange.asbam()) { walang1 = bamang(0); inbunch = false; }
|
||||
if (walang2.asbam() >= angrange.asbam()) walang2 = angrange;
|
||||
if (!inbunch)
|
||||
{
|
||||
//Printf("Starting bunch:\n\tWall %d\n", section->lines[i]);
|
||||
inbunch = StartBunch(sectnum, section->lines[i], walang1, walang2, portal);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Printf("\tWall %d\n", section->lines[i]);
|
||||
inbunch = AddLineToBunch(section->lines[i], walang2);
|
||||
}
|
||||
}
|
||||
if (thisline->endpoint != section->lines[i] + 1) inbunch = false;
|
||||
}
|
||||
|
@ -596,7 +594,7 @@ void BunchDrawer::RenderScene(const int* viewsectors, unsigned sectcount, bool p
|
|||
for (auto j : sectionspersector[viewsectors[i]])
|
||||
{
|
||||
sectionstartang[j] = 0;
|
||||
sectionendang[j] = int(ang2.asbam() - ang1.asbam());
|
||||
sectionendang[j] = int(angrange.asbam());
|
||||
}
|
||||
}
|
||||
for (unsigned i = 0; i < sectcount; i++)
|
||||
|
@ -626,10 +624,12 @@ void BunchDrawer::RenderScene(const int* viewsectors, unsigned sectcount, bool p
|
|||
auto rotang = di->Viewpoint.RotAngle;
|
||||
ang1 = bamang(rotang - ANGLE_90);
|
||||
ang2 = bamang(rotang + ANGLE_90 - 1);
|
||||
angrange = ang2 - ang1;
|
||||
process();
|
||||
gotsection2.Zero();
|
||||
ang1 = bamang(rotang + ANGLE_90);
|
||||
ang2 = bamang(rotang - ANGLE_90 - 1);
|
||||
angrange = ang2 - ang1;
|
||||
process();
|
||||
}
|
||||
Bsp.Unclock();
|
||||
|
|
|
@ -31,7 +31,7 @@ class BunchDrawer
|
|||
FixedBitArray<MAXSECTORS*5/4> gotsection2;
|
||||
FixedBitArray<MAXWALLS> gotwall;
|
||||
FixedBitArray<MAXWALLS> blockwall;
|
||||
binangle ang1, ang2;
|
||||
binangle ang1, ang2, angrange;
|
||||
|
||||
int sectionstartang[MAXSECTORS*5/4], sectionendang[MAXSECTORS*5/4];
|
||||
|
||||
|
@ -44,6 +44,7 @@ private:
|
|||
CL_Pass = 2,
|
||||
};
|
||||
|
||||
binangle ClipAngle(int wal) { return wall[wal].clipangle - ang1; }
|
||||
void StartScene();
|
||||
bool StartBunch(int sectnum, int linenum, binangle startan, binangle endan, bool portal);
|
||||
bool AddLineToBunch(int line, binangle newan);
|
||||
|
|
|
@ -15,9 +15,7 @@
|
|||
#include "hw_renderstate.h"
|
||||
#include "hw_cvars.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable:4244)
|
||||
#endif
|
||||
#pragma warning(disable:4244) // this gets a bit annoying in the renderer...
|
||||
|
||||
struct HWHorizonInfo;
|
||||
struct HWSkyInfo;
|
||||
|
@ -403,15 +401,12 @@ inline void SetSpriteTranslucency(const spritetype* sprite, float& alpha, FRende
|
|||
extern PalEntry GlobalMapFog;
|
||||
extern float GlobalFogDensity;
|
||||
|
||||
__forceinline void SetLightAndFog(FRenderState& state, PalEntry fade, int palette, int shade, float visibility, float alpha, bool setcolor = true)
|
||||
__forceinline void SetLightAndFog(FRenderState& state, PalEntry fade, int palette, int shade, float visibility, float alpha)
|
||||
{
|
||||
// Fog must be done before the texture so that the texture selector can override it.
|
||||
bool foggy = (GlobalMapFog || (fade & 0xffffff));
|
||||
auto ShadeDiv = lookups.tables[palette].ShadeFactor;
|
||||
bool shadow = shade >= numshades;
|
||||
|
||||
if (shadow) state.SetObjectColor(0xff000000); // make sure that nothing lights this up again.
|
||||
else state.SetObjectColor(0xffffffff);
|
||||
if (shade == 127) state.SetObjectColor(0xff000000); // 127 is generally used for shadow objects that must be black, even in foggy areas.
|
||||
|
||||
// Disable brightmaps if non-black fog is used.
|
||||
if (ShadeDiv >= 1 / 1000.f && foggy)
|
||||
|
|
|
@ -191,7 +191,7 @@ void HWFlat::DrawFlat(HWDrawInfo *di, FRenderState &state, bool translucent)
|
|||
if (translucent) state.SetRenderStyle(LegacyRenderStyles[STYLE_Translucent]);
|
||||
state.EnableBrightmap(true);
|
||||
|
||||
//state.SetObjectColor(0xffffffff);
|
||||
state.SetObjectColor(0xffffffff);
|
||||
//state.SetAddColor(0);
|
||||
//state.ApplyTextureManipulation(nullptr);
|
||||
}
|
||||
|
@ -244,7 +244,7 @@ void HWFlat::ProcessSector(HWDrawInfo *di, sectortype * frontsector, int section
|
|||
const auto &vp = di->Viewpoint;
|
||||
|
||||
float florz, ceilz;
|
||||
PlanesAtPoint(frontsector, vp.Pos.X * 16.f, vp.Pos.Y * -16.f, &ceilz, &florz);
|
||||
PlanesAtPoint(frontsector, float(vp.Pos.X) * 16.f, float(vp.Pos.Y) * -16.f, &ceilz, &florz);
|
||||
|
||||
fade = lookups.getFade(frontsector->floorpal); // fog is per sector.
|
||||
visibility = sectorVisibility(frontsector);
|
||||
|
|
|
@ -481,7 +481,7 @@ int HWLinePortal::ClipSeg(walltype *seg, const DVector3 &viewpos)
|
|||
int HWLinePortal::ClipSector(sectortype *sub)
|
||||
{
|
||||
// this seg is completely behind the mirror
|
||||
for (unsigned int i = 0; i<sub->wallnum; i++)
|
||||
for (int i = 0; i<sub->wallnum; i++)
|
||||
{
|
||||
if (PointOnLineSide(WallStart(&wall[sub->wallptr]), line) == 0) return PClip_Inside;
|
||||
}
|
||||
|
|
|
@ -109,7 +109,10 @@ void HWSprite::DrawSprite(HWDrawInfo* di, FRenderState& state, bool translucent)
|
|||
else RenderStyle.BlendOp = STYLEOP_Fuzz; // subtractive with models is not going to work.
|
||||
}
|
||||
|
||||
SetLightAndFog(state, fade, palette, shade, visibility, alpha, this->shade <= numshades);
|
||||
SetLightAndFog(state, fade, palette, shade, visibility, alpha);
|
||||
|
||||
if (shade >= numshades) state.SetObjectColor(0xff000000); // make sure that nothing lights this up again.
|
||||
|
||||
|
||||
if (modelframe == 0)
|
||||
{
|
||||
|
@ -161,6 +164,7 @@ void HWSprite::DrawSprite(HWDrawInfo* di, FRenderState& state, bool translucent)
|
|||
{
|
||||
//RenderModel(&renderer, x, y, z, modelframe, actor, di->Viewpoint.TicFrac);
|
||||
}
|
||||
state.SetObjectColor(0xffffffff);
|
||||
state.SetVertexBuffer(screen->mVertexData);
|
||||
state.EnableModelMatrix(false);
|
||||
}
|
||||
|
|
|
@ -128,7 +128,7 @@ void HWWall::RenderMirrorSurface(HWDrawInfo *di, FRenderState &state)
|
|||
|
||||
// Use sphere mapping for this
|
||||
state.SetEffect(EFF_SPHEREMAP);
|
||||
SetLightAndFog(state, fade, palette, shade, visibility, alpha, false);
|
||||
SetLightAndFog(state, fade, palette, min<int>(shade, numshades), visibility, alpha);
|
||||
state.SetColor(PalEntry(25, globalr >> 1, globalg >> 1, globalb >> 1));
|
||||
|
||||
state.SetRenderStyle(STYLE_Add);
|
||||
|
@ -173,8 +173,8 @@ void HWWall::RenderTexturedWall(HWDrawInfo *di, FRenderState &state, int rflags)
|
|||
RenderWall(di, state, rflags);
|
||||
|
||||
state.SetNpotEmulation(0.f, 0.f);
|
||||
/* none of these functions is in use.
|
||||
state.SetObjectColor(0xffffffff);
|
||||
/* none of these functions is in use.
|
||||
state.SetObjectColor2(0);
|
||||
state.SetAddColor(0);
|
||||
state.SetTextureMode(tmode);
|
||||
|
@ -1088,10 +1088,17 @@ void HWWall::ProcessWallSprite(HWDrawInfo* di, spritetype* spr, sectortype* sect
|
|||
|
||||
zbottom[0] = zbottom[1] = (sprz) * (1 / -256.);
|
||||
ztop[0] = ztop[1] = (sprz - ((height * spr->yrepeat) << 2)) * (1 / -256.);
|
||||
if (zbottom[0] > ztop[0])
|
||||
{
|
||||
// reorder coordinates to make the clipping code below behave.
|
||||
auto zz = zbottom[0];
|
||||
zbottom[0] = zbottom[1] = ztop[0];
|
||||
ztop[0] = ztop[1] = zz;
|
||||
}
|
||||
|
||||
// Clip sprites to ceilings/floors
|
||||
float origz = ztop[0];
|
||||
float polyh = (zbottom[0] - origz);
|
||||
float origz = zbottom[0];
|
||||
float polyh = (ztop[0] - origz);
|
||||
if (!(sector->ceilingstat & CSTAT_SECTOR_SKY))
|
||||
{
|
||||
float ceilingz = sector->ceilingz * (1 / -256.f);
|
||||
|
|
|
@ -95,7 +95,7 @@ bool RTS_IsInitialized()
|
|||
{
|
||||
FileLump *li = (FileLump*)(RTSFile.Data() + LittleLong(wi->infotableofs));
|
||||
LumpInfo.Resize(numlumps);
|
||||
for(unsigned i = 0; i < numlumps; i++, li++)
|
||||
for(int i = 0; i < numlumps; i++, li++)
|
||||
{
|
||||
LumpInfo[i] = { LittleLong(li->position), LittleLong(li->size), -1 };
|
||||
if (unsigned(LumpInfo[i].position + LumpInfo[i].size) >= RTSFile.Size())
|
||||
|
|
|
@ -68,7 +68,10 @@ walltype wallbackup[MAXWALLS];
|
|||
|
||||
void WriteSavePic(FileWriter* file, int width, int height);
|
||||
bool WriteZip(const char* filename, TArray<FString>& filenames, TArray<FCompressedBuffer>& content);
|
||||
extern FString savename;
|
||||
extern FString BackupSaveGame;
|
||||
int SaveVersion;
|
||||
|
||||
void SerializeMap(FSerializer &arc);
|
||||
FixedBitArray<MAXSPRITES> activeSprites;
|
||||
|
||||
|
@ -344,6 +347,7 @@ int G_ValidateSavegame(FileReader &fr, FString *savetitle, bool formenu)
|
|||
// not our business. Leave it alone.
|
||||
return 0;
|
||||
}
|
||||
SaveVersion = savesig.currentsavever;
|
||||
|
||||
MapRecord *curLevel = FindMapByName(label);
|
||||
|
||||
|
@ -686,26 +690,103 @@ static int nextquicksave = -1;
|
|||
}
|
||||
|
||||
|
||||
void G_LoadGame(const char *filename)
|
||||
void G_LoadGame(const char* name, bool hidecon)
|
||||
{
|
||||
inputState.ClearAllInput();
|
||||
gi->FreeLevelData();
|
||||
DoLoadGame(filename);
|
||||
BackupSaveGame = filename;
|
||||
if (name != NULL)
|
||||
{
|
||||
savename = name;
|
||||
gameaction = !hidecon ? ga_loadgame : ga_loadgamehidecon;
|
||||
}
|
||||
}
|
||||
|
||||
void G_SaveGame(const char *fn, const char *desc, bool ok4q, bool forceq)
|
||||
void G_DoLoadGame()
|
||||
{
|
||||
if (gameaction == ga_loadgamehidecon && gamestate == GS_FULLCONSOLE)
|
||||
{
|
||||
// does this even do anything anymore?
|
||||
gamestate = GS_HIDECONSOLE;
|
||||
}
|
||||
|
||||
inputState.ClearAllInput();
|
||||
gi->FreeLevelData();
|
||||
DoLoadGame(savename);
|
||||
BackupSaveGame = savename;
|
||||
}
|
||||
|
||||
extern bool sendsave;
|
||||
extern FString savedescription;
|
||||
extern FString savegamefile;
|
||||
|
||||
void G_SaveGame(const char* filename, const char* description)
|
||||
{
|
||||
if (sendsave || gameaction == ga_savegame)
|
||||
{
|
||||
Printf("%s\n", GStrings("TXT_SAVEPENDING"));
|
||||
}
|
||||
else if (gamestate != GS_LEVEL)
|
||||
{
|
||||
Printf("%s\n", GStrings("TXT_NOTINLEVEL"));
|
||||
}
|
||||
else if (!gi->CanSave())
|
||||
{
|
||||
Printf("%s\n", GStrings("TXT_SPPLAYERDEAD"));
|
||||
}
|
||||
else
|
||||
{
|
||||
savegamefile = filename;
|
||||
savedescription = description;
|
||||
sendsave = true;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void startSaveGame(int player, uint8_t** stream, bool skip)
|
||||
{
|
||||
auto s = ReadString(stream);
|
||||
savegamefile = s;
|
||||
delete[] s;
|
||||
s = ReadString(stream);
|
||||
savedescription = s;
|
||||
if (!skip && gi->CanSave())
|
||||
{
|
||||
if (player != consoleplayer)
|
||||
{
|
||||
// Paths sent over the network will be valid for the system that sent
|
||||
// the save command. For other systems, the path needs to be changed.
|
||||
savegamefile = G_BuildSaveName(ExtractFileBase(savegamefile, true));
|
||||
}
|
||||
gameaction = ga_savegame;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void G_DoSaveGame(bool ok4q, bool forceq, const char* fn, const char* desc)
|
||||
{
|
||||
if (WriteSavegame(fn, desc))
|
||||
{
|
||||
savegameManager.NotifyNewSave(fn, desc, ok4q, forceq);
|
||||
Printf(PRINT_NOTIFY, "%s\n", GStrings("GAME SAVED"));
|
||||
BackupSaveGame = fn;
|
||||
}
|
||||
savegameManager.NotifyNewSave(fn, desc, ok4q, forceq);
|
||||
Printf(PRINT_NOTIFY, "%s\n", GStrings("GGSAVED"));
|
||||
BackupSaveGame = fn;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
void M_Autosave()
|
||||
void M_Autosave()
|
||||
{
|
||||
if (disableautosave) return;
|
||||
if (!gi->CanSave()) return;
|
||||
|
@ -728,7 +809,7 @@ void M_Autosave()
|
|||
readableTime = myasctime();
|
||||
FStringf SaveTitle("Autosave %s", readableTime);
|
||||
nextautosave = (nextautosave + 1) % count;
|
||||
G_SaveGame(Filename, SaveTitle, false, false);
|
||||
G_DoSaveGame(false, false, Filename, SaveTitle);
|
||||
}
|
||||
|
||||
CCMD(autosave)
|
||||
|
@ -759,7 +840,51 @@ CCMD(rotatingquicksave)
|
|||
readableTime = myasctime();
|
||||
FStringf SaveTitle("Quicksave %s", readableTime);
|
||||
nextquicksave = (nextquicksave + 1) % count;
|
||||
G_SaveGame(Filename, SaveTitle, false, false);
|
||||
G_SaveGame(Filename, SaveTitle);
|
||||
}
|
||||
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// CCMD load
|
||||
//
|
||||
// Load a saved game.
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
UNSAFE_CCMD(load)
|
||||
{
|
||||
if (argv.argc() != 2)
|
||||
{
|
||||
Printf("usage: load <filename>\n");
|
||||
return;
|
||||
}
|
||||
if (netgame)
|
||||
{
|
||||
Printf("cannot load during a network game\n");
|
||||
return;
|
||||
}
|
||||
FString fname = G_BuildSaveName(argv[1]);
|
||||
G_LoadGame(fname);
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// CCMD save
|
||||
//
|
||||
// Save the current game.
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
UNSAFE_CCMD(save)
|
||||
{
|
||||
if (argv.argc() < 2 || argv.argc() > 3)
|
||||
{
|
||||
Printf("usage: save <filename> [description]\n");
|
||||
return;
|
||||
}
|
||||
FString fname = G_BuildSaveName(argv[1]);
|
||||
G_SaveGame(fname, argv.argc() > 2 ? argv[2] : argv[1]);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -7,12 +7,15 @@ extern FixedBitArray<MAXSPRITES> activeSprites;
|
|||
|
||||
// Savegame utilities
|
||||
class FileReader;
|
||||
extern int SaveVersion;
|
||||
|
||||
FString G_BuildSaveName (const char *prefix);
|
||||
int G_ValidateSavegame(FileReader &fr, FString *savetitle, bool formenu);
|
||||
|
||||
void G_LoadGame(const char* filename);
|
||||
void G_SaveGame(const char* fn, const char* desc, bool ok4q, bool forceq);
|
||||
void G_LoadGame(const char* filename, bool hidecon = false);
|
||||
void G_SaveGame(const char* fn, const char* desc);
|
||||
void G_DoSaveGame(bool okForQuicksave, bool forceQuicksave, const char* filename, const char* description);
|
||||
void G_DoLoadGame();
|
||||
|
||||
void M_Autosave();
|
||||
|
||||
|
|
|
@ -94,7 +94,7 @@ void Job_Init()
|
|||
|
||||
static VMFunction* LookupFunction(const char* qname, bool validate = true)
|
||||
{
|
||||
int p = strcspn(qname, ".");
|
||||
size_t p = strcspn(qname, ".");
|
||||
if (p == 0) I_Error("Call to undefined function %s", qname);
|
||||
FString clsname(qname, p);
|
||||
FString funcname = qname + p + 1;
|
||||
|
@ -488,7 +488,11 @@ void ShowIntermission(MapRecord* fromMap, MapRecord* toMap, SummaryInfo* info, C
|
|||
if (tocluster == nullptr || !tocluster->intro.Create(runner, toMap, !!fromMap))
|
||||
globalCutscenes.DefaultMapIntro.Create(runner, toMap, !!fromMap);
|
||||
}
|
||||
globalCutscenes.LoadingScreen.Create(runner, toMap, true);
|
||||
// Skip the load screen if the level is started from the console.
|
||||
// In this case the load screen is not helpful as it blocks the actual level start,
|
||||
// requiring closing and reopening the console first before entering any commands that need the level.
|
||||
if (ConsoleState == c_up || ConsoleState == c_rising)
|
||||
globalCutscenes.LoadingScreen.Create(runner, toMap, true);
|
||||
}
|
||||
else if (isShareware())
|
||||
{
|
||||
|
|
|
@ -668,7 +668,7 @@ void GetCRC(FileEntry *entry, TArray<FileEntry> &CRCCache)
|
|||
do
|
||||
{
|
||||
b = f.Read(buffer.Data(), buffer.Size());
|
||||
if (b > 0) crcval = AddCRC32(crcval, buffer.Data(), b);
|
||||
if (b > 0) crcval = AddCRC32(crcval, buffer.Data(), unsigned(b));
|
||||
}
|
||||
while (b == buffer.Size());
|
||||
entry->CRCValue = crcval;
|
||||
|
|
|
@ -139,8 +139,8 @@ public:
|
|||
DVector2 dv = { double(ix2 - ix1), -double(iy2 - iy1) };
|
||||
auto vang = dv.Angle() - 90.;
|
||||
|
||||
cosalign = vang.Cos();
|
||||
sinalign = vang.Sin();
|
||||
cosalign = float(vang.Cos());
|
||||
sinalign = float(vang.Sin());
|
||||
|
||||
int pow2width = 1 << sizeToBits((int)tx->GetDisplayWidth());
|
||||
if (pow2width < (int)tx->GetDisplayWidth()) pow2width *= 2;
|
||||
|
@ -247,9 +247,9 @@ bool SectorGeometry::MakeVertices(unsigned int secnum, int plane, const FVector2
|
|||
{
|
||||
auto sline = §ionLines[sec->lines[start]];
|
||||
auto wallp = &wall[sline->startpoint];
|
||||
float X = WallStartX(wallp);
|
||||
float Y = WallStartY(wallp);
|
||||
if (fabs(X) > 32768. || fabs(Y) > 32768.)
|
||||
float X = float(WallStartX(wallp));
|
||||
float Y = float(WallStartY(wallp));
|
||||
if (fabs(X) > 32768.f || fabs(Y) > 32768.f)
|
||||
{
|
||||
// If we get here there's some fuckery going around with the coordinates. Let's better abort and wait for things to realign.
|
||||
// Do not try alternative methods if this happens.
|
||||
|
@ -277,7 +277,7 @@ bool SectorGeometry::MakeVertices(unsigned int secnum, int plane, const FVector2
|
|||
{
|
||||
minx = pt.first;
|
||||
miny = pt.second;
|
||||
outer = a;
|
||||
outer = int(a);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -303,8 +303,8 @@ bool SectorGeometry::MakeVertices(unsigned int secnum, int plane, const FVector2
|
|||
}
|
||||
|
||||
auto& entry = data[secnum].planes[plane];
|
||||
entry.vertices.Resize(indices.size());
|
||||
entry.texcoords.Resize(indices.size());
|
||||
entry.vertices.Resize((unsigned)indices.size());
|
||||
entry.texcoords.Resize((unsigned)indices.size());
|
||||
entry.normal = CalcNormal(sectorp, plane);
|
||||
|
||||
auto texture = tileGetTexture(plane ? sectorp->ceilingpicnum : sectorp->floorpicnum);
|
||||
|
|
|
@ -70,63 +70,7 @@ enum
|
|||
HUDMSGLayer_Default = HUDMSGLayer_OverHUD,
|
||||
};
|
||||
|
||||
struct FLevelStats
|
||||
{
|
||||
int screenbottomspace;
|
||||
int time; // in milliseconds
|
||||
int frags;
|
||||
int kills, maxkills; // set maxkills to -1 to ignore, or to -2 to only print kills
|
||||
int secrets, maxsecrets, supersecrets; // set maxsecrets to -1 to ignore
|
||||
int spacing; // uses fontheight if 0 or less.
|
||||
EColorRange letterColor, standardColor, completeColor;
|
||||
double fontscale;
|
||||
FFont* font;
|
||||
};
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// encapsulates all settings a HUD font may need
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
class DBaseStatusBar : public DStatusBarCore
|
||||
{
|
||||
DECLARE_ABSTRACT_CLASS (DBaseStatusBar, DStatusBarCore)
|
||||
|
||||
public:
|
||||
DBaseStatusBar ();
|
||||
virtual ~DBaseStatusBar() = default;
|
||||
|
||||
// do not make this a DObject Serialize function because it's not used like one!
|
||||
//void SerializeMessages(FSerializer &arc);
|
||||
|
||||
virtual void Tick ();
|
||||
|
||||
void PrintLevelStats(FLevelStats& stats);
|
||||
void PrintAutomapInfo(FLevelStats& stats, bool forcetextfont = false);
|
||||
int GetTopOfStatusbar() const
|
||||
{
|
||||
return SBarTop;
|
||||
}
|
||||
short CalcMagazineAmount(short ammo_remaining, short clip_capacity, bool reloading);
|
||||
void Set43ClipRect();
|
||||
virtual void UpdateStatusBar() = 0;
|
||||
|
||||
|
||||
private:
|
||||
DObject *AltHud = nullptr;
|
||||
|
||||
public:
|
||||
|
||||
|
||||
bool Centering;
|
||||
bool FixedOrigin;
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
extern DBaseStatusBar *StatusBar;
|
||||
extern DStatusBarCore *StatusBar;
|
||||
|
||||
// Status bar factories -----------------------------------------------------
|
||||
|
||||
|
@ -136,7 +80,6 @@ void ST_Clear();
|
|||
extern FGameTexture *CrosshairImage;
|
||||
|
||||
|
||||
void SBar_DrawString(DStatusBarCore* self, DHUDFont* font, const FString& string, double x, double y, int flags, int trans, double alpha, int wrapwidth, int linespacing, double scaleX, double scaleY, int pt = 0, int style = STYLE_Translucent);
|
||||
void setViewport(int viewSize);
|
||||
struct MapRecord;
|
||||
void setLevelStarted(MapRecord *);
|
||||
|
@ -144,5 +87,10 @@ void drawMapTitle();
|
|||
class FSerializer;
|
||||
void SerializeHud(FSerializer &arc);
|
||||
extern int levelTextTime;
|
||||
struct SummaryInfo;
|
||||
void UpdateStatusBar(SummaryInfo* info);
|
||||
void TickStatusBar();
|
||||
void ResetStatusBar();
|
||||
void InitStatusBar();
|
||||
|
||||
#endif /* __SBAR_H__ */
|
||||
|
|
|
@ -64,12 +64,6 @@
|
|||
|
||||
#include "../version.h"
|
||||
|
||||
#define XHAIRSHRINKSIZE (1./18)
|
||||
#define XHAIRPICKUPSIZE (2+XHAIRSHRINKSIZE)
|
||||
#define POWERUPICONSIZE 32
|
||||
|
||||
//IMPLEMENT_CLASS(DHUDFont, true, false);
|
||||
|
||||
EXTERN_CVAR (Bool, am_showmonsters)
|
||||
EXTERN_CVAR (Bool, am_showsecrets)
|
||||
EXTERN_CVAR (Bool, am_showtime)
|
||||
|
@ -78,12 +72,10 @@ EXTERN_CVAR (Bool, noisedebug)
|
|||
EXTERN_CVAR(Bool, vid_fps)
|
||||
EXTERN_CVAR(Bool, inter_subtitles)
|
||||
|
||||
//extern DBaseStatusBar *StatusBar;
|
||||
|
||||
extern int setblocks;
|
||||
|
||||
IMPLEMENT_CLASS(DBaseStatusBar, true, false)
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// ST_Clear
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
@ -99,198 +91,6 @@ void ST_Clear()
|
|||
*/
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Constructor
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
DBaseStatusBar::DBaseStatusBar ()
|
||||
{
|
||||
CompleteBorder = false;
|
||||
Centering = false;
|
||||
FixedOrigin = false;
|
||||
SetSize(0);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// PROC Tick
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void DBaseStatusBar::Tick ()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static DObject *InitObject(PClass *type, int paramnum, VM_ARGS)
|
||||
{
|
||||
auto obj = type->CreateNew();
|
||||
// Todo: init
|
||||
return obj;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
//
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void DBaseStatusBar::PrintLevelStats(FLevelStats &stats)
|
||||
{
|
||||
double y;
|
||||
double scale = stats.fontscale * hud_statscale;
|
||||
if (stats.spacing <= 0) stats.spacing = stats.font->GetHeight() * stats.fontscale;
|
||||
double spacing = stats.spacing * hud_statscale;
|
||||
if (stats.screenbottomspace < 0)
|
||||
{
|
||||
y = 200 - (RelTop - stats.screenbottomspace) * hud_scalefactor - spacing;
|
||||
}
|
||||
else
|
||||
{
|
||||
y = 200 - stats.screenbottomspace * hud_scalefactor - spacing;
|
||||
}
|
||||
|
||||
double y1, y2, y3;
|
||||
|
||||
if (stats.maxsecrets > 0) // don't bother if there are no secrets.
|
||||
{
|
||||
y1 = y;
|
||||
y -= spacing;
|
||||
}
|
||||
if (stats.frags >= 0 || stats.maxkills != -1)
|
||||
{
|
||||
y2 = y;
|
||||
y -= spacing;
|
||||
}
|
||||
y3 = y;
|
||||
|
||||
|
||||
FString text;
|
||||
int black = 0x80000000;
|
||||
|
||||
text.Format(TEXTCOLOR_ESCAPESTR "%cT: " TEXTCOLOR_ESCAPESTR "%c%d:%02d", stats.letterColor + 'A', stats.standardColor + 'A', stats.time / 60000, (stats.time % 60000) / 1000);
|
||||
DrawText(twod, stats.font, CR_UNTRANSLATED, 2 * hud_statscale + scale, y3 + scale, text, DTA_FullscreenScale, FSMode_ScaleToHeight, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_KeepRatio, true, DTA_ScaleX, scale, DTA_ScaleY, scale, DTA_LegacyRenderStyle, STYLE_TranslucentStencil, DTA_Color, black, TAG_DONE);
|
||||
DrawText(twod, stats.font, CR_UNTRANSLATED, 2 * hud_statscale, y3, text, DTA_FullscreenScale, FSMode_ScaleToHeight, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_KeepRatio, true, DTA_ScaleX, scale, DTA_ScaleY, scale, TAG_DONE);
|
||||
|
||||
text = "";
|
||||
if (stats.frags > -1) text.Format(TEXTCOLOR_ESCAPESTR "%cF: " TEXTCOLOR_ESCAPESTR "%c%d", stats.letterColor + 'A', stats.standardColor + 'A', stats.frags);
|
||||
else if (stats.maxkills == -2) text.Format(TEXTCOLOR_ESCAPESTR "%cK: " TEXTCOLOR_ESCAPESTR "%c%d", stats.letterColor + 'A', stats.standardColor + 'A', stats.kills);
|
||||
else if (stats.maxkills != -1) text.Format(TEXTCOLOR_ESCAPESTR "%cK: " TEXTCOLOR_ESCAPESTR "%c%d/%d",
|
||||
stats.letterColor + 'A', stats.kills == stats.maxkills ? stats.completeColor + 'A' : stats.standardColor + 'A', stats.kills, stats.maxkills);
|
||||
|
||||
if (text.IsNotEmpty())
|
||||
{
|
||||
DrawText(twod, stats.font, CR_UNTRANSLATED, 2 * hud_statscale+scale, y2+scale, text, DTA_FullscreenScale, FSMode_ScaleToHeight, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_KeepRatio, true, DTA_ScaleX, scale, DTA_ScaleY, scale, DTA_LegacyRenderStyle, STYLE_TranslucentStencil, DTA_Color, black, TAG_DONE);
|
||||
|
||||
DrawText(twod, stats.font, CR_UNTRANSLATED, 2 * hud_statscale, y2, text, DTA_FullscreenScale, FSMode_ScaleToHeight, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_KeepRatio, true, DTA_ScaleX, scale, DTA_ScaleY, scale, TAG_DONE);
|
||||
}
|
||||
|
||||
if (stats.maxsecrets > 0) // don't bother if there are no secrets.
|
||||
{
|
||||
if (stats.supersecrets <= 0)
|
||||
text.Format(TEXTCOLOR_ESCAPESTR "%cS: " TEXTCOLOR_ESCAPESTR "%c%d/%d",
|
||||
stats.letterColor + 'A', stats.secrets >= stats.maxsecrets ? stats.completeColor + 'A' : stats.standardColor + 'A', stats.secrets, stats.maxsecrets);
|
||||
else
|
||||
text.Format(TEXTCOLOR_ESCAPESTR "%cS: " TEXTCOLOR_ESCAPESTR "%c%d/%d+%d",
|
||||
stats.letterColor + 'A', stats.secrets >= stats.maxsecrets ? stats.completeColor + 'A' : stats.standardColor + 'A', stats.secrets, stats.maxsecrets, stats.supersecrets);
|
||||
|
||||
|
||||
DrawText(twod, stats.font, CR_UNTRANSLATED, 2 * hud_statscale + scale, y1 + scale, text, DTA_FullscreenScale, FSMode_ScaleToHeight, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_KeepRatio, true, DTA_ScaleX, scale, DTA_ScaleY, scale, DTA_LegacyRenderStyle, STYLE_TranslucentStencil, DTA_Color, black, TAG_DONE);
|
||||
|
||||
DrawText(twod, stats.font, CR_UNTRANSLATED, 2 * hud_statscale, y1, text, DTA_FullscreenScale, FSMode_ScaleToHeight, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_KeepRatio, true, DTA_ScaleX, scale, DTA_ScaleY, scale, TAG_DONE);
|
||||
}
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
//
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void DBaseStatusBar::PrintAutomapInfo(FLevelStats& stats, bool forcetextfont)
|
||||
{
|
||||
auto lev = currentLevel;
|
||||
FString mapname;
|
||||
if (am_showlabel)
|
||||
mapname.Format(TEXTCOLOR_ESCAPESTR "%c%s: " TEXTCOLOR_ESCAPESTR "%c%s", stats.letterColor+'A', lev->LabelName(), stats.standardColor+'A', lev->DisplayName());
|
||||
else
|
||||
mapname = lev->DisplayName();
|
||||
|
||||
forcetextfont |= am_textfont;
|
||||
double y;
|
||||
double scale = stats.fontscale * (forcetextfont ? *hud_statscale : 1); // the tiny default font used by all games here cannot be scaled for readability purposes.
|
||||
if (stats.spacing <= 0) stats.spacing = stats.font->GetHeight() * stats.fontscale;
|
||||
double spacing = stats.spacing * (forcetextfont ? *hud_statscale : 1);
|
||||
if (am_nameontop)
|
||||
{
|
||||
y = spacing + 1;
|
||||
}
|
||||
else if (stats.screenbottomspace < 0)
|
||||
{
|
||||
y = 200 - RelTop - spacing;
|
||||
}
|
||||
else
|
||||
{
|
||||
y = 200 - stats.screenbottomspace - spacing;
|
||||
}
|
||||
auto cluster = FindCluster(lev->cluster);
|
||||
FString volname;
|
||||
if (cluster) volname = cluster->name;
|
||||
if (volname.IsEmpty() && am_nameontop) y = 1;
|
||||
|
||||
DrawText(twod, stats.font, stats.standardColor, 2 * hud_statscale, y, mapname, DTA_FullscreenScale, FSMode_ScaleToHeight, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_ScaleX, scale, DTA_ScaleY, scale, DTA_KeepRatio, true, TAG_DONE);
|
||||
y -= spacing;
|
||||
if (!(lev->flags & MI_USERMAP) && !(g_gameType & GAMEFLAG_PSEXHUMED) && volname.IsNotEmpty())
|
||||
DrawText(twod, stats.font, stats.standardColor, 2 * hud_statscale, y, GStrings.localize(volname),
|
||||
DTA_FullscreenScale, FSMode_ScaleToHeight, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_ScaleX, scale, DTA_ScaleY, scale, DTA_KeepRatio, true, TAG_DONE);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
//
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
short DBaseStatusBar::CalcMagazineAmount(short ammo_remaining, short clip_capacity, bool reloading)
|
||||
{
|
||||
// Determine amount in clip.
|
||||
short clip_amount = ammo_remaining % clip_capacity;
|
||||
|
||||
// Set current clip value to clip capacity if wrapped around to zero, otherwise use determined value.
|
||||
short clip_current = ammo_remaining != 0 && clip_amount == 0 ? clip_capacity : clip_amount;
|
||||
|
||||
// Return current clip value if weapon has rounds or is not on a reload cycle.
|
||||
return ammo_remaining == 0 || (reloading && clip_amount == 0) ? 0 : clip_current;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
//
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
void DBaseStatusBar::Set43ClipRect()
|
||||
{
|
||||
auto GetWidth = [=]() { return twod->GetWidth(); };
|
||||
auto GetHeight = [=]() {return twod->GetHeight(); };
|
||||
|
||||
auto screenratio = ActiveRatio(GetWidth(), GetHeight());
|
||||
if (screenratio < 1.34) return;
|
||||
|
||||
int width = xs_CRoundToInt(GetWidth() * 1.333 / screenratio);
|
||||
int left = (GetWidth() - width) / 2;
|
||||
twod->SetClipRect(left, 0, width, GetHeight());
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
//
|
||||
|
@ -379,5 +179,39 @@ void drawMapTitle()
|
|||
}
|
||||
}
|
||||
|
||||
void UpdateStatusBar(SummaryInfo* info)
|
||||
{
|
||||
IFVIRTUALPTRNAME(StatusBar, NAME_RazeStatusBar, UpdateStatusBar)
|
||||
{
|
||||
VMValue params[] = { StatusBar, info };
|
||||
VMCall(func, params, 2, nullptr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void TickStatusBar()
|
||||
{
|
||||
IFVIRTUALPTRNAME(StatusBar, NAME_RazeStatusBar, Tick)
|
||||
{
|
||||
VMValue params[] = { StatusBar };
|
||||
VMCall(func, params, 1, nullptr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void ResetStatusBar()
|
||||
{
|
||||
IFVIRTUALPTRNAME(StatusBar, NAME_RazeStatusBar, Reset)
|
||||
{
|
||||
VMValue params[] = { StatusBar };
|
||||
VMCall(func, params, 1, nullptr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void InitStatusBar()
|
||||
{
|
||||
IFVIRTUALPTRNAME(StatusBar, NAME_RazeStatusBar, Init)
|
||||
{
|
||||
VMValue params[] = { StatusBar };
|
||||
VMCall(func, params, 1, nullptr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -274,7 +274,7 @@ void BuildTiles::MakeCanvas(int tilenum, int width, int height)
|
|||
{
|
||||
auto canvas = ValidateCustomTile(tilenum, ReplacementType::Canvas);
|
||||
canvas->SetSize(width*4, height*4);
|
||||
canvas->SetDisplaySize(width, height);
|
||||
canvas->SetDisplaySize((float)width, (float)height);
|
||||
canvas->GetTexture()->SetSize(width * 4, height * 4);
|
||||
static_cast<FCanvasTexture*>(canvas->GetTexture())->aspectRatio = (float)width / height;
|
||||
}
|
||||
|
@ -291,7 +291,7 @@ void BuildTiles::MakeCanvas(int tilenum, int width, int height)
|
|||
|
||||
int BuildTiles::LoadArtFile(const char *fn, const char *mapname, int firsttile)
|
||||
{
|
||||
auto old = FindFile(fn);
|
||||
unsigned old = FindFile(fn);
|
||||
if (old >= ArtFiles.Size()) // Do not process if already loaded.
|
||||
{
|
||||
FileReader fr = fileSystem.OpenFileReader(fn);
|
||||
|
|
|
@ -440,7 +440,7 @@ bool PreBindTexture(FRenderState* state, FGameTexture*& tex, EUpscaleFlags& flag
|
|||
flags |= (((pick.tintFlags & TINTF_BLENDMASK) >> 6) + 1) & TextureManipulation::BlendMask;
|
||||
}
|
||||
}
|
||||
addcol.W = flags;
|
||||
addcol.W = (float)flags;
|
||||
if ((pick.translation & 0x80000000) && hw_shadeinterpolate) addcol.W += 16384; // hijack a free bit in here.
|
||||
state->SetTextureColors(&modcol.X, &addcol.X, &blendcol.X);
|
||||
}
|
||||
|
|
|
@ -70,16 +70,16 @@ const char *GetVersionString();
|
|||
#define SAVESIG_PS GAMENAME ".Exhumed"
|
||||
#define SAVESIG_WH GAMENAME ".Witchaven"
|
||||
|
||||
#define MINSAVEVER_DN3D 10
|
||||
#define MINSAVEVER_BLD 11
|
||||
#define MINSAVEVER_SW 12
|
||||
#define MINSAVEVER_PS 12
|
||||
#define MINSAVEVER_DN3D 11
|
||||
#define MINSAVEVER_BLD 12
|
||||
#define MINSAVEVER_SW 13
|
||||
#define MINSAVEVER_PS 13
|
||||
#define MINSAVEVER_WH 10
|
||||
|
||||
#define SAVEVER_DN3D 10
|
||||
#define SAVEVER_BLD 11
|
||||
#define SAVEVER_SW 12
|
||||
#define SAVEVER_PS 12
|
||||
#define SAVEVER_DN3D 11
|
||||
#define SAVEVER_BLD 12
|
||||
#define SAVEVER_SW 13
|
||||
#define SAVEVER_PS 13
|
||||
#define SAVEVER_WH 10
|
||||
|
||||
#define NETGAMEVERSION 1
|
||||
|
|
|
@ -148,7 +148,7 @@ RORHACK:
|
|||
for (int i = 0; i < 16; i++)
|
||||
ror_status[i] = testgotpic(4080 + i);
|
||||
fixed_t deliriumPitchI = interpolatedvalue(IntToFixed(deliriumPitchO), IntToFixed(deliriumPitch), gInterpolate);
|
||||
DrawMirrors(cX, cY, cZ, cA.asq16(), cH.asq16() + deliriumPitchI, gInterpolate, gViewIndex);
|
||||
DrawMirrors(cX, cY, cZ, cA.asq16(), cH.asq16() + deliriumPitchI, int(gInterpolate), gViewIndex);
|
||||
int bakCstat = gView->pSprite->cstat;
|
||||
if (gViewPos == 0)
|
||||
{
|
||||
|
@ -160,7 +160,7 @@ RORHACK:
|
|||
}
|
||||
|
||||
renderDrawRoomsQ16(cX, cY, cZ, cA.asq16(), cH.asq16() + deliriumPitchI, nSectnum);
|
||||
viewProcessSprites(pm_tsprite, pm_spritesortcnt, cX, cY, cZ, cA.asbuild(), gInterpolate);
|
||||
viewProcessSprites(pm_tsprite, pm_spritesortcnt, cX, cY, cZ, cA.asbuild(), int(gInterpolate));
|
||||
bool do_ror_hack = false;
|
||||
for (int i = 0; i < 16; i++)
|
||||
if (ror_status[i] != testgotpic(4080 + i))
|
||||
|
@ -176,7 +176,7 @@ RORHACK:
|
|||
renderDrawMasks();
|
||||
pm_spritesortcnt = nSpriteSortCnt;
|
||||
setPortalFlags(0);
|
||||
processSpritesOnOtherSideOfPortal(cX, cY, gInterpolate);
|
||||
processSpritesOnOtherSideOfPortal(cX, cY, int(gInterpolate));
|
||||
renderDrawMasks();
|
||||
gView->pSprite->cstat = bakCstat;
|
||||
|
||||
|
|
|
@ -2926,7 +2926,7 @@ bool actHealDude(DBloodActor* actor, int add, int threshold)
|
|||
auto pXDude = &actor->x();
|
||||
add <<= 4;
|
||||
threshold <<= 4;
|
||||
if (pXDude->health < threshold)
|
||||
if (pXDude->health < (unsigned)threshold)
|
||||
{
|
||||
spritetype* pSprite = &actor->s();
|
||||
if (actor->IsPlayerActor()) sfxPlay3DSound(pSprite->x, pSprite->y, pSprite->z, 780, pSprite->sectnum);
|
||||
|
|
|
@ -1003,7 +1003,7 @@ int aiDamageSprite(DBloodActor* source, DBloodActor* actor, DAMAGE_TYPE nDmgType
|
|||
GENDUDEEXTRA* pExtra = genDudeExtra(pSprite);
|
||||
|
||||
if (nDmgType == DAMAGE_TYPE_1) {
|
||||
if (pXSprite->health > pDudeInfo->fleeHealth) break;
|
||||
if (pXSprite->health > (unsigned)pDudeInfo->fleeHealth) break;
|
||||
else if (pXSprite->txID <= 0 || getNextIncarnation(pXSprite) == NULL) {
|
||||
removeDudeStuff(pSprite);
|
||||
|
||||
|
|
|
@ -292,7 +292,7 @@ static void beastThinkChase(DBloodActor* actor)
|
|||
else
|
||||
pXSector = NULL;
|
||||
int hit = HitScan(pSprite, pSprite->z, dx, dy, 0, CLIPMASK1, 0);
|
||||
if (pXTarget->health > gPlayerTemplate[0].startHealth/2)
|
||||
if (pXTarget->health > (unsigned)gPlayerTemplate[0].startHealth/2)
|
||||
{
|
||||
switch (hit)
|
||||
{
|
||||
|
|
|
@ -138,7 +138,7 @@ void AddCmdDefine(char *text, int value)
|
|||
|
||||
static void SplitPath(const char *pzPath, char *pzDirectory, char *pzFile, char *pzType)
|
||||
{
|
||||
int const nLength = strlen(pzPath);
|
||||
int const nLength = (int)strlen(pzPath);
|
||||
const char *pDirectory = pzPath+nLength;
|
||||
const char *pDot = NULL;
|
||||
for (int i = nLength-1; i >= 0; i--)
|
||||
|
@ -217,7 +217,7 @@ int RFS::Open(int lumpnum)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int fileSize = hFile.GetLength();
|
||||
int fileSize = (int)hFile.GetLength();
|
||||
buffer.Resize(fileSize);
|
||||
_ptr = buffer.Data();
|
||||
if (_ptr == NULL) {
|
||||
|
@ -890,7 +890,7 @@ void ParseScript(int lumpnum)
|
|||
case kTagString:
|
||||
{
|
||||
memcpy(&buffer[nBytes], scriptBuffer, strlen(scriptBuffer) + 1);
|
||||
nBytes += strlen(scriptBuffer) + 1;
|
||||
nBytes += (int)strlen(scriptBuffer) + 1;
|
||||
break;
|
||||
}
|
||||
case kTagConstant:
|
||||
|
|
|
@ -487,7 +487,7 @@ void GameInterface::Render()
|
|||
|
||||
void sndPlaySpecialMusicOrNothing(int nMusic)
|
||||
{
|
||||
if (!Mus_Play(nullptr, quoteMgr.GetQuote(nMusic), true))
|
||||
if (!Mus_Play(quoteMgr.GetQuote(nMusic), true))
|
||||
{
|
||||
Mus_Stop();
|
||||
}
|
||||
|
@ -539,7 +539,7 @@ DEFINE_ACTION_FUNCTION(_Blood, OriginalLoadScreen)
|
|||
|
||||
DEFINE_ACTION_FUNCTION(_Blood, PlayIntroMusic)
|
||||
{
|
||||
Mus_Play(nullptr, "PESTIS.MID", false);
|
||||
Mus_Play("PESTIS.MID", false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -565,4 +565,37 @@ DEFINE_ACTION_FUNCTION(_Blood, sndStartSampleNamed)
|
|||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_Blood, PowerupIcon)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
PARAM_INT(pwup);
|
||||
int tile = -1;
|
||||
if (pwup >= 0 && pwup < (int)countof(gPowerUpInfo))
|
||||
{
|
||||
tile = gPowerUpInfo[pwup].picnum;
|
||||
}
|
||||
FGameTexture* tex = tileGetTexture(tile);
|
||||
ACTION_RETURN_INT(tex ? tex->GetID().GetIndex() : -1);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_Blood, GetViewPlayer)
|
||||
{
|
||||
PARAM_PROLOGUE;
|
||||
ACTION_RETURN_POINTER(gView);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(_BloodPlayer, GetHealth)
|
||||
{
|
||||
PARAM_SELF_STRUCT_PROLOGUE(PLAYER);
|
||||
XSPRITE* pXSprite = self->pXSprite;
|
||||
ACTION_RETURN_INT(pXSprite->health);
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION_NATIVE(_BloodPlayer, powerupCheck, powerupCheck)
|
||||
{
|
||||
PARAM_SELF_STRUCT_PROLOGUE(PLAYER);
|
||||
PARAM_INT(pwup);
|
||||
ACTION_RETURN_INT(powerupCheck(self, pwup));
|
||||
}
|
||||
|
||||
END_BLD_NS
|
||||
|
|
|
@ -142,7 +142,7 @@ inline void actBurnSprite(DBloodActor* pSource, DBloodActor* pTarget, int nTime)
|
|||
{
|
||||
auto pXSprite = &pTarget->x();
|
||||
pXSprite->burnTime = ClipHigh(pXSprite->burnTime + nTime, sprite[pXSprite->reference].statnum == kStatDude ? 2400 : 1200);
|
||||
pXSprite->burnSource = pSource->s().index;
|
||||
pXSprite->burnSource = pSource? pSource->s().index : -1;
|
||||
}
|
||||
|
||||
inline void GetActorExtents(DBloodActor* actor, int* top, int* bottom)
|
||||
|
|
|
@ -712,7 +712,7 @@ void callbackCondition(int nSprite) {
|
|||
if (pXSprite->isTriggered) return;
|
||||
|
||||
TRCONDITION* pCond = &gCondition[pXSprite->sysData1];
|
||||
for (int i = 0; i < pCond->length; i++) {
|
||||
for (unsigned i = 0; i < pCond->length; i++) {
|
||||
EVENT evn; evn.index = pCond->obj[i].index; evn.type = pCond->obj[i].type;
|
||||
evn.cmd = pCond->obj[i].cmd; evn.funcID = kCallbackCondition;
|
||||
useCondition(&sprite[pXSprite->reference], pXSprite, evn);
|
||||
|
|
|
@ -200,18 +200,18 @@ static void SortRXBucket(int nCount)
|
|||
vbx++;
|
||||
}
|
||||
RXBUCKET* v2c = pArray + nCount;
|
||||
int vt = ClipHigh(vbx - first, first - pArray);
|
||||
int vt = int(min(vbx - first, first - pArray));
|
||||
for (int i = 0; i < vt; i++)
|
||||
{
|
||||
SortSwap(&vbx[i - vt], &pArray[i]);
|
||||
}
|
||||
vt = ClipHigh(last - v4, v2c - last - 1);
|
||||
vt = int(min(last - v4, v2c - last - 1));
|
||||
for (int i = 0; i < vt; i++)
|
||||
{
|
||||
SortSwap(&v2c[i - vt], &vbx[i]);
|
||||
}
|
||||
int vvsi = last - v4;
|
||||
int vvdi = vbx - first;
|
||||
int vvsi = int(last - v4);
|
||||
int vvdi = int(vbx - first);
|
||||
if (vvsi >= vvdi)
|
||||
{
|
||||
vc4[v14] = vvsi;
|
||||
|
|
|
@ -127,14 +127,14 @@ void hudDraw(PLAYER *gView, int nSectnum, double bobx, double boby, double zDelt
|
|||
}
|
||||
|
||||
#ifdef NOONE_EXTENSIONS
|
||||
if (gView->sceneQav < 0) WeaponDraw(gView, nShade, cX, cY, nPalette, smoothratio);
|
||||
else if (gView->pXSprite->health > 0) playerQavSceneDraw(gView, nShade, cX, cY, nPalette, smoothratio);
|
||||
if (gView->sceneQav < 0) WeaponDraw(gView, nShade, cX, cY, nPalette, int(smoothratio));
|
||||
else if (gView->pXSprite->health > 0) playerQavSceneDraw(gView, nShade, cX, cY, nPalette, int(smoothratio));
|
||||
else {
|
||||
gView->sceneQav = gView->weaponQav = -1;
|
||||
gView->weaponTimer = gView->curWeapon = 0;
|
||||
}
|
||||
#else
|
||||
WeaponDraw(gView, nShade, cX, cY, nPalette, smoothratio);
|
||||
WeaponDraw(gView, nShade, cX, cY, nPalette, int(smoothratio));
|
||||
#endif
|
||||
}
|
||||
if (gViewPos == 0 && gView->pXSprite->burnTime > 60)
|
||||
|
|
|
@ -171,7 +171,6 @@ void IniFile::Load()
|
|||
auto fp = fileSystem.OpenFileReader(fileName);
|
||||
if (fp.isOpen())
|
||||
{
|
||||
int nSize = fp.GetLength();
|
||||
auto pBuffer = fp.Read();
|
||||
LoadRes(pBuffer.Data());
|
||||
}
|
||||
|
|
|
@ -246,12 +246,12 @@ void levelTryPlayMusic()
|
|||
else
|
||||
{
|
||||
buffer = currentLevel->music;
|
||||
if (Mus_Play(currentLevel->labelName, buffer, true)) return;
|
||||
if (Mus_Play(buffer, true)) return;
|
||||
if (buffer.IsNotEmpty()) DefaultExtension(buffer, ".mid");
|
||||
}
|
||||
if (!Mus_Play(currentLevel->labelName, buffer, true))
|
||||
if (!Mus_Play(buffer, true))
|
||||
{
|
||||
Mus_Play("", "", true);
|
||||
Mus_Play("", true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -18,3 +18,177 @@ x(SBarNumberInv, 9240)
|
|||
x(SBarNumberArmor1, 9250)
|
||||
x(SBarNumberArmor2, 9260)
|
||||
x(SBarNumberArmor3, 9270)
|
||||
x(SBarSlash, 9280)
|
||||
|
||||
x(PackBG, 2568)
|
||||
x(PackSelect, 2559)
|
||||
|
||||
x(PackIcon1, 2569)
|
||||
x(PackIcon2, 2564)
|
||||
x(PackIcon3, 2566)
|
||||
x(PackIcon4, 2568)
|
||||
x(PackIcon5, 2560)
|
||||
|
||||
x(Pack2Icon1, 519)
|
||||
x(Pack2Icon2, 830)
|
||||
x(Pack2Icon3, 760)
|
||||
x(Pack2Icon4, 839)
|
||||
x(Pack2Icon5, 827)
|
||||
|
||||
x(AmmoIcon1, 816)
|
||||
x(AmmoIcon2, 619)
|
||||
x(AmmoIcon3, 817)
|
||||
x(AmmoIcon4, 801)
|
||||
x(AmmoIcon5, 589)
|
||||
x(AmmoIcon6, 618)
|
||||
x(AmmoIcon7, 548)
|
||||
x(AmmoIcon8, 820)
|
||||
x(AmmoIcon9, 525)
|
||||
x(AmmoIcon10, 811)
|
||||
x(AmmoIcon11, 810)
|
||||
|
||||
x(SBPlayerSlot, 2229)
|
||||
|
||||
x(FlagHave, 3558)
|
||||
x(FlagHaveNot, 3559)
|
||||
x(FlagDropped, 2332)
|
||||
x(FlagTaken, 4097)
|
||||
x(Statusbar, 2200)
|
||||
x(FullHUD, 2201)
|
||||
x(Armor1Gauge, 2207)
|
||||
x(Armor2Gauge, 2208)
|
||||
x(Armor3Gauge, 2209)
|
||||
|
||||
x(KeyIcon1, 2220)
|
||||
x(KeyIcon2, 2221)
|
||||
x(KeyIcon3, 2222)
|
||||
x(KeyIcon4, 2223)
|
||||
x(KeyIcon5, 2224)
|
||||
x(KeyIcon6, 2225)
|
||||
|
||||
x(HudKeyIcon1, 2552)
|
||||
x(HudKeyIcon2, 2553)
|
||||
x(HudKeyIcon3, 2554)
|
||||
x(HudKeyIcon4, 2555)
|
||||
x(HudKeyIcon5, 2556)
|
||||
x(HudKeyIcon6, 2557)
|
||||
x(HudKeyIcon7, 2558)
|
||||
|
||||
x(BlinkIcon, 2202)
|
||||
x(ThrowGauge, 2260)
|
||||
x(Armorbox, 2173)
|
||||
|
||||
x(Healthicon, 2169)
|
||||
x(Armor1Icon, 2578)
|
||||
x(Armor2Icon, 2602)
|
||||
x(Armor3Icon, 2586)
|
||||
|
||||
x(SBarNumberHealth0, 9220)
|
||||
x(SBarNumberHealth1, 9221)
|
||||
x(SBarNumberHealth2, 9222)
|
||||
x(SBarNumberHealth3, 9223)
|
||||
x(SBarNumberHealth4, 9224)
|
||||
x(SBarNumberHealth5, 9225)
|
||||
x(SBarNumberHealth6, 9226)
|
||||
x(SBarNumberHealth7, 9227)
|
||||
x(SBarNumberHealth8, 9228)
|
||||
x(SBarNumberHealth9, 9229)
|
||||
|
||||
x(SBarNumberAmmo0, 9230)
|
||||
x(SBarNumberAmmo1, 9231)
|
||||
x(SBarNumberAmmo2, 9232)
|
||||
x(SBarNumberAmmo3, 9233)
|
||||
x(SBarNumberAmmo4, 9234)
|
||||
x(SBarNumberAmmo5, 9235)
|
||||
x(SBarNumberAmmo6, 9236)
|
||||
x(SBarNumberAmmo7, 9237)
|
||||
x(SBarNumberAmmo8, 9238)
|
||||
x(SBarNumberAmmo9, 9239)
|
||||
|
||||
x(SBarNumberInv0, 9240)
|
||||
x(SBarNumberInv1, 9241)
|
||||
x(SBarNumberInv2, 9242)
|
||||
x(SBarNumberInv3, 9243)
|
||||
x(SBarNumberInv4, 9244)
|
||||
x(SBarNumberInv5, 9245)
|
||||
x(SBarNumberInv6, 9246)
|
||||
x(SBarNumberInv7, 9247)
|
||||
x(SBarNumberInv8, 9248)
|
||||
x(SBarNumberInv9, 9249)
|
||||
|
||||
x(SBarNumberArmor1_0, 9250)
|
||||
x(SBarNumberArmor1_1, 9251)
|
||||
x(SBarNumberArmor1_2, 9252)
|
||||
x(SBarNumberArmor1_3, 9253)
|
||||
x(SBarNumberArmor1_4, 9254)
|
||||
x(SBarNumberArmor1_5, 9255)
|
||||
x(SBarNumberArmor1_6, 9256)
|
||||
x(SBarNumberArmor1_7, 9257)
|
||||
x(SBarNumberArmor1_8, 9258)
|
||||
x(SBarNumberArmor1_9, 9259)
|
||||
|
||||
x(SBarNumberArmor2_0, 9260)
|
||||
x(SBarNumberArmor2_1, 9261)
|
||||
x(SBarNumberArmor2_2, 9262)
|
||||
x(SBarNumberArmor2_3, 9263)
|
||||
x(SBarNumberArmor2_4, 9264)
|
||||
x(SBarNumberArmor2_5, 9265)
|
||||
x(SBarNumberArmor2_6, 9266)
|
||||
x(SBarNumberArmor2_7, 9267)
|
||||
x(SBarNumberArmor2_8, 9268)
|
||||
x(SBarNumberArmor2_9, 9269)
|
||||
|
||||
x(SBarNumberArmor3_0, 9270)
|
||||
x(SBarNumberArmor3_1, 9271)
|
||||
x(SBarNumberArmor3_2, 9272)
|
||||
x(SBarNumberArmor3_3, 9273)
|
||||
x(SBarNumberArmor3_4, 9274)
|
||||
x(SBarNumberArmor3_5, 9275)
|
||||
x(SBarNumberArmor3_6, 9276)
|
||||
x(SBarNumberArmor3_7, 9277)
|
||||
x(SBarNumberArmor3_8, 9278)
|
||||
x(SBarNumberArmor3_9, 9279)
|
||||
|
||||
x(SBarPackAmount0, 2250)
|
||||
x(SBarPackAmount1, 2251)
|
||||
x(SBarPackAmount2, 2252)
|
||||
x(SBarPackAmount3, 2253)
|
||||
x(SBarPackAmount4, 2254)
|
||||
x(SBarPackAmount5, 2255)
|
||||
x(SBarPackAmount6, 2256)
|
||||
x(SBarPackAmount7, 2257)
|
||||
x(SBarPackAmount8, 2258)
|
||||
x(SBarPackAmount9, 2259)
|
||||
|
||||
x(SBarHealthAmount0, 2190)
|
||||
x(SBarHealthAmount1, 2191)
|
||||
x(SBarHealthAmount2, 2192)
|
||||
x(SBarHealthAmount3, 2193)
|
||||
x(SBarHealthAmount4, 2194)
|
||||
x(SBarHealthAmount5, 2195)
|
||||
x(SBarHealthAmount6, 2196)
|
||||
x(SBarHealthAmount7, 2197)
|
||||
x(SBarHealthAmount8, 2198)
|
||||
x(SBarHealthAmount9, 2199)
|
||||
|
||||
x(SBarAmmoAmount0, 2230)
|
||||
x(SBarAmmoAmount1, 2231)
|
||||
x(SBarAmmoAmount2, 2232)
|
||||
x(SBarAmmoAmount3, 2233)
|
||||
x(SBarAmmoAmount4, 2234)
|
||||
x(SBarAmmoAmount5, 2235)
|
||||
x(SBarAmmoAmount6, 2236)
|
||||
x(SBarAmmoAmount7, 2237)
|
||||
x(SBarAmmoAmount8, 2238)
|
||||
x(SBarAmmoAmount9, 2239)
|
||||
|
||||
x(SBarWaponNum0, 2240)
|
||||
x(SBarWaponNum0, 2241)
|
||||
x(SBarWaponNum0, 2242)
|
||||
x(SBarWaponNum0, 2243)
|
||||
x(SBarWaponNum0, 2244)
|
||||
x(SBarWaponNum0, 2245)
|
||||
x(SBarWaponNum0, 2246)
|
||||
x(SBarWaponNum0, 2247)
|
||||
x(SBarWaponNum0, 2248)
|
||||
x(SBarWaponNum0, 2249)
|
||||
|
|
|
@ -229,7 +229,7 @@ void nnExtResetGlobals() {
|
|||
if (gTrackingCondsCount > 0) {
|
||||
for (int i = 0; i < gTrackingCondsCount; i++) {
|
||||
TRCONDITION* pCond = &gCondition[i];
|
||||
for (int k = 0; k < pCond->length; k++) {
|
||||
for (unsigned k = 0; k < pCond->length; k++) {
|
||||
pCond->obj[k].index = pCond->obj[k].cmd = 0;
|
||||
pCond->obj[k].type = -1;
|
||||
}
|
||||
|
@ -716,7 +716,7 @@ spritetype* randomDropPickupObject(spritetype* pSource, short prevItem) {
|
|||
pSprite2 = actDropObject(pSource, selected);
|
||||
if (pSprite2 != NULL) {
|
||||
|
||||
pXSource->dropMsg = pSprite2->type; // store dropped item type in dropMsg
|
||||
pXSource->dropMsg = uint8_t(pSprite2->type); // store dropped item type in dropMsg
|
||||
pSprite2->x = pSource->x;
|
||||
pSprite2->y = pSource->y;
|
||||
pSprite2->z = pSource->z;
|
||||
|
@ -763,7 +763,7 @@ void nnExtProcessSuperSprites() {
|
|||
if (pCond->length > 0 && !pXCond->locked && !pXCond->isTriggered && ++pXCond->busy >= pXCond->busyTime) {
|
||||
|
||||
pXCond->busy = 0;
|
||||
for (int k = 0; k < pCond->length; k++) {
|
||||
for (unsigned k = 0; k < pCond->length; k++) {
|
||||
|
||||
EVENT evn;
|
||||
evn.index = pCond->obj[k].index; evn.cmd = pCond->obj[k].cmd;
|
||||
|
@ -1400,7 +1400,7 @@ void trPlayerCtrlLink(XSPRITE* pXSource, PLAYER* pPlayer, bool checkCondition) {
|
|||
continue;
|
||||
|
||||
// search for player control sprite and replace it with actual player sprite
|
||||
for (int k = 0; k < pCond->length; k++) {
|
||||
for (unsigned k = 0; k < pCond->length; k++) {
|
||||
if (pCond->obj[k].type != OBJ_SPRITE || pCond->obj[k].index != pXSource->reference) continue;
|
||||
pCond->obj[k].index = pPlayer->nSprite;
|
||||
pCond->obj[k].cmd = pPlayer->pXSprite->command;
|
||||
|
@ -1638,16 +1638,16 @@ void useObjResizer(XSPRITE* pXSource, short objType, int objIndex) {
|
|||
// for sectors
|
||||
case 6:
|
||||
if (valueIsBetween(pXSource->data1, -1, 32767))
|
||||
sector[objIndex].floorxpan_ = ClipRange(pXSource->data1, 0, 255);
|
||||
sector[objIndex].floorxpan_ = (float)ClipRange(pXSource->data1, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data2, -1, 32767))
|
||||
sector[objIndex].floorypan_ = ClipRange(pXSource->data2, 0, 255);
|
||||
sector[objIndex].floorypan_ = (float)ClipRange(pXSource->data2, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
sector[objIndex].ceilingxpan_ = ClipRange(pXSource->data3, 0, 255);
|
||||
sector[objIndex].ceilingxpan_ = (float)ClipRange(pXSource->data3, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535))
|
||||
sector[objIndex].ceilingypan_ = ClipRange(pXSource->data4, 0, 255);
|
||||
sector[objIndex].ceilingypan_ = (float)ClipRange(pXSource->data4, 0, 255);
|
||||
break;
|
||||
// for sprites
|
||||
case 3:
|
||||
|
@ -1698,10 +1698,10 @@ void useObjResizer(XSPRITE* pXSource, short objType, int objIndex) {
|
|||
wall[objIndex].yrepeat = ClipRange(pXSource->data2, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
wall[objIndex].xpan_ = ClipRange(pXSource->data3, 0, 255);
|
||||
wall[objIndex].xpan_ = (float)ClipRange(pXSource->data3, 0, 255);
|
||||
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535))
|
||||
wall[objIndex].ypan_ = ClipRange(pXSource->data4, 0, 255);
|
||||
wall[objIndex].ypan_ = (float)ClipRange(pXSource->data4, 0, 255);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2314,7 +2314,7 @@ void useSpriteDamager(XSPRITE* pXSource, spritetype* pSprite) {
|
|||
}
|
||||
|
||||
if (dmgType >= kDmgFall) {
|
||||
if (dmg < pXSprite->health << 4) {
|
||||
if (dmg < (int)pXSprite->health << 4) {
|
||||
if (nnExtIsImmune(pSprite, dmgType, 0)) {
|
||||
Printf(PRINT_HIGH, "Dude type %d is immune to damage type %d!", pSprite->type, dmgType);
|
||||
return;
|
||||
|
@ -3201,7 +3201,7 @@ void condUpdateObjectIndex(int objType, int oldIndex, int newIndex) {
|
|||
for (int i = 0; i < gTrackingCondsCount; i++) {
|
||||
|
||||
TRCONDITION* pCond = &gCondition[i];
|
||||
for (int k = 0; k < pCond->length; k++) {
|
||||
for (unsigned k = 0; k < pCond->length; k++) {
|
||||
if (pCond->obj[k].type != objType || pCond->obj[k].index != oldIndex) continue;
|
||||
pCond->obj[k].index = newIndex;
|
||||
break;
|
||||
|
@ -3851,7 +3851,7 @@ bool modernTypeOperateSprite(int nSprite, spritetype* pSprite, XSPRITE* pXSprite
|
|||
else evPost(nSprite, 3, 0, kCmdOff);
|
||||
break;
|
||||
}
|
||||
pXSprite->dropMsg = pXSprite->data4;
|
||||
pXSprite->dropMsg = uint8_t(pXSprite->data4);
|
||||
return true;
|
||||
case kModernObjDataAccumulator:
|
||||
switch (event.cmd) {
|
||||
|
@ -4352,7 +4352,7 @@ void useSoundGen(spritetype* pSource, XSPRITE* pXSource) {
|
|||
|
||||
void useIncDecGen(XSPRITE* pXSource, short objType, int objIndex) {
|
||||
char buffer[5]; int data = -65535; short tmp = 0; int dataIndex = 0;
|
||||
sprintf(buffer, "%d", abs(pXSource->data1)); int len = strlen(buffer);
|
||||
sprintf(buffer, "%d", abs(pXSource->data1)); int len = int(strlen(buffer));
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
dataIndex = (buffer[i] - 52) + 4;
|
||||
|
@ -4449,7 +4449,7 @@ void useSectorLigthChanger(XSPRITE* pXSource, XSECTOR* pXSector) {
|
|||
|
||||
int oldAmplitude = pXSector->amplitude;
|
||||
if (valueIsBetween(pXSource->data2, -128, 128))
|
||||
pXSector->amplitude = pXSource->data2;
|
||||
pXSector->amplitude = uint8_t(pXSource->data2);
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
pXSector->freq = ClipHigh(pXSource->data3, 255);
|
||||
|
@ -4521,7 +4521,7 @@ void useTargetChanger(XSPRITE* pXSource, spritetype* pSprite) {
|
|||
|
||||
// heal dude a bit in case of friendly fire
|
||||
int startHp = (pXSprite->sysData2 > 0) ? ClipRange(pXSprite->sysData2 << 4, 1, 65535) : pDudeInfo->startHealth << 4;
|
||||
if (pXSprite->health < startHp) actHealDude(pXSprite, receiveHp, startHp);
|
||||
if (pXSprite->health < (unsigned)startHp) actHealDude(pXSprite, receiveHp, startHp);
|
||||
} else if (xsprite[pBurnSource->extra].health <= 0) {
|
||||
pXSprite->burnTime = 0;
|
||||
}
|
||||
|
@ -4581,11 +4581,11 @@ void useTargetChanger(XSPRITE* pXSource, spritetype* pSprite) {
|
|||
|
||||
// heal dude
|
||||
int startHp = (pXSprite->sysData2 > 0) ? ClipRange(pXSprite->sysData2 << 4, 1, 65535) : pDudeInfo->startHealth << 4;
|
||||
if (pXSprite->health < startHp) actHealDude(pXSprite, receiveHp, startHp);
|
||||
if (pXSprite->health < (unsigned)startHp) actHealDude(pXSprite, receiveHp, startHp);
|
||||
|
||||
// heal mate
|
||||
startHp = (pXMate->sysData2 > 0) ? ClipRange(pXMate->sysData2 << 4, 1, 65535) : getDudeInfo(pMate->type)->startHealth << 4;
|
||||
if (pXMate->health < startHp) actHealDude(pXMate, receiveHp, startHp);
|
||||
if (pXMate->health < (unsigned)startHp) actHealDude(pXMate, receiveHp, startHp);
|
||||
|
||||
if (pXMate->target > -1 && sprite[pXMate->target].extra >= 0) {
|
||||
pTarget = &sprite[pXMate->target];
|
||||
|
@ -4742,10 +4742,10 @@ void usePictureChanger(XSPRITE* pXSource, int objType, int objIndex) {
|
|||
sector[objIndex].ceilingpicnum = pXSource->data2;
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
sector[objIndex].floorpal = pXSource->data3;
|
||||
sector[objIndex].floorpal = uint8_t(pXSource->data3);
|
||||
|
||||
if (valueIsBetween(pXSource->data4, -1, 65535))
|
||||
sector[objIndex].ceilingpal = pXSource->data4;
|
||||
sector[objIndex].ceilingpal = uint8_t(pXSource->data4);
|
||||
break;
|
||||
case OBJ_SPRITE:
|
||||
if (valueIsBetween(pXSource->data1, -1, 32767))
|
||||
|
@ -4755,7 +4755,7 @@ void usePictureChanger(XSPRITE* pXSource, int objType, int objIndex) {
|
|||
else if (pXSource->data2 < -1) sprite[objIndex].shade = (pXSource->data2 < -127) ? -127 : pXSource->data2;
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
sprite[objIndex].pal = pXSource->data3;
|
||||
sprite[objIndex].pal = uint8_t(pXSource->data3);
|
||||
break;
|
||||
case OBJ_WALL:
|
||||
if (valueIsBetween(pXSource->data1, -1, 32767))
|
||||
|
@ -4765,7 +4765,7 @@ void usePictureChanger(XSPRITE* pXSource, int objType, int objIndex) {
|
|||
wall[objIndex].overpicnum = pXSource->data2;
|
||||
|
||||
if (valueIsBetween(pXSource->data3, -1, 32767))
|
||||
wall[objIndex].pal = pXSource->data3;
|
||||
wall[objIndex].pal = uint8_t(pXSource->data3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -5163,7 +5163,7 @@ XSPRITE* evrListRedirectors(int objType, int objXIndex, XSPRITE* pXRedir, int* t
|
|||
bool incDecGoalValueIsReached(XSPRITE* pXSprite) {
|
||||
|
||||
if (pXSprite->data3 != pXSprite->sysData1) return false;
|
||||
char buffer[5]; sprintf(buffer, "%d", abs(pXSprite->data1)); int len = strlen(buffer); int rx = -1;
|
||||
char buffer[5]; sprintf(buffer, "%d", abs(pXSprite->data1)); int len = int(strlen(buffer)); int rx = -1;
|
||||
for (int i = bucketHead[pXSprite->txID]; i < bucketHead[pXSprite->txID + 1]; i++) {
|
||||
if (rxBucket[i].type == OBJ_SPRITE && evrIsRedirector(rxBucket[i].index)) continue;
|
||||
for (int a = 0; a < len; a++) {
|
||||
|
|
|
@ -2328,4 +2328,79 @@ void SerializePlayers(FSerializer& arc)
|
|||
|
||||
|
||||
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, newWeapon)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, weaponQav)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, qavCallback)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, isRunning)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, posture) // stand, crouch, swim
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, sceneQav) // by NoOne: used to keep qav id
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, bobPhase)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, bobAmp)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, bobHeight)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, bobWidth)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, swayPhase)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, swayAmp)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, swayHeight)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, swayWidth)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, nPlayer) // Connect id
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, nSprite)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, lifeMode)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, zView)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, zViewVel)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, zWeapon)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, zWeaponVel)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, slope)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, isUnderwater)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, hasKey)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, hasFlag)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, damageControl)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, curWeapon)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, nextWeapon)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, weaponTimer)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, weaponState)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, weaponAmmo) //rename
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, hasWeapon)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, weaponMode)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, weaponOrder)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, ammoCount)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, qavLoop)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, fuseTime)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, throwTime)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, throwPower)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, aim) // world
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, aimTarget) // aim target sprite
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, aimTargetsCount)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, aimTargets)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, deathTime)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, pwUpTime)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, teamId)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, fragCount)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, fragInfo)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, underwaterTime)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, bubbleTime)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, restTime)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, kickPower)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, laughCount)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, godMode)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, fallScream)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, cantJump)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, packItemTime) // pack timer
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, packItemId) // pack id 1: diving suit, 2: crystal ball, 3:
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, packSlots) // at325 1]: diving suit, [2]: crystal ball,
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, armor) // armor
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, voodooTarget)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, flickerEffect)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, tiltEffect)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, visibility)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, painEffect)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, blindEffect)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, chokeEffect)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, handTime)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, hand) // if true, there is hand start choking the player
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, pickupEffect)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, flashEffect) // if true, reduce pPlayer->visibility counter
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, quakeEffect)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, player_par)
|
||||
DEFINE_FIELD_X(BloodPlayer, PLAYER, nWaterPal)
|
||||
|
||||
END_BLD_NS
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Copyright (C) 2010-2019 EDuke32 developers and contributors
|
||||
Copyright (C) 2019 Nuke.YKT
|
||||
Copyright (C) 2020-2021 Christoph Oelckers
|
||||
|
||||
This file is part of NBlood.
|
||||
This file is part of Raze.
|
||||
|
||||
NBlood is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License version 2
|
||||
as published by the Free Software Foundation.
|
||||
This is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
|
@ -31,8 +31,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
|
||||
#include "blood.h"
|
||||
#include "zstring.h"
|
||||
#include "razemenu.h"
|
||||
#include "gstrings.h"
|
||||
#include "v_2ddrawer.h"
|
||||
#include "v_video.h"
|
||||
#include "v_font.h"
|
||||
|
@ -42,802 +40,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||
#include "gamecvars.h"
|
||||
|
||||
CVARD(Bool, hud_powerupduration, true, CVAR_ARCHIVE/*|CVAR_FRONTEND_BLOOD*/, "enable/disable displaying the remaining seconds for power-ups")
|
||||
CVAR(Bool, hud_ctf_vanilla, false, CVAR_ARCHIVE)
|
||||
|
||||
BEGIN_BLD_NS
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static int gPackIcons[5] = {
|
||||
2569, 2564, 2566, 2568, 2560
|
||||
};
|
||||
|
||||
struct PACKICON2 {
|
||||
short nTile;
|
||||
int nScale;
|
||||
int nYOffs;
|
||||
};
|
||||
|
||||
PACKICON2 gPackIcons2[] = {
|
||||
{ 519, (int)(65536 * 0.5), 0 },
|
||||
{ 830, (int)(65536 * 0.3), 0 },
|
||||
{ 760, (int)(65536 * 0.6), 0 },
|
||||
{ 839, (int)(65536 * 0.5), -4 },
|
||||
{ 827, (int)(65536 * 0.4), 0 },
|
||||
};
|
||||
|
||||
struct AMMOICON {
|
||||
short nTile;
|
||||
int nScale;
|
||||
int nYOffs;
|
||||
};
|
||||
|
||||
static AMMOICON gAmmoIcons[] = {
|
||||
{ -1, 0, 0 },
|
||||
{ 816, (int)(65536 * 0.5), 0 },
|
||||
{ 619, (int)(65536 * 0.8), 0 },
|
||||
{ 817, (int)(65536 * 0.7), 3 },
|
||||
{ 801, (int)(65536 * 0.5), -6 },
|
||||
{ 589, (int)(65536 * 0.7), 2 },
|
||||
{ 618, (int)(65536 * 0.5), 4 },
|
||||
{ 548, (int)(65536 * 0.3), -6 },
|
||||
{ 820, (int)(65536 * 0.3), -6 },
|
||||
{ 525, (int)(65536 * 0.6), -6 },
|
||||
{ 811, (int)(65536 * 0.5), 2 },
|
||||
{ 810, (int)(65536 * 0.45), 2 },
|
||||
};
|
||||
|
||||
struct POWERUPDISPLAY
|
||||
{
|
||||
int nTile;
|
||||
float nScaleRatio;
|
||||
int yOffset;
|
||||
int remainingDuration;
|
||||
};
|
||||
|
||||
|
||||
|
||||
class DBloodStatusBar : public DBaseStatusBar
|
||||
{
|
||||
DECLARE_CLASS(DBloodStatusBar, DBaseStatusBar)
|
||||
enum NewRSFlags
|
||||
{
|
||||
RS_CENTERBOTTOM = 16384,
|
||||
};
|
||||
|
||||
TObjPtr<DHUDFont*> smallf, tinyf;
|
||||
|
||||
public:
|
||||
DBloodStatusBar()
|
||||
{
|
||||
smallf = Create<DHUDFont>(SmallFont, 0, Off, 0, 0 );
|
||||
tinyf = Create<DHUDFont>(gFont[4], 4, CellRight, 0, 0 );
|
||||
}
|
||||
|
||||
private:
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void DrawStatSprite(int nTile, double x, double y, int nShade = 0, int nPalette = 0, unsigned int nStat = 0, int nScale = 65536, ERenderStyle style = STYLE_Normal, int align = DI_SCREEN_AUTO)
|
||||
{
|
||||
int flags = align | ((nStat & RS_CENTERBOTTOM)? DI_ITEM_CENTER_BOTTOM : (nStat & RS_TOPLEFT)? DI_ITEM_LEFT_TOP : DI_ITEM_RELCENTER);
|
||||
double alpha = 1.;
|
||||
double scale = nScale / 65536.;
|
||||
DrawGraphic(tileGetTexture(nTile, true), x, y, flags, alpha, -1, -1, scale, scale, STYLE_Translucent, shadeToLight(nShade), TRANSLATION(Translation_Remap, nPalette), style);
|
||||
}
|
||||
void DrawStatMaskedSprite(int nTile, double x, double y, int nShade = 0, int nPalette = 0, unsigned int nStat = 0, int nScale = 65536, int align = DI_SCREEN_AUTO)
|
||||
{
|
||||
DrawStatSprite(nTile, x, y, nShade, nPalette, nStat, nScale, STYLE_Translucent, align);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void DrawStatNumber(const char* pFormat, int nNumber, int nTile, double x, double y, int nShade, int nPalette, unsigned int nStat = 0, int nScale = 65536, int align = 0)
|
||||
{
|
||||
double width = (tileWidth(nTile) + 1) * (nScale / 65536.);
|
||||
|
||||
char tempbuf[80];
|
||||
mysnprintf(tempbuf, 80, pFormat, nNumber);
|
||||
x += 0.5;
|
||||
y += 0.5; // This is needed because due to using floating point math, this code rounds slightly differently which for the numbers can be a problem.
|
||||
for (unsigned int i = 0; tempbuf[i]; i++, x += width)
|
||||
{
|
||||
if (tempbuf[i] == ' ') continue;
|
||||
DrawStatSprite(nTile + tempbuf[i] - '0', x, y, nShade, nPalette, nStat, nScale, STYLE_Translucent, align);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void DrawCharArray(const char* string, int nTile, double x, double y, int nShade, int nPalette, unsigned int nStat = 0, int nScale = 65536, int align = 0)
|
||||
{
|
||||
double width = (tileWidth(nTile) + 1) * (nScale / 65536.);
|
||||
|
||||
x += 0.5;
|
||||
y += 0.5; // This is needed because due to using floating point math, this code rounds slightly differently which for the numbers can be a problem.
|
||||
|
||||
for (unsigned int i = 0; string[i]; i++, x += width)
|
||||
{
|
||||
// Hackasaurus rex to give me a slash when drawing the weapon count of a reloadable gun.
|
||||
if (string[i] == 47 && nTile == kSBarNumberAmmo)
|
||||
{
|
||||
DrawStatSprite(9280, x, y, nShade, nPalette, nStat, nScale, STYLE_Translucent, align);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawStatSprite(nTile + string[i] - '0', x, y, nShade, nPalette, nStat, nScale, STYLE_Translucent, align);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void TileHGauge(int nTile, double x, double y, int nMult, int nDiv, int nStat = 0, int nScale = 65536)
|
||||
{
|
||||
int w = tileWidth(nTile);
|
||||
int bx = scale(MulScale(w, nScale, 16), nMult, nDiv) + x;
|
||||
double scale = double(bx - x) / w;
|
||||
double sc = nScale / 65536.;
|
||||
DrawGraphic(tileGetTexture(nTile, true), x, y, DI_ITEM_LEFT_TOP, 1., -1, -1, sc, sc, STYLE_Translucent, 0xffffffff, 0, scale);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void PrintLevelStats(PLAYER* pPlayer, int bottomy)
|
||||
{
|
||||
FLevelStats stats{};
|
||||
|
||||
stats.fontscale = 1.;
|
||||
stats.spacing = SmallFont->GetHeight() + 1;
|
||||
stats.screenbottomspace = bottomy;
|
||||
stats.font = SmallFont;
|
||||
stats.letterColor = CR_DARKRED;
|
||||
stats.standardColor = CR_DARKGRAY;
|
||||
stats.time = gFrameCount / GameTicRate;
|
||||
|
||||
if (automapMode == am_full)
|
||||
{
|
||||
bool textfont = am_textfont;
|
||||
if (!am_textfont)
|
||||
{
|
||||
// For non-English languages force use of the text font. The tiny one is simply too small to ever add localized characters to it.
|
||||
auto p = GStrings["REQUIRED_CHARACTERS"];
|
||||
if (p && *p) textfont = true;
|
||||
}
|
||||
|
||||
if (!textfont)
|
||||
{
|
||||
stats.font = SmallFont2;
|
||||
stats.spacing = 6;
|
||||
}
|
||||
if (hud_size <= Hud_StbarOverlay) stats.screenbottomspace = 56;
|
||||
DBaseStatusBar::PrintAutomapInfo(stats, textfont);
|
||||
}
|
||||
if (automapMode == am_off && hud_stats)
|
||||
{
|
||||
stats.completeColor = CR_DARKGREEN;
|
||||
|
||||
stats.kills = gKillMgr.Kills;
|
||||
stats.maxkills = gKillMgr.TotalKills;
|
||||
stats.frags = gGameOptions.nGameType == 3? pPlayer->fragCount : -1;
|
||||
stats.secrets = gSecretMgr.Founds;
|
||||
stats.supersecrets = gSecretMgr.Super;
|
||||
stats.maxsecrets = max(gSecretMgr.Founds, gSecretMgr.Total); // If we found more than there are, increase the total. Some levels have a bugged counter.
|
||||
stats.time = Scale(PlayClock, 1000, 120);
|
||||
|
||||
DBaseStatusBar::PrintLevelStats(stats);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
enum { nPowerUps = 11 };
|
||||
|
||||
void sortPowerUps(POWERUPDISPLAY* powerups) {
|
||||
for (int i = 1; i < nPowerUps; i++)
|
||||
{
|
||||
for (int j = 0; j < nPowerUps - i; j++)
|
||||
{
|
||||
if (powerups[j].remainingDuration > powerups[j + 1].remainingDuration)
|
||||
{
|
||||
POWERUPDISPLAY temp = powerups[j];
|
||||
powerups[j] = powerups[j + 1];
|
||||
powerups[j + 1] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void viewDrawPowerUps(PLAYER* pPlayer)
|
||||
{
|
||||
if (!hud_powerupduration)
|
||||
return;
|
||||
|
||||
POWERUPDISPLAY powerups[nPowerUps];
|
||||
powerups[0] = { gPowerUpInfo[kPwUpShadowCloak].picnum, 0.4f, 0, pPlayer->pwUpTime[kPwUpShadowCloak] }; // Invisibility
|
||||
powerups[1] = { gPowerUpInfo[kPwUpReflectShots].picnum, 0.4f, 5, pPlayer->pwUpTime[kPwUpReflectShots] }; // Reflects enemy shots
|
||||
powerups[2] = { gPowerUpInfo[kPwUpDeathMask].picnum, 0.3f, 9, pPlayer->pwUpTime[kPwUpDeathMask] }; // Invulnerability
|
||||
powerups[3] = { gPowerUpInfo[kPwUpTwoGuns].picnum, 0.3f, 5, pPlayer->pwUpTime[kPwUpTwoGuns] }; // Guns Akimbo
|
||||
powerups[4] = { gPowerUpInfo[kPwUpShadowCloakUseless].picnum, 0.4f, 9, pPlayer->pwUpTime[kPwUpShadowCloakUseless] }; // Does nothing, only appears at near the end of Cryptic Passage's Lost Monastery (CP04)
|
||||
|
||||
// Not in official maps, but custom maps can use them
|
||||
powerups[5] = { gPowerUpInfo[kPwUpFeatherFall].picnum, 0.3f, 7, pPlayer->pwUpTime[kPwUpFeatherFall] }; // Makes player immune to fall damage
|
||||
powerups[6] = { gPowerUpInfo[kPwUpGasMask].picnum, 0.4f, 4, pPlayer->pwUpTime[kPwUpGasMask] }; // Makes player immune to choke damage
|
||||
powerups[7] = { gPowerUpInfo[kPwUpDoppleganger].picnum, 0.5f, 5, pPlayer->pwUpTime[kPwUpDoppleganger] }; // Works in multiplayer, it swaps player's team colors, so enemy team player thinks it's a team mate
|
||||
powerups[8] = { gPowerUpInfo[kPwUpAsbestArmor].picnum, 0.3f, 9, pPlayer->pwUpTime[kPwUpAsbestArmor] }; // Makes player immune to fire damage and draws HUD
|
||||
powerups[9] = { gPowerUpInfo[kPwUpGrowShroom].picnum, 0.4f, 4, pPlayer->pwUpTime[kPwUpGrowShroom] }; // Grows player size, works only if gModernMap == true
|
||||
powerups[10] = { gPowerUpInfo[kPwUpShrinkShroom].picnum, 0.4f, 4, pPlayer->pwUpTime[kPwUpShrinkShroom] }; // Shrinks player size, works only if gModernMap == true
|
||||
|
||||
sortPowerUps(powerups);
|
||||
|
||||
const int warningTime = 5;
|
||||
const int x = 15;
|
||||
int y = -50;
|
||||
for (int i = 0; i < nPowerUps; i++)
|
||||
{
|
||||
if (powerups[i].remainingDuration)
|
||||
{
|
||||
int remainingSeconds = powerups[i].remainingDuration / 100;
|
||||
if (remainingSeconds > warningTime || (PlayClock & 32))
|
||||
{
|
||||
DrawStatMaskedSprite(powerups[i].nTile, x, y + powerups[i].yOffset, 0, 0, 256, (int)(65536 * powerups[i].nScaleRatio), DI_SCREEN_LEFT_CENTER);
|
||||
}
|
||||
|
||||
DrawStatNumber("%d", remainingSeconds, kSBarNumberInv, x + 15, y, 0, remainingSeconds > warningTime ? 0 : 2, 256, 65536 * 0.5, DI_SCREEN_LEFT_CENTER);
|
||||
y += 20;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void drawInventory(PLAYER* pPlayer, int x, int y)
|
||||
{
|
||||
int packs[5];
|
||||
if (pPlayer->packItemTime)
|
||||
{
|
||||
int nPacks = 0;
|
||||
int width = 0;
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
if (pPlayer->packSlots[i].curAmount)
|
||||
{
|
||||
packs[nPacks++] = i;
|
||||
width += tileWidth(gPackIcons[i]) + 1;
|
||||
}
|
||||
}
|
||||
width /= 2;
|
||||
x -= width;
|
||||
for (int i = 0; i < nPacks; i++)
|
||||
{
|
||||
int nPack = packs[i];
|
||||
DrawStatSprite(2568, x + 1, y - 8);
|
||||
DrawStatSprite(2568, x + 1, y - 6);
|
||||
DrawStatSprite(gPackIcons[nPack], x + 1, y + 1);
|
||||
if (nPack == pPlayer->packItemId)
|
||||
DrawStatMaskedSprite(2559, x + 1, y + 1);
|
||||
int nShade;
|
||||
if (pPlayer->packSlots[nPack].isActive)
|
||||
nShade = 4;
|
||||
else
|
||||
nShade = 24;
|
||||
DrawStatNumber("%3d", pPlayer->packSlots[nPack].curAmount, 2250, x - 4, y - 13, nShade, 0);
|
||||
x += tileWidth(gPackIcons[nPack]) + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void DrawPackItemInStatusBar(PLAYER* pPlayer, int x, int y, int x2, int y2)
|
||||
{
|
||||
auto id = pPlayer->packItemId;
|
||||
//id = 0;
|
||||
if (id < 0) return;
|
||||
|
||||
DrawStatSprite(gPackIcons[id], x, y, 0, 0);
|
||||
DrawStatNumber("%3d", pPlayer->packSlots[id].curAmount, 2250, x2, y2, 0, 0);
|
||||
}
|
||||
|
||||
void DrawPackItemInStatusBar2(PLAYER* pPlayer, int x, int y, int x2, int y2, int nStat, int nScale)
|
||||
{
|
||||
if (pPlayer->packItemId < 0) return;
|
||||
|
||||
DrawStatMaskedSprite(gPackIcons2[pPlayer->packItemId].nTile, x, y + gPackIcons2[pPlayer->packItemId].nYOffs, 0, 0, nStat, gPackIcons2[pPlayer->packItemId].nScale);
|
||||
DrawStatNumber("%3d", pPlayer->packSlots[pPlayer->packItemId].curAmount, kSBarNumberInv, x2, y2, 0, 0, nStat, nScale);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void viewDrawPlayerSlots(void)
|
||||
{
|
||||
for (int nRows = (gNetPlayers - 1) / 4; nRows >= 0; nRows--)
|
||||
{
|
||||
for (int nCol = 0; nCol < 4; nCol++)
|
||||
{
|
||||
DrawStatSprite(2229, -120 + nCol * 80, 4 + nRows * 9, 16, 0, 0, 65536, STYLE_Normal, DI_SCREEN_CENTER_TOP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void viewDrawPlayerFrags(void)
|
||||
{
|
||||
FString gTempStr;
|
||||
viewDrawPlayerSlots();
|
||||
for (int i = 0, p = connecthead; p >= 0; i++, p = connectpoint2[p])
|
||||
{
|
||||
int x = -160 + 80 * (i & 3);
|
||||
int y = 9 * (i / 4);
|
||||
int col = gPlayer[p].teamId & 3;
|
||||
const char* name = PlayerName(p);
|
||||
gTempStr.Format("%s", name);
|
||||
int color = CR_UNDEFINED;// todo: remap the colors. (11+col)
|
||||
SBar_DrawString(this, tinyf, gTempStr, x + 4, y, DI_SCREEN_CENTER_TOP, color, 1., -1, -1, 1, 1);
|
||||
gTempStr.Format("%2d", gPlayer[p].fragCount);
|
||||
SBar_DrawString(this, tinyf, gTempStr, x + 76, y, DI_SCREEN_CENTER_TOP, color, 1., -1, -1, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void viewDrawPlayerFlags(void)
|
||||
{
|
||||
FString gTempStr;
|
||||
viewDrawPlayerSlots();
|
||||
for (int i = 0, p = connecthead; p >= 0; i++, p = connectpoint2[p])
|
||||
{
|
||||
int x = -160 + 80 * (i & 3);
|
||||
int y = 9 * (i / 4);
|
||||
int col = gPlayer[p].teamId & 3;
|
||||
const char* name = PlayerName(p);
|
||||
gTempStr.Format("%s", name);
|
||||
gTempStr.ToUpper();
|
||||
int color = CR_UNDEFINED;// todo: remap the colors.
|
||||
SBar_DrawString(this, tinyf, gTempStr, x + 4, y, DI_SCREEN_CENTER_TOP, color, 1., -1, -1, 1, 1);
|
||||
|
||||
gTempStr = "F";
|
||||
x += 76;
|
||||
if (gPlayer[p].hasFlag & 2)
|
||||
{
|
||||
SBar_DrawString(this, tinyf, gTempStr, x, y, DI_SCREEN_CENTER_TOP, CR_GREEN/*12*/, 1., -1, -1, 1, 1);
|
||||
x -= 6;
|
||||
}
|
||||
|
||||
if (gPlayer[p].hasFlag & 1)
|
||||
SBar_DrawString(this, tinyf, gTempStr, x, y, DI_SCREEN_CENTER_TOP, CR_RED/*11*/, 1., -1, -1, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void viewDrawCtfHudVanilla()
|
||||
{
|
||||
FString gTempStr;
|
||||
int x = 1, y = 1;
|
||||
if (team_ticker[0] == 0 || (PlayClock & 8))
|
||||
{
|
||||
SBar_DrawString(this, smallf, GStrings("TXT_COLOR_BLUE"), x, y, 0, CR_LIGHTBLUE, 1., -1, -1, 1, 1);
|
||||
gTempStr.Format("%-3d", team_score[0]);
|
||||
SBar_DrawString(this, smallf, gTempStr, x, y + 10, 0, CR_LIGHTBLUE, 1., -1, -1, 1, 1);
|
||||
}
|
||||
x = -2;
|
||||
if (team_ticker[1] == 0 || (PlayClock & 8))
|
||||
{
|
||||
SBar_DrawString(this, smallf, GStrings("TXT_COLOR_RED"), x, y, DI_TEXT_ALIGN_RIGHT, CR_BRICK, 1., -1, -1, 1, 1);
|
||||
gTempStr.Format("%3d", team_score[1]);
|
||||
SBar_DrawString(this, smallf, gTempStr, x, y + 10, DI_TEXT_ALIGN_RIGHT, CR_BRICK, 1., -1, -1, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void flashTeamScore(int team, bool show)
|
||||
{
|
||||
assert(0 == team || 1 == team); // 0: blue, 1: red
|
||||
|
||||
if (team_ticker[team] == 0 || (PlayClock & 8))
|
||||
{
|
||||
if (show)
|
||||
DrawStatNumber("%d", team_score[team], kSBarNumberInv, -30, team ? 25 : -10, 0, team ? 2 : 10, 512, 65536 * 0.75, DI_SCREEN_RIGHT_CENTER);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void viewDrawCtfHud()
|
||||
{
|
||||
if (hud_size == Hud_Nothing)
|
||||
{
|
||||
flashTeamScore(0, false);
|
||||
flashTeamScore(1, false);
|
||||
return;
|
||||
}
|
||||
|
||||
bool blueFlagTaken = false;
|
||||
bool redFlagTaken = false;
|
||||
int blueFlagCarrierColor = 0;
|
||||
int redFlagCarrierColor = 0;
|
||||
for (int i = 0, p = connecthead; p >= 0; i++, p = connectpoint2[p])
|
||||
{
|
||||
if ((gPlayer[p].hasFlag & 1) != 0)
|
||||
{
|
||||
blueFlagTaken = true;
|
||||
blueFlagCarrierColor = gPlayer[p].teamId & 3;
|
||||
}
|
||||
if ((gPlayer[p].hasFlag & 2) != 0)
|
||||
{
|
||||
redFlagTaken = true;
|
||||
redFlagCarrierColor = gPlayer[p].teamId & 3;
|
||||
}
|
||||
}
|
||||
|
||||
bool meHaveBlueFlag = gMe->hasFlag & 1;
|
||||
DrawStatMaskedSprite(meHaveBlueFlag ? 3558 : 3559, 0, 75-100, 0, 10, 512, 65536 * 0.35, DI_SCREEN_RIGHT_CENTER);
|
||||
if (gBlueFlagDropped)
|
||||
DrawStatMaskedSprite(2332, 305-320, 83 - 100, 0, 10, 512, 65536, DI_SCREEN_RIGHT_CENTER);
|
||||
else if (blueFlagTaken)
|
||||
DrawStatMaskedSprite(4097, 307-320, 77 - 100, 0, blueFlagCarrierColor ? 2 : 10, 512, 65536, DI_SCREEN_RIGHT_CENTER);
|
||||
flashTeamScore(0, true);
|
||||
|
||||
bool meHaveRedFlag = gMe->hasFlag & 2;
|
||||
DrawStatMaskedSprite(meHaveRedFlag ? 3558 : 3559, 0, 10, 0, 2, 512, 65536 * 0.35, DI_SCREEN_RIGHT_CENTER);
|
||||
if (gRedFlagDropped)
|
||||
DrawStatMaskedSprite(2332, 305-320, 17, 0, 2, 512, 65536, DI_SCREEN_RIGHT_CENTER);
|
||||
else if (redFlagTaken)
|
||||
DrawStatMaskedSprite(4097, 307-320, 11, 0, redFlagCarrierColor ? 2 : 10, 512, 65536, DI_SCREEN_RIGHT_CENTER);
|
||||
flashTeamScore(1, true);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void DrawStatusBar(int nPalette)
|
||||
{
|
||||
BeginStatusBar(320, 200, tileHeight(2200));
|
||||
|
||||
PLAYER* pPlayer = gView;
|
||||
XSPRITE* pXSprite = pPlayer->pXSprite;
|
||||
|
||||
DrawStatMaskedSprite(2200, 160, 200, 0, nPalette, RS_CENTERBOTTOM);
|
||||
DrawPackItemInStatusBar(pPlayer, 265, 186, 260, 172);
|
||||
|
||||
if (pXSprite->health >= 16 || (PlayClock & 16) || pXSprite->health == 0)
|
||||
{
|
||||
DrawStatNumber("%3d", pXSprite->health >> 4, 2190, 86, 183, 0, 0);
|
||||
}
|
||||
if (pPlayer->curWeapon && pPlayer->weaponAmmo != -1)
|
||||
{
|
||||
int num = pPlayer->ammoCount[pPlayer->weaponAmmo];
|
||||
if (pPlayer->weaponAmmo == 6)
|
||||
num /= 10;
|
||||
DrawStatNumber("%3d", num, 2240, 216, 183, 0, 0);
|
||||
}
|
||||
for (int i = 9; i >= 1; i--)
|
||||
{
|
||||
int x = 135 + ((i - 1) / 3) * 23;
|
||||
int y = 182 + ((i - 1) % 3) * 6;
|
||||
int num = pPlayer->ammoCount[i];
|
||||
if (i == 6)
|
||||
num /= 10;
|
||||
DrawStatNumber("%3d", num, 2230, x, y, i == pPlayer->weaponAmmo? -128 : 32, 10);
|
||||
}
|
||||
DrawStatNumber("%2d", pPlayer->ammoCount[10], 2230, 291, 194, pPlayer->weaponAmmo == 10? -128 : 32, 10);
|
||||
DrawStatNumber("%2d", pPlayer->ammoCount[11], 2230, 309, 194, pPlayer->weaponAmmo == 11? -128 : 32, 10);
|
||||
|
||||
if (pPlayer->armor[1])
|
||||
{
|
||||
TileHGauge(2207, 44, 174, pPlayer->armor[1], 3200);
|
||||
DrawStatNumber("%3d", pPlayer->armor[1] >> 4, 2230, 50, 177, 0, 0);
|
||||
}
|
||||
if (pPlayer->armor[0])
|
||||
{
|
||||
TileHGauge(2209, 44, 182, pPlayer->armor[0], 3200);
|
||||
DrawStatNumber("%3d", pPlayer->armor[0] >> 4, 2230, 50, 185, 0, 0);
|
||||
}
|
||||
if (pPlayer->armor[2])
|
||||
{
|
||||
TileHGauge(2208, 44, 190, pPlayer->armor[2], 3200);
|
||||
DrawStatNumber("%3d", pPlayer->armor[2] >> 4, 2230, 50, 193, 0, 0);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
int nTile = 2220 + i;
|
||||
double x = 73.5 + (i & 1) * 173;
|
||||
double y = 171.5 + (i >> 1) * 11;
|
||||
if (pPlayer->hasKey[i + 1])
|
||||
DrawStatSprite(nTile, x, y);
|
||||
else
|
||||
DrawStatSprite(nTile, x, y, 40, 5);
|
||||
}
|
||||
DrawStatMaskedSprite(2202, 118.5, 185.5, /*pPlayer->isRunning ? 16 :*/ 40);
|
||||
DrawStatMaskedSprite(2202, 201.5, 185.5, /*pPlayer->isRunning ? 16 :*/ 40);
|
||||
if (pPlayer->throwPower)
|
||||
{
|
||||
TileHGauge(2260, 124, 175.5, pPlayer->throwPower, 65536);
|
||||
}
|
||||
drawInventory(pPlayer, 166, 200 - tileHeight(2200));
|
||||
// Depending on the scale we can lower the stats display. This needs some tweaking but this catches the important default case already.
|
||||
PrintLevelStats(pPlayer, (hud_statscale <= 0.501f || hud_scalefactor < 0.7) && double(twod->GetWidth())/twod->GetHeight() > 1.6? 28 : 56);
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void DrawHUD1(int nPalette)
|
||||
{
|
||||
PLAYER* pPlayer = gView;
|
||||
XSPRITE* pXSprite = pPlayer->pXSprite;
|
||||
|
||||
BeginHUD(320, 200, 1);
|
||||
DrawStatSprite(2201, 34, 187 - 200, 16, nPalette);
|
||||
if (pXSprite->health >= 16 || (PlayClock & 16) || pXSprite->health == 0)
|
||||
{
|
||||
DrawStatNumber("%3d", pXSprite->health >> 4, 2190, 8, 183 - 200, 0, 0);
|
||||
}
|
||||
if (pPlayer->curWeapon && pPlayer->weaponAmmo != -1)
|
||||
{
|
||||
int num = pPlayer->ammoCount[pPlayer->weaponAmmo];
|
||||
if (pPlayer->weaponAmmo == 6)
|
||||
num /= 10;
|
||||
DrawStatNumber("%3d", num, 2240, 42, 183 - 200, 0, 0);
|
||||
}
|
||||
DrawStatSprite(2173, 284-320, 187 - 200, 16, nPalette);
|
||||
if (pPlayer->armor[1])
|
||||
{
|
||||
TileHGauge(2207, 250-320, 175 - 200, pPlayer->armor[1], 3200);
|
||||
DrawStatNumber("%3d", pPlayer->armor[1] >> 4, 2230, 255-320, 178 - 200, 0, 0);
|
||||
}
|
||||
if (pPlayer->armor[0])
|
||||
{
|
||||
TileHGauge(2209, 250-320, 183 - 200, pPlayer->armor[0], 3200);
|
||||
DrawStatNumber("%3d", pPlayer->armor[0] >> 4, 2230, 255-320, 186 - 200, 0, 0);
|
||||
}
|
||||
if (pPlayer->armor[2])
|
||||
{
|
||||
TileHGauge(2208, 250-320, 191 - 200, pPlayer->armor[2], 3200);
|
||||
DrawStatNumber("%3d", pPlayer->armor[2] >> 4, 2230, 255-320, 194 - 200, 0, 0);
|
||||
}
|
||||
|
||||
DrawPackItemInStatusBar(pPlayer, 286-320, 186 - 200, 302-320, 183 - 200);
|
||||
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
int nTile = 2220 + i;
|
||||
int x;
|
||||
int y = - 6;
|
||||
if (i & 1)
|
||||
{
|
||||
x = - (78 + (i >> 1) * 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
x = 73 + (i >> 1) * 10;
|
||||
}
|
||||
if (pPlayer->hasKey[i + 1])
|
||||
DrawStatSprite(nTile, x, y, 0, 0);
|
||||
}
|
||||
PrintLevelStats(pPlayer, 28);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void DrawHUD2()
|
||||
{
|
||||
PLAYER* pPlayer = gView;
|
||||
XSPRITE* pXSprite = pPlayer->pXSprite;
|
||||
|
||||
BeginHUD(320, 200, 1);
|
||||
DrawStatMaskedSprite(2169, 12, 195 - 200, 0, 0, 256, (int)(65536 * 0.56));
|
||||
DrawStatNumber("%d", pXSprite->health >> 4, kSBarNumberHealth, 28, 187 - 200, 0, 0, 256);
|
||||
if (pPlayer->armor[1])
|
||||
{
|
||||
DrawStatMaskedSprite(2578, 70, 186 - 200, 0, 0, 256, (int)(65536 * 0.5));
|
||||
DrawStatNumber("%3d", pPlayer->armor[1] >> 4, kSBarNumberArmor2, 83, 187 - 200, 0, 0, 256, (int)(65536 * 0.65));
|
||||
}
|
||||
if (pPlayer->armor[0])
|
||||
{
|
||||
DrawStatMaskedSprite(2586, 112, 195 - 200, 0, 0, 256, (int)(65536 * 0.5));
|
||||
DrawStatNumber("%3d", pPlayer->armor[0] >> 4, kSBarNumberArmor1, 125, 187 - 200, 0, 0, 256, (int)(65536 * 0.65));
|
||||
}
|
||||
if (pPlayer->armor[2])
|
||||
{
|
||||
DrawStatMaskedSprite(2602, 155, 196 - 200, 0, 0, 256, (int)(65536 * 0.5));
|
||||
DrawStatNumber("%3d", pPlayer->armor[2] >> 4, kSBarNumberArmor3, 170, 187 - 200, 0, 0, 256, (int)(65536 * 0.65));
|
||||
}
|
||||
|
||||
DrawPackItemInStatusBar2(pPlayer, 216 - 320, 194 - 200, 231 - 320, 187 - 200, 512, (int)(65536 * 0.7));
|
||||
|
||||
if (pPlayer->curWeapon && pPlayer->weaponAmmo != -1)
|
||||
{
|
||||
int num = pPlayer->ammoCount[pPlayer->weaponAmmo];
|
||||
if (pPlayer->weaponAmmo == 6)
|
||||
num /= 10;
|
||||
if ((unsigned int)gAmmoIcons[pPlayer->weaponAmmo].nTile < kMaxTiles)
|
||||
DrawStatMaskedSprite(gAmmoIcons[pPlayer->weaponAmmo].nTile, 304-320, -8 + gAmmoIcons[pPlayer->weaponAmmo].nYOffs,
|
||||
0, 0, 512, gAmmoIcons[pPlayer->weaponAmmo].nScale);
|
||||
|
||||
bool reloadableWeapon = pPlayer->curWeapon == 3 && !powerupCheck(pPlayer, kPwUpTwoGuns);
|
||||
if (!reloadableWeapon || (reloadableWeapon && !cl_showmagamt))
|
||||
{
|
||||
DrawStatNumber("%3d", num, kSBarNumberAmmo, 267-320, 187 - 200, 0, 0, 512);
|
||||
}
|
||||
else
|
||||
{
|
||||
FString format;
|
||||
short clip = CalcMagazineAmount(num, 2, pPlayer->weaponState == 1);
|
||||
short total = num - clip;
|
||||
format.Format("%d/%d", clip, num - clip);
|
||||
|
||||
DrawCharArray(format.GetChars(), kSBarNumberAmmo, (total < 10 ? 267 : 258) - 320, 187 - 200, 0, 0, 512);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
if (pPlayer->hasKey[i + 1])
|
||||
DrawStatMaskedSprite(2552 + i, -60 + 10 * i, 170 - 200, 0, 0, 0, (int)(65536 * 0.25));
|
||||
}
|
||||
|
||||
BeginStatusBar(320, 200, 28);
|
||||
if (pPlayer->throwPower)
|
||||
TileHGauge(2260, 124, 175, pPlayer->throwPower, 65536);
|
||||
else
|
||||
drawInventory(pPlayer, 166, 200-tileHeight(2201) / 2 - 30);
|
||||
PrintLevelStats(pPlayer, 28);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
public:
|
||||
void UpdateStatusBar()
|
||||
{
|
||||
PLAYER* pPlayer = gView;
|
||||
XSPRITE* pXSprite = pPlayer->pXSprite;
|
||||
|
||||
int nPalette = 0;
|
||||
|
||||
if (gGameOptions.nGameType == 3)
|
||||
{
|
||||
if (pPlayer->teamId & 1)
|
||||
nPalette = 7;
|
||||
else
|
||||
nPalette = 10;
|
||||
}
|
||||
|
||||
if (hud_size == Hud_full)
|
||||
{
|
||||
DrawHUD2();
|
||||
}
|
||||
else if (hud_size > Hud_Stbar)
|
||||
{
|
||||
BeginStatusBar(320, 200, 28);
|
||||
if (pPlayer->throwPower)
|
||||
TileHGauge(2260, 124, 175, pPlayer->throwPower, 65536);
|
||||
else if (hud_size > Hud_StbarOverlay)
|
||||
drawInventory(pPlayer, 166, 200 - tileHeight(2201) / 2);
|
||||
}
|
||||
if (hud_size == Hud_Mini)
|
||||
{
|
||||
DrawHUD1(nPalette);
|
||||
}
|
||||
else if (hud_size <= Hud_StbarOverlay)
|
||||
{
|
||||
DrawStatusBar(nPalette);
|
||||
}
|
||||
|
||||
// All remaining parts must be done with HUD alignment rules, even when showing a status bar.
|
||||
BeginHUD(320, 200, 1);
|
||||
viewDrawPowerUps(pPlayer);
|
||||
|
||||
if (gGameOptions.nGameType >= 1)
|
||||
{
|
||||
if (gGameOptions.nGameType == 3)
|
||||
{
|
||||
if (VanillaMode())
|
||||
{
|
||||
viewDrawCtfHudVanilla();
|
||||
}
|
||||
else
|
||||
{
|
||||
viewDrawCtfHud();
|
||||
viewDrawPlayerFlags();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
viewDrawPlayerFrags();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
IMPLEMENT_CLASS(DBloodStatusBar, false, false)
|
||||
|
||||
|
||||
static void UpdateFrame(void)
|
||||
{
|
||||
auto tex = tileGetTexture(kBackTile);
|
||||
|
@ -861,8 +67,22 @@ void UpdateStatusBar()
|
|||
{
|
||||
UpdateFrame();
|
||||
}
|
||||
|
||||
StatusBar->UpdateStatusBar();
|
||||
SummaryInfo sum;
|
||||
if (gGameOptions.nGameType == 3)
|
||||
{
|
||||
sum.kills = gView ? gView->fragCount : 0;
|
||||
sum.maxkills = -3;
|
||||
}
|
||||
else
|
||||
{
|
||||
sum.kills = gKillMgr.Kills;
|
||||
sum.maxkills = gKillMgr.TotalKills;
|
||||
}
|
||||
sum.secrets = gSecretMgr.Founds;
|
||||
sum.supersecrets = gSecretMgr.Super;
|
||||
sum.maxsecrets = max(gSecretMgr.Founds, gSecretMgr.Total); // If we found more than there are, increase the total. Some levels have a bugged counter.
|
||||
sum.time = Scale(PlayClock, 1000, 120);
|
||||
UpdateStatusBar(&sum);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -281,8 +281,8 @@ void DoSectorPanning(void)
|
|||
int px = MulScale(speed << 2, Cos(angle), 30) / xBits;
|
||||
int yBits = tileHeight(nTile) >> int((pSector->floorstat & 8) != 0);
|
||||
int py = MulScale(speed << 2, Sin(angle), 30) / yBits;
|
||||
pSector->addfloorxpan(px * (1. / 256));
|
||||
pSector->addfloorypan(-py * (1. / 256));
|
||||
pSector->addfloorxpan(px * (1.f / 256));
|
||||
pSector->addfloorypan(-py * (1.f / 256));
|
||||
}
|
||||
if (pXSector->panCeiling) // Ceiling
|
||||
{
|
||||
|
@ -293,8 +293,8 @@ void DoSectorPanning(void)
|
|||
int px = MulScale(speed << 2, Cos(angle), 30) / xBits;
|
||||
int yBits = tileHeight(nTile) >> int((pSector->ceilingstat & 8) != 0);
|
||||
int py = MulScale(speed << 2, Sin(angle), 30) / yBits;
|
||||
pSector->addceilingxpan(px * (1. / 256));
|
||||
pSector->addceilingypan(-py * (1. / 256));
|
||||
pSector->addceilingxpan(px * (1.f / 256));
|
||||
pSector->addceilingypan(-py * (1.f / 256));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -317,8 +317,8 @@ void DoSectorPanning(void)
|
|||
int px = (psx << 2) / tileWidth(nTile);
|
||||
int py = (psy << 2) / tileHeight(nTile);
|
||||
|
||||
wall[nWall].addxpan(px * (1. / 256));
|
||||
wall[nWall].addypan(py * (1. / 256));
|
||||
wall[nWall].addxpan(px * (1.f / 256));
|
||||
wall[nWall].addypan(py * (1.f / 256));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,7 +114,7 @@ void GameInterface::UpdateSounds()
|
|||
|
||||
if (gMe->pSprite)
|
||||
{
|
||||
listener.angle = -gMe->pSprite->ang * BAngRadian; // Build uses a period of 2048.
|
||||
listener.angle = -gMe->pSprite->ang * float(BAngRadian); // Build uses a period of 2048.
|
||||
listener.velocity.Zero();
|
||||
listener.position = GetSoundPos(&gMe->pSprite->pos);
|
||||
listener.valid = true;
|
||||
|
|
|
@ -181,6 +181,7 @@ void sndStartSample(unsigned int nSound, int nVolume, int nChannel, bool bLoop,
|
|||
else nVolume = 255;
|
||||
}
|
||||
if (bLoop) chanflags |= CHANF_LOOP;
|
||||
soundEngine->StopActorSounds(SOURCE_None, nullptr, nChannel + 1, nChannel + 1);
|
||||
soundEngine->StartSound(SOURCE_None, nullptr, nullptr, (nChannel + 1), chanflags, snd, nVolume / 255.f, ATTN_NONE);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -270,9 +270,9 @@ void LifeLeechOperate(spritetype *pSprite, XSPRITE *pXSprite, EVENT event)
|
|||
int nMissileType = kMissileLifeLeechAltNormal + (pXSprite->data3 ? 1 : 0);
|
||||
int t2;
|
||||
if (!pXSprite->data3)
|
||||
t2 = 120 / 10.0;
|
||||
t2 = 120 / 10;
|
||||
else
|
||||
t2 = (3*120) / 10.0;
|
||||
t2 = (3*120) / 10;
|
||||
spritetype *pMissile = actFireMissile(pSprite, 0, z1, dx, dy, dz, nMissileType);
|
||||
if (pMissile)
|
||||
{
|
||||
|
|
|
@ -742,7 +742,7 @@ void viewDrawScreen(bool sceneonly)
|
|||
}
|
||||
else
|
||||
{
|
||||
renderSetRollAngle(rotscrnang.asbuildf());
|
||||
renderSetRollAngle((float)rotscrnang.asbuildf());
|
||||
render3DViewPolymost(nSectnum, cX, cY, cZ, cA, cH);
|
||||
}
|
||||
bDeliriumOld = bDelirium && gDeliriumBlur;
|
||||
|
@ -785,12 +785,6 @@ void viewDrawScreen(bool sceneonly)
|
|||
{
|
||||
gChoke.animateChoke(160, zn, (int)gInterpolate);
|
||||
}
|
||||
#if 0
|
||||
if (drawtile_2048)
|
||||
{
|
||||
DrawStatSprite(2048, xdim-15, 20);
|
||||
}
|
||||
#endif
|
||||
|
||||
viewDrawAimedPlayerName();
|
||||
if (paused)
|
||||
|
|
|
@ -194,7 +194,7 @@ static bool CheckAmmo(PLAYER *pPlayer, int ammotype, int count)
|
|||
return 1;
|
||||
if (pPlayer->curWeapon == 12 && pPlayer->weaponAmmo == 11 && pPlayer->weaponState == 11)
|
||||
return 1;
|
||||
if (pPlayer->curWeapon == 9 && pPlayer->pXSprite->health >= (count<<4))
|
||||
if (pPlayer->curWeapon == 9 && pPlayer->pXSprite->health >= unsigned(count<<4))
|
||||
return 1;
|
||||
return pPlayer->ammoCount[ammotype] >= count;
|
||||
}
|
||||
|
@ -1703,7 +1703,7 @@ void AltFireLifeLeech(int , PLAYER *pPlayer)
|
|||
if (gGameOptions.nGameType <= 1)
|
||||
{
|
||||
int nAmmo = pPlayer->ammoCount[8];
|
||||
if (nAmmo < 25 && pPlayer->pXSprite->health > ((25-nAmmo)<<4))
|
||||
if (nAmmo < 25 && pPlayer->pXSprite->health > unsigned((25-nAmmo)<<4))
|
||||
{
|
||||
actDamageSprite(pPlayer->nSprite, pPlayer->pSprite, DAMAGE_TYPE_5, ((25-nAmmo)<<4));
|
||||
nAmmo = 25;
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
#include "src/player_d.cpp"
|
||||
#include "src/player_w.cpp"
|
||||
#include "src/premap_d.cpp"
|
||||
#include "src/sbar_d.cpp"
|
||||
#include "src/sectors_d.cpp"
|
||||
#include "src/spawn_d.cpp"
|
||||
|
||||
|
|
|
@ -7,6 +7,5 @@
|
|||
#include "src/hudweapon_r.cpp"
|
||||
#include "src/player_r.cpp"
|
||||
#include "src/premap_r.cpp"
|
||||
#include "src/sbar_r.cpp"
|
||||
#include "src/sectors_r.cpp"
|
||||
#include "src/spawn_r.cpp"
|
||||
|
|
|
@ -112,9 +112,9 @@ void InitFonts_d()
|
|||
fontdata.Clear();
|
||||
|
||||
// SBAR index font
|
||||
for (int i = 0; i < 10; i++) fontdata.Insert('0' + i, tileGetTexture(THREEBYFIVE + i));
|
||||
fontdata.Insert(':', tileGetTexture(THREEBYFIVE + 10));
|
||||
fontdata.Insert('/', tileGetTexture(THREEBYFIVE + 11));
|
||||
for (int i = 0; i < 10; i++) fontdata.Insert('0' + i, tileGetTexture(THREEBYFIVE0 + i));
|
||||
fontdata.Insert(':', tileGetTexture(THREEBYFIVE0 + 10));
|
||||
fontdata.Insert('/', tileGetTexture(THREEBYFIVE0 + 11));
|
||||
fontdata.Insert('%', tileGetTexture(MINIFONT + '%' - '!'));
|
||||
fontdata.Insert(1, TexMan.FindGameTexture("TINYBLAK")); // this is only here to widen the color range of the font to produce a better translation.
|
||||
GlyphSet::Iterator iti(fontdata);
|
||||
|
|
|
@ -316,19 +316,14 @@ void ms(DDukeActor* const actor)
|
|||
|
||||
void movecyclers(void)
|
||||
{
|
||||
short q, j, x, t, s, * c;
|
||||
walltype* wal;
|
||||
char cshade;
|
||||
|
||||
for (q = numcyclers - 1; q >= 0; q--)
|
||||
for (int q = numcyclers - 1; q >= 0; q--)
|
||||
{
|
||||
short* c = &cyclers[q][0];
|
||||
int s = c[0];
|
||||
|
||||
c = &cyclers[q][0];
|
||||
s = c[0];
|
||||
|
||||
t = c[3];
|
||||
j = t + bsin(c[1], -10);
|
||||
cshade = c[2];
|
||||
int t = c[3];
|
||||
int j = t + bsin(c[1], -10);
|
||||
int cshade = c[2];
|
||||
|
||||
if (j < cshade) j = cshade;
|
||||
else if (j > t) j = t;
|
||||
|
@ -336,8 +331,8 @@ void movecyclers(void)
|
|||
c[1] += sector[s].extra;
|
||||
if (c[5])
|
||||
{
|
||||
wal = &wall[sector[s].wallptr];
|
||||
for (x = sector[s].wallnum; x > 0; x--, wal++)
|
||||
auto wal = &wall[sector[s].wallptr];
|
||||
for (int x = sector[s].wallnum; x > 0; x--, wal++)
|
||||
if (wal->hitag != 1)
|
||||
{
|
||||
wal->shade = j;
|
||||
|
@ -4466,7 +4461,7 @@ void handle_se27(DDukeActor* actor)
|
|||
{
|
||||
if (cansee(s->x, s->y, s->z, s->sectnum, ps[p].posx, ps[p].posy, ps[p].posz, ps[p].cursectnum))
|
||||
{
|
||||
if (x < (unsigned)sh)
|
||||
if (x < sh)
|
||||
{
|
||||
ud.cameraactor = actor;
|
||||
t[0] = 999;
|
||||
|
|
|
@ -220,9 +220,9 @@ void addweapon_d(struct player_struct *p, int weapon)
|
|||
{
|
||||
if ( p->gotweapon[weapon] == 0 )
|
||||
{
|
||||
p->gotweapon.Set(weapon);
|
||||
if(weapon == SHRINKER_WEAPON)
|
||||
p->gotweapon.Set(GROW_WEAPON);
|
||||
p->gotweapon[weapon] = true;
|
||||
if (weapon == SHRINKER_WEAPON)
|
||||
p->gotweapon[GROW_WEAPON] = true;
|
||||
}
|
||||
|
||||
p->random_club_frame = 0;
|
||||
|
@ -1578,7 +1578,7 @@ static bool movefireball(DDukeActor* actor)
|
|||
spr->zvel = proj->zv;
|
||||
}
|
||||
}
|
||||
spr->yrepeat = spr->xrepeat = (short)(s->xrepeat * siz);
|
||||
spr->yrepeat = spr->xrepeat = (uint8_t)(s->xrepeat * siz);
|
||||
spr->cstat = s->cstat;
|
||||
spr->extra = 0;
|
||||
|
||||
|
|
|
@ -557,7 +557,7 @@ void thunder(void)
|
|||
struct player_struct* p;
|
||||
int r1, r2;
|
||||
short startwall, endwall, i, j;
|
||||
unsigned char shade;
|
||||
uint8_t shade;
|
||||
|
||||
p = &ps[screenpeek];
|
||||
|
||||
|
@ -612,10 +612,10 @@ void thunder(void)
|
|||
{
|
||||
startwall = sector[lightninsector[i]].wallptr;
|
||||
endwall = startwall + sector[lightninsector[i]].wallnum;
|
||||
sector[lightninsector[i]].floorshade = lightninsectorshade[i];
|
||||
sector[lightninsector[i]].ceilingshade = lightninsectorshade[i];
|
||||
sector[lightninsector[i]].floorshade = (int8_t)lightninsectorshade[i];
|
||||
sector[lightninsector[i]].ceilingshade = (int8_t)lightninsectorshade[i];
|
||||
for (j = startwall; j < endwall; j++)
|
||||
wall[j].shade = lightninsectorshade[i];
|
||||
wall[j].shade = (int8_t)lightninsectorshade[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -118,16 +118,16 @@ void addweapon_r(struct player_struct* p, int weapon)
|
|||
short cw = p->curr_weapon;
|
||||
if (p->OnMotorcycle || p->OnBoat)
|
||||
{
|
||||
p->gotweapon.Set(weapon);
|
||||
p->gotweapon[weapon] = true;;
|
||||
if (weapon == THROWSAW_WEAPON)
|
||||
{
|
||||
p->gotweapon.Set(BUZZSAW_WEAPON);
|
||||
p->gotweapon[BUZZSAW_WEAPON] = true;
|
||||
p->ammo_amount[BUZZSAW_WEAPON] = 1;
|
||||
}
|
||||
else if (weapon == CROSSBOW_WEAPON)
|
||||
{
|
||||
p->gotweapon.Set(CHICKEN_WEAPON);
|
||||
p->gotweapon.Set(DYNAMITE_WEAPON);
|
||||
p->gotweapon[CHICKEN_WEAPON] = true;
|
||||
p->gotweapon[DYNAMITE_WEAPON] = true;
|
||||
}
|
||||
else if (weapon == SLINGBLADE_WEAPON)
|
||||
{
|
||||
|
@ -138,17 +138,17 @@ void addweapon_r(struct player_struct* p, int weapon)
|
|||
|
||||
if (p->gotweapon[weapon] == 0)
|
||||
{
|
||||
p->gotweapon.Set(weapon);
|
||||
p->gotweapon[weapon] = true;;
|
||||
if (weapon == THROWSAW_WEAPON)
|
||||
{
|
||||
p->gotweapon.Set(BUZZSAW_WEAPON);
|
||||
p->gotweapon[BUZZSAW_WEAPON] = true;
|
||||
p->ammo_amount[BUZZSAW_WEAPON] = 1;
|
||||
}
|
||||
if (isRRRA())
|
||||
{
|
||||
if (weapon == CROSSBOW_WEAPON)
|
||||
{
|
||||
p->gotweapon.Set(CHICKEN_WEAPON);
|
||||
p->gotweapon[CHICKEN_WEAPON] = true;
|
||||
}
|
||||
if (weapon == SLINGBLADE_WEAPON)
|
||||
{
|
||||
|
@ -157,7 +157,7 @@ void addweapon_r(struct player_struct* p, int weapon)
|
|||
}
|
||||
if (weapon == CROSSBOW_WEAPON)
|
||||
{
|
||||
p->gotweapon.Set(DYNAMITE_WEAPON);
|
||||
p->gotweapon[DYNAMITE_WEAPON] = true;
|
||||
}
|
||||
|
||||
if (weapon != DYNAMITE_WEAPON)
|
||||
|
|
|
@ -29,7 +29,6 @@ Modifications for JonoF's port by Jonathon Fowler (jf@jonof.id.au)
|
|||
#include "ns.h"
|
||||
|
||||
#include "duke3d.h"
|
||||
#include "sbar.h"
|
||||
#include "mapinfo.h"
|
||||
#include "cheathandler.h"
|
||||
#include "c_dispatch.h"
|
||||
|
|
|
@ -194,7 +194,7 @@ const char* GameInterface::GenericCheat(int player, int cheat)
|
|||
|
||||
case CHT_RHETT:
|
||||
ud.god = 0;
|
||||
ps[player].gotweapon.Zero();
|
||||
memset(ps[player].gotweapon, 0, MAX_WEAPONS);
|
||||
ps[player].curr_weapon = KNEE_WEAPON;
|
||||
ps[player].nocheat = 1;
|
||||
ps[player].GetActor()->s->extra = 1;
|
||||
|
@ -231,7 +231,7 @@ static bool cheatWeapons(int player)
|
|||
for (int weapon = PISTOL_WEAPON; weapon < weaponLimit; weapon++ )
|
||||
{
|
||||
addammo( weapon, &ps[player], gs.max_ammo_amount[weapon] );
|
||||
ps[player].gotweapon.Set(weapon);
|
||||
ps[player].gotweapon[weapon] = true;;
|
||||
}
|
||||
if (isRRRA())
|
||||
ps[player].ammo_amount[SLINGBLADE_WEAPON] = 1;
|
||||
|
|
|
@ -173,7 +173,7 @@ void initactorflags_r()
|
|||
STEROIDS,
|
||||
HEATSENSOR,
|
||||
BOOTS,
|
||||
JETPACK,
|
||||
COWPIE,
|
||||
HOLODUKE,
|
||||
AIRTANK });
|
||||
|
||||
|
@ -205,7 +205,7 @@ void initactorflags_r()
|
|||
gs.weaponsandammosprites[2] = DEVISTATORAMMO;
|
||||
gs.weaponsandammosprites[3] = RPGAMMO;
|
||||
gs.weaponsandammosprites[4] = RPGAMMO;
|
||||
gs.weaponsandammosprites[5] = JETPACK;
|
||||
gs.weaponsandammosprites[5] = COWPIE;
|
||||
gs.weaponsandammosprites[6] = SHIELD;
|
||||
gs.weaponsandammosprites[7] = FIRSTAID;
|
||||
gs.weaponsandammosprites[8] = STEROIDS;
|
||||
|
|
|
@ -227,6 +227,7 @@ void PlayerColorChanged(void);
|
|||
bool movementBlocked(player_struct *p);
|
||||
void loadcons();
|
||||
void recordoldspritepos();
|
||||
void DrawStatusBar();
|
||||
|
||||
int* animateptr(int i);
|
||||
|
||||
|
|
|
@ -40,7 +40,6 @@ Modifications for JonoF's port by Jonathon Fowler (jf@jonof.id.au)
|
|||
#include "st_start.h"
|
||||
#include "i_interface.h"
|
||||
#include "prediction.h"
|
||||
#include "sbar.h"
|
||||
#include "gamestate.h"
|
||||
#include "dukeactor.h"
|
||||
#include "interpolate.h"
|
||||
|
@ -232,7 +231,7 @@ void drawoverlays(double smoothratio)
|
|||
// loogies courtesy of being snotted on
|
||||
if (pp->loogcnt > 0 && !isRR())
|
||||
{
|
||||
V_AddBlend(0, 63, 0, (pp->loogcnt >> 1), blend);
|
||||
V_AddBlend(0, 63, 0, float(pp->loogcnt >> 1), blend);
|
||||
}
|
||||
if (blend[3])
|
||||
{
|
||||
|
@ -291,9 +290,7 @@ void drawoverlays(double smoothratio)
|
|||
}
|
||||
}
|
||||
|
||||
DrawBorder();
|
||||
|
||||
StatusBar->UpdateStatusBar();
|
||||
DrawStatusBar();
|
||||
|
||||
if (ps[myconnectindex].newOwner == nullptr && ud.cameraactor == nullptr)
|
||||
{
|
||||
|
|
|
@ -300,7 +300,7 @@ int ConCompiler::getkeyword(const char* text)
|
|||
|
||||
while (min <= max)
|
||||
{
|
||||
int mid = (min + max) >> 1;
|
||||
auto mid = (min + max) >> 1;
|
||||
const int comp = strcmp(text, cmdList[mid].cmd);
|
||||
|
||||
if (comp == 0)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue