Merge commit 'refs/pull/657/head' into master

This commit is contained in:
Kp 2022-08-23 02:13:01 +00:00
commit 366b048879
7 changed files with 59 additions and 5 deletions

View file

@ -148,6 +148,8 @@ void kconfig_end_loop(control_info &, const fix frametime);
#define CONTROL_USING_JOYSTICK 1
#define CONTROL_USING_MOUSE 2
#define MOUSEFS_DELTA_RANGE 512
#define LOCKED_PITCH_FACTOR 2
#define FREE_PITCH_FACTOR 1
#ifdef dsx
namespace dsx {
#if defined(DXX_BUILD_DESCENT_I)

View file

@ -108,7 +108,7 @@ enum class multiplayer_data_priority : uint8_t
#define MULTI_PROTO_UDP 1 // UDP protocol
// What version of the multiplayer protocol is this? Increment each time something drastic changes in Multiplayer without the version number changes. Reset to 0 each time the version of the game changes
#define MULTI_PROTO_VERSION static_cast<uint16_t>(15)
#define MULTI_PROTO_VERSION static_cast<uint16_t>(16)
// PROTOCOL VARIABLES AND DEFINES - END
// limits for Packets (i.e. positional updates) per sec
@ -836,6 +836,7 @@ struct netgame_info : prohibit_void_ptr<netgame_info>
ubyte team_vector;
uint8_t SecludedSpawns;
uint8_t MouselookFlags;
uint8_t PitchLockFlags;
uint32_t AllowedItems;
packed_spawn_granted_items SpawnGrantedItems;
packed_netduplicate_items DuplicatePowerups;

View file

@ -159,6 +159,7 @@ struct player_config : prohibit_void_ptr<player_config>
HudType HudMode;
RespawnPress RespawnMode;
uint8_t MouselookFlags;
uint8_t PitchLockFlags;
using primary_weapon_order = std::array<uint8_t, MAX_PRIMARY_WEAPONS + 1>;
using secondary_weapon_order = std::array<uint8_t, MAX_SECONDARY_WEAPONS + 1>;
primary_weapon_order PrimaryOrder;

View file

@ -1082,6 +1082,18 @@ static unsigned allow_uncapped_turning()
: MouselookMode::MPAnarchy);
}
static unsigned release_pitch_lock()
{
const auto game_mode = Game_mode;
if(!(game_mode & GM_MULTI)) {
return PlayerCfg.PitchLockFlags & MouselookMode::Singleplayer;
}
return PlayerCfg.PitchLockFlags &
Netgame.PitchLockFlags &
((game_mode & GM_MULTI_COOP) ? MouselookMode::MPCoop : MouselookMode::MPAnarchy);
}
}
}
@ -1264,9 +1276,14 @@ void kconfig_end_loop(control_info &Controls, const fix frametime)
//------------ Read pitch_time -----------
if ( !Controls.state.slide_on )
{
// From keyboard...
adjust_ramped_keyboard_field(plus, key_pitch_forward, Controls.pitch_time, PlayerCfg.KeyboardSens[player_config_keyboard_index::pitch_ud], speed_factor, 2);
adjust_ramped_keyboard_field(minus, key_pitch_backward, Controls.pitch_time, PlayerCfg.KeyboardSens[player_config_keyboard_index::pitch_ud], speed_factor, 2);
auto pitch_factor = LOCKED_PITCH_FACTOR;
if (release_pitch_lock())
pitch_factor = FREE_PITCH_FACTOR;
// From keyboard...
adjust_ramped_keyboard_field(plus, key_pitch_forward, Controls.pitch_time, PlayerCfg.KeyboardSens[player_config_keyboard_index::pitch_ud], speed_factor, pitch_factor);
adjust_ramped_keyboard_field(minus, key_pitch_backward, Controls.pitch_time, PlayerCfg.KeyboardSens[player_config_keyboard_index::pitch_ud], speed_factor, pitch_factor);
// From joystick...
#ifdef dxx_kconfig_ui_kc_joystick_pitch_ud
adjust_axis_field(Controls.pitch_time, joy_axis, kcm_joystick[dxx_kconfig_ui_kc_joystick_pitch_ud].value, kcm_joystick[dxx_kconfig_ui_kc_joystick_invert_pitch].value, PlayerCfg.JoystickSens[player_config_joystick_index::pitch_ud]);
@ -1396,7 +1413,11 @@ void kconfig_end_loop(control_info &Controls, const fix frametime)
clamp_kconfig_control_with_overrun(Controls.forward_thrust_time, frametime, Controls.excess_forward_thrust_time, frametime * PlayerCfg.MouseOverrun[player_config_mouse_index::throttle]);
if (!allow_uncapped_turning())
{
clamp_kconfig_control_with_overrun(Controls.pitch_time, frametime / 2, Controls.excess_pitch_time, frametime * PlayerCfg.MouseOverrun[player_config_mouse_index::pitch_ud]);
auto pitch_frametime = frametime / LOCKED_PITCH_FACTOR;
if(release_pitch_lock()) {
pitch_frametime = frametime / FREE_PITCH_FACTOR;
}
clamp_kconfig_control_with_overrun(Controls.pitch_time, pitch_frametime, Controls.excess_pitch_time, frametime * PlayerCfg.MouseOverrun[player_config_mouse_index::pitch_ud]);
clamp_kconfig_control_with_overrun(Controls.heading_time, frametime, Controls.excess_heading_time, frametime * PlayerCfg.MouseOverrun[player_config_mouse_index::turn_lr]);
clamp_kconfig_control_with_overrun(Controls.bank_time, frametime, Controls.excess_bank_time, frametime * PlayerCfg.MouseOverrun[player_config_mouse_index::bank_lr]);
}

View file

@ -1631,6 +1631,11 @@ class input_config_menu_items
DXX_MENUITEM(VERB, CHECK, "Multi Coop (if host allows)", opt_ic_mouselook_mp_cooperative, PlayerCfg.MouselookFlags & MouselookMode::MPCoop) \
DXX_MENUITEM(VERB, CHECK, "Multi Anarchy (if host allows)", opt_ic_mouselook_mp_anarchy, PlayerCfg.MouselookFlags & MouselookMode::MPAnarchy) \
DXX_MENUITEM(VERB, TEXT, "", opt_label_blank_mouselook) \
DXX_MENUITEM(VERB, TEXT, "Release pitch lock:", opt_label_pitch_lock_mode) \
DXX_MENUITEM(VERB, CHECK, "Single player", opt_ic_pitch_lock_sp, PlayerCfg.PitchLockFlags & MouselookMode::Singleplayer) \
DXX_MENUITEM(VERB, CHECK, "Multi Coop (if host allows)", opt_ic_pitch_lock_mp_coop, PlayerCfg.PitchLockFlags & MouselookMode::MPCoop) \
DXX_MENUITEM(VERB, CHECK, "Multi Anarchy (if host allows)", opt_ic_pitch_lock_mp_anarchy, PlayerCfg.PitchLockFlags & MouselookMode::MPAnarchy) \
DXX_MENUITEM(VERB, TEXT, "", opt_label_blank_rotational_setting) \
DXX_MENUITEM(VERB, MENU, "GAME SYSTEM KEYS", opt_ic_help0) \
DXX_MENUITEM(VERB, MENU, "NETGAME SYSTEM KEYS", opt_ic_help1) \
DXX_MENUITEM(VERB, MENU, "DEMO SYSTEM KEYS", opt_ic_help2) \
@ -1678,6 +1683,7 @@ window_event_result input_config_menu::event_handler(const d_event &event)
{
const auto citem = static_cast<const d_change_event &>(event).citem;
MouselookMode mousemode;
MouselookMode pitchlock;
#if DXX_MAX_JOYSTICKS
if (citem == opt_ic_usejoy)
{
@ -1717,6 +1723,15 @@ window_event_result input_config_menu::event_handler(const d_event &event)
else
PlayerCfg.MouselookFlags &= ~mousemode;
}
else if ((citem == opt_ic_pitch_lock_sp && (pitchlock = MouselookMode::Singleplayer, true)) ||
(citem == opt_ic_pitch_lock_mp_coop && (pitchlock = MouselookMode::MPCoop, true)) ||
(citem == opt_ic_pitch_lock_mp_anarchy && (pitchlock = MouselookMode::MPAnarchy, true))) {
if (items[citem].value)
PlayerCfg.PitchLockFlags |= pitchlock;
else
PlayerCfg.PitchLockFlags &= ~pitchlock;
}
break;
}
case EVENT_NEWMENU_SELECTED:

View file

@ -2853,6 +2853,7 @@ static uint_fast32_t net_udp_prepare_heavy_game_info(const _sockaddr *addr, ubyt
buf[len] = Netgame.PacketLossPrevention; len++;
buf[len] = Netgame.NoFriendlyFire; len++;
buf[len] = Netgame.MouselookFlags; len++;
buf[len] = Netgame.PitchLockFlags; len++;
copy_from_ntstring(buf, len, Netgame.game_name);
copy_from_ntstring(buf, len, Netgame.mission_title);
copy_from_ntstring(buf, len, Netgame.mission_name);
@ -3108,6 +3109,7 @@ static void net_udp_process_game_info(const uint8_t *data, uint_fast32_t, const
Netgame.PacketLossPrevention = data[len]; len++;
Netgame.NoFriendlyFire = data[len]; len++;
Netgame.MouselookFlags = data[len]; len++;
Netgame.PitchLockFlags = data[len]; len++;
copy_to_ntstring(data, len, Netgame.game_name);
copy_to_ntstring(data, len, Netgame.mission_title);
copy_to_ntstring(data, len, Netgame.mission_name);
@ -3609,6 +3611,7 @@ constexpr std::integral_constant<unsigned, 5 * reactor_invul_time_mini_scale> re
DXX_MENUITEM(VERB, CHECK, "Show enemy names on HUD", opt_show_names, Netgame.ShowEnemyNames) \
DXX_MENUITEM(VERB, CHECK, "No friendly fire (Team, Coop)", opt_ffire, Netgame.NoFriendlyFire) \
DXX_MENUITEM(VERB, FCHECK, game_is_cooperative ? "Allow coop mouselook" : "Allow anarchy mouselook", opt_mouselook, Netgame.MouselookFlags, MouselookMPFlag(game_is_cooperative)) \
DXX_MENUITEM(VERB, FCHECK, game_is_cooperative ? "Release coop pitch lock" : "Release anarchy pitch lock", opt_pitch_lock, Netgame.PitchLockFlags, MouselookMPFlag(game_is_cooperative)) \
DXX_MENUITEM(VERB, TEXT, "", blank_4) \
DXX_MENUITEM_AUTOSAVE_LABEL_INPUT(VERB) \
DXX_MENUITEM(VERB, TEXT, "", blank_6) \
@ -4241,6 +4244,7 @@ window_event_result net_udp_setup_game()
Netgame.PacketLossPrevention = 1;
Netgame.NoFriendlyFire = 0;
Netgame.MouselookFlags = 0;
Netgame.PitchLockFlags = 0;
#if DXX_USE_TRACKER
Netgame.Tracker = 1;

View file

@ -81,6 +81,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#define PacketsPerSecStr "PacketsPerSec"
#define NoFriendlyFireStr "NoFriendlyFire"
#define MouselookFlagsStr "Mouselook"
#define PitchLockFlagsStr "PitchLockRelease"
#define AutosaveIntervalStr "AutosaveInterval"
#define TrackerStr "Tracker"
#define TrackerNATHPStr "trackernat"
@ -173,6 +174,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#define TOGGLES_CLOAKINVULTIMER_NAME_TEXT "cloakinvultimer"
#define TOGGLES_RESPAWN_ANY_KEY "respawnkey"
#define TOGGLES_MOUSELOOK "mouselook"
#define TOGGLES_PITCH_LOCK "pitchlock"
#define TOGGLES_THIEF_ABSENCE_SP "thiefabsent"
#define TOGGLES_THIEF_NO_ENERGY_WEAPONS_SP "thiefnoenergyweapons"
#define TOGGLES_AUTOSAVE_INTERVAL_SP "autosaveinterval"
@ -229,6 +231,7 @@ void new_player_config()
PlayerCfg.ControlType=0; // Assume keyboard
PlayerCfg.RespawnMode = RespawnPress::Any;
PlayerCfg.MouselookFlags = 0;
PlayerCfg.PitchLockFlags = 0;
PlayerCfg.KeySettings = DefaultKeySettings;
PlayerCfg.KeySettingsRebirth = DefaultKeySettingsRebirth;
kc_set_controls();
@ -482,6 +485,7 @@ static void read_player_dxx(const char *filename)
else if (!strcmp(line,TOGGLES_HEADER_TEXT))
{
PlayerCfg.MouselookFlags = 0;
PlayerCfg.PitchLockFlags = 0;
#if defined(DXX_BUILD_DESCENT_II)
PlayerCfg.ThiefModifierFlags = 0;
#endif
@ -536,6 +540,8 @@ static void read_player_dxx(const char *filename)
PlayerCfg.RespawnMode = static_cast<RespawnPress>(atoi(value));
else if (!strcmp(line, TOGGLES_MOUSELOOK))
PlayerCfg.MouselookFlags = strtoul(value, 0, 10);
else if (!strcmp(line, TOGGLES_PITCH_LOCK))
PlayerCfg.PitchLockFlags = strtoul(value, 0, 10);
}
}
else if (!strcmp(line,GRAPHICS_HEADER_TEXT))
@ -845,6 +851,7 @@ static int write_player_dxx(const char *filename)
PHYSFSX_printf(fout,TOGGLES_CLOAKINVULTIMER_NAME_TEXT "=%i\n",PlayerCfg.CloakInvulTimer);
PHYSFSX_printf(fout,TOGGLES_RESPAWN_ANY_KEY "=%i\n",static_cast<unsigned>(PlayerCfg.RespawnMode));
PHYSFSX_printf(fout, TOGGLES_MOUSELOOK "=%i\n", PlayerCfg.MouselookFlags);
PHYSFSX_printf(fout, TOGGLES_PITCH_LOCK "=%i\n", PlayerCfg.PitchLockFlags);
PHYSFSX_puts_literal(fout,
END_TEXT "\n"
GRAPHICS_HEADER_TEXT "\n"
@ -1713,6 +1720,8 @@ void read_netgame_profile(netgame_info *ng)
convert_integer(ng->NoFriendlyFire, value);
else if (cmp(lb, eq, MouselookFlagsStr))
convert_integer(ng->MouselookFlags, value);
else if (cmp(lb, eq, PitchLockFlagsStr))
convert_integer(ng->PitchLockFlags, value);
else if (cmp(lb, eq, AutosaveIntervalStr))
{
uint16_t AutosaveInterval;
@ -1764,6 +1773,7 @@ void write_netgame_profile(netgame_info *ng)
PHYSFSX_printf(file, PacketsPerSecStr "=%i\n", ng->PacketsPerSec);
PHYSFSX_printf(file, NoFriendlyFireStr "=%i\n", ng->NoFriendlyFire);
PHYSFSX_printf(file, MouselookFlagsStr "=%i\n", ng->MouselookFlags);
PHYSFSX_printf(file, PitchLockFlagsStr "=%i\n", ng->PitchLockFlags);
PHYSFSX_printf(file, AutosaveIntervalStr "=%i\n", ng->MPGameplayOptions.AutosaveInterval.count());
#if DXX_USE_TRACKER
PHYSFSX_printf(file, TrackerStr "=%i\n", ng->Tracker);