Define it where it is first used.
Skip adjusting damage in cases where it will not be used.
Fix obvious copy&paste error from Parallax.
if (condition)
statement; statement; statement;
is parsed as:
if (condition)
{
statement;
}
statement;
statement;
In context, all three statements were supposed to be guarded by the
condition. Add braces accordingly.
Using "type\nfunction(args)" confuses some parsing scripts. Switch to
the standard "type function(args)" style. Fix sites where keyword
"static" was used after the return type.
No caller passes a key value other than [KEY_F9, KEY_F12]. If one did,
an invalid array reference would occur. Restructure the code to return
on invalid inputs. This fixes a flow control analysis warning.
Mako88 reports that an unspecified environment fails to build
playsave.cpp. The failure is because PRIuFAST32 is undefined. In most
environments, SDL automatically includes inttypes.h, which provides
PRIuFAST32. In this unspecified environment, SDL does not include
inttypes.h. Include it explicitly to ensure the definition is
available.
As described in commit 674a921 ("Add workaround for Win32 wrong type for
size_t"), std::array on Win32 returns type std::size_t, which is
`unsigned int` instead of the `unsigned long` seen on Linux. Calling
std::min requires both arguments to have the same type. On Linux, this
required casting the result of size() to `unsigned` to match the other
input. On Win32, that cast provokes a -Wuseless-cast warning. Add a
workaround by removing the cast and instead explicitly setting the type
of std::min's arguments to `unsigned`, then relying on the compiler to
perform an implicit conversion from `unsigned long` to `unsigned int`
on Linux. The value is always small enough to fit in an `unsigned int`,
so no precision loss will occur.
Field width conversion `.*` always takes an `int`.
On Win32, casting `long` to `int` triggers a `-Wuseless-cast` warning.
Omitting the cast works correctly.
On Linux/amd64, casting `long` to `int` works correctly.
Omitting the cast triggers a `-Wformat` warning.
Add a macro that conditionally expands to `static_cast<int>` or to ``,
as necessary for the target platform.
Most 64-bit systems use `unsigned long` for `uint_fast32_t`. Some
32-bit systems use `unsigned int` for `uint_fast32_t`. To handle this,
write_netgame_profile used casts to `unsigned` and a format string of
`%u`. Switch to inttypes format macros so that the format strings are
correct without requiring a cast to handle systems where `uint_fast32_t`
is not `unsigned`.
Most 64-bit systems use `unsigned long` for `uint_fast32_t`. Some
32-bit systems use `unsigned int` for `uint_fast32_t`. To handle this,
multi_process_bigdata used casts to `unsigned long` and a format string
of `%lu`. Switch to inttypes format macros so that the format strings
are correct without requiring a cast to handle systems where
`uint_fast32_t` is not `unsigned long`.
Both Primary_weapon and Secondary_weapon should use the underlying enum
type. Primary_weapon uses its enum type now. Secondary_weapon will use
its enum type eventually. Add appropriate casts to newdemo.cpp to keep
it working when those changes are made.
The compiler may or may not recognize that the temporary T{} passed to
make_unique can be omitted. Help it by passing nothing, then explicitly
clearing the returned data as a separate step.
Mako88 reports that using `-pilot Mixed` on Windows causes crashes
during multiplayer setup, but `-pilot mixed` does not crash. This is
not reproducible on case sensitive filesystems, probably because case
sensitive systems recognize that `Mixed.plr` and `mixed.plr` are not the
same file. In both cases, the underlying plr file name was all
lowercase. Coerce the pilot name to lowercase when it is converted to a
plr file name. This also fixes a minor bug where the check for a
user-specified extension of `.plr` would recognize `-pilot alice.plr`,
but not recognize `-pilot alice.PLR`.
This is a workaround for a bug in the network code, which becomes
confused and crashes when the player's callsign contains mixed case.
Reported-by: Mako88 <https://github.com/dxx-rebirth/dxx-rebirth/issues/188>
Callers are expected to filter out invalid numbers. Even if they do
not, the only use of the number is to match entries in Stuck_objects.
An invalid match could cause a call to vobjptr() with an invalid index,
but that would be diagnosed by the valptridx checking, so no invalid
memory access will occur.
Many callers of kill_stuck_objects call it twice, once for each of two
walls. Move the flush_fcd_cache up to occur only once, rather than once
per wall.
After fixing the bogus lifeleft assignment, the D2 version is equivalent
to a more thorough version of the D1 version. Delete the D1 version and
use the D2 version for both games.
This assignment looks bogus. If the signature saved when the object
became stuck is different from the signature of the object currently
using that slot, then remove_obsolete_stuck_objects kills the object
using that slot. Signatures are defined to change when the object slot
is freed and reused. Therefore, this statement kills the new object
that took the slot of the obsolete object. This new object may be
important, such as a spawned robot or a weapon.
GCC std::array uses std::size_t for its size_type. On Linux/amd64,
`std::size_t` is `unsigned long`. On Win32, `std::size_t` is
`unsigned int`. This provokes format string warnings because an
unsigned int is passed where the format string declares an unsigned
long. On Win32, `unsigned int` and `unsigned long` are the same size,
so `unsigned long` could have been used to avoid this problem by
maintaining consistency with Linux, but it was not. This may have been
an attempt to achieve bug compatibility with Microsoft's types.
Add a workaround by defining a macro DXX_PRI_size_type in the style of
inttypes.h PRI* macros. Use an SConf test to determine the correct
value by inspecting which compilation runs succeed. Currently, Linux
needs "l", Win32 needs "", and Win64 needs "I64".