[Scummvm-cvs-logs] SF.net SVN: scummvm:[53170] scummvm/trunk/engines/hugo

strangerke at users.sourceforge.net strangerke at users.sourceforge.net
Tue Oct 12 23:12:55 CEST 2010


Revision: 53170
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53170&view=rev
Author:   strangerke
Date:     2010-10-12 21:12:54 +0000 (Tue, 12 Oct 2010)

Log Message:
-----------
HUGO: Add lineHandler for v3 Dos, fix/add comments

Modified Paths:
--------------
    scummvm/trunk/engines/hugo/hugo.cpp
    scummvm/trunk/engines/hugo/module.mk
    scummvm/trunk/engines/hugo/parser.cpp
    scummvm/trunk/engines/hugo/parser.h
    scummvm/trunk/engines/hugo/route.cpp

Added Paths:
-----------
    scummvm/trunk/engines/hugo/parser_v3d.cpp

Modified: scummvm/trunk/engines/hugo/hugo.cpp
===================================================================
--- scummvm/trunk/engines/hugo/hugo.cpp	2010-10-12 21:12:50 UTC (rev 53169)
+++ scummvm/trunk/engines/hugo/hugo.cpp	2010-10-12 21:12:54 UTC (rev 53170)
@@ -198,7 +198,7 @@
 		_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;
 	}
 

Modified: scummvm/trunk/engines/hugo/module.mk
===================================================================
--- scummvm/trunk/engines/hugo/module.mk	2010-10-12 21:12:50 UTC (rev 53169)
+++ scummvm/trunk/engines/hugo/module.mk	2010-10-12 21:12:54 UTC (rev 53170)
@@ -25,6 +25,7 @@
 	parser_v1w.o \
 	parser_v1d.o \
 	parser_v2d.o \
+	parser_v3d.o \
 	route.o \
 	schedule.o \
 	schedule_v1d.o \

Modified: scummvm/trunk/engines/hugo/parser.cpp
===================================================================
--- scummvm/trunk/engines/hugo/parser.cpp	2010-10-12 21:12:50 UTC (rev 53169)
+++ scummvm/trunk/engines/hugo/parser.cpp	2010-10-12 21:12:54 UTC (rev 53170)
@@ -121,7 +121,7 @@
 }
 
 // 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");
 

Modified: scummvm/trunk/engines/hugo/parser.h
===================================================================
--- scummvm/trunk/engines/hugo/parser.h	2010-10-12 21:12:50 UTC (rev 53169)
+++ scummvm/trunk/engines/hugo/parser.h	2010-10-12 21:12:54 UTC (rev 53170)
@@ -81,14 +81,16 @@
 
 	virtual void  lineHandler();
 
-private:
+protected:
 	bool  isBackgroundWord(objectList_t obj);
 	bool  isCatchallVerb(objectList_t obj);
 	bool  isGenericVerb(object_t *obj, char *comment);
+	bool  isObjectVerb(object_t *obj, char *comment);
+	void  takeObject(object_t *obj);
+
+private:
 	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);
 };
 
 class Parser_v1d : public Parser {
@@ -96,7 +98,7 @@
 	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 @@
 	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

Added: scummvm/trunk/engines/hugo/parser_v3d.cpp
===================================================================
--- scummvm/trunk/engines/hugo/parser_v3d.cpp	                        (rev 0)
+++ scummvm/trunk/engines/hugo/parser_v3d.cpp	2010-10-12 21:12:54 UTC (rev 53170)
@@ -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


Property changes on: scummvm/trunk/engines/hugo/parser_v3d.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Modified: scummvm/trunk/engines/hugo/route.cpp
===================================================================
--- scummvm/trunk/engines/hugo/route.cpp	2010-10-12 21:12:50 UTC (rev 53169)
+++ scummvm/trunk/engines/hugo/route.cpp	2010-10-12 21:12:54 UTC (rev 53170)
@@ -111,18 +111,22 @@
 			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;
 		}


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list