Remember player's hostages_on_board across secret level return

Returning from a secret level clears the player's `hostages_on_board` to
0 as part of initializing a "new" ship, but this is not desirable
behavior.  Copy the counter out before and back afterward.

    ```
    Thread 1 "d2x-rebirth-edi" hit Hardware watchpoint 1: -location d2x::LevelUniqueObjectState.Objects._M_elems[0].ctype.player_info.mission.hostages_on_board

    Old value = 5 '\005'
    New value = 0 '\000'

    #0  d2x::init_player_stats_ship (GameTime64=<optimized out>, plrobj=...) at similar/main/gameseq.cpp:613
    #1  d2x::init_player_stats_level (secret_flag=d2x::secret_restore::survived, plrobj=..., plr=...) at similar/main/gameseq.cpp:615
    #2  d2x::StartNewLevelSub (level_num=level_num@entry=3, page_in_textures=page_in_textures@entry=1, secret_flag=secret_flag@entry=d2x::secret_restore::survived) at similar/main/gameseq.cpp:1901
    #3  d2x::state_restore_all_sub (LevelSharedDestructibleLightState=..., secret=d2x::secret_restore::survived, filename=<optimized out>) at similar/main/state.cpp:1670
    #4  d2x::state_restore_all (in_game=in_game@entry=1, secret=secret@entry=d2x::secret_restore::survived, filename_override=<optimized out>, blind=blind@entry=dcx::blind_save::no) at similar/main/state.cpp:1490
    #5  d2x::ExitSecretLevel ()
    ```

Reported-by: teratorn <https://github.com/dxx-rebirth/dxx-rebirth/issues/495>
This commit is contained in:
Kp 2020-02-01 22:33:31 +00:00
parent 0ea0a5ff31
commit 8ebb66c5c9

View file

@ -1659,6 +1659,7 @@ int state_restore_all_sub(const d_level_shared_destructible_light_state &LevelSh
relocated_player_data rpd;
#if defined(DXX_BUILD_DESCENT_II)
player_info ret_pl_info;
ret_pl_info.mission.hostages_on_board = get_local_plrobj().ctype.player_info.mission.hostages_on_board;
#endif
{
#if DXX_USE_EDITOR
@ -1676,7 +1677,9 @@ int state_restore_all_sub(const d_level_shared_destructible_light_state &LevelSh
player dummy_player;
state_read_player(fp, dummy_player, swap, pl_info, rpd);
if (secret == secret_restore::survived) { // This means he didn't die, so he keeps what he got in the secret level.
const auto hostages_on_board = ret_pl_info.mission.hostages_on_board;
ret_pl_info = plrobj.ctype.player_info;
ret_pl_info.mission.hostages_on_board = hostages_on_board;
rpd.shields = plrobj.shields;
plr.level = dummy_player.level;
plr.time_level = dummy_player.time_level;