2006-03-20 17:12:09 +00:00
/*
2014-06-01 17:55:23 +00:00
* Portions of this file are copyright Rebirth contributors and licensed as
* described in COPYING . txt .
* Portions of this file are copyright Parallax Software and licensed
* according to the Parallax license below .
* See COPYING . txt for license details .
2006-03-20 17:12:09 +00:00
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ( " PARALLAX " ) . PARALLAX , IN DISTRIBUTING THE CODE TO
END - USERS , AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN , GRANTS A
ROYALTY - FREE , PERPETUAL LICENSE TO SUCH END - USERS FOR USE BY SUCH END - USERS
IN USING , DISPLAYING , AND CREATING DERIVATIVE WORKS THEREOF , SO LONG AS
SUCH USE , DISPLAY OR CREATION IS FOR NON - COMMERCIAL , ROYALTY OR REVENUE
FREE PURPOSES . IN NO EVENT SHALL THE END - USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE - BEARING PURPOSES . THE END - USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE .
COPYRIGHT 1993 - 1999 PARALLAX SOFTWARE CORPORATION . ALL RIGHTS RESERVED .
*/
/*
*
* Game Controls Stuff
*
*/
2012-11-11 22:12:51 +00:00
# include <algorithm>
2006-03-20 17:12:09 +00:00
# include <stdio.h>
2015-02-06 00:54:15 +00:00
# include <cstdlib>
2006-03-20 17:12:09 +00:00
# include <string.h>
# include <stdarg.h>
# include "pstypes.h"
2010-02-25 03:08:10 +00:00
# include "window.h"
2006-03-20 17:12:09 +00:00
# include "console.h"
2019-09-01 00:20:28 +00:00
# include "collide.h"
2013-12-26 04:18:28 +00:00
# include "strutil.h"
2006-03-20 17:12:09 +00:00
# include "game.h"
# include "player.h"
# include "key.h"
# include "object.h"
# include "menu.h"
# include "physics.h"
2012-07-07 18:35:06 +00:00
# include "dxxerror.h"
2006-03-20 17:12:09 +00:00
# include "joy.h"
# include "iff.h"
# include "pcx.h"
# include "timer.h"
# include "render.h"
# include "laser.h"
# include "screens.h"
# include "textures.h"
# include "slew.h"
# include "gauges.h"
# include "texmap.h"
# include "3d.h"
# include "effects.h"
# include "gameseg.h"
# include "wall.h"
# include "ai.h"
2008-06-15 11:48:01 +00:00
# include "rbaudio.h"
2006-03-20 17:12:09 +00:00
# include "digi.h"
# include "u_mem.h"
# include "palette.h"
# include "morph.h"
2015-04-02 02:36:57 +00:00
# include "robot.h"
2006-03-20 17:12:09 +00:00
# include "lighting.h"
# include "newdemo.h"
# include "weapon.h"
# include "sounds.h"
# include "args.h"
# include "gameseq.h"
# include "automap.h"
# include "text.h"
# include "powerup.h"
2008-06-15 11:48:01 +00:00
# include "songs.h"
2006-03-20 17:12:09 +00:00
# include "newmenu.h"
# include "gamefont.h"
# include "endlevel.h"
2009-12-02 13:49:54 +00:00
# include "config.h"
2015-04-19 04:18:51 +00:00
# include "hudmsg.h"
2006-03-20 17:12:09 +00:00
# include "kconfig.h"
# include "mouse.h"
# include "titles.h"
# include "gr.h"
# include "playsave.h"
# include "scores.h"
# include "multi.h"
# include "cntrlcen.h"
2009-12-02 13:49:54 +00:00
# include "fuelcen.h"
2006-03-20 17:12:09 +00:00
# include "pcx.h"
# include "state.h"
# include "piggy.h"
# include "multibot.h"
# include "ai.h"
# include "rbaudio.h"
# include "switch.h"
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
# include "escort.h"
2013-03-03 01:03:33 +00:00
# include "movie.h"
# endif
2009-12-02 13:49:54 +00:00
# include "window.h"
2006-03-20 17:12:09 +00:00
2016-09-11 18:49:16 +00:00
# if DXX_USE_EDITOR
2006-03-20 17:12:09 +00:00
# include "editor/editor.h"
2013-03-31 15:37:51 +00:00
# include "editor/esegment.h"
2006-03-20 17:12:09 +00:00
# endif
2014-04-27 23:12:34 +00:00
# include "compiler-range_for.h"
2019-05-04 18:27:36 +00:00
# include "d_range.h"
2014-04-27 23:12:34 +00:00
# include "partial_range.h"
2020-05-02 21:18:42 +00:00
# include <array>
2020-05-02 21:18:42 +00:00
# include <utility>
2014-04-27 23:12:34 +00:00
2013-06-30 02:22:56 +00:00
# include <SDL.h>
2006-03-20 17:12:09 +00:00
2015-09-29 02:41:22 +00:00
# if defined(__GNUC__) && defined(WIN32)
2014-12-14 21:02:40 +00:00
/* Mingw64 _mingw_print_pop.h changes PRIi64 to POSIX-style. Change it
* back here .
2015-09-29 02:41:22 +00:00
*
* Some outdated mingw32 users are also affected .
2014-12-14 21:02:40 +00:00
*/
# undef PRIi64
# define PRIi64 "I64i"
# endif
2012-11-11 22:12:51 +00:00
using std : : min ;
2006-03-20 17:12:09 +00:00
// Global Variables -----------------------------------------------------------
// Function prototypes --------------------------------------------------------
# ifndef RELEASE
2013-09-22 22:26:27 +00:00
static void do_cheat_menu ( ) ;
static void play_test_sound ( ) ;
2006-03-20 17:12:09 +00:00
# endif
# define key_isfunc(k) (((k&0xff)>=KEY_F1 && (k&0xff)<=KEY_F10) || (k&0xff)==KEY_F11 || (k&0xff)==KEY_F12)
// Functions ------------------------------------------------------------------
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
# define CONVERTER_RATE 20 //10 units per second xfer rate
# define CONVERTER_SCALE 2 //2 units energy -> 1 unit shields
# define CONVERTER_SOUND_DELAY (f1_0 / 2) //play every half second
2016-10-28 03:39:41 +00:00
static void transfer_energy_to_shield ( object & plrobj )
2006-03-20 17:12:09 +00:00
{
2010-12-22 00:17:59 +00:00
static fix64 last_play_time = 0 ;
2006-03-20 17:12:09 +00:00
2016-10-28 03:39:41 +00:00
auto & player_info = plrobj . ctype . player_info ;
auto & shields = plrobj . shields ;
2016-09-11 18:49:13 +00:00
auto & energy = player_info . energy ;
2016-07-03 00:54:16 +00:00
//how much energy gets transfered
2016-07-03 00:54:16 +00:00
const fix e = min ( min ( FrameTime * CONVERTER_RATE , energy - INITIAL_ENERGY ) , ( MAX_SHIELDS - shields ) * CONVERTER_SCALE ) ;
2006-03-20 17:12:09 +00:00
if ( e < = 0 ) {
2016-07-03 00:54:16 +00:00
if ( energy < = INITIAL_ENERGY ) {
2010-07-13 06:35:25 +00:00
HUD_init_message ( HM_DEFAULT , " Need more than %i energy to enable transfer " , f2i ( INITIAL_ENERGY ) ) ;
2007-01-29 15:55:57 +00:00
}
2016-07-03 00:54:16 +00:00
else if ( shields > = MAX_SHIELDS )
{
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " No transfer: Shields already at max " ) ;
2007-01-29 15:55:57 +00:00
}
2006-03-20 17:12:09 +00:00
return ;
}
2016-07-03 00:54:16 +00:00
energy - = e ;
2016-07-03 00:54:16 +00:00
shields + = e / CONVERTER_SCALE ;
2006-03-20 17:12:09 +00:00
2010-12-22 00:17:59 +00:00
if ( last_play_time > GameTime64 )
2006-03-20 17:12:09 +00:00
last_play_time = 0 ;
2010-12-22 00:17:59 +00:00
if ( GameTime64 > last_play_time + CONVERTER_SOUND_DELAY ) {
2006-03-20 17:12:09 +00:00
digi_play_sample_once ( SOUND_CONVERT_ENERGY , F1_0 ) ;
2010-12-22 00:17:59 +00:00
last_play_time = GameTime64 ;
2006-03-20 17:12:09 +00:00
}
}
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
// Control Functions
2013-09-22 22:26:27 +00:00
static fix64 newdemo_single_frame_time ;
2006-03-20 17:12:09 +00:00
2013-09-22 22:26:27 +00:00
static void update_vcr_state ( void )
2006-03-20 17:12:09 +00:00
{
2012-05-14 17:06:28 +00:00
if ( ( keyd_pressed [ KEY_LSHIFT ] | | keyd_pressed [ KEY_RSHIFT ] ) & & keyd_pressed [ KEY_RIGHT ] & & d_tick_step )
2006-03-20 17:12:09 +00:00
Newdemo_vcr_state = ND_STATE_FASTFORWARD ;
2012-05-14 17:06:28 +00:00
else if ( ( keyd_pressed [ KEY_LSHIFT ] | | keyd_pressed [ KEY_RSHIFT ] ) & & keyd_pressed [ KEY_LEFT ] & & d_tick_step )
2006-03-20 17:12:09 +00:00
Newdemo_vcr_state = ND_STATE_REWINDING ;
2012-05-14 17:06:28 +00:00
else if ( ! ( keyd_pressed [ KEY_LCTRL ] | | keyd_pressed [ KEY_RCTRL ] ) & & keyd_pressed [ KEY_RIGHT ] & & ( ( GameTime64 - newdemo_single_frame_time ) > = F1_0 ) & & d_tick_step )
2006-03-20 17:12:09 +00:00
Newdemo_vcr_state = ND_STATE_ONEFRAMEFORWARD ;
2012-05-14 17:06:28 +00:00
else if ( ! ( keyd_pressed [ KEY_LCTRL ] | | keyd_pressed [ KEY_RCTRL ] ) & & keyd_pressed [ KEY_LEFT ] & & ( ( GameTime64 - newdemo_single_frame_time ) > = F1_0 ) & & d_tick_step )
2006-03-20 17:12:09 +00:00
Newdemo_vcr_state = ND_STATE_ONEFRAMEBACKWARD ;
else if ( ( Newdemo_vcr_state = = ND_STATE_FASTFORWARD ) | | ( Newdemo_vcr_state = = ND_STATE_REWINDING ) )
Newdemo_vcr_state = ND_STATE_PLAYBACK ;
}
2016-10-02 19:35:34 +00:00
namespace dsx {
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
//returns which bomb will be dropped next time the bomb key is pressed
int which_bomb ( )
{
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
auto & vmobjptr = Objects . vmptr ;
2006-03-20 17:12:09 +00:00
//use the last one selected, unless there aren't any, in which case use
//the other if there are any
2016-08-28 22:41:48 +00:00
auto & player_info = get_local_plrobj ( ) . ctype . player_info ;
auto & Secondary_last_was_super = player_info . Secondary_last_was_super ;
2017-02-19 19:33:45 +00:00
const auto mask = 1 < < PROXIMITY_INDEX ;
const auto bomb = ( Secondary_last_was_super & mask ) ? SMART_MINE_INDEX : PROXIMITY_INDEX ;
2006-03-20 17:12:09 +00:00
2016-08-28 22:41:48 +00:00
auto & secondary_ammo = player_info . secondary_ammo ;
2015-10-30 02:52:56 +00:00
if ( secondary_ammo [ bomb ] = = 0 & &
secondary_ammo [ SMART_MINE_INDEX + PROXIMITY_INDEX - bomb ] ! = 0 )
{
2017-02-19 19:33:45 +00:00
Secondary_last_was_super ^ = mask ;
2006-03-20 17:12:09 +00:00
}
return bomb ;
}
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
2019-03-03 00:31:08 +00:00
static void do_weapon_n_item_stuff ( object_array & Objects )
2006-03-20 17:12:09 +00:00
{
2019-03-03 00:31:08 +00:00
auto & vmobjptridx = Objects . vmptridx ;
auto & vmobjptr = Objects . vmptr ;
2016-10-28 03:39:41 +00:00
auto & plrobj = get_local_plrobj ( ) ;
auto & player_info = plrobj . ctype . player_info ;
2013-11-26 22:46:48 +00:00
if ( Controls . state . fire_flare > 0 )
2011-02-02 00:36:49 +00:00
{
2013-11-26 22:46:48 +00:00
Controls . state . fire_flare = 0 ;
2016-12-10 17:51:10 +00:00
if ( allowed_to_fire_flare ( player_info ) )
2017-06-10 03:31:02 +00:00
Flare_create ( vmobjptridx ( ConsoleObject ) ) ;
2011-02-02 00:36:49 +00:00
}
2006-03-20 17:12:09 +00:00
2016-12-10 17:51:10 +00:00
if ( allowed_to_fire_missile ( player_info ) & & Controls . state . fire_secondary )
2016-08-28 22:41:48 +00:00
{
Global_missile_firing_count + = Weapon_info [ Secondary_weapon_to_weapon_info [ player_info . Secondary_weapon ] ] . fire_count ;
}
2006-03-20 17:12:09 +00:00
if ( Global_missile_firing_count ) {
2010-03-31 06:19:37 +00:00
do_missile_firing ( 0 ) ;
2006-03-20 17:12:09 +00:00
Global_missile_firing_count - - ;
}
2013-11-26 22:46:48 +00:00
if ( Controls . state . cycle_primary > 0 )
2010-03-31 06:19:37 +00:00
{
2020-05-02 21:18:42 +00:00
for ( uint_fast32_t i = std : : exchange ( Controls . state . cycle_primary , 0 ) ; i - - ; )
2016-10-02 00:34:46 +00:00
CyclePrimary ( player_info ) ;
2010-03-31 06:19:37 +00:00
}
2013-11-26 22:46:48 +00:00
if ( Controls . state . cycle_secondary > 0 )
2010-03-31 06:19:37 +00:00
{
2020-05-02 21:18:42 +00:00
for ( uint_fast32_t i = std : : exchange ( Controls . state . cycle_secondary , 0 ) ; i - - ; )
2016-10-02 00:34:46 +00:00
CycleSecondary ( player_info ) ;
2011-02-02 00:36:49 +00:00
}
2013-11-26 22:46:48 +00:00
if ( Controls . state . select_weapon > 0 )
2011-02-02 00:36:49 +00:00
{
2020-05-02 21:18:42 +00:00
const auto select_weapon = std : : exchange ( Controls . state . select_weapon , 0 ) - 1 ;
2015-04-26 20:15:51 +00:00
const auto weapon_num = select_weapon > 4 ? select_weapon - 5 : select_weapon ;
if ( select_weapon > 4 )
2016-10-02 00:34:49 +00:00
do_secondary_weapon_select ( player_info , static_cast < secondary_weapon_index_t > ( select_weapon - 5 ) ) ;
2015-04-26 20:15:51 +00:00
else
2016-10-02 00:34:46 +00:00
do_primary_weapon_select ( player_info , weapon_num ) ;
2010-03-31 06:19:37 +00:00
}
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2015-01-29 04:27:37 +00:00
if ( auto & headlight = Controls . state . headlight )
2010-03-31 06:19:37 +00:00
{
2020-05-02 21:18:42 +00:00
if ( std : : exchange ( headlight , 0 ) & 1 )
2017-04-22 21:23:55 +00:00
toggle_headlight_active ( plrobj ) ;
2010-03-31 06:19:37 +00:00
}
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
if ( Global_missile_firing_count < 0 )
Global_missile_firing_count = 0 ;
// Drop proximity bombs.
2015-02-05 03:03:49 +00:00
if ( Controls . state . drop_bomb > 0 )
2011-02-03 00:05:06 +00:00
{
2020-05-02 21:18:42 +00:00
for ( uint_fast32_t i = std : : exchange ( Controls . state . drop_bomb , 0 ) ; i - - ; )
2011-02-03 00:05:06 +00:00
do_missile_firing ( 1 ) ;
2006-03-20 17:12:09 +00:00
}
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2013-11-26 22:46:48 +00:00
if ( Controls . state . toggle_bomb > 0 )
2011-02-02 00:36:49 +00:00
{
2016-08-28 22:41:48 +00:00
auto & Secondary_last_was_super = player_info . Secondary_last_was_super ;
auto & secondary_ammo = player_info . secondary_ammo ;
2017-02-19 19:33:44 +00:00
int sound ;
2015-10-30 02:52:56 +00:00
if ( ! secondary_ammo [ PROXIMITY_INDEX ] & & ! secondary_ammo [ SMART_MINE_INDEX ] )
2011-02-02 00:36:49 +00:00
{
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " No bombs available! " ) ;
2017-02-19 19:33:44 +00:00
sound = SOUND_BAD_SELECTION ;
2011-02-02 00:36:49 +00:00
}
else
{
2017-02-19 19:33:45 +00:00
const auto mask = ( 1 < < PROXIMITY_INDEX ) ;
const char * desc ;
const auto bomb = ( Secondary_last_was_super & mask ) ? ( desc = " Proximity bombs " , PROXIMITY_INDEX ) : ( desc = " Smart mines " , SMART_MINE_INDEX ) ;
2015-10-30 02:52:56 +00:00
if ( secondary_ammo [ bomb ] = = 0 )
2011-02-02 00:36:49 +00:00
{
2017-02-19 19:33:45 +00:00
HUD_init_message ( HM_DEFAULT , " No %s available! " , desc ) ;
2017-02-19 19:33:44 +00:00
sound = SOUND_BAD_SELECTION ;
2011-02-02 00:36:49 +00:00
}
else
{
2017-02-19 19:33:45 +00:00
Secondary_last_was_super ^ = mask ;
2017-02-19 19:33:44 +00:00
sound = SOUND_GOOD_SELECTION_SECONDARY ;
2011-02-02 00:36:49 +00:00
}
}
2017-02-19 19:33:44 +00:00
digi_play_sample_once ( sound , F1_0 ) ;
2013-11-26 22:46:48 +00:00
Controls . state . toggle_bomb = 0 ;
2011-02-02 00:36:49 +00:00
}
2016-10-02 00:34:40 +00:00
if ( Controls . state . energy_to_shield & & ( player_info . powerup_flags & PLAYER_FLAGS_CONVERTER ) )
2016-10-28 03:39:41 +00:00
transfer_energy_to_shield ( plrobj ) ;
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
}
2016-08-25 04:05:32 +00:00
}
2006-03-20 17:12:09 +00:00
2015-02-05 03:03:49 +00:00
static void format_time ( char ( & str ) [ 9 ] , unsigned secs_int , unsigned hours_extra )
2006-03-20 17:12:09 +00:00
{
2015-02-05 03:03:49 +00:00
auto d1 = std : : div ( secs_int , 60 ) ;
const unsigned s = d1 . rem ;
const unsigned m1 = d1 . quot ;
auto d2 = std : : div ( m1 , 60 ) ;
const unsigned m = d2 . rem ;
const unsigned h = d2 . quot + hours_extra ;
snprintf ( str , sizeof ( str ) , " %1u:%02u:%02u " , h , m , s ) ;
2006-03-20 17:12:09 +00:00
}
2014-09-07 18:06:59 +00:00
struct pause_window : ignore_window_pointer_t
2014-09-07 04:04:08 +00:00
{
2020-05-02 21:18:42 +00:00
std : : array < char , 1024 > msg ;
2014-09-07 04:04:08 +00:00
} ;
2010-01-09 09:19:26 +00:00
//Process selected keys until game unpaused
2016-10-04 06:05:44 +00:00
static window_event_result pause_handler ( window * , const d_event & event , pause_window * p )
2006-03-20 17:12:09 +00:00
{
int key ;
2010-01-09 09:19:26 +00:00
2014-10-04 21:47:13 +00:00
switch ( event . type )
2010-01-09 09:19:26 +00:00
{
2010-02-25 08:00:15 +00:00
case EVENT_WINDOW_ACTIVATED :
game_flush_inputs ( ) ;
break ;
2010-06-14 08:13:16 +00:00
2010-03-26 14:05:40 +00:00
case EVENT_KEY_COMMAND :
2011-01-14 09:51:13 +00:00
key = event_key_get ( event ) ;
2010-06-14 08:13:16 +00:00
2010-03-26 14:05:40 +00:00
switch ( key )
{
2010-01-20 11:04:09 +00:00
case 0 :
break ;
case KEY_ESC :
2014-08-06 02:10:49 +00:00
return window_event_result : : close ;
2010-01-20 11:04:09 +00:00
case KEY_F1 :
show_help ( ) ;
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2010-01-20 11:04:09 +00:00
case KEY_PAUSE :
2014-08-06 02:10:49 +00:00
return window_event_result : : close ;
2010-01-20 11:04:09 +00:00
default :
break ;
}
2010-03-26 14:05:40 +00:00
break ;
2010-06-14 08:13:16 +00:00
2010-03-26 14:05:40 +00:00
case EVENT_IDLE :
timer_delay2 ( 50 ) ;
2010-01-09 09:19:26 +00:00
break ;
2010-06-14 08:13:16 +00:00
2010-01-20 11:04:09 +00:00
case EVENT_WINDOW_DRAW :
2014-09-07 04:04:08 +00:00
show_boxed_message ( & p - > msg [ 0 ] , 1 ) ;
2010-01-09 09:19:26 +00:00
break ;
2010-06-14 08:13:16 +00:00
2010-01-20 11:04:09 +00:00
case EVENT_WINDOW_CLOSE :
2010-06-14 08:13:16 +00:00
songs_resume ( ) ;
2014-09-07 04:04:08 +00:00
delete p ;
2010-01-09 09:19:26 +00:00
break ;
2010-06-14 08:13:16 +00:00
2010-01-09 09:19:26 +00:00
default :
break ;
}
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2010-01-09 09:19:26 +00:00
}
2013-09-22 22:26:27 +00:00
static int do_game_pause ( )
2010-01-09 09:19:26 +00:00
{
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
auto & vcobjptr = Objects . vcptr ;
2006-03-20 17:12:09 +00:00
char total_time [ 9 ] , level_time [ 9 ] ;
2010-06-14 08:13:16 +00:00
2007-09-08 11:11:41 +00:00
if ( Game_mode & GM_MULTI )
2006-03-20 17:12:09 +00:00
{
2007-09-08 11:11:41 +00:00
netplayerinfo_on = ! netplayerinfo_on ;
return ( KEY_PAUSE ) ;
2006-03-20 17:12:09 +00:00
}
2010-06-14 08:13:16 +00:00
2014-09-07 04:04:08 +00:00
pause_window * p = new pause_window ;
2010-06-14 08:13:16 +00:00
songs_pause ( ) ;
2017-08-13 20:38:31 +00:00
auto & plr = get_local_player ( ) ;
format_time ( total_time , f2i ( plr . time_total ) , plr . hours_total ) ;
format_time ( level_time , f2i ( plr . time_level ) , plr . hours_level ) ;
2019-03-03 00:31:08 +00:00
auto & player_info = vcobjptr ( plr . objnum ) - > ctype . player_info ;
2007-10-14 16:25:55 +00:00
if ( Newdemo_state ! = ND_STATE_PLAYBACK )
2019-06-27 03:26:20 +00:00
snprintf ( & p - > msg [ 0 ] , p - > msg . size ( ) , " PAUSE \n \n Skill level: %s \n Hostages on board: %d \n Time on level: %s \n Total time in game: %s " , MENU_DIFFICULTY_TEXT ( GameUniqueState . Difficulty_level ) , player_info . mission . hostages_on_board , level_time , total_time ) ;
2007-10-14 16:25:55 +00:00
else
2016-12-22 05:21:16 +00:00
snprintf ( & p - > msg [ 0 ] , p - > msg . size ( ) , " PAUSE \n \n \n \n " ) ;
2008-06-04 19:30:43 +00:00
set_screen_mode ( SCREEN_MENU ) ;
2010-06-14 08:13:16 +00:00
2016-10-15 00:53:20 +00:00
if ( ! window_create ( grd_curscreen - > sc_canvas , 0 , 0 , SWIDTH , SHEIGHT , pause_handler , p ) )
2014-09-07 04:04:08 +00:00
delete p ;
2010-06-14 08:13:16 +00:00
2010-01-09 09:19:26 +00:00
return 0 /*key*/ ; // Keycode returning ripped out (kreatordxx)
2006-03-20 17:12:09 +00:00
}
2016-12-24 08:50:29 +00:00
static window_event_result HandleEndlevelKey ( int key )
2006-03-20 17:12:09 +00:00
{
2010-03-31 09:18:28 +00:00
switch ( key )
{
case KEY_COMMAND + KEY_P :
case KEY_PAUSE :
do_game_pause ( ) ;
2016-12-24 08:50:29 +00:00
return window_event_result : : handled ;
2010-06-14 08:13:16 +00:00
2010-03-31 09:18:28 +00:00
case KEY_ESC :
last_drawn_cockpit = - 1 ;
2016-12-24 08:50:29 +00:00
return stop_endlevel_sequence ( ) ;
2006-03-20 17:12:09 +00:00
}
2016-12-24 08:50:29 +00:00
return window_event_result : : ignored ;
2006-03-20 17:12:09 +00:00
}
2014-10-04 21:47:13 +00:00
static int HandleDeathInput ( const d_event & event )
2006-03-20 17:12:09 +00:00
{
2019-08-15 01:34:22 +00:00
const auto input_aborts_death_sequence = [ & ] ( ) {
const auto RespawnMode = PlayerCfg . RespawnMode ;
if ( event . type = = EVENT_KEY_COMMAND )
{
const auto key = event_key_get ( event ) ;
if ( ( RespawnMode = = RespawnPress : : Any & & ! key_isfunc ( key ) & & key ! = KEY_PAUSE & & key ) | |
( key = = KEY_ESC & & ConsoleObject - > flags & OF_EXPLODING ) )
return 1 ;
}
2006-03-20 17:12:09 +00:00
2019-08-15 01:34:22 +00:00
if ( RespawnMode = = RespawnPress : : Any
2015-11-21 18:12:13 +00:00
? ( event . type = = EVENT_JOYSTICK_BUTTON_UP | | event . type = = EVENT_MOUSE_BUTTON_UP )
: ( Controls . state . fire_primary | | Controls . state . fire_secondary | | Controls . state . fire_flare ) )
2019-08-15 01:34:22 +00:00
return 1 ;
return 0 ;
} ;
if ( Player_dead_state = = player_dead_state : : exploded & & input_aborts_death_sequence ( ) )
{
GameViewUniqueState . Death_sequence_aborted = 1 ;
2015-11-21 18:12:13 +00:00
}
2011-02-02 00:36:49 +00:00
2019-08-15 01:34:22 +00:00
if ( GameViewUniqueState . Death_sequence_aborted )
2010-03-31 09:18:28 +00:00
{
Only respawn when the player presses fire
Only respawn when the player presses a fire key/button (primary,
secondary, or flare). Only clear primary, second, flare, and bomb when
respawning. This allows dead players to use the automap or change their
camera views.
This is a necessary step to flushing only the firing inputs on respawn,
as requested by Mako88 in
<https://github.com/dxx-rebirth/dxx-rebirth/issues/104>. Currently,
inputs are flushed again by the activation of the game window, so
respawn still flushes all inputs.
#1 0x00005555555cee19 in game_flush_inputs () at similar/main/game.cpp:374
#2 game_handler (event=...) at similar/main/game.cpp:1114
#3 0x0000555555576113 in window_send_event (wind=..., event=...) at common/arch/sdl/window.cpp:208
#4 0x000055555557627b in WINDOW_SEND_EVENT (file=0x5555556dc126 "common/arch/sdl/window.cpp", e=0x5555556dc141 "EVENT_WINDOW_ACTIVATED", line=179, event=..., w=...) at common/include/window.h:111
#5 window_set_visible (w=..., visible=visible@entry=1) at common/arch/sdl/window.cpp:179
#6 0x00005555555e90f5 in window_set_visible (visible=1, wind=<optimized out>) at common/include/window.h:90
#7 DoPlayerDead () at similar/main/gameseq.cpp:1479
#8 0x000055555563ed65 in dead_player_frame () at similar/main/object.cpp:1486
#9 0x00005555555cf4df in GameProcessFrame () at similar/main/game.cpp:1329
#10 game_handler (event=...) at similar/main/game.cpp:1157
2015-06-20 16:16:43 +00:00
game_flush_respawn_inputs ( ) ;
2010-03-31 09:18:28 +00:00
return 1 ;
}
2010-06-14 08:13:16 +00:00
2010-03-31 09:18:28 +00:00
return 0 ;
2006-03-20 17:12:09 +00:00
}
2018-06-16 04:13:37 +00:00
# if DXX_USE_SCREENSHOT
2017-03-10 01:22:28 +00:00
static void save_pr_screenshot ( )
{
2017-11-05 20:49:08 +00:00
gr_set_default_canvas ( ) ;
2017-03-10 01:22:28 +00:00
auto & canvas = * grd_curcanv ;
render_frame ( canvas , 0 ) ;
2018-05-19 23:21:42 +00:00
auto & medium2_font = * MEDIUM2_FONT ;
gr_string ( canvas , medium2_font , SWIDTH - FSPACX ( 92 ) , SHEIGHT - LINE_SPACING ( medium2_font , * GAME_FONT ) , " DXX-Rebirth \n " ) ;
2017-03-10 01:22:28 +00:00
gr_flip ( ) ;
save_screen_shot ( 0 ) ;
}
static void save_clean_screenshot ( )
{
game_render_frame_mono ( CGameArg . DbgNoDoubleBuffer ) ;
save_screen_shot ( 0 ) ;
}
2018-06-16 04:13:37 +00:00
# endif
2017-03-10 01:22:28 +00:00
2017-01-09 11:09:34 +00:00
static window_event_result HandleDemoKey ( int key )
2006-03-20 17:12:09 +00:00
{
switch ( key ) {
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_1 : )
2007-11-06 20:33:22 +00:00
case KEY_F1 : show_newdemo_help ( ) ; break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_2 : )
2010-07-16 06:27:49 +00:00
case KEY_F2 : do_options_menu ( ) ; break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_3 : )
2006-03-20 17:12:09 +00:00
case KEY_F3 :
2009-02-02 08:49:58 +00:00
if ( Viewer - > type = = OBJ_PLAYER )
2006-03-20 17:12:09 +00:00
toggle_cockpit ( ) ;
break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_4 : )
2008-10-16 17:27:02 +00:00
case KEY_F4 : Newdemo_show_percentage = ! Newdemo_show_percentage ; break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_7 : )
2006-03-20 17:12:09 +00:00
case KEY_F7 :
2016-03-30 18:09:46 +00:00
Show_kill_list = ( Show_kill_list + 1 ) % ( ( Newdemo_game_mode & GM_TEAM ) ? 4 : 3 ) ;
2006-03-20 17:12:09 +00:00
break ;
case KEY_ESC :
2015-12-24 04:01:27 +00:00
if ( CGameArg . SysAutoDemo )
2010-01-27 04:30:31 +00:00
{
int choice ;
2010-03-31 06:19:37 +00:00
choice = nm_messagebox ( NULL , 2 , TXT_YES , TXT_NO , TXT_ABORT_AUTODEMO ) ;
if ( choice = = 0 )
2015-12-24 04:01:27 +00:00
CGameArg . SysAutoDemo = false ;
2010-01-27 04:30:31 +00:00
else
break ;
}
newdemo_stop_playback ( ) ;
2017-01-09 11:09:34 +00:00
return window_event_result : : close ;
2006-03-20 17:12:09 +00:00
break ;
case KEY_UP :
Newdemo_vcr_state = ND_STATE_PLAYBACK ;
break ;
case KEY_DOWN :
Newdemo_vcr_state = ND_STATE_PAUSED ;
break ;
case KEY_LEFT :
2010-12-22 00:17:59 +00:00
newdemo_single_frame_time = GameTime64 ;
2006-03-20 17:12:09 +00:00
Newdemo_vcr_state = ND_STATE_ONEFRAMEBACKWARD ;
break ;
case KEY_RIGHT :
2010-12-22 00:17:59 +00:00
newdemo_single_frame_time = GameTime64 ;
2006-03-20 17:12:09 +00:00
Newdemo_vcr_state = ND_STATE_ONEFRAMEFORWARD ;
break ;
case KEY_CTRLED + KEY_RIGHT :
2017-01-09 11:09:34 +00:00
return newdemo_goto_end ( 0 ) ;
2006-03-20 17:12:09 +00:00
break ;
case KEY_CTRLED + KEY_LEFT :
2017-01-09 11:09:34 +00:00
return newdemo_goto_beginning ( ) ;
2006-03-20 17:12:09 +00:00
break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_P : )
2006-03-20 17:12:09 +00:00
case KEY_PAUSE :
do_game_pause ( ) ;
break ;
2018-06-16 04:13:37 +00:00
# if DXX_USE_SCREENSHOT
2008-12-07 12:26:43 +00:00
# ifdef macintosh
case KEY_COMMAND + KEY_SHIFTED + KEY_3 :
# endif
2008-10-16 17:27:02 +00:00
case KEY_PRINT_SCREEN :
{
2008-10-28 17:04:35 +00:00
if ( PlayerCfg . PRShot )
{
2017-03-10 01:22:28 +00:00
save_pr_screenshot ( ) ;
2008-10-28 17:04:35 +00:00
}
else
{
int old_state ;
old_state = Newdemo_show_percentage ;
Newdemo_show_percentage = 0 ;
2017-03-10 01:22:28 +00:00
save_clean_screenshot ( ) ;
2008-10-28 17:04:35 +00:00
Newdemo_show_percentage = old_state ;
}
2006-03-20 17:12:09 +00:00
break ;
}
2018-06-16 04:13:37 +00:00
# endif
2010-03-31 06:19:37 +00:00
# ifndef NDEBUG
2006-03-20 17:12:09 +00:00
case KEY_DEBUGGED + KEY_I :
Newdemo_do_interpolate = ! Newdemo_do_interpolate ;
2010-07-13 06:35:25 +00:00
HUD_init_message ( HM_DEFAULT , " Demo playback interpolation %s " , Newdemo_do_interpolate ? " ON " : " OFF " ) ;
2006-03-20 17:12:09 +00:00
break ;
case KEY_DEBUGGED + KEY_K : {
int how_many , c ;
char filename [ FILENAME_LEN ] , num [ 16 ] ;
2020-05-02 21:18:42 +00:00
std : : array < newmenu_item , 2 > m { {
2015-01-18 01:58:31 +00:00
nm_item_text ( " output file name " ) ,
nm_item_input ( filename ) ,
2015-03-22 18:49:21 +00:00
} } ;
2006-03-20 17:12:09 +00:00
filename [ 0 ] = ' \0 ' ;
2015-01-18 01:58:32 +00:00
c = newmenu_do ( NULL , NULL , m , unused_newmenu_subfunction , unused_newmenu_userdata ) ;
2006-03-20 17:12:09 +00:00
if ( c = = - 2 )
break ;
2010-09-02 13:58:06 +00:00
strcat ( filename , DEMO_EXT ) ;
2006-03-20 17:12:09 +00:00
num [ 0 ] = ' \0 ' ;
2015-03-22 18:49:21 +00:00
m = { {
2015-01-18 01:58:31 +00:00
nm_item_text ( " strip how many bytes " ) ,
nm_item_input ( num ) ,
2015-03-22 18:49:21 +00:00
} } ;
2015-01-18 01:58:32 +00:00
c = newmenu_do ( NULL , NULL , m , unused_newmenu_subfunction , unused_newmenu_userdata ) ;
2006-03-20 17:12:09 +00:00
if ( c = = - 2 )
break ;
how_many = atoi ( num ) ;
if ( how_many < = 0 )
break ;
newdemo_strip_frames ( filename , how_many ) ;
break ;
}
2010-03-31 06:19:37 +00:00
# endif
2010-03-31 09:18:28 +00:00
default :
2017-01-09 11:09:34 +00:00
return window_event_result : : ignored ;
2006-03-20 17:12:09 +00:00
}
2010-06-14 08:13:16 +00:00
2017-01-09 11:09:34 +00:00
return window_event_result : : handled ;
2006-03-20 17:12:09 +00:00
}
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
//switch a cockpit window to the next function
2020-08-10 03:45:13 +00:00
static int select_next_window_function ( const gauge_inset_window_view w )
2006-03-20 17:12:09 +00:00
{
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
auto & vmobjptridx = Objects . vmptridx ;
2006-03-20 17:12:09 +00:00
2018-12-30 00:43:59 +00:00
auto & Robot_info = LevelSharedRobotInfoState . Robot_info ;
2008-04-13 00:28:36 +00:00
switch ( PlayerCfg . Cockpit3DView [ w ] ) {
2006-03-20 17:12:09 +00:00
case CV_NONE :
2008-04-13 00:28:36 +00:00
PlayerCfg . Cockpit3DView [ w ] = CV_REAR ;
2006-03-20 17:12:09 +00:00
break ;
case CV_REAR :
2018-09-19 02:13:29 +00:00
if ( find_escort ( vmobjptridx , Robot_info ) ! = object_none )
{
2008-04-13 00:28:36 +00:00
PlayerCfg . Cockpit3DView [ w ] = CV_ESCORT ;
2006-03-20 17:12:09 +00:00
break ;
}
//if no ecort, fall through
2019-04-04 04:29:03 +00:00
DXX_BOOST_FALLTHROUGH ;
2006-03-20 17:12:09 +00:00
case CV_ESCORT :
2017-08-13 20:38:31 +00:00
Coop_view_player [ w ] = UINT_MAX ; //force first player
2019-04-04 04:29:03 +00:00
DXX_BOOST_FALLTHROUGH ;
2006-03-20 17:12:09 +00:00
case CV_COOP :
2020-07-22 03:11:18 +00:00
Marker_viewer_num [ w ] = game_marker_index : : None ;
2006-03-20 17:12:09 +00:00
if ( ( Game_mode & GM_MULTI_COOP ) | | ( Game_mode & GM_TEAM ) ) {
2008-04-13 00:28:36 +00:00
PlayerCfg . Cockpit3DView [ w ] = CV_COOP ;
2017-08-13 20:38:32 +00:00
for ( ; ; )
{
const auto cvp = + + Coop_view_player [ w ] ;
if ( cvp = = MAX_PLAYERS - 1 )
{
2008-04-13 00:28:36 +00:00
PlayerCfg . Cockpit3DView [ w ] = CV_MARKER ;
2006-03-20 17:12:09 +00:00
goto case_marker ;
}
2017-08-13 20:38:32 +00:00
if ( cvp = = Player_num )
2013-06-10 23:19:56 +00:00
continue ;
2017-08-13 20:38:32 +00:00
if ( vcplayerptr ( cvp ) - > connected ! = CONNECT_PLAYING )
2006-03-20 17:12:09 +00:00
continue ;
if ( Game_mode & GM_MULTI_COOP )
break ;
2017-08-13 20:38:32 +00:00
else if ( get_team ( cvp ) = = get_team ( Player_num ) )
2006-03-20 17:12:09 +00:00
break ;
}
break ;
}
2017-06-07 02:44:54 +00:00
//if not multi,
2019-04-04 04:29:03 +00:00
DXX_BOOST_FALLTHROUGH ;
2006-03-20 17:12:09 +00:00
case CV_MARKER :
case_marker : ;
if ( ( Game_mode & GM_MULTI ) & & ! ( Game_mode & GM_MULTI_COOP ) & & Netgame . Allow_marker_view ) { //anarchy only
2008-04-13 00:28:36 +00:00
PlayerCfg . Cockpit3DView [ w ] = CV_MARKER ;
2020-07-22 03:11:18 +00:00
auto & mvn = Marker_viewer_num [ w ] ;
const auto gmi0 = convert_player_marker_index_to_game_marker_index ( Game_mode , Netgame . max_numplayers , Player_num , player_marker_index : : _0 ) ;
if ( ! MarkerState . imobjidx . valid_index ( mvn ) )
mvn = gmi0 ;
2006-03-20 17:12:09 +00:00
else
2020-07-22 03:11:18 +00:00
{
+ + mvn ;
if ( ! MarkerState . imobjidx . valid_index ( mvn ) )
PlayerCfg . Cockpit3DView [ w ] = CV_NONE ;
}
2006-03-20 17:12:09 +00:00
}
else
2008-04-13 00:28:36 +00:00
PlayerCfg . Cockpit3DView [ w ] = CV_NONE ;
2006-03-20 17:12:09 +00:00
break ;
}
write_player_file ( ) ;
return 1 ; //screen_changed
}
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
//this is for system-level keys, such as help, etc.
//returns 1 if screen changed
2016-08-25 04:05:32 +00:00
namespace dsx {
2014-08-06 02:10:49 +00:00
static window_event_result HandleSystemKey ( int key )
2006-03-20 17:12:09 +00:00
{
2015-12-15 04:09:35 +00:00
if ( Player_dead_state = = player_dead_state : : no )
2010-03-31 06:19:37 +00:00
switch ( key )
{
2006-03-20 17:12:09 +00:00
case KEY_ESC :
2010-04-04 01:31:48 +00:00
{
2015-11-14 18:17:21 +00:00
const bool allow_saveload = ! ( Game_mode & GM_MULTI ) | | ( ( Game_mode & GM_MULTI_COOP ) & & Player_num = = 0 ) ;
2015-02-15 17:24:54 +00:00
const auto choice = nm_messagebox_str ( nullptr , allow_saveload ? nm_messagebox_tie ( " Abort Game " , TXT_OPTIONS_ , " Save Game... " , TXT_LOAD_GAME ) : nm_messagebox_tie ( " Abort Game " , TXT_OPTIONS_ ) , " Game Menu " ) ;
2014-12-06 01:38:30 +00:00
switch ( choice )
2014-08-06 02:10:49 +00:00
{
2014-12-06 01:38:30 +00:00
case 0 :
return window_event_result : : close ;
case 1 :
return HandleSystemKey ( KEY_F2 ) ;
case 2 :
return HandleSystemKey ( KEY_ALTED | KEY_F2 ) ;
case 3 :
return HandleSystemKey ( KEY_ALTED | KEY_F3 ) ;
2014-08-06 02:10:49 +00:00
}
return window_event_result : : handled ;
2010-04-04 01:31:48 +00:00
}
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
// fleshed these out because F1 and F2 aren't sequenctial keycodes on mac -- MWA
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_SHIFTED + KEY_1 : )
2006-03-20 17:12:09 +00:00
case KEY_SHIFTED + KEY_F1 :
2020-08-10 03:45:13 +00:00
select_next_window_function ( gauge_inset_window_view : : primary ) ;
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_SHIFTED + KEY_2 : )
2006-03-20 17:12:09 +00:00
case KEY_SHIFTED + KEY_F2 :
2020-08-10 03:45:13 +00:00
select_next_window_function ( gauge_inset_window_view : : secondary ) ;
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
}
2010-03-31 06:19:37 +00:00
switch ( key )
{
2016-05-10 11:41:13 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_PAUSE + KEY_SHIFTED : )
case KEY_PAUSE + KEY_SHIFTED :
if ( Game_mode & GM_MULTI )
2016-05-30 11:49:06 +00:00
show_netgame_info ( Netgame ) ;
2016-05-10 11:41:13 +00:00
break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_P : )
2010-03-31 06:19:37 +00:00
case KEY_PAUSE :
do_game_pause ( ) ; break ;
2006-03-20 17:12:09 +00:00
2006-08-30 18:12:04 +00:00
2018-06-16 04:13:37 +00:00
# if DXX_USE_SCREENSHOT
2008-12-07 12:26:43 +00:00
# ifdef macintosh
case KEY_COMMAND + KEY_SHIFTED + KEY_3 :
# endif
2008-10-28 17:04:35 +00:00
case KEY_PRINT_SCREEN :
{
if ( PlayerCfg . PRShot )
{
2017-03-10 01:22:28 +00:00
save_pr_screenshot ( ) ;
2008-10-28 17:04:35 +00:00
}
2011-01-06 11:43:58 +00:00
else
{
2017-03-10 01:22:28 +00:00
save_clean_screenshot ( ) ;
2011-01-06 11:43:58 +00:00
}
2008-10-28 17:04:35 +00:00
break ;
}
2018-06-16 04:13:37 +00:00
# endif
2006-03-20 17:12:09 +00:00
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_1 : )
2010-03-31 06:19:37 +00:00
case KEY_F1 : if ( Game_mode & GM_MULTI ) show_netgame_help ( ) ; else show_help ( ) ; break ;
2006-03-20 17:12:09 +00:00
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_2 : )
2010-07-16 06:27:49 +00:00
case KEY_F2 :
2006-03-20 17:12:09 +00:00
{
do_options_menu ( ) ;
break ;
}
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_3 : )
2006-03-20 17:12:09 +00:00
case KEY_F3 :
2018-10-08 03:58:48 +00:00
if ( Player_dead_state = = player_dead_state : : no & & Viewer - > type = = OBJ_PLAYER )
2006-03-20 17:12:09 +00:00
{
2010-03-31 09:18:28 +00:00
toggle_cockpit ( ) ;
2006-03-20 17:12:09 +00:00
}
break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_5 : )
2006-03-20 17:12:09 +00:00
case KEY_F5 :
if ( Newdemo_state = = ND_STATE_RECORDING )
newdemo_stop_recording ( ) ;
else if ( Newdemo_state = = ND_STATE_NORMAL )
2007-10-14 16:25:55 +00:00
newdemo_start_recording ( ) ;
2006-03-20 17:12:09 +00:00
break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_ALTED + KEY_4 : )
2010-03-31 06:19:37 +00:00
case KEY_ALTED + KEY_F4 :
2006-03-20 17:12:09 +00:00
Show_reticle_name = ( Show_reticle_name + 1 ) % 2 ;
break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_7 : )
2006-03-20 17:12:09 +00:00
case KEY_F7 :
2016-03-30 18:09:46 +00:00
Show_kill_list = ( Show_kill_list + 1 ) % ( ( Game_mode & GM_TEAM ) ? 4 : 3 ) ;
2006-03-20 17:12:09 +00:00
if ( Game_mode & GM_MULTI )
multi_sort_kill_list ( ) ;
break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_8 : )
2006-03-20 17:12:09 +00:00
case KEY_F8 :
multi_send_message_start ( ) ;
break ;
case KEY_F9 :
case KEY_F10 :
case KEY_F11 :
case KEY_F12 :
multi_send_macro ( key ) ;
break ; // send taunt macros
2010-03-31 06:19:37 +00:00
# if defined(__APPLE__) || defined(macintosh)
2006-03-20 17:12:09 +00:00
case KEY_9 + KEY_COMMAND :
multi_send_macro ( KEY_F9 ) ;
break ;
case KEY_0 + KEY_COMMAND :
multi_send_macro ( KEY_F10 ) ;
break ;
case KEY_1 + KEY_COMMAND + KEY_CTRLED :
multi_send_macro ( KEY_F11 ) ;
break ;
case KEY_2 + KEY_COMMAND + KEY_CTRLED :
multi_send_macro ( KEY_F12 ) ;
break ;
2008-12-07 12:26:43 +00:00
# endif
2006-03-20 17:12:09 +00:00
case KEY_SHIFTED + KEY_F9 :
case KEY_SHIFTED + KEY_F10 :
case KEY_SHIFTED + KEY_F11 :
case KEY_SHIFTED + KEY_F12 :
multi_define_macro ( key ) ;
break ; // redefine taunt macros
2010-03-31 06:19:37 +00:00
# if defined(__APPLE__) || defined(macintosh)
2006-03-20 17:12:09 +00:00
case KEY_9 + KEY_SHIFTED + KEY_COMMAND :
multi_define_macro ( KEY_F9 ) ;
break ;
case KEY_0 + KEY_SHIFTED + KEY_COMMAND :
multi_define_macro ( KEY_F10 ) ;
break ;
case KEY_1 + KEY_SHIFTED + KEY_COMMAND + KEY_CTRLED :
multi_define_macro ( KEY_F11 ) ;
break ;
case KEY_2 + KEY_SHIFTED + KEY_COMMAND + KEY_CTRLED :
multi_define_macro ( KEY_F12 ) ;
break ;
2010-03-31 06:19:37 +00:00
# endif
2006-03-20 17:12:09 +00:00
2010-02-25 03:08:10 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_SHIFTED + KEY_S : )
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_ALTED + KEY_2 : )
2006-03-20 17:12:09 +00:00
case KEY_ALTED + KEY_F2 :
2015-12-15 04:09:35 +00:00
if ( Player_dead_state = = player_dead_state : : no )
2015-04-19 04:18:49 +00:00
state_save_all ( secret_save : : none , blind_save : : no ) ; // 0 means not between levels.
2006-03-20 17:12:09 +00:00
break ;
2010-02-25 03:08:10 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_S : )
2013-12-10 17:13:32 +00:00
case KEY_ALTED + KEY_SHIFTED + KEY_F2 :
2015-12-15 04:09:35 +00:00
if ( Player_dead_state = = player_dead_state : : no )
2015-04-19 04:18:49 +00:00
state_save_all ( secret_save : : none , blind_save : : yes ) ;
2011-02-09 11:58:32 +00:00
break ;
2013-12-10 17:13:32 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_SHIFTED + KEY_O : )
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_ALTED + KEY_3 : )
2006-03-20 17:12:09 +00:00
case KEY_ALTED + KEY_F3 :
2011-01-18 14:53:28 +00:00
if ( ! ( ( Game_mode & GM_MULTI ) & & ! ( Game_mode & GM_MULTI_COOP ) ) )
2015-04-19 04:18:49 +00:00
state_restore_all ( 1 , secret_restore : : none , nullptr , blind_save : : no ) ;
2013-12-10 17:13:32 +00:00
break ;
KEY_MAC ( case KEY_COMMAND + KEY_O : )
case KEY_ALTED + KEY_SHIFTED + KEY_F3 :
if ( ! ( ( Game_mode & GM_MULTI ) & & ! ( Game_mode & GM_MULTI_COOP ) ) )
2015-04-19 04:18:49 +00:00
state_restore_all ( 1 , secret_restore : : none , nullptr , blind_save : : yes ) ;
2006-03-20 17:12:09 +00:00
break ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_SHIFTED + KEY_4 : )
2006-03-20 17:12:09 +00:00
case KEY_F4 + KEY_SHIFTED :
do_escort_menu ( ) ;
break ;
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_SHIFTED + KEY_ALTED + KEY_4 : )
2006-03-20 17:12:09 +00:00
case KEY_F4 + KEY_SHIFTED + KEY_ALTED :
change_guidebot_name ( ) ;
break ;
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
2008-06-15 08:50:05 +00:00
/*
* Jukebox hotkeys - - MD2211 , 2007
* Now for all music
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
case KEY_ALTED + KEY_SHIFTED + KEY_F9 :
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_E : )
2018-07-14 17:23:15 +00:00
# if DXX_USE_SDL_REDBOOK_AUDIO
2010-06-14 08:13:16 +00:00
if ( GameCfg . MusicType = = MUSIC_TYPE_REDBOOK )
{
songs_stop_all ( ) ;
RBAEjectDisk ( ) ;
}
2018-07-14 17:23:15 +00:00
# endif
2008-06-15 08:50:05 +00:00
break ;
2010-06-14 08:13:16 +00:00
2007-09-18 13:37:39 +00:00
case KEY_ALTED + KEY_SHIFTED + KEY_F10 :
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_UP : )
KEY_MAC ( case KEY_COMMAND + KEY_DOWN : )
2010-06-14 08:13:16 +00:00
songs_pause_resume ( ) ;
2007-09-18 13:37:39 +00:00
break ;
2010-06-14 08:13:16 +00:00
2008-06-15 08:50:05 +00:00
case KEY_MINUS + KEY_ALTED :
2007-09-18 13:37:39 +00:00
case KEY_ALTED + KEY_SHIFTED + KEY_F11 :
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_LEFT : )
2010-06-14 08:13:16 +00:00
songs_play_level_song ( Current_level_num , - 1 ) ;
2006-03-20 17:12:09 +00:00
break ;
2008-06-15 08:50:05 +00:00
case KEY_EQUAL + KEY_ALTED :
2008-05-18 13:20:06 +00:00
case KEY_ALTED + KEY_SHIFTED + KEY_F12 :
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_RIGHT : )
2010-06-14 08:13:16 +00:00
songs_play_level_song ( Current_level_num , 1 ) ;
2006-03-20 17:12:09 +00:00
break ;
2010-06-14 08:13:16 +00:00
2006-03-20 17:12:09 +00:00
default :
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2010-03-31 06:19:37 +00:00
}
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2006-03-20 17:12:09 +00:00
}
2016-08-25 04:05:32 +00:00
}
2006-03-20 17:12:09 +00:00
2016-08-25 04:05:32 +00:00
namespace dsx {
2014-08-06 02:10:49 +00:00
static window_event_result HandleGameKey ( int key )
2006-03-20 17:12:09 +00:00
{
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
auto & vmobjptr = Objects . vmptr ;
2006-03-20 17:12:09 +00:00
switch ( key ) {
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
case KEY_1 + KEY_SHIFTED :
case KEY_2 + KEY_SHIFTED :
case KEY_3 + KEY_SHIFTED :
case KEY_4 + KEY_SHIFTED :
case KEY_5 + KEY_SHIFTED :
case KEY_6 + KEY_SHIFTED :
case KEY_7 + KEY_SHIFTED :
case KEY_8 + KEY_SHIFTED :
case KEY_9 + KEY_SHIFTED :
case KEY_0 + KEY_SHIFTED :
2008-04-13 00:28:36 +00:00
if ( PlayerCfg . EscortHotKeys )
2007-09-24 21:25:47 +00:00
{
2019-06-27 03:26:20 +00:00
auto & BuddyState = LevelUniqueObjectState . BuddyState ;
if ( Game_mode & GM_MULTI )
{
if ( ! check_warn_local_player_can_control_guidebot ( Objects . vcptr , BuddyState , Netgame ) )
return window_event_result : : handled ;
}
set_escort_special_goal ( BuddyState , key ) ;
2008-05-19 11:31:15 +00:00
game_flush_inputs ( ) ;
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2007-09-24 21:25:47 +00:00
}
2012-03-28 09:07:17 +00:00
else
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
2007-06-14 20:52:14 +00:00
case KEY_ALTED + KEY_F7 :
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_ALTED + KEY_7 : )
2015-11-14 18:17:22 +00:00
PlayerCfg . HudMode = static_cast < HudType > ( ( static_cast < unsigned > ( PlayerCfg . HudMode ) + 1 ) % GAUGE_HUD_NUMMODES ) ;
2008-04-13 00:28:36 +00:00
write_player_file ( ) ;
2013-04-08 12:28:55 +00:00
switch ( PlayerCfg . HudMode )
{
2015-11-14 18:17:22 +00:00
case HudType : : Standard :
HUD_init_message_literal ( HM_DEFAULT , " Standard HUD " ) ;
break ;
case HudType : : Alternate1 :
HUD_init_message_literal ( HM_DEFAULT , " Alternative HUD #1 " ) ;
break ;
case HudType : : Alternate2 :
HUD_init_message_literal ( HM_DEFAULT , " Alternative HUD #2 " ) ;
break ;
case HudType : : Hidden :
HUD_init_message_literal ( HM_DEFAULT , " No HUD " ) ;
break ;
2013-04-08 12:28:55 +00:00
}
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2006-03-20 17:12:09 +00:00
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_6 : )
2006-03-20 17:12:09 +00:00
case KEY_F6 :
if ( Netgame . RefusePlayers & & WaitForRefuseAnswer & & ! ( Game_mode & GM_TEAM ) )
2007-09-13 10:05:36 +00:00
{
RefuseThisPlayer = 1 ;
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_MULTI , " Player accepted! " ) ;
2007-09-13 10:05:36 +00:00
}
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2006-03-20 17:12:09 +00:00
case KEY_ALTED + KEY_1 :
if ( Netgame . RefusePlayers & & WaitForRefuseAnswer & & ( Game_mode & GM_TEAM ) )
{
RefuseThisPlayer = 1 ;
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_MULTI , " Player accepted! " ) ;
2006-03-20 17:12:09 +00:00
RefuseTeam = 1 ;
2008-05-19 11:31:15 +00:00
game_flush_inputs ( ) ;
2006-03-20 17:12:09 +00:00
}
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2006-03-20 17:12:09 +00:00
case KEY_ALTED + KEY_2 :
if ( Netgame . RefusePlayers & & WaitForRefuseAnswer & & ( Game_mode & GM_TEAM ) )
{
RefuseThisPlayer = 1 ;
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_MULTI , " Player accepted! " ) ;
2006-03-20 17:12:09 +00:00
RefuseTeam = 2 ;
2008-05-19 11:31:15 +00:00
game_flush_inputs ( ) ;
2006-03-20 17:12:09 +00:00
}
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2006-03-20 17:12:09 +00:00
default :
break ;
} //switch (key)
2007-09-24 21:25:47 +00:00
2015-12-15 04:09:35 +00:00
if ( Player_dead_state = = player_dead_state : : no )
2007-09-24 21:25:47 +00:00
switch ( key )
{
2010-03-31 09:18:28 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_SHIFTED + KEY_5 : )
2007-09-24 21:25:47 +00:00
case KEY_F5 + KEY_SHIFTED :
2016-10-02 00:34:44 +00:00
DropCurrentWeapon ( get_local_plrobj ( ) . ctype . player_info ) ;
2007-09-24 21:25:47 +00:00
break ;
2010-06-14 08:13:16 +00:00
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_SHIFTED + KEY_6 : )
2007-09-24 21:25:47 +00:00
case KEY_F6 + KEY_SHIFTED :
2016-10-02 00:34:44 +00:00
DropSecondaryWeapon ( get_local_plrobj ( ) . ctype . player_info ) ;
2007-09-24 21:25:47 +00:00
break ;
2015-07-02 02:37:55 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2007-09-24 21:25:47 +00:00
case KEY_0 + KEY_ALTED :
DropFlag ( ) ;
2008-05-19 11:31:15 +00:00
game_flush_inputs ( ) ;
2007-09-24 21:25:47 +00:00
break ;
2010-06-14 08:13:16 +00:00
2009-01-15 01:00:19 +00:00
KEY_MAC ( case KEY_COMMAND + KEY_4 : )
2007-09-24 21:25:47 +00:00
case KEY_F4 :
2018-03-10 22:45:04 +00:00
if ( ! MarkerState . DefiningMarkerMessage ( ) )
2007-09-24 21:25:47 +00:00
InitMarkerInput ( ) ;
break ;
2015-07-02 02:37:55 +00:00
# endif
2010-06-14 08:13:16 +00:00
2010-03-31 09:18:28 +00:00
default :
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2007-09-24 21:25:47 +00:00
}
2010-03-31 09:38:25 +00:00
else
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2010-06-14 08:13:16 +00:00
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2006-03-20 17:12:09 +00:00
}
2016-08-25 04:05:32 +00:00
}
2006-03-20 17:12:09 +00:00
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2013-09-22 22:26:27 +00:00
static void kill_all_robots ( void )
2006-03-20 17:12:09 +00:00
{
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
auto & vmobjptr = Objects . vmptr ;
2014-09-26 02:42:09 +00:00
int dead_count = 0 ;
2006-03-20 17:12:09 +00:00
//int boss_index = -1;
2018-12-30 00:43:59 +00:00
auto & Robot_info = LevelSharedRobotInfoState . Robot_info ;
2006-03-20 17:12:09 +00:00
// Kill all bots except for Buddy bot and boss. However, if only boss and buddy left, kill boss.
2017-06-10 03:31:02 +00:00
range_for ( const auto & & objp , vmobjptr )
2015-06-13 22:42:17 +00:00
{
if ( objp - > type = = OBJ_ROBOT )
{
if ( ! Robot_info [ get_robot_id ( objp ) ] . companion & & ! Robot_info [ get_robot_id ( objp ) ] . boss_flag ) {
2006-03-20 17:12:09 +00:00
dead_count + + ;
2015-06-13 22:42:17 +00:00
objp - > flags | = OF_EXPLODING | OF_SHOULD_BE_DEAD ;
2006-03-20 17:12:09 +00:00
}
}
2015-06-13 22:42:17 +00:00
}
2006-03-20 17:12:09 +00:00
// -- // Now, if more than boss and buddy left, un-kill boss.
// -- if ((dead_count > 2) && (boss_index != -1)) {
// -- Objects[boss_index].flags &= ~(OF_EXPLODING|OF_SHOULD_BE_DEAD);
// -- dead_count--;
// -- } else if (boss_index != -1)
2010-07-13 06:35:25 +00:00
// -- HUD_init_message(HM_DEFAULT, "Toasted the BOSS!");
2006-03-20 17:12:09 +00:00
// Toast the buddy if nothing else toasted!
if ( dead_count = = 0 )
2017-06-10 03:31:02 +00:00
range_for ( const auto & & objp , vmobjptr )
2015-06-13 22:42:17 +00:00
{
if ( objp - > type = = OBJ_ROBOT )
if ( Robot_info [ get_robot_id ( objp ) ] . companion ) {
objp - > flags | = OF_EXPLODING | OF_SHOULD_BE_DEAD ;
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " Toasted the Buddy! *sniff* " ) ;
2006-03-20 17:12:09 +00:00
dead_count + + ;
}
2015-06-13 22:42:17 +00:00
}
2006-03-20 17:12:09 +00:00
2010-07-13 06:35:25 +00:00
HUD_init_message ( HM_DEFAULT , " %i robots toasted! " , dead_count ) ;
2006-03-20 17:12:09 +00:00
}
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
// --------------------------------------------------------------------------
// Detonate reactor.
// Award player all powerups in mine.
// Place player just outside exit.
// Kill all bots in mine.
// Yippee!!
2017-07-26 03:15:59 +00:00
static void kill_and_so_forth ( fvmobjptridx & vmobjptridx , fvmsegptridx & vmsegptridx )
2006-03-20 17:12:09 +00:00
{
2020-05-17 23:35:25 +00:00
auto & LevelSharedVertexState = LevelSharedSegmentState . get_vertex_state ( ) ;
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
2020-05-17 23:35:25 +00:00
auto & Vertices = LevelSharedVertexState . get_vertices ( ) ;
2019-03-03 00:31:08 +00:00
auto & vmobjptr = Objects . vmptr ;
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " Killing, awarding, etc.! " ) ;
2006-03-20 17:12:09 +00:00
2017-06-10 03:31:02 +00:00
range_for ( const auto & & o , vmobjptridx )
2014-10-12 23:05:46 +00:00
{
2014-12-23 04:20:27 +00:00
switch ( o - > type ) {
2006-03-20 17:12:09 +00:00
case OBJ_ROBOT :
2019-09-01 00:20:28 +00:00
apply_damage_to_robot ( o , o - > shields + 1 , get_local_player ( ) . objnum ) ;
2006-03-20 17:12:09 +00:00
break ;
case OBJ_POWERUP :
2014-12-23 04:20:27 +00:00
do_powerup ( o ) ;
2006-03-20 17:12:09 +00:00
break ;
2016-11-20 23:12:00 +00:00
default :
break ;
2006-03-20 17:12:09 +00:00
}
}
2014-01-11 22:52:00 +00:00
do_controlcen_destroyed_stuff ( object_none ) ;
2006-03-20 17:12:09 +00:00
2018-12-30 00:43:58 +00:00
auto & Triggers = LevelUniqueWallSubsystemState . Triggers ;
auto & vctrgptr = Triggers . vcptr ;
2018-12-30 00:43:58 +00:00
auto & Walls = LevelUniqueWallSubsystemState . Walls ;
auto & vcwallptr = Walls . vcptr ;
2018-12-13 02:31:39 +00:00
for ( trgnum_t i = 0 ; i < Triggers . get_count ( ) ; i + + )
2016-02-06 22:12:54 +00:00
{
const auto & & t = vctrgptr ( i ) ;
if ( trigger_is_exit ( t ) )
{
2018-06-24 05:06:15 +00:00
range_for ( const auto & & wp , vcwallptr )
2014-04-27 23:12:34 +00:00
{
2018-06-24 05:06:15 +00:00
auto & w = * wp ;
if ( w . trigger = = i )
2016-02-12 04:02:28 +00:00
{
2018-06-24 05:06:15 +00:00
const auto & & segp = vmsegptridx ( w . segnum ) ;
2018-12-30 00:43:57 +00:00
auto & vcvertptr = Vertices . vcptr ;
2018-03-12 03:43:47 +00:00
compute_segment_center ( vcvertptr , ConsoleObject - > pos , segp ) ;
2018-03-12 03:43:46 +00:00
obj_relink ( vmobjptr , vmsegptr , vmobjptridx ( ConsoleObject ) , segp ) ;
2018-06-24 05:06:15 +00:00
return ;
2006-03-20 17:12:09 +00:00
}
}
}
}
}
# ifndef RELEASE
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2013-10-26 19:15:53 +00:00
static void kill_all_snipers ( void ) __attribute_used ;
static void kill_all_snipers ( void )
2006-03-20 17:12:09 +00:00
{
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
auto & vmobjptr = Objects . vmptr ;
2014-09-26 02:42:09 +00:00
int dead_count = 0 ;
2006-03-20 17:12:09 +00:00
// Kill all snipers.
2017-06-10 03:31:02 +00:00
range_for ( const auto & & objp , vmobjptr )
2015-06-13 22:42:17 +00:00
{
if ( objp - > type = = OBJ_ROBOT )
if ( objp - > ctype . ai_info . behavior = = ai_behavior : : AIB_SNIPE )
{
2006-03-20 17:12:09 +00:00
dead_count + + ;
2015-06-13 22:42:17 +00:00
objp - > flags | = OF_EXPLODING | OF_SHOULD_BE_DEAD ;
2006-03-20 17:12:09 +00:00
}
2015-06-13 22:42:17 +00:00
}
2006-03-20 17:12:09 +00:00
2010-07-13 06:35:25 +00:00
HUD_init_message ( HM_DEFAULT , " %i robots toasted! " , dead_count ) ;
2006-03-20 17:12:09 +00:00
}
2013-10-26 19:15:53 +00:00
static void kill_thief ( void ) __attribute_used ;
static void kill_thief ( void )
2006-03-20 17:12:09 +00:00
{
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
auto & vmobjptr = Objects . vmptr ;
2018-12-30 00:43:59 +00:00
auto & Robot_info = LevelSharedRobotInfoState . Robot_info ;
2006-03-20 17:12:09 +00:00
// Kill thief.
2017-06-10 03:31:02 +00:00
range_for ( const auto & & objp , vmobjptr )
2015-06-13 22:42:17 +00:00
{
if ( objp - > type = = OBJ_ROBOT )
if ( Robot_info [ get_robot_id ( objp ) ] . thief )
{
objp - > flags | = OF_EXPLODING | OF_SHOULD_BE_DEAD ;
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " Thief toasted! " ) ;
2006-03-20 17:12:09 +00:00
}
2015-06-13 22:42:17 +00:00
}
2006-03-20 17:12:09 +00:00
}
2013-10-26 19:15:53 +00:00
static void kill_buddy ( void ) __attribute_used ;
static void kill_buddy ( void )
2006-03-20 17:12:09 +00:00
{
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
auto & vmobjptr = Objects . vmptr ;
2018-12-30 00:43:59 +00:00
auto & Robot_info = LevelSharedRobotInfoState . Robot_info ;
2006-03-20 17:12:09 +00:00
// Kill buddy.
2017-06-10 03:31:02 +00:00
range_for ( const auto & & objp , vmobjptr )
2015-06-13 22:42:17 +00:00
{
if ( objp - > type = = OBJ_ROBOT )
if ( Robot_info [ get_robot_id ( objp ) ] . companion )
{
objp - > flags | = OF_EXPLODING | OF_SHOULD_BE_DEAD ;
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " Buddy toasted! " ) ;
2006-03-20 17:12:09 +00:00
}
2015-06-13 22:42:17 +00:00
}
2006-03-20 17:12:09 +00:00
}
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
2016-08-25 04:05:32 +00:00
namespace dsx {
2017-07-26 03:15:59 +00:00
static window_event_result HandleTestKey ( fvmsegptridx & vmsegptridx , int key )
2006-03-20 17:12:09 +00:00
{
2020-05-17 23:35:25 +00:00
auto & LevelSharedVertexState = LevelSharedSegmentState . get_vertex_state ( ) ;
2020-02-26 05:07:34 +00:00
auto & LevelUniqueMorphObjectState = LevelUniqueObjectState . MorphObjectState ;
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
2020-05-17 23:35:25 +00:00
auto & Vertices = LevelSharedVertexState . get_vertices ( ) ;
2019-03-03 00:31:08 +00:00
auto & vmobjptr = Objects . vmptr ;
auto & vmobjptridx = Objects . vmptridx ;
2010-03-31 06:19:37 +00:00
switch ( key )
{
2006-03-20 17:12:09 +00:00
2010-03-31 06:19:37 +00:00
# ifdef SHOW_EXIT_PATH
case KEY_DEBUGGED + KEY_1 : create_special_path ( ) ; break ;
# endif
2006-03-20 17:12:09 +00:00
case KEY_DEBUGGED + KEY_Y :
2014-01-11 22:52:00 +00:00
do_controlcen_destroyed_stuff ( object_none ) ;
2006-03-20 17:12:09 +00:00
break ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
case KEY_DEBUGGED + KEY_ALTED + KEY_D :
2008-04-13 00:28:36 +00:00
PlayerCfg . NetlifeKills = 4000 ; PlayerCfg . NetlifeKilled = 5 ;
2015-11-27 03:56:13 +00:00
multi_add_lifetime_kills ( 1 ) ;
2006-03-20 17:12:09 +00:00
break ;
2013-03-03 01:03:33 +00:00
case KEY_DEBUGGED + KEY_R + KEY_SHIFTED :
kill_all_robots ( ) ;
break ;
# endif
2006-03-20 17:12:09 +00:00
case KEY_BACKSP :
case KEY_CTRLED + KEY_BACKSP :
case KEY_ALTED + KEY_BACKSP :
case KEY_SHIFTED + KEY_BACKSP :
case KEY_SHIFTED + KEY_ALTED + KEY_BACKSP :
case KEY_CTRLED + KEY_ALTED + KEY_BACKSP :
case KEY_SHIFTED + KEY_CTRLED + KEY_BACKSP :
case KEY_SHIFTED + KEY_CTRLED + KEY_ALTED + KEY_BACKSP :
2010-03-31 06:19:37 +00:00
Int3 ( ) ; break ;
2006-03-20 17:12:09 +00:00
case KEY_DEBUGGED + KEY_S : digi_reset ( ) ; break ;
case KEY_DEBUGGED + KEY_P :
if ( Game_suspended & SUSP_ROBOTS )
Game_suspended & = ~ SUSP_ROBOTS ; //robots move
else
Game_suspended | = SUSP_ROBOTS ; //robots don't move
break ;
2016-12-30 13:45:47 +00:00
case KEY_DEBUGGED + KEY_M :
{
static int i = 0 ;
2017-06-10 03:31:02 +00:00
const auto & & segp = vmsegptridx ( ConsoleObject - > segnum ) ;
2018-12-30 00:43:57 +00:00
auto & vcvertptr = Vertices . vcptr ;
2018-03-12 03:43:47 +00:00
const auto & & new_obj = create_morph_robot ( segp , compute_segment_center ( vcvertptr , segp ) , i ) ;
2016-12-30 13:45:47 +00:00
if ( new_obj ! = object_none )
2020-02-26 05:07:34 +00:00
morph_start ( LevelUniqueMorphObjectState , LevelSharedPolygonModelState , new_obj ) ;
2016-12-30 13:45:47 +00:00
i + + ;
2018-12-30 00:43:59 +00:00
if ( i > = LevelSharedRobotInfoState . N_robot_types )
2016-12-30 13:45:47 +00:00
i = 0 ;
break ;
}
2016-10-02 00:34:40 +00:00
case KEY_DEBUGGED + KEY_K :
get_local_plrobj ( ) . shields = 1 ;
break ; // a virtual kill
case KEY_DEBUGGED + KEY_SHIFTED + KEY_K :
get_local_plrobj ( ) . shields = - 1 ;
break ; // an actual kill
2015-07-25 23:10:46 +00:00
case KEY_DEBUGGED + KEY_X : get_local_player ( ) . lives + + ; break ; // Extra life cheat key.
2006-03-20 17:12:09 +00:00
case KEY_DEBUGGED + KEY_H :
2016-07-03 00:54:15 +00:00
{
2015-12-15 04:09:35 +00:00
if ( Player_dead_state ! = player_dead_state : : no )
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2010-03-31 09:18:28 +00:00
2016-10-02 00:34:39 +00:00
auto & player_info = get_local_plrobj ( ) . ctype . player_info ;
2016-10-02 00:34:40 +00:00
auto & pl_flags = player_info . powerup_flags ;
2016-07-03 00:54:15 +00:00
pl_flags ^ = PLAYER_FLAGS_CLOAKED ;
if ( pl_flags & PLAYER_FLAGS_CLOAKED ) {
2010-03-31 06:19:37 +00:00
if ( Game_mode & GM_MULTI )
multi_send_cloak ( ) ;
ai_do_cloak_stuff ( ) ;
2016-10-02 00:34:39 +00:00
player_info . cloak_time = GameTime64 ;
2010-03-31 06:19:37 +00:00
}
2006-03-20 17:12:09 +00:00
break ;
2016-07-03 00:54:15 +00:00
}
2006-03-20 17:12:09 +00:00
case KEY_DEBUGGED + KEY_R :
2011-02-14 21:27:07 +00:00
cheats . robotfiringsuspended = ! cheats . robotfiringsuspended ;
2006-03-20 17:12:09 +00:00
break ;
2016-09-11 18:49:16 +00:00
# if DXX_USE_EDITOR //editor-specific functions
2006-03-20 17:12:09 +00:00
case KEY_E + KEY_DEBUGGED :
2016-11-15 08:18:56 +00:00
{
2012-04-14 09:42:44 +00:00
window_set_visible ( Game_wind , 0 ) ; // don't let the game do anything while we set the editor up
2016-11-15 08:18:56 +00:00
auto old_gamestate = gamestate ;
gamestate = editor_gamestate : : unsaved ; // saved game editing mode
2012-03-19 05:49:19 +00:00
init_editor ( ) ;
2016-11-10 11:23:40 +00:00
// If editor failed to load, carry on playing
if ( ! EditorWindow )
2016-11-13 05:34:13 +00:00
{
2016-11-10 11:23:40 +00:00
window_set_visible ( Game_wind , 1 ) ;
2016-11-15 08:18:56 +00:00
gamestate = old_gamestate ;
2016-11-13 05:34:13 +00:00
return window_event_result : : handled ;
}
return window_event_result : : close ;
2016-11-15 08:18:56 +00:00
}
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
case KEY_Q + KEY_SHIFTED + KEY_DEBUGGED :
{
2013-01-06 21:11:53 +00:00
palette_array_t save_pal ;
save_pal = gr_palette ;
2013-10-27 21:01:04 +00:00
PlayMovie ( " end.tex " , " end.mve " , MOVIE_ABORT_ON ) ;
2006-03-20 17:12:09 +00:00
Screen_mode = - 1 ;
set_screen_mode ( SCREEN_GAME ) ;
reset_cockpit ( ) ;
2013-01-06 21:11:53 +00:00
gr_palette = save_pal ;
2006-03-20 17:12:09 +00:00
gr_palette_load ( gr_palette ) ;
break ;
}
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
case KEY_C + KEY_SHIFTED + KEY_DEBUGGED :
2015-12-15 04:09:35 +00:00
if ( Player_dead_state = = player_dead_state : : no & &
! ( Game_mode & GM_MULTI ) )
2006-03-20 17:12:09 +00:00
move_player_2_segment ( Cursegp , Curside ) ;
break ; //move eye to curseg
case KEY_DEBUGGED + KEY_W : draw_world_from_game ( ) ; break ;
# endif //#ifdef EDITOR
2010-03-31 09:18:28 +00:00
case KEY_DEBUGGED + KEY_LAPOSTRO : Show_view_text_timer = 0x30000 ; object_goto_next_viewer ( ) ; break ;
case KEY_DEBUGGED + KEY_SHIFTED + KEY_LAPOSTRO : Viewer = ConsoleObject ; break ;
case KEY_DEBUGGED + KEY_O : toggle_outline_mode ( ) ; break ;
case KEY_DEBUGGED + KEY_T :
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2013-09-08 04:25:05 +00:00
{
static int Toggle_var ;
Toggle_var = ! Toggle_var ;
if ( Toggle_var )
2015-11-24 04:05:35 +00:00
CGameArg . SysMaxFPS = 300 ;
2012-03-28 09:02:30 +00:00
else
2015-11-24 04:05:35 +00:00
CGameArg . SysMaxFPS = 30 ;
2013-09-08 04:25:05 +00:00
}
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
break ;
case KEY_DEBUGGED + KEY_L :
2017-11-01 02:01:21 +00:00
# if !DXX_USE_OGL
2016-06-13 11:24:38 +00:00
if ( + + Lighting_on > = 2 )
Lighting_on = 0 ;
2017-11-01 02:01:21 +00:00
# endif
2016-06-13 11:24:38 +00:00
break ;
2006-03-20 17:12:09 +00:00
case KEY_PAD5 : slew_stop ( ) ; break ;
# ifndef NDEBUG
case KEY_DEBUGGED + KEY_F11 : play_test_sound ( ) ; break ;
# endif
case KEY_DEBUGGED + KEY_C :
do_cheat_menu ( ) ;
break ;
case KEY_DEBUGGED + KEY_SHIFTED + KEY_A :
do_megawow_powerup ( 10 ) ;
break ;
case KEY_DEBUGGED + KEY_A : {
do_megawow_powerup ( 200 ) ;
2010-03-31 06:19:37 +00:00
break ;
2006-03-20 17:12:09 +00:00
}
case KEY_DEBUGGED + KEY_SPACEBAR : //KEY_F7: // Toggle physics flying
slew_stop ( ) ;
game_flush_inputs ( ) ;
2020-08-10 03:45:13 +00:00
if ( ConsoleObject - > control_source ! = object : : control_type : : flying )
2020-08-06 03:47:56 +00:00
{
2016-09-11 18:49:13 +00:00
fly_init ( * ConsoleObject ) ;
2006-03-20 17:12:09 +00:00
Game_suspended & = ~ SUSP_ROBOTS ; //robots move
} else {
2017-06-10 03:31:02 +00:00
slew_init ( vmobjptr ( ConsoleObject ) ) ; //start player slewing
2006-03-20 17:12:09 +00:00
Game_suspended | = SUSP_ROBOTS ; //robots don't move
}
break ;
case KEY_DEBUGGED + KEY_COMMA : Render_zoom = fixmul ( Render_zoom , 62259 ) ; break ;
case KEY_DEBUGGED + KEY_PERIOD : Render_zoom = fixmul ( Render_zoom , 68985 ) ; break ;
# ifndef NDEBUG
case KEY_DEBUGGED + KEY_D :
2015-12-24 04:01:28 +00:00
if ( ( CGameArg . DbgNoDoubleBuffer = ! CGameArg . DbgNoDoubleBuffer ) ! = 0 )
2006-03-20 17:12:09 +00:00
init_cockpit ( ) ;
break ;
# endif
2016-09-11 18:49:16 +00:00
# if DXX_USE_EDITOR
2006-03-20 17:12:09 +00:00
case KEY_DEBUGGED + KEY_Q :
2015-10-09 02:46:09 +00:00
{
pause_game_world_time p ;
2006-03-20 17:12:09 +00:00
dump_used_textures_all ( ) ;
2015-10-09 02:46:09 +00:00
}
2006-03-20 17:12:09 +00:00
break ;
2010-03-31 06:19:37 +00:00
# endif
2006-03-20 17:12:09 +00:00
case KEY_DEBUGGED + KEY_B : {
2014-07-23 02:27:22 +00:00
d_fname text { } ;
2006-03-20 17:12:09 +00:00
int item ;
2020-05-02 21:18:42 +00:00
std : : array < newmenu_item , 1 > m { {
2015-01-18 01:58:31 +00:00
nm_item_input ( text ) ,
2015-03-22 18:49:21 +00:00
} } ;
2015-01-18 01:58:32 +00:00
item = newmenu_do ( NULL , " Briefing to play? " , m , unused_newmenu_subfunction , unused_newmenu_userdata ) ;
2006-03-20 17:12:09 +00:00
if ( item ! = - 1 ) {
do_briefing_screens ( text , 1 ) ;
}
break ;
}
case KEY_DEBUGGED + KEY_SHIFTED + KEY_B :
2015-12-15 04:09:35 +00:00
if ( Player_dead_state ! = player_dead_state : : no )
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2010-03-31 09:18:28 +00:00
2017-07-26 03:15:59 +00:00
kill_and_so_forth ( vmobjptridx , vmsegptridx ) ;
2006-03-20 17:12:09 +00:00
break ;
2007-10-28 20:14:25 +00:00
case KEY_DEBUGGED + KEY_G :
2017-02-22 03:05:43 +00:00
GameTime64 = ( INT64_MAX ) - ( F1_0 * 10 ) ;
2013-08-03 20:00:10 +00:00
HUD_init_message ( HM_DEFAULT , " GameTime % " PRIi64 " - Reset in 10 seconds! " , GameTime64 ) ;
2007-10-28 20:14:25 +00:00
break ;
2010-03-31 06:19:37 +00:00
default :
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2006-03-20 17:12:09 +00:00
}
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2006-03-20 17:12:09 +00:00
}
2016-08-25 04:05:32 +00:00
}
2006-03-20 17:12:09 +00:00
# endif //#ifndef RELEASE
2011-02-14 21:27:07 +00:00
# define CHEAT_MAX_LEN 15
2013-12-22 22:03:07 +00:00
struct cheat_code
2006-03-20 17:12:09 +00:00
{
2013-10-05 21:05:09 +00:00
const char string [ CHEAT_MAX_LEN ] ;
2018-05-05 22:33:55 +00:00
int game_cheats : : * stateptr ;
2014-06-26 02:18:48 +00:00
} ;
2011-02-14 21:27:07 +00:00
2016-07-16 16:52:04 +00:00
constexpr cheat_code cheat_codes [ ] = {
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I)
2013-11-28 02:16:05 +00:00
{ " gabbagabbahey " , & game_cheats : : enabled } ,
{ " scourge " , & game_cheats : : wowie } ,
{ " bigred " , & game_cheats : : wowie2 } ,
{ " mitzi " , & game_cheats : : allkeys } ,
{ " racerx " , & game_cheats : : invul } ,
{ " guile " , & game_cheats : : cloak } ,
{ " twilight " , & game_cheats : : shields } ,
{ " poboys " , & game_cheats : : killreactor } ,
{ " farmerjoe " , & game_cheats : : levelwarp } ,
{ " bruin " , & game_cheats : : extralife } ,
{ " porgys " , & game_cheats : : rapidfire } ,
{ " ahimsa " , & game_cheats : : robotfiringsuspended } ,
2017-01-29 04:52:32 +00:00
{ " baldguy " , & game_cheats : : baldguy } ,
2013-03-03 01:03:33 +00:00
# elif defined(DXX_BUILD_DESCENT_II)
2013-11-28 02:16:05 +00:00
{ " gabbagabbahey " , & game_cheats : : lamer } ,
{ " motherlode " , & game_cheats : : lamer } ,
{ " currygoat " , & game_cheats : : lamer } ,
{ " zingermans " , & game_cheats : : lamer } ,
{ " eatangelos " , & game_cheats : : lamer } ,
{ " ericaanne " , & game_cheats : : lamer } ,
{ " joshuaakira " , & game_cheats : : lamer } ,
{ " whammazoom " , & game_cheats : : lamer } ,
{ " honestbob " , & game_cheats : : wowie } ,
2017-01-29 07:19:02 +00:00
{ " oralgroove " , & game_cheats : : allkeys } ,
2013-11-28 02:16:05 +00:00
{ " alifalafel " , & game_cheats : : accessory } ,
{ " almighty " , & game_cheats : : invul } ,
{ " blueorb " , & game_cheats : : shields } ,
{ " delshiftb " , & game_cheats : : killreactor } ,
{ " freespace " , & game_cheats : : levelwarp } ,
{ " rockrgrl " , & game_cheats : : fullautomap } ,
{ " wildfire " , & game_cheats : : rapidfire } ,
{ " duddaboo " , & game_cheats : : bouncyfire } ,
2017-01-29 21:02:48 +00:00
{ " lpnlizard " , & game_cheats : : homingfire } ,
2013-11-28 02:16:05 +00:00
{ " imagespace " , & game_cheats : : robotfiringsuspended } ,
{ " spaniard " , & game_cheats : : killallrobots } ,
{ " silkwing " , & game_cheats : : robotskillrobots } ,
{ " godzilla " , & game_cheats : : monsterdamage } ,
{ " helpvishnu " , & game_cheats : : buddyclone } ,
{ " gowingnut " , & game_cheats : : buddyangry } ,
2013-03-03 01:03:33 +00:00
# endif
2013-11-28 02:16:05 +00:00
{ " flash " , & game_cheats : : exitpath } ,
{ " astral " , & game_cheats : : ghostphysics } ,
{ " buggin " , & game_cheats : : turbo } ,
{ " bittersweet " , & game_cheats : : acid } ,
2011-02-14 21:27:07 +00:00
} ;
2016-08-25 04:05:32 +00:00
namespace dsx {
2015-01-18 01:58:33 +00:00
static window_event_result FinalCheats ( )
2011-02-14 21:27:07 +00:00
{
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
auto & vmobjptr = Objects . vmptr ;
auto & vmobjptridx = Objects . vmptridx ;
2018-05-05 22:33:55 +00:00
int game_cheats : : * gotcha ;
2006-03-20 17:12:09 +00:00
2011-02-14 21:27:07 +00:00
if ( Game_mode & GM_MULTI )
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2008-11-18 14:34:52 +00:00
2020-05-02 21:18:42 +00:00
static std : : array < char , CHEAT_MAX_LEN > cheat_buffer ;
2014-10-16 02:37:20 +00:00
std : : move ( std : : next ( cheat_buffer . begin ( ) ) , cheat_buffer . end ( ) , cheat_buffer . begin ( ) ) ;
cheat_buffer . back ( ) = key_ascii ( ) ;
2013-10-03 02:54:20 +00:00
for ( unsigned i = 0 ; ; i + + )
2011-02-14 21:27:07 +00:00
{
2020-07-05 23:34:33 +00:00
if ( i > = std : : size ( cheat_codes ) )
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2011-02-14 21:27:07 +00:00
int cheatlen = strlen ( cheat_codes [ i ] . string ) ;
Assert ( cheatlen < = CHEAT_MAX_LEN ) ;
2014-10-16 02:37:20 +00:00
if ( d_strnicmp ( cheat_codes [ i ] . string , & cheat_buffer [ CHEAT_MAX_LEN - cheatlen ] , cheatlen ) = = 0 )
2011-02-14 21:27:07 +00:00
{
2013-11-28 02:16:05 +00:00
gotcha = cheat_codes [ i ] . stateptr ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I)
2015-06-28 20:04:25 +00:00
if ( ! cheats . enabled & & gotcha ! = & game_cheats : : enabled )
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2013-03-03 01:03:33 +00:00
if ( ! cheats . enabled )
2013-07-21 00:03:38 +00:00
HUD_init_message_literal ( HM_DEFAULT , TXT_CHEATS_ENABLED ) ;
2013-03-03 01:03:33 +00:00
# endif
2013-11-28 02:16:05 +00:00
cheats . * gotcha = ! ( cheats . * gotcha ) ;
2011-02-14 21:27:07 +00:00
cheats . enabled = 1 ;
digi_play_sample ( SOUND_CHEATER , F1_0 ) ;
break ;
}
}
2016-10-28 03:39:41 +00:00
auto & plrobj = get_local_plrobj ( ) ;
auto & player_info = plrobj . ctype . player_info ;
player_info . mission . score = 0 ;
2006-03-20 17:12:09 +00:00
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I)
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : wowie )
2013-03-03 01:03:33 +00:00
{
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , TXT_WOWIE_ZOWIE ) ;
2013-03-03 01:03:33 +00:00
2015-11-07 21:55:59 +00:00
player_info . primary_weapon_flags | = ( HAS_LASER_FLAG | HAS_VULCAN_FLAG | HAS_SPREADFIRE_FLAG ) ;
2013-03-03 01:03:33 +00:00
2016-10-02 00:34:40 +00:00
player_info . vulcan_ammo = VULCAN_AMMO_MAX ;
2015-11-07 21:55:59 +00:00
auto & secondary_ammo = player_info . secondary_ammo ;
2019-05-04 18:27:36 +00:00
range_for ( const unsigned i , xrange ( 3u ) )
2015-10-30 02:52:56 +00:00
secondary_ammo [ i ] = Secondary_ammo_max [ i ] ;
2013-03-03 01:03:33 +00:00
if ( Newdemo_state = = ND_STATE_RECORDING )
2015-11-07 21:55:59 +00:00
newdemo_record_laser_level ( player_info . laser_level , MAX_LASER_LEVEL ) ;
2013-03-03 01:03:33 +00:00
2016-09-11 18:49:13 +00:00
player_info . energy = MAX_ENERGY ;
2015-11-07 21:55:59 +00:00
player_info . laser_level = MAX_LASER_LEVEL ;
2016-10-02 00:34:40 +00:00
player_info . powerup_flags | = PLAYER_FLAGS_QUAD_LASERS ;
2013-03-03 01:03:33 +00:00
update_laser_weapon_info ( ) ;
}
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : wowie2 )
2013-03-03 01:03:33 +00:00
{
HUD_init_message ( HM_DEFAULT , " SUPER %s " , TXT_WOWIE_ZOWIE ) ;
2015-11-07 21:55:59 +00:00
player_info . primary_weapon_flags = ( HAS_LASER_FLAG | HAS_VULCAN_FLAG | HAS_SPREADFIRE_FLAG | HAS_PLASMA_FLAG | HAS_FUSION_FLAG ) ;
2013-03-03 01:03:33 +00:00
2016-10-02 00:34:40 +00:00
player_info . vulcan_ammo = VULCAN_AMMO_MAX ;
2015-11-07 21:55:59 +00:00
auto & secondary_ammo = player_info . secondary_ammo ;
secondary_ammo = Secondary_ammo_max ;
2013-03-03 01:03:33 +00:00
if ( Newdemo_state = = ND_STATE_RECORDING )
2015-11-07 21:55:59 +00:00
newdemo_record_laser_level ( player_info . laser_level , MAX_LASER_LEVEL ) ;
2013-03-03 01:03:33 +00:00
2016-09-11 18:49:13 +00:00
player_info . energy = MAX_ENERGY ;
2015-11-07 21:55:59 +00:00
player_info . laser_level = MAX_LASER_LEVEL ;
2016-10-02 00:34:40 +00:00
player_info . powerup_flags | = PLAYER_FLAGS_QUAD_LASERS ;
2013-03-03 01:03:33 +00:00
update_laser_weapon_info ( ) ;
}
# elif defined(DXX_BUILD_DESCENT_II)
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : lamer )
2011-02-14 21:27:07 +00:00
{
2016-10-28 03:39:41 +00:00
plrobj . shields = player_info . energy = i2f ( 1 ) ;
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " Take that...cheater! " ) ;
2011-02-14 21:27:07 +00:00
}
2006-03-20 17:12:09 +00:00
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : wowie )
2011-02-14 21:27:07 +00:00
{
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , TXT_WOWIE_ZOWIE ) ;
2006-03-20 17:12:09 +00:00
2011-02-14 21:27:07 +00:00
if ( Piggy_hamfile_version < 3 ) // SHAREWARE
{
2015-11-07 21:55:59 +00:00
player_info . primary_weapon_flags | = ( HAS_LASER_FLAG | HAS_VULCAN_FLAG | HAS_SPREADFIRE_FLAG | HAS_PLASMA_FLAG ) | ( HAS_GAUSS_FLAG | HAS_HELIX_FLAG ) ;
2006-03-20 17:12:09 +00:00
}
2011-02-14 21:27:07 +00:00
else
2006-03-20 17:12:09 +00:00
{
2015-11-07 21:55:59 +00:00
player_info . primary_weapon_flags = ( HAS_LASER_FLAG | HAS_VULCAN_FLAG | HAS_SPREADFIRE_FLAG | HAS_PLASMA_FLAG | HAS_FUSION_FLAG ) | ( HAS_GAUSS_FLAG | HAS_HELIX_FLAG | HAS_PHOENIX_FLAG | HAS_OMEGA_FLAG ) ;
2006-03-20 17:12:09 +00:00
}
2016-10-02 00:34:40 +00:00
player_info . vulcan_ammo = VULCAN_AMMO_MAX ;
2016-10-02 00:34:40 +00:00
auto & secondary_ammo = player_info . secondary_ammo ;
2015-10-30 02:52:56 +00:00
secondary_ammo = Secondary_ammo_max ;
2011-02-14 21:27:07 +00:00
if ( Piggy_hamfile_version < 3 ) // SHAREWARE
2006-03-20 17:12:09 +00:00
{
2015-10-30 02:52:56 +00:00
secondary_ammo [ SMISSILE4_INDEX ] = 0 ;
secondary_ammo [ SMISSILE5_INDEX ] = 0 ;
secondary_ammo [ MEGA_INDEX ] = 0 ;
2006-03-20 17:12:09 +00:00
}
2011-02-14 21:27:07 +00:00
if ( Newdemo_state = = ND_STATE_RECORDING )
2015-11-07 21:55:59 +00:00
newdemo_record_laser_level ( player_info . laser_level , MAX_SUPER_LASER_LEVEL ) ;
2011-02-14 21:27:07 +00:00
2016-09-11 18:49:13 +00:00
player_info . energy = MAX_ENERGY ;
2015-11-07 21:55:59 +00:00
player_info . laser_level = MAX_SUPER_LASER_LEVEL ;
2016-10-02 00:34:40 +00:00
player_info . powerup_flags | = PLAYER_FLAGS_QUAD_LASERS ;
2011-02-14 21:27:07 +00:00
update_laser_weapon_info ( ) ;
}
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : accessory )
2006-03-20 17:12:09 +00:00
{
2016-10-02 00:34:40 +00:00
player_info . powerup_flags | = PLAYER_FLAGS_HEADLIGHT | PLAYER_FLAGS_AFTERBURNER | PLAYER_FLAGS_AMMO_RACK | PLAYER_FLAGS_CONVERTER ;
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " Accessories!! " ) ;
2006-03-20 17:12:09 +00:00
}
2013-03-03 01:03:33 +00:00
# endif
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : allkeys )
2013-03-03 01:03:33 +00:00
{
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , TXT_ALL_KEYS ) ;
2016-10-02 00:34:40 +00:00
player_info . powerup_flags | = PLAYER_FLAGS_BLUE_KEY | PLAYER_FLAGS_RED_KEY | PLAYER_FLAGS_GOLD_KEY ;
2013-03-03 01:03:33 +00:00
}
2006-03-20 17:12:09 +00:00
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : invul )
2011-02-14 21:27:07 +00:00
{
2016-08-28 22:41:49 +00:00
player_info . invulnerable_time = GameTime64 + i2f ( 1000 ) ;
2016-10-02 00:34:40 +00:00
auto & pl_flags = player_info . powerup_flags ;
2016-07-03 00:54:15 +00:00
pl_flags ^ = PLAYER_FLAGS_INVULNERABLE ;
2017-02-26 00:00:01 +00:00
HUD_init_message ( HM_DEFAULT , " %s %s! " , TXT_INVULNERABILITY , ( pl_flags & PLAYER_FLAGS_INVULNERABLE ) ? ( player_info . FakingInvul = 0 , TXT_ON ) : TXT_OFF ) ;
2011-02-14 21:27:07 +00:00
}
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : shields )
2011-02-14 21:27:07 +00:00
{
2013-07-19 22:32:28 +00:00
HUD_init_message_literal ( HM_DEFAULT , TXT_FULL_SHIELDS ) ;
2016-10-28 03:39:41 +00:00
plrobj . shields = MAX_SHIELDS ;
2011-02-14 21:27:07 +00:00
}
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I)
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : cloak )
2013-03-03 01:03:33 +00:00
{
2016-10-02 00:34:40 +00:00
auto & pl_flags = player_info . powerup_flags ;
2016-07-03 00:54:15 +00:00
pl_flags ^ = PLAYER_FLAGS_CLOAKED ;
const auto have_cloaked = pl_flags & PLAYER_FLAGS_CLOAKED ;
HUD_init_message ( HM_DEFAULT , " %s %s! " , TXT_CLOAK , have_cloaked ? TXT_ON : TXT_OFF ) ;
if ( have_cloaked )
2013-03-03 01:03:33 +00:00
{
ai_do_cloak_stuff ( ) ;
2016-10-02 00:34:39 +00:00
player_info . cloak_time = GameTime64 ;
2013-03-03 01:03:33 +00:00
}
}
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : extralife )
2013-03-03 01:03:33 +00:00
{
2017-08-13 20:38:31 +00:00
auto & plr = get_local_player ( ) ;
if ( plr . lives < 50 )
2013-03-03 01:03:33 +00:00
{
2017-08-13 20:38:31 +00:00
plr . lives + + ;
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " Extra life! " ) ;
2013-03-03 01:03:33 +00:00
}
}
# endif
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : killreactor )
2011-02-14 21:27:07 +00:00
{
2017-07-26 03:15:59 +00:00
kill_and_so_forth ( vmobjptridx , vmsegptridx ) ;
2011-02-14 21:27:07 +00:00
}
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : exitpath )
2011-02-14 21:27:07 +00:00
{
if ( create_special_path ( ) )
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " Exit path illuminated! " ) ;
2011-02-14 21:27:07 +00:00
}
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : levelwarp )
2011-02-14 21:27:07 +00:00
{
2006-03-20 17:12:09 +00:00
char text [ 10 ] = " " ;
int new_level_num ;
int item ;
2020-05-02 21:18:42 +00:00
std : : array < newmenu_item , 1 > m { {
2015-01-18 01:58:31 +00:00
nm_item_input ( text ) ,
2015-03-22 18:49:21 +00:00
} } ;
2015-01-18 01:58:32 +00:00
item = newmenu_do ( NULL , TXT_WARP_TO_LEVEL , m , unused_newmenu_subfunction , unused_newmenu_userdata ) ;
2006-03-20 17:12:09 +00:00
if ( item ! = - 1 ) {
2015-01-18 01:58:31 +00:00
new_level_num = atoi ( m [ 0 ] . text ) ;
2006-03-20 17:12:09 +00:00
if ( new_level_num ! = 0 & & new_level_num > = 0 & & new_level_num < = Last_level ) {
2010-06-24 17:17:28 +00:00
window_set_visible ( Game_wind , 0 ) ;
2013-03-23 20:50:35 +00:00
StartNewLevel ( new_level_num ) ;
2010-06-24 17:17:28 +00:00
window_set_visible ( Game_wind , 1 ) ;
2006-03-20 17:12:09 +00:00
}
}
2011-02-14 21:27:07 +00:00
}
2006-03-20 17:12:09 +00:00
2013-12-15 12:11:14 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2016-10-29 23:16:18 +00:00
if ( gotcha = = & game_cheats : : fullautomap )
HUD_init_message_literal ( HM_DEFAULT , cheats . fullautomap ? " FULL MAP! " : " REGULAR MAP " ) ;
2013-12-15 12:11:14 +00:00
# endif
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : ghostphysics )
2006-03-20 17:12:09 +00:00
{
2011-02-14 21:27:07 +00:00
HUD_init_message ( HM_DEFAULT , " %s %s! " , " Ghosty mode " , cheats . ghostphysics ? TXT_ON : TXT_OFF ) ;
2006-03-20 17:12:09 +00:00
}
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : rapidfire )
2006-03-20 17:12:09 +00:00
{
2011-02-14 21:27:07 +00:00
HUD_init_message ( HM_DEFAULT , " Rapid fire %s! " , cheats . rapidfire ? TXT_ON : TXT_OFF ) ;
2016-06-13 11:24:38 +00:00
# if defined(DXX_BUILD_DESCENT_I)
if ( cheats . rapidfire )
do_megawow_powerup ( 200 ) ;
# endif
2006-03-20 17:12:09 +00:00
}
2016-06-13 11:24:38 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : bouncyfire )
2011-02-14 21:27:07 +00:00
{
HUD_init_message ( HM_DEFAULT , " Bouncing weapons %s! " , cheats . bouncyfire ? TXT_ON : TXT_OFF ) ;
}
2017-01-29 21:02:48 +00:00
if ( gotcha = = & game_cheats : : homingfire )
{
HUD_init_message ( HM_DEFAULT , " Homing weapons %s! " , cheats . homingfire ? ( weapons_homing_all ( ) , TXT_ON ) : ( weapons_homing_all_reset ( ) , TXT_OFF ) ) ;
}
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : turbo )
2011-02-14 21:27:07 +00:00
{
HUD_init_message ( HM_DEFAULT , " %s %s! " , " Turbo mode " , cheats . turbo ? TXT_ON : TXT_OFF ) ;
}
2006-03-20 17:12:09 +00:00
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : robotfiringsuspended )
2011-02-14 21:27:07 +00:00
{
HUD_init_message ( HM_DEFAULT , " Robot firing %s! " , cheats . robotfiringsuspended ? TXT_OFF : TXT_ON ) ;
}
2006-03-20 17:12:09 +00:00
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : killallrobots )
2011-02-14 21:27:07 +00:00
{
kill_all_robots ( ) ;
}
2006-03-20 17:12:09 +00:00
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : robotskillrobots )
2011-02-14 21:27:07 +00:00
{
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , cheats . robotskillrobots ? " Rabid robots! " : " Kill the player! " ) ;
2011-02-14 21:27:07 +00:00
}
2006-03-20 17:12:09 +00:00
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : monsterdamage )
2011-02-14 21:27:07 +00:00
{
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , cheats . monsterdamage ? " Oh no, there goes Tokyo! " : " What have you done, I'm shrinking!! " ) ;
2011-02-14 21:27:07 +00:00
}
2006-03-20 17:12:09 +00:00
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : buddyclone )
2011-02-14 21:27:07 +00:00
{
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , " What's this? Another buddy bot! " ) ;
2011-02-14 21:27:07 +00:00
create_buddy_bot ( ) ;
}
2006-03-20 17:12:09 +00:00
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : buddyangry )
2011-02-14 21:27:07 +00:00
{
if ( cheats . buddyangry )
2006-03-20 17:12:09 +00:00
{
2015-01-12 00:26:02 +00:00
HUD_init_message ( HM_DEFAULT , " %s gets angry! " , static_cast < const char * > ( PlayerCfg . GuidebotName ) ) ;
PlayerCfg . GuidebotName = " Wingnut " ;
2006-03-20 17:12:09 +00:00
}
else
2011-02-14 21:27:07 +00:00
{
2015-01-12 00:26:02 +00:00
PlayerCfg . GuidebotName = PlayerCfg . GuidebotNameReal ;
HUD_init_message ( HM_DEFAULT , " %s calms down " , static_cast < const char * > ( PlayerCfg . GuidebotName ) ) ;
2006-03-20 17:12:09 +00:00
}
}
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
2013-11-28 02:16:05 +00:00
if ( gotcha = = & game_cheats : : acid )
2011-02-14 21:27:07 +00:00
{
2013-06-23 16:27:34 +00:00
HUD_init_message_literal ( HM_DEFAULT , cheats . acid ? " Going up! " : " Coming down! " ) ;
2006-03-20 17:12:09 +00:00
}
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2006-03-20 17:12:09 +00:00
}
2016-08-25 04:05:32 +00:00
}
2006-03-20 17:12:09 +00:00
// Internal Cheat Menu
# ifndef RELEASE
2013-03-03 01:03:33 +00:00
2015-03-28 17:18:02 +00:00
namespace {
2006-03-20 17:12:09 +00:00
2015-03-28 17:18:02 +00:00
class menu_fix_wrapper
{
fix & m_value ;
public :
constexpr menu_fix_wrapper ( fix & t ) :
m_value ( t )
{
}
2015-05-22 03:33:20 +00:00
operator int ( ) const
2015-03-28 17:18:02 +00:00
{
return f2i ( m_value ) ;
}
menu_fix_wrapper & operator = ( int n )
{
m_value = i2f ( n ) ;
return * this ;
}
} ;
2006-03-20 17:12:09 +00:00
2015-11-14 18:17:21 +00:00
class cheat_menu_bit_invulnerability :
2015-11-14 18:17:21 +00:00
std : : reference_wrapper < player_info > ,
2017-09-26 04:15:50 +00:00
public menu_bit_wrapper_t < player_flags , std : : integral_constant < PLAYER_FLAG , PLAYER_FLAGS_INVULNERABLE > >
2015-03-28 17:18:02 +00:00
{
public :
2019-02-02 18:36:39 +00:00
cheat_menu_bit_invulnerability ( object & player ) :
reference_wrapper ( player . ctype . player_info ) ,
2017-09-26 04:15:50 +00:00
menu_bit_wrapper_t ( get ( ) . powerup_flags , { } )
2015-03-28 17:18:02 +00:00
{
}
2017-09-26 04:15:50 +00:00
cheat_menu_bit_invulnerability & operator = ( const uint32_t n )
2015-03-28 17:18:02 +00:00
{
this - > menu_bit_wrapper_t : : operator = ( n ) ;
if ( n )
{
2017-02-26 00:00:01 +00:00
auto & player_info = get ( ) ;
player_info . FakingInvul = 0 ;
player_info . invulnerable_time = GameTime64 + i2f ( 1000 ) ;
2015-03-28 17:18:02 +00:00
}
return * this ;
}
} ;
2015-11-14 18:17:21 +00:00
class cheat_menu_bit_cloak :
2015-11-14 18:17:21 +00:00
std : : reference_wrapper < player_info > ,
2017-09-26 04:15:50 +00:00
public menu_bit_wrapper_t < player_flags , std : : integral_constant < PLAYER_FLAG , PLAYER_FLAGS_CLOAKED > >
2015-03-28 17:18:02 +00:00
{
public :
2019-02-02 18:36:39 +00:00
cheat_menu_bit_cloak ( object & player ) :
reference_wrapper ( player . ctype . player_info ) ,
2017-09-26 04:15:50 +00:00
menu_bit_wrapper_t ( get ( ) . powerup_flags , { } )
2015-03-28 17:18:02 +00:00
{
}
2017-09-26 04:15:50 +00:00
cheat_menu_bit_cloak & operator = ( const uint32_t n )
2015-03-28 17:18:02 +00:00
{
this - > menu_bit_wrapper_t : : operator = ( n ) ;
if ( n )
2010-03-31 06:19:37 +00:00
{
2006-03-20 17:12:09 +00:00
if ( Game_mode & GM_MULTI )
multi_send_cloak ( ) ;
ai_do_cloak_stuff ( ) ;
2015-11-14 18:17:21 +00:00
get ( ) . cloak_time = GameTime64 ;
2006-03-20 17:12:09 +00:00
}
2015-03-28 17:18:02 +00:00
return * this ;
}
} ;
}
2006-03-20 17:12:09 +00:00
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I)
2015-03-28 17:18:02 +00:00
# define WIMP_MENU_DXX(VERB)
2013-03-03 01:03:33 +00:00
# elif defined(DXX_BUILD_DESCENT_II)
2015-03-28 17:18:02 +00:00
/* Adding an afterburner like this adds it at 0% charge. This is OK for
* a cheat . The player can change his energy up if he needs more .
*/
# define WIMP_MENU_DXX(VERB) \
2016-01-09 16:38:17 +00:00
DXX_MENUITEM ( VERB , CHECK , TXT_AFTERBURNER , opt_afterburner , menu_bit_wrapper ( player_info . powerup_flags , PLAYER_FLAGS_AFTERBURNER ) ) \
2015-03-28 17:18:02 +00:00
2013-03-03 01:03:33 +00:00
# endif
2015-03-28 17:18:02 +00:00
# define DXX_WIMP_MENU(VERB) \
2019-02-02 18:36:39 +00:00
DXX_MENUITEM ( VERB , CHECK , TXT_INVULNERABILITY , opt_invul , cheat_menu_bit_invulnerability ( plrobj ) ) \
DXX_MENUITEM ( VERB , CHECK , TXT_CLOAKED , opt_cloak , cheat_menu_bit_cloak ( plrobj ) ) \
2016-01-09 16:38:17 +00:00
DXX_MENUITEM ( VERB , CHECK , " BLUE KEY " , opt_key_blue , menu_bit_wrapper ( player_info . powerup_flags , PLAYER_FLAGS_BLUE_KEY ) ) \
DXX_MENUITEM ( VERB , CHECK , " GOLD KEY " , opt_key_gold , menu_bit_wrapper ( player_info . powerup_flags , PLAYER_FLAGS_GOLD_KEY ) ) \
DXX_MENUITEM ( VERB , CHECK , " RED KEY " , opt_key_red , menu_bit_wrapper ( player_info . powerup_flags , PLAYER_FLAGS_RED_KEY ) ) \
2015-03-28 17:18:02 +00:00
WIMP_MENU_DXX ( VERB ) \
2016-01-09 16:38:17 +00:00
DXX_MENUITEM ( VERB , NUMBER , TXT_ENERGY , opt_energy , menu_fix_wrapper ( plrobj . ctype . player_info . energy ) , 0 , 200 ) \
DXX_MENUITEM ( VERB , NUMBER , " Shields " , opt_shields , menu_fix_wrapper ( plrobj . shields ) , 0 , 200 ) \
DXX_MENUITEM ( VERB , TEXT , TXT_SCORE , opt_txt_score ) \
DXX_MENUITEM ( VERB , INPUT , score_text , opt_score ) \
2017-09-26 04:15:50 +00:00
DXX_MENUITEM ( VERB , NUMBER , " Laser Level " , opt_laser_level , menu_number_bias_wrapper < 1 > ( plr_laser_level ) , LASER_LEVEL_1 + 1 , DXX_MAXIMUM_LASER_LEVEL + 1 ) \
2016-01-09 16:38:17 +00:00
DXX_MENUITEM ( VERB , NUMBER , " Concussion " , opt_concussion , plrobj . ctype . player_info . secondary_ammo [ CONCUSSION_INDEX ] , 0 , 200 ) \
2015-03-28 17:18:02 +00:00
static void do_cheat_menu ( )
{
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
auto & vmobjptr = Objects . vmptr ;
2015-03-28 17:18:02 +00:00
enum {
DXX_WIMP_MENU ( ENUM )
} ;
int mmn ;
2020-05-02 21:18:42 +00:00
std : : array < newmenu_item , DXX_WIMP_MENU ( COUNT ) > m ;
2015-03-28 17:18:02 +00:00
char score_text [ sizeof ( " 2147483647 " ) ] ;
2015-10-30 02:52:55 +00:00
auto & plrobj = get_local_plrobj ( ) ;
2015-11-07 21:55:59 +00:00
auto & player_info = plrobj . ctype . player_info ;
2016-10-15 00:53:19 +00:00
snprintf ( score_text , sizeof ( score_text ) , " %d " , player_info . mission . score ) ;
2015-11-07 21:55:59 +00:00
uint8_t plr_laser_level = player_info . laser_level ;
2015-03-28 17:18:02 +00:00
DXX_WIMP_MENU ( ADD ) ;
mmn = newmenu_do ( " Wimp Menu " , NULL , m , unused_newmenu_subfunction , unused_newmenu_userdata ) ;
if ( mmn > - 1 ) {
DXX_WIMP_MENU ( READ ) ;
2015-11-07 21:55:59 +00:00
player_info . laser_level = laser_level_t ( plr_laser_level ) ;
2015-03-28 17:18:02 +00:00
char * p ;
auto ul = strtoul ( score_text , & p , 10 ) ;
if ( ! * p )
2016-10-15 00:53:19 +00:00
player_info . mission . score = static_cast < int > ( ul ) ;
2006-03-20 17:12:09 +00:00
init_gauges ( ) ;
}
}
# endif
// Testing functions ----------------------------------------------------------
# ifndef NDEBUG
// Sounds for testing
2015-03-11 02:19:15 +00:00
__attribute_used
static int Test_sound ;
2006-03-20 17:12:09 +00:00
2013-09-22 22:26:27 +00:00
static void play_test_sound ( )
2006-03-20 17:12:09 +00:00
{
digi_play_sample ( Test_sound , F1_0 ) ;
}
# endif //ifndef NDEBUG
2016-01-09 16:38:12 +00:00
namespace dsx {
2014-10-04 21:47:13 +00:00
window_event_result ReadControls ( const d_event & event )
2006-03-20 17:12:09 +00:00
{
2019-08-15 01:34:22 +00:00
auto & LevelUniqueControlCenterState = LevelUniqueObjectState . ControlCenterState ;
2019-03-03 00:31:08 +00:00
auto & Objects = LevelUniqueObjectState . Objects ;
2006-03-20 17:12:09 +00:00
int key ;
static ubyte exploding_flag = 0 ;
2013-12-26 22:21:16 +00:00
Player_fired_laser_this_frame = object_none ;
2006-03-20 17:12:09 +00:00
2016-01-09 16:38:10 +00:00
if ( Player_dead_state = = player_dead_state : : exploded )
{
2006-03-20 17:12:09 +00:00
if ( exploding_flag = = 0 ) {
exploding_flag = 1 ; // When player starts exploding, clear all input devices...
game_flush_inputs ( ) ;
}
} else {
exploding_flag = 0 ;
}
2015-12-15 04:09:35 +00:00
if ( Player_dead_state ! = player_dead_state : : no & &
! ( ( Game_mode & GM_MULTI ) & &
( multi_sending_message [ Player_num ] | | multi_defining_message )
)
)
2017-02-07 05:27:34 +00:00
HandleDeathInput ( event ) ;
2006-03-20 17:12:09 +00:00
2013-02-21 00:20:26 +00:00
if ( Newdemo_state = = ND_STATE_PLAYBACK )
2006-03-20 17:12:09 +00:00
update_vcr_state ( ) ;
2014-10-04 21:47:13 +00:00
if ( event . type = = EVENT_KEY_COMMAND )
2010-03-31 09:18:28 +00:00
{
2011-01-14 09:51:13 +00:00
key = event_key_get ( event ) ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2018-03-10 22:45:04 +00:00
if ( MarkerState . DefiningMarkerMessage ( ) )
2010-03-31 09:18:28 +00:00
{
return MarkerInputMessage ( key ) ;
}
2013-03-03 01:03:33 +00:00
# endif
2011-04-11 15:47:16 +00:00
if ( ( Game_mode & GM_MULTI ) & & ( multi_sending_message [ Player_num ] | | multi_defining_message ) )
2010-03-31 09:18:28 +00:00
{
return multi_message_input_sub ( key ) ;
}
2008-10-31 16:57:36 +00:00
2010-03-31 09:18:28 +00:00
# ifndef RELEASE
if ( ( key & KEY_DEBUGGED ) & & ( Game_mode & GM_MULTI ) ) {
Network_message_reciever = 100 ; // Send to everyone...
2015-01-12 00:26:02 +00:00
snprintf ( Network_message . data ( ) , Network_message . size ( ) , " %s %s " , TXT_I_AM_A , TXT_CHEATER ) ;
2010-03-31 09:18:28 +00:00
}
# endif
2006-03-20 17:12:09 +00:00
2010-03-31 09:18:28 +00:00
if ( Endlevel_sequence )
{
2016-12-24 08:50:29 +00:00
auto result = HandleEndlevelKey ( key ) ;
if ( result ! = window_event_result : : ignored )
return result ;
2010-03-31 09:18:28 +00:00
}
else if ( Newdemo_state = = ND_STATE_PLAYBACK )
{
2017-01-09 11:09:34 +00:00
auto r = HandleDemoKey ( key ) ;
if ( r ! = window_event_result : : ignored )
return r ;
2010-03-31 09:18:28 +00:00
}
else
{
2015-01-18 01:58:33 +00:00
window_event_result r = FinalCheats ( ) ;
2014-08-06 02:10:49 +00:00
if ( r = = window_event_result : : ignored )
r = HandleSystemKey ( key ) ;
if ( r = = window_event_result : : ignored )
r = HandleGameKey ( key ) ;
if ( r ! = window_event_result : : ignored )
return r ;
2010-03-31 09:18:28 +00:00
}
2006-03-20 17:12:09 +00:00
2010-03-31 09:18:28 +00:00
# ifndef RELEASE
2014-08-06 02:10:49 +00:00
{
2017-07-26 03:15:59 +00:00
window_event_result r = HandleTestKey ( vmsegptridx , key ) ;
2014-08-06 02:10:49 +00:00
if ( r ! = window_event_result : : ignored )
return r ;
}
2010-03-31 09:18:28 +00:00
# endif
2010-06-14 08:13:16 +00:00
2016-10-31 06:58:34 +00:00
auto result = call_default_handler ( event ) ;
if ( result ! = window_event_result : : ignored )
2016-10-27 08:36:24 +00:00
return result ;
2011-02-02 00:36:49 +00:00
}
Only respawn when the player presses fire
Only respawn when the player presses a fire key/button (primary,
secondary, or flare). Only clear primary, second, flare, and bomb when
respawning. This allows dead players to use the automap or change their
camera views.
This is a necessary step to flushing only the firing inputs on respawn,
as requested by Mako88 in
<https://github.com/dxx-rebirth/dxx-rebirth/issues/104>. Currently,
inputs are flushed again by the activation of the game window, so
respawn still flushes all inputs.
#1 0x00005555555cee19 in game_flush_inputs () at similar/main/game.cpp:374
#2 game_handler (event=...) at similar/main/game.cpp:1114
#3 0x0000555555576113 in window_send_event (wind=..., event=...) at common/arch/sdl/window.cpp:208
#4 0x000055555557627b in WINDOW_SEND_EVENT (file=0x5555556dc126 "common/arch/sdl/window.cpp", e=0x5555556dc141 "EVENT_WINDOW_ACTIVATED", line=179, event=..., w=...) at common/include/window.h:111
#5 window_set_visible (w=..., visible=visible@entry=1) at common/arch/sdl/window.cpp:179
#6 0x00005555555e90f5 in window_set_visible (visible=1, wind=<optimized out>) at common/include/window.h:90
#7 DoPlayerDead () at similar/main/gameseq.cpp:1479
#8 0x000055555563ed65 in dead_player_frame () at similar/main/object.cpp:1486
#9 0x00005555555cf4df in GameProcessFrame () at similar/main/game.cpp:1329
#10 game_handler (event=...) at similar/main/game.cpp:1157
2015-06-20 16:16:43 +00:00
if ( ! Endlevel_sequence & & Newdemo_state ! = ND_STATE_PLAYBACK )
2011-02-02 00:36:49 +00:00
{
2020-05-28 03:21:22 +00:00
kconfig_read_controls ( Controls , event , 0 ) ;
2015-12-15 04:09:35 +00:00
const auto Player_is_dead = Player_dead_state ;
if ( Player_is_dead ! = player_dead_state : : no & & HandleDeathInput ( event ) )
Only respawn when the player presses fire
Only respawn when the player presses a fire key/button (primary,
secondary, or flare). Only clear primary, second, flare, and bomb when
respawning. This allows dead players to use the automap or change their
camera views.
This is a necessary step to flushing only the firing inputs on respawn,
as requested by Mako88 in
<https://github.com/dxx-rebirth/dxx-rebirth/issues/104>. Currently,
inputs are flushed again by the activation of the game window, so
respawn still flushes all inputs.
#1 0x00005555555cee19 in game_flush_inputs () at similar/main/game.cpp:374
#2 game_handler (event=...) at similar/main/game.cpp:1114
#3 0x0000555555576113 in window_send_event (wind=..., event=...) at common/arch/sdl/window.cpp:208
#4 0x000055555557627b in WINDOW_SEND_EVENT (file=0x5555556dc126 "common/arch/sdl/window.cpp", e=0x5555556dc141 "EVENT_WINDOW_ACTIVATED", line=179, event=..., w=...) at common/include/window.h:111
#5 window_set_visible (w=..., visible=visible@entry=1) at common/arch/sdl/window.cpp:179
#6 0x00005555555e90f5 in window_set_visible (visible=1, wind=<optimized out>) at common/include/window.h:90
#7 DoPlayerDead () at similar/main/gameseq.cpp:1479
#8 0x000055555563ed65 in dead_player_frame () at similar/main/object.cpp:1486
#9 0x00005555555cf4df in GameProcessFrame () at similar/main/game.cpp:1329
#10 game_handler (event=...) at similar/main/game.cpp:1157
2015-06-20 16:16:43 +00:00
return window_event_result : : handled ;
2011-02-02 00:36:49 +00:00
check_rear_view ( ) ;
// If automap key pressed, enable automap unless you are in network mode, control center destroyed and < 10 seconds left
2013-11-26 22:46:48 +00:00
if ( Controls . state . automap )
2011-02-02 00:36:49 +00:00
{
2013-11-26 22:46:48 +00:00
Controls . state . automap = 0 ;
2019-08-15 01:34:22 +00:00
if ( Player_is_dead ! = player_dead_state : : no | | ! ( ( Game_mode & GM_MULTI ) & & LevelUniqueControlCenterState . Control_center_destroyed & & LevelUniqueControlCenterState . Countdown_seconds_left < 10 ) )
2011-02-02 00:36:49 +00:00
{
2014-07-16 02:35:14 +00:00
do_automap ( ) ;
2014-08-06 02:10:49 +00:00
return window_event_result : : handled ;
2011-02-02 00:36:49 +00:00
}
}
2015-12-15 04:09:35 +00:00
if ( Player_is_dead ! = player_dead_state : : no )
2015-09-30 02:41:55 +00:00
return window_event_result : : ignored ;
2017-07-26 03:15:59 +00:00
do_weapon_n_item_stuff ( Objects ) ;
2008-11-17 23:38:43 +00:00
}
2020-06-29 21:16:04 +00:00
if ( Controls . state . show_menu )
{
Controls . state . show_menu = 0 ;
return HandleSystemKey ( KEY_ESC ) ;
}
2014-08-06 02:10:49 +00:00
return window_event_result : : ignored ;
2006-03-20 17:12:09 +00:00
}
2016-01-09 16:38:12 +00:00
}