⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 DC的SEGA_GG模拟器源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
					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 + -