From 5c8fd4750f2968906906f301e3e38436ee6a9669 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Jan 2016 17:00:24 +0100 Subject: [PATCH 01/14] - fixed: FInterpolator::DoInterpolations did not handle terminated interpolations properly. --- src/r_data/r_interpolate.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/r_data/r_interpolate.cpp b/src/r_data/r_interpolate.cpp index d153b3a781..82e27abb48 100644 --- a/src/r_data/r_interpolate.cpp +++ b/src/r_data/r_interpolate.cpp @@ -261,9 +261,12 @@ void FInterpolator::DoInterpolations(fixed_t smoothratio) didInterp = true; - for (DInterpolation *probe = Head; probe != NULL; probe = probe->Next) + DInterpolation *probe = Head; + while (probe != NULL) { + DInterpolation *next = probe->Next; probe->Interpolate(smoothratio); + probe = next; } } @@ -444,6 +447,8 @@ void DSectorPlaneInterpolation::UpdateInterpolation() oldheight = sector->ceilingplane.d; oldtexz = sector->GetPlaneTexZ(sector_t::ceiling); } + if (oldtexz <-128*FRACUNIT) + __asm nop } //========================================================================== From c4377b7039aca68bb39aef91a06c1b0b8429159e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Jan 2016 20:44:33 +0100 Subject: [PATCH 02/14] - removed the implicit fixedvec -> TVector conversions because they caused too many problems. Also reviewed all uses of these and made the necessary adjustments. Problems were present in P_SpawnMissileXYZ and P_Thing_Projectile. - replaced some single precision float math with doubles. --- src/actor.h | 20 -------------------- src/b_func.cpp | 3 ++- src/g_shared/a_camera.cpp | 5 +++-- src/p_enemy.cpp | 10 ++++++---- src/p_mobj.cpp | 7 ++++--- src/p_things.cpp | 10 +++++----- 6 files changed, 20 insertions(+), 35 deletions(-) diff --git a/src/actor.h b/src/actor.h index a9bd60f755..ed38d0020c 100644 --- a/src/actor.h +++ b/src/actor.h @@ -591,31 +591,11 @@ enum struct fixedvec3 { fixed_t x, y, z; - - operator FVector3() - { - return FVector3(FIXED2FLOAT(x), FIXED2FLOAT(y), FIXED2FLOAT(z)); - } - - operator TVector3() - { - return TVector3(FIXED2DBL(x), FIXED2DBL(y), FIXED2DBL(z)); - } }; struct fixedvec2 { fixed_t x, y; - - operator FVector2() - { - return FVector2(FIXED2FLOAT(x), FIXED2FLOAT(y)); - } - - operator TVector2() - { - return TVector2(FIXED2DBL(x), FIXED2DBL(y)); - } }; struct FDropItem diff --git a/src/b_func.cpp b/src/b_func.cpp index eb86beba83..3edc560b0b 100644 --- a/src/b_func.cpp +++ b/src/b_func.cpp @@ -465,7 +465,8 @@ fixed_t FCajunMaster::FakeFire (AActor *source, AActor *dest, ticcmd_t *cmd) float speed = (float)th->Speed; - TVector3 velocity = source->Vec3To(dest); + fixedvec3 fixvel = source->Vec3To(dest); + TVector3 velocity(fixvel.x, fixvel.y, fixvel.z); velocity.MakeUnit(); th->velx = FLOAT2FIXED(velocity[0] * speed); th->vely = FLOAT2FIXED(velocity[1] * speed); diff --git a/src/g_shared/a_camera.cpp b/src/g_shared/a_camera.cpp index 61a155ea78..37457e7f07 100644 --- a/src/g_shared/a_camera.cpp +++ b/src/g_shared/a_camera.cpp @@ -176,8 +176,9 @@ void AAimingCamera::Tick () } if (MaxPitchChange) { // Aim camera's pitch; use floats for precision - TVector2 vect = tracer->Vec2To(this); - double dz = FIXED2DBL(Z() - tracer->Z() - tracer->height/2); + fixedvec2 fv3 = tracer->Vec2To(this); + TVector2 vect(fv3.x, fv3.y); + double dz = Z() - tracer->Z() - tracer->height/2; double dist = vect.Length(); double ang = dist != 0.f ? atan2 (dz, dist) : 0; int desiredpitch = (angle_t)(ang * 2147483648.f / PI); diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 90a7a5f5ca..0fd23f73e8 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -2777,7 +2777,8 @@ void A_Face (AActor *self, AActor *other, angle_t max_turn, angle_t max_pitch, a // disabled and is so by default. if (max_pitch <= ANGLE_180) { - TVector2 dist = self->Vec2To(other); + fixedvec2 pos = self->Vec2To(other); + TVector2 dist(pos.x, pos.y); // Positioning ala missile spawning, 32 units above foot level fixed_t source_z = self->Z() + 32*FRACUNIT + self->GetBobOffset(); @@ -2801,7 +2802,7 @@ void A_Face (AActor *self, AActor *other, angle_t max_turn, angle_t max_pitch, a if (!(flags & FAF_NODISTFACTOR)) target_z += pitch_offset; - double dist_z = FIXED2DBL(target_z - source_z); + double dist_z = target_z - source_z; double ddist = sqrt(dist.X*dist.X + dist.Y*dist.Y + dist_z*dist_z); int other_pitch = (int)rad2bam(asin(dist_z / ddist)); @@ -2915,8 +2916,9 @@ DEFINE_ACTION_FUNCTION(AActor, A_MonsterRail) if (linetarget == NULL) { // We probably won't hit the target, but aim at it anyway so we don't look stupid. - TVector2 xydiff = self->Vec2To(self->target); - double zdiff = FIXED2DBL((self->target->Z() + (self->target->height>>1)) - (self->Z() + (self->height>>1) - self->floorclip)); + fixedvec2 pos = self->Vec2To(self->target); + TVector2 xydiff(pos.x, pos.y); + double zdiff = (self->target->Z() + (self->target->height>>1)) - (self->Z() + (self->height>>1) - self->floorclip); self->pitch = int(atan2(zdiff, xydiff.Length()) * ANGLE_180 / -M_PI); } diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 9f8fbe2ea5..32a20e3214 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -2037,7 +2037,7 @@ fixed_t P_XYMovement (AActor *mo, fixed_t scrollx, fixed_t scrolly) //dest->x - source->x fixedvec3 vect = mo->Vec3To(origin); vect.z += origin->height / 2; - FVector3 velocity(vect); + TVector3 velocity(vect.x, vect.y, vect.z); velocity.Resize(speed); mo->velx = (fixed_t)(velocity.X); mo->vely = (fixed_t)(velocity.Y); @@ -5733,7 +5733,8 @@ AActor *P_SpawnMissileXYZ (fixed_t x, fixed_t y, fixed_t z, // missile? // Answer: No, because this way, you can set up sets of parallel missiles. - FVector3 velocity = source->Vec3To(dest); + fixedvec3 fixvel = source->Vec3To(dest); + FVector3 velocity(fixvel.x, fixvel.y, fixvel.z); // Floor and ceiling huggers should never have a vertical component to their velocity if (th->flags3 & (MF3_FLOORHUGGER|MF3_CEILINGHUGGER)) { @@ -5742,7 +5743,7 @@ AActor *P_SpawnMissileXYZ (fixed_t x, fixed_t y, fixed_t z, // [RH] Adjust the trajectory if the missile will go over the target's head. else if (z - source->Z() >= dest->height) { - velocity.Z += dest->height - z + source->Z(); + velocity.Z += (dest->height - z + source->Z()); } velocity.Resize (speed); th->velx = (fixed_t)(velocity.X); diff --git a/src/p_things.cpp b/src/p_things.cpp index 85d7961af1..be28ed98da 100644 --- a/src/p_things.cpp +++ b/src/p_things.cpp @@ -256,7 +256,7 @@ bool P_Thing_Projectile (int tid, AActor *source, int type, const char *type_nam { fixedvec3 vect = mobj->Vec3To(targ); vect.z += targ->height / 2; - FVector3 aim = vect; + TVector3 aim(vect.x, vect.y, vect.z); if (leadTarget && speed > 0 && (targ->velx | targ->vely | targ->velz)) { @@ -267,7 +267,7 @@ bool P_Thing_Projectile (int tid, AActor *source, int type, const char *type_nam // with the math. I don't think I would have thought of using // trig alone had I been left to solve it by myself. - FVector3 tvel(targ->velx, targ->vely, targ->velz); + TVector3 tvel(targ->velx, targ->vely, targ->velz); if (!(targ->flags & MF_NOGRAVITY) && targ->waterlevel < 3) { // If the target is subject to gravity and not underwater, // assume that it isn't moving vertically. Thanks to gravity, @@ -288,14 +288,14 @@ bool P_Thing_Projectile (int tid, AActor *source, int type, const char *type_nam // Use the cross product of two of the triangle's sides to get a // rotation vector. - FVector3 rv(tvel ^ aim); + TVector3 rv(tvel ^ aim); // The vector must be normalized. rv.MakeUnit(); // Now combine the rotation vector with angle b to get a rotation matrix. - FMatrix3x3 rm(rv, cos(asin(sinb)), sinb); + TMatrix3x3 rm(rv, cos(asin(sinb)), sinb); // And multiply the original aim vector with the matrix to get a // new aim vector that leads the target. - FVector3 aimvec = rm * aim; + TVector3 aimvec = rm * aim; // And make the projectile follow that vector at the desired speed. double aimscale = fspeed / dist; mobj->velx = fixed_t (aimvec[0] * aimscale); From 0dabaca7dff12aabee6e2560f12a4a7b3e345141 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Jan 2016 21:23:02 +0100 Subject: [PATCH 03/14] - added some range checks to PgUp(PgDown code for option menus. --- src/menu/optionmenu.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/menu/optionmenu.cpp b/src/menu/optionmenu.cpp index 57e69cfaba..a1d7660bba 100644 --- a/src/menu/optionmenu.cpp +++ b/src/menu/optionmenu.cpp @@ -274,7 +274,14 @@ bool DOptionMenu::MenuEvent (int mkey, bool fromcontroller) mDesc->mSelectedItem = mDesc->mScrollTop + mDesc->mScrollPos + 1; while (!mDesc->mItems[mDesc->mSelectedItem]->Selectable()) { - ++mDesc->mSelectedItem; + if (++mDesc->mSelectedItem >= (int)mDesc->mItems.Size()) + { + mDesc->mSelectedItem = 0; + } + } + if (mDesc->mScrollPos > mDesc->mSelectedItem) + { + mDesc->mScrollPos = mDesc->mSelectedItem; } } } @@ -294,7 +301,14 @@ bool DOptionMenu::MenuEvent (int mkey, bool fromcontroller) mDesc->mSelectedItem = mDesc->mScrollTop + mDesc->mScrollPos; while (!mDesc->mItems[mDesc->mSelectedItem]->Selectable()) { - ++mDesc->mSelectedItem; + if (++mDesc->mSelectedItem >= (int)mDesc->mItems.Size()) + { + mDesc->mSelectedItem = 0; + } + } + if (mDesc->mScrollPos > mDesc->mSelectedItem) + { + mDesc->mScrollPos = mDesc->mSelectedItem; } } } From 88a616da7585f317ce7b1a4651dffc1b2a36e1c6 Mon Sep 17 00:00:00 2001 From: Braden Obrzut Date: Sat, 23 Jan 2016 19:33:26 -0500 Subject: [PATCH 04/14] - Removed what appears to be a debug breakpoint. - Cleared some GCC and Clang warnings. Mostly static analysis false positives, but one of them generated a pretty massive warning in a release build. - Use -Wno-unused-result since I doubt we're going to address those unless they actually prove to be a problem (and they only appear in release builds). --- dumb/CMakeLists.txt | 2 +- src/CMakeLists.txt | 3 +- src/p_mobj.cpp | 2 +- src/p_pspr.cpp | 2 +- src/p_spec.cpp | 2 +- src/p_teleport.cpp | 2 +- src/r_data/r_interpolate.cpp | 2 - src/s_sound.cpp | 83 +++++++++++++++++++----------------- src/v_font.cpp | 4 +- 9 files changed, 53 insertions(+), 49 deletions(-) diff --git a/dumb/CMakeLists.txt b/dumb/CMakeLists.txt index b590aa1655..fd8cdd9686 100644 --- a/dumb/CMakeLists.txt +++ b/dumb/CMakeLists.txt @@ -8,7 +8,7 @@ include( CheckCXXCompilerFlag ) set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG -DDEBUGMODE=1" ) if( ZD_CMAKE_COMPILER_IS_GNUC_COMPATIBLE ) - set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-pointer-sign -Wno-uninitialized" ) + set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-pointer-sign -Wno-uninitialized -Wno-unused-but-set-variable" ) endif( ZD_CMAKE_COMPILER_IS_GNUC_COMPATIBLE ) CHECK_FUNCTION_EXISTS( itoa ITOA_EXISTS ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e161a85dd7..70890c5fc5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -456,7 +456,8 @@ if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) set( CMAKE_CXX_FLAGS_MINSIZEREL "${REL_CXX_FLAGS} ${CMAKE_CXX_FLAGS_MINSIZEREL}" ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${REL_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" ) - set( CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-missing-field-initializers ${CMAKE_CXX_FLAGS}" ) + set( CMAKE_C_FLAGS "-Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-result ${CMAKE_C_FLAGS}" ) + set( CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-result ${CMAKE_CXX_FLAGS}" ) # Remove extra warnings when using the official DirectX headers. # Also, TDM-GCC 4.4.0 no longer accepts glibc-style printf formats as valid, diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 32a20e3214..67f7d16854 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -5939,7 +5939,7 @@ AActor *P_SpawnPlayerMissile (AActor *source, fixed_t x, fixed_t y, fixed_t z, const PClass *type, angle_t angle, AActor **pLineTarget, AActor **pMissileActor, bool nofreeaim, bool noautoaim) { - static const int angdiff[3] = { -1<<26, 1<<26, 0 }; + static const int angdiff[3] = { -(1<<26), 1<<26, 0 }; angle_t an = angle; angle_t pitch; AActor *linetarget; diff --git a/src/p_pspr.cpp b/src/p_pspr.cpp index 7cdef059cb..0ced8f004b 100644 --- a/src/p_pspr.cpp +++ b/src/p_pspr.cpp @@ -891,7 +891,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AInventory, A_GunFlash) angle_t P_BulletSlope (AActor *mo, AActor **pLineTarget) { - static const int angdiff[3] = { -1<<26, 1<<26, 0 }; + static const int angdiff[3] = { -(1<<26), 1<<26, 0 }; int i; angle_t an; angle_t pitch; diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 2cb3222781..0dcf5124a5 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -1223,7 +1223,7 @@ void P_InitSectorSpecial(sector_t *sector, int special, bool nothinkers) if (!nothinkers) { new DStrobe(sector, STROBEBRIGHT, FASTDARK, false); - new DScroller(DScroller::sc_floor, (-FRACUNIT / 2) << 3, + new DScroller(DScroller::sc_floor, -((FRACUNIT / 2) << 3), 0, -1, int(sector - sectors), 0); } keepspecial = true; diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index ab860bfe9b..85b668bf00 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -108,7 +108,7 @@ bool P_Teleport (AActor *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle, sector_t *destsect; bool resetpitch = false; fixed_t floorheight, ceilingheight; - fixed_t missilespeed; + fixed_t missilespeed = 0; old = thing->Pos(); aboveFloor = thing->Z() - thing->floorz; diff --git a/src/r_data/r_interpolate.cpp b/src/r_data/r_interpolate.cpp index 82e27abb48..4ce3a3c7b3 100644 --- a/src/r_data/r_interpolate.cpp +++ b/src/r_data/r_interpolate.cpp @@ -447,8 +447,6 @@ void DSectorPlaneInterpolation::UpdateInterpolation() oldheight = sector->ceilingplane.d; oldtexz = sector->GetPlaneTexZ(sector_t::ceiling); } - if (oldtexz <-128*FRACUNIT) - __asm nop } //========================================================================== diff --git a/src/s_sound.cpp b/src/s_sound.cpp index 2a9703ae42..c05ef10366 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -676,52 +676,55 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, z = y = x = 0; } - switch (type) + // [BL] Moved this case out of the switch statement to make code easier + // on static analysis. + if(type == SOURCE_Unattached) { - case SOURCE_None: - default: - break; - - case SOURCE_Actor: -// assert(actor != NULL); - if (actor != NULL) - { - x = actor->SoundX(); - y = actor->SoundZ(); - z = actor->SoundY(); - } - break; - - case SOURCE_Sector: - assert(sector != NULL); - if (sector != NULL) - { - if (chanflags & CHAN_AREA) - { - CalcSectorSoundOrg(sector, channum, &x, &z, &y); - } - else - { - x = sector->soundorg[0]; - z = sector->soundorg[1]; - chanflags |= CHAN_LISTENERZ; - } - } - break; - - case SOURCE_Polyobj: - assert(poly != NULL); - CalcPolyobjSoundOrg(poly, &x, &z, &y); - break; - - case SOURCE_Unattached: pos->X = pt[0]; pos->Y = !(chanflags & CHAN_LISTENERZ) ? pt[1] : FIXED2FLOAT(y); pos->Z = pt[2]; - break; } - if (type != SOURCE_Unattached) + else { + switch (type) + { + case SOURCE_None: + default: + break; + + case SOURCE_Actor: + //assert(actor != NULL); + if (actor != NULL) + { + x = actor->SoundX(); + y = actor->SoundZ(); + z = actor->SoundY(); + } + break; + + case SOURCE_Sector: + assert(sector != NULL); + if (sector != NULL) + { + if (chanflags & CHAN_AREA) + { + CalcSectorSoundOrg(sector, channum, &x, &z, &y); + } + else + { + x = sector->soundorg[0]; + z = sector->soundorg[1]; + chanflags |= CHAN_LISTENERZ; + } + } + break; + + case SOURCE_Polyobj: + assert(poly != NULL); + CalcPolyobjSoundOrg(poly, &x, &z, &y); + break; + } + if ((chanflags & CHAN_LISTENERZ) && players[consoleplayer].camera != NULL) { y = players[consoleplayer].camera != NULL ? players[consoleplayer].camera->SoundZ() : 0; diff --git a/src/v_font.cpp b/src/v_font.cpp index 5fc2994fb8..e30f8352d2 100644 --- a/src/v_font.cpp +++ b/src/v_font.cpp @@ -1059,7 +1059,9 @@ void FSingleLumpFont::LoadTranslations() break; default: - break; + // Should be unreachable. + I_Error("Unknown font type in FSingleLumpFont::LoadTranslation."); + return; } for(unsigned int i = 0;i < count;++i) From 20f7f524ca3d5d447bc9e2e78cada93244ee0dd8 Mon Sep 17 00:00:00 2001 From: Braden Obrzut Date: Sat, 23 Jan 2016 20:09:39 -0500 Subject: [PATCH 05/14] - Don't link against sndfile and mpg123 if not compiling with OpenAL support. --- src/CMakeLists.txt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 70890c5fc5..40503f8e95 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -286,16 +286,19 @@ if( NO_FMOD ) endif( NO_FMOD ) if( NO_OPENAL ) add_definitions( -DNO_OPENAL=1 ) + + set(MPG123_FOUND NO) + set(SNDFILE_FOUND NO) +else( NO_OPENAL ) + # Search for libSndFile + + find_package( SndFile ) + + # Search for libmpg123 + + find_package( MPG123 ) endif( NO_OPENAL ) -# Search for libSndFile - -find_package( SndFile ) - -# Search for libmpg123 - -find_package( MPG123 ) - # Search for FluidSynth find_package( FluidSynth ) From 5abacf0b2f322b505625eb731bfd554a8ee1aa9e Mon Sep 17 00:00:00 2001 From: Braden Obrzut Date: Sat, 23 Jan 2016 21:40:19 -0500 Subject: [PATCH 06/14] - Fixed: Uninitialized variable on DrawSelectedInventory. --- src/g_shared/sbarinfo_commands.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_shared/sbarinfo_commands.cpp b/src/g_shared/sbarinfo_commands.cpp index 2f7739a4fd..7a874328f8 100644 --- a/src/g_shared/sbarinfo_commands.cpp +++ b/src/g_shared/sbarinfo_commands.cpp @@ -1595,7 +1595,7 @@ class CommandDrawSelectedInventory : public CommandDrawImage, private CommandDra public: CommandDrawSelectedInventory(SBarInfo *script) : CommandDrawImage(script), CommandDrawNumber(script), alternateOnEmpty(false), - artiflash(false), alwaysShowCounter(false) + artiflash(false), alwaysShowCounter(false), itemflash(false) { length = INT_MAX; // Counter size } From fc15be8689d3648d40199e4b4a3f50ebe7790a42 Mon Sep 17 00:00:00 2001 From: Braden Obrzut Date: Sat, 23 Jan 2016 21:47:20 -0500 Subject: [PATCH 07/14] - Improved DrawSwitchableImage keyslot condition to include key species. - Fixed: currentpos command would crash if not in game. --- src/c_cmds.cpp | 11 +++++++-- src/g_shared/sbarinfo_commands.cpp | 39 ++++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index 3cfbf1c650..233c31d298 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -1083,8 +1083,15 @@ CCMD(nextsecret) CCMD(currentpos) { AActor *mo = players[consoleplayer].mo; - Printf("Current player position: (%1.3f,%1.3f,%1.3f), angle: %1.3f, floorheight: %1.3f, sector:%d, lightlevel: %d\n", - FIXED2FLOAT(mo->X()), FIXED2FLOAT(mo->Y()), FIXED2FLOAT(mo->Z()), mo->angle/float(ANGLE_1), FIXED2FLOAT(mo->floorz), mo->Sector->sectornum, mo->Sector->lightlevel); + if(mo) + { + Printf("Current player position: (%1.3f,%1.3f,%1.3f), angle: %1.3f, floorheight: %1.3f, sector:%d, lightlevel: %d\n", + FIXED2FLOAT(mo->X()), FIXED2FLOAT(mo->Y()), FIXED2FLOAT(mo->Z()), mo->angle/float(ANGLE_1), FIXED2FLOAT(mo->floorz), mo->Sector->sectornum, mo->Sector->lightlevel); + } + else + { + Printf("You are not in game!"); + } } //----------------------------------------------------------------------------- diff --git a/src/g_shared/sbarinfo_commands.cpp b/src/g_shared/sbarinfo_commands.cpp index 7a874328f8..f91d5841cb 100644 --- a/src/g_shared/sbarinfo_commands.cpp +++ b/src/g_shared/sbarinfo_commands.cpp @@ -412,6 +412,21 @@ class CommandDrawSwitchableImage : public CommandDrawImage return compare != value; } } + // Key species are used to allow altnerates for existing key slots. + static FName LookupKeySpecies(int keynum) + { + for(unsigned int i = 0;i < PClass::m_Types.Size();++i) + { + const PClass *cls = PClass::m_Types[i]; + if(cls->IsDescendantOf(RUNTIME_CLASS(AKey))) + { + AKey *key = (AKey *)GetDefaultByType(cls); + if(key->KeyNumber == keynum) + return cls->TypeName; + } + } + return FName(); + } public: CommandDrawSwitchableImage(SBarInfo *script) : CommandDrawImage(script), @@ -442,6 +457,7 @@ class CommandDrawSwitchableImage : public CommandDrawImage condition = KEYSLOT; sc.MustGetToken(TK_IntConst); conditionalValue[0] = sc.Number; + keySpecies[0] = LookupKeySpecies(conditionalValue[0]); } else if(sc.Compare("armortype")) { @@ -468,6 +484,8 @@ class CommandDrawSwitchableImage : public CommandDrawImage { sc.MustGetToken(TK_IntConst); conditionalValue[1] = sc.Number; + if(condition == KEYSLOT) + keySpecies[1] = LookupKeySpecies(conditionalValue[1]); } else if(condition == ARMORTYPE) { @@ -541,11 +559,21 @@ class CommandDrawSwitchableImage : public CommandDrawImage if(item->IsKindOf(RUNTIME_CLASS(AKey))) { int keynum = static_cast(item)->KeyNumber; - - if(keynum == conditionalValue[0]) - found1 = true; - if(conditionAnd && keynum == conditionalValue[1]) // two keys - found2 = true; + if(keynum) + { + if(keynum == conditionalValue[0]) + found1 = true; + if(conditionAnd && keynum == conditionalValue[1]) // two keys + found2 = true; + } + else + { + FName species = item->GetSpecies(); + if(species == keySpecies[0]) + found1 = true; + if(conditionAnd && species == keySpecies[1]) + found2 = true; + } } } @@ -639,6 +667,7 @@ class CommandDrawSwitchableImage : public CommandDrawImage Operator conditionalOperator[2]; FString inventoryItem[2]; int armorType[2]; + FName keySpecies[2]; }; //////////////////////////////////////////////////////////////////////////////// From fd4440cfe4288f4e3b3f1610d8ce1ad981844169 Mon Sep 17 00:00:00 2001 From: Braden Obrzut Date: Sat, 23 Jan 2016 23:34:07 -0500 Subject: [PATCH 08/14] - Fixed: Intermissions with no screens (such as EndTitle) would result in a double wipe. --- src/intermission/intermission.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index a19d0a479c..44f52485c4 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -722,7 +722,10 @@ DIntermissionController::DIntermissionController(FIntermissionDescriptor *Desc, mScreen = NULL; mFirst = true; mGameState = state; - NextPage(); + + // If the intermission finishes straight away then cancel the wipe. + if(!NextPage()) + wipegamestate = GS_FINALE; } bool DIntermissionController::NextPage () From 67f644c898ee4057036d0fa3f2e8ad491c6f1aa8 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 24 Jan 2016 11:50:21 +0100 Subject: [PATCH 09/14] - fixed inverted NULL pointer check in A_SetAngle. - let COPY_AAPTR check the most common case AAPTR_DEFAULT first instead of running through all the other cases for it. --- src/actorptrselect.cpp | 2 ++ src/thingdef/thingdef_codeptr.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/actorptrselect.cpp b/src/actorptrselect.cpp index 774067550d..54c41e6ba2 100644 --- a/src/actorptrselect.cpp +++ b/src/actorptrselect.cpp @@ -32,6 +32,8 @@ AActor *COPY_AAPTR(AActor *origin, int selector) { + if (selector == AAPTR_DEFAULT) return origin; + if (origin) { if (origin->player) diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp index f61bd28257..ac1afcf495 100644 --- a/src/thingdef/thingdef_codeptr.cpp +++ b/src/thingdef/thingdef_codeptr.cpp @@ -4060,7 +4060,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SetAngle) ACTION_PARAM_INT(ptr, 2); AActor *ref = COPY_AAPTR(self, ptr); - if (ref != NULL) + if (ref == NULL) { ACTION_SET_RESULT(false); return; From 4b210a839a427d3aeb465a97bc7707a2f409bcbb Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 24 Jan 2016 14:43:55 +0200 Subject: [PATCH 10/14] Fixed uninitialized variable in IOKit controller handler --- src/posix/cocoa/i_joystick.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/posix/cocoa/i_joystick.cpp b/src/posix/cocoa/i_joystick.cpp index 9b9487cf68..c4bcc85c3e 100644 --- a/src/posix/cocoa/i_joystick.cpp +++ b/src/posix/cocoa/i_joystick.cpp @@ -157,8 +157,9 @@ private: IOHIDElementCookie cookie; int32_t value; - DigitalButton(const IOHIDElementCookie cookie) + explicit DigitalButton(const IOHIDElementCookie cookie) : cookie(cookie) + , value(0) { } }; From 1721d70212f9543985569bd06690409b6b51d1dc Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 24 Jan 2016 14:44:47 +0000 Subject: [PATCH 11/14] - Removed duplicate autoskip code. --- src/wi_stuff.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index e931b33fd4..09861086be 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -1096,6 +1096,11 @@ void WI_End () } } +bool WI_autoSkip() +{ + return wi_autoadvance > 0 && bcnt > (wi_autoadvance * TICRATE); +} + void WI_initNoState () { state = NoState; @@ -1114,7 +1119,7 @@ void WI_updateNoState () else { bool noauto = noautostartmap; - bool autoskip = (wi_autoadvance > 0 && bcnt > (wi_autoadvance * TICRATE)); + bool autoskip = WI_autoSkip(); for (int i = 0; !noauto && i < MAXPLAYERS; ++i) { @@ -1254,7 +1259,7 @@ void WI_updateDeathmatchStats () int i; bool stillticking; - bool autoskip = (wi_autoadvance > 0 && bcnt > (wi_autoadvance * TICRATE)); + bool autoskip = WI_autoSkip(); WI_updateAnimatedBack(); @@ -1506,7 +1511,7 @@ void WI_updateNetgameStats () int i; int fsum; bool stillticking; - bool autoskip = (wi_autoadvance > 0 && bcnt > (wi_autoadvance * TICRATE)); + bool autoskip = WI_autoSkip(); WI_updateAnimatedBack (); From 4d225e7a009454cc97e48db2118b0485ded577f3 Mon Sep 17 00:00:00 2001 From: Braden Obrzut Date: Sun, 24 Jan 2016 23:03:59 -0500 Subject: [PATCH 12/14] - Fixed: Mac GCC errors due to not recognizing the newly disabled warnings. --- dumb/CMakeLists.txt | 5 ++++- src/CMakeLists.txt | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/dumb/CMakeLists.txt b/dumb/CMakeLists.txt index fd8cdd9686..7b303297c1 100644 --- a/dumb/CMakeLists.txt +++ b/dumb/CMakeLists.txt @@ -8,7 +8,10 @@ include( CheckCXXCompilerFlag ) set( CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG -DDEBUGMODE=1" ) if( ZD_CMAKE_COMPILER_IS_GNUC_COMPATIBLE ) - set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-pointer-sign -Wno-uninitialized -Wno-unused-but-set-variable" ) + set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-pointer-sign -Wno-uninitialized" ) + if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.5") + set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable" ) + endif(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.5") endif( ZD_CMAKE_COMPILER_IS_GNUC_COMPATIBLE ) CHECK_FUNCTION_EXISTS( itoa ITOA_EXISTS ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 40503f8e95..6de8feabc0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -459,8 +459,12 @@ if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) set( CMAKE_CXX_FLAGS_MINSIZEREL "${REL_CXX_FLAGS} ${CMAKE_CXX_FLAGS_MINSIZEREL}" ) set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${REL_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" ) - set( CMAKE_C_FLAGS "-Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-result ${CMAKE_C_FLAGS}" ) - set( CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-result ${CMAKE_CXX_FLAGS}" ) + if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.5") + set( CMAKE_C_FLAGS "-Wno-unused-result ${CMAKE_C_FLAGS}" ) + set( CMAKE_CXX_FLAGS "-Wno-unused-result ${CMAKE_CXX_FLAGS}" ) + endif(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.5") + set( CMAKE_C_FLAGS "-Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-missing-field-initializers ${CMAKE_C_FLAGS}" ) + set( CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-missing-field-initializers ${CMAKE_CXX_FLAGS}" ) # Remove extra warnings when using the official DirectX headers. # Also, TDM-GCC 4.4.0 no longer accepts glibc-style printf formats as valid, From cef2cf4e6dc2ba391e80c1dfb5859c2066853913 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 25 Jan 2016 18:58:23 +0100 Subject: [PATCH 13/14] fixed parameter count for Sector_SetDamage. --- src/actionspecials.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actionspecials.h b/src/actionspecials.h index 752ef77ebd..d1c72c1add 100644 --- a/src/actionspecials.h +++ b/src/actionspecials.h @@ -193,7 +193,7 @@ DEFINE_SPECIAL(Transfer_FloorLight, 210, -1, -1, 1) DEFINE_SPECIAL(Transfer_CeilingLight, 211, -1, -1, 1) DEFINE_SPECIAL(Sector_SetColor, 212, 4, 5, 5) DEFINE_SPECIAL(Sector_SetFade, 213, 4, 4, 4) -DEFINE_SPECIAL(Sector_SetDamage, 214, 3, 3, 3) +DEFINE_SPECIAL(Sector_SetDamage, 214, 3, 5, 5) DEFINE_SPECIAL(Teleport_Line, 215, 2, 3, 3) DEFINE_SPECIAL(Sector_SetGravity, 216, 3, 3, 3) DEFINE_SPECIAL(Stairs_BuildUpDoom, 217, 5, 5, 5) From cf43eb6c6dd1bfbbccbbd7de2c5e9dbce473efd5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 25 Jan 2016 21:08:09 +0100 Subject: [PATCH 14/14] - limit particle size to 127 --- src/p_acs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 931f3a1277..ff968d62f2 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -6012,7 +6012,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) startalpha = clamp(startalpha, 0, 0xFF); // Clamp to byte lifetime = clamp(lifetime, 0, 0xFF); // Clamp to byte fadestep = clamp(fadestep, -1, 0xFF); // Clamp to byte inc. -1 (indicating automatic) - size = clamp(size, 0, 0xFF); // Clamp to byte + size = clamp(size, 0, 127); // Clamp to byte if (lifetime != 0) P_SpawnParticle(x, y, z, xvel, yvel, zvel, color, fullbright, startalpha, lifetime, size, fadestep, accelx, accely, accelz);