raze/polymer/eduke32/source/jmact/control.h
hendricks266 d3a3c74112 Massive menu input control revamp/cleanup/factor. (added: input.[ch])
New Wii control defaults for the Wii Remote + Nunchuk and the Classic Controller. This includes new code added just so that the Home key brings up the menu in-game, reducing the need for a USB keyboard.

On the technical side, raw joystick access (comparable to what is available for keyboard and mouse) is now present in jmact, on the game side. (added: joystick.[ch])

Using this new raw joystick access, I replaced tueidj's hack to map A and B to LMB/RMB and D-Pad Up/Down to the scrollwheel.

I made the menus more friendly to mouse and joystick browsing by adding and unifying checks and clears for various buttons and gamefuncs. In fact, the majority of the time spent on this commit was tracking down problems that appeared with the factoring and trying to understand the menu system and the way input checks are precariously executed.

In addition, "Press any key or button to continue" now truly means what it says.

As a result of incorporating proper raw access into control.c instead of it directly accessing the implementaiton, the program *may* no longer be affected by joystick input when it is out of focus. This follows the pattern set by the mouse, and I think this is a positive change.

A small bonus: In the classic/old keyboard preset, the key for Show_Console has been changed from '`' to 'C' because '`' is taken by Quick_Kick.

git-svn-id: https://svn.eduke32.com/eduke32@2728 1a8010ca-5511-0410-912e-c29ae57300e0
2012-06-03 16:11:22 +00:00

225 lines
5.4 KiB
C

//-------------------------------------------------------------------------
/*
Copyright (C) 1996, 2003 - 3D Realms Entertainment
This file is part of Duke Nukem 3D version 1.5 - Atomic Edition
Duke Nukem 3D is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Original Source: 1996 - Todd Replogle
Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms
Modifications for JonoF's port by Jonathon Fowler (jf@jonof.id.au)
*/
//-------------------------------------------------------------------------
//***************************************************************************
//
// Public header for CONTROL.C.
//
//***************************************************************************
#ifndef _control_public
#define _control_public
#ifdef __cplusplus
extern "C" {
#endif
//***************************************************************************
//
// DEFINES
//
//***************************************************************************
#define MAXGAMEBUTTONS 64
#define BUTTON(x) ((CONTROL_ButtonState>> ((uint64_t)(x)) ) & 1)
#define BUTTONHELD(x) ((CONTROL_ButtonHeldState>> ((uint64_t)(x)) ) & 1)
#define BUTTONJUSTPRESSED(x) \
( BUTTON( x ) && !BUTTONHELD( x ) )
#define BUTTONRELEASED(x) \
( !BUTTON( x ) && BUTTONHELD( x ) )
#define BUTTONSTATECHANGED(x) \
( BUTTON( x ) != BUTTONHELD( x ) )
//***************************************************************************
//
// TYPEDEFS
//
//***************************************************************************
typedef enum
{
axis_up,
axis_down,
axis_left,
axis_right
} axisdirection;
typedef enum
{
analog_turning=0,
analog_strafing=1,
analog_lookingupanddown=2,
analog_elevation=3,
analog_rolling=4,
analog_moving=5,
analog_maxtype
} analogcontrol;
typedef enum
{
dir_North,
dir_NorthEast,
dir_East,
dir_SouthEast,
dir_South,
dir_SouthWest,
dir_West,
dir_NorthWest,
dir_None
} direction;
typedef struct
{
int32_t button0;
int32_t button1;
direction dir;
} UserInput;
typedef struct
{
int32_t dx;
int32_t dy;
int32_t dz;
int32_t dyaw;
int32_t dpitch;
int32_t droll;
} ControlInfo;
typedef enum
{
controltype_keyboard,
controltype_keyboardandmouse,
controltype_keyboardandjoystick
} controltype;
typedef enum
{
controldevice_keyboard,
controldevice_mouse,
controldevice_joystick
} controldevice;
//***************************************************************************
//
// GLOBALS
//
//***************************************************************************
extern int32_t CONTROL_Started;
extern int32_t CONTROL_MousePresent;
extern int32_t CONTROL_JoyPresent;
extern int32_t CONTROL_MouseEnabled;
extern int32_t CONTROL_JoystickEnabled;
extern uint64_t CONTROL_ButtonState;
extern uint64_t CONTROL_ButtonHeldState;
//***************************************************************************
//
// PROTOTYPES
//
//***************************************************************************
void CONTROL_MapKey( int32_t which, kb_scancode key1, kb_scancode key2 );
void CONTROL_MapButton
(
int32_t whichfunction,
int32_t whichbutton,
int32_t doubleclicked,
controldevice device
);
void CONTROL_DefineFlag( int32_t which, int32_t toggle );
int32_t CONTROL_FlagActive( int32_t which );
void CONTROL_ClearAssignments( void );
void CONTROL_GetFunctionInput( void );
void CONTROL_GetInput( ControlInfo *info );
void CONTROL_ClearButton( int32_t whichbutton );
extern float CONTROL_MouseSensitivity;
int32_t CONTROL_Startup
(
controltype which,
int32_t ( *TimeFunction )( void ),
int32_t ticspersecond
);
void CONTROL_Shutdown( void );
void CONTROL_SetDoubleClickDelay(int32_t delay);
int32_t CONTROL_GetDoubleClickDelay(void);
void CONTROL_MapAnalogAxis
(
int32_t whichaxis,
int32_t whichanalog,
controldevice device
);
void CONTROL_MapDigitalAxis
(
int32_t whichaxis,
int32_t whichfunction,
int32_t direction,
controldevice device
);
void CONTROL_SetAnalogAxisScale
(
int32_t whichaxis,
int32_t axisscale,
controldevice device
);
void CONTROL_PrintKeyMap(void);
void CONTROL_PrintControlFlag(int32_t which);
void CONTROL_PrintAxes( void );
#define MAXBINDSTRINGLENGTH 128
#define MAXBOUNDKEYS 256
typedef struct binding {
char *key;
char cmd[MAXBINDSTRINGLENGTH];
char repeat;
char laststate;
} keybind;
#define MAXMOUSEBUTTONS 10
extern keybind KeyBindings[MAXBOUNDKEYS], MouseBindings[MAXMOUSEBUTTONS];
extern int32_t bindsenabled;
void CONTROL_ProcessBinds(void);
#define CONTROL_NUM_FLAGS 64
extern int32_t extinput[CONTROL_NUM_FLAGS];
extern int32_t control_smoothmouse;
#ifdef __cplusplus
};
#endif
#endif