diff options
author | Arnaud Boutonné | 2010-10-12 21:12:54 +0000 |
---|---|---|
committer | Arnaud Boutonné | 2010-10-12 21:12:54 +0000 |
commit | 7723d91c957d07205c51be32498d45cd0a78568f (patch) | |
tree | 7dc993a5df65accbc0b5625ecffca487298fd1c8 /engines | |
parent | dbde2e46e3c44a795b8597ea3c2b6c7503dfbbef (diff) | |
download | scummvm-rg350-7723d91c957d07205c51be32498d45cd0a78568f.tar.gz scummvm-rg350-7723d91c957d07205c51be32498d45cd0a78568f.tar.bz2 scummvm-rg350-7723d91c957d07205c51be32498d45cd0a78568f.zip |
HUGO: Add lineHandler for v3 Dos, fix/add comments
svn-id: r53170
Diffstat (limited to 'engines')
-rw-r--r-- | engines/hugo/hugo.cpp | 2 | ||||
-rw-r--r-- | engines/hugo/module.mk | 1 | ||||
-rw-r--r-- | engines/hugo/parser.cpp | 2 | ||||
-rw-r--r-- | engines/hugo/parser.h | 18 | ||||
-rw-r--r-- | engines/hugo/parser_v3d.cpp | 203 | ||||
-rw-r--r-- | engines/hugo/route.cpp | 4 |
6 files changed, 224 insertions, 6 deletions
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp index 100f3b85f2..cdc74b5ae5 100644 --- a/engines/hugo/hugo.cpp +++ b/engines/hugo/hugo.cpp @@ -198,7 +198,7 @@ Common::Error HugoEngine::run() { _scheduler = new Scheduler_v3d(*this); _introHandler = new intro_v3d(*this); _screen = new Screen_v1d(*this); - _parser = new Parser_v1w(*this); + _parser = new Parser_v3d(*this); break; } diff --git a/engines/hugo/module.mk b/engines/hugo/module.mk index 1f2b3ac65e..b646a3672d 100644 --- a/engines/hugo/module.mk +++ b/engines/hugo/module.mk @@ -25,6 +25,7 @@ MODULE_OBJS := \ parser_v1w.o \ parser_v1d.o \ parser_v2d.o \ + parser_v3d.o \ route.o \ schedule.o \ schedule_v1d.o \ diff --git a/engines/hugo/parser.cpp b/engines/hugo/parser.cpp index 0a4ca3a5a8..4277d6e845 100644 --- a/engines/hugo/parser.cpp +++ b/engines/hugo/parser.cpp @@ -121,7 +121,7 @@ void Parser::keyHandler(uint16 nChar, uint16 nFlags) { } // Add any new chars to line buffer and display them. -// If CR pressed, pass line to Line_handler() +// If CR pressed, pass line to LineHandler() void Parser::charHandler() { debugC(4, kDebugParser, "charHandler"); diff --git a/engines/hugo/parser.h b/engines/hugo/parser.h index 245dded5f2..5226304d51 100644 --- a/engines/hugo/parser.h +++ b/engines/hugo/parser.h @@ -81,14 +81,16 @@ public: virtual void lineHandler(); -private: +protected: bool isBackgroundWord(objectList_t obj); bool isCatchallVerb(objectList_t obj); bool isGenericVerb(object_t *obj, char *comment); - bool isNear(object_t *obj, char *verb, char *comment); bool isObjectVerb(object_t *obj, char *comment); - void dropObject(object_t *obj); void takeObject(object_t *obj); + +private: + bool isNear(object_t *obj, char *verb, char *comment); + void dropObject(object_t *obj); }; class Parser_v1d : public Parser { @@ -96,7 +98,7 @@ public: Parser_v1d(HugoEngine &vm); ~Parser_v1d(); - void lineHandler(); + virtual void lineHandler(); protected: bool isNear(char *verb, char *noun, object_t *obj, char *comment); @@ -117,6 +119,14 @@ public: void lineHandler(); }; +class Parser_v3d : public Parser_v1w { +public: + Parser_v3d(HugoEngine &vm); + ~Parser_v3d(); + + void lineHandler(); +}; + } // End of namespace Hugo #endif //HUGO_PARSER_H diff --git a/engines/hugo/parser_v3d.cpp b/engines/hugo/parser_v3d.cpp new file mode 100644 index 0000000000..501d8fba20 --- /dev/null +++ b/engines/hugo/parser_v3d.cpp @@ -0,0 +1,203 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +/* + * This code is based on original Hugo Trilogy source code + * + * Copyright (c) 1989-1995 David P. Gray + * + */ + +// parser.c - handles all keyboard/command input + +#include "common/system.h" + +#include "hugo/hugo.h" +#include "hugo/parser.h" +#include "hugo/schedule.h" +#include "hugo/util.h" +#include "hugo/sound.h" + +namespace Hugo { + +Parser_v3d::Parser_v3d(HugoEngine &vm) : Parser_v1w(vm) { +} + +Parser_v3d::~Parser_v3d() { +} + +// Parse the user's line of text input. Generate events as necessary +void Parser_v3d::lineHandler() { + debugC(1, kDebugParser, "lineHandler()"); + + status_t &gameStatus = _vm.getGameStatus(); + + // Toggle God Mode + if (!strncmp(_line, "PPG", 3)) { + _vm.sound().playSound(!_vm._soundTest, BOTH_CHANNELS, HIGH_PRI); + gameStatus.godModeFl ^= 1; + return; + } + + Utils::strlwr(_line); // Convert to lower case + + // God Mode cheat commands: + // goto <screen> Takes hero to named screen + // fetch <object name> Hero carries named object + // fetch all Hero carries all possible objects + // find <object name> Takes hero to screen containing named object + if (gameStatus.godModeFl) { + // Special code to allow me to go straight to any screen + if (strstr(_line, "goto")) { + for (int i = 0; i < _vm._numScreens; i++) { + if (!strcmp(&_line[strlen("goto") + 1], _vm._screenNames[i])) { + _vm.scheduler().newScreen(i); + return; + } + } + } + + // Special code to allow me to get objects from anywhere + if (strstr(_line, "fetch all")) { + for (int i = 0; i < _vm._numObj; i++) { + if (_vm._objects[i].genericCmd & TAKE) + takeObject(&_vm._objects[i]); + } + return; + } + + if (strstr(_line, "fetch")) { + for (int i = 0; i < _vm._numObj; i++) { + if (!strcmp(&_line[strlen("fetch") + 1], _vm._arrayNouns[_vm._objects[i].nounIndex][0])) { + takeObject(&_vm._objects[i]); + return; + } + } + } + + // Special code to allow me to goto objects + if (strstr(_line, "find")) { + for (int i = 0; i < _vm._numObj; i++) { + if (!strcmp(&_line[strlen("find") + 1], _vm._arrayNouns[_vm._objects[i].nounIndex][0])) { + _vm.scheduler().newScreen(_vm._objects[i].screenIndex); + return; + } + } + } + } + + // Special meta commands + // EXIT/QUIT + if (!strcmp("exit", _line) || strstr(_line, "quit")) { + if (Utils::Box(BOX_YESNO, "%s", _vm._textParser[kTBExit_1d]) != 0) + _vm.endGame(); + else + return; + } + + // SAVE/RESTORE + if (!strcmp("save", _line)) { + _config.soundFl = false; + if (gameStatus.gameOverFl) + Utils::gameOverMsg(); + else +// _vm.file().saveOrRestore(true); + warning("STUB: saveOrRestore()"); + return; + } + + if (!strcmp("restore", _line)) { + _config.soundFl = false; +// _vm.file().saveOrRestore(false); + warning("STUB: saveOrRestore()"); + return; + } + + // Empty line + if (*_line == '\0') // Empty line + return; + if (strspn(_line, " ") == strlen(_line)) // Nothing but spaces! + return; + + if (gameStatus.gameOverFl) { + // No commands allowed! + Utils::gameOverMsg(); + return; + } + + char farComment[XBYTES * 5] = ""; // hold 5 line comment if object not nearby + + // Test for nearby objects referenced explicitly + for (int i = 0; i < _vm._numObj; i++) { + object_t *obj = &_vm._objects[i]; + if (isWordPresent(_vm._arrayNouns[obj->nounIndex])) { + if (isObjectVerb(obj, farComment) || isGenericVerb(obj, farComment)) + return; + } + } + + // Test for nearby objects that only require a verb + // Note comment is unused if not near. + for (int i = 0; i < _vm._numObj; i++) { + object_t *obj = &_vm._objects[i]; + if (obj->verbOnlyFl) { + char contextComment[XBYTES * 5] = ""; // Unused comment for context objects + if (isObjectVerb(obj, contextComment) || isGenericVerb(obj, contextComment)) + return; + } + } + + // No objects match command line, try background and catchall commands + if (isBackgroundWord(_vm._backgroundObjects[*_vm._screen_p])) + return; + if (isCatchallVerb(_vm._backgroundObjects[*_vm._screen_p])) + return; + if (isBackgroundWord(_vm._catchallList)) + return; + if (isCatchallVerb(_vm._catchallList)) + return; + + // If a not-near comment was generated, print it + if (*farComment != '\0') { + Utils::Box(BOX_ANY, "%s", farComment); + return; + } + + // Nothing matches. Report recognition success to user. + char *verb = findVerb(); + char *noun = findNoun(); + + if (verb && noun) { // A combination I didn't think of + Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBNoPoint]); + } else if (noun) { + Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBNoun]); + } else if (verb) { + Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBVerb]); + } else { + Utils::Box(BOX_ANY, "%s", _vm._textParser[kTBEh]); + } +} + +} // End of namespace Hugo diff --git a/engines/hugo/route.cpp b/engines/hugo/route.cpp index e960a3b505..2ba95fb7d7 100644 --- a/engines/hugo/route.cpp +++ b/engines/hugo/route.cpp @@ -111,18 +111,22 @@ void Route::setWalk(uint16 direction) { break; case Common::KEYCODE_HOME: obj->vx = -DX; + // Note: in v1 Dos and v2 Dos, obj->vy is set to DY obj->vy = -DY / 2; break; case Common::KEYCODE_END: obj->vx = -DX; + // Note: in v1 Dos and v2 Dos, obj->vy is set to -DY obj->vy = DY / 2; break; case Common::KEYCODE_PAGEUP: obj->vx = DX; + // Note: in v1 Dos and v2 Dos, obj->vy is set to -DY obj->vy = -DY / 2; break; case Common::KEYCODE_PAGEDOWN: obj->vx = DX; + // Note: in v1 Dos and v2 Dos, obj->vy is set to DY obj->vy = DY / 2; break; } |