internal void ParseEvents() { var newInput = _inputManager.GetState(); if (newInput != _inputState) { _inputState = newInput; if (_inputState.IsLeftButtonDown) { _leftBtnPressed = MouseButtonStatus.Clicked | MouseButtonStatus.Down; } else { _leftBtnPressed &= ~MouseButtonStatus.Down; } if (_inputState.IsRightButtonDown) { _rightBtnPressed = MouseButtonStatus.Clicked | MouseButtonStatus.Down; } else { _rightBtnPressed &= ~MouseButtonStatus.Down; } } }
protected void ClearClickedStatus() { mouseAndKeyboardStat = 0; _leftBtnPressed &= ~MouseButtonStatus.Clicked; _rightBtnPressed &= ~MouseButtonStatus.Clicked; }
internal protected virtual void ProcessInput() { // // Determine the mouse button state. // mouseAndKeyboardStat = 0; if (_leftBtnPressed.HasFlag(MouseButtonStatus.Clicked) && _rightBtnPressed.HasFlag(MouseButtonStatus.Clicked)) { // Pressing both mouse buttons is treated as if you pressed // the cutscene exit key (ESC) in V4+ games. That mimicks // the behavior of the original engine where pressing both // mouse buttons also skips the current cutscene. mouseAndKeyboardStat = 0; // lastKeyHit = Common::KeyState(Common::KEYCODE_ESCAPE); } else if (_rightBtnPressed.HasFlag(MouseButtonStatus.Clicked) && (Game.Version <= 3 && Game.GameId != GameId.Loom)) { // Pressing right mouse button is treated as if you pressed // the cutscene exit key (ESC) in V0-V3 games. That mimicks // the behavior of the original engine where pressing right // mouse button also skips the current cutscene. mouseAndKeyboardStat = 0; // lastKeyHit = Common::KeyState(Common::KEYCODE_ESCAPE); } else if (_leftBtnPressed.HasFlag(MouseButtonStatus.Clicked)) { mouseAndKeyboardStat = (KeyCode)ScummMouseButtonState.LeftClick; } else if (_rightBtnPressed.HasFlag(MouseButtonStatus.Clicked)) { mouseAndKeyboardStat = (KeyCode)ScummMouseButtonState.RightClick; } if (Game.Version >= 6) { Variables[VariableLeftButtonHold.Value] = _leftBtnPressed.HasFlag(MouseButtonStatus.Down) ? 1 : 0; Variables[VariableRightButtonHold.Value] = _rightBtnPressed.HasFlag(MouseButtonStatus.Down) ? 1 : 0; // scumm7: left/right button down if (Game.Version >= 7) { Variables[VariableLeftButtonDown.Value] = _leftBtnPressed.HasFlag(MouseButtonStatus.Clicked) ? 1 : 0; Variables[VariableRightButtonDown.Value] = _rightBtnPressed.HasFlag(MouseButtonStatus.Clicked) ? 1 : 0; } } _leftBtnPressed &= ~MouseButtonStatus.Clicked; _rightBtnPressed &= ~MouseButtonStatus.Clicked; var cutsceneExitKeyEnabled = (!VariableCutSceneExitKey.HasValue || Variables[VariableCutSceneExitKey.Value] != 0); var mainmenuKeyEnabled = !VariableMainMenu.HasValue || _variables[VariableMainMenu.Value] != 0; // For games which use VAR_MAINMENU_KEY, disable the mainmenu key if // requested by the scripts. We make an exception for COMI (i.e. // forcefully always enable it there), as that always disables it. if (Game.GameId == GameId.CurseOfMonkeyIsland) mainmenuKeyEnabled = true; if (cutsceneExitKeyEnabled && _inputState.IsKeyDown(KeyCode.Escape)) { AbortCutscene(); // VAR_CUTSCENEEXIT_KEY doesn't exist in SCUMM0 if (VariableCutSceneExitKey.HasValue) { mouseAndKeyboardStat = (KeyCode)Variables[VariableCutSceneExitKey.Value]; } } if (mainmenuKeyEnabled && _inputState.IsKeyDown(KeyCode.F5)) { if (VariableSaveLoadScript.HasValue && _currentRoom != 0) { RunScript(Variables[VariableSaveLoadScript.Value], false, false, new int[0]); } ShowMenu(); if (VariableSaveLoadScript2.HasValue && _currentRoom != 0) { RunScript(Variables[VariableSaveLoadScript2.Value], false, false, new int[0]); } } for (var i = KeyCode.A; i <= KeyCode.Z; i++) { if (_inputState.IsKeyDown(i)) { mouseAndKeyboardStat = i; } } for (var i = KeyCode.F1; i <= KeyCode.F9; i++) { if (_inputState.IsKeyDown(i)) { mouseAndKeyboardStat = i; } } if (_inputState.IsKeyDown(KeyCode.Return)) { mouseAndKeyboardStat = KeyCode.Return; } if (_inputState.IsKeyDown(KeyCode.Backspace)) { mouseAndKeyboardStat = KeyCode.Backspace; } if (_inputState.IsKeyDown(KeyCode.Tab)) { mouseAndKeyboardStat = KeyCode.Tab; } if (_inputState.IsKeyDown(KeyCode.Space)) { mouseAndKeyboardStat = KeyCode.Space; } if ((Game.GameId == Scumm.IO.GameId.Indy4 || Game.GameId == Scumm.IO.GameId.Pass)) { var numpad = new int[] { '0', 335, 336, 337, 331, 332, 333, 327, 328, 329 }; for (var i = KeyCode.D0; i <= KeyCode.D9; i++) { if (_inputState.IsKeyDown(i)) { mouseAndKeyboardStat = (KeyCode)numpad[i - KeyCode.D0]; } } } else { for (var i = KeyCode.D0; i <= KeyCode.D9; i++) { if (_inputState.IsKeyDown(i)) { mouseAndKeyboardStat = i - (int)KeyCode.D0 + '0'; } } } _mousePos = _inputManager.GetMousePosition(); if (_mousePos.X < 0) _mousePos.X = 0; if (_mousePos.X > ScreenWidth - 1) _mousePos.X = (short)(ScreenWidth - 1); if (_mousePos.Y < 0) _mousePos.Y = 0; if (_mousePos.Y > ScreenHeight - 1) _mousePos.Y = (short)(ScreenHeight - 1); var mouseX = (ScreenStartStrip * 8) + _mousePos.X; var mouseY = _mousePos.Y - MainVirtScreen.TopLine + ((_game.Version >= 7) ? ScreenTop : 0); if (Game.Version >= 3) { Variables[VariableMouseX.Value] = _mousePos.X; Variables[VariableMouseY.Value] = _mousePos.Y; Variables[VariableVirtualMouseX.Value] = mouseX; Variables[VariableVirtualMouseY.Value] = mouseY; } else if (Game.Version >= 1) { // We use shifts below instead of dividing by V12_X_MULTIPLIER resp. // V12_Y_MULTIPLIER to handle negative coordinates correctly. // This fixes e.g. bugs #1328131 and #1537595. Variables[VariableVirtualMouseX.Value] = mouseX >> V12_X_SHIFT; Variables[VariableVirtualMouseY.Value] = mouseY >> V12_Y_SHIFT; // Adjust mouse coordinates as narrow rooms in NES are centered // if (_game.platform == Common::kPlatformNES && _NESStartStrip > 0) // { // VAR(VAR_VIRT_MOUSE_X) -= 2; // if (VAR(VAR_VIRT_MOUSE_X) < 0) // VAR(VAR_VIRT_MOUSE_X) = 0; // } } }
internal protected virtual void ProcessInput() { // // Determine the mouse button state. // mouseAndKeyboardStat = 0; if (_leftBtnPressed.HasFlag(MouseButtonStatus.Clicked) && _rightBtnPressed.HasFlag(MouseButtonStatus.Clicked)) { // Pressing both mouse buttons is treated as if you pressed // the cutscene exit key (ESC) in V4+ games. That mimicks // the behavior of the original engine where pressing both // mouse buttons also skips the current cutscene. mouseAndKeyboardStat = 0; // lastKeyHit = Common::KeyState(Common::KEYCODE_ESCAPE); } else if (_rightBtnPressed.HasFlag(MouseButtonStatus.Clicked) && (Game.Version <= 3 && Game.GameId != GameId.Loom)) { // Pressing right mouse button is treated as if you pressed // the cutscene exit key (ESC) in V0-V3 games. That mimicks // the behavior of the original engine where pressing right // mouse button also skips the current cutscene. mouseAndKeyboardStat = 0; // lastKeyHit = Common::KeyState(Common::KEYCODE_ESCAPE); } else if (_leftBtnPressed.HasFlag(MouseButtonStatus.Clicked)) { mouseAndKeyboardStat = (KeyCode)ScummMouseButtonState.LeftClick; } else if (_rightBtnPressed.HasFlag(MouseButtonStatus.Clicked)) { mouseAndKeyboardStat = (KeyCode)ScummMouseButtonState.RightClick; } if (Game.Version >= 6) { Variables[VariableLeftButtonHold.Value] = _leftBtnPressed.HasFlag(MouseButtonStatus.Down) ? 1 : 0; Variables[VariableRightButtonHold.Value] = _rightBtnPressed.HasFlag(MouseButtonStatus.Down) ? 1 : 0; // scumm7: left/right button down if (Game.Version >= 7) { Variables[VariableLeftButtonDown.Value] = _leftBtnPressed.HasFlag(MouseButtonStatus.Clicked) ? 1 : 0; Variables[VariableRightButtonDown.Value] = _rightBtnPressed.HasFlag(MouseButtonStatus.Clicked) ? 1 : 0; } } _leftBtnPressed &= ~MouseButtonStatus.Clicked; _rightBtnPressed &= ~MouseButtonStatus.Clicked; var cutsceneExitKeyEnabled = (!VariableCutSceneExitKey.HasValue || Variables[VariableCutSceneExitKey.Value] != 0); var mainmenuKeyEnabled = !VariableMainMenu.HasValue || _variables[VariableMainMenu.Value] != 0; // For games which use VAR_MAINMENU_KEY, disable the mainmenu key if // requested by the scripts. We make an exception for COMI (i.e. // forcefully always enable it there), as that always disables it. if (Game.GameId == GameId.CurseOfMonkeyIsland) { mainmenuKeyEnabled = true; } if (cutsceneExitKeyEnabled && _inputState.IsKeyDown(KeyCode.Escape)) { AbortCutscene(); // VAR_CUTSCENEEXIT_KEY doesn't exist in SCUMM0 if (VariableCutSceneExitKey.HasValue) { mouseAndKeyboardStat = (KeyCode)Variables[VariableCutSceneExitKey.Value]; } } if (mainmenuKeyEnabled && _inputState.IsKeyDown(KeyCode.F5)) { if (VariableSaveLoadScript.HasValue && _currentRoom != 0) { RunScript(Variables[VariableSaveLoadScript.Value], false, false, new int[0]); } ShowMenu(); if (VariableSaveLoadScript2.HasValue && _currentRoom != 0) { RunScript(Variables[VariableSaveLoadScript2.Value], false, false, new int[0]); } } for (var i = KeyCode.A; i <= KeyCode.Z; i++) { if (_inputState.IsKeyDown(i)) { mouseAndKeyboardStat = i; } } for (var i = KeyCode.F1; i <= KeyCode.F9; i++) { if (_inputState.IsKeyDown(i)) { mouseAndKeyboardStat = i; } } if (_inputState.IsKeyDown(KeyCode.Return)) { mouseAndKeyboardStat = KeyCode.Return; } if (_inputState.IsKeyDown(KeyCode.Backspace)) { mouseAndKeyboardStat = KeyCode.Backspace; } if (_inputState.IsKeyDown(KeyCode.Tab)) { mouseAndKeyboardStat = KeyCode.Tab; } if (_inputState.IsKeyDown(KeyCode.Space)) { mouseAndKeyboardStat = KeyCode.Space; } if ((Game.GameId == Scumm.IO.GameId.Indy4 || Game.GameId == Scumm.IO.GameId.Pass)) { var numpad = new int[] { '0', 335, 336, 337, 331, 332, 333, 327, 328, 329 }; for (var i = KeyCode.D0; i <= KeyCode.D9; i++) { if (_inputState.IsKeyDown(i)) { mouseAndKeyboardStat = (KeyCode)numpad[i - KeyCode.D0]; } } } else { for (var i = KeyCode.D0; i <= KeyCode.D9; i++) { if (_inputState.IsKeyDown(i)) { mouseAndKeyboardStat = i - (int)KeyCode.D0 + '0'; } } } _mousePos = _inputManager.GetMousePosition(); if (_mousePos.X < 0) { _mousePos.X = 0; } if (_mousePos.X > ScreenWidth - 1) { _mousePos.X = (short)(ScreenWidth - 1); } if (_mousePos.Y < 0) { _mousePos.Y = 0; } if (_mousePos.Y > ScreenHeight - 1) { _mousePos.Y = (short)(ScreenHeight - 1); } var mouseX = (ScreenStartStrip * 8) + _mousePos.X; var mouseY = _mousePos.Y - MainVirtScreen.TopLine + ((_game.Version >= 7) ? ScreenTop : 0); if (Game.Version >= 3) { Variables[VariableMouseX.Value] = _mousePos.X; Variables[VariableMouseY.Value] = _mousePos.Y; Variables[VariableVirtualMouseX.Value] = mouseX; Variables[VariableVirtualMouseY.Value] = mouseY; } else if (Game.Version >= 1) { // We use shifts below instead of dividing by V12_X_MULTIPLIER resp. // V12_Y_MULTIPLIER to handle negative coordinates correctly. // This fixes e.g. bugs #1328131 and #1537595. Variables[VariableVirtualMouseX.Value] = mouseX >> V12_X_SHIFT; Variables[VariableVirtualMouseY.Value] = mouseY >> V12_Y_SHIFT; // Adjust mouse coordinates as narrow rooms in NES are centered // if (_game.platform == Common::kPlatformNES && _NESStartStrip > 0) // { // VAR(VAR_VIRT_MOUSE_X) -= 2; // if (VAR(VAR_VIRT_MOUSE_X) < 0) // VAR(VAR_VIRT_MOUSE_X) = 0; // } } }
public void Update() { // マウスの座標を取得 // DxLibだと、ウィンドウを移動させるとなぜかマウス座標がズレるので mouse_sutatus.position.X = System.Windows.Forms.Cursor.Position.X; mouse_sutatus.position.Y = System.Windows.Forms.Cursor.Position.Y; mouse_sutatus.position = mouse_target_form.PointToClient(mouse_sutatus.position); for (int i = 0; i < 2; i++) { MouseButtonStatus mbs = mouse_sutatus.left; bool is_key_on = false; if (i == 1) { mbs = mouse_sutatus.right; is_key_on = (Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right; } else { is_key_on = (Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left; } switch (mbs.key_status) { case MouseButtonKeyStatus.Free: if (mbs.is_key_down) { if (!is_key_on) // 前回まで On 今回 Of = 離した = クリックした とする { // とりあえず、単純なワンクリックのみ対応 mbs.key_status = MouseButtonKeyStatus.OneCrick; } } break; case MouseButtonKeyStatus.OneCrick: mbs.key_status = MouseButtonKeyStatus.Free; // ワンクリック状態は継続しないのでFreeに戻しておく break; } mbs.is_key_down = is_key_on; } // 監視している各キーの状態を前回の状態を基準に更新する foreach (var v0 in key_status) { var v = v0.Value; switch (v.key_status) { case KeyInputStatus.Free: if (DX.CheckHitKey(v.key_code_dx_lib) == DX.TRUE) { v.key_status = KeyInputStatus.Down; } break; case KeyInputStatus.Down: if (DX.CheckHitKey(v.key_code_dx_lib) == DX.TRUE) { v.key_status = KeyInputStatus.DownStay; } else { v.key_status = KeyInputStatus.Up; } break; case KeyInputStatus.DownStay: if (DX.CheckHitKey(v.key_code_dx_lib) != DX.TRUE) { v.key_status = KeyInputStatus.Up; } break; case KeyInputStatus.Up: if (DX.CheckHitKey(v.key_code_dx_lib) == DX.TRUE) { v.key_status = KeyInputStatus.Down; } else { v.key_status = KeyInputStatus.Free; } break; } } }