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