📄 main.c
字号:
RegistryInfo.RapidFire[PLAYER_1][PAD_BUTTON2 - PAD_BUTTON1] ^= 1;
break;
case IDC_P2_BUTTON1_RAPIDFIRE_CHECK:
RegistryInfo.RapidFire[PLAYER_2][PAD_BUTTON1 - PAD_BUTTON1] ^= 1;
break;
case IDC_P2_BUTTON2_RAPIDFIRE_CHECK:
RegistryInfo.RapidFire[PLAYER_2][PAD_BUTTON2 - PAD_BUTTON1] ^= 1;
break;
case IDC_P1_DISABLE_KEYS_CHECK:
RegistryInfo.DisableKeys[PLAYER_1] ^= 1;
break;
case IDC_P2_DISABLE_KEYS_CHECK:
RegistryInfo.DisableKeys[PLAYER_2] ^= 1;
break;
}
break;
case CBN_SELCHANGE:
{
int Index = SendMessage(GetDlgItem(hwnd, LOWORD(wParam)), CB_GETCURSEL, 0, 0);
switch (LOWORD(wParam))
{
case IDC_P1_JOYSTICK_COMBO:
SetSelectedJoystick(PLAYER_1, Index);
PopulateConfigureControls(hwnd);
EnableWindow(GetDlgItem(hwnd, IDC_P1_DISABLE_KEYS_CHECK), GetSelectedJoystick(PLAYER_1)? TRUE : FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_P2_DISABLE_KEYS_CHECK), GetSelectedJoystick(PLAYER_2)? TRUE : FALSE);
break;
case IDC_P2_JOYSTICK_COMBO:
SetSelectedJoystick(PLAYER_2, Index);
PopulateConfigureControls(hwnd);
EnableWindow(GetDlgItem(hwnd, IDC_P1_DISABLE_KEYS_CHECK), GetSelectedJoystick(PLAYER_1)? TRUE : FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_P2_DISABLE_KEYS_CHECK), GetSelectedJoystick(PLAYER_2)? TRUE : FALSE);
break;
case IDC_P1_RAPIDFIRE_COMBO:
RegistryInfo.RapidFireRate[PLAYER_1] = Index + 2;
break;
case IDC_P2_RAPIDFIRE_COMBO:
RegistryInfo.RapidFireRate[PLAYER_2] = Index + 2;
break;
}
}
break;
}
}
break;
case WM_CLOSE:
EndDialog(hwnd, 0);
break;
default:
return FALSE;
}
return TRUE;
}
void PopulateConfigureControls(HWND hwnd)
{
int Joystick1 = GetSelectedJoystick(PLAYER_1);
int Joystick2 = GetSelectedJoystick(PLAYER_2);
char Text[32];
if (Joystick1)
{
EnableWindow(GetDlgItem(hwnd, IDC_P1_LEFT_BUTTON), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_P1_RIGHT_BUTTON), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_P1_UP_BUTTON), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_P1_DOWN_BUTTON), FALSE);
SetDlgItemText(hwnd, IDC_P1_LEFT, "Left");
SetDlgItemText(hwnd, IDC_P1_RIGHT, "Right");
SetDlgItemText(hwnd, IDC_P1_UP, "Up");
SetDlgItemText(hwnd, IDC_P1_DOWN, "Down");
wsprintf(Text, "Button %d", RegistryInfo.JoystickMap[PLAYER_1][PAD_BUTTON1 - PAD_BUTTON1]);
SetDlgItemText(hwnd, IDC_P1_BUTTON1, Text);
wsprintf(Text, "Button %d", RegistryInfo.JoystickMap[PLAYER_1][PAD_BUTTON2 - PAD_BUTTON1]);
SetDlgItemText(hwnd, IDC_P1_BUTTON2, Text);
wsprintf(Text, "Button %d", RegistryInfo.JoystickMap[PLAYER_1][PAD_START - PAD_BUTTON1]);
SetDlgItemText(hwnd, IDC_P1_START, Text);
}
else
{
EnableWindow(GetDlgItem(hwnd, IDC_P1_LEFT_BUTTON), TRUE);
EnableWindow(GetDlgItem(hwnd, IDC_P1_RIGHT_BUTTON), TRUE);
EnableWindow(GetDlgItem(hwnd, IDC_P1_UP_BUTTON), TRUE);
EnableWindow(GetDlgItem(hwnd, IDC_P1_DOWN_BUTTON), TRUE);
SetDlgItemText(hwnd, IDC_P1_LEFT, ButtonToString(PLAYER_1, PAD_LEFT));
SetDlgItemText(hwnd, IDC_P1_RIGHT, ButtonToString(PLAYER_1, PAD_RIGHT));
SetDlgItemText(hwnd, IDC_P1_UP, ButtonToString(PLAYER_1, PAD_UP));
SetDlgItemText(hwnd, IDC_P1_DOWN, ButtonToString(PLAYER_1, PAD_DOWN));
SetDlgItemText(hwnd, IDC_P1_BUTTON1, ButtonToString(PLAYER_1, PAD_BUTTON1));
SetDlgItemText(hwnd, IDC_P1_BUTTON2, ButtonToString(PLAYER_1, PAD_BUTTON2));
SetDlgItemText(hwnd, IDC_P1_START, ButtonToString(PLAYER_1, PAD_START));
}
if (Joystick2)
{
EnableWindow(GetDlgItem(hwnd, IDC_P2_LEFT_BUTTON), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_P2_RIGHT_BUTTON), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_P2_UP_BUTTON), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_P2_DOWN_BUTTON), FALSE);
SetDlgItemText(hwnd, IDC_P2_LEFT, "Left");
SetDlgItemText(hwnd, IDC_P2_RIGHT, "Right");
SetDlgItemText(hwnd, IDC_P2_UP, "Up");
SetDlgItemText(hwnd, IDC_P2_DOWN, "Down");
wsprintf(Text, "Button %d", RegistryInfo.JoystickMap[PLAYER_2][PAD_BUTTON1 - PAD_BUTTON1]);
SetDlgItemText(hwnd, IDC_P2_BUTTON1, Text);
wsprintf(Text, "Button %d", RegistryInfo.JoystickMap[PLAYER_2][PAD_BUTTON2 - PAD_BUTTON1]);
SetDlgItemText(hwnd, IDC_P2_BUTTON2, Text);
wsprintf(Text, "Button %d", RegistryInfo.JoystickMap[PLAYER_2][PAD_START - PAD_BUTTON1]);
SetDlgItemText(hwnd, IDC_P2_START, Text);
}
else
{
EnableWindow(GetDlgItem(hwnd, IDC_P2_LEFT_BUTTON), TRUE);
EnableWindow(GetDlgItem(hwnd, IDC_P2_RIGHT_BUTTON), TRUE);
EnableWindow(GetDlgItem(hwnd, IDC_P2_UP_BUTTON), TRUE);
EnableWindow(GetDlgItem(hwnd, IDC_P2_DOWN_BUTTON), TRUE);
SetDlgItemText(hwnd, IDC_P2_LEFT, ButtonToString(PLAYER_2, PAD_LEFT));
SetDlgItemText(hwnd, IDC_P2_RIGHT, ButtonToString(PLAYER_2, PAD_RIGHT));
SetDlgItemText(hwnd, IDC_P2_UP, ButtonToString(PLAYER_2, PAD_UP));
SetDlgItemText(hwnd, IDC_P2_DOWN, ButtonToString(PLAYER_2, PAD_DOWN));
SetDlgItemText(hwnd, IDC_P2_BUTTON1, ButtonToString(PLAYER_2, PAD_BUTTON1));
SetDlgItemText(hwnd, IDC_P2_BUTTON2, ButtonToString(PLAYER_2, PAD_BUTTON2));
SetDlgItemText(hwnd, IDC_P2_START, ButtonToString(PLAYER_2, PAD_START));
}
}
void PopulateJoystickCombo(HWND hwnd, int Player)
{
int i;
if (Player == PLAYER_1)
{
hwnd = GetDlgItem(hwnd, IDC_P1_JOYSTICK_COMBO);
}
else
{
hwnd = GetDlgItem(hwnd, IDC_P2_JOYSTICK_COMBO);
}
SendMessage(hwnd, CB_RESETCONTENT, 0, 0);
SendMessage(hwnd, CB_ADDSTRING, 0, (long)"None");
for (i = 0 ; i < MAX_JOYSTICKS ; i++)
{
char Name[MAX_PATH];
if (GetJoystickName(i, Name))
{
SendMessage(hwnd, CB_ADDSTRING, 0, (long)Name);
}
}
SendMessage(hwnd, CB_SETCURSEL, GetSelectedJoystick(Player), 0);
}
int ConfigureButton(HWND hwnd, int Player, int Button, int DialogItem, char *pString)
{
int AssignedKey;
AssignedKey = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_CONTROLS_KEY), hwnd, ConfigureControlsKeyProc, (long)pString);
SetControlKey(Player, Button, AssignedKey);
if (AssignedKey >= 256)
{
char Text[32];
wsprintf(Text, "Button %d", AssignedKey - 256);
SetDlgItemText(hwnd, DialogItem, Text);
}
else
{
SetDlgItemText(hwnd, DialogItem, ButtonToString(Player, Button));
}
return AssignedKey;
}
LRESULT CALLBACK ConfigureControlsKeyProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static UINT_PTR Timer = 0;
switch (msg)
{
case WM_INITDIALOG:
{
char String[MAX_PATH];
CenterWindowInParent(hwnd);
if (JoystickPresent())
{
wsprintf(String, "Press the new key or button for %s.", (char *)lParam);
}
else
{
wsprintf(String, "Press the new key for %s.", (char *)lParam);
}
SetDlgItemText(hwnd, IDC_TEXT, String);
TidyInput();
InitInput(hwnd, hInstance);
Timer = SetTimer(hwnd, 0, 20, NULL);
ShowWindow(hwnd, SW_SHOW);
}
break;
case WM_TIMER:
{
int Key = GetKeyPressed(TRUE);
if (Key == -1 && JoystickPresent())
{
UpdateJoysticks();
Key = GetJoystickButtonPressed();
}
if (Key != -1)
{
KillTimer(hwnd, Timer);
EndDialog(hwnd, Key);
}
}
break;
default:
return FALSE;
}
return TRUE;
}
void SetScreenScale(unsigned int Scale)
{
if (UseDirectDraw && RegistryInfo.EnableDirectDraw)
{
if (!FullScreenMode() && !Scale)
{
UseDirectDraw = ChangeMode(RegistryInfo.FullScreenMode, RegistryInfo.FullScreen = TRUE);
}
else
{
if (Scale)
{
UseDirectDraw = ChangeMode(RegistryInfo.FullScreenMode, RegistryInfo.FullScreen = FALSE);
}
}
}
CheckMenuItem(hMenu, ID_MENU_CONFIG_SCREEN_FULL, (Scale == 0)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_SCREEN_X1, (Scale == 1)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_SCREEN_X2, (Scale == 2)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_SCREEN_X3, (Scale == 3)? MF_CHECKED : MF_UNCHECKED);
AdjustWindowSize();
}
void SetFrameTime(int Frequency)
{
if (Frequency == FREQ_50HZ)
{
memcpy(FrameTime, FrameTime50hz, sizeof(FrameTime));
}
else
{
memcpy(FrameTime, FrameTime60hz, sizeof(FrameTime));
}
}
void SetScreenSmoothing(BOOL UseSmoothing)
{
CheckMenuItem(hMenu, ID_MENU_CONFIG_SCREEN_SMOOTHING, (UseSmoothing)? MF_CHECKED : MF_UNCHECKED);
if (UseDirectDraw && RegistryInfo.EnableDirectDraw) SetModeSmoothing(UseSmoothing);
}
void SetUpdateFrequency(unsigned int Frequency)
{
CheckMenuItem(hMenu, ID_MENU_CONFIG_UPDATE_50HZ, (Frequency == FREQ_50HZ)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_UPDATE_60HZ, (Frequency == FREQ_60HZ)? MF_CHECKED : MF_UNCHECKED);
TidyAudio();
audio_init(RegistryInfo.SoundFrequency, Frequency);
InitAudio(hwnd, RegistryInfo.SoundFrequency, Frequency);
SetFrameTime(Frequency);
}
void SetFrameSkip(unsigned int Skip)
{
CheckMenuItem(hMenu, ID_MENU_CONFIG_SKIP_AUTO, (Skip == 0)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_SKIP_1, (Skip == 1)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_SKIP_2, (Skip == 2)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_SKIP_3, (Skip == 3)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_SKIP_4, (Skip == 4)? MF_CHECKED : MF_UNCHECKED);
}
void SetSoundFrequency(unsigned int Frequency)
{
CheckMenuItem(hMenu, ID_MENU_CONFIG_SOUND_44100, (Frequency == 44100)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_SOUND_22050, (Frequency == 22200)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_SOUND_11025, (Frequency == 11100)? MF_CHECKED : MF_UNCHECKED);
TidyAudio();
audio_init(Frequency, RegistryInfo.UpdateFrequency);
InitAudio(hwnd, Frequency, RegistryInfo.UpdateFrequency);
}
void SetRegion(int Region)
{
CheckMenuItem(hMenu, ID_MENU_CONFIG_REGION_JAPAN, (Region == TYPE_DOMESTIC)? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hMenu, ID_MENU_CONFIG_REGION_EUROPEUS, (Region == TYPE_OVERSEAS)? MF_CHECKED : MF_UNCHECKED);
}
LRESULT CALLBACK SettingsProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static int SelectedFolder = 0;
static char *pFolderString = NULL;
static char GammaText[8];
static char FMVolumeText[8];
static int NewMode;
static BOOL NewDirectDrawEnable;
switch (msg)
{
case WM_INITDIALOG:
{
HWND hCombo = GetDlgItem(hwnd, IDC_FOLDERS_COMBO);
CenterWindowInParent(hwnd);
SelectedFolder = 0;
pFolderString = RegistryInfo.ROMPath;
SendMessage(hCombo, CB_RESETCONTENT, 0, 0);
SendMessage(hCombo, CB_ADDSTRING, 0, (long)"ROM Folder");
SendMessage(hCombo, CB_ADDSTRING, 0, (long)"SRAM Folder");
SendMessage(hCombo, CB_ADDSTRING, 0, (long)"Screenshot Folder");
SendMessage(hCombo, CB_ADDSTRING, 0, (long)"Save State Folder");
SendMessage(hCombo, CB_ADDSTRING, 0, (long)"Sound Record Folder");
SendMessage(hCombo, CB_SETCURSEL, SelectedFolder, 0);
SetDlgItemText(hwnd, IDC_FOLDERS_TEXT, RegistryInfo.ROMPath);
CheckDlgButton(hwnd, IDC_SAVESTATE_CHECK, RegistryInfo.SingleSaveState? BST_CHECKED : BST_UNCHECKED);
SendMessage(GetDlgItem(hwnd, IDC_GAMMA_SLIDER), TBM_SETTICFREQ, 5, 0);
SendMessage(GetDlgItem(hwnd, IDC_GAMMA_SLIDER), TBM_SETRANGE, TRUE, MAKELPARAM(5, 100));
SendMessage(GetDlgItem(hwnd, IDC_GAMMA_SLIDER), TBM_SETPOS, TRUE, (int)(RegistryInfo.Gamma * 20.0f));
wsprintf(GammaText, "%d.%02d", (int)(RegistryInfo.Gamma * 20.0f) / 20, ((int)(RegistryInfo.Gamma * 20.0f) % 20) * 5);
SetDlgItemText(hwnd, IDC_GAMMA_TEXT, GammaText);
PopulateModesCombo(GetDlgItem(hwnd, IDC_DIRECT_DRAW_MODE_COMBO));
NewMode = RegistryInfo.FullScreenMode;
CheckDlgButton(hwnd, IDC_DIRECT_DRAW_ENABLE_CHECK, RegistryInfo.EnableDirectDraw? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hwnd, IDC_DIRECT_DRAW_ENABLE_SCANLINES_CHECK, RegistryInfo.EnableScanLines? BST_CHECKED : BST_UNCHECKED);
EnableWindow(GetDlgItem(hwnd, IDC_DIRECT_DRAW_ENABLE_CHECK), DirectDrawAvail);
EnableWindow(GetDlgItem(hwnd, IDC_DIRECT_DRAW_ENABLE_SCANLINES_CHECK), DirectDrawAvail && RegistryInfo.EnableDirectDraw);
EnableWindow(GetDlgItem(hwnd, IDC_DIRECT_DRAW_MODE_COMBO), DirectDrawAvail);
NewDirectDrawEnable = RegistryInfo.EnableDirectDraw;
CheckDlgButton(hwnd, IDC_FM_ENABLE_CHECK, RegistryInfo.EnableFMSound? BST_CHECKED : BST_UNCHECKED);
SendMessage(GetDlgItem(hwnd, IDC_FM_VOLUME_SLIDER), TBM_SETTICFREQ, 5, 0);
SendMessage(GetDlgItem(hwnd, IDC_FM_VOLUME_SLIDER), TBM_SETRANGE, TRUE, MAKELPARAM(0, 100));
SendMessage(GetDlgItem(hwnd, IDC_FM_VOLUME_SLIDER), TBM_SETPOS, TRUE, (int)(RegistryInfo.FMVolume * 100.0f));
sprintf(FMVolumeText, "%.2f", RegistryInfo.FMVolume);
SetDlgItemText(hwnd, IDC_FM_VOLUME_TEXT, FMVolumeText);
ShowWindow(hwnd, SW_SHOW);
}
break;
case WM_COMMAND:
{
switch (HIWORD(wParam))
{
case BN_CLICKED:
switch (LOWORD(wParam))
{
case IDC_FOLDERS_BROWSE_BUTTON:
if (BrowseForDirectory(hwnd, pFolderString, "Select folder"))
{
SetDlgItemText(hwnd, IDC_FOLDERS_TEXT, pFolderString);
}
break;
case IDC_REGISTER_BUTTON:
SetFileAssociations();
MessageBox(hwnd, "File associations set.", "", MB_OK);
break;
case IDC_OK_BUTTON:
SendMessage(hwnd, WM_CLOSE, 0, 0);
break;
case IDC_SAVESTATE_CHECK:
RegistryInfo.SingleSaveState ^= 1;
break;
case IDC_DIRECT_DRAW_ENABLE_CHECK:
NewDirectDrawEnable ^= 1;
EnableWindow(GetDlgItem(hwnd, IDC_DIRECT_DRAW_ENABLE_SCANLINES_CHECK), DirectDrawAvail && NewDirectDrawEnable);
break;
case IDC_DIRECT_DRAW_ENABLE_SCANLINES_CHECK:
RegistryInfo.EnableScanLines ^= 1;
break;
case IDC_FM_ENABLE_CHECK:
RegistryInfo.EnableFMSound ^= 1;
sms.use_fm ^= 1;
break;
}
break;
case CBN_SELCHANGE:
{
int Index = SendMessage(GetDlgItem(hwnd, LOWORD(wParam)), CB_GETCURSEL, 0, 0);
switch (LOWORD(wParam))
{
case IDC_FOLDERS_COMBO:
SelectedFolder = Index;
switch (SelectedFolder)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -