diff options
Diffstat (limited to 'engines/parallaction')
-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; |