diff options
| -rw-r--r-- | engines/parallaction/animation.cpp | 12 | ||||
| -rw-r--r-- | engines/parallaction/commands.cpp | 22 | ||||
| -rw-r--r-- | engines/parallaction/dialogue.cpp | 24 | ||||
| -rw-r--r-- | engines/parallaction/disk.cpp | 38 | ||||
| -rw-r--r-- | engines/parallaction/disk.h | 5 | ||||
| -rw-r--r-- | engines/parallaction/location.cpp | 22 | ||||
| -rw-r--r-- | engines/parallaction/parallaction.cpp | 128 | ||||
| -rw-r--r-- | engines/parallaction/parallaction.h | 49 | ||||
| -rw-r--r-- | engines/parallaction/staticres.cpp | 41 | ||||
| -rw-r--r-- | engines/parallaction/zone.cpp | 14 | 
10 files changed, 186 insertions, 169 deletions
| diff --git a/engines/parallaction/animation.cpp b/engines/parallaction/animation.cpp index 166fdfaf79..5069dd238c 100644 --- a/engines/parallaction/animation.cpp +++ b/engines/parallaction/animation.cpp @@ -97,9 +97,9 @@ Animation *Parallaction::parseAnimation(Script& script, Node *list, char *name)  		}  		if (!scumm_stricmp(_tokens[0], "type")) {  			if (_tokens[2][0] != '\0') { -				vD0->_type = ((4 + searchTable(_tokens[2], const_cast<const char **>(_objectsNames))) << 16) & 0xFFFF0000; +				vD0->_type = ((4 + _objectsNames->lookup(_tokens[2])) << 16) & 0xFFFF0000;  			} -			int16 _si = searchTable(_tokens[1], _zoneTypeNames); +			int16 _si = _zoneTypeNames->lookup(_tokens[1]);  			if (_si != -1) {  				vD0->_type |= 1 << (_si-1);  				if (((vD0->_type & 0xFFFF) != kZoneNone) && ((vD0->_type & 0xFFFF) != kZoneCommand)) { @@ -114,7 +114,7 @@ Animation *Parallaction::parseAnimation(Script& script, Node *list, char *name)  			uint16 _si = 1;  			do { -				byte _al = searchTable(_tokens[_si], _zoneFlagNames); +				byte _al = _zoneFlagNames->lookup(_tokens[_si]);  				_si++;  				vD0->_flags |= 1 << (_al - 1);  			} while (!scumm_stricmp(_tokens[_si++], "|")); @@ -304,7 +304,7 @@ void Parallaction::parseScriptLine(Instruction *inst, Animation *a, LocalVariabl  		a = findAnimation(&_tokens[1][2]);  	} -	int16 _si = searchTable(_tokens[0], _instructionNames); +	int16 _si = _instructionNames->lookup(_tokens[0]);  	inst->_index = _si;  //	printf("token[0] = %s (%i)\n", _tokens[0], inst->_index); @@ -395,7 +395,7 @@ void Parallaction::parseScriptLine(Instruction *inst, Animation *a, LocalVariabl  		break;  	case INST_CALL: {	// call -		int16 _ax = searchTable(_tokens[1], _callableNames); +		int16 _ax = _callableNames->lookup(_tokens[1]);  		inst->_opBase._index = _ax - 1;  		if (_ax - 1 < 0) exit(0);  	} @@ -497,7 +497,7 @@ void jobRunScripts(void *parm, Job *j) {  		while ((inst->_index != INST_SHOW) && (a->_flags & kFlagsActing)) { -			debugC(1, kDebugJobs, "Animation: %s, instruction: %s", a->_label._text, inst->_index == INST_END ? "end" : _instructionNames[inst->_index - 1]); +			debugC(1, kDebugJobs, "Animation: %s, instruction: %s", a->_label._text, inst->_index == INST_END ? "end" : _instructionNamesRes[inst->_index - 1]);  			switch (inst->_index) {  			case INST_ENDLOOP:	// endloop diff --git a/engines/parallaction/commands.cpp b/engines/parallaction/commands.cpp index cac2983254..095816d3b7 100644 --- a/engines/parallaction/commands.cpp +++ b/engines/parallaction/commands.cpp @@ -59,7 +59,7 @@ Command *Parallaction::parseCommands(Script &script) {  		Command *cmd = new Command; -		cmd->_id = _vm->searchTable(_tokens[0], commands_names); +		cmd->_id = _commandsNames->lookup(_tokens[0]);  		uint16 _si = 1;  //		printf("cmd id = %i", cmd->_id); @@ -68,9 +68,9 @@ Command *Parallaction::parseCommands(Script &script) {  		case CMD_SET:	// set  		case CMD_CLEAR: // clear  		case CMD_TOGGLE:	// toggle -			if (_vm->searchTable(_tokens[1], const_cast<const char **>(_globalTable)) == -1) { +			if (_globalTable->lookup(_tokens[1]) == -1) {  				do { -					char _al = _vm->searchTable(_tokens[_si], const_cast<const char **>(_localFlagNames)); +					char _al = _localFlagNames->lookup(_tokens[_si]);  					_si++;  					cmd->u._flags |= 1 << (_al - 1);  				} while (!scumm_stricmp(_tokens[_si++], "|")); @@ -78,7 +78,7 @@ Command *Parallaction::parseCommands(Script &script) {  			} else {  				cmd->u._flags |= kFlagsGlobal;  				do { -					char _al = _vm->searchTable(_tokens[1], const_cast<const char **>(_globalTable)); +					char _al = _globalTable->lookup(_tokens[1]);  					_si++;  					cmd->u._flags |= 1 << (_al - 1);  				} while (!scumm_stricmp(_tokens[_si++], "|")); @@ -114,12 +114,12 @@ Command *Parallaction::parseCommands(Script &script) {  			break;  		case CMD_CALL:	// call -			cmd->u._callable = _vm->searchTable(_tokens[_si], _callableNames) - 1; +			cmd->u._callable = _callableNames->lookup(_tokens[_si]) - 1;  			_si++;  			break;  		case CMD_DROP:	// drop -			cmd->u._object = _vm->searchTable(_tokens[_si], const_cast<const char **>(_objectsNames)); +			cmd->u._object = _objectsNames->lookup(_tokens[_si]);  			_si++;  			break; @@ -146,10 +146,10 @@ Command *Parallaction::parseCommands(Script &script) {  					cmd->_flagsOn |= kFlagsEnter;  				} else  				if (!scumm_strnicmp(_tokens[_si], "no", 2)) { -					byte _al = _vm->searchTable(&_tokens[_si][2], const_cast<const char **>(_localFlagNames)); +					byte _al = _localFlagNames->lookup(&_tokens[_si][2]);  					cmd->_flagsOff |= 1 << (_al - 1);  				} else { -					byte _al = _vm->searchTable(_tokens[_si], const_cast<const char **>(_localFlagNames)); +					byte _al = _localFlagNames->lookup(_tokens[_si]);  					cmd->_flagsOn |= 1 << (_al - 1);  				} @@ -171,10 +171,10 @@ Command *Parallaction::parseCommands(Script &script) {  					cmd->_flagsOn |= kFlagsEnter;  				} else  				if (!scumm_strnicmp(_tokens[_si], "no", 2)) { -					byte _al = _vm->searchTable(&_tokens[_si][2], const_cast<const char **>(_globalTable)); +					byte _al = _globalTable->lookup(&_tokens[_si][2]);  					cmd->_flagsOff |= 1 << (_al - 1);  				} else { -					byte _al = _vm->searchTable(_tokens[_si], const_cast<const char **>(_globalTable)); +					byte _al = _globalTable->lookup(_tokens[_si]);  					cmd->_flagsOn |= 1 << (_al - 1);  				} @@ -229,7 +229,7 @@ void Parallaction::runCommands(Command *list, Zone *z) {  		if ((cmd->_flagsOn & v8) != cmd->_flagsOn) continue;  		if ((cmd->_flagsOff & ~v8) != cmd->_flagsOff) continue; -		debugC(1, kDebugLocation, "runCommands: %s (on: %x, off: %x)", commands_names[cmd->_id-1], cmd->_flagsOn, cmd->_flagsOff); +		debugC(1, kDebugLocation, "runCommands: %s (on: %x, off: %x)", _commandsNamesRes[cmd->_id-1], cmd->_flagsOn, cmd->_flagsOff);  		switch (cmd->_id) { diff --git a/engines/parallaction/dialogue.cpp b/engines/parallaction/dialogue.cpp index d4576f60f6..166da25380 100644 --- a/engines/parallaction/dialogue.cpp +++ b/engines/parallaction/dialogue.cpp @@ -64,7 +64,7 @@ Dialogue *Parallaction::parseDialogue(Script &script) {  //	printf("parseDialogue()\n");  	uint16 num_questions = 0;  	uint16 v50[20]; -	char *_questions_names[20]; +	Table _questions_names(20);  	Question *_questions[20];  	for (uint16 _si = 0; _si < 20; _si++) { @@ -79,8 +79,7 @@ Dialogue *Parallaction::parseDialogue(Script &script) {  		_questions[num_questions] = new Dialogue;  		Dialogue *vB4 = _questions[num_questions]; -		_questions_names[num_questions] = (char*)malloc(strlen(_tokens[1])+1); -		strcpy(_questions_names[num_questions], _tokens[1]); +		_questions_names.addData(_tokens[1]);  		vB4->_text = parseDialogueString(script);  //		printf("Question: '%s'\n", vB4->_text); @@ -93,24 +92,24 @@ Dialogue *Parallaction::parseDialogue(Script &script) {  		fillBuffers(script, true);  		while (scumm_stricmp(_tokens[0], "endquestion")) {	// parse answers -			const char** v60 = const_cast<const char **>(_localFlagNames); -			uint16 v56 = 1; -  			if (_tokens[1][0]) { +				Table* v60 = _localFlagNames; +				uint16 v56 = 1; +  				if (!scumm_stricmp(_tokens[1], "global")) {  					v56 = 2; -					v60 = const_cast<const char **>(_globalTable); +					v60 = _globalTable;  					vB4->_yesFlags[_di] |= kFlagsGlobal;  				}  				do {  					if (!scumm_strnicmp(_tokens[v56], "no", 2)) { -						byte _al = _vm->searchTable(_tokens[v56]+2, v60); +						byte _al = v60->lookup(_tokens[v56]+2);  						vB4->_noFlags[_di] |= 1 << (_al - 1);  					} else { -						byte _al = _vm->searchTable(_tokens[v56], v60); +						byte _al = v60->lookup(_tokens[v56]);  						vB4->_yesFlags[_di] |= 1 << (_al - 1);  					} @@ -142,14 +141,12 @@ Dialogue *Parallaction::parseDialogue(Script &script) {  	} -	_questions_names[num_questions] = NULL; -  	for (uint16 _si = 0; _si <num_questions; _si++) {  		for (uint16 v5A = 0; v5A < 5; v5A++) {  			if (_questions[_si]->_answers[v5A] == 0) continue; -			int16 v58 = _vm->searchTable(_questions[_si]->_following._names[v5A], const_cast<const char **>(_questions_names)); +			int16 v58 = _questions_names.lookup(_questions[_si]->_following._names[v5A]);  			free(_questions[_si]->_following._names[v5A]);  			if (v58 == -1) { @@ -166,9 +163,6 @@ Dialogue *Parallaction::parseDialogue(Script &script) {  		}  	} -	for (uint16 _si = 0; _si < num_questions; _si++) -		free(_questions_names[_si]); -  	return _questions[0];  } diff --git a/engines/parallaction/disk.cpp b/engines/parallaction/disk.cpp index 052a218071..5fa595d04b 100644 --- a/engines/parallaction/disk.cpp +++ b/engines/parallaction/disk.cpp @@ -68,8 +68,6 @@ void Disk::setLanguage(uint16 language) {  	return;  } - -  #pragma mark - @@ -532,6 +530,26 @@ void DosDisk::loadScenery(const char *name, const char *mask) {  } +Table* DosDisk::loadTable(const char* name) { +	char path[PATH_LEN]; +	sprintf(path, "%s.tab", name); + +	Common::File	stream; +	if (!stream.open(path)) +		errorFileNotFound(path); + +	Table *t = new Table(100); + +	fillBuffers(stream); +	while (scumm_stricmp(_tokens[0], "ENDTABLE")) { +		t->addData(_tokens[0]); +		fillBuffers(stream); +	} + +	stream.close(); + +	return t; +}  #pragma mark - @@ -591,7 +609,23 @@ void AmigaDisk::loadScenery(const char* background, const char* mask) {  	return;  } +Table* AmigaDisk::loadTable(const char* name) { + +	char path[PATH_LEN]; +	sprintf(path, "%s.table", name); + +	_archive.openArchivedFile(path); +	Table *t = new Table(100); + +	fillBuffers(_archive); +	while (scumm_stricmp(_tokens[0], "ENDTABLE")) { +		t->addData(_tokens[0]); +		fillBuffers(_archive); +	} + +	return t; +}  } // namespace Parallaction diff --git a/engines/parallaction/disk.h b/engines/parallaction/disk.h index 552a68b907..5d2473e4fb 100644 --- a/engines/parallaction/disk.h +++ b/engines/parallaction/disk.h @@ -35,6 +35,7 @@ namespace Parallaction {  #define MAX_ARCHIVE_ENTRIES 		384 +class Table;  class Parallaction;  class Gfx;  class Script; @@ -101,7 +102,7 @@ public:  	virtual Cnv* loadFrames(const char* name) = 0;  	virtual void loadSlide(const char *filename) = 0;  	virtual void loadScenery(const char* background, const char* mask) = 0; - +	virtual Table* loadTable(const char* name) = 0;  }; @@ -136,6 +137,7 @@ public:  	Cnv* loadFrames(const char* name);  	void loadSlide(const char *filename);  	void loadScenery(const char* background, const char* mask); +	Table* loadTable(const char* name);  };  class AmigaDisk : public Disk { @@ -155,6 +157,7 @@ public:  	Cnv* loadFrames(const char* name);  	void loadSlide(const char *filename);  	void loadScenery(const char* background, const char* mask); +	Table* loadTable(const char* name);  };  } // namespace Parallaction diff --git a/engines/parallaction/location.cpp b/engines/parallaction/location.cpp index 597f867573..41fe5c467e 100644 --- a/engines/parallaction/location.cpp +++ b/engines/parallaction/location.cpp @@ -38,7 +38,7 @@ void parseWalkNodes(Script &script, Node *list);  void Parallaction::parseLocation(const char *filename) { -	printf("parseLocation(%s)", filename); +//	printf("parseLocation(%s)", filename);      debugC(1, kDebugLocation, "parseLocation('%s')", filename);  	uint16 _si = 1; @@ -49,7 +49,7 @@ void Parallaction::parseLocation(const char *filename) {  	fillBuffers(*_locationScript, true);  	while (scumm_stricmp(_tokens[0], "ENDLOCATION")) { -		printf("token[0] = %s", _tokens[0]); +//		printf("token[0] = %s", _tokens[0]);  		if (!scumm_stricmp(_tokens[0], "LOCATION")) {  			// The parameter for location is 'location.mask'. @@ -106,11 +106,9 @@ void Parallaction::parseLocation(const char *filename) {  		if (!scumm_stricmp(_tokens[0], "LOCALFLAGS")) {  			_si = 1;	// _localFlagNames[0] = 'visited'  			while (_tokens[_si][0] != '\0') { -				_localFlagNames[_si] = (char*)malloc(strlen(_tokens[_si])+1); -				strcpy(_localFlagNames[_si], _tokens[_si]); +				_localFlagNames->addData(_tokens[_si]);  				_si++;  			} -			_localFlagNames[_si] = 0;  		}  		if (!scumm_stricmp(_tokens[0], "COMMANDS")) {  			_location._commands = parseCommands(*_locationScript); @@ -125,7 +123,7 @@ void Parallaction::parseLocation(const char *filename) {  				_si = 1;  				do { -					byte _al = searchTable(_tokens[_si], const_cast<const char **>(_localFlagNames)); +					byte _al = _localFlagNames->lookup(_tokens[_si]);  					_localFlags[_currentLocationIndex] |= 1 << (_al - 1);  					_si++; @@ -180,14 +178,12 @@ void resolveLocationForwards() {  void Parallaction::freeLocation() {  	debugC(7, kDebugLocation, "freeLocation"); -	uint16 _si = 1; -	while (_localFlagNames[_si] != 0) { -		free(_localFlagNames[_si]); -		_localFlagNames[_si] = NULL; -		_si++; -	} -	debugC(7, kDebugLocation, "freeLocation: localflags names freed"); +	if (_localFlagNames) +		delete _localFlagNames; +	_localFlagNames = new Table(120); +	_localFlagNames->addData("visited"); +	debugC(7, kDebugLocation, "freeLocation: localflags names freed");  	freeNodeList(_vm->_location._walkNodes._next);  	_vm->_location._walkNodes._next = NULL; diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp index 5c2c94f1b4..7b254655c7 100644 --- a/engines/parallaction/parallaction.cpp +++ b/engines/parallaction/parallaction.cpp @@ -55,50 +55,11 @@ char		_saveData1[30] = { '\0' };  uint16		_language = 0;  char		_slideText[2][40];  uint32		_engineFlags = 0; -char	   *_objectsNames[100];  Zone	   *_activeZone = NULL;  uint16		_score = 1;  uint32		_localFlags[120] = { 0 }; - -static char tmp_visited_str[] = "visited"; - -char *_localFlagNames[32] = { -	tmp_visited_str, // "visited", -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0, -	0 -}; -  Command *	_forwardedCommands[20] = {  	NULL,  	NULL, @@ -126,8 +87,6 @@ char		_forwardedAnimationNames[20][20];  uint16		_numForwards = 0;  char		_soundFile[20]; -char	   *_globalTable[32]; -  byte		_mouseHidden = 0;  uint32		_commandFlags = 0; @@ -167,6 +126,19 @@ Parallaction::Parallaction(OSystem *syst) :  Parallaction::~Parallaction() {  	delete _midiPlayer;  	delete _disk; +	delete _globalTable; + +	if (_objectsNames) +		delete _objectsNames; + +	delete _callableNames; +	delete _commandsNames; +	delete _instructionNames; +	delete _zoneTypeNames; +	delete _zoneFlagNames; + +	if (_localFlagNames) +		delete _localFlagNames;  } @@ -178,6 +150,11 @@ int Parallaction::init() {  		return -1;  	} +	_objectsNames = NULL; +	_globalTable = NULL; +	_localFlagNames = NULL; +	initResources(); +  	_skipMenu = false;  	_transCurrentHoverItem = 0; @@ -278,8 +255,7 @@ void Parallaction::initGame() {  }  void Parallaction::initGlobals() { - -	initTable("global.tab", _globalTable); +	_globalTable = _disk->loadTable("global");  }  // FIXME: the engine has 3 event loops. The following routine hosts the main one, @@ -721,7 +697,7 @@ void Parallaction::changeCursor(int32 index) { -void freeCharacter() { +void Parallaction::freeCharacter() {  	_vm->_gfx->freeCnv(_vm->_char._normalFrames);  	if (_vm->_char._normalFrames) delete _vm->_char._normalFrames; @@ -730,7 +706,8 @@ void freeCharacter() {  		_vm->_gfx->freeCnv(_vm->_char._miniFrames);  		if (_vm->_char._miniFrames) delete _vm->_char._miniFrames; -		_vm->freeTable(_objectsNames); +		if (_objectsNames) delete _objectsNames; +		_objectsNames = NULL;  		_vm->_gfx->freeCnv(_vm->_char._talk);  		if (_vm->_char._talk) delete _vm->_char._talk; @@ -829,8 +806,7 @@ void Parallaction::changeCharacter(const char *name) {  			sprintf(path, "mini%s", v32);  			_vm->_char._miniFrames = _disk->loadFrames(path); -			sprintf(path, "%s.tab", name); -			initTable(path, _objectsNames); +			_objectsNames = _disk->loadTable(name);  			refreshInventory(name); @@ -970,64 +946,42 @@ void jobWaitRemoveJob(void *parm, Job *j) {  } -void Parallaction::initTable(const char *path, char** table) { -//	printf("initTable(%s)\n", path); - -	Common::File	stream; - -	if (!stream.open(path)) -		errorFileNotFound(path); - -	uint16 count = 0; - -	fillBuffers(stream); -	while (scumm_stricmp(_tokens[0], "ENDTABLE")) { +Table::Table(uint32 size) : _size(size), _used(0), _disposeMemory(true) { +	_data = (char**)malloc(sizeof(char*)*size); +} -		table[count] = (char*)malloc(strlen(_tokens[0])+1); -		strcpy(table[count], _tokens[0]); +Table::Table(uint32 size, const char **data) : _size(size), _used(size), _disposeMemory(false) { +	_data = const_cast<char**>(data); +} -		count++; -		fillBuffers(stream); -	} +Table::~Table() { -	table[count] = NULL; +	if (!_disposeMemory) return; -	stream.close(); +	for (uint32 i = 0; i < _used; i++) +		free(_data[i]); -	return; +	free(_data);  } -void Parallaction::freeTable(char** table) { - -	uint16 count = 0; - -	while (table[count]) { +void Table::addData(const char* s) { -		free(table[count]); -		table[count] = NULL; +	if (!(_used < _size)) +		error("Table overflow"); -		count++; -	} - -	return; +	_data[_used++] = strdup(s);  } -int16 Parallaction::searchTable(const char *s, const char **table) { +int16 Table::lookup(const char* s) { -	int16 count = 0; - -	if (!s) return 0; - -	while (table[count]) { -		if (!scumm_stricmp(table[count], s)) return count + 1; -		count++; +	for (uint16 i = 0; i < _used; i++) { +		if (!scumm_stricmp(_data[i], s)) return i + 1;  	}  	return -1;  } -  } // namespace Parallaction diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index 665a389013..611381c5ca 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -118,19 +118,12 @@ extern char _slideText[][40];  extern uint16 _introSarcData3;		 // sarcophagus stuff to be saved  extern uint16 _introSarcData2;		 // sarcophagus stuff to be saved -extern char *_globalTable[];  extern char _saveData1[];  extern byte _mouseHidden;  extern uint32 _commandFlags; -extern char *_objectsNames[]; -extern const char *_zoneTypeNames[]; -extern const char *_zoneFlagNames[]; -extern char *_localFlagNames[]; -extern const char *commands_names[]; - -extern const char *_instructionNames[]; -extern const char *_callableNames[]; +extern const char *_instructionNamesRes[]; +extern const char *_commandsNamesRes[];  extern const char *_dinoName;  extern const char *_donnaName; @@ -264,6 +257,26 @@ struct Character {  }; + +class Table { + +	char	**_data; +	uint16	_size; +	uint16	_used; +	bool	_disposeMemory; + +public: +	Table(uint32 size); +	Table(uint32 size, const char** data); + +	~Table(); + +	void addData(const char* s); + +	int16 lookup(const char* s); +}; + +  class Parallaction : public Engine {  public: @@ -283,9 +296,9 @@ public:  	void waitTime(uint32 t); -	static void initTable(const char *path, char **table); -	static void freeTable(char** table); -	static int16 searchTable(const char *s, const char **table); +//	static void initTable(const char *path, char **table); +//	static void freeTable(char** table); +//	static int16 searchTable(const char *s, const char **table);  	void parseLocation(const char *filename);  	void changeCursor(int32 index); @@ -301,6 +314,15 @@ public:  	void resumeJobs();  	void runJobs(); +	Table		*_globalTable; +	Table		*_objectsNames; +	Table		*_zoneTypeNames; +	Table		*_zoneFlagNames; +	Table		*_commandsNames; +	Table		*_callableNames; +	Table		*_instructionNames; +	Table		*_localFlagNames; +  	void 		freeZones(Node *list);  	Animation  	*findAnimation(const char *name);  	Zone 		*findZone(const char *name); @@ -418,6 +440,9 @@ protected:		// members  	Command 	*parseCommands(Script &script);  	void 		freeCommands(Command*); +	void 		freeCharacter(); + +	void 		initResources();  }; diff --git a/engines/parallaction/staticres.cpp b/engines/parallaction/staticres.cpp index 9a233b6a6a..076ad8bf5d 100644 --- a/engines/parallaction/staticres.cpp +++ b/engines/parallaction/staticres.cpp @@ -20,8 +20,10 @@   *   */ +#include "parallaction/parallaction.h"  #include "parallaction/graphics.h" +  namespace Parallaction {  byte Gfx::_mouseArrow[256] = { @@ -45,7 +47,7 @@ byte Gfx::_mouseArrow[256] = { -const char *_zoneFlagNames[] = { +const char *_zoneFlagNamesRes[] = {  	"closed",  	"active",  	"remove", @@ -57,11 +59,10 @@ const char *_zoneFlagNames[] = {  	"looping",  	"added",  	"character", -	"nowalk", -	0 +	"nowalk"  }; -const char *_zoneTypeNames[] = { +const char *_zoneTypeNamesRes[] = {  	"examine",  	"door",  	"get", @@ -73,8 +74,7 @@ const char *_zoneTypeNames[] = {  	"none",  	"trap",  	"yourself", -	"Command", -	0 +	"Command"  };  const char _gameNames[10][20] = { @@ -90,7 +90,7 @@ const char _gameNames[10][20] = {  	"GAME10"  }; -const char *commands_names[] = { +const char *_commandsNamesRes[] = {  	"set",  	"clear",  	"start", @@ -106,11 +106,10 @@ const char *commands_names[] = {  	"drop",  	"quit",  	"move", -	"stop", -	0 +	"stop"  }; -const char *_instructionNames[] = { +const char *_instructionNamesRes[] = {  	"on",  	"off",  	"x", @@ -128,11 +127,10 @@ const char *_instructionNames[] = {  	"wait",  	"start",  	"sound", -	"move", -	0 +	"move"  }; -const char *_callableNames[] = { +const char *_callableNamesRes[] = {  	"HBOff",  	"Projector",  	"StartIntro", @@ -157,8 +155,7 @@ const char *_callableNames[] = {  	"Frankenstain",  	"Finito",  	"Ridux", -	"TestResult", -	0 +	"TestResult"  }; @@ -238,4 +235,18 @@ const char *_minidoughName = "minidough";  const char *_minidrkiName = "minidrki"; +void Parallaction::initResources() { + +	_callableNames = new Table(ARRAYSIZE(_callableNamesRes), _callableNamesRes); +	_instructionNames = new Table(ARRAYSIZE(_instructionNamesRes), _instructionNamesRes); +	_zoneFlagNames = new Table(ARRAYSIZE(_zoneFlagNamesRes), _zoneFlagNamesRes); +	_zoneTypeNames = new Table(ARRAYSIZE(_zoneTypeNamesRes), _zoneTypeNamesRes); +	_commandsNames = new Table(ARRAYSIZE(_commandsNamesRes), _commandsNamesRes); + +	_localFlagNames = new Table(120); +	_localFlagNames->addData("visited"); + +} + +  } // namespace Parallaction diff --git a/engines/parallaction/zone.cpp b/engines/parallaction/zone.cpp index 19ac4f80e5..a7a8b8a31b 100644 --- a/engines/parallaction/zone.cpp +++ b/engines/parallaction/zone.cpp @@ -80,9 +80,9 @@ void Parallaction::parseZone(Script &script, Node *list, char *name) {  		}  		if (!scumm_stricmp(_tokens[0], "type")) {  			if (_tokens[2][0] != '\0') { -				z->_type = (4 + searchTable(_tokens[2], const_cast<const char **>(_objectsNames))) << 16; +				z->_type = (4 + _objectsNames->lookup(_tokens[2])) << 16;  			} -			int16 _si = searchTable(_tokens[1], _zoneTypeNames); +			int16 _si = _zoneTypeNames->lookup(_tokens[1]);  			if (_si != -1) {  				z->_type |= 1 << (_si - 1);  				parseZoneTypeBlock(script, z); @@ -100,7 +100,7 @@ void Parallaction::parseZone(Script &script, Node *list, char *name) {  			uint16 _si = 1;  			do { -				char _al = searchTable(_tokens[_si], _zoneFlagNames); +				char _al = _zoneFlagNames->lookup(_tokens[_si]);  				_si++;  				z->_flags |= 1 << (_al - 1);  			} while (!scumm_stricmp(_tokens[_si++], "|")); @@ -307,19 +307,19 @@ void Parallaction::parseZoneTypeBlock(Script &script, Zone *z) {  			}  			if (!scumm_stricmp(_tokens[0], "icon")) { -				u->get->_icon = 4 + searchTable(_tokens[1], const_cast<const char **>(_objectsNames)); +				u->get->_icon = 4 + _objectsNames->lookup(_tokens[1]);  			}  			break;  		case kZoneMerge: // merge Zone init  			if (!scumm_stricmp(_tokens[0], "obj1")) { -				u->merge->_obj1 = 4 + searchTable(_tokens[1], const_cast<const char **>(_objectsNames)); +				u->merge->_obj1 = 4 + _objectsNames->lookup(_tokens[1]);  			}  			if (!scumm_stricmp(_tokens[0], "obj2")) { -				u->merge->_obj2 = 4 + searchTable(_tokens[1], const_cast<const char **>(_objectsNames)); +				u->merge->_obj2 = 4 + _objectsNames->lookup(_tokens[1]);  			}  			if (!scumm_stricmp(_tokens[0], "newobj")) { -				u->merge->_obj3 = 4 + searchTable(_tokens[1], const_cast<const char **>(_objectsNames)); +				u->merge->_obj3 = 4 + _objectsNames->lookup(_tokens[1]);  			}  			break; | 
