author | antonc27 <antonc27@mail.ru> |
Wed, 04 Nov 2015 06:56:37 +0100 | |
branch | ios-revival |
changeset 11297 | d1d66d1f6c8a |
parent 11046 | 47a8c19ecb60 |
child 11071 | 3851ce4f2061 |
child 11342 | ed5a6478e710 |
permissions | -rw-r--r-- |
4 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
11046 | 3 |
* Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com> |
4 | 4 |
* |
183 | 5 |
* This program is free software; you can redistribute it and/or modify |
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
4 | 8 |
* |
183 | 9 |
* This program is distributed in the hope that it will be useful, |
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
4 | 13 |
* |
183 | 14 |
* You should have received a copy of the GNU General Public License |
15 |
* along with this program; if not, write to the Free Software |
|
10108
c68cf030eded
update FSF address. note: two sdl include files (by Sam Lantinga) still have the old FSF address in their copyright - but I ain't gonna touch their copyright headers
sheepluva
parents:
10080
diff
changeset
|
16 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
4 | 17 |
*) |
18 |
||
2630 | 19 |
{$INCLUDE "options.inc"} |
20 |
||
6954
a61458a81480
changed uKeys to uInputHandler to better reflect its function
Xeli
parents:
6942
diff
changeset
|
21 |
unit uInputHandler; |
4 | 22 |
interface |
4363 | 23 |
uses SDLh, uTypes; |
4 | 24 |
|
3038 | 25 |
procedure initModule; |
26 |
procedure freeModule; |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
27 |
|
7426
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7403
diff
changeset
|
28 |
function KeyNameToCode(name: shortstring): LongInt; inline; |
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7403
diff
changeset
|
29 |
function KeyNameToCode(name: shortstring; Modifier: shortstring): LongInt; |
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7403
diff
changeset
|
30 |
//procedure MaskModifier(var code: LongInt; modifier: LongWord); |
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
31 |
procedure MaskModifier(Modifier: shortstring; var code: LongInt); |
6917 | 32 |
procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean); |
6992 | 33 |
procedure ProcessKey(event: TSDL_KeyboardEvent); inline; |
34 |
procedure ProcessKey(code: LongInt; KeyDown: boolean); |
|
35 |
||
4 | 36 |
procedure ResetKbd; |
948 | 37 |
procedure FreezeEnterKey; |
4 | 38 |
procedure InitKbdKeyTable; |
39 |
||
167 | 40 |
procedure SetBinds(var binds: TBinds); |
41 |
procedure SetDefaultBinds; |
|
8346 | 42 |
procedure chDefaultBind(var id: shortstring); |
9466 | 43 |
procedure loadBinds(cmd, s: shortstring); |
44 |
procedure addBind(var binds: TBinds; var id: shortstring); |
|
167 | 45 |
|
2428 | 46 |
procedure ControllerInit; |
47 |
procedure ControllerAxisEvent(joy, axis: Byte; value: Integer); |
|
48 |
procedure ControllerHatEvent(joy, hat, value: Byte); |
|
49 |
procedure ControllerButtonEvent(joy, button: Byte; pressed: Boolean); |
|
50 |
||
4 | 51 |
implementation |
10015 | 52 |
uses uConsole, uCommands, uVariables, uConsts, uUtils, uDebug, uPhysFSLayer; |
167 | 53 |
|
7193 | 54 |
const |
55 |
LSHIFT = $0200; |
|
56 |
RSHIFT = $0400; |
|
57 |
LALT = $0800; |
|
58 |
RALT = $1000; |
|
59 |
LCTRL = $2000; |
|
8330 | 60 |
RCTRL = $4000; |
7193 | 61 |
|
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
62 |
var tkbd: array[0..cKbdMaxIndex] of boolean; |
4 | 63 |
KeyNames: array [0..cKeyMaxIndex] of string[15]; |
6982 | 64 |
CurrentBinds: TBinds; |
8145
6408c0ba4ba1
Move global variables to units that use them
Joe Doyle (Ginto8) <ginto8@gmail.com>
parents:
7974
diff
changeset
|
65 |
ControllerNumControllers: Integer; |
6408c0ba4ba1
Move global variables to units that use them
Joe Doyle (Ginto8) <ginto8@gmail.com>
parents:
7974
diff
changeset
|
66 |
ControllerEnabled: Integer; |
6408c0ba4ba1
Move global variables to units that use them
Joe Doyle (Ginto8) <ginto8@gmail.com>
parents:
7974
diff
changeset
|
67 |
ControllerNumAxes: array[0..5] of Integer; |
6408c0ba4ba1
Move global variables to units that use them
Joe Doyle (Ginto8) <ginto8@gmail.com>
parents:
7974
diff
changeset
|
68 |
//ControllerNumBalls: array[0..5] of Integer; |
6408c0ba4ba1
Move global variables to units that use them
Joe Doyle (Ginto8) <ginto8@gmail.com>
parents:
7974
diff
changeset
|
69 |
ControllerNumHats: array[0..5] of Integer; |
6408c0ba4ba1
Move global variables to units that use them
Joe Doyle (Ginto8) <ginto8@gmail.com>
parents:
7974
diff
changeset
|
70 |
ControllerNumButtons: array[0..5] of Integer; |
8370 | 71 |
//ControllerAxes: array[0..5] of array[0..19] of Integer; |
8145
6408c0ba4ba1
Move global variables to units that use them
Joe Doyle (Ginto8) <ginto8@gmail.com>
parents:
7974
diff
changeset
|
72 |
//ControllerBalls: array[0..5] of array[0..19] of array[0..1] of Integer; |
8370 | 73 |
//ControllerHats: array[0..5] of array[0..19] of Byte; |
74 |
//ControllerButtons: array[0..5] of array[0..19] of Byte; |
|
3697 | 75 |
|
7426
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7403
diff
changeset
|
76 |
function KeyNameToCode(name: shortstring): LongInt; inline; |
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7403
diff
changeset
|
77 |
begin |
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7403
diff
changeset
|
78 |
KeyNameToCode:= KeyNameToCode(name, ''); |
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7403
diff
changeset
|
79 |
end; |
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7403
diff
changeset
|
80 |
|
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
81 |
function KeyNameToCode(name: shortstring; Modifier: shortstring): LongInt; |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
82 |
var code: LongInt; |
2678
334016e8d895
injection of custom code in SDL for iPhone in order to implement our frontend
koda
parents:
2674
diff
changeset
|
83 |
begin |
6917 | 84 |
name:= LowerCase(name); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
85 |
code:= cKeyMaxIndex; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
86 |
while (code > 0) and (KeyNames[code] <> name) do dec(code); |
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
87 |
|
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
88 |
MaskModifier(Modifier, code); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
89 |
KeyNameToCode:= code; |
2678
334016e8d895
injection of custom code in SDL for iPhone in order to implement our frontend
koda
parents:
2674
diff
changeset
|
90 |
end; |
7426
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7403
diff
changeset
|
91 |
(* |
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
92 |
procedure MaskModifier(var code: LongInt; Modifier: LongWord); |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
93 |
begin |
8330 | 94 |
if(Modifier and KMOD_LSHIFT) <> 0 then code:= code or LSHIFT; |
95 |
if(Modifier and KMOD_RSHIFT) <> 0 then code:= code or LSHIFT; |
|
96 |
if(Modifier and KMOD_LALT) <> 0 then code:= code or LALT; |
|
97 |
if(Modifier and KMOD_RALT) <> 0 then code:= code or LALT; |
|
98 |
if(Modifier and KMOD_LCTRL) <> 0 then code:= code or LCTRL; |
|
99 |
if(Modifier and KMOD_RCTRL) <> 0 then code:= code or LCTRL; |
|
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
100 |
end; |
7426
55b49cc1f33a
Changes for the benefit of pas2c. Use downto in for loops to avoid repeated calls of Random/GetRandom. Wrap nots.
nemo
parents:
7403
diff
changeset
|
101 |
*) |
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
102 |
procedure MaskModifier(Modifier: shortstring; var code: LongInt); |
10015 | 103 |
var mod_ : shortstring = ''; |
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
104 |
ModifierCount, i: LongInt; |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
105 |
begin |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
106 |
if Modifier = '' then exit; |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
107 |
ModifierCount:= 0; |
7202 | 108 |
|
109 |
for i:= 1 to Length(Modifier) do |
|
110 |
if(Modifier[i] = ':') then inc(ModifierCount); |
|
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
111 |
|
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
112 |
SplitByChar(Modifier, mod_, ':');//remove the first mod: part |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
113 |
Modifier:= mod_; |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
114 |
for i:= 0 to ModifierCount do |
8330 | 115 |
begin |
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
116 |
mod_:= ''; |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
117 |
SplitByChar(Modifier, mod_, ':'); |
7193 | 118 |
if (Modifier = 'lshift') then code:= code or LSHIFT; |
119 |
if (Modifier = 'rshift') then code:= code or RSHIFT; |
|
120 |
if (Modifier = 'lalt') then code:= code or LALT; |
|
121 |
if (Modifier = 'ralt') then code:= code or RALT; |
|
122 |
if (Modifier = 'lctrl') or (mod_ = 'lmeta') then code:= code or LCTRL; |
|
123 |
if (Modifier = 'rctrl') or (mod_ = 'rmeta') then code:= code or RCTRL; |
|
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
124 |
Modifier:= mod_; |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
125 |
end; |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
126 |
end; |
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
127 |
|
6917 | 128 |
procedure ProcessKey(code: LongInt; KeyDown: boolean); |
129 |
var |
|
130 |
Trusted: boolean; |
|
131 |
s : string; |
|
132 |
begin |
|
7141
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
133 |
if not(tkbd[code] xor KeyDown) then exit; |
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
134 |
tkbd[code]:= KeyDown; |
7140
29948153fda2
Don't allow for multiple key up(or down) events, it will ignore the excess events
Xeli
parents:
7118
diff
changeset
|
135 |
|
6917 | 136 |
Trusted:= (CurrentTeam <> nil) |
137 |
and (not CurrentTeam^.ExtDriven) |
|
138 |
and (CurrentHedgehog^.BotLevel = 0); |
|
9714 | 139 |
// REVIEW OR FIXME |
140 |
// ctrl/cmd + q to close engine and frontend - this seems like a bad idea, since we let people set arbitrary binds, and don't warn them of this. |
|
141 |
// There's no confirmation at all |
|
6942 | 142 |
// ctrl/cmd + q to close engine and frontend |
8746
55539c550c33
use SDL keycode for shortcuts (doesn't fix layout issues)
koda
parents:
8370
diff
changeset
|
143 |
if(KeyDown and (code = SDLK_q)) then |
6942 | 144 |
begin |
145 |
{$IFDEF DARWIN} |
|
7141
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
146 |
if tkbd[KeyNameToCode('left_meta')] or tkbd[KeyNameToCode('right_meta')] then |
6942 | 147 |
{$ELSE} |
7141
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
148 |
if tkbd[KeyNameToCode('left_ctrl')] or tkbd[KeyNameToCode('right_ctrl')] then |
6942 | 149 |
{$ENDIF} |
7869
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
150 |
ParseCommand('halt', true); |
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
151 |
end; |
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
152 |
|
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
153 |
// ctrl/cmd + w to close engine |
8746
55539c550c33
use SDL keycode for shortcuts (doesn't fix layout issues)
koda
parents:
8370
diff
changeset
|
154 |
if(KeyDown and (code = SDLK_w)) then |
7869
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
155 |
begin |
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
156 |
{$IFDEF DARWIN} |
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
157 |
// on OS X it this is expected behaviour |
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
158 |
if tkbd[KeyNameToCode('left_meta')] or tkbd[KeyNameToCode('right_meta')] then |
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
159 |
{$ELSE} |
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
160 |
// on other systems use this shortcut only if the keys are not bound to any command |
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
161 |
if tkbd[KeyNameToCode('left_ctrl')] or tkbd[KeyNameToCode('right_ctrl')] then |
7871 | 162 |
if ((CurrentBinds[KeyNameToCode('left_ctrl')] = '') or |
163 |
(CurrentBinds[KeyNameToCode('right_ctrl')] = '')) and |
|
8746
55539c550c33
use SDL keycode for shortcuts (doesn't fix layout issues)
koda
parents:
8370
diff
changeset
|
164 |
(CurrentBinds[SDLK_w] = '') then |
7869
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
165 |
{$ENDIF} |
5dd2c047c96f
close engine shortcut, from the discussion in issue 317
koda
parents:
7848
diff
changeset
|
166 |
ParseCommand('forcequit', true); |
6942 | 167 |
end; |
168 |
||
6917 | 169 |
if CurrentBinds[code][0] <> #0 then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
170 |
begin |
7964
d00378a37dde
Simplify ammo menu conditions so it shows up in more states. Should fix issue #465. The part w/ sliding in uworld is main #465 problem.
nemo
parents:
7876
diff
changeset
|
171 |
if (code > 3) and KeyDown and (not ((CurrentBinds[code] = 'put')) or (CurrentBinds[code] = 'ammomenu') or (CurrentBinds[code] = '+cur_u') or (CurrentBinds[code] = '+cur_d') or (CurrentBinds[code] = '+cur_l') or (CurrentBinds[code] = '+cur_r')) and (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) then bShowAmmoMenu:= false; |
7140
29948153fda2
Don't allow for multiple key up(or down) events, it will ignore the excess events
Xeli
parents:
7118
diff
changeset
|
172 |
if KeyDown then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
173 |
begin |
10392 | 174 |
Trusted:= Trusted and (not isPaused); //releasing keys during pause should be allowed on the other hand |
10510 | 175 |
|
9693 | 176 |
if CurrentBinds[code] = 'switch' then |
9714 | 177 |
LocalMessage:= LocalMessage or gmSwitch |
178 |
else if CurrentBinds[code] = '+precise' then |
|
179 |
LocalMessage:= LocalMessage or gmPrecise; |
|
10015 | 180 |
|
6917 | 181 |
ParseCommand(CurrentBinds[code], Trusted); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
182 |
if (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) and (ReadyTimeLeft > 1) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
183 |
ParseCommand('gencmd R', true) |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
184 |
end |
7140
29948153fda2
Don't allow for multiple key up(or down) events, it will ignore the excess events
Xeli
parents:
7118
diff
changeset
|
185 |
else if (CurrentBinds[code][1] = '+') then |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
186 |
begin |
9714 | 187 |
if CurrentBinds[code] = '+precise' then |
9954 | 188 |
LocalMessage:= LocalMessage and (not gmPrecise); |
6917 | 189 |
s:= CurrentBinds[code]; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
190 |
s[1]:= '-'; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
191 |
ParseCommand(s, Trusted); |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
192 |
if (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) and (ReadyTimeLeft > 1) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
193 |
ParseCommand('gencmd R', true) |
9693 | 194 |
end |
195 |
else |
|
196 |
begin |
|
197 |
if CurrentBinds[code] = 'switch' then |
|
9954 | 198 |
LocalMessage:= LocalMessage and (not gmSwitch) |
9693 | 199 |
end |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
200 |
end |
6917 | 201 |
end; |
202 |
||
6992 | 203 |
procedure ProcessKey(event: TSDL_KeyboardEvent); inline; |
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
204 |
var code: LongInt; |
6917 | 205 |
begin |
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
206 |
code:= event.keysym.sym; |
7199 | 207 |
//MaskModifier(code, event.keysym.modifier); |
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
208 |
ProcessKey(code, event.type_ = SDL_KEYDOWN); |
6917 | 209 |
end; |
210 |
||
211 |
procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean); |
|
212 |
begin |
|
213 |
case event.button of |
|
214 |
SDL_BUTTON_LEFT: |
|
215 |
ProcessKey(KeyNameToCode('mousel'), ButtonDown); |
|
216 |
SDL_BUTTON_MIDDLE: |
|
217 |
ProcessKey(KeyNameToCode('mousem'), ButtonDown); |
|
218 |
SDL_BUTTON_RIGHT: |
|
219 |
ProcessKey(KeyNameToCode('mouser'), ButtonDown); |
|
220 |
SDL_BUTTON_WHEELDOWN: |
|
221 |
ProcessKey(KeyNameToCode('wheeldown'), ButtonDown); |
|
222 |
SDL_BUTTON_WHEELUP: |
|
223 |
ProcessKey(KeyNameToCode('wheelup'), ButtonDown); |
|
224 |
end; |
|
4 | 225 |
end; |
226 |
||
227 |
procedure ResetKbd; |
|
7117
7df6386f7090
reimplemented ResetKbd and calling it when exiting gsChat status, this restores behavior from.17: You can now walk -> press t/chat -> type some stuff while still walking -> exit gsChat and stop walking at that moment
Xeli
parents:
7106
diff
changeset
|
228 |
var t: LongInt; |
4 | 229 |
begin |
7191
9419294e5f33
first attempt at implementing support for keys with modifiers
Xeli
parents:
7184
diff
changeset
|
230 |
for t:= 0 to cKbdMaxIndex do |
7141
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
231 |
if tkbd[t] then |
7117
7df6386f7090
reimplemented ResetKbd and calling it when exiting gsChat status, this restores behavior from.17: You can now walk -> press t/chat -> type some stuff while still walking -> exit gsChat and stop walking at that moment
Xeli
parents:
7106
diff
changeset
|
232 |
ProcessKey(t, False); |
4 | 233 |
end; |
234 |
||
235 |
procedure InitKbdKeyTable; |
|
2428 | 236 |
var i, j, k, t: LongInt; |
4 | 237 |
s: string[15]; |
238 |
begin |
|
6917 | 239 |
//TODO in sdl13 this overrides some values (A and B) change indices to some other values at the back perhaps? |
6909 | 240 |
KeyNames[1]:= 'mousel'; |
241 |
KeyNames[2]:= 'mousem'; |
|
242 |
KeyNames[3]:= 'mouser'; |
|
243 |
KeyNames[4]:= 'wheelup'; |
|
244 |
KeyNames[5]:= 'wheeldown'; |
|
245 |
||
246 |
for i:= 6 to cKeyMaxIndex do |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
247 |
begin |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3971
diff
changeset
|
248 |
s:= shortstring(sdl_getkeyname(i)); |
7870 | 249 |
//WriteLnToConsole('uInputHandler - ' + IntToStr(i) + ': ' + s + ' ' + IntToStr(cKeyMaxIndex)); |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3971
diff
changeset
|
250 |
if s = 'unknown key' then KeyNames[i]:= '' |
8330 | 251 |
else |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3971
diff
changeset
|
252 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
253 |
for t:= 1 to Length(s) do |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
254 |
if s[t] = ' ' then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
255 |
s[t]:= '_'; |
6917 | 256 |
KeyNames[i]:= LowerCase(s) |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
257 |
end; |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3971
diff
changeset
|
258 |
end; |
2613 | 259 |
|
167 | 260 |
|
6909 | 261 |
// get the size of keyboard array |
262 |
SDL_GetKeyState(@k); |
|
263 |
||
2428 | 264 |
// Controller(s) |
265 |
for j:= 0 to Pred(ControllerNumControllers) do |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
266 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
267 |
for i:= 0 to Pred(ControllerNumAxes[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
268 |
begin |
4374 | 269 |
keynames[k + 0]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'u'; |
270 |
keynames[k + 1]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'd'; |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
271 |
inc(k, 2); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
272 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
273 |
for i:= 0 to Pred(ControllerNumHats[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
274 |
begin |
4374 | 275 |
keynames[k + 0]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'u'; |
276 |
keynames[k + 1]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'r'; |
|
277 |
keynames[k + 2]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'd'; |
|
278 |
keynames[k + 3]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'l'; |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
279 |
inc(k, 4); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
280 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
281 |
for i:= 0 to Pred(ControllerNumButtons[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
282 |
begin |
4374 | 283 |
keynames[k]:= 'j' + IntToStr(j) + 'b' + IntToStr(i); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
284 |
inc(k, 1); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
285 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
286 |
end; |
2581 | 287 |
|
6917 | 288 |
DefaultBinds[KeyNameToCode('escape')]:= 'quit'; |
7876
a366fbe91b58
Fix 440, used 'grave' rather than '`' in default binds
Xeli
parents:
7871
diff
changeset
|
289 |
DefaultBinds[KeyNameToCode(_S'`')]:= 'history'; |
6917 | 290 |
DefaultBinds[KeyNameToCode('delete')]:= 'rotmask'; |
2379 | 291 |
|
2606
ed687a8d081f
updated build files for macosx and optimization system
koda
parents:
2599
diff
changeset
|
292 |
//numpad |
ed687a8d081f
updated build files for macosx and optimization system
koda
parents:
2599
diff
changeset
|
293 |
//DefaultBinds[265]:= '+volup'; |
ed687a8d081f
updated build files for macosx and optimization system
koda
parents:
2599
diff
changeset
|
294 |
//DefaultBinds[256]:= '+voldown'; |
ed687a8d081f
updated build files for macosx and optimization system
koda
parents:
2599
diff
changeset
|
295 |
|
7071 | 296 |
DefaultBinds[KeyNameToCode(_S'0')]:= '+volup'; |
297 |
DefaultBinds[KeyNameToCode(_S'9')]:= '+voldown'; |
|
7403 | 298 |
DefaultBinds[KeyNameToCode(_S'8')]:= 'mute'; |
7071 | 299 |
DefaultBinds[KeyNameToCode(_S'c')]:= 'capture'; |
7180 | 300 |
DefaultBinds[KeyNameToCode(_S'r')]:= 'record'; |
7071 | 301 |
DefaultBinds[KeyNameToCode(_S'h')]:= 'findhh'; |
302 |
DefaultBinds[KeyNameToCode(_S'p')]:= 'pause'; |
|
303 |
DefaultBinds[KeyNameToCode(_S's')]:= '+speedup'; |
|
304 |
DefaultBinds[KeyNameToCode(_S't')]:= 'chat'; |
|
305 |
DefaultBinds[KeyNameToCode(_S'y')]:= 'confirm'; |
|
1051
dfdd5dfe97d4
Enable fullscreen switching back, now it's bound on F12
unc0rr
parents:
1022
diff
changeset
|
306 |
|
6909 | 307 |
DefaultBinds[KeyNameToCode('mousem')]:= 'zoomreset'; |
9082
d971f88c71c0
Since this keeps coming up. Sync engine and frontend wheel handling, again.
nemo
parents:
9080
diff
changeset
|
308 |
DefaultBinds[KeyNameToCode('wheelup')]:= 'zoomin'; |
d971f88c71c0
Since this keeps coming up. Sync engine and frontend wheel handling, again.
nemo
parents:
9080
diff
changeset
|
309 |
DefaultBinds[KeyNameToCode('wheeldown')]:= 'zoomout'; |
2407
9f413bd5150e
- Fix mouse cursor bugs in net game (still has a bug near water)
unc0rr
parents:
2379
diff
changeset
|
310 |
|
6909 | 311 |
DefaultBinds[KeyNameToCode('f12')]:= 'fullscr'; |
1051
dfdd5dfe97d4
Enable fullscreen switching back, now it's bound on F12
unc0rr
parents:
1022
diff
changeset
|
312 |
|
2786 | 313 |
|
6917 | 314 |
DefaultBinds[KeyNameToCode('mousel')]:= '/put'; |
315 |
DefaultBinds[KeyNameToCode('mouser')]:= 'ammomenu'; |
|
316 |
DefaultBinds[KeyNameToCode('backspace')]:= 'hjump'; |
|
317 |
DefaultBinds[KeyNameToCode('tab')]:= 'switch'; |
|
318 |
DefaultBinds[KeyNameToCode('return')]:= 'ljump'; |
|
319 |
DefaultBinds[KeyNameToCode('space')]:= '+attack'; |
|
6909 | 320 |
DefaultBinds[KeyNameToCode('up')]:= '+up'; |
321 |
DefaultBinds[KeyNameToCode('down')]:= '+down'; |
|
322 |
DefaultBinds[KeyNameToCode('left')]:= '+left'; |
|
323 |
DefaultBinds[KeyNameToCode('right')]:= '+right'; |
|
324 |
DefaultBinds[KeyNameToCode('left_shift')]:= '+precise'; |
|
2754
ad4f81fbfb76
touchinput works, invisible buttons added and initial support for chat
koda
parents:
2716
diff
changeset
|
325 |
|
7088
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
326 |
|
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
327 |
DefaultBinds[KeyNameToCode('j0a0u')]:= '+left'; |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
328 |
DefaultBinds[KeyNameToCode('j0a0d')]:= '+right'; |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
329 |
DefaultBinds[KeyNameToCode('j0a1u')]:= '+up'; |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
330 |
DefaultBinds[KeyNameToCode('j0a1d')]:= '+down'; |
9678 | 331 |
for i:= 1 to 10 do DefaultBinds[KeyNameToCode('f'+IntToStr(i))]:= 'slot '+char(i+48); |
6909 | 332 |
for i:= 1 to 5 do DefaultBinds[KeyNameToCode(IntToStr(i))]:= 'timer '+IntToStr(i); |
9466 | 333 |
|
334 |
loadBinds('dbind', cPathz[ptData] + '/settings.ini'); |
|
4 | 335 |
end; |
336 |
||
167 | 337 |
procedure SetBinds(var binds: TBinds); |
7184
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
338 |
{$IFNDEF MOBILE} |
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
339 |
var |
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
340 |
t: LongInt; |
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
341 |
{$ENDIF} |
167 | 342 |
begin |
6654
120e95c10532
use the way actions are initiated the same way as koda implemented with PascalExports, using boolean values such as upKey and enterKey, this prevents the user from being able to control the AI
Xeli
parents:
6580
diff
changeset
|
343 |
{$IFDEF MOBILE} |
3971 | 344 |
binds:= binds; // avoid hint |
3663
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
345 |
CurrentBinds:= DefaultBinds; |
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
346 |
{$ELSE} |
8346 | 347 |
for t:= 0 to cKbdMaxIndex do |
348 |
if (CurrentBinds[t] <> binds[t]) and tkbd[t] then |
|
349 |
ProcessKey(t, False); |
|
7184
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
350 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
351 |
CurrentBinds:= binds; |
3663
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
352 |
{$ENDIF} |
167 | 353 |
end; |
354 |
||
355 |
procedure SetDefaultBinds; |
|
356 |
begin |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
357 |
CurrentBinds:= DefaultBinds; |
167 | 358 |
end; |
359 |
||
948 | 360 |
procedure FreezeEnterKey; |
361 |
begin |
|
7141
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
362 |
tkbd[3]:= True; |
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
363 |
tkbd[13]:= True; |
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
364 |
tkbd[27]:= True; |
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
365 |
tkbd[271]:= True; |
948 | 366 |
end; |
167 | 367 |
|
2591
c6597b65caea
other controls implementation + sdlh revisited (once again)
koda
parents:
2590
diff
changeset
|
368 |
var Controller: array [0..5] of PSDL_Joystick; |
3697 | 369 |
|
2428 | 370 |
procedure ControllerInit; |
8370 | 371 |
var j: Integer; |
2428 | 372 |
begin |
3663
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
373 |
ControllerEnabled:= 0; |
7088
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
374 |
{$IFDEF IPHONE} |
3663
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
375 |
exit; // joystick subsystem disabled on iPhone |
3513
f589230fa21b
now it's possible to select the scheme file in the ifrontendfix a type about loading an image (iphone file system IS case senstive)
koda
parents:
3493
diff
changeset
|
376 |
{$ENDIF} |
2674
2fce032f2f95
lupdate + Palewolf's updated spanish translation + other patches of mine
koda
parents:
2671
diff
changeset
|
377 |
|
3663
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
378 |
SDL_InitSubSystem(SDL_INIT_JOYSTICK); |
2674
2fce032f2f95
lupdate + Palewolf's updated spanish translation + other patches of mine
koda
parents:
2671
diff
changeset
|
379 |
ControllerNumControllers:= SDL_NumJoysticks(); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
380 |
|
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
381 |
if ControllerNumControllers > 6 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
382 |
ControllerNumControllers:= 6; |
2428 | 383 |
|
4374 | 384 |
WriteLnToConsole('Number of game controllers: ' + IntToStr(ControllerNumControllers)); |
2428 | 385 |
|
386 |
if ControllerNumControllers > 0 then |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
387 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
388 |
for j:= 0 to pred(ControllerNumControllers) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
389 |
begin |
7151 | 390 |
WriteLnToConsole('Using game controller: ' + shortstring(SDL_JoystickName(j))); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
391 |
Controller[j]:= SDL_JoystickOpen(j); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
392 |
if Controller[j] = nil then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
393 |
WriteLnToConsole('* Failed to open game controller!') |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
394 |
else |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
395 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
396 |
ControllerNumAxes[j]:= SDL_JoystickNumAxes(Controller[j]); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
397 |
//ControllerNumBalls[j]:= SDL_JoystickNumBalls(Controller[j]); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
398 |
ControllerNumHats[j]:= SDL_JoystickNumHats(Controller[j]); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
399 |
ControllerNumButtons[j]:= SDL_JoystickNumButtons(Controller[j]); |
4374 | 400 |
WriteLnToConsole('* Number of axes: ' + IntToStr(ControllerNumAxes[j])); |
401 |
//WriteLnToConsole('* Number of balls: ' + IntToStr(ControllerNumBalls[j])); |
|
402 |
WriteLnToConsole('* Number of hats: ' + IntToStr(ControllerNumHats[j])); |
|
403 |
WriteLnToConsole('* Number of buttons: ' + IntToStr(ControllerNumButtons[j])); |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
404 |
ControllerEnabled:= 1; |
3697 | 405 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
406 |
if ControllerNumAxes[j] > 20 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
407 |
ControllerNumAxes[j]:= 20; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
408 |
//if ControllerNumBalls[j] > 20 then ControllerNumBalls[j]:= 20; |
8330 | 409 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
410 |
if ControllerNumHats[j] > 20 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
411 |
ControllerNumHats[j]:= 20; |
8330 | 412 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
413 |
if ControllerNumButtons[j] > 20 then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
414 |
ControllerNumButtons[j]:= 20; |
3697 | 415 |
|
8370 | 416 |
(*// reset all buttons/axes |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
417 |
for i:= 0 to pred(ControllerNumAxes[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
418 |
ControllerAxes[j][i]:= 0; |
8370 | 419 |
for i:= 0 to pred(ControllerNumBalls[j]) do |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
420 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
421 |
ControllerBalls[j][i][0]:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
422 |
ControllerBalls[j][i][1]:= 0; |
8370 | 423 |
end; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
424 |
for i:= 0 to pred(ControllerNumHats[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
425 |
ControllerHats[j][i]:= SDL_HAT_CENTERED; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
426 |
for i:= 0 to pred(ControllerNumButtons[j]) do |
8370 | 427 |
ControllerButtons[j][i]:= 0;*) |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
428 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
429 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
430 |
// enable event generation/controller updating |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
431 |
SDL_JoystickEventState(1); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
432 |
end |
3697 | 433 |
else |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
434 |
WriteLnToConsole('Not using any game controller'); |
2428 | 435 |
end; |
436 |
||
437 |
procedure ControllerAxisEvent(joy, axis: Byte; value: Integer); |
|
7088
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
438 |
var |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
439 |
k: LongInt; |
2428 | 440 |
begin |
7088
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
441 |
SDL_GetKeyState(@k); |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
442 |
k:= k + joy * (ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + ControllerNumButtons[joy]*2); |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
443 |
ProcessKey(k + axis*2, value > 20000); |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
444 |
ProcessKey(k + (axis*2)+1, value < -20000); |
2428 | 445 |
end; |
446 |
||
447 |
procedure ControllerHatEvent(joy, hat, value: Byte); |
|
7088
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
448 |
var |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
449 |
k: LongInt; |
2428 | 450 |
begin |
7088
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
451 |
SDL_GetKeyState(@k); |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
452 |
k:= k + joy * (ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + ControllerNumButtons[joy]*2); |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
453 |
ProcessKey(k + ControllerNumAxes[joy]*2 + hat*4 + 0, (value and SDL_HAT_UP) <> 0); |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
454 |
ProcessKey(k + ControllerNumAxes[joy]*2 + hat*4 + 1, (value and SDL_HAT_RIGHT)<> 0); |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
455 |
ProcessKey(k + ControllerNumAxes[joy]*2 + hat*4 + 2, (value and SDL_HAT_DOWN) <> 0); |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
456 |
ProcessKey(k + ControllerNumAxes[joy]*2 + hat*4 + 3, (value and SDL_HAT_LEFT) <> 0); |
2428 | 457 |
end; |
458 |
||
459 |
procedure ControllerButtonEvent(joy, button: Byte; pressed: Boolean); |
|
7088
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
460 |
var |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
461 |
k: LongInt; |
2428 | 462 |
begin |
7088
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
463 |
SDL_GetKeyState(@k); |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
464 |
k:= k + joy * (ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + ControllerNumButtons[joy]*2); |
dbec9bae4de1
first attempt at fixing controller/gamepad, it works with the android controller but it doesnt have hats/buttons, needs testing
Xeli
parents:
7071
diff
changeset
|
465 |
ProcessKey(k + ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + button, pressed); |
2428 | 466 |
end; |
467 |
||
9466 | 468 |
procedure loadBinds(cmd, s: shortstring); |
469 |
var i: LongInt; |
|
470 |
f: PFSFile; |
|
471 |
p, l: shortstring; |
|
472 |
b: byte; |
|
473 |
begin |
|
10139 | 474 |
if cOnlyStats then exit; |
10510 | 475 |
|
9466 | 476 |
AddFileLog('[BINDS] Loading binds from: ' + s); |
477 |
||
478 |
l:= ''; |
|
479 |
if pfsExists(s) then |
|
480 |
begin |
|
481 |
f:= pfsOpenRead(s); |
|
482 |
while (not pfsEOF(f)) and (l <> '[Binds]') do |
|
483 |
pfsReadLn(f, l); |
|
484 |
||
485 |
while (not pfsEOF(f)) and (l <> '') do |
|
486 |
begin |
|
487 |
pfsReadLn(f, l); |
|
488 |
||
489 |
p:= ''; |
|
490 |
i:= 1; |
|
491 |
while (i <= length(l)) and (l[i] <> '=') do |
|
492 |
begin |
|
9981 | 493 |
if l[i] = '%' then |
9466 | 494 |
begin |
495 |
l[i]:= '$'; |
|
496 |
val(copy(l, i, 3), b); |
|
497 |
p:= p + char(b); |
|
498 |
inc(i, 3) |
|
10015 | 499 |
end |
9981 | 500 |
else |
501 |
begin |
|
502 |
p:= p + l[i]; |
|
503 |
inc(i) |
|
9466 | 504 |
end; |
505 |
end; |
|
506 |
||
507 |
if i < length(l) then |
|
508 |
begin |
|
509 |
l:= copy(l, i + 1, length(l) - i); |
|
510 |
if l <> 'default' then |
|
511 |
begin |
|
10015 | 512 |
if (length(l) = 2) and (l[1] = '\') then |
10080 | 513 |
l:= l[1] + '' |
9981 | 514 |
else if (l[1] = '"') and (l[length(l)] = '"') then |
515 |
l:= copy(l, 2, length(l) - 2); |
|
516 |
||
9466 | 517 |
p:= cmd + ' ' + l + ' ' + p; |
518 |
ParseCommand(p, true) |
|
519 |
end |
|
520 |
end |
|
521 |
end; |
|
522 |
||
523 |
pfsClose(f) |
|
10015 | 524 |
end |
9466 | 525 |
else |
526 |
AddFileLog('[BINDS] file not found'); |
|
527 |
end; |
|
528 |
||
529 |
||
530 |
procedure addBind(var binds: TBinds; var id: shortstring); |
|
8346 | 531 |
var KeyName, Modifier, tmp: shortstring; |
9466 | 532 |
i, b: LongInt; |
8346 | 533 |
begin |
534 |
KeyName:= ''; |
|
535 |
Modifier:= ''; |
|
536 |
||
9466 | 537 |
if(Pos('mod:', id) <> 0)then |
8346 | 538 |
begin |
539 |
tmp:= ''; |
|
540 |
SplitBySpace(id, tmp); |
|
541 |
Modifier:= id; |
|
542 |
id:= tmp; |
|
543 |
end; |
|
544 |
||
545 |
SplitBySpace(id, KeyName); |
|
546 |
if KeyName[1]='"' then |
|
547 |
Delete(KeyName, 1, 1); |
|
548 |
if KeyName[byte(KeyName[0])]='"' then |
|
549 |
Delete(KeyName, byte(KeyName[0]), 1); |
|
550 |
b:= KeyNameToCode(id, Modifier); |
|
551 |
if b = 0 then |
|
552 |
OutError(errmsgUnknownVariable + ' "' + id + '"', false) |
|
553 |
else |
|
10015 | 554 |
begin |
9466 | 555 |
// add bind: first check if this cmd is already bound, and remove old bind |
556 |
i:= cKbdMaxIndex; |
|
557 |
repeat |
|
558 |
dec(i) |
|
559 |
until (i < 0) or (binds[i] = KeyName); |
|
560 |
if (i >= 0) then |
|
561 |
binds[i]:= ''; |
|
562 |
||
563 |
binds[b]:= KeyName; |
|
564 |
end |
|
565 |
end; |
|
566 |
||
567 |
// Bind that isn't a team bind, but overrides defaultbinds. |
|
568 |
procedure chDefaultBind(var id: shortstring); |
|
569 |
begin |
|
570 |
addBind(DefaultBinds, id) |
|
8346 | 571 |
end; |
572 |
||
3038 | 573 |
procedure initModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
574 |
begin |
8346 | 575 |
RegisterVariable('dbind', @chDefaultBind, true ); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
576 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
577 |
|
3038 | 578 |
procedure freeModule; |
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6994
diff
changeset
|
579 |
var j: LongInt; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
580 |
begin |
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6994
diff
changeset
|
581 |
// close gamepad controllers |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6994
diff
changeset
|
582 |
if ControllerEnabled > 0 then |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6994
diff
changeset
|
583 |
for j:= 0 to pred(ControllerNumControllers) do |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6994
diff
changeset
|
584 |
SDL_JoystickClose(Controller[j]); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
585 |
end; |
4 | 586 |
|
587 |
end. |