Commit graph

10171 commits

Author SHA1 Message Date
Kp d550cfe680 Remove struct side 2018-12-13 02:31:38 +00:00
Kp a54c323e45 Remove v16_segment definition
Support for v16_segment was declared broken in 6d0d68d188.  No one
objected.  Remove the definition to simplify future work.
2018-12-13 02:31:38 +00:00
Kp 706a704c6d Move unique_side to unique_segment 2018-12-13 02:31:38 +00:00
Kp 1d550ec0df Fix check_header_includes=1 build 2018-12-13 02:31:38 +00:00
Kp a705104e84 Check PHYSFS_init return value
PHYSFS_init is not guaranteed to succeed.  Using PHYSFS functions after
PHYSFS_init fails is likely to fail badly.  On Windows, failure may take
the form of a crash in ntdll.  Avoid this by exiting gracefully.
2018-12-08 23:36:18 +00:00
Kp d83972dfbb Hide game window when advancing a dead player to the next level
Commit 88b5e616a9 ("Replace calls to
window_set_visible in DoPlayerDead() with stop/start_time()") switched
from hiding the game window to only stopping time, and that only if
hiding the window would have stopped time.  In multiplayer, this allows
time to continue running.  This introduced a crash if the player dies
during the mine countdown.  When the player dies, the game checks if the
reactor has been destroyed.  If so, the game immediately advances to the
next level.  That advance will try to draw the game window if it is
visible.  When the window is drawn, if time is not stopped, then game
logic runs.  Some of that logic is not prepared to deal with the
inconsistent state present when a new level is only partially loaded.
That inconsistent state then causes a crash.  Call stack:

    #11 slew_frame () at similar/main/slew.cpp:152
    #12 in d2x::object_move_one () at similar/main/object.cpp:1758
    #13 in d2x::object_move_all () at similar/main/object.cpp:1956
    #14 in d2x::GameProcessFrame () at similar/main/game.cpp:1848
    #15 d2x::game_handler () at similar/main/game.cpp:1615
    #16 in dcx::window_send_event () at common/include/window.h:116
    #17 dcx::event_process () at common/arch/sdl/event.cpp:176
    #18 in newmenu_do2 () at similar/main/newmenu.cpp:498
    #19 in newmenu_do2<dcx::unused_newmenu_userdata_t> () at common/main/newmenu.h:184
    #20 newmenu_do<dcx::unused_newmenu_userdata_t const> () at common/main/newmenu.h:190
    #21 newmenu_do<1ul, dcx::unused_newmenu_userdata_t const> () at common/main/newmenu.h:196
    #22 net_udp_wait_for_requests () at similar/main/net_udp.cpp:4563
    #23 net_udp_level_sync () at similar/main/net_udp.cpp:4607
    #24 in multi_level_sync () at similar/main/multi.cpp:3458
    #25 in d2x::StartNewLevelSub () at similar/main/gameseq.cpp:1803
    #26 in d2x::StartNewLevel () at similar/main/gameseq.cpp:2018
    #27 in d2x::AdvanceLevel () at similar/main/gameseq.cpp:1648
    #28 in d2x::DoPlayerDead () at similar/main/gameseq.cpp:1721

The root cause of this is the layering violation:
- Killing the player can have the side effect of advancing the level
- Advancing the level can have the side effect of calling multiplayer code while the level data is in an inconsistent state
- Calling multiplayer code can cause the event system to redraw the game
- Redrawing the game can cause game logic to run

Hack around this by restoring the logic that hides the game window, so
that the window is not redrawn and the game logic is not run.  This does
not fix the layering problem, but prevents crashing affected users.  To
avoid undoing the feature from the breaking commit, hide the window only
when advancing to a new level, rather than unconditionally.  A player
advancing to a new level already lacks the move-at-cold-start capability
even on successfully escaping the mine, so no functionality is lost with
this change.  Players who are dead and do not advance to a new level
retain that capability.

Fixes: 88b5e616a9 ("Replace calls to window_set_visible in DoPlayerDead() with stop/start_time()")
Reported-by: Ninjared <https://forum.dxx-rebirth.com/showthread.php?tid=1097>
2018-12-08 19:16:01 +00:00
Kp 5a64ee5132 Add experimental support for larger cooperative games
- Raise the player limit to 8.
- Remove the logic that forces player counts up/down when switching
  between cooperative and deathmatch game modes.
- Add heuristics to add start positions for the extra players, since
  standard maps will not have the required number of starts.
2018-12-03 04:25:11 +00:00
Kp 24cc62caa3 Increase version to 0.61.0
Using 0.59.100 on master, which is well ahead of the 0.59.100 beta tag,
leads to confusing reports.  Raise the version number to disambiguate
this.
2018-12-01 17:14:52 +00:00
Kp 35d91d389a Raise player life count storage from uint8_t to uint16_t
Reported-by: Buff Skeleton <https://forum.dxx-rebirth.com/showthread.php?tid=1096>
2018-12-01 01:58:37 +00:00
Kp 2dd52b4699 Fix bogus "Game Over" when dying with the maximum number of lives
Reported-by: Buff Skeleton <https://forum.dxx-rebirth.com/showthread.php?tid=1096>
2018-12-01 01:58:37 +00:00
Kp 9f460e89a5 Skip exploding walls during demo playback
Demo playback manages the exploding walls explicitly.  Running the
normal exploding wall logic alongside the forced playback corrupts level
state.

Reported-by: _madness <https://forum.dxx-rebirth.com/showthread.php?tid=1095>
Fixes: 36ada21c0c ("Fold exploding walls into regular walls")
2018-12-01 01:58:37 +00:00
Kp f6352e7957 Pass correct object to check_effect_blowup
`check_effect_blowup` should receive the `laser_info` of the weapon that
caused the blast.  Previously, it was given the `laser_info` of the
parent of that weapon.  The parent was not of type `OBJ_WEAPON`, so
passing its `laser_info` is meaningless.

Fixes: 9bd1ba7c47
2018-11-01 02:41:30 +00:00
Kp 4d3612e453 Do not modify UserBuildSettings in SConf
Creating an attribute on UserBuildSettings during SConf breaks
clean/help, which do not run configure tests.  Remove that and add a
method to return the value the attribute would have had.

Reported-by: derhass <https://github.com/dxx-rebirth/dxx-rebirth/issues/412>
Fixes: 1be414217c ("Add build time flag to choose whether to enable ADL MIDI support")
2018-10-21 20:09:49 +00:00
Kp a0ed5cb283 Pass Vclip as context 2018-10-21 00:24:07 +00:00
Kp 991f72a775 Add fwd-vclip.h 2018-10-21 00:24:07 +00:00
Kp d1092f3ea2 Adjust release note about ADL MIDI support
"adlmidi"[1] and "libADLMIDI"[2] are different projects.  Only the latter is
targeted by the contributed feature.  Adjust the release note to use the
name of the latter instead of letting readers guess which project is
intended.

[1]: https://github.com/bisqwit/adlmidi
[2]: https://github.com/Wohlstand/libADLMIDI

Reported-by: Wohlstand <https://github.com/dxx-rebirth/dxx-rebirth/issues/407#issuecomment-430997300>
Fixes: a76487405c ("Make ADL MIDI runtime configurable")
2018-10-21 00:24:07 +00:00
Kp 89b9561617 Remove explicit std::move in prepare_mission_menu_state return
clang warns that this interferes with copy elision.  The generated code
is slightly worse after following clang's advice and removing this, but
this is not a hot path, so take the hit to silence clang instead of
complicating the source.

Fixes: d97afc2ad5 ("Retain directory structure in New Game dialog")
2018-10-20 17:25:59 +00:00
Kp 7e9ec36018 Fix gcc-4.9 build of similar/main/net_udp.cpp
gcc-4.9 std::array::size() is `constexpr`, but gcc-4.9 refuses to
initialize a local `constexpr std::size_t` from the result of calling
`size()` on a `std::array`.  Later gcc permit this.  gcc-8 generates the
same code whether the variable is `constexpr std::size_t` or `const
std::size_t`, and the latter allows gcc-4.9 to build, so remove
`constexpr` and use plain `const`.

Reported-by: joolswills <https://github.com/dxx-rebirth/dxx-rebirth/issues/411>
Fixes: 91d6285751 ("Factor out shortening game/mission names")
2018-10-20 17:25:59 +00:00
Kp ea5020a773 Fix gcc-4.9 build of similar/main/wall.cpp
gcc-4.9 shipped without support for std::is_trivially_move_assignable.
This is only needed in a sanity check, so preprocess it out when using a
gcc below gcc-5.

Reported-by: joolswills <https://github.com/dxx-rebirth/dxx-rebirth/issues/411>
Fixes: 57334255ac ("Simplify stuck object cleanup")
2018-10-20 17:25:59 +00:00
Kp 04569ebba5 Fix clang warning about using %hu with unsigned
gcc permits this, but clang complains.  Match the format specifier to
the type of the underlying temporary variable.

Fixes: a65068fed1 ("Move OGL RLE bitmap buffer to stack")
2018-10-20 17:25:59 +00:00
Kp 931ea05f41 Merge branch experimental/adlmidi into master
Add experimental support for using ADL MIDI instead of SDL for music
playback.  Support for ADL MIDI contributed by Github user jpcima.  This
feature is minimally supported by the core Rebirth team, but is included
as a courtesy so that users need not patch in support separately.

Suggested-by: jpcima <https://github.com/dxx-rebirth/dxx-rebirth/pull/408>
2018-10-18 02:19:15 +00:00
Kp a76487405c Make ADL MIDI runtime configurable
Add configuration file entries for number of chips, bank index, and
whether to use ADL MIDI.  Currently, there is no GUI for this.
Interested users must enable it via direct configuration file editing.
A menu interface will come later.
2018-10-18 02:18:56 +00:00
Kp 1be414217c Add build time flag to choose whether to enable ADL MIDI support
Since ADL MIDI is not packaged on some distributions, default the option
to off.
2018-10-15 00:51:53 +00:00
Kp 1b50c31f55 Rework ADL dynamic loader
- Use the Windows type `HMODULE` on Windows, and define a local alias to
  it on non-Windows.  This makes the code slightly clearer about the
  nature of the value `handle`.
- Move the `dlopen` emulation into the anonymous namespace to encourage
  inlining, since the wrappers are trivial name/signature compatibility
  functions.
- Move the error reporting out of the template function, so that it is
  not redundantly instantiated for each type used with the template.
2018-10-15 00:51:53 +00:00
Kp d9034ea609 Remove explicit =nullptr in ADL function pointers
Global data will default to nullptr, so the initialization is
unnecessary.  Some compilers may store the pointer in `.data` when it is
initialized to any value.
2018-10-15 00:51:53 +00:00
Kp 915bf4e0ba Remove unused adl_openBankFile 2018-10-15 00:51:53 +00:00
Kp 787d95241c Fix crash after pausing movie
The movie code assumes that when the topmost window is closed, that
window must have been the movie window, and that the movie data can now
be freed.  However, if the movie is paused, a new topmost window is
created to tell the user that the movie is paused.  When that topmost
pause window is deleted, the movie code frees the movie data, even
though the movie is not done.  Corruption ensues, ultimately leading to
a crash.

Reported-by: Jayman2000 <https://github.com/dxx-rebirth/dxx-rebirth/issues/410>
2018-10-10 02:01:12 +00:00
Kp fe77949a82 Vary marker spin 2018-10-08 03:58:48 +00:00
Kp e1d1cbb0ed Pass context to set_powerup_id 2018-10-08 03:58:48 +00:00
Kp e9c9943470 Pass context to update_object_seg 2018-10-08 03:58:48 +00:00
Kp 9360a41816 Move Guided_missile into d_level_object_state 2018-10-08 03:58:48 +00:00
JP Cimalando ccb91d7362 allow libADLMIDI to be loaded dynamically 2018-10-08 05:02:02 +02:00
JP Cimalando 00a57d5a28 fix how the adlmidi music is looped 2018-10-05 14:23:43 +02:00
JP Cimalando ba8c8ac5a7 apply a few changes as suggested by @vLKp 2018-10-05 14:20:13 +02:00
JP Cimalando cabe06e895 WIP ADLMIDI 2018-10-04 12:06:27 +02:00
Kp eab2bf4105 Enable -Wduplicated-branches, -Wduplicated-cond when supported 2018-10-01 03:52:05 +00:00
Kp 75fd917980 Fix truecolor handling in mve playback
This has been broken for more than 5 years and no one reported it.
Perhaps truecolor movies are not used.

Fixes: acb664ae40 ("Use proper type for mve backbuffers")
2018-10-01 03:52:05 +00:00
Kp 3b168b38fd Make Viewer const object *
Viewing should not change anything.
2018-09-25 03:44:09 +00:00
Kp 91d6285751 Factor out shortening game/mission names 2018-09-22 04:31:21 +00:00
Kp 406be26de4 Pass d_level_shared_segment_state to validate_segment_all 2018-09-19 02:13:30 +00:00
Kp f7ad4d9b1a Pass segments to find_point_seg 2018-09-19 02:13:30 +00:00
Kp 9ebb32c111 Pass d_level_shared_segment_state to trace_segs 2018-09-19 02:13:30 +00:00
Kp c2944896de Pass vertex factory to create_shortpos_native 2018-09-19 02:13:30 +00:00
Kp 9cedc53f52 Pass vertex factory to extract_orient_from_segment 2018-09-19 02:13:30 +00:00
Kp 1527785efd Pass vertex factory to validate_segment_side 2018-09-19 02:13:29 +00:00
Kp adf41c19c2 Pass vertex factory to check_for_degenerate_segment 2018-09-19 02:13:29 +00:00
Kp 68de87c0e5 Pass vertex factory to check_for_degenerate_side 2018-09-19 02:13:29 +00:00
Kp d71938e1a7 Pass vertex factory to create_walls_on_side 2018-09-19 02:13:29 +00:00
Kp bd58d5f825 Pass vertex factory to extract_*_vector_from_segment 2018-09-19 02:13:29 +00:00
Kp 82a2fa525c Pass Robot_info, valptridx factories to more methods 2018-09-19 02:13:29 +00:00