17 e_MaxJoyKeys
= e_MaxJoyBtns
+ e_MaxJoyAxes
*2 + e_MaxJoyHats
*4;
19 e_MaxInputKeys
= e_MaxKbdKeys
+ e_MaxJoys
*e_MaxJoyKeys
- 1;
20 // $$$..$$$ - 321 Keyboard buttons/keys
21 // $$$..$$$ - 4*32 Joystick buttons
22 // $$$..$$$ - 4*4 Joystick axes (- and +)
23 // $$$..$$$ - 4*4 Joystick hats (L U R D)
25 // these are apparently used in g_gui and g_game and elsewhere
26 IK_UNKNOWN
= SDLK_UNKNOWN
;
28 IK_ESCAPE
= SDLK_ESCAPE
;
29 IK_RETURN
= SDLK_RETURN
;
30 IK_ENTER
= SDLK_RETURN
;
34 IK_RIGHT
= SDLK_RIGHT
;
35 IK_DELETE
= SDLK_DELETE
;
37 IK_INSERT
= SDLK_INSERT
;
38 IK_SPACE
= SDLK_SPACE
;
39 IK_CONTROL
= SDLK_LCTRL
;
40 IK_SHIFT
= SDLK_LSHIFT
;
42 IK_PAGEUP
= SDLK_PAGEUP
;
43 IK_PAGEDN
= SDLK_PAGEDOWN
;
54 IK_BACKSPACE
= SDLK_BACKSPACE
;
55 IK_BACKQUOTE
= SDLK_BACKQUOTE
;
56 IK_PAUSE
= SDLK_PAUSE
;
57 // TODO: think of something better than this shit
67 function e_InitInput(): Boolean;
68 procedure e_ReleaseInput();
69 procedure e_ClearInputBuffer();
70 function e_PollInput(): Boolean;
71 function e_KeyPressed(Key
: Word): Boolean;
72 function e_AnyKeyPressed(): Boolean;
73 function e_GetFirstKeyPressed(): Word;
74 function e_JoystickStateToString(mode
: Integer): String;
75 function e_JoyByHandle(handle
: Word): Integer;
76 function e_JoyButtonToKey(id
: Word; btn
: Byte): Word;
77 function e_JoyAxisToKey(id
: Word; ax
: Byte; dir
: Byte): Word;
78 function e_JoyHatToKey(id
: Word; hat
: Byte; dir
: Byte): Word;
79 procedure e_SetKeyState(key
: Word; state
: Integer);
82 {e_MouseInfo: TMouseInfo;}
83 e_EnableInput
: Boolean = False;
84 e_JoysticksAvailable
: Byte = 0;
85 e_JoystickDeadzones
: array [0..e_MaxJoys
-1] of Integer = (8192, 8192, 8192, 8192);
86 e_KeyNames
: array [0..e_MaxInputKeys
] of String;
93 KBRD_END
= e_MaxKbdKeys
;
95 JOYK_END
= JOYK_BEG
+ e_MaxJoyBtns
*e_MaxJoys
;
97 JOYA_END
= JOYA_BEG
+ e_MaxJoyAxes
*2*e_MaxJoys
;
99 JOYH_END
= JOYH_BEG
+ e_MaxJoyHats
*4*e_MaxJoys
;
104 Handle
: PSDL_Joystick
;
108 ButtBuf
: array [0..e_MaxJoyBtns
] of Boolean;
109 AxisBuf
: array [0..e_MaxJoyAxes
] of Integer;
110 HatBuf
: array [0..e_MaxJoyHats
] of array [HAT_LEFT
..HAT_DOWN
] of Boolean;
114 KeyBuffer
: array [0..e_MaxKbdKeys
] of Boolean;
115 Joysticks
: array of TJoystick
= nil;
117 function OpenJoysticks(): Byte;
123 k
:= Min(e_MaxJoys
, SDL_NumJoysticks());
128 joy
:= SDL_JoystickOpen(i
);
132 e_WriteLog('Input: Opened SDL joystick ' + IntToStr(i
) + ' as joystick ' + IntToStr(c
) + ':', MSG_NOTIFY
);
133 SetLength(Joysticks
, c
);
134 with Joysticks
[c
-1] do
138 Axes
:= Min(e_MaxJoyAxes
, SDL_JoystickNumAxes(joy
));
139 Buttons
:= Min(e_MaxJoyBtns
, SDL_JoystickNumButtons(joy
));
140 Hats
:= Min(e_MaxJoyHats
, SDL_JoystickNumHats(joy
));
141 e_WriteLog(' ' + IntToStr(Axes
) + ' axes, ' + IntToStr(Buttons
) + ' buttons, ' +
142 IntToStr(Hats
) + ' hats.', MSG_NOTIFY
);
149 procedure ReleaseJoysticks();
153 if (Joysticks
= nil) or (e_JoysticksAvailable
= 0) then Exit
;
154 for i
:= Low(Joysticks
) to High(Joysticks
) do
156 SDL_JoystickClose(Handle
);
157 SetLength(Joysticks
, 0);
160 function PollKeyboard(): Boolean;
167 Keys
:= SDL_GetKeyState(@NKeys
);
168 if (Keys
= nil) or (NKeys
< 1) then
170 for i
:= 0 to NKeys
do
171 KeyBuffer
[i
] := ((PByte(Cardinal(Keys
) + i
)^) <> 0);
172 for i
:= NKeys
to High(KeyBuffer
) do
173 KeyBuffer
[i
] := False;
176 function PollJoysticks(): Boolean;
182 if (Joysticks
= nil) or (e_JoysticksAvailable
= 0) then Exit
;
183 SDL_JoystickUpdate();
184 for j
:= Low(Joysticks
) to High(Joysticks
) do
187 for i
:= 0 to Buttons
do
188 ButtBuf
[i
] := SDL_JoystickGetButton(Handle
, i
) <> 0;
189 for i
:= 0 to Axes
do
190 AxisBuf
[i
] := SDL_JoystickGetAxis(Handle
, i
);
191 for i
:= 0 to Hats
do
193 hat
:= SDL_JoystickGetHat(Handle
, i
);
194 HatBuf
[i
, HAT_UP
] := LongBool(hat
and SDL_HAT_UP
);
195 HatBuf
[i
, HAT_DOWN
] := LongBool(hat
and SDL_HAT_DOWN
);
196 HatBuf
[i
, HAT_LEFT
] := LongBool(hat
and SDL_HAT_LEFT
);
197 HatBuf
[i
, HAT_RIGHT
] := LongBool(hat
and SDL_HAT_RIGHT
);
202 procedure GenerateKeyNames();
206 // keyboard key names
207 for i
:= 0 to IK_LASTKEY
do
209 e_KeyNames
[i
] := SDL_GetKeyName(i
);
210 if e_KeyNames
[i
] = 'unknown key' then
215 for j
:= 0 to e_MaxJoys
-1 do
217 k
:= JOYK_BEG
+ j
* e_MaxJoyBtns
;
219 for i
:= 0 to e_MaxJoyBtns
-1 do
220 e_KeyNames
[k
+ i
] := Format('JOY%d B%d', [j
, i
]);
221 k
:= JOYA_BEG
+ j
* e_MaxJoyAxes
* 2;
223 for i
:= 0 to e_MaxJoyAxes
-1 do
225 e_KeyNames
[k
+ i
*2 ] := Format('JOY%d A%d+', [j
, i
]);
226 e_KeyNames
[k
+ i
*2 + 1] := Format('JOY%d A%d-', [j
, i
]);
228 k
:= JOYH_BEG
+ j
* e_MaxJoyHats
* 4;
230 for i
:= 0 to e_MaxJoyHats
-1 do
232 e_KeyNames
[k
+ i
*4 ] := Format('JOY%d D%dL', [j
, i
]);
233 e_KeyNames
[k
+ i
*4 + 1] := Format('JOY%d D%dU', [j
, i
]);
234 e_KeyNames
[k
+ i
*4 + 2] := Format('JOY%d D%dR', [j
, i
]);
235 e_KeyNames
[k
+ i
*4 + 3] := Format('JOY%d D%dD', [j
, i
]);
240 function e_InitInput(): Boolean;
244 e_JoysticksAvailable
:= OpenJoysticks();
245 e_EnableInput
:= True;
251 procedure e_ReleaseInput();
254 e_JoysticksAvailable
:= 0;
257 procedure e_ClearInputBuffer();
261 for i
:= Low(KeyBuffer
) to High(KeyBuffer
) do
262 KeyBuffer
[i
] := False;
263 if (Joysticks
= nil) or (e_JoysticksAvailable
= 0) then
264 for i
:= Low(Joysticks
) to High(Joysticks
) do
266 for j
:= Low(Joysticks
[i
].ButtBuf
) to High(Joysticks
[i
].ButtBuf
) do
267 Joysticks
[i
].ButtBuf
[j
] := False;
268 for j
:= Low(Joysticks
[i
].AxisBuf
) to High(Joysticks
[i
].AxisBuf
) do
269 Joysticks
[i
].AxisBuf
[j
] := 0;
270 for j
:= Low(Joysticks
[i
].HatBuf
) to High(Joysticks
[i
].HatBuf
) do
271 for d
:= Low(Joysticks
[i
].HatBuf
[j
]) to High(Joysticks
[i
].HatBuf
[j
]) do
272 Joysticks
[i
].HatBuf
[j
, d
] := False;
276 function e_PollInput(): Boolean;
280 kb
:= PollKeyboard();
281 js
:= PollJoysticks();
286 function e_KeyPressed(Key
: Word): Boolean;
291 if (Key
= IK_INVALID
) or (Key
= 0) then Exit
;
293 if (Key
< KBRD_END
) then
294 begin // Keyboard buttons/keys
295 Result
:= KeyBuffer
[Key
];
298 else if (Key
>= JOYK_BEG
) and (Key
< JOYK_END
) then
299 begin // Joystick buttons
300 JoyI
:= (Key
- JOYK_BEG
) div e_MaxJoyBtns
;
301 if JoyI
>= e_JoysticksAvailable
then
305 Key
:= (Key
- JOYK_BEG
) mod e_MaxJoyBtns
;
306 Result
:= Joysticks
[JoyI
].ButtBuf
[Key
];
310 else if (Key
>= JOYA_BEG
) and (Key
< JOYA_END
) then
311 begin // Joystick axes
312 JoyI
:= (Key
- JOYA_BEG
) div (e_MaxJoyAxes
*2);
313 if JoyI
>= e_JoysticksAvailable
then
317 Key
:= (Key
- JOYA_BEG
) mod (e_MaxJoyAxes
*2);
319 if dir
= AX_MINUS
then
320 Result
:= Joysticks
[JoyI
].AxisBuf
[Key
div 2] < -e_JoystickDeadzones
[JoyI
]
322 Result
:= Joysticks
[JoyI
].AxisBuf
[Key
div 2] > e_JoystickDeadzones
[JoyI
]
326 else if (Key
>= JOYH_BEG
) and (Key
< JOYH_END
) then
327 begin // Joystick hats
328 JoyI
:= (Key
- JOYH_BEG
) div (e_MaxJoyHats
*4);
329 if JoyI
>= e_JoysticksAvailable
then
333 Key
:= (Key
- JOYH_BEG
) mod (e_MaxJoyHats
*4);
335 Result
:= Joysticks
[JoyI
].HatBuf
[Key
div 4, dir
];
340 procedure e_SetKeyState(key
: Word; state
: Integer);
344 if (Key
= IK_INVALID
) or (Key
= 0) then Exit
;
346 if (Key
< KBRD_END
) then
347 begin // Keyboard buttons/keys
348 keyBuffer
[key
] := (state
<> 0);
351 else if (Key
>= JOYK_BEG
) and (Key
< JOYK_END
) then
352 begin // Joystick buttons
353 JoyI
:= (Key
- JOYK_BEG
) div e_MaxJoyBtns
;
354 if JoyI
>= e_JoysticksAvailable
then
358 Key
:= (Key
- JOYK_BEG
) mod e_MaxJoyBtns
;
359 Joysticks
[JoyI
].ButtBuf
[Key
] := (state
<> 0);
363 else if (Key
>= JOYA_BEG
) and (Key
< JOYA_END
) then
364 begin // Joystick axes
365 JoyI
:= (Key
- JOYA_BEG
) div (e_MaxJoyAxes
*2);
366 if JoyI
>= e_JoysticksAvailable
then
370 Key
:= (Key
- JOYA_BEG
) mod (e_MaxJoyAxes
*2);
371 Joysticks
[JoyI
].AxisBuf
[Key
div 2] := state
;
375 else if (Key
>= JOYH_BEG
) and (Key
< JOYH_END
) then
376 begin // Joystick hats
377 JoyI
:= (Key
- JOYH_BEG
) div (e_MaxJoyHats
*4);
378 if JoyI
>= e_JoysticksAvailable
then
382 Key
:= (Key
- JOYH_BEG
) mod (e_MaxJoyHats
*4);
384 Joysticks
[JoyI
].HatBuf
[Key
div 4, dir
] := (state
<> 0);
389 function e_AnyKeyPressed(): Boolean;
395 for k
:= 1 to e_MaxInputKeys
do
396 if e_KeyPressed(k
) then
403 function e_GetFirstKeyPressed(): Word;
407 Result
:= IK_INVALID
;
409 for k
:= 1 to e_MaxInputKeys
do
410 if e_KeyPressed(k
) then
417 ////////////////////////////////////////////////////////////////////////////////
419 function e_JoystickStateToString(mode
: Integer): String;
424 function e_JoyByHandle(handle
: Word): Integer;
429 if Joysticks
= nil then Exit
;
430 for i
:= Low(Joysticks
) to High(Joysticks
) do
431 if Joysticks
[i
].ID
= handle
then
438 function e_JoyButtonToKey(id
: Word; btn
: Byte): Word;
441 if id
>= Length(Joysticks
) then Exit
;
442 Result
:= JOYK_BEG
+ id
*e_MaxJoyBtns
+ btn
;
445 function e_JoyAxisToKey(id
: Word; ax
: Byte; dir
: Byte): Word;
448 if id
>= Length(Joysticks
) then Exit
;
449 Result
:= JOYA_BEG
+ id
*e_MaxJoyAxes
*2 + ax
*2 + dir
;
452 function e_JoyHatToKey(id
: Word; hat
: Byte; dir
: Byte): Word;
455 if id
>= Length(Joysticks
) then Exit
;
456 Result
:= JOYH_BEG
+ id
*e_MaxJoyHats
*4 + hat
*4 + dir
;