author | unc0rr |
Tue, 05 Jun 2012 14:07:28 +0400 | |
changeset 7187 | aff30d80bd7b |
parent 7184 | 211ab9e2cb15 |
child 7191 | 9419294e5f33 |
permissions | -rw-r--r-- |
4 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
6700 | 3 |
* Copyright (c) 2004-2012 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 |
|
16 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 |
|
2905 | 28 |
function KeyNameToCode(name: shortstring): word; |
6917 | 29 |
procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean); |
6992 | 30 |
procedure ProcessKey(event: TSDL_KeyboardEvent); inline; |
31 |
procedure ProcessKey(code: LongInt; KeyDown: boolean); |
|
32 |
||
4 | 33 |
procedure ResetKbd; |
948 | 34 |
procedure FreezeEnterKey; |
4 | 35 |
procedure InitKbdKeyTable; |
36 |
||
167 | 37 |
procedure SetBinds(var binds: TBinds); |
38 |
procedure SetDefaultBinds; |
|
39 |
||
2428 | 40 |
procedure ControllerInit; |
41 |
procedure ControllerAxisEvent(joy, axis: Byte; value: Integer); |
|
42 |
procedure ControllerHatEvent(joy, hat, value: Byte); |
|
43 |
procedure ControllerButtonEvent(joy, button: Byte; pressed: Boolean); |
|
44 |
||
4 | 45 |
implementation |
4403 | 46 |
uses uConsole, uCommands, uMisc, uVariables, uConsts, uUtils, uDebug; |
167 | 47 |
|
7141
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
48 |
var tkbd: array[0..cKeyMaxIndex] of boolean; |
6942 | 49 |
quitKeyCode: Byte; |
4 | 50 |
KeyNames: array [0..cKeyMaxIndex] of string[15]; |
6982 | 51 |
CurrentBinds: TBinds; |
3697 | 52 |
|
2905 | 53 |
function KeyNameToCode(name: shortstring): word; |
2678
334016e8d895
injection of custom code in SDL for iPhone in order to implement our frontend
koda
parents:
2674
diff
changeset
|
54 |
var code: Word; |
334016e8d895
injection of custom code in SDL for iPhone in order to implement our frontend
koda
parents:
2674
diff
changeset
|
55 |
begin |
6917 | 56 |
name:= LowerCase(name); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
57 |
code:= cKeyMaxIndex; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
58 |
while (code > 0) and (KeyNames[code] <> name) do dec(code); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
59 |
KeyNameToCode:= code; |
2678
334016e8d895
injection of custom code in SDL for iPhone in order to implement our frontend
koda
parents:
2674
diff
changeset
|
60 |
end; |
334016e8d895
injection of custom code in SDL for iPhone in order to implement our frontend
koda
parents:
2674
diff
changeset
|
61 |
|
6917 | 62 |
procedure ProcessKey(code: LongInt; KeyDown: boolean); |
63 |
var |
|
64 |
Trusted: boolean; |
|
65 |
s : string; |
|
66 |
begin |
|
7140
29948153fda2
Don't allow for multiple key up(or down) events, it will ignore the excess events
Xeli
parents:
7118
diff
changeset
|
67 |
|
7141
ea6ad9a97fca
change the array which represents the keyboard state to be a boolean array rather than byte array
Xeli
parents:
7140
diff
changeset
|
68 |
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
|
69 |
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
|
70 |
|
29948153fda2
Don't allow for multiple key up(or down) events, it will ignore the excess events
Xeli
parents:
7118
diff
changeset
|
71 |
|
6917 | 72 |
hideAmmoMenu:= false; |
73 |
Trusted:= (CurrentTeam <> nil) |
|
74 |
and (not CurrentTeam^.ExtDriven) |
|
75 |
and (CurrentHedgehog^.BotLevel = 0); |
|
76 |
||
7140
29948153fda2
Don't allow for multiple key up(or down) events, it will ignore the excess events
Xeli
parents:
7118
diff
changeset
|
77 |
|
6917 | 78 |
|
6942 | 79 |
// ctrl/cmd + q to close engine and frontend |
80 |
if(KeyDown and (code = quitKeyCode)) then |
|
81 |
begin |
|
82 |
{$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
|
83 |
if tkbd[KeyNameToCode('left_meta')] or tkbd[KeyNameToCode('right_meta')] then |
6942 | 84 |
{$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
|
85 |
if tkbd[KeyNameToCode('left_ctrl')] or tkbd[KeyNameToCode('right_ctrl')] then |
6942 | 86 |
{$ENDIF} |
87 |
ParseCommand('halt', true); |
|
88 |
end; |
|
89 |
||
6917 | 90 |
if CurrentBinds[code][0] <> #0 then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
91 |
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
|
92 |
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')) then hideAmmoMenu:= true; |
7118 | 93 |
|
7140
29948153fda2
Don't allow for multiple key up(or down) events, it will ignore the excess events
Xeli
parents:
7118
diff
changeset
|
94 |
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
|
95 |
begin |
6917 | 96 |
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
|
97 |
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
|
98 |
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
|
99 |
end |
7140
29948153fda2
Don't allow for multiple key up(or down) events, it will ignore the excess events
Xeli
parents:
7118
diff
changeset
|
100 |
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
|
101 |
begin |
6917 | 102 |
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
|
103 |
s[1]:= '-'; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
104 |
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
|
105 |
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
|
106 |
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
|
107 |
end; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
108 |
end |
6917 | 109 |
end; |
110 |
||
6992 | 111 |
procedure ProcessKey(event: TSDL_KeyboardEvent); inline; |
6917 | 112 |
begin |
113 |
ProcessKey(event.keysym.sym, event.type_ = SDL_KEYDOWN); |
|
114 |
end; |
|
115 |
||
116 |
procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean); |
|
117 |
begin |
|
118 |
case event.button of |
|
119 |
SDL_BUTTON_LEFT: |
|
120 |
ProcessKey(KeyNameToCode('mousel'), ButtonDown); |
|
121 |
SDL_BUTTON_MIDDLE: |
|
122 |
ProcessKey(KeyNameToCode('mousem'), ButtonDown); |
|
123 |
SDL_BUTTON_RIGHT: |
|
124 |
ProcessKey(KeyNameToCode('mouser'), ButtonDown); |
|
125 |
SDL_BUTTON_WHEELDOWN: |
|
126 |
ProcessKey(KeyNameToCode('wheeldown'), ButtonDown); |
|
127 |
SDL_BUTTON_WHEELUP: |
|
128 |
ProcessKey(KeyNameToCode('wheelup'), ButtonDown); |
|
129 |
end; |
|
4 | 130 |
end; |
131 |
||
132 |
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
|
133 |
var t: LongInt; |
4 | 134 |
begin |
2436 | 135 |
for t:= 0 to cKeyMaxIndex 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
|
136 |
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
|
137 |
ProcessKey(t, False); |
4 | 138 |
end; |
139 |
||
140 |
procedure InitKbdKeyTable; |
|
2428 | 141 |
var i, j, k, t: LongInt; |
4 | 142 |
s: string[15]; |
143 |
begin |
|
6917 | 144 |
//TODO in sdl13 this overrides some values (A and B) change indices to some other values at the back perhaps? |
6909 | 145 |
KeyNames[1]:= 'mousel'; |
146 |
KeyNames[2]:= 'mousem'; |
|
147 |
KeyNames[3]:= 'mouser'; |
|
148 |
KeyNames[4]:= 'wheelup'; |
|
149 |
KeyNames[5]:= 'wheeldown'; |
|
150 |
||
151 |
for i:= 6 to cKeyMaxIndex do |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
152 |
begin |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3971
diff
changeset
|
153 |
s:= shortstring(sdl_getkeyname(i)); |
7106 | 154 |
//WriteLnToConsole(IntToStr(i) + ': ' + s + ' ' + IntToStr(cKeyMaxIndex)); |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3971
diff
changeset
|
155 |
if s = 'unknown key' then KeyNames[i]:= '' |
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3971
diff
changeset
|
156 |
else |
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3971
diff
changeset
|
157 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
158 |
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
|
159 |
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
|
160 |
s[t]:= '_'; |
6917 | 161 |
KeyNames[i]:= LowerCase(s) |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
162 |
end; |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3971
diff
changeset
|
163 |
end; |
2613 | 164 |
|
7071 | 165 |
quitKeyCode:= KeyNameToCode(_S'q'); |
167 | 166 |
|
6909 | 167 |
// get the size of keyboard array |
168 |
SDL_GetKeyState(@k); |
|
169 |
||
2428 | 170 |
// Controller(s) |
171 |
for j:= 0 to Pred(ControllerNumControllers) do |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
172 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
173 |
for i:= 0 to Pred(ControllerNumAxes[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
174 |
begin |
4374 | 175 |
keynames[k + 0]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'u'; |
176 |
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
|
177 |
inc(k, 2); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
178 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
179 |
for i:= 0 to Pred(ControllerNumHats[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
180 |
begin |
4374 | 181 |
keynames[k + 0]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'u'; |
182 |
keynames[k + 1]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'r'; |
|
183 |
keynames[k + 2]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'd'; |
|
184 |
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
|
185 |
inc(k, 4); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
186 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
187 |
for i:= 0 to Pred(ControllerNumButtons[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
188 |
begin |
4374 | 189 |
keynames[k]:= 'j' + IntToStr(j) + 'b' + IntToStr(i); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
190 |
inc(k, 1); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
191 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
192 |
end; |
2581 | 193 |
|
6917 | 194 |
DefaultBinds[KeyNameToCode('escape')]:= 'quit'; |
195 |
DefaultBinds[KeyNameToCode('grave')]:= 'history'; |
|
196 |
DefaultBinds[KeyNameToCode('delete')]:= 'rotmask'; |
|
2379 | 197 |
|
2606
ed687a8d081f
updated build files for macosx and optimization system
koda
parents:
2599
diff
changeset
|
198 |
//numpad |
ed687a8d081f
updated build files for macosx and optimization system
koda
parents:
2599
diff
changeset
|
199 |
//DefaultBinds[265]:= '+volup'; |
ed687a8d081f
updated build files for macosx and optimization system
koda
parents:
2599
diff
changeset
|
200 |
//DefaultBinds[256]:= '+voldown'; |
ed687a8d081f
updated build files for macosx and optimization system
koda
parents:
2599
diff
changeset
|
201 |
|
7071 | 202 |
DefaultBinds[KeyNameToCode(_S'0')]:= '+volup'; |
203 |
DefaultBinds[KeyNameToCode(_S'9')]:= '+voldown'; |
|
204 |
DefaultBinds[KeyNameToCode(_S'c')]:= 'capture'; |
|
205 |
DefaultBinds[KeyNameToCode(_S'h')]:= 'findhh'; |
|
206 |
DefaultBinds[KeyNameToCode(_S'p')]:= 'pause'; |
|
207 |
DefaultBinds[KeyNameToCode(_S's')]:= '+speedup'; |
|
208 |
DefaultBinds[KeyNameToCode(_S't')]:= 'chat'; |
|
209 |
DefaultBinds[KeyNameToCode(_S'y')]:= 'confirm'; |
|
1051
dfdd5dfe97d4
Enable fullscreen switching back, now it's bound on F12
unc0rr
parents:
1022
diff
changeset
|
210 |
|
6909 | 211 |
DefaultBinds[KeyNameToCode('mousem')]:= 'zoomreset'; |
7106 | 212 |
DefaultBinds[KeyNameToCode('wheelup')]:= 'zoomin'; |
213 |
DefaultBinds[KeyNameToCode('wheeldown')]:= 'zoomout'; |
|
2407
9f413bd5150e
- Fix mouse cursor bugs in net game (still has a bug near water)
unc0rr
parents:
2379
diff
changeset
|
214 |
|
6909 | 215 |
DefaultBinds[KeyNameToCode('f12')]:= 'fullscr'; |
1051
dfdd5dfe97d4
Enable fullscreen switching back, now it's bound on F12
unc0rr
parents:
1022
diff
changeset
|
216 |
|
2786 | 217 |
|
6917 | 218 |
DefaultBinds[KeyNameToCode('mousel')]:= '/put'; |
219 |
DefaultBinds[KeyNameToCode('mouser')]:= 'ammomenu'; |
|
220 |
DefaultBinds[KeyNameToCode('backspace')]:= 'hjump'; |
|
221 |
DefaultBinds[KeyNameToCode('tab')]:= 'switch'; |
|
222 |
DefaultBinds[KeyNameToCode('return')]:= 'ljump'; |
|
223 |
DefaultBinds[KeyNameToCode('space')]:= '+attack'; |
|
6909 | 224 |
DefaultBinds[KeyNameToCode('up')]:= '+up'; |
225 |
DefaultBinds[KeyNameToCode('down')]:= '+down'; |
|
226 |
DefaultBinds[KeyNameToCode('left')]:= '+left'; |
|
227 |
DefaultBinds[KeyNameToCode('right')]:= '+right'; |
|
228 |
DefaultBinds[KeyNameToCode('left_shift')]:= '+precise'; |
|
2754
ad4f81fbfb76
touchinput works, invisible buttons added and initial support for chat
koda
parents:
2716
diff
changeset
|
229 |
|
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
|
230 |
|
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
|
231 |
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
|
232 |
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
|
233 |
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
|
234 |
DefaultBinds[KeyNameToCode('j0a1d')]:= '+down'; |
6909 | 235 |
for i:= 1 to 10 do DefaultBinds[KeyNameToCode('f'+IntToStr(i))]:= 'slot '+IntToStr(i); |
236 |
for i:= 1 to 5 do DefaultBinds[KeyNameToCode(IntToStr(i))]:= 'timer '+IntToStr(i); |
|
4131
e89d11f6361c
add F1-F10 to the default binds to fix weapon selection in trainings/missions and such
nemo
parents:
4046
diff
changeset
|
237 |
|
2754
ad4f81fbfb76
touchinput works, invisible buttons added and initial support for chat
koda
parents:
2716
diff
changeset
|
238 |
SetDefaultBinds(); |
4 | 239 |
end; |
240 |
||
167 | 241 |
procedure SetBinds(var binds: TBinds); |
7184
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
242 |
{$IFNDEF MOBILE} |
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
243 |
var |
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
244 |
t: LongInt; |
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
245 |
{$ENDIF} |
167 | 246 |
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
|
247 |
{$IFDEF MOBILE} |
3971 | 248 |
binds:= binds; // avoid hint |
3663
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
249 |
CurrentBinds:= DefaultBinds; |
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
250 |
{$ELSE} |
7184
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
251 |
for t:= 0 to cKeyMaxIndex do |
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
252 |
if (CurrentBinds[t] <> binds[t]) and tkbd[t] then |
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
253 |
ProcessKey(t, False); |
211ab9e2cb15
only reset those keys which actually change their bindings
Xeli
parents:
7151
diff
changeset
|
254 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
255 |
CurrentBinds:= binds; |
3663
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
256 |
{$ENDIF} |
167 | 257 |
end; |
258 |
||
259 |
procedure SetDefaultBinds; |
|
260 |
begin |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
261 |
CurrentBinds:= DefaultBinds; |
167 | 262 |
end; |
263 |
||
948 | 264 |
procedure FreezeEnterKey; |
265 |
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
|
266 |
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
|
267 |
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
|
268 |
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
|
269 |
tkbd[271]:= True; |
948 | 270 |
end; |
167 | 271 |
|
2591
c6597b65caea
other controls implementation + sdlh revisited (once again)
koda
parents:
2590
diff
changeset
|
272 |
var Controller: array [0..5] of PSDL_Joystick; |
3697 | 273 |
|
2428 | 274 |
procedure ControllerInit; |
275 |
var i, j: Integer; |
|
276 |
begin |
|
3663
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
277 |
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
|
278 |
{$IFDEF IPHONE} |
3663
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
279 |
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
|
280 |
{$ENDIF} |
2674
2fce032f2f95
lupdate + Palewolf's updated spanish translation + other patches of mine
koda
parents:
2671
diff
changeset
|
281 |
|
3663
8c28abf427f5
reduce the number of keywords used and switch to BMP format for screenshots
koda
parents:
3651
diff
changeset
|
282 |
SDL_InitSubSystem(SDL_INIT_JOYSTICK); |
2674
2fce032f2f95
lupdate + Palewolf's updated spanish translation + other patches of mine
koda
parents:
2671
diff
changeset
|
283 |
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
|
284 |
|
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
285 |
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
|
286 |
ControllerNumControllers:= 6; |
2428 | 287 |
|
4374 | 288 |
WriteLnToConsole('Number of game controllers: ' + IntToStr(ControllerNumControllers)); |
2428 | 289 |
|
290 |
if ControllerNumControllers > 0 then |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
291 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
292 |
for j:= 0 to pred(ControllerNumControllers) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
293 |
begin |
7151 | 294 |
WriteLnToConsole('Using game controller: ' + shortstring(SDL_JoystickName(j))); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
295 |
Controller[j]:= SDL_JoystickOpen(j); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
296 |
if Controller[j] = nil then |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
297 |
WriteLnToConsole('* Failed to open game controller!') |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
298 |
else |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
299 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
300 |
ControllerNumAxes[j]:= SDL_JoystickNumAxes(Controller[j]); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
301 |
//ControllerNumBalls[j]:= SDL_JoystickNumBalls(Controller[j]); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
302 |
ControllerNumHats[j]:= SDL_JoystickNumHats(Controller[j]); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
303 |
ControllerNumButtons[j]:= SDL_JoystickNumButtons(Controller[j]); |
4374 | 304 |
WriteLnToConsole('* Number of axes: ' + IntToStr(ControllerNumAxes[j])); |
305 |
//WriteLnToConsole('* Number of balls: ' + IntToStr(ControllerNumBalls[j])); |
|
306 |
WriteLnToConsole('* Number of hats: ' + IntToStr(ControllerNumHats[j])); |
|
307 |
WriteLnToConsole('* Number of buttons: ' + IntToStr(ControllerNumButtons[j])); |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
308 |
ControllerEnabled:= 1; |
3697 | 309 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
310 |
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
|
311 |
ControllerNumAxes[j]:= 20; |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
312 |
//if ControllerNumBalls[j] > 20 then ControllerNumBalls[j]:= 20; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
313 |
|
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
314 |
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
|
315 |
ControllerNumHats[j]:= 20; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
316 |
|
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6497
diff
changeset
|
317 |
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
|
318 |
ControllerNumButtons[j]:= 20; |
3697 | 319 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
320 |
// reset all buttons/axes |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
321 |
for i:= 0 to pred(ControllerNumAxes[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
322 |
ControllerAxes[j][i]:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
323 |
(*for i:= 0 to pred(ControllerNumBalls[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
324 |
begin |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
325 |
ControllerBalls[j][i][0]:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
326 |
ControllerBalls[j][i][1]:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
327 |
end;*) |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
328 |
for i:= 0 to pred(ControllerNumHats[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
329 |
ControllerHats[j][i]:= SDL_HAT_CENTERED; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
330 |
for i:= 0 to pred(ControllerNumButtons[j]) do |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
331 |
ControllerButtons[j][i]:= 0; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
332 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
333 |
end; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
334 |
// enable event generation/controller updating |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
335 |
SDL_JoystickEventState(1); |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
336 |
end |
3697 | 337 |
else |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
338 |
WriteLnToConsole('Not using any game controller'); |
2428 | 339 |
end; |
340 |
||
341 |
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
|
342 |
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
|
343 |
k: LongInt; |
2428 | 344 |
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
|
345 |
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
|
346 |
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
|
347 |
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
|
348 |
ProcessKey(k + (axis*2)+1, value < -20000); |
2428 | 349 |
end; |
350 |
||
351 |
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
|
352 |
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
|
353 |
k: LongInt; |
2428 | 354 |
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
|
355 |
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
|
356 |
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
|
357 |
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
|
358 |
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
|
359 |
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
|
360 |
ProcessKey(k + ControllerNumAxes[joy]*2 + hat*4 + 3, (value and SDL_HAT_LEFT) <> 0); |
2428 | 361 |
end; |
362 |
||
363 |
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
|
364 |
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
|
365 |
k: LongInt; |
2428 | 366 |
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
|
367 |
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
|
368 |
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
|
369 |
ProcessKey(k + ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + button, pressed); |
2428 | 370 |
end; |
371 |
||
3038 | 372 |
procedure initModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
373 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
374 |
wheelUp:= false; |
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2905
diff
changeset
|
375 |
wheelDown:= false; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
376 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
377 |
|
3038 | 378 |
procedure freeModule; |
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6994
diff
changeset
|
379 |
var j: LongInt; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
380 |
begin |
7026
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6994
diff
changeset
|
381 |
// close gamepad controllers |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6994
diff
changeset
|
382 |
if ControllerEnabled > 0 then |
8d1724e1337e
split OnDestroy across the appropriate modules (this doen't cause leaks on mobile, right?)
koda
parents:
6994
diff
changeset
|
383 |
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
|
384 |
SDL_JoystickClose(Controller[j]); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2714
diff
changeset
|
385 |
end; |
4 | 386 |
|
387 |
end. |