The game has an alternative level file format that is not normally used.
This format can enable seismic events on a timer, independent of reactor
countdown or earthshaker usage. However, this feature is not reset on
loading a regular level after playing a level with the timer-driven
seismic events, so the regular level shakes according to the timer, even
though its author never designed it to do so.
Fix that by resetting the timer state to 0 before loading a regular
level.
Level seismic events and Earthshaker seismic events start with different
intensities, but share everything afterward. Move the common parts to a
function.
When Next_seismic_sound_time is non-zero, a seismic sound is playing.
When Next_seismic_sound_time is zero, no sound is playing. Use this to
eliminate the explicit tracking variable Seismic_sound_playing.
Commit dc79bb8e4a intended to clean up processing guidebot messages,
but accidentally allowed the guidebot to report certain status messages
before its cage was opened. Normal missions still do not report these
messages, but some custom levels do.
Reported-by: ziplantil <https://github.com/dxx-rebirth/dxx-rebirth/issues/438>
Fixes: dc79bb8e4a ("Remove hack for bypassing buddy time restriction")
`explode_badass_player` can pass an OBJ_PLAYER, not an OBJ_WEAPON, as
`obj_explosion_origin`. Using `get_weapon_id` on a non-weapon is wrong
and provokes a diagnostic. The test tries to check if the passed object
is _not_ a flash missile. Players are not flash missiles, so maintain
the intended semantics by treating non-weapons as not-flash-missiles.
Reported-by: Johnsondr80 <https://github.com/dxx-rebirth/dxx-rebirth/issues/437>
`objp`, `obj`, and `obj0p` is not helpful when trying to reason about
the logic of this function. Rename them to `obj_explosion_origin`,
`obj_fireball`, and `obj_iter`, respectively.
Reading from Players[] while not in a game is not well-defined. Get the
local player's callsign from InterfaceUniqueState instead.
Reported-by: zicodxx <https://github.com/dxx-rebirth/dxx-rebirth/issues/435>
Fixes: bea95ce1df ("Reset definedness of per-game globals on new game")
It is reinitialized if the segment is a special segment, but not
reinitialized if the segment is a normal segment. Most segments are
normal segments. The absence of this initialization permitted players
to keep the value from a prior level. For normal segments, this would
normally not be a problem, because the value is only meaningful for
special segments. However, the netgame synchronization code always
mixes in the value of every station_idx, regardless of whether the
segment is a special segment. As a result, late-joining guests who
started directly onto the current level could disagree with the host
about the value, causing a synchronization mismatch. The host would be
wrong, but the guests would be blocked from joining. For this purpose,
late-joining includes both people who joined the campaign late and
people who left the game and restarted the program, even if they had
previously been in the game.
Reported-by: OldSaltyGamer <https://forum.dxx-rebirth.com/showthread.php?tid=1098&pid=12630#pid12630>
[ Possibly also previously reported by LightWolf, but that report never
had enough information to proceed. The report from OldSaltyGamer solved
this. ]
Fixes: 596ecbb38d ("Rename segment::value to segment::station_idx")
`flags` only needs to be 1 bit wide, so switch from `int` to `uint8_t`.
Shrinking to a single bit would not save more space, but would
complicate the code.