[Scummvm-cvs-logs] scummvm master -> c9223b9b9b65242ed41906f960c5d2017a8e1ea5

Strangerke arnaud.boutonne at gmail.com
Sun Feb 20 10:37:55 CET 2011


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
c9223b9b9b HUGO: Some more refactoring


Commit: c9223b9b9b65242ed41906f960c5d2017a8e1ea5
    https://github.com/scummvm/scummvm/commit/c9223b9b9b65242ed41906f960c5d2017a8e1ea5
Author: strangerke (arnaud.boutonne at gmail.com)
Date: 2011-02-20T01:37:41-08:00

Commit Message:
HUGO: Some more refactoring

Changed paths:
    engines/hugo/file.cpp
    engines/hugo/file.h
    engines/hugo/game.h
    engines/hugo/hugo.cpp
    engines/hugo/hugo.h
    engines/hugo/intro.cpp
    engines/hugo/object.h
    engines/hugo/object_v1d.cpp
    engines/hugo/object_v1w.cpp
    engines/hugo/object_v2d.cpp
    engines/hugo/object_v3d.cpp
    engines/hugo/parser.h
    engines/hugo/parser_v1d.cpp
    engines/hugo/parser_v1w.cpp
    engines/hugo/parser_v2d.cpp
    engines/hugo/parser_v3d.cpp
    engines/hugo/schedule.cpp
    engines/hugo/schedule.h



diff --git a/engines/hugo/file.cpp b/engines/hugo/file.cpp
index 2662a0e..740513d 100644
--- a/engines/hugo/file.cpp
+++ b/engines/hugo/file.cpp
@@ -401,15 +401,15 @@ bool FileManager::saveGame(const int16 slot, const Common::String &descrip) {
 	_vm->_screen->savePal(out);
 
 	// Save maze status
-	out->writeByte((_maze.enabledFl) ? 1 : 0);
-	out->writeByte(_maze.size);
-	out->writeSint16BE(_maze.x1);
-	out->writeSint16BE(_maze.y1);
-	out->writeSint16BE(_maze.x2);
-	out->writeSint16BE(_maze.y2);
-	out->writeSint16BE(_maze.x3);
-	out->writeSint16BE(_maze.x4);
-	out->writeByte(_maze.firstScreenIndex);
+	out->writeByte((_vm->_maze.enabledFl) ? 1 : 0);
+	out->writeByte(_vm->_maze.size);
+	out->writeSint16BE(_vm->_maze.x1);
+	out->writeSint16BE(_vm->_maze.y1);
+	out->writeSint16BE(_vm->_maze.x2);
+	out->writeSint16BE(_vm->_maze.y2);
+	out->writeSint16BE(_vm->_maze.x3);
+	out->writeSint16BE(_vm->_maze.x4);
+	out->writeByte(_vm->_maze.firstScreenIndex);
 
 	out->finalize();
 
@@ -497,15 +497,15 @@ bool FileManager::restoreGame(const int16 slot) {
 	_vm->_screen->restorePal(in);
 
 	// Restore maze status
-	_maze.enabledFl = (in->readByte() == 1);
-	_maze.size = in->readByte();
-	_maze.x1 = in->readSint16BE();
-	_maze.y1 = in->readSint16BE();
-	_maze.x2 = in->readSint16BE();
-	_maze.y2 = in->readSint16BE();
-	_maze.x3 = in->readSint16BE();
-	_maze.x4 = in->readSint16BE();
-	_maze.firstScreenIndex = in->readByte();
+	_vm->_maze.enabledFl = (in->readByte() == 1);
+	_vm->_maze.size = in->readByte();
+	_vm->_maze.x1 = in->readSint16BE();
+	_vm->_maze.y1 = in->readSint16BE();
+	_vm->_maze.x2 = in->readSint16BE();
+	_vm->_maze.y2 = in->readSint16BE();
+	_vm->_maze.x3 = in->readSint16BE();
+	_vm->_maze.x4 = in->readSint16BE();
+	_vm->_maze.firstScreenIndex = in->readByte();
 
 	delete in;
 	return true;
@@ -530,16 +530,16 @@ void FileManager::printBootText() {
 	}
 
 	// Allocate space for the text and print it
-	char *buf = (char *)malloc(_boot.exit_len + 1);
+	char *buf = (char *)malloc(_vm->_boot.exit_len + 1);
 	if (buf) {
 		// Skip over the boot structure (already read) and read exit text
-		ofp.seek((long)sizeof(_boot), SEEK_SET);
-		if (ofp.read(buf, _boot.exit_len) != (size_t)_boot.exit_len)
+		ofp.seek((long)sizeof(_vm->_boot), SEEK_SET);
+		if (ofp.read(buf, _vm->_boot.exit_len) != (size_t)_vm->_boot.exit_len)
 			error("Error while reading startup file");
 
 		// Decrypt the exit text, using CRYPT substring
 		int i;
-		for (i = 0; i < _boot.exit_len; i++)
+		for (i = 0; i < _vm->_boot.exit_len; i++)
 			buf[i] ^= cypher[i % strlen(cypher)];
 
 		buf[i] = '\0';
@@ -569,19 +569,19 @@ void FileManager::readBootFile() {
 		}
 	}
 
-	if (ofp.size() < (int32)sizeof(_boot))
+	if (ofp.size() < (int32)sizeof(_vm->_boot))
 		error("Corrupted startup file");
 
-	_boot.checksum = ofp.readByte();
-	_boot.registered = ofp.readByte();
-	ofp.read(_boot.pbswitch, sizeof(_boot.pbswitch));
-	ofp.read(_boot.distrib, sizeof(_boot.distrib));
-	_boot.exit_len = ofp.readUint16LE();
+	_vm->_boot.checksum = ofp.readByte();
+	_vm->_boot.registered = ofp.readByte();
+	ofp.read(_vm->_boot.pbswitch, sizeof(_vm->_boot.pbswitch));
+	ofp.read(_vm->_boot.distrib, sizeof(_vm->_boot.distrib));
+	_vm->_boot.exit_len = ofp.readUint16LE();
 
-	byte *p = (byte *)&_boot;
+	byte *p = (byte *)&_vm->_boot;
 
 	byte checksum = 0;
-	for (uint32 i = 0; i < sizeof(_boot); i++) {
+	for (uint32 i = 0; i < sizeof(_vm->_boot); i++) {
 		checksum ^= p[i];
 		p[i] ^= cypher[i % strlen(cypher)];
 	}
diff --git a/engines/hugo/file.h b/engines/hugo/file.h
index 46dcabd..77c6811 100644
--- a/engines/hugo/file.h
+++ b/engines/hugo/file.h
@@ -39,6 +39,12 @@ namespace Hugo {
  */
 enum ovl_t {kOvlBoundary, kOvlOverlay, kOvlBase};
 
+struct uif_hdr_t {                                  // UIF font/image look up
+	uint16  size;                                   // Size of uif item
+	uint32  offset;                                 // Offset of item in file
+};
+
+
 class FileManager {
 public:
 	FileManager(HugoEngine *vm);
@@ -76,6 +82,7 @@ protected:
 	static const int kMaxSounds = 64;               // Max number of sounds
 	static const int kRepeatMask = 0xC0;            // Top 2 bits mean a repeat code
 	static const int kLengthMask = 0x3F;            // Lower 6 bits are length
+	static const int kNumColors = 16;               // Num colors to save in palette
 
 	/**
 	 * Structure of scenery file lookup entry
@@ -91,8 +98,6 @@ protected:
 		uint32 ob_len;
 	};
 
-	static const int kNumColors = 16;               // Num colors to save in palette
-
 	struct PCC_header_t {                           // Structure of PCX file header
 		byte   mfctr, vers, enc, bpx;
 		uint16  x1, y1, x2, y2;                     // bounding box
diff --git a/engines/hugo/game.h b/engines/hugo/game.h
index bd62a4b..08e8deb 100644
--- a/engines/hugo/game.h
+++ b/engines/hugo/game.h
@@ -86,64 +86,6 @@ enum path_t {
 	kPathWander2                                    // Same as WANDER, except keeps cycling when stationary
 };
 
-/**
- * Following defines the action types and action list
- */
-enum action_t {                                     // Parameters:
-	ANULL              = 0xff,                      // Special NOP used to 'delete' events in DEL_EVENTS
-	ASCHEDULE          = 0,                         //  0 - Ptr to action list to be rescheduled
-	START_OBJ,                                      //  1 - Object number
-	INIT_OBJXY,                                     //  2 - Object number, x,y
-	PROMPT,                                         //  3 - index of prompt & response string, ptrs to action
-	                                                //      lists.  First if response matches, 2nd if not.
-	BKGD_COLOR,                                     //  4 - new background color
-	INIT_OBJVXY,                                    //  5 - Object number, vx, vy
-	INIT_CARRY,                                     //  6 - Object number, carried status
-	INIT_HF_COORD,                                  //  7 - Object number (gets hero's 'feet' coordinates)
-	NEW_SCREEN,                                     //  8 - New screen number
-	INIT_OBJSTATE,                                  //  9 - Object number, new object state
-	INIT_PATH,                                      // 10 - Object number, new path type
-	COND_R,                                         // 11 - Conditional on object state - req state, 2 act_lists
-	TEXT,                                           // 12 - Simple text box
-	SWAP_IMAGES,                                    // 13 - Swap 2 object images
-	COND_SCR,                                       // 14 - Conditional on current screen
-	AUTOPILOT,                                      // 15 - Set object to home in on another (stationary) object
-	INIT_OBJ_SEQ,                                   // 16 - Object number, sequence index to set curr_seq_p to
-	SET_STATE_BITS,                                 // 17 - Objnum, mask to OR with obj states word
-	CLEAR_STATE_BITS,                               // 18 - Objnum, mask to ~AND with obj states word
-	TEST_STATE_BITS,                                // 19 - Objnum, mask to test obj states word
-	DEL_EVENTS,                                     // 20 - Action type to delete all occurrences of
-	GAMEOVER,                                       // 21 - Disable hero & commands.  Game is over
-	INIT_HH_COORD,                                  // 22 - Object number (gets hero's actual coordinates)
-	EXIT,                                           // 23 - Exit game back to DOS
-	BONUS,                                          // 24 - Get score bonus for an action
-	COND_BOX,                                       // 25 - Conditional on object within bounding box
-	SOUND,                                          // 26 - Set currently playing sound
-	ADD_SCORE,                                      // 27 - Add object's value to current score
-	SUB_SCORE,                                      // 28 - Subtract object's value from current score
-	COND_CARRY,                                     // 29 - Conditional on carrying object
-	INIT_MAZE,                                      // 30 - Start special maze hotspot processing
-	EXIT_MAZE,                                      // 31 - Exit special maze processing
-	INIT_PRIORITY,                                  // 32 - Initialize fbg field
-	INIT_SCREEN,                                    // 33 - Initialise screen field of object
-	AGSCHEDULE,                                     // 34 - Global schedule - lasts over new screen
-	REMAPPAL,                                       // 35 - Remappe palette - palette index, color
-	COND_NOUN,                                      // 36 - Conditional on noun appearing in line
-	SCREEN_STATE,                                   // 37 - Set new screen state - used for comments
-	INIT_LIPS,                                      // 38 - Position lips object for supplied object
-	INIT_STORY_MODE,                                // 39 - Set story mode TRUE/FALSE (user can't type)
-	WARN,                                           // 40 - Same as TEXT but can't dismiss box by typing
-	COND_BONUS,                                     // 41 - Conditional on bonus having been scored
-	TEXT_TAKE,                                      // 42 - Issue text box with "take" info string
-	YESNO,                                          // 43 - Prompt user for Yes or No
-	STOP_ROUTE,                                     // 44 - Skip any route in progress (hero still walks)
-	COND_ROUTE,                                     // 45 - Conditional on route in progress
-	INIT_JUMPEXIT,                                  // 46 - Initialize status.jumpexit
-	INIT_VIEW,                                      // 47 - Initialize viewx, viewy, dir
-	INIT_OBJ_FRAME,                                 // 48 - Object number, seq,frame to set curr_seq_p to
-	OLD_SONG           = 49                         // Added by Strangerke - Set currently playing sound, old way: that is, using a string index instead of a reference in a file
-};
-
 struct hugo_boot_t {                                // Common HUGO boot file
 	char checksum;                                  // Checksum for boot structure (not exit text)
 	char registered;                                // TRUE if registered version, else FALSE
@@ -152,11 +94,6 @@ struct hugo_boot_t {                                // Common HUGO boot file
 	uint16 exit_len;                                // Length of exit text (next in file)
 } PACKED_STRUCT;
 
-struct uif_hdr_t {                                  // UIF font/image look up
-	uint16  size;                                   // Size of uif item
-	uint32  offset;                                 // Offset of item in file
-};
-
 /**
  * Game specific type definitions
  */
@@ -164,14 +101,6 @@ typedef byte *image_pt;                             // ptr to an object image (s
 typedef byte *sound_pt;                             // ptr to sound (or music) data
 
 /**
- * Following are points for achieving certain actions.
- */
-struct point_t {
-	byte score;                                     // The value of the point
-	bool scoredFl;                                  // Whether scored yet
-};
-
-/**
  * Structure for initializing maze processing
  */
 struct maze_t {
@@ -183,20 +112,6 @@ struct maze_t {
 };
 
 /**
- * The following determines how a verb is acted on, for an object
- */
-struct cmd {
-	uint16 verbIndex;                               // the verb
-	uint16 reqIndex;                                // ptr to list of required objects
-	uint16 textDataNoCarryIndex;                    // ptr to string if any of above not carried
-	byte   reqState;                                // required state for verb to be done
-	byte   newState;                                // new states if verb done
-	uint16 textDataWrongIndex;                      // ptr to string if wrong state
-	uint16 textDataDoneIndex;                       // ptr to string if verb done
-	uint16 actIndex;                                // Ptr to action list if verb done
-};
-
-/**
  * The following is a linked list of images in an animation sequence
  * The image data is in 8-bit DIB format, i.e. 1 byte = 1 pixel
  */
@@ -216,38 +131,6 @@ struct seqList_t {
 	seq_t *seqPtr;                                  // Ptr to sequence structure
 };
 
-/**
- * Following is structure of verbs and nouns for 'background' objects
- * These are objects that appear in the various screens, but nothing
- * interesting ever happens with them.  Rather than just be dumb and say
- * "don't understand" we produce an interesting msg to keep user sane.
- */
-struct background_t {
-	uint16 verbIndex;
-	uint16 nounIndex;
-	int    commentIndex;                            // Index of comment produced on match
-	bool   matchFl;                                 // TRUE if noun must match when present
-	byte   roomState;                               // "State" of room. Comments might differ.
-	byte   bonusIndex;                              // Index of bonus score (0 = no bonus)
-};
-
-typedef background_t *objectList_t;
-
-struct target_t {                                   // Secondary target for action
-	uint16 nounIndex;                               // Secondary object
-	uint16 verbIndex;                               // Action on secondary object
-};
-
-struct uses_t {                                     // Define uses of certain objects
-	int16     objId;                                // Primary object
-	uint16    dataIndex;                            // String if no secondary object matches
-	target_t *targets;                              // List of secondary targets
-};
-
-// Global externs
-extern maze_t      _maze;                           // Maze control structure
-extern hugo_boot_t _boot;                           // Boot info structure
-
 #include "common/pack-start.h"                      // START STRUCT PACKING
 struct sound_hdr_t {                                // Sound file lookup entry
 	uint16 size;                                    // Size of sound data in bytes
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp
index 1976a64..a99e83e 100644
--- a/engines/hugo/hugo.cpp
+++ b/engines/hugo/hugo.cpp
@@ -50,9 +50,6 @@ namespace Hugo {
 
 HugoEngine *HugoEngine::s_Engine = 0;
 
-maze_t      _maze;                              // Default to not in maze
-hugo_boot_t _boot;                              // Boot info structure file
-
 HugoEngine::HugoEngine(OSystem *syst, const HugoGameDescription *gd) : Engine(syst), _gameDescription(gd),
 	_hero(0), _heroImage(0), _defltTunes(0), _numScreens(0), _tunesNbr(0), _soundSilence(0), _soundTest(0),
 	_screenStates(0), _score(0), _maxscore(0), _lastTime(0), _curTime(0)
diff --git a/engines/hugo/hugo.h b/engines/hugo/hugo.h
index 239b20f..45d2dc4 100644
--- a/engines/hugo/hugo.h
+++ b/engines/hugo/hugo.h
@@ -251,6 +251,9 @@ public:
 	uint16    _take;
 	uint16    _drop;
 
+	maze_t      _maze;                              // Maze control structure
+	hugo_boot_t _boot;                              // Boot info structure
+
 	GUI::Debugger *getDebugger();
 
 	Common::RandomSource *_rnd;
@@ -269,7 +272,7 @@ public:
 	Common::Platform getPlatform() const;
 	bool isPacked() const;
 
-	// Temporary, until the engine is fully objectified.
+	// Used by the qsort function
 	static HugoEngine &get() {
 		assert(s_Engine != 0);
 		return *s_Engine;
diff --git a/engines/hugo/intro.cpp b/engines/hugo/intro.cpp
index d7b95f9..689dfbf 100644
--- a/engines/hugo/intro.cpp
+++ b/engines/hugo/intro.cpp
@@ -119,7 +119,7 @@ bool intro_v1d::introPlay() {
 				error("Unable to load font TMSRB.FON, face 'Tms Rmn', size 8");
 
 			char buffer[80];
-			if (_boot.registered)
+			if (_vm->_boot.registered)
 				strcpy(buffer, "Registered Version");
 			else
 				strcpy(buffer, "Shareware Version");
@@ -127,8 +127,8 @@ bool intro_v1d::introPlay() {
 			font.drawString(&surf, buffer, 0, 163, 320, _TLIGHTMAGENTA, Graphics::kTextAlignCenter);
 			font.drawString(&surf, _vm->getCopyrightString(), 0, 176, 320, _TLIGHTMAGENTA, Graphics::kTextAlignCenter);
 
-			if (scumm_stricmp(_boot.distrib, "David P. Gray")) {
-				sprintf(buffer, "Distributed by %s.", _boot.distrib);
+			if (scumm_stricmp(_vm->_boot.distrib, "David P. Gray")) {
+				sprintf(buffer, "Distributed by %s.", _vm->_boot.distrib);
 				font.drawString(&surf, buffer, 0, 75, 320, _TMAGENTA, Graphics::kTextAlignCenter);
 			}
 
@@ -251,16 +251,16 @@ void intro_v2d::introInit() {
 	if (!font.loadFromFON("TMSRB.FON", Graphics::WinFontDirEntry("Tms Rmn", 8)))
 		error("Unable to load font TMSRB.FON, face 'Tms Rmn', size 8");
 
-	if (_boot.registered)
+	if (_vm->_boot.registered)
 		sprintf(buffer, "%s  Registered Version", _vm->getCopyrightString());
 	else
 		sprintf(buffer, "%s  Shareware Version", _vm->getCopyrightString());
 
 	font.drawString(&surf, buffer, 0, 186, 320, _TLIGHTRED, Graphics::kTextAlignCenter);
 
-	if (scumm_stricmp(_boot.distrib, "David P. Gray")) {
+	if (scumm_stricmp(_vm->_boot.distrib, "David P. Gray")) {
 		// TROMAN, size 10-5
-		sprintf(buffer, "Distributed by %s.", _boot.distrib);
+		sprintf(buffer, "Distributed by %s.", _vm->_boot.distrib);
 		font.drawString(&surf, buffer, 0, 1, 320, _TLIGHTRED, Graphics::kTextAlignCenter);
 	}
 
@@ -292,7 +292,7 @@ void intro_v3d::introInit() {
 	surf.bytesPerPixel = 1;
 
 	char buffer[128];
-	if (_boot.registered)
+	if (_vm->_boot.registered)
 		sprintf(buffer, "%s  Registered Version", _vm->getCopyrightString());
 	else
 		sprintf(buffer,"%s  Shareware Version", _vm->getCopyrightString());
@@ -303,8 +303,8 @@ void intro_v3d::introInit() {
 
 	font.drawString(&surf, buffer, 0, 190, 320, _TBROWN, Graphics::kTextAlignCenter);
 
-	if (scumm_stricmp(_boot.distrib, "David P. Gray")) {
-		sprintf(buffer, "Distributed by %s.", _boot.distrib);
+	if (scumm_stricmp(_vm->_boot.distrib, "David P. Gray")) {
+		sprintf(buffer, "Distributed by %s.", _vm->_boot.distrib);
 		font.drawString(&surf, buffer, 0, 0, 320, _TBROWN, Graphics::kTextAlignCenter);
 	}
 
diff --git a/engines/hugo/object.h b/engines/hugo/object.h
index 842bbe1..41ea776 100644
--- a/engines/hugo/object.h
+++ b/engines/hugo/object.h
@@ -37,6 +37,17 @@
 
 namespace Hugo {
 
+struct target_t {                                   // Secondary target for action
+	uint16 nounIndex;                               // Secondary object
+	uint16 verbIndex;                               // Action on secondary object
+};
+
+struct uses_t {                                     // Define uses of certain objects
+	int16     objId;                                // Primary object
+	uint16    dataIndex;                            // String if no secondary object matches
+	target_t *targets;                              // List of secondary targets
+};
+
 class ObjectHandler {
 public:
 	ObjectHandler(HugoEngine *vm);
diff --git a/engines/hugo/object_v1d.cpp b/engines/hugo/object_v1d.cpp
index d46ef89..a8edb45 100644
--- a/engines/hugo/object_v1d.cpp
+++ b/engines/hugo/object_v1d.cpp
@@ -334,7 +334,7 @@ void ObjectHandler_v1d::moveObjects() {
 	}
 
 	// If maze mode is enabled, do special maze processing
-	if (_maze.enabledFl) {
+	if (_vm->_maze.enabledFl) {
 		seq_t *currImage = _vm->_hero->currImagePtr;// Get ptr to current image
 		// hero coordinates
 		int x1 = _vm->_hero->x + currImage->x1;     // Left edge of object
diff --git a/engines/hugo/object_v1w.cpp b/engines/hugo/object_v1w.cpp
index 321bb29..f3ba793 100644
--- a/engines/hugo/object_v1w.cpp
+++ b/engines/hugo/object_v1w.cpp
@@ -344,7 +344,7 @@ void ObjectHandler_v1w::moveObjects() {
 	}
 
 	// If maze mode is enabled, do special maze processing
-	if (_maze.enabledFl) {
+	if (_vm->_maze.enabledFl) {
 		seq_t *currImage = _vm->_hero->currImagePtr;    // Get ptr to current image
 		// hero coordinates
 		int x1 = _vm->_hero->x + currImage->x1;         // Left edge of object
diff --git a/engines/hugo/object_v2d.cpp b/engines/hugo/object_v2d.cpp
index 0bb2074..b3c4926 100644
--- a/engines/hugo/object_v2d.cpp
+++ b/engines/hugo/object_v2d.cpp
@@ -347,7 +347,7 @@ void ObjectHandler_v2d::moveObjects() {
 	}
 
 	// If maze mode is enabled, do special maze processing
-	if (_maze.enabledFl) {
+	if (_vm->_maze.enabledFl) {
 		seq_t *currImage = _vm->_hero->currImagePtr;    // Get ptr to current image
 		// hero coordinates
 		int x1 = _vm->_hero->x + currImage->x1;         // Left edge of object
diff --git a/engines/hugo/object_v3d.cpp b/engines/hugo/object_v3d.cpp
index 8c9efba..2c6fc5d 100644
--- a/engines/hugo/object_v3d.cpp
+++ b/engines/hugo/object_v3d.cpp
@@ -229,7 +229,7 @@ void ObjectHandler_v3d::moveObjects() {
 	}
 
 	// If maze mode is enabled, do special maze processing
-	if (_maze.enabledFl) {
+	if (_vm->_maze.enabledFl) {
 		seq_t *currImage = _vm->_hero->currImagePtr;// Get ptr to current image
 		// hero coordinates
 		int x1 = _vm->_hero->x + currImage->x1;     // Left edge of object
diff --git a/engines/hugo/parser.h b/engines/hugo/parser.h
index 33851d6..dd9244b 100644
--- a/engines/hugo/parser.h
+++ b/engines/hugo/parser.h
@@ -42,6 +42,37 @@ enum seqTextParser {
 	kCmtAny5,     kTBExit_1d, kTBEh_1d,   kTBEh_2d,      kTBNoUse_2d
 };
 
+/**
+ * The following determines how a verb is acted on, for an object
+ */
+struct cmd {
+	uint16 verbIndex;                               // the verb
+	uint16 reqIndex;                                // ptr to list of required objects
+	uint16 textDataNoCarryIndex;                    // ptr to string if any of above not carried
+	byte   reqState;                                // required state for verb to be done
+	byte   newState;                                // new states if verb done
+	uint16 textDataWrongIndex;                      // ptr to string if wrong state
+	uint16 textDataDoneIndex;                       // ptr to string if verb done
+	uint16 actIndex;                                // Ptr to action list if verb done
+};
+
+/**
+ * Following is structure of verbs and nouns for 'background' objects
+ * These are objects that appear in the various screens, but nothing
+ * interesting ever happens with them.  Rather than just be dumb and say
+ * "don't understand" we produce an interesting msg to keep user sane.
+ */
+struct background_t {
+	uint16 verbIndex;
+	uint16 nounIndex;
+	int    commentIndex;                            // Index of comment produced on match
+	bool   matchFl;                                 // TRUE if noun must match when present
+	byte   roomState;                               // "State" of room. Comments might differ.
+	byte   bonusIndex;                              // Index of bonus score (0 = no bonus)
+};
+
+typedef background_t *objectList_t;
+
 class Parser {
 public:
 	Parser(HugoEngine *vm);
diff --git a/engines/hugo/parser_v1d.cpp b/engines/hugo/parser_v1d.cpp
index 0079249..424ca66 100644
--- a/engines/hugo/parser_v1d.cpp
+++ b/engines/hugo/parser_v1d.cpp
@@ -286,7 +286,7 @@ void Parser_v1d::dropObject(object_t *obj) {
 bool Parser_v1d::isCatchallVerb_v1(bool testNounFl, const char *noun, const char *verb, objectList_t obj) const {
 	debugC(1, kDebugParser, "isCatchallVerb(%d, %s, %s, object_list_t obj)", (testNounFl) ? 1 : 0, noun, verb);
 
-	if (_maze.enabledFl)
+	if (_vm->_maze.enabledFl)
 		return false;
 
 	if (testNounFl && !noun)
diff --git a/engines/hugo/parser_v1w.cpp b/engines/hugo/parser_v1w.cpp
index 4b55f79..5d901e8 100644
--- a/engines/hugo/parser_v1w.cpp
+++ b/engines/hugo/parser_v1w.cpp
@@ -191,7 +191,7 @@ void Parser_v1w::lineHandler() {
 	// Nothing matches.  Report recognition success to user.
 	const char *verb = findVerb();
 	const char *noun = findNoun();
-	if (verb == _vm->_text->getVerb(_vm->_look, 0) && _maze.enabledFl) {
+	if (verb == _vm->_text->getVerb(_vm->_look, 0) && _vm->_maze.enabledFl) {
 		Utils::Box(kBoxAny, "%s", _vm->_text->getTextParser(kTBMaze));
 		_vm->_object->showTakeables();
 	} else if (verb && noun) {                      // A combination I didn't think of
diff --git a/engines/hugo/parser_v2d.cpp b/engines/hugo/parser_v2d.cpp
index d87ae59..580d781 100644
--- a/engines/hugo/parser_v2d.cpp
+++ b/engines/hugo/parser_v2d.cpp
@@ -178,7 +178,7 @@ void Parser_v2d::lineHandler() {
 		&& !isCatchallVerb_v1(false, noun, verb, _catchallList)) {
 		if (*farComment != '\0') {                  // An object matched but not near enough
 			Utils::Box(kBoxAny, "%s", farComment);
-		} else if (_maze.enabledFl && (verb == _vm->_text->getVerb(_vm->_look, 0))) {
+		} else if (_vm->_maze.enabledFl && (verb == _vm->_text->getVerb(_vm->_look, 0))) {
 			Utils::Box(kBoxAny, "%s", _vm->_text->getTextParser(kTBMaze));
 			_vm->_object->showTakeables();
 		} else if (verb && noun) {                  // A combination I didn't think of
diff --git a/engines/hugo/parser_v3d.cpp b/engines/hugo/parser_v3d.cpp
index 3c1eefe..b3d0125 100644
--- a/engines/hugo/parser_v3d.cpp
+++ b/engines/hugo/parser_v3d.cpp
@@ -416,7 +416,7 @@ void Parser_v3d::dropObject(object_t *obj) {
 bool Parser_v3d::isCatchallVerb_v3(objectList_t obj) const {
 	debugC(1, kDebugParser, "isCatchallVerb(object_list_t obj)");
 
-	if (_maze.enabledFl)
+	if (_vm->_maze.enabledFl)
 		return false;
 
 	for (int i = 0; obj[i].verbIndex != 0; i++) {
@@ -444,7 +444,7 @@ bool Parser_v3d::isCatchallVerb_v3(objectList_t obj) const {
 bool Parser_v3d::isBackgroundWord_v3(objectList_t obj) const {
 	debugC(1, kDebugParser, "isBackgroundWord(object_list_t obj)");
 
-	if (_maze.enabledFl)
+	if (_vm->_maze.enabledFl)
 		return false;
 
 	for (int i = 0; obj[i].verbIndex != 0; i++) {
diff --git a/engines/hugo/schedule.cpp b/engines/hugo/schedule.cpp
index f0f2915..5843c23 100644
--- a/engines/hugo/schedule.cpp
+++ b/engines/hugo/schedule.cpp
@@ -657,32 +657,32 @@ void Scheduler::screenActions(const int screenNum) {
 void Scheduler::processMaze(const int x1, const int x2, const int y1, const int y2) {
 	debugC(1, kDebugSchedule, "processMaze");
 
-	if (x1 < _maze.x1) {
+	if (x1 < _vm->_maze.x1) {
 		// Exit west
 		_actListArr[_alNewscrIndex][3].a8.screenIndex = *_vm->_screen_p - 1;
-		_actListArr[_alNewscrIndex][0].a2.x = _maze.x2 - kShiftSize - (x2 - x1);
+		_actListArr[_alNewscrIndex][0].a2.x = _vm->_maze.x2 - kShiftSize - (x2 - x1);
 		_actListArr[_alNewscrIndex][0].a2.y = _vm->_hero->y;
 		_vm->_route->resetRoute();
 		insertActionList(_alNewscrIndex);
-	} else if (x2 > _maze.x2) {
+	} else if (x2 > _vm->_maze.x2) {
 		// Exit east
 		_actListArr[_alNewscrIndex][3].a8.screenIndex = *_vm->_screen_p + 1;
-		_actListArr[_alNewscrIndex][0].a2.x = _maze.x1 + kShiftSize;
+		_actListArr[_alNewscrIndex][0].a2.x = _vm->_maze.x1 + kShiftSize;
 		_actListArr[_alNewscrIndex][0].a2.y = _vm->_hero->y;
 		_vm->_route->resetRoute();
 		insertActionList(_alNewscrIndex);
-	} else if (y1 < _maze.y1 - kShiftSize) {
+	} else if (y1 < _vm->_maze.y1 - kShiftSize) {
 		// Exit north
-		_actListArr[_alNewscrIndex][3].a8.screenIndex = *_vm->_screen_p - _maze.size;
-		_actListArr[_alNewscrIndex][0].a2.x = _maze.x3;
-		_actListArr[_alNewscrIndex][0].a2.y = _maze.y2 - kShiftSize - (y2 - y1);
+		_actListArr[_alNewscrIndex][3].a8.screenIndex = *_vm->_screen_p - _vm->_maze.size;
+		_actListArr[_alNewscrIndex][0].a2.x = _vm->_maze.x3;
+		_actListArr[_alNewscrIndex][0].a2.y = _vm->_maze.y2 - kShiftSize - (y2 - y1);
 		_vm->_route->resetRoute();
 		insertActionList(_alNewscrIndex);
-	} else if (y2 > _maze.y2 - kShiftSize / 2) {
+	} else if (y2 > _vm->_maze.y2 - kShiftSize / 2) {
 		// Exit south
-		_actListArr[_alNewscrIndex][3].a8.screenIndex = *_vm->_screen_p + _maze.size;
-		_actListArr[_alNewscrIndex][0].a2.x = _maze.x4;
-		_actListArr[_alNewscrIndex][0].a2.y = _maze.y1 + kShiftSize;
+		_actListArr[_alNewscrIndex][3].a8.screenIndex = *_vm->_screen_p + _vm->_maze.size;
+		_actListArr[_alNewscrIndex][0].a2.x = _vm->_maze.x4;
+		_actListArr[_alNewscrIndex][0].a2.y = _vm->_maze.y1 + kShiftSize;
 		_vm->_route->resetRoute();
 		insertActionList(_alNewscrIndex);
 	}
@@ -1059,18 +1059,18 @@ event_t *Scheduler::doAction(event_t *curEvent) {
 			insertActionList(action->a29.actFailIndex);
 		break;
 	case INIT_MAZE:                                 // act30: Enable and init maze structure
-		_maze.enabledFl = true;
-		_maze.size = action->a30.mazeSize;
-		_maze.x1 = action->a30.x1;
-		_maze.y1 = action->a30.y1;
-		_maze.x2 = action->a30.x2;
-		_maze.y2 = action->a30.y2;
-		_maze.x3 = action->a30.x3;
-		_maze.x4 = action->a30.x4;
-		_maze.firstScreenIndex = action->a30.firstScreenIndex;
+		_vm->_maze.enabledFl = true;
+		_vm->_maze.size = action->a30.mazeSize;
+		_vm->_maze.x1 = action->a30.x1;
+		_vm->_maze.y1 = action->a30.y1;
+		_vm->_maze.x2 = action->a30.x2;
+		_vm->_maze.y2 = action->a30.y2;
+		_vm->_maze.x3 = action->a30.x3;
+		_vm->_maze.x4 = action->a30.x4;
+		_vm->_maze.firstScreenIndex = action->a30.firstScreenIndex;
 		break;
 	case EXIT_MAZE:                                 // act31: Disable maze mode
-		_maze.enabledFl = false;
+		_vm->_maze.enabledFl = false;
 		break;
 	case INIT_PRIORITY:
 		_vm->_object->_objects[action->a32.objIndex].priority = action->a32.priority;
diff --git a/engines/hugo/schedule.h b/engines/hugo/schedule.h
index c7a6003..953e9af 100644
--- a/engines/hugo/schedule.h
+++ b/engines/hugo/schedule.h
@@ -37,6 +37,64 @@
 
 namespace Hugo {
 
+/**
+ * Following defines the action types and action list
+ */
+enum action_t {                                     // Parameters:
+	ANULL              = 0xff,                      // Special NOP used to 'delete' events in DEL_EVENTS
+	ASCHEDULE          = 0,                         //  0 - Ptr to action list to be rescheduled
+	START_OBJ,                                      //  1 - Object number
+	INIT_OBJXY,                                     //  2 - Object number, x,y
+	PROMPT,                                         //  3 - index of prompt & response string, ptrs to action
+	                                                //      lists.  First if response matches, 2nd if not.
+	BKGD_COLOR,                                     //  4 - new background color
+	INIT_OBJVXY,                                    //  5 - Object number, vx, vy
+	INIT_CARRY,                                     //  6 - Object number, carried status
+	INIT_HF_COORD,                                  //  7 - Object number (gets hero's 'feet' coordinates)
+	NEW_SCREEN,                                     //  8 - New screen number
+	INIT_OBJSTATE,                                  //  9 - Object number, new object state
+	INIT_PATH,                                      // 10 - Object number, new path type
+	COND_R,                                         // 11 - Conditional on object state - req state, 2 act_lists
+	TEXT,                                           // 12 - Simple text box
+	SWAP_IMAGES,                                    // 13 - Swap 2 object images
+	COND_SCR,                                       // 14 - Conditional on current screen
+	AUTOPILOT,                                      // 15 - Set object to home in on another (stationary) object
+	INIT_OBJ_SEQ,                                   // 16 - Object number, sequence index to set curr_seq_p to
+	SET_STATE_BITS,                                 // 17 - Objnum, mask to OR with obj states word
+	CLEAR_STATE_BITS,                               // 18 - Objnum, mask to ~AND with obj states word
+	TEST_STATE_BITS,                                // 19 - Objnum, mask to test obj states word
+	DEL_EVENTS,                                     // 20 - Action type to delete all occurrences of
+	GAMEOVER,                                       // 21 - Disable hero & commands.  Game is over
+	INIT_HH_COORD,                                  // 22 - Object number (gets hero's actual coordinates)
+	EXIT,                                           // 23 - Exit game back to DOS
+	BONUS,                                          // 24 - Get score bonus for an action
+	COND_BOX,                                       // 25 - Conditional on object within bounding box
+	SOUND,                                          // 26 - Set currently playing sound
+	ADD_SCORE,                                      // 27 - Add object's value to current score
+	SUB_SCORE,                                      // 28 - Subtract object's value from current score
+	COND_CARRY,                                     // 29 - Conditional on carrying object
+	INIT_MAZE,                                      // 30 - Start special maze hotspot processing
+	EXIT_MAZE,                                      // 31 - Exit special maze processing
+	INIT_PRIORITY,                                  // 32 - Initialize fbg field
+	INIT_SCREEN,                                    // 33 - Initialise screen field of object
+	AGSCHEDULE,                                     // 34 - Global schedule - lasts over new screen
+	REMAPPAL,                                       // 35 - Remappe palette - palette index, color
+	COND_NOUN,                                      // 36 - Conditional on noun appearing in line
+	SCREEN_STATE,                                   // 37 - Set new screen state - used for comments
+	INIT_LIPS,                                      // 38 - Position lips object for supplied object
+	INIT_STORY_MODE,                                // 39 - Set story mode TRUE/FALSE (user can't type)
+	WARN,                                           // 40 - Same as TEXT but can't dismiss box by typing
+	COND_BONUS,                                     // 41 - Conditional on bonus having been scored
+	TEXT_TAKE,                                      // 42 - Issue text box with "take" info string
+	YESNO,                                          // 43 - Prompt user for Yes or No
+	STOP_ROUTE,                                     // 44 - Skip any route in progress (hero still walks)
+	COND_ROUTE,                                     // 45 - Conditional on route in progress
+	INIT_JUMPEXIT,                                  // 46 - Initialize status.jumpexit
+	INIT_VIEW,                                      // 47 - Initialize viewx, viewy, dir
+	INIT_OBJ_FRAME,                                 // 48 - Object number, seq,frame to set curr_seq_p to
+	OLD_SONG           = 49                         // Added by Strangerke - Set currently playing sound, old way: that is, using a string index instead of a reference in a file
+};
+
 struct act0 {                                       // Type 0 - Schedule
 	action_t actType;                               // The type of action
 	int      timer;                                 // Time to set off the action
@@ -450,6 +508,14 @@ struct event_t {
 	struct event_t *nextEvent;                      // Chain to next event
 };
 
+/**
+ * Following are points for achieving certain actions.
+ */
+struct point_t {
+	byte score;                                     // The value of the point
+	bool scoredFl;                                  // Whether scored yet
+};
+
 class Scheduler {
 public:
 	Scheduler(HugoEngine *vm);
@@ -471,13 +537,11 @@ public:
 	void newScreen(const int screenIndex);
 	void processBonus(const int bonusIndex);
 	void processMaze(const int x1, const int x2, const int y1, const int y2);
-	void readAct(Common::ReadStream &in, act &curAct);
 	void restoreSchedulerData(Common::ReadStream *in);
 	void restoreScreen(const int screenIndex);
 	void saveSchedulerData(Common::WriteStream *out);
 	void waitForRefresh();
 
-	void findAction(act* action, int16* index, int16* subElem);
 protected:
 	HugoEngine *_vm;
 	static const int kFilenameLength = 12;          // Max length of a DOS file name
@@ -519,7 +583,9 @@ protected:
 
 	void delEventType(const action_t actTypeDel);
 	void delQueue(event_t *curEvent);
+	void findAction(act* action, int16* index, int16* subElem);
 	void insertAction(act *action);
+	void readAct(Common::ReadStream &in, act &curAct);
 	void restoreActions(Common::ReadStream *f);
 	void restoreEvents(Common::ReadStream *f);
 	void restorePoints(Common::ReadStream *in);






More information about the Scummvm-git-logs mailing list