From 4873330d239554b359564c8452a4fd2c6b7c5091 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 14 Apr 2017 18:48:20 +0200 Subject: DIRECTOR: Lingo: Added stub for generic event handlers --- engines/director/lingo/lingo-events.cpp | 174 ++++++++++++++++++++++++++++++++ engines/director/lingo/lingo.cpp | 103 +------------------ engines/director/lingo/lingo.h | 19 +++- engines/director/module.mk | 1 + 4 files changed, 191 insertions(+), 106 deletions(-) create mode 100644 engines/director/lingo/lingo-events.cpp diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp new file mode 100644 index 0000000000..21758bcc54 --- /dev/null +++ b/engines/director/lingo/lingo-events.cpp @@ -0,0 +1,174 @@ +/* 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 "director/lingo/lingo.h" + +namespace Director { + +struct EventHandlerType { + LEvent handler; + const char *name; +} static const eventHandlerDescs[] = { + { kEventPrepareMovie, "prepareMovie" }, + { kEventStartMovie, "startMovie" }, // D3? + { kEventStepMovie, "stepMovie" }, // D3? + { kEventStopMovie, "stopMovie" }, // D3? + + { kEventNew, "newSprite" }, + { kEventBeginSprite, "beginSprite" }, + { kEventEndSprite, "endSprite" }, + + { kEventEnterFrame, "enterFrame" }, // D4 + { kEventPrepareFrame, "prepareFrame" }, + { kEventIdle, "idle" }, + { kEventStepFrame, "stepFrame"}, + { kEventExitFrame, "exitFrame" }, // D4 + + { kEventActivateWindow, "activateWindow" }, + { kEventDeactivateWindow, "deactivateWindow" }, + { kEventMoveWindow, "moveWindow" }, + { kEventResizeWindow, "resizeWindow" }, + { kEventOpenWindow, "openWindow" }, + { kEventCloseWindow, "closeWindow" }, + { kEventStart, "start" }, + + { kEventKeyUp, "keyUp" }, // D4 + { kEventKeyDown, "keyDown" }, // D2 w D4 (as when from D2) + { kEventMouseUp, "mouseUp" }, // D2 w D3? + { kEventMouseDown, "mouseDown" }, // D2 w D3? + { kEventRightMouseDown, "rightMouseDown" }, + { kEventRightMouseUp, "rightMouseUp" }, + { kEventMouseEnter, "mouseEnter" }, + { kEventMouseLeave, "mouseLeave" }, + { kEventMouseUpOutSide, "mouseUpOutSide" }, + { kEventMouseWithin, "mouseWithin" }, + + { kEventTimeout, "timeout" }, // D2 as when + + { kEventNone, 0 }, +}; + +void Lingo::initEventHandlerTypes() { + for (const EventHandlerType *t = &eventHandlerDescs[0]; t->handler != kEventNone; ++t) { + _eventHandlerTypeIds[t->name] = t->handler; + _eventHandlerTypes[t->handler] = t->name; + } +} + +ScriptType Lingo::event2script(LEvent ev) { + if (_vm->getVersion() < 4) { + switch (ev) { + //case kEventStartMovie: // We are precompiling it now + // return kMovieScript; + case kEventEnterFrame: + return kFrameScript; + default: + return kNoneScript; + } + } + + return kNoneScript; +} + +Symbol *Lingo::getHandler(Common::String &name) { + if (!_eventHandlerTypeIds.contains(name)) { + if (_builtins.contains(name)) + return _builtins[name]; + + return NULL; + } + + uint32 entityIndex = ENTITY_INDEX(_eventHandlerTypeIds[name], _currentEntityId); + if (!_handlers.contains(entityIndex)) + return NULL; + + return _handlers[entityIndex]; +} + +void Lingo::processInputEvent(LEvent event) { + // Primary Event handler + // Score Script + // Script of Cast Member + // Score Script + // Movie Script +} + +void Lingo::processFrameEvent(LEvent event) { + // Primary Event handler + // Score Script + // Movie Script +} + +void Lingo::processGenericEvent(LEvent event) { + // Primary Event handler + // Movie Script +} + +void Lingo::processEvent(LEvent event) { + switch (event) { + case kEventKeyUp: + case kEventKeyDown: + case kEventMouseUp: + case kEventMouseDown: + processInputEvent(event); + break; + + case kEventEnterFrame: + case kEventExitFrame: + processFrameEvent(event); + break; + + case kEventStartMovie: + case kEventStopMovie: + case kEventIdle: + case kEventTimeout: + processGenericEvent(event); + + default: + warning("processEvent: Unhandled event %s", _eventHandlerTypes[event]); + } +} + +void Lingo::processEvent(LEvent event, ScriptType st, int entityId) { + if (entityId < 0) + return; + + debugC(9, kDebugEvents, "Lingo::processEvent(%s, %s, %d)", _eventHandlerTypes[event], scriptType2str(st), entityId); + + _currentEntityId = entityId; + + if (!_eventHandlerTypes.contains(event)) + error("processEvent: Unknown event %d for entity %d", event, entityId); + + if (_handlers.contains(ENTITY_INDEX(event, entityId))) { + debugC(1, kDebugEvents, "Lingo::processEvent(%s, %s, %d), _eventHandler", _eventHandlerTypes[event], scriptType2str(st), entityId); + call(_eventHandlerTypes[event], 0); // D4+ Events + } else if (event == kEventNone && _scripts[st].contains(entityId)) { + debugC(1, kDebugEvents, "Lingo::processEvent(%s, %s, %d), script", _eventHandlerTypes[event], scriptType2str(st), entityId); + + executeScript(st, entityId); // D3 list of scripts. + } else { + //debugC(3, kDebugLingoExec, "STUB: processEvent(%s) for %d", _eventHandlerTypes[event], entityId); + } +} + +} // End of namespace Director diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp index 482531d455..cb16431d77 100644 --- a/engines/director/lingo/lingo.cpp +++ b/engines/director/lingo/lingo.cpp @@ -31,49 +31,6 @@ namespace Director { Lingo *g_lingo; -struct EventHandlerType { - LEvent handler; - const char *name; -} static const eventHandlerDescs[] = { - { kEventPrepareMovie, "prepareMovie" }, - { kEventStartMovie, "startMovie" }, // D3? - { kEventStepMovie, "stepMovie" }, // D3? - { kEventStopMovie, "stopMovie" }, // D3? - - { kEventNew, "newSprite" }, - { kEventBeginSprite, "beginSprite" }, - { kEventEndSprite, "endSprite" }, - - { kEventEnterFrame, "enterFrame" }, // D4 - { kEventPrepareFrame, "prepareFrame" }, - { kEventIdle, "idle" }, - { kEventStepFrame, "stepFrame"}, - { kEventExitFrame, "exitFrame" }, // D4 - - { kEventActivateWindow, "activateWindow" }, - { kEventDeactivateWindow, "deactivateWindow" }, - { kEventMoveWindow, "moveWindow" }, - { kEventResizeWindow, "resizeWindow" }, - { kEventOpenWindow, "openWindow" }, - { kEventCloseWindow, "closeWindow" }, - { kEventStart, "start" }, - - { kEventKeyUp, "keyUp" }, // D4 - { kEventKeyDown, "keyDown" }, // D2 w D4 (as when from D2) - { kEventMouseUp, "mouseUp" }, // D2 w D3? - { kEventMouseDown, "mouseDown" }, // D2 w D3? - { kEventRightMouseDown, "rightMouseDown" }, - { kEventRightMouseUp, "rightMouseUp" }, - { kEventMouseEnter, "mouseEnter" }, - { kEventMouseLeave, "mouseLeave" }, - { kEventMouseUpOutSide, "mouseUpOutSide" }, - { kEventMouseWithin, "mouseWithin" }, - - { kEventTimeout, "timeout" }, // D2 as when - - { kEventNone, 0 }, -}; - Symbol::Symbol() { type = VOID; u.s = NULL; @@ -86,11 +43,6 @@ Symbol::Symbol() { Lingo::Lingo(DirectorEngine *vm) : _vm(vm) { g_lingo = this; - for (const EventHandlerType *t = &eventHandlerDescs[0]; t->handler != kEventNone; ++t) { - _eventHandlerTypeIds[t->name] = t->handler; - _eventHandlerTypes[t->handler] = t->name; - } - _currentScript = 0; _currentScriptType = kMovieScript; _currentEntityId = 0; @@ -115,6 +67,8 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) { _localvars = NULL; + initEventHandlerTypes(); + initBuiltIns(); initFuncs(); initTheEntities(); @@ -265,59 +219,6 @@ void Lingo::executeScript(ScriptType type, uint16 id) { cleanLocalVars(); } -ScriptType Lingo::event2script(LEvent ev) { - if (_vm->getVersion() < 4) { - switch (ev) { - //case kEventStartMovie: // We are precompiling it now - // return kMovieScript; - case kEventEnterFrame: - return kFrameScript; - default: - return kNoneScript; - } - } - - return kNoneScript; -} - -Symbol *Lingo::getHandler(Common::String &name) { - if (!_eventHandlerTypeIds.contains(name)) { - if (_builtins.contains(name)) - return _builtins[name]; - - return NULL; - } - - uint32 entityIndex = ENTITY_INDEX(_eventHandlerTypeIds[name], _currentEntityId); - if (!_handlers.contains(entityIndex)) - return NULL; - - return _handlers[entityIndex]; -} - -void Lingo::processEvent(LEvent event, ScriptType st, int entityId) { - if (entityId < 0) - return; - - debugC(9, kDebugEvents, "Lingo::processEvent(%s, %s, %d)", _eventHandlerTypes[event], scriptType2str(st), entityId); - - _currentEntityId = entityId; - - if (!_eventHandlerTypes.contains(event)) - error("processEvent: Unknown event %d for entity %d", event, entityId); - - if (_handlers.contains(ENTITY_INDEX(event, entityId))) { - debugC(1, kDebugEvents, "Lingo::processEvent(%s, %s, %d), _eventHandler", _eventHandlerTypes[event], scriptType2str(st), entityId); - call(_eventHandlerTypes[event], 0); // D4+ Events - } else if (event == kEventNone && _scripts[st].contains(entityId)) { - debugC(1, kDebugEvents, "Lingo::processEvent(%s, %s, %d), script", _eventHandlerTypes[event], scriptType2str(st), entityId); - - executeScript(st, entityId); // D3 list of scripts. - } else { - //debugC(3, kDebugLingoExec, "STUB: processEvent(%s) for %d", _eventHandlerTypes[event], entityId); - } -} - void Lingo::restartLingo() { warning("STUB: restartLingo()"); diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h index 8475905690..15071b8699 100644 --- a/engines/director/lingo/lingo.h +++ b/engines/director/lingo/lingo.h @@ -181,11 +181,6 @@ public: void printStack(const char *s); Common::String decodeInstruction(uint pc, uint *newPC = NULL); - ScriptType event2script(LEvent ev); - Symbol *getHandler(Common::String &name); - - void processEvent(LEvent event, ScriptType st, int entityId); - void initBuiltIns(); void initFuncs(); void initTheEntities(); @@ -195,6 +190,20 @@ public: private: const char *findNextDefinition(const char *s); + // lingo-events.cpp +private: + void initEventHandlerTypes(); + void processInputEvent(LEvent event); + void processFrameEvent(LEvent event); + void processGenericEvent(LEvent event); + +public: + ScriptType event2script(LEvent ev); + Symbol *getHandler(Common::String &name); + + void processEvent(LEvent event, ScriptType st, int entityId); + void processEvent(LEvent event); + public: void execute(uint pc); void pushContext(); diff --git a/engines/director/module.mk b/engines/director/module.mk index 28260ea5c3..acfc4fdb53 100644 --- a/engines/director/module.mk +++ b/engines/director/module.mk @@ -20,6 +20,7 @@ MODULE_OBJS = \ lingo/lingo-builtins.o \ lingo/lingo-code.o \ lingo/lingo-codegen.o \ + lingo/lingo-events.o \ lingo/lingo-funcs.o \ lingo/lingo-lex.o \ lingo/lingo-the.o -- cgit v1.2.3