From 0fb4a1ddd228cdcedb1313aa8df6ac2b9ba97530 Mon Sep 17 00:00:00 2001 From: Simei Yin Date: Thu, 20 Jul 2017 19:08:53 +0200 Subject: SLUDGE: Objectify input and event handler --- engines/sludge/event.cpp | 355 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 355 insertions(+) create mode 100644 engines/sludge/event.cpp (limited to 'engines/sludge/event.cpp') diff --git a/engines/sludge/event.cpp b/engines/sludge/event.cpp new file mode 100644 index 0000000000..5ab237b3c8 --- /dev/null +++ b/engines/sludge/event.cpp @@ -0,0 +1,355 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/events.h" +#include "common/keyboard.h" + +#include "sludge/event.h" +#include "sludge/freeze.h" +#include "sludge/graphics.h" +#include "sludge/newfatal.h" +#include "sludge/region.h" +#include "sludge/sludge.h" +#include "sludge/sludger.h" +#include "sludge/variable.h" + +namespace Sludge { + +extern Variable *launchResult; +extern VariableStack *noStack; +extern ScreenRegion *overRegion; +extern ScreenRegion *lastRegion; + +EventManager::EventManager(SludgeEngine *vm) { + _vm = vm; + + _weAreDoneSoQuit = 0; + + + for (uint i = 0; i < EVENT_FUNC_NB; ++i) { + _mainHandlers.func[i] = 0; + } + _currentEvents = &_mainHandlers; +} + +EventManager::~EventManager() { + +} + +void EventManager::checkInput() { + float cameraZoom = _vm->_gfxMan->getCamZoom(); +#if 0 + static bool fakeRightclick = false; +#endif + Common::Event event; + + /* Check for events */ + while (g_system->getEventManager()->pollEvent(event)) { + switch (event.type) { +#if 0 + case SDL_VIDEORESIZE: + realWinWidth = event.resize.w; + realWinHeight = event.resize.h; + setGraphicsWindow(false, true, true); + break; +#endif + case Common::EVENT_MOUSEMOVE: + _input.justMoved = true; + _input.mouseX = event.mouse.x * cameraZoom; + _input.mouseY = event.mouse.y * cameraZoom; + break; + + case Common::EVENT_LBUTTONDOWN: + _input.leftClick = true; + _input.mouseX = event.mouse.x * cameraZoom; + _input.mouseY = event.mouse.y * cameraZoom; +#if 0 + if (SDL_GetModState() & KMOD_CTRL) { + input.rightClick = true; + fakeRightclick = true; + } else { + input.leftClick = true; + fakeRightclick = false; + } +#endif + break; + + case Common::EVENT_RBUTTONDOWN: + _input.rightClick = true; + _input.mouseX = event.mouse.x * cameraZoom; + _input.mouseY = event.mouse.y * cameraZoom; + break; + + case Common::EVENT_LBUTTONUP: + _input.leftRelease = true; + _input.mouseX = event.mouse.x * cameraZoom; + _input.mouseY = event.mouse.y * cameraZoom; + break; + + case Common::EVENT_RBUTTONUP: + _input.rightRelease = true; + _input.mouseX = event.mouse.x * cameraZoom; + _input.mouseY = event.mouse.y * cameraZoom; + break; + + case Common::EVENT_KEYDOWN: + switch (event.kbd.keycode) { + + case Common::KEYCODE_BACKSPACE: + // fall through + case Common::KEYCODE_DELETE: + _input.keyPressed = Common::KEYCODE_DELETE; + break; + default: + _input.keyPressed = event.kbd.keycode; + break; + } + break; + + case Common::EVENT_QUIT: + _weAreDoneSoQuit = 1; + // TODO: if reallyWantToQuit, popup a message box to confirm + break; + + default: + break; + } + } +} + +bool EventManager::handleInput() { + static int l = 0; + + if (!g_sludge->launchMe.empty()) { + if (l) { + // Still paused because of spawned thingy... + } else { + l = 1; + + setVariable(*launchResult, SVT_INT, 0/*launch(launchMe) > 31*/); //TODO:false value + g_sludge->launchMe.clear(); + launchResult = nullptr; + } + return true; + } else { + l = 0; + } + + if (!overRegion) + getOverRegion(); + + if (_input.justMoved) { + if (_currentEvents->func[kMoveMouse]) { + if (!startNewFunctionNum(_currentEvents->func[kMoveMouse], 0, nullptr, noStack)) + return false; + } + } + _input.justMoved = false; + + if (lastRegion != overRegion && _currentEvents->func[kFocus]) { + VariableStack *tempStack = new VariableStack; + if (!checkNew(tempStack)) + return false; + + initVarNew(tempStack->thisVar); + if (overRegion) { + setVariable(tempStack->thisVar, SVT_OBJTYPE, overRegion->thisType->objectNum); + } else { + setVariable(tempStack->thisVar, SVT_INT, 0); + } + tempStack->next = nullptr; + if (!startNewFunctionNum(_currentEvents->func[kFocus], 1, nullptr, tempStack)) + return false; + } + if (_input.leftRelease && _currentEvents->func[kLeftMouseUp]) { + if (!startNewFunctionNum(_currentEvents->func[kLeftMouseUp], 0, nullptr, noStack)) + return false; + } + if (_input.rightRelease && _currentEvents->func[kRightMouseUp]) { + if (!startNewFunctionNum(_currentEvents->func[kRightMouseUp], 0, nullptr, noStack)) + return false; + } + if (_input.leftClick && _currentEvents->func[kLeftMouse]) + if (!startNewFunctionNum(_currentEvents->func[kLeftMouse], 0, nullptr, noStack)) + return false; + if (_input.rightClick && _currentEvents->func[kRightMouse]) { + if (!startNewFunctionNum(_currentEvents->func[kRightMouse], 0, nullptr, noStack)) + return false; + } + if (_input.keyPressed && _currentEvents->func[kSpace]) { + Common::String tempString = ""; + switch (_input.keyPressed) { + case 127: + tempString = "BACKSPACE"; + break; + case 9: + tempString = "TAB"; + break; + case 13: + tempString = "ENTER"; + break; + case 27: + tempString = "ESCAPE"; + break; + /* + case 1112: tempString = copyString ("ALT+F1"); break; + case 1113: tempString = copyString ("ALT+F2"); break; + case 1114: tempString = copyString ("ALT+F3"); break; + case 1115: tempString = copyString ("ALT+F4"); break; + case 1116: tempString = copyString ("ALT+F5"); break; + case 1117: tempString = copyString ("ALT+F6"); break; + case 1118: tempString = copyString ("ALT+F7"); break; + case 1119: tempString = copyString ("ALT+F8"); break; + case 1120: tempString = copyString ("ALT+F9"); break; + case 1121: tempString = copyString ("ALT+F10"); break; + case 1122: tempString = copyString ("ALT+F11"); break; + case 1123: tempString = copyString ("ALT+F12"); break; + + case 2019: tempString = copyString ("PAUSE"); break; + */ + case 63276: + tempString = "PAGE UP"; + break; + case 63277: + tempString = "PAGE DOWN"; + break; + case 63275: + tempString = "END"; + break; + case 63273: + tempString = "HOME"; + break; + case 63234: + tempString = "LEFT"; + break; + case 63232: + tempString = "UP"; + break; + case 63235: + tempString = "RIGHT"; + break; + case 63233: + tempString = "DOWN"; + break; + /* + case 2045: tempString = copyString ("INSERT"); break; + case 2046: tempString = copyString ("DELETE"); break; + */ + case 63236: + tempString = "F1"; + break; + case 63237: + tempString = "F2"; + break; + case 63238: + tempString = "F3"; + break; + case 63239: + tempString = "F4"; + break; + case 63240: + tempString = "F5"; + break; + case 63241: + tempString = "F6"; + break; + case 63242: + tempString = "F7"; + break; + case 63243: + tempString = "F8"; + break; + case 63244: + tempString = "F9"; + break; + case 63245: + tempString = "F10"; + break; + case 63246: + tempString = "F11"; + break; + case 63247: + tempString = "F12"; + break; + + default: + if (_input.keyPressed >= 256) { + char tmp[7] = "ABCDEF"; + sprintf(tmp, "%i", _input.keyPressed); + tempString = tmp; + //} + } else { + char tmp[2] = " "; + tmp[0] = _input.keyPressed; + tempString = tmp; + } + } + + if (!tempString.empty()) { + VariableStack *tempStack = new VariableStack; + if (!checkNew(tempStack)) + return false; + initVarNew(tempStack->thisVar); + makeTextVar(tempStack->thisVar, tempString); + tempStack->next = nullptr; + if (!startNewFunctionNum(_currentEvents->func[kSpace], 1, nullptr, tempStack)) + return false; + } + } + _input.rightClick = false; + _input.leftClick = false; + _input.rightRelease = false; + _input.leftRelease = false; + _input.keyPressed = 0; + lastRegion = overRegion; + return true; +} + +void EventManager::loadHandlers(Common::SeekableReadStream *stream) { + for (uint i = 0; i < EVENT_FUNC_NB; ++i) { + _currentEvents->func[i] = stream->readUint16BE(); + } +} + +void EventManager::saveHandlers(Common::WriteStream *stream) { + for (uint i = 0; i < EVENT_FUNC_NB; ++i) { + stream->writeUint16BE(_currentEvents->func[i]); + } +} + +bool EventManager::freeze(FrozenStuffStruct *frozenStuff) { + frozenStuff->currentEvents = _currentEvents; + _currentEvents = new EventHandlers; + if (!checkNew(_currentEvents)) + return false; + for (uint i = 0; i < EVENT_FUNC_NB; ++i) { + _currentEvents->func[i] = 0; + } + return true; +} + +void EventManager::restore(FrozenStuffStruct *frozenStuff) { + delete _currentEvents; + _currentEvents = frozenStuff->currentEvents; +} + +} /* namespace Sludge */ -- cgit v1.2.3