File: input.h

package info (click to toggle)
postal1 2015.git20250526%2Bds-2
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid
  • size: 14,024 kB
  • sloc: cpp: 130,877; ansic: 38,942; python: 874; makefile: 351; sh: 61
file content (368 lines) | stat: -rw-r--r-- 13,548 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 RWS Inc, All Rights Reserved
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of version 2 of the GNU General Public License as published by
// the Free Software Foundation
//
// 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.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
// input.h
// Project: Postal
//
// History:
//		12/05/96 MJR	Started.
//
//		02/19/97 BRH	Modified to include the keys we are currently using
//							for CDude control in the game.  Added functions for
//							getting and setting input for local and remote play.
//
//		03/03/97	JMI	Added macros for keys 1 through 5 (CDude will use
//							these to chose a weapon).
//
//		03/14/97	JMI	Added macros for space key.
//
//		03/24/97	JMI	Changed typedef for UINPUT from U16 to U32.
//							Added INPUT_ROT_MASK.  The first 9 bits are now reserved
//							for a rotation value between 0 and 359 inclusive.  This
//							pushed all the other bits up a bit, but I don't think that
//							anything currently uses this API w/o the INPUT_* macros.
//
//		03/26/97	JMI	Was getting rotation for mouse input backwards.  Fixed.
//
//		03/27/97	JMI	Added macros for numpad 0 key (CDude will use this for
//							duck).
//
//		03/27/97	JMI	Shortcutted INSERT to same as numpad 0 as patch for now.
//
//		03/31/97	JMI	Now the actual keys used are chosen by g_InputSettings.
//							Therefore, macros are now more generic (e.g., INPUT_R
//							became INPUT_RIGHT, and INPUT_ALT became INPUT_FIRE).
//							Added g_InputSettings declaration.
//
//		04/01/97	JMI	Now we used 10 bits for the rotation value and, although
//							it is stored as unsigned (0..720), it represents a postive
//							or negative delta between -360 and 360.
//
//		04/03/97	JMI	Now checks rspIsBackground() before doing mouse stuff.
//
//		04/11/97 MJR	Moved lots of stuff into input.cpp and added support for
//							recording and playing back inputs for self-playing mode.
//
//		04/11/97	JMI	Changed INPUT_MENU to INPUT_SUICIDE.
//							Also, added INPUT_NEXT_LEVEL.
//							Added an RInputEvent* to GetLocalInput() proto.
//							externs for m_aInputs were not specifying a type and, there-
//							fore, it was an 'int' array instead of UINPUT.
//
//		04/22/97	JMI	Added extern of g_InputSettings.
//
//		04/24/97	JMI	Moved around INPUT_JUMP, INPUT_SUICIDE, and 
//							INPUT_NEXT_LEVEL.
//							Also, added INPUT_WEAPON_6...9 and INPUT_EXECUTE.  
//							Consequently, we're out of inputs (and we still don't have
//							INPUT_TOGGLE_HUMANSHIELD).
//
//		05/02/97	JMI	Increased number of available input bits by reducing
//							the weapon changing bits to 4 bits (now a number instead of
//							bit fields).
//
//		05/13/97	JMI	Changed INPUT_RUN to INPUT_WALK.
//
//		05/14/97	JMI	Added INPUT_PICKUP.
//
//		06/09/97	JMI	Changed INPUT_WALK to INPUT_RUN.
//
//		06/15/97 MJR	Removed INPUT_NEXT_LEVEL, which has now been replaced by
//							an client/server mechanism.
//
//		06/15/97 MJR	Changed to separate InputDemoInit() and InputDemoKill()
//							functions to make it real obvious and clean.
//
//		07/15/97	JMI	Added INPUT_WEAPONS_BIT.
//
//		07/19/97	JMI	Added InitLocalInput().
//
//		07/25/97	JMI	Added more INPUT_*'s and changed INPUT_WEAPON_11,12,13,14
//							to INPUT_CHEAT_11,12,13,14.  There are now 20 possible
//							cheat inputs.
//							Also, removed INPUT_PICKUP.
//
//		08/06/97	JMI	Changed InitLocalInput() to ClearLocalInput().
//
//		08/10/97	JMI	Added StrafeLeft and StrafeRight inputs.
//							Also, changed Jump to Revive and INPUT_JUMP to INPUT_REVIVE.
//							Had put INPUT_JUMP back temporarily b/c I want to check in
//							this and all the files that depend on the new INPUT_REVIVE 
//							in but play.cpp has been checked out for a long time now.
//
//		08/12/97	JMI	Now requires an input event for cheats for GetLocalInput().
//
//		08/17/97	JMI	Got rid of INPUT_JUMP, now play.cpp uses INPUT_REVIVE.
//
//		08/26/97 BRH	Added query function InputIsDemoOver() for the special
//							case ending demo that will be played when the player wins,
//
//		09/06/97 MJR	Added INPUT_IDLE.
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INPUT_H
#define INPUT_H

#include "RSPiX.h"
#include "realm.h"
#include "camera.h"
#include "InputSettings.h"
#include "dude.h"

// Maximum number of dudes supported by this module.  Just about any value
// will work, it merely uses up a few extra bytes per dude, and no extra
// processing.  This is currently set to a value likely to be far beyond any
// the number of dudes that the main app could support.
#define INPUT_MAX_DUDES	32


// Macros to access bits within an UINPUT type.  There are two types of macros:
// "masks" and "bit numbers".  The masks are designed to set or get the value
// of a bit.  The bit numbers are designed to make it easier to shift the bits
// around.  Note that the bit numbers go from 0 to 'n' (currently 15).
//
// The order of the bits should not be changed without carefully weighing the
// consequences.  It is highly likely that some code will end up relying on the
// order of the bits for efficiency sake, so changing the order of the bits
// could break existing code.  Any such code should certainly refer to these
// macros in some way, so that if it becomes absolutely necessary to change
// this stuff, we can at least track down all the code that uses it.

// The first 10 bits are reserved for a rotation delta value between -359 and 359.
#define INPUT_ROT_MASK		0x000003FF

#define INPUT_REVIVE			0x00000400
#define INPUT_REVIVE_BIT	10	    
									    
#define INPUT_SUICIDE		0x00000800
#define INPUT_SUICIDE_BIT	11

#define INPUT_RIGHT			0x00001000
#define INPUT_RIGHT_BIT		12	    
#define INPUT_LEFT			0x00002000
#define INPUT_LEFT_BIT		13	    
#define INPUT_BACKWARD		0x00004000
#define INPUT_BACKWARD_BIT	14	    
#define INPUT_FORWARD		0x00008000
#define INPUT_FORWARD_BIT	15    
#define INPUT_DIR_MASK		0x0000f000
#define INPUT_STRAFE			0x00010000
#define INPUT_STRAFE_BIT	16    
#define INPUT_FIRE			0x00020000
#define INPUT_FIRE_BIT		17    
#define INPUT_RUN				0x00040000
#define INPUT_RUN_BIT		18    
#define INPUT_DUCK			0x00080000
#define INPUT_DUCK_BIT		19
									    
#define INPUT_WEAPON_0		0x00100000
#define INPUT_WEAPON_1		0x00200000
#define INPUT_WEAPON_2		0x00300000
#define INPUT_WEAPON_3		0x00400000
#define INPUT_WEAPON_4		0x00500000
#define INPUT_WEAPON_5		0x00600000
#define INPUT_WEAPON_6		0x00700000
#define INPUT_WEAPON_7		0x00800000
#define INPUT_WEAPON_8		0x00900000
#define INPUT_WEAPON_9		0x00A00000
#define INPUT_WEAPON_10		0x00B00000
#define INPUT_CHEAT_11		0x00C00000
#define INPUT_CHEAT_12		0x00D00000
#define INPUT_CHEAT_13		0x00E00000
#define INPUT_CHEAT_14		0x00F00000
#define INPUT_CHEAT_15		0x01000000
#define INPUT_CHEAT_16		0x01100000
#define INPUT_CHEAT_17		0x01200000
#define INPUT_CHEAT_18		0x01300000
#define INPUT_CHEAT_19		0x01400000
#define INPUT_CHEAT_20		0x01500000
#define INPUT_CHEAT_21		0x01600000
#define INPUT_CHEAT_22		0x01700000
#define INPUT_CHEAT_23		0x01800000
#define INPUT_CHEAT_24		0x01900000
#define INPUT_CHEAT_25		0x01A00000
#define INPUT_CHEAT_26		0x01B00000
#define INPUT_CHEAT_27		0x01C00000
#define INPUT_CHEAT_28		0x01D00000
#define INPUT_CHEAT_29		0x01E00000
#define INPUT_CHEAT_30		0x01F00000

#define INPUT_WEAPONS_MASK	0x01F00000	// Includes cheats!
#define INPUT_WEAPONS_BIT	20	// thru 24.

//#ifdef MOBILE
#define INPUT_WEAPON_NEXT		0x02000000
#define INPUT_WEAPON_PREV		0x04000000
#define INPUT_ROT_IS_ABS		0x08000000
//#endif

#define INPUT_EXECUTE		0x40000000
#define INPUT_EXECUTE_BIT	30

// Extra flags for keyboard "twinstick" inputs. We could have done this with the ROT_IS_ABS for moving OR shooting
// but then we'd be stuck on the other.
#define INPUT_MOVE_UP		0x00100000000LL
#define INPUT_MOVE_DOWN		0x00200000000LL
#define INPUT_MOVE_LEFT		0x00400000000LL
#define INPUT_MOVE_RIGHT	0x00800000000LL
#define INPUT_FIRE_UP		0x01000000000LL
#define INPUT_FIRE_DOWN		0x02000000000LL
#define INPUT_FIRE_LEFT		0x04000000000LL
#define INPUT_FIRE_RIGHT	0x08000000000LL
#define INPUT_STRAFE_LEFT	0x10000000000LL
#define INPUT_STRAFE_RIGHT	0x20000000000LL

// Use this for when you don't want the dude to do anything
#define INPUT_IDLE			360

// Available input modes
typedef enum
	{
	INPUT_MODE_LIVE,
	INPUT_MODE_RECORD,
	INPUT_MODE_PLAYBACK
	} INPUT_MODE;

// UINPUT type
// Had to rename this from INPUT because of a pre-existing type
// Redefined to U64 because we ran out of input room.
typedef U64 UINPUT;

// Global input settings.
extern CInputSettings g_InputSettings;


////////////////////////////////////////////////////////////////////////////////
//
// Set input mode.
//
// InputDemoInit() and InputDemoLoad() must be called before setting playback
// mode.
//
// InputDemoInit() must be called before setting record mode.
//
////////////////////////////////////////////////////////////////////////////////
extern void SetInputMode(
	INPUT_MODE mode);										// In:  Input mode


////////////////////////////////////////////////////////////////////////////////
//
// Get current input mode
//
////////////////////////////////////////////////////////////////////////////////
extern INPUT_MODE GetInputMode(void);				// Returns current mode


////////////////////////////////////////////////////////////////////////////////
//
// Init demo mode.  Must be called before setting playback or record modes.
//
////////////////////////////////////////////////////////////////////////////////
extern int16_t InputDemoInit(void);					// Returns 0 if successfull, non-zero otherwise


////////////////////////////////////////////////////////////////////////////////
//
// Kill demo mode.  Must be called if InputDemoInit() was successfull (safe
// to call even if it wasn't.)
//
////////////////////////////////////////////////////////////////////////////////
extern void InputDemoKill(void);


////////////////////////////////////////////////////////////////////////////////
//
// Load previously saved input demo data
//
////////////////////////////////////////////////////////////////////////////////
extern int16_t InputDemoLoad(							// Returns 0 if successfull, non-zero otherwise
	RFile* pFile);											// In:  RFile to load from


////////////////////////////////////////////////////////////////////////////////
//
// Save current input demo data
//
////////////////////////////////////////////////////////////////////////////////
extern int16_t InputDemoSave(							// Returns 0 if successfull, non-zero otherwise
	RFile* pFile);											// In:  RFile to save to


////////////////////////////////////////////////////////////////////////////////
//
// Reset/Clear/Initialize local input.  This should be done just prior to 
// iteratively calling GetLocalInput().  It resets the last input storage and 
// positions the mouse, if mouse input is active.
//
////////////////////////////////////////////////////////////////////////////////
extern void ClearLocalInput(void);

////////////////////////////////////////////////////////////////////////////////
//
// InputIsDemoOver - query function that returns true if there is no more
//							demo data.  It will always return true if we are not in
//							demo playback mode.
//
////////////////////////////////////////////////////////////////////////////////

extern bool InputIsDemoOver(void);		// Returns true when demo is over

////////////////////////////////////////////////////////////////////////////////
//
// Get local input
//
////////////////////////////////////////////////////////////////////////////////
extern UINPUT GetLocalInput(				// Returns local input structure.
	CRealm* prealm,							// In: Realm (used to access realm timer)
	CCamera* camera,                        // In: Camera (used for mouse input)
	U16 idLocalDude,						// In: Local dude id (used for mouse input)
	RInputEvent* pie	= NULL,				// In: Latest input event.  NULL to 
	bool isMP = false);				        // In: If it's mutiplayer
													//	disable cheats in a way that will be
													// harder to hack.


////////////////////////////////////////////////////////////////////////////////
//
// Get input for specified dude
//
////////////////////////////////////////////////////////////////////////////////
inline UINPUT GetInput(int16_t sDudeNumber)
	{
	ASSERT(sDudeNumber < INPUT_MAX_DUDES);
	extern UINPUT m_aInputs[INPUT_MAX_DUDES];
	return m_aInputs[sDudeNumber];
	}


////////////////////////////////////////////////////////////////////////////////
//
// Set input for specified dude
//
////////////////////////////////////////////////////////////////////////////////
inline void SetInput(int16_t sDudeNumber, UINPUT input)
	{
	ASSERT(sDudeNumber < INPUT_MAX_DUDES);
	extern UINPUT m_aInputs[INPUT_MAX_DUDES];
	m_aInputs[sDudeNumber] = input;
	}

#endif //INPUT_H
////////////////////////////////////////////////////////////////////////////////
// EOF
////////////////////////////////////////////////////////////////////////////////