/// <summary> /// Read memory values in .cfg file, whose name depends on the MD5 hash of the targeted exe. /// Mostly used for PC games /// </summary> /// <param name="GameData_Folder"></param> protected virtual void ReadGameDataFromMd5Hash(String GameData_Folder) { String ConfigFile = AppDomain.CurrentDomain.BaseDirectory + GameData_Folder + @"\" + _TargetProcess_Md5Hash + ".cfg"; if (File.Exists(ConfigFile)) { Logger.WriteLog("Reading game memory setting from " + ConfigFile); using (StreamReader sr = new StreamReader(ConfigFile)) { String line; String FieldName = String.Empty; line = sr.ReadLine(); while (line != null) { String[] buffer = line.Split('='); if (buffer.Length > 1) { try { FieldName = "_" + buffer[0].Trim(); if (buffer[0].Contains("Nop")) { NopStruct n = new NopStruct(buffer[1].Trim()); this.GetType().GetField(FieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase).SetValue(this, n); Logger.WriteLog(FieldName + " successfully set to following value : 0x" + n.MemoryOffset.ToString("X8") + "|" + n.Length.ToString()); } else if (buffer[0].Contains("DIK")) { HardwareScanCode sc = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), buffer[1].Trim()); this.GetType().GetField(FieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase).SetValue(this, sc); Logger.WriteLog(FieldName + " successfully set to following value :" + sc.ToString()); } else if (buffer[0].Contains("VK")) { VirtualKeyCode vk = (VirtualKeyCode)Enum.Parse(typeof(VirtualKeyCode), buffer[1].Trim()); this.GetType().GetField(FieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase).SetValue(this, vk); Logger.WriteLog(FieldName + " successfully set to following value :" + vk.ToString()); } else { UInt32 v = UInt32.Parse(buffer[1].Substring(3).Trim(), NumberStyles.HexNumber); this.GetType().GetField(FieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase).SetValue(this, v); Logger.WriteLog(FieldName + " successfully set to following value : 0x" + v.ToString("X8")); } } catch (Exception ex) { Logger.WriteLog("Error reading game data for " + FieldName + " : " + ex.Message.ToString()); } } line = sr.ReadLine(); } sr.Close(); } } else { Logger.WriteLog("File not found : " + ConfigFile); } }
/// <summary> /// Constructors, Setting default values. /// This will be of use if no .INI file is found at launch /// </summary> /// <param name="PlayerID"></param> public PlayerSettings(int PlayerID) { _ID = PlayerID; if (_ID == 1) { _DIK_VirtualMouseButton_Left = HardwareScanCode.DIK_T; _DIK_VirtualMouseButton_Middle = HardwareScanCode.DIK_C; _DIK_VirtualMouseButton_Right = HardwareScanCode.DIK_F; } else if (_ID == 2) { _DIK_VirtualMouseButton_Left = HardwareScanCode.DIK_Y; _DIK_VirtualMouseButton_Middle = HardwareScanCode.DIK_V; _DIK_VirtualMouseButton_Right = HardwareScanCode.DIK_G; } else if (_ID == 3) { _DIK_VirtualMouseButton_Left = HardwareScanCode.DIK_U; _DIK_VirtualMouseButton_Middle = HardwareScanCode.DIK_B; _DIK_VirtualMouseButton_Right = HardwareScanCode.DIK_H; } else if (_ID == 4) { _DIK_VirtualMouseButton_Left = HardwareScanCode.DIK_I; _DIK_VirtualMouseButton_Middle = HardwareScanCode.DIK_N; _DIK_VirtualMouseButton_Right = HardwareScanCode.DIK_J; } }
/// <summary> /// Read Silent Hill the Arcade Key mapping /// </summary> public void Read_Sha_Conf() { String appData = Environment.GetEnvironmentVariable("appdata").ToString();; if (File.Exists(appData + SHA_CONF_FILEPATH)) { byte[] fileBytes = File.ReadAllBytes(appData + @"\bemani_config\sha_v01.cfg"); int Offset = 0x622; int n = (int)fileBytes[0]; for (int i = 0; i < n; i++) { int j = Offset + (i * 4); switch (fileBytes[j + 1]) { case 0x01: { _DIK_Sha_Test = (HardwareScanCode)fileBytes[j]; } break; case 0x02: { _DIK_Sha_Service = (HardwareScanCode)fileBytes[j]; } break; case 0x10: { _DIK_Sha_P1_Start = (HardwareScanCode)fileBytes[j]; } break; case 0x11: { _DIK_Sha_P1_Trigger = (HardwareScanCode)fileBytes[j]; } break; case 0x20: { _DIK_Sha_P2_Start = (HardwareScanCode)fileBytes[j]; } break; case 0x21: { _DIK_Sha_P2_Trigger = (HardwareScanCode)fileBytes[j]; } break; case 0xFF: { _DIK_Sha_Exit = (HardwareScanCode)fileBytes[j]; } break; } } } else { //MessageBox.Show("Silent Hill the Arcade : " + appData + @"\bemani_config\sha_v01.cfg not found", "DemulShooter Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
/// <summary> /// Constructor /// </summary> public Game_Dolphin5(String RomName, UInt32 DinputNumber, HardwareScanCode DIK_P2_LClick, HardwareScanCode DIK_P2_MClick, HardwareScanCode DIK_P2_RClick, double _ForcedXratio, bool DisableInputHack, bool Verbose) : base(RomName, "Dolphin", _ForcedXratio, DisableInputHack, Verbose) { _DinputNumber = DinputNumber; _DIK_P2_Key_LClick = DIK_P2_LClick; _DIK_P2_Key_MClick = DIK_P2_MClick; _DIK_P2_Key_RClick = DIK_P2_RClick; _KnownMd5Prints.Add("Dolphin_x86 v5.0", "9660ec7cddf093a1807cb25fe0946b8e"); _tProcess.Start(); Logger.WriteLog("Waiting for Dolphin " + _RomName + " game to hook....."); }
/// <summary> /// Constructor /// </summary> public Game_TtxGundam(String RomName, bool Pedal1_Enable, HardwareScanCode Pedal1_Key, bool Pedal2_Enable, HardwareScanCode Pedal2_Key, double _ForcedXratio, bool DisableInputHack, bool Verbose) : base(RomName, "game", _ForcedXratio, DisableInputHack, Verbose) { _Pedal1_Enable = Pedal1_Enable; _Pedal1_Key = Pedal1_Key; _Pedal2_Enable = Pedal2_Enable; _Pedal2_Key = Pedal2_Key; _KnownMd5Prints.Add("Gundam : SoZ v1.01 - Dual Player, Unpatched I/O", "70af03a21a42d9042065fc65b7eb56f9"); _KnownMd5Prints.Add("Gundam : SoZ v1.01 - Single Player, Pathched I/O", "d8cd539967cc3c23f620139ab4669d30"); _KnownMd5Prints.Add("Gundam : SoZ v1.01 - Dual Player, Patched I/O", "c31187a57fd5ab6864b78eaa755ae3f0"); _tProcess.Start(); Logger.WriteLog("Waiting for Taito Type X " + _RomName + " game to hook....."); }
/// <summary> /// Simulate a keyboard key action (up or down) /// </summary> /// <param name="Keycode">Hardware ScanCode of the key to simulate</param> /// <param name="KeybdInputFlags">State of the key. (0=Down, 1 = Up)</param> private void SendKey(HardwareScanCode Keycode, KeybdInputFlags KeybdInputFlags) { INPUT[] InputData = new INPUT[1]; InputData[0].type = InputType.INPUT_KEYBOARD; InputData[0].ki.wScan = Keycode; InputData[0].ki.dwFlags = KeybdInputFlags; InputData[0].ki.time = 0; InputData[0].ki.dwExtraInfo = IntPtr.Zero; if (Win32API.SendInput(1, InputData, Marshal.SizeOf(typeof(INPUT))) == 0) { Logger.WriteLog("SendInput API failed : wScan=" + Keycode.ToString() + ", dwFlags=" + KeybdInputFlags.ToString()); Logger.WriteLog("GetLastError returned : " + Marshal.GetLastWin32Error().ToString()); } }
/// <summary> /// Convert a HardwareScanCode to a corresponding VirtualKeyCode /// </summary> /// <param name="ScanCode">Hardware Scancode to convert</param> /// <returns></returns> public VirtualKeyCode MapScanCodeToVirtualKeyCode(HardwareScanCode ScanCode) { UInt32 Vk = Win32API.MapVirtualKey((UInt32)ScanCode, VirtualKeyMapType.MAPVK_VSC_TO_VK); return((VirtualKeyCode)Vk); }
protected void SendKeyUp(HardwareScanCode Keycode) { SendKey(Keycode, KeybdInputFlags.KEYEVENTF_KEYUP | KeybdInputFlags.KEYEVENTF_SCANCODE); }
/// <summary> /// Send KeyUp and KeyDown separated by a desired delay /// </summary> /// <param name="Keycode">DirectInput Keycode (hardware scan code)</param> /// <param name="DelayPressed">Delay in milliseconds</param> protected void SendKeyStroke(HardwareScanCode Keycode, int DelayPressed) { SendKeyDown(Keycode); System.Threading.Thread.Sleep(DelayPressed); SendKeyUp(Keycode); }
/// <summary> /// Main application config file /// </summary> /// <param name="ConfigFilePath">Path to DemulShooter config file</param> public void ReadDsConfig(String ConfigFilePath) { try { using (StreamReader sr = new StreamReader(ConfigFilePath)) { String line = sr.ReadLine(); String[] buffer; while (line != null) { if (!line.StartsWith(";")) { buffer = line.Split('='); if (buffer.Length == 2) { String StrKey = buffer[0].Trim(); String StrValue = buffer[1].Trim(); // There will never be more than 9 players (even more than 4) so we can assume that // removing only first 2 char is enough without verification if (StrKey.ToLower().StartsWith("p1")) { if (!GetPlayerSettings(1).ParseIniParameter(StrKey.ToLower().Substring(2), StrValue)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().StartsWith("p2")) { if (!GetPlayerSettings(2).ParseIniParameter(StrKey.ToLower().Substring(2), StrValue)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().StartsWith("p3")) { if (!GetPlayerSettings(3).ParseIniParameter(StrKey.ToLower().Substring(2), StrValue)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().StartsWith("p4")) { if (!GetPlayerSettings(4).ParseIniParameter(StrKey.ToLower().Substring(2), StrValue)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("act_labs_offset_enable")) { if (!bool.TryParse(StrValue, out _Act_Labs_Offset_Enable)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("act_labs_display_crosshair")) { if (!bool.TryParse(StrValue, out _Act_Labs_Display_Crosshair)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("m2_p1_ch")) { try { _DIK_M2_Crosshair_P1 = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("m2_p2_ch")) { try { _DIK_M2_Crosshair_P2 = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("m2_ch_vis")) { try { _DIK_M2_Crosshair_Visibility = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("gsoz_p1_pedal_enable")) { if (!bool.TryParse(StrValue, out _Gsoz_Pedal_P1_Enabled)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("gsoz_p2_pedal_enable")) { if (!bool.TryParse(StrValue, out _Gsoz_Pedal_P2_Enabled)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("gsoz_p1_pedal_key")) { try { _DIK_Gsoz_Pedal_P1 = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("gsoz_p2_pedal_key")) { try { _DIK_Gsoz_Pedal_P2 = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("dolphin_p2_lclick")) { try { _DIK_Dolphin_P2_LClick = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("dolphin_p2_mclick")) { try { _DIK_Dolphin_P2_MClick = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("dolphin_p2_rclick")) { try { _DIK_Dolphin_P2_RClick = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("hf3_path")) { _HF3_Path = StrValue; } else if (StrKey.ToLower().Equals("hf3_coversensibility")) { if (!int.TryParse(StrValue, out _HF3_CoverSensibility)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("hf4_path")) { _HF4_Path = StrValue; } else if (StrKey.ToLower().Equals("hf4_coversensibility")) { if (!int.TryParse(StrValue, out _HF4_CoverSensibility)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("opghost_enablefreeplay")) { if (!bool.TryParse(StrValue, out _OpGHost_EnableFreeplay)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("opghost_creditstostart")) { if (!int.TryParse(StrValue, out _OpGhost_CreditsToStart)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("opghost_creditstocontinue")) { if (!int.TryParse(StrValue, out _OpGhost_CreditsToContinue)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("opghost_coinsbycredits")) { if (!int.TryParse(StrValue, out _OpGhost_CoinsByCredits)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("outputenabled")) { if (!bool.TryParse(StrValue, out _OutputEnabled)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("outputpollingdelay")) { if (!int.TryParse(StrValue, out _OutputPollingDelay)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("outputcustomdamageddelay")) { if (!int.TryParse(StrValue, out _OutputCustomDamagedDelay)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("outputcustomrecoilondelay")) { if (!int.TryParse(StrValue, out _OutputCustomRecoilOnDelay)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } else if (StrKey.ToLower().Equals("outputcustomrecoiloffdelay")) { if (!int.TryParse(StrValue, out _OutputCustomRecoilOffDelay)) { Logger.WriteLog("Error parsing " + StrKey + " value in INI file : " + StrValue + " is not valid"); } } } } line = sr.ReadLine(); } sr.Close(); Logger.WriteLog("Configuration file succesfuly loaded"); } } catch (Exception ex) { Logger.WriteLog("Error reading " + ConfigFilePath + " : " + ex.Message); } }
/// <summary> /// Reading and parsing existing confil file /// </summary> public bool ParseIniParameter(string StrKey, string StrValue) { if (StrKey.Equals("mode")) { _Mode = StrValue.ToUpper(); } else if (StrKey.Equals("devicename")) { _DeviceName = StrValue; } else if (StrKey.Equals("hidaxisx")) { try { _HidAxis_X = Convert.ToByte(StrValue, 16); } catch { return(false); } } else if (StrKey.Equals("hidaxisy")) { try { _HidAxis_Y = Convert.ToByte(StrValue, 16); } catch { return(false); } } else if (StrKey.Equals("invertaxisx")) { if (!bool.TryParse(StrValue, out _InvertAxis_X)) { return(false); } } else if (StrKey.Equals("invertaxisy")) { if (!bool.TryParse(StrValue, out _InvertAxis_Y)) { return(false); } } else if (StrKey.Equals("hidbtnonscreentrigger")) { if (!int.TryParse(StrValue, out _HidButton_OnScreenTrigger)) { return(false); } } else if (StrKey.Equals("hidbtnoffscreentrigger")) { if (!int.TryParse(StrValue, out _HidButton_OffScreenTrigger)) { return(false); } } else if (StrKey.Equals("hidbtnaction")) { if (!int.TryParse(StrValue, out _HidButton_Action)) { return(false); } } else if (StrKey.Equals("gamepadleftclick")) { try { _Gamepad_LeftClick = (XinputButtonFlags)Enum.Parse(typeof(XinputButtonFlags), StrValue); } catch { return(false); } } else if (StrKey.Equals("gamepadmiddleclick")) { try { _Gamepad_MiddleClick = (XinputButtonFlags)Enum.Parse(typeof(XinputButtonFlags), StrValue); } catch { return(false); } } else if (StrKey.Equals("gamepadrightclick")) { try { _Gamepad_RightClick = (XinputButtonFlags)Enum.Parse(typeof(XinputButtonFlags), StrValue); } catch { return(false); } } else if (StrKey.Equals("gamepadstick")) { _Gamepad_Stick = StrValue.ToUpper(); } else if (StrKey.Equals("gamepadvibrationenabled")) { if (!int.TryParse(StrValue, out _Gamepad_VibrationEnabled)) { return(false); } } else if (StrKey.Equals("gamepadvibrationlength")) { if (!int.TryParse(StrValue, out _Gamepad_VibrationLength)) { return(false); } } else if (StrKey.Equals("gamepadvibrationstrength")) { if (!int.TryParse(StrValue, out _Gamepad_VibrationStrength)) { return(false); } } else if (StrKey.Equals("act_labs_offset_x")) { if (!int.TryParse(StrValue, out _Act_Labs_OffsetX)) { return(false); } } else if (StrKey.Equals("act_labs_offset_y")) { if (!int.TryParse(StrValue, out _Act_Labs_OffsetY)) { return(false); } } else if (StrKey.Equals("analog_calibration_override")) { if (!bool.TryParse(StrValue, out _AnalogAxisRangeOverride)) { return(false); } ; } else if (StrKey.Equals("analog_manual_xmin")) { if (!int.TryParse(StrValue, out _AnalogManual_Xmin)) { return(false); } } else if (StrKey.Equals("analog_manual_xmax")) { if (!int.TryParse(StrValue, out _AnalogManual_Xmax)) { return(false); } } else if (StrKey.Equals("analog_manual_ymin")) { if (!int.TryParse(StrValue, out _AnalogManual_Ymin)) { return(false); } } else if (StrKey.Equals("analog_manual_ymax")) { if (!int.TryParse(StrValue, out _AnalogManual_Ymax)) { return(false); } } else if (StrKey.Equals("virtualmousebuttons_enable")) { if (!bool.TryParse(StrValue, out _VirtualMouseButtonsEnabled)) { return(false); } ; } else if (StrKey.Equals("virtualmousebuttonleft_key")) { try { _DIK_VirtualMouseButton_Left = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { return(false); } } else if (StrKey.Equals("virtualmousebuttonmiddle_key")) { try { _DIK_VirtualMouseButton_Middle = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { return(false); } } else if (StrKey.Equals("virtualmousebuttonright_key")) { try { _DIK_VirtualMouseButton_Right = (HardwareScanCode)Enum.Parse(typeof(HardwareScanCode), StrValue); } catch { return(false); } } return(true); }