1 //-------------------------------------------------------------------------
2 /*
3 Copyright (C) 2010 EDuke32 developers and contributors
4 
5 This file is part of EDuke32.
6 
7 EDuke32 is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License version 2
9 as published by the Free Software Foundation.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 
15 See the GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 */
21 //-------------------------------------------------------------------------
22 
23 #include "global.h"
24 #include "game.h"
25 #include "function.h"
26 #include "keyboard.h"
27 #include "mouse.h"
28 #include "joystick.h"
29 #include "control.h"
30 #include "input.h"
31 #include "menus.h"
32 
I_CheckAllInput(void)33 int32_t I_CheckAllInput(void)
34 {
35     return
36         KB_KeyWaiting()
37         || MOUSE_GetButtons()
38         || JOYSTICK_GetButtons()
39 #if defined EDUKE32_IOS
40         || g_mouseClickState == MOUSE_PRESSED
41 #endif
42         ;
43 }
I_ClearAllInput(void)44 void I_ClearAllInput(void)
45 {
46     KB_FlushKeyboardQueue();
47     KB_ClearKeysDown();
48     MOUSE_ClearAllButtons();
49     JOYSTICK_ClearAllButtons();
50     CONTROL_ClearAllButtons();
51 #if defined EDUKE32_IOS
52     mouseAdvanceClickState();
53 #endif
54 }
55 
56 
I_TextSubmit(void)57 int32_t I_TextSubmit(void)
58 {
59     return
60         KB_KeyPressed(sc_Enter)
61         || KB_KeyPressed(sc_kpad_Enter)
62 #if !defined EDUKE32_TOUCH_DEVICES
63         || MOUSEINACTIVECONDITIONAL(MOUSE_GetButtons()&LEFT_MOUSE)
64 #endif
65         || (JOYSTICK_GetGameControllerButtons()&(1<<GAMECONTROLLER_BUTTON_A))
66 #if defined(GEKKO)
67         || MOUSEINACTIVECONDITIONAL(JOYSTICK_GetButtons()&WII_A)
68 #endif
69         ;
70 }
71 
I_TextSubmitClear(void)72 void I_TextSubmitClear(void)
73 {
74     KB_FlushKeyboardQueue();
75     KB_ClearKeyDown(sc_kpad_Enter);
76     KB_ClearKeyDown(sc_Enter);
77     MOUSE_ClearButton(LEFT_MOUSE);
78     JOYSTICK_ClearGameControllerButton(1<<GAMECONTROLLER_BUTTON_A);
79 #if defined(GEKKO)
80     JOYSTICK_ClearButton(WII_A);
81 #endif
82 }
83 
I_AdvanceTrigger(void)84 int32_t I_AdvanceTrigger(void)
85 {
86     return
87         I_TextSubmit()
88         || KB_KeyPressed(sc_Space);
89 }
90 
I_AdvanceTriggerClear(void)91 void I_AdvanceTriggerClear(void)
92 {
93     I_TextSubmitClear();
94     KB_ClearKeyDown(sc_Space);
95 }
96 
I_ReturnTrigger(void)97 int32_t I_ReturnTrigger(void)
98 {
99     return
100         KB_KeyPressed(sc_Escape)
101         || (MOUSE_GetButtons()&RIGHT_MOUSE)
102         || (JOYSTICK_GetGameControllerButtons()&(1<<GAMECONTROLLER_BUTTON_B))
103 #if defined(GEKKO)
104         || (JOYSTICK_GetButtons()&(WII_B|WII_HOME))
105 #endif
106         ;
107 }
108 
I_ReturnTriggerClear(void)109 void I_ReturnTriggerClear(void)
110 {
111     KB_FlushKeyboardQueue();
112     KB_ClearKeyDown(sc_Escape);
113     MOUSE_ClearButton(RIGHT_MOUSE);
114     JOYSTICK_ClearGameControllerButton(1<<GAMECONTROLLER_BUTTON_B);
115 #if defined(GEKKO)
116     JOYSTICK_ClearButton(WII_B);
117     JOYSTICK_ClearButton(WII_HOME);
118 #endif
119 }
120 
I_GeneralTrigger(void)121 int32_t I_GeneralTrigger(void)
122 {
123     return
124         I_AdvanceTrigger()
125         || I_ReturnTrigger()
126 #if !defined GEKKO
127         || BUTTON(gamefunc_Open)
128 # if !defined EDUKE32_TOUCH_DEVICES
129         || MOUSEINACTIVECONDITIONAL(BUTTON(gamefunc_Fire))
130 # else
131         || BUTTON(gamefunc_Fire)
132 # endif
133 #endif
134         || BUTTON(gamefunc_Crouch)
135         || (JOYSTICK_GetGameControllerButtons()&(1<<GAMECONTROLLER_BUTTON_START))
136         ;
137 }
138 
I_GeneralTriggerClear(void)139 void I_GeneralTriggerClear(void)
140 {
141     I_AdvanceTriggerClear();
142     I_ReturnTriggerClear();
143 #if !defined GEKKO
144     CONTROL_ClearButton(gamefunc_Open);
145     CONTROL_ClearButton(gamefunc_Fire);
146 #endif
147     CONTROL_ClearButton(gamefunc_Crouch);
148     JOYSTICK_ClearGameControllerButton(1<<GAMECONTROLLER_BUTTON_START);
149 }
150 
151 
I_EscapeTrigger(void)152 int32_t I_EscapeTrigger(void)
153 {
154     return
155         KB_KeyPressed(sc_Escape)
156         || (JOYSTICK_GetGameControllerButtons()&(1<<GAMECONTROLLER_BUTTON_START))
157 #if defined(GEKKO)
158         || (JOYSTICK_GetButtons()&WII_HOME)
159 #endif
160         ;
161 }
162 
I_EscapeTriggerClear(void)163 void I_EscapeTriggerClear(void)
164 {
165     KB_FlushKeyboardQueue();
166     KB_ClearKeyDown(sc_Escape);
167     JOYSTICK_ClearGameControllerButton(1<<GAMECONTROLLER_BUTTON_START);
168 #if defined(GEKKO)
169     JOYSTICK_ClearButton(WII_HOME);
170 #endif
171 }
172 
173 
I_MenuUp(void)174 int32_t I_MenuUp(void)
175 {
176     return
177         KB_KeyPressed(sc_UpArrow)
178         || KB_KeyPressed(sc_kpad_8)
179         || (MOUSE_GetButtons()&WHEELUP_MOUSE)
180         || BUTTON(gamefunc_Move_Forward)
181         || (JOYSTICK_GetHat(0)&HAT_UP)
182         || (JOYSTICK_GetGameControllerButtons()&(1<<GAMECONTROLLER_BUTTON_DPAD_UP))
183         || CONTROL_GetGameControllerDigitalAxisNeg(GAMECONTROLLER_AXIS_LEFTY)
184         ;
185 }
186 
I_MenuUpClear(void)187 void I_MenuUpClear(void)
188 {
189     KB_ClearKeyDown(sc_UpArrow);
190     KB_ClearKeyDown(sc_kpad_8);
191     MOUSE_ClearButton(WHEELUP_MOUSE);
192     CONTROL_ClearButton(gamefunc_Move_Forward);
193     JOYSTICK_ClearHat(0);
194     JOYSTICK_ClearGameControllerButton(1<<GAMECONTROLLER_BUTTON_DPAD_UP);
195     CONTROL_ClearGameControllerDigitalAxisNeg(GAMECONTROLLER_AXIS_LEFTY);
196 }
197 
198 
I_MenuDown(void)199 int32_t I_MenuDown(void)
200 {
201     return
202         KB_KeyPressed(sc_DownArrow)
203         || KB_KeyPressed(sc_kpad_2)
204         || (MOUSE_GetButtons()&WHEELDOWN_MOUSE)
205         || BUTTON(gamefunc_Move_Backward)
206         || (JOYSTICK_GetHat(0)&HAT_DOWN)
207         || (JOYSTICK_GetGameControllerButtons()&(1<<GAMECONTROLLER_BUTTON_DPAD_DOWN))
208         || CONTROL_GetGameControllerDigitalAxisPos(GAMECONTROLLER_AXIS_LEFTY)
209         ;
210 }
211 
I_MenuDownClear(void)212 void I_MenuDownClear(void)
213 {
214     KB_ClearKeyDown(sc_DownArrow);
215     KB_ClearKeyDown(sc_kpad_2);
216     KB_ClearKeyDown(sc_PgDn);
217     MOUSE_ClearButton(WHEELDOWN_MOUSE);
218     CONTROL_ClearButton(gamefunc_Move_Backward);
219     JOYSTICK_ClearHat(0);
220     JOYSTICK_ClearGameControllerButton(1<<GAMECONTROLLER_BUTTON_DPAD_DOWN);
221     CONTROL_ClearGameControllerDigitalAxisPos(GAMECONTROLLER_AXIS_LEFTY);
222 }
223 
224 
I_MenuLeft(void)225 int32_t I_MenuLeft(void)
226 {
227     return
228         KB_KeyPressed(sc_LeftArrow)
229         || KB_KeyPressed(sc_kpad_4)
230         || (SHIFTS_IS_PRESSED && KB_KeyPressed(sc_Tab))
231         || BUTTON(gamefunc_Turn_Left)
232         || BUTTON(gamefunc_Strafe_Left)
233         || (JOYSTICK_GetHat(0)&HAT_LEFT)
234         || (JOYSTICK_GetGameControllerButtons()&(1<<GAMECONTROLLER_BUTTON_DPAD_LEFT))
235         || CONTROL_GetGameControllerDigitalAxisNeg(GAMECONTROLLER_AXIS_LEFTX)
236         ;
237 }
238 
I_MenuLeftClear(void)239 void I_MenuLeftClear(void)
240 {
241     KB_ClearKeyDown(sc_LeftArrow);
242     KB_ClearKeyDown(sc_kpad_4);
243     KB_ClearKeyDown(sc_Tab);
244     CONTROL_ClearButton(gamefunc_Turn_Left);
245     CONTROL_ClearButton(gamefunc_Strafe_Left);
246     JOYSTICK_ClearHat(0);
247     JOYSTICK_ClearGameControllerButton(1<<GAMECONTROLLER_BUTTON_DPAD_LEFT);
248     CONTROL_ClearGameControllerDigitalAxisNeg(GAMECONTROLLER_AXIS_LEFTX);
249 }
250 
251 
I_MenuRight(void)252 int32_t I_MenuRight(void)
253 {
254     return
255         KB_KeyPressed(sc_RightArrow)
256         || KB_KeyPressed(sc_kpad_6)
257         || (!SHIFTS_IS_PRESSED && KB_KeyPressed(sc_Tab))
258         || BUTTON(gamefunc_Turn_Right)
259         || BUTTON(gamefunc_Strafe_Right)
260         || (MOUSE_GetButtons()&MIDDLE_MOUSE)
261         || (JOYSTICK_GetHat(0)&HAT_RIGHT)
262         || (JOYSTICK_GetGameControllerButtons()&(1<<GAMECONTROLLER_BUTTON_DPAD_RIGHT))
263         || CONTROL_GetGameControllerDigitalAxisPos(GAMECONTROLLER_AXIS_LEFTX)
264         ;
265 }
266 
I_MenuRightClear(void)267 void I_MenuRightClear(void)
268 {
269     KB_ClearKeyDown(sc_RightArrow);
270     KB_ClearKeyDown(sc_kpad_6);
271     KB_ClearKeyDown(sc_Tab);
272     CONTROL_ClearButton(gamefunc_Turn_Right);
273     CONTROL_ClearButton(gamefunc_Strafe_Right);
274     MOUSE_ClearButton(MIDDLE_MOUSE);
275     JOYSTICK_ClearHat(0);
276     JOYSTICK_ClearGameControllerButton(1<<GAMECONTROLLER_BUTTON_DPAD_RIGHT);
277     CONTROL_ClearGameControllerDigitalAxisPos(GAMECONTROLLER_AXIS_LEFTX);
278 }
279 
280 
I_PanelUp(void)281 int32_t I_PanelUp(void)
282 {
283     return
284         I_MenuUp()
285         || I_MenuLeft()
286         || KB_KeyPressed(sc_PgUp)
287         ;
288 }
289 
I_PanelUpClear(void)290 void I_PanelUpClear(void)
291 {
292     I_MenuUpClear();
293     I_MenuLeftClear();
294     KB_ClearKeyDown(sc_PgUp);
295 }
296 
297 
I_PanelDown(void)298 int32_t I_PanelDown(void)
299 {
300     return
301         I_MenuDown()
302         || I_MenuRight()
303         || KB_KeyPressed(sc_PgDn)
304         || I_AdvanceTrigger()
305         ;
306 }
307 
I_PanelDownClear(void)308 void I_PanelDownClear(void)
309 {
310     I_MenuDownClear();
311     I_MenuRightClear();
312     KB_ClearKeyDown(sc_PgDn);
313     I_AdvanceTriggerClear();
314 }
315 
316 
I_SliderLeft(void)317 int32_t I_SliderLeft(void)
318 {
319     return
320         I_MenuLeft()
321 #if !defined EDUKE32_TOUCH_DEVICES
322         || MOUSEINACTIVECONDITIONAL((MOUSE_GetButtons()&LEFT_MOUSE) && (MOUSE_GetButtons()&WHEELUP_MOUSE))
323 #endif
324         ;
325 }
326 
I_SliderLeftClear(void)327 void I_SliderLeftClear(void)
328 {
329     I_MenuLeftClear();
330     MOUSE_ClearButton(WHEELUP_MOUSE);
331 }
332 
333 
I_SliderRight(void)334 int32_t I_SliderRight(void)
335 {
336     return
337         I_MenuRight()
338 #if !defined EDUKE32_TOUCH_DEVICES
339         || MOUSEINACTIVECONDITIONAL((MOUSE_GetButtons()&LEFT_MOUSE) && (MOUSE_GetButtons()&WHEELDOWN_MOUSE))
340 #endif
341         ;
342 }
343 
I_SliderRightClear(void)344 void I_SliderRightClear(void)
345 {
346     I_MenuRightClear();
347     MOUSE_ClearButton(WHEELDOWN_MOUSE);
348 }
349 
350 
I_EnterText(char * t,int32_t maxlength,int32_t flags)351 int32_t I_EnterText(char *t, int32_t maxlength, int32_t flags)
352 {
353     char ch;
354     int32_t inputloc = Bstrlen(typebuf);
355 
356     while ((ch = KB_GetCh()) != 0)
357     {
358         if (ch == asc_BackSpace)
359         {
360             if (inputloc > 0)
361             {
362                 inputloc--;
363                 *(t+inputloc) = 0;
364             }
365         }
366         else
367         {
368             if (ch == asc_Enter)
369             {
370                 I_AdvanceTriggerClear();
371                 return 1;
372             }
373             else if (ch == asc_Escape)
374             {
375                 I_ReturnTriggerClear();
376                 return -1;
377             }
378             else if (ch >= 32 && inputloc < maxlength && ch < 127)
379             {
380                 if (!(flags & INPUT_NUMERIC) || (ch >= '0' && ch <= '9'))
381                 {
382                     // JBF 20040508: so we can have numeric only if we want
383                     *(t+inputloc) = ch;
384                     *(t+inputloc+1) = 0;
385                     inputloc++;
386                 }
387             }
388         }
389     }
390 
391     if (I_TextSubmit())
392     {
393         I_TextSubmitClear();
394         return 1;
395     }
396     if (I_ReturnTrigger())
397     {
398         I_ReturnTriggerClear();
399         return -1;
400     }
401 
402     return 0;
403 }
404