1 #include "stdafx.h"
2 #include "vba.h"
3 #include "Joypad.h"
4 #include "Input.h"
5
6
7 #ifdef _DEBUG
8 #define new DEBUG_NEW
9 #undef THIS_FILE
10 static char THIS_FILE[] = __FILE__;
11 #endif
12
13 BOOL bAppendMode;
14
AssignKey(KeyList & Key,LONG_PTR Out)15 void AssignKey(KeyList &Key, LONG_PTR Out)
16 {
17 if( !bAppendMode ) {
18 Key.RemoveAll();
19 } else {
20 POSITION pos = Key.GetHeadPosition();
21 if( pos != NULL ) {
22 // the list is not empty
23 while( true ) {
24 // we don't want to assign the same key twice
25 if( Key.GetAt( pos ) == Out ) return;
26 if( pos == Key.GetTailPosition() ) break;
27 Key.GetNext( pos );
28 }
29 }
30 }
31 Key.AddTail(Out);
32 }
33
34
GetKeyListName(KeyList & Keys)35 CString GetKeyListName(KeyList& Keys)
36 {
37 CString txtKeys;
38
39 POSITION p = Keys.GetHeadPosition();
40 while(p!=NULL)
41 {
42 txtKeys+=theApp.input->getKeyName(Keys.GetNext(p));
43 if (p!=NULL)
44 txtKeys+=_T(", ");
45 }
46 return txtKeys;
47 }
48
CopyKeys(KeyList & Out,KeyList & In)49 void CopyKeys(KeyList &Out, KeyList &In)
50 {
51 Out.RemoveAll();
52 POSITION p = In.GetHeadPosition();
53 while(p!=NULL)
54 Out.AddTail(In.GetNext(p));
55 }
56
57 #define AssignKeys(in, out) CopyKeys(out, in);
58
59 /////////////////////////////////////////////////////////////////////////////
60 // JoypadEditControl
61
JoypadEditControl()62 JoypadEditControl::JoypadEditControl()
63 {
64 }
65
~JoypadEditControl()66 JoypadEditControl::~JoypadEditControl()
67 {
68 }
69
70
BEGIN_MESSAGE_MAP(JoypadEditControl,CEdit)71 BEGIN_MESSAGE_MAP(JoypadEditControl, CEdit)
72 ON_MESSAGE(JOYCONFIG_MESSAGE, OnJoyConfig)
73 END_MESSAGE_MAP()
74
75 /////////////////////////////////////////////////////////////////////////////
76 // JoypadEditControl message handlers
77
78
79 LRESULT JoypadEditControl::OnJoyConfig(WPARAM wParam, LPARAM lParam)
80 {
81 AssignKey(m_Keys, ((wParam<<8)|lParam));
82 SetWindowText(GetKeyListName(m_Keys));
83 GetParent()->GetNextDlgTabItem(this, FALSE)->SetFocus();
84 return TRUE;
85 }
86
87
PreTranslateMessage(MSG * pMsg)88 BOOL JoypadEditControl::PreTranslateMessage(MSG *pMsg)
89 {
90 if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN))
91 return TRUE;
92
93 return CEdit::PreTranslateMessage(pMsg);
94 }
95
96 /////////////////////////////////////////////////////////////////////////////
97 // JoypadConfig dialog
98
99
JoypadConfig(int w,CWnd * pParent)100 JoypadConfig::JoypadConfig(int w, CWnd* pParent /*=NULL*/)
101 : CDialog(JoypadConfig::IDD, pParent)
102 {
103 //{{AFX_DATA_INIT(JoypadConfig)
104 //}}AFX_DATA_INIT
105 timerId = 0;
106 which = w;
107 if(which < 0 || which > 3)
108 which = 0;
109 }
110
DoDataExchange(CDataExchange * pDX)111 void JoypadConfig::DoDataExchange(CDataExchange* pDX)
112 {
113 CDialog::DoDataExchange(pDX);
114 //{{AFX_DATA_MAP(JoypadConfig)
115 DDX_Control(pDX, IDC_EDIT_UP, up);
116 DDX_Control(pDX, IDC_EDIT_SPEED, speed);
117 DDX_Control(pDX, IDC_EDIT_RIGHT, right);
118 DDX_Control(pDX, IDC_EDIT_LEFT, left);
119 DDX_Control(pDX, IDC_EDIT_DOWN, down);
120 DDX_Control(pDX, IDC_EDIT_CAPTURE, capture);
121 DDX_Control(pDX, IDC_EDIT_BUTTON_START, buttonStart);
122 DDX_Control(pDX, IDC_EDIT_BUTTON_SELECT, buttonSelect);
123 DDX_Control(pDX, IDC_EDIT_BUTTON_R, buttonR);
124 DDX_Control(pDX, IDC_EDIT_BUTTON_L, buttonL);
125 DDX_Control(pDX, IDC_EDIT_BUTTON_GS, buttonGS);
126 DDX_Control(pDX, IDC_EDIT_BUTTON_B, buttonB);
127 DDX_Control(pDX, IDC_EDIT_BUTTON_A, buttonA);
128 //}}AFX_DATA_MAP
129 }
130
131
BEGIN_MESSAGE_MAP(JoypadConfig,CDialog)132 BEGIN_MESSAGE_MAP(JoypadConfig, CDialog)
133 ON_BN_CLICKED(ID_CANCEL, OnCancel)
134 ON_BN_CLICKED(ID_OK, OnOk)
135 ON_WM_CHAR()
136 ON_WM_DESTROY()
137 ON_WM_TIMER()
138 ON_WM_KEYDOWN()
139 ON_BN_CLICKED(IDC_APPENDMODE, &JoypadConfig::OnBnClickedAppendmode)
140 ON_BN_CLICKED(IDC_CLEAR_ALL, &JoypadConfig::OnBnClickedClearAll)
141 END_MESSAGE_MAP()
142
143 /////////////////////////////////////////////////////////////////////////////
144 // JoypadConfig message handlers
145
146 void JoypadConfig::OnCancel()
147 {
148 EndDialog(FALSE);
149 }
150
OnOk()151 void JoypadConfig::OnOk()
152 {
153 AssignKeys(up.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_UP)]);
154 AssignKeys(speed.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_SPEED)]);
155 AssignKeys(right.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_RIGHT)]);
156 AssignKeys(left.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_LEFT)]);
157 AssignKeys(down.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_DOWN)]);
158 AssignKeys(capture.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_CAPTURE)]);
159 AssignKeys(buttonStart.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_START)]);
160 AssignKeys(buttonSelect.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_SELECT)]);
161 AssignKeys(buttonR.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_R)]);
162 AssignKeys(buttonL.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_L)]);
163 AssignKeys(buttonGS.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_GS)]);
164 AssignKeys(buttonB.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_B)]);
165 AssignKeys(buttonA.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_A)]);
166
167 theApp.input->checkKeys();
168 EndDialog(TRUE);
169 }
170
OnChar(UINT nChar,UINT nRepCnt,UINT nFlags)171 void JoypadConfig::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
172 {
173 }
174
OnDestroy()175 void JoypadConfig::OnDestroy()
176 {
177 CDialog::OnDestroy();
178
179 KillTimer(timerId);
180 }
181
OnTimer(UINT_PTR nIDEvent)182 void JoypadConfig::OnTimer(UINT_PTR nIDEvent)
183 {
184 theApp.input->checkDevices();
185
186 CDialog::OnTimer(nIDEvent);
187 }
188
OnInitDialog()189 BOOL JoypadConfig::OnInitDialog()
190 {
191 CDialog::OnInitDialog();
192
193 bAppendMode = FALSE;
194
195 timerId = SetTimer(0,50,NULL);
196
197 CopyKeys(up.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_UP)]);
198 CopyKeys(speed.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_SPEED)]);
199 CopyKeys(right.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_RIGHT)]);
200 CopyKeys(left.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_LEFT)]);
201 CopyKeys(down.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_DOWN)]);
202 CopyKeys(capture.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_CAPTURE)]);
203 CopyKeys(buttonStart.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_START)]);
204 CopyKeys(buttonSelect.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_SELECT)]);
205 CopyKeys(buttonR.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_R)]);
206 CopyKeys(buttonL.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_L)]);
207 CopyKeys(buttonGS.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_GS)]);
208 CopyKeys(buttonB.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_B)]);
209 CopyKeys(buttonA.m_Keys,theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_A)]);
210
211 up.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_UP)]));
212 down.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_DOWN)]));
213 left.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_LEFT)]));
214 right.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_RIGHT)]));
215 buttonA.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_A)]));
216 buttonB.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_B)]));
217 buttonL.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_L)]));
218 buttonR.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_R)]));
219 buttonSelect.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_SELECT)]));
220 buttonStart.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_START)]));
221 speed.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_SPEED)]));
222 capture.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_CAPTURE)]));
223 buttonGS.SetWindowText(GetKeyListName(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_GS)]));
224
225 CenterWindow();
226
227 return TRUE; // return TRUE unless you set the focus to a control
228 // EXCEPTION: OCX Property Pages should return FALSE
229 }
230
assignKey(int id,LONG_PTR key)231 void JoypadConfig::assignKey(int id, LONG_PTR key)
232 {
233 switch(id) {
234 case IDC_EDIT_LEFT:
235 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_LEFT)],key);
236 break;
237 case IDC_EDIT_RIGHT:
238 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_RIGHT)],key);
239 break;
240 case IDC_EDIT_UP:
241 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_UP)],key);
242 break;
243 case IDC_EDIT_SPEED:
244 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_SPEED)],key);
245 break;
246 case IDC_EDIT_CAPTURE:
247 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_CAPTURE)],key);
248 break;
249 case IDC_EDIT_DOWN:
250 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_DOWN)],key);
251 break;
252 case IDC_EDIT_BUTTON_A:
253 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_A)],key);
254 break;
255 case IDC_EDIT_BUTTON_B:
256 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_B)],key);
257 break;
258 case IDC_EDIT_BUTTON_L:
259 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_L)],key);
260 break;
261 case IDC_EDIT_BUTTON_R:
262 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_R)],key);
263 break;
264 case IDC_EDIT_BUTTON_START:
265 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_START)],key);
266 break;
267 case IDC_EDIT_BUTTON_SELECT:
268 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_SELECT)],key);
269 break;
270 case IDC_EDIT_BUTTON_GS:
271 AssignKey(theApp.input->joypaddata[JOYPAD(which,KEY_BUTTON_GS)],key);
272 break;
273 }
274 }
275
276
277 /////////////////////////////////////////////////////////////////////////////
278 // MotionConfig dialog
279
280
MotionConfig(CWnd * pParent)281 MotionConfig::MotionConfig(CWnd* pParent /*=NULL*/)
282 : CDialog(MotionConfig::IDD, pParent)
283 {
284 //{{AFX_DATA_INIT(MotionConfig)
285 // NOTE: the ClassWizard will add member initialization here
286 //}}AFX_DATA_INIT
287 timerId = 0;
288 bAppendMode = 0;
289 }
290
291
DoDataExchange(CDataExchange * pDX)292 void MotionConfig::DoDataExchange(CDataExchange* pDX)
293 {
294 CDialog::DoDataExchange(pDX);
295 //{{AFX_DATA_MAP(MotionConfig)
296 DDX_Control(pDX, IDC_EDIT_UP, up);
297 DDX_Control(pDX, IDC_EDIT_RIGHT, right);
298 DDX_Control(pDX, IDC_EDIT_LEFT, left);
299 DDX_Control(pDX, IDC_EDIT_DOWN, down);
300 //}}AFX_DATA_MAP
301 }
302
303
BEGIN_MESSAGE_MAP(MotionConfig,CDialog)304 BEGIN_MESSAGE_MAP(MotionConfig, CDialog)
305 ON_BN_CLICKED(ID_CANCEL, OnCancel)
306 ON_BN_CLICKED(ID_OK, OnOk)
307 ON_WM_DESTROY()
308 ON_WM_KEYDOWN()
309 ON_WM_TIMER()
310 ON_BN_CLICKED(IDC_APPENDMODE, &MotionConfig::OnBnClickedAppendmode)
311 END_MESSAGE_MAP()
312
313 /////////////////////////////////////////////////////////////////////////////
314 // MotionConfig message handlers
315
316 void MotionConfig::OnCancel()
317 {
318 EndDialog(FALSE);
319 }
320
OnOk()321 void MotionConfig::OnOk()
322 {
323 assignKeys();
324 theApp.input->checkKeys();
325 EndDialog( TRUE);
326 }
327
OnDestroy()328 void MotionConfig::OnDestroy()
329 {
330 CDialog::OnDestroy();
331
332 KillTimer(timerId);
333 }
334
OnInitDialog()335 BOOL MotionConfig::OnInitDialog()
336 {
337 CDialog::OnInitDialog();
338
339 timerId = SetTimer(0,50,NULL);
340
341 CopyKeys(up.m_Keys, theApp.input->joypaddata[MOTION(KEY_UP)]);
342 up.SetWindowText(GetKeyListName(theApp.input->joypaddata[MOTION(KEY_UP)]));
343
344 CopyKeys(down.m_Keys, theApp.input->joypaddata[MOTION(KEY_DOWN)]);
345 down.SetWindowText(GetKeyListName(theApp.input->joypaddata[MOTION(KEY_DOWN)]));
346
347 CopyKeys(left.m_Keys, theApp.input->joypaddata[MOTION(KEY_LEFT)]);
348 left.SetWindowText(GetKeyListName(theApp.input->joypaddata[MOTION(KEY_LEFT)]));
349
350 CopyKeys(right.m_Keys, theApp.input->joypaddata[MOTION(KEY_RIGHT)]);
351 right.SetWindowText(GetKeyListName(theApp.input->joypaddata[MOTION(KEY_RIGHT)]));
352
353 CenterWindow();
354
355 return TRUE; // return TRUE unless you set the focus to a control
356 // EXCEPTION: OCX Property Pages should return FALSE
357 }
358
OnTimer(UINT_PTR nIDEvent)359 void MotionConfig::OnTimer(UINT_PTR nIDEvent)
360 {
361 theApp.input->checkDevices();
362
363 CDialog::OnTimer(nIDEvent);
364 }
365
assignKey(int id,int key)366 void MotionConfig::assignKey(int id, int key)
367 {
368 switch(id) {
369 case IDC_EDIT_LEFT:
370 AssignKey(theApp.input->joypaddata[MOTION(KEY_LEFT)],key);
371 break;
372 case IDC_EDIT_RIGHT:
373 AssignKey(theApp.input->joypaddata[MOTION(KEY_RIGHT)],key);
374 break;
375 case IDC_EDIT_UP:
376 AssignKey(theApp.input->joypaddata[MOTION(KEY_UP)],key);
377 break;
378 case IDC_EDIT_DOWN:
379 AssignKey(theApp.input->joypaddata[MOTION(KEY_DOWN)],key);
380 break;
381 }
382 }
383
assignKeys()384 void MotionConfig::assignKeys()
385 {
386 AssignKeys(up.m_Keys,theApp.input->joypaddata[MOTION(KEY_UP)]);
387 AssignKeys(down.m_Keys, theApp.input->joypaddata[MOTION(KEY_DOWN)]);
388 AssignKeys(left.m_Keys, theApp.input->joypaddata[MOTION(KEY_LEFT)]);
389 AssignKeys(right.m_Keys, theApp.input->joypaddata[MOTION(KEY_RIGHT)]);
390 }
391
OnBnClickedAppendmode()392 void JoypadConfig::OnBnClickedAppendmode()
393 {
394 bAppendMode = (::SendMessage(GetDlgItem(IDC_APPENDMODE)->GetSafeHwnd(), BM_GETCHECK, 0, 0L) != 0);
395 }
396
OnBnClickedAppendmode()397 void MotionConfig::OnBnClickedAppendmode()
398 {
399 bAppendMode = (::SendMessage(GetDlgItem(IDC_APPENDMODE)->GetSafeHwnd(), BM_GETCHECK, 0, 0L) != 0);
400 }
401
OnBnClickedClearAll()402 void JoypadConfig::OnBnClickedClearAll()
403 {
404 up.m_Keys.RemoveAll();
405 speed.m_Keys.RemoveAll();
406 right.m_Keys.RemoveAll();
407 left.m_Keys.RemoveAll();
408 down.m_Keys.RemoveAll();
409 capture.m_Keys.RemoveAll();
410 buttonStart.m_Keys.RemoveAll();
411 buttonSelect.m_Keys.RemoveAll();
412 buttonR.m_Keys.RemoveAll();
413 buttonL.m_Keys.RemoveAll();
414 buttonGS.m_Keys.RemoveAll();
415 buttonB.m_Keys.RemoveAll();
416 buttonA.m_Keys.RemoveAll();
417
418 up.SetWindowText( _T("") );
419 speed.SetWindowText( _T("") );
420 right.SetWindowText( _T("") );
421 left.SetWindowText( _T("") );
422 down.SetWindowText( _T("") );
423 capture.SetWindowText( _T("") );
424 buttonStart.SetWindowText( _T("") );
425 buttonSelect.SetWindowText( _T("") );
426 buttonR.SetWindowText( _T("") );
427 buttonL.SetWindowText( _T("") );
428 buttonGS.SetWindowText( _T("") );
429 buttonB.SetWindowText( _T("") );
430 buttonA.SetWindowText( _T("") );
431 }
432