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