1 #include "GameControls.h"
2 #include "preferences.h"
3
4 #define NB_CONTROLS 10
5 static InputSwitch *keyControls[NB_CONTROLS] =
6 {
7 new KeyInputSwitch(SDLK_s,true),
8 new KeyInputSwitch(SDLK_f,true),
9 new KeyInputSwitch(SDLK_d,true),
10 new KeyInputSwitch(SDLK_UNKNOWN,true),
11 new KeyInputSwitch(SDLK_e,true),
12 new KeyInputSwitch(SDLK_LEFT,true),
13 new KeyInputSwitch(SDLK_RIGHT,true),
14 new KeyInputSwitch(SDLK_DOWN,true),
15 new KeyInputSwitch(SDLK_UNKNOWN,true),
16 new KeyInputSwitch(SDLK_UP,true)
17 };
18
getKeyName(int gameEvent,char * keyName)19 void getKeyName(int gameEvent, char *keyName)
20 {
21 strcpy(keyName," ");
22 if (keyControls[gameEvent])
23 strcpy(keyName,keyControls[gameEvent]->name());
24 }
25
getControlEvent(SDL_Event e,InputSwitch * input,GameControlEvent * result)26 void getControlEvent(SDL_Event e, InputSwitch *input, GameControlEvent *result)
27 {
28 result->gameEvent = GameControlEvent::kGameNone;
29 result->cursorEvent = GameControlEvent::kCursorNone;
30 result->isUp = true;
31
32 if (e.type == SDL_QUIT)
33 result->cursorEvent = GameControlEvent::kQuit;
34
35 if (input == NULL)
36 return;
37
38 if (input->isValidate() && input->isDown())
39 result->cursorEvent = GameControlEvent::kStart;
40
41 if (input->isCancel() && input->isDown())
42 result->cursorEvent = GameControlEvent::kBack;
43
44 if (input->isArrowDown() && input->isDown())
45 result->cursorEvent = GameControlEvent::kDown;
46
47 if (input->isArrowUp() && input->isDown())
48 result->cursorEvent = GameControlEvent::kUp;
49
50 if (input->isPause() && input->isDown())
51 result->gameEvent = GameControlEvent::kPauseGame;
52
53 result->isUp = input->isUp();
54
55 if (*input == *keyControls[kPlayer1LeftControl])
56 result->gameEvent = GameControlEvent::kPlayer1Left;
57 if (*input == *keyControls[kPlayer1RightControl])
58 result->gameEvent = GameControlEvent::kPlayer1Right;
59 if (*input == *keyControls[kPlayer1ClockwiseControl])
60 result->gameEvent = GameControlEvent::kPlayer1TurnRight;
61 if (*input == *keyControls[kPlayer1CounterclockwiseControl])
62 result->gameEvent = GameControlEvent::kPlayer1TurnLeft;
63 if (*input == *keyControls[kPlayer1DownControl])
64 result->gameEvent = GameControlEvent::kPlayer1Down;
65
66 if (*input == *keyControls[kPlayer2LeftControl])
67 result->gameEvent = GameControlEvent::kPlayer2Left;
68 if (*input == *keyControls[kPlayer2RightControl])
69 result->gameEvent = GameControlEvent::kPlayer2Right;
70 if (*input == *keyControls[kPlayer2ClockwiseControl])
71 result->gameEvent = GameControlEvent::kPlayer2TurnRight;
72 if (*input == *keyControls[kPlayer2CounterclockwiseControl])
73 result->gameEvent = GameControlEvent::kPlayer2TurnLeft;
74 if (*input == *keyControls[kPlayer2DownControl])
75 result->gameEvent = GameControlEvent::kPlayer2Down;
76 }
77
getControlEvent(SDL_Event e,GameControlEvent * result)78 void getControlEvent(SDL_Event e, GameControlEvent *result)
79 {
80 InputSwitch *input = switchForEvent(&e);
81 getControlEvent(e, input, result);
82
83 if (input)
84 delete input;
85 }
86
initGameControls()87 void initGameControls()
88 {
89 initControllers();
90 loadControls();
91 }
92
tryChangeControl(int control,SDL_Event e,GameControlEvent * result)93 bool tryChangeControl(int control, SDL_Event e, GameControlEvent *result)
94 {
95 InputSwitch *input = switchForEvent(&e);
96 if (input == NULL)
97 return false;
98
99 getControlEvent(e,input,result);
100
101 /*
102 if (result->cursorEvent == GameControlEvent::kBack)
103 goto ret_false;
104
105 if (result->cursorEvent == GameControlEvent::kStart)
106 goto ret_false;
107 */
108
109 if (result->cursorEvent == GameControlEvent::kQuit)
110 goto ret_false;
111
112 if (input->isUp())
113 goto ret_false;
114
115 if (keyControls[control] != NULL)
116 delete keyControls[control];
117
118 keyControls[control] = input;
119 return true;
120
121 ret_false:
122 delete input;
123 return false;
124 }
125
saveControls()126 void saveControls()
127 {
128 SetIntPreference("v50_P1Left", keyControls[kPlayer1LeftControl]->id());
129 SetIntPreference("v50_P1Right", keyControls[kPlayer1RightControl]->id());
130 SetIntPreference("v50_P1Down", keyControls[kPlayer1DownControl]->id());
131 SetIntPreference("v50_P1Clockwise", keyControls[kPlayer1ClockwiseControl]->id());
132 SetIntPreference("v50_P1Counterclockwise", keyControls[kPlayer1CounterclockwiseControl]->id());
133
134 SetStrPreference("v50_P1LeftS", keyControls[kPlayer1LeftControl]->name());
135 SetStrPreference("v50_P1RightS", keyControls[kPlayer1RightControl]->name());
136 SetStrPreference("v50_P1DownS", keyControls[kPlayer1DownControl]->name());
137 SetStrPreference("v50_P1ClockwiseS", keyControls[kPlayer1ClockwiseControl]->name());
138 SetStrPreference("v50_P1CounterclockwiseS", keyControls[kPlayer1CounterclockwiseControl]->name());
139
140 SetIntPreference("v50_P2Left", keyControls[kPlayer2LeftControl]->id());
141 SetIntPreference("v50_P2Right", keyControls[kPlayer2RightControl]->id());
142 SetIntPreference("v50_P2Down", keyControls[kPlayer2DownControl]->id());
143 SetIntPreference("v50_P2Clockwise", keyControls[kPlayer2ClockwiseControl]->id());
144 SetIntPreference("v50_P2Counterclockwise", keyControls[kPlayer2CounterclockwiseControl]->id());
145
146 SetStrPreference("v50_P2LeftS", keyControls[kPlayer2LeftControl]->name());
147 SetStrPreference("v50_P2RightS", keyControls[kPlayer2RightControl]->name());
148 SetStrPreference("v50_P2DownS", keyControls[kPlayer2DownControl]->name());
149 SetStrPreference("v50_P2ClockwiseS", keyControls[kPlayer2ClockwiseControl]->name());
150 SetStrPreference("v50_P2CounterclockwiseS", keyControls[kPlayer2CounterclockwiseControl]->name());
151 }
152
loadControls()153 void loadControls()
154 {
155 char name[256];
156 int id;
157
158 GetStrPreference("v50_P1LeftS", name, keyControls[kPlayer1LeftControl]->name());
159 id = GetIntPreference("v50_P1Left", keyControls[kPlayer1LeftControl]->id());
160 keyControls[kPlayer1LeftControl] = new InputFromIDAndName(id, name);
161
162 GetStrPreference("v50_P1RightS", name, keyControls[kPlayer1RightControl]->name());
163 id = GetIntPreference("v50_P1Right", keyControls[kPlayer1RightControl]->id());
164 keyControls[kPlayer1RightControl] = new InputFromIDAndName(id, name);
165
166 GetStrPreference("v50_P1DownS", name, keyControls[kPlayer1DownControl]->name());
167 id = GetIntPreference("v50_P1Down", keyControls[kPlayer1DownControl]->id());
168 keyControls[kPlayer1DownControl] = new InputFromIDAndName(id, name);
169
170 GetStrPreference("v50_P1ClockwiseS", name, keyControls[kPlayer1ClockwiseControl]->name());
171 id = GetIntPreference("v50_P1Clockwise", keyControls[kPlayer1ClockwiseControl]->id());
172 keyControls[kPlayer1ClockwiseControl] = new InputFromIDAndName(id, name);
173
174 GetStrPreference("v50_P1CounterclockwiseS", name, keyControls[kPlayer1CounterclockwiseControl]->name());
175 id = GetIntPreference("v50_P1Counterclockwise", keyControls[kPlayer1CounterclockwiseControl]->id());
176 keyControls[kPlayer1CounterclockwiseControl] = new InputFromIDAndName(id, name);
177
178 GetStrPreference("v50_P2LeftS", name, keyControls[kPlayer2LeftControl]->name());
179 id = GetIntPreference("v50_P2Left", keyControls[kPlayer2LeftControl]->id());
180 keyControls[kPlayer2LeftControl] = new InputFromIDAndName(id, name);
181
182 GetStrPreference("v50_P2RightS", name, keyControls[kPlayer2RightControl]->name());
183 id = GetIntPreference("v50_P2Right", keyControls[kPlayer2RightControl]->id());
184 keyControls[kPlayer2RightControl] = new InputFromIDAndName(id, name);
185
186 GetStrPreference("v50_P2DownS", name, keyControls[kPlayer2DownControl]->name());
187 id = GetIntPreference("v50_P2Down", keyControls[kPlayer2DownControl]->id());
188 keyControls[kPlayer2DownControl] = new InputFromIDAndName(id, name);
189
190 GetStrPreference("v50_P2ClockwiseS", name, keyControls[kPlayer2ClockwiseControl]->name());
191 id = GetIntPreference("v50_P2Clockwise", keyControls[kPlayer2ClockwiseControl]->id());
192 keyControls[kPlayer2ClockwiseControl] = new InputFromIDAndName(id, name);
193
194 GetStrPreference("v50_P2CounterclockwiseS", name, keyControls[kPlayer2CounterclockwiseControl]->name());
195 id = GetIntPreference("v50_P2Counterclockwise", keyControls[kPlayer2CounterclockwiseControl]->id());
196 keyControls[kPlayer2CounterclockwiseControl] = new InputFromIDAndName(id, name);
197 }
198