c62d2810 |
1 | /* FCE Ultra - NES/Famicom Emulator\r |
2 | *\r |
3 | * Copyright notice for this file:\r |
4 | * Copyright (C) 2002 Ben Parnell\r |
5 | *\r |
6 | * This program is free software; you can redistribute it and/or modify\r |
7 | * it under the terms of the GNU General Public License as published by\r |
8 | * the Free Software Foundation; either version 2 of the License, or\r |
9 | * (at your option) any later version.\r |
10 | *\r |
11 | * This program is distributed in the hope that it will be useful,\r |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of\r |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r |
14 | * GNU General Public License for more details.\r |
15 | *\r |
16 | * You should have received a copy of the GNU General Public License\r |
17 | * along with this program; if not, write to the Free Software\r |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r |
19 | */\r |
20 | \r |
21 | #include "common.h"\r |
22 | #include <dinput.h>\r |
23 | \r |
24 | #include "input.h"\r |
25 | #include "keyboard.h"\r |
26 | #include "joystick.h"\r |
27 | \r |
28 | \r |
29 | int UsrInputType[2]={SI_GAMEPAD,SI_GAMEPAD};\r |
30 | int UsrInputTypeFC=SIFC_NONE;\r |
31 | int InputType[2];\r |
32 | int InputTypeFC;\r |
33 | \r |
34 | int NoFourScore=0;\r |
35 | \r |
36 | static uint32 powerpadbuf[2];\r |
37 | \r |
38 | LPDIRECTINPUT7 lpDI;\r |
39 | \r |
40 | void FixGIGO(void)\r |
41 | {\r |
42 | InputType[0]=UsrInputType[0];\r |
43 | InputType[1]=UsrInputType[1];\r |
44 | InputTypeFC=UsrInputTypeFC;\r |
45 | \r |
46 | if(GI)\r |
47 | {\r |
48 | if(GI->input[0]>=0)\r |
49 | InputType[0]=GI->input[0];\r |
50 | if(GI->input[1]>=0)\r |
51 | InputType[1]=GI->input[1];\r |
52 | if(GI->inputfc>=0)\r |
53 | InputTypeFC=GI->inputfc;\r |
54 | CreateInputStuff();\r |
55 | }\r |
56 | }\r |
57 | \r |
58 | static uint32 JSreturn;\r |
59 | static uint32 mousedata[3];\r |
60 | \r |
61 | \r |
62 | static void ConfigGamePad(HWND hParent, int port);\r |
63 | \r |
64 | int InitDInput(void)\r |
65 | {\r |
66 | HRESULT ddrval;\r |
67 | \r |
68 | ddrval=DirectInputCreateEx(fceu_hInstance,DIRECTINPUT_VERSION,&IID_IDirectInput7,(LPVOID *)&lpDI,0);\r |
69 | if(ddrval!=DI_OK)\r |
70 | {\r |
71 | FCEUD_PrintError("DirectInput: Error creating DirectInput object.");\r |
72 | return 0;\r |
73 | }\r |
74 | return 1;\r |
75 | }\r |
76 | \r |
77 | static int screenmode=0;\r |
78 | void InputScreenChanged(int fs)\r |
79 | {\r |
80 | int x;\r |
81 | for(x=0;x<2;x++)\r |
82 | if(InputType[x]==SI_ZAPPER)\r |
83 | FCEUI_SetInput(x,SI_ZAPPER,mousedata,fs);\r |
84 | if(InputTypeFC==SIFC_SHADOW)\r |
85 | FCEUI_SetInputFC(SIFC_SHADOW,mousedata,fs);\r |
86 | screenmode=fs;\r |
87 | }\r |
88 | \r |
89 | void InitInputStuff(void)\r |
90 | {\r |
91 | KeyboardInitialize();\r |
92 | InitJoysticks(hAppWnd);\r |
93 | }\r |
94 | \r |
95 | void CreateInputStuff(void)\r |
96 | { \r |
97 | void *InputDPtr=0;\r |
98 | int x;\r |
99 | int TAttrib;\r |
100 | \r |
101 | for(x=0;x<2;x++)\r |
102 | {\r |
103 | TAttrib=0;\r |
104 | switch(InputType[x])\r |
105 | {\r |
106 | case SI_GAMEPAD:InputDPtr=((uint8 *)&JSreturn)+(x<<1);\r |
107 | break;\r |
108 | case SI_POWERPAD:InputDPtr=&powerpadbuf[x];break;\r |
109 | case SI_ARKANOID:InputDPtr=mousedata;break;\r |
110 | case SI_ZAPPER:InputDPtr=mousedata;\r |
111 | TAttrib=screenmode;\r |
112 | break;\r |
113 | } \r |
114 | FCEUI_SetInput(x,InputType[x],InputDPtr,TAttrib);\r |
115 | }\r |
116 | \r |
117 | TAttrib=0;\r |
118 | switch(InputTypeFC)\r |
119 | {\r |
120 | case SIFC_SHADOW:InputDPtr=mousedata;TAttrib=screenmode;break;\r |
121 | case SIFC_ARKANOID:InputDPtr=mousedata;break; \r |
122 | case SIFC_FKB:InputDPtr=fkbkeys;memset(fkbkeys,0,sizeof(fkbkeys));break;\r |
123 | }\r |
124 | FCEUI_SetInputFC(InputTypeFC,InputDPtr,TAttrib);\r |
125 | FCEUI_DisableFourScore(NoFourScore);\r |
126 | }\r |
127 | \r |
128 | void DestroyInput(void)\r |
129 | {\r |
130 | KillJoysticks();\r |
131 | KeyboardClose();\r |
132 | }\r |
133 | \r |
134 | void FCEUD_UpdateInput(void)\r |
135 | {\r |
136 | int x;\r |
137 | uint32 JS;\r |
138 | int t=0;\r |
139 | \r |
140 | KeyboardUpdate();\r |
141 | \r |
142 | for(x=0;x<2;x++)\r |
143 | switch(InputType[x])\r |
144 | {\r |
145 | case SI_GAMEPAD:t|=1;break;\r |
146 | case SI_ARKANOID:t|=2;break;\r |
147 | case SI_ZAPPER:t|=2;break;\r |
148 | case SI_POWERPAD:powerpadbuf[x]=UpdatePPadData(x);break;\r |
149 | }\r |
150 | switch(InputTypeFC)\r |
151 | {\r |
152 | case SIFC_ARKANOID:t|=2;break;\r |
153 | case SIFC_SHADOW:t|=2;break;\r |
154 | case SIFC_FKB: if(cidisabled) UpdateFKB();break;\r |
155 | }\r |
156 | if(t&1)\r |
157 | {\r |
158 | JS=KeyboardDodo();\r |
159 | if(joy[0]|joy[1]|joy[2]|joy[3])\r |
160 | JS|=(uint32)GetJSOr();\r |
161 | JSreturn=(JS&0xFF000000)|(JS&0xFF)|((JS&0xFF0000)>>8)|((JS&0xFF00)<<8); \r |
162 | }\r |
163 | if(t&2) \r |
164 | GetMouseData(&mousedata[0], &mousedata[1], &mousedata[2]);\r |
165 | }\r |
166 | \r |
167 | \r |
168 | BOOL CALLBACK InputConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)\r |
169 | {\r |
170 | static void (*boopar[5])(HWND hParent, int port)={0,ConfigGamePad,0,ConfigKeyboardiePowerpad,0};\r |
171 | static void (*boopar2[5])(HWND hParent)={0,0,0,0,ConfigFKB};\r |
172 | static char *strn[5]={"<none>","Gamepad","Zapper","Power Pad","Arkanoid Paddle"};\r |
173 | static char *strf[5]={"<none>","Arkanoid Paddle","Hyper Shot gun","4-Player Adapter","Family Keyboard"};\r |
174 | int x;\r |
175 | \r |
176 | switch(uMsg) {\r |
177 | case WM_INITDIALOG: \r |
178 | for(x=0;x<2;x++) \r |
179 | {\r |
180 | int y;\r |
181 | \r |
182 | for(y=0;y<5;y++)\r |
183 | SendDlgItemMessage(hwndDlg,104+x,CB_ADDSTRING,0,(LPARAM)(LPSTR)strn[y]);\r |
184 | \r |
185 | SendDlgItemMessage(hwndDlg,104+x,CB_SETCURSEL,UsrInputType[x],(LPARAM)(LPSTR)0);\r |
186 | EnableWindow(GetDlgItem(hwndDlg,106+x),boopar[InputType[x]]?1:0);\r |
187 | SetDlgItemText(hwndDlg,200+x,(LPTSTR)strn[InputType[x]]);\r |
188 | }\r |
189 | \r |
190 | \r |
191 | {\r |
192 | int y;\r |
193 | for(y=0;y<5;y++)\r |
194 | SendDlgItemMessage(hwndDlg,110,CB_ADDSTRING,0,(LPARAM)(LPSTR)strf[y]);\r |
195 | SendDlgItemMessage(hwndDlg,110,CB_SETCURSEL,UsrInputTypeFC,(LPARAM)(LPSTR)0); \r |
196 | EnableWindow(GetDlgItem(hwndDlg,111),boopar2[InputTypeFC]?1:0);\r |
197 | SetDlgItemText(hwndDlg,202,(LPTSTR)strf[InputTypeFC]);\r |
198 | }\r |
199 | \r |
200 | break;\r |
201 | case WM_CLOSE:\r |
202 | case WM_QUIT: goto gornk;\r |
203 | case WM_COMMAND:\r |
204 | if(HIWORD(wParam)==CBN_SELENDOK)\r |
205 | {\r |
206 | switch(LOWORD(wParam))\r |
207 | {\r |
208 | case 104:\r |
209 | case 105:UsrInputType[LOWORD(wParam)-104]=InputType[LOWORD(wParam)-104]=SendDlgItemMessage(hwndDlg,LOWORD(wParam),CB_GETCURSEL,0,(LPARAM)(LPSTR)0);\r |
210 | EnableWindow( GetDlgItem(hwndDlg,LOWORD(wParam)+2),boopar[InputType[LOWORD(wParam)-104]]?1:0);\r |
211 | SetDlgItemText(hwndDlg,200+LOWORD(wParam)-104,(LPTSTR)strn[InputType[LOWORD(wParam)-104]]);\r |
212 | break;\r |
213 | case 110:UsrInputTypeFC=InputTypeFC=SendDlgItemMessage(hwndDlg,110,CB_GETCURSEL,0,(LPARAM)(LPSTR)0);\r |
214 | EnableWindow(GetDlgItem(hwndDlg,111),boopar2[InputTypeFC]?1:0);\r |
215 | SetDlgItemText(hwndDlg,202,(LPTSTR)strf[InputTypeFC]);\r |
216 | break;\r |
217 | \r |
218 | }\r |
219 | \r |
220 | }\r |
221 | if(!(wParam>>16))\r |
222 | switch(wParam&0xFFFF)\r |
223 | {\r |
224 | case 111:\r |
225 | if(boopar2[InputTypeFC])\r |
226 | boopar2[InputTypeFC](hwndDlg);\r |
227 | break;\r |
228 | \r |
229 | case 107:\r |
230 | case 106:\r |
231 | {\r |
232 | int t=(wParam&0xFFFF)-106;\r |
233 | if(boopar[InputType[t]])\r |
234 | boopar[InputType[t]](hwndDlg,t);\r |
235 | }\r |
236 | break;\r |
237 | case 1:\r |
238 | gornk:\r |
239 | EndDialog(hwndDlg,0);\r |
240 | break;\r |
241 | }\r |
242 | }\r |
243 | return 0;\r |
244 | }\r |
245 | \r |
246 | void ConfigInput(HWND hParent)\r |
247 | {\r |
248 | DialogBox(fceu_hInstance,"INPUTCONFIG",hParent,InputConCallB);\r |
249 | CreateInputStuff();\r |
250 | }\r |
251 | \r |
252 | \r |
253 | static int porttemp;\r |
254 | \r |
255 | BOOL CALLBACK GPConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)\r |
256 | {\r |
257 | switch(uMsg) {\r |
258 | case WM_INITDIALOG: \r |
259 | if(NoFourScore)\r |
260 | CheckDlgButton(hwndDlg,200,BST_CHECKED);\r |
261 | break;\r |
262 | case WM_CLOSE:\r |
263 | case WM_QUIT: goto gornk;\r |
264 | case WM_COMMAND:\r |
265 | if(!(wParam>>16))\r |
266 | switch(wParam&0xFFFF)\r |
267 | {\r |
268 | case 107:ConfigJoystickies(hwndDlg, porttemp);break;\r |
269 | case 106:ConfigKeyboardie(hwndDlg, porttemp);break;\r |
270 | case 1:\r |
271 | gornk:\r |
272 | NoFourScore=0;\r |
273 | if(IsDlgButtonChecked(hwndDlg,200)==BST_CHECKED)\r |
274 | NoFourScore=1;\r |
275 | EndDialog(hwndDlg,0);\r |
276 | break;\r |
277 | }\r |
278 | }\r |
279 | return 0;\r |
280 | }\r |
281 | \r |
282 | static void ConfigGamePad(HWND hParent, int port)\r |
283 | {\r |
284 | porttemp=port;\r |
285 | DialogBox(fceu_hInstance,"GAMEPADCONFIG",hParent,GPConCallB);\r |
286 | }\r |
287 | \r |
288 | \r |