aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicola Mettifogo2007-08-14 08:03:13 +0000
committerNicola Mettifogo2007-08-14 08:03:13 +0000
commit76e1be89c38cde652d22128f921f16c266ef7565 (patch)
treec99916aa43a44b1363f263147242e505734f1dd2
parent92ea1804cab4e3b3adfdeeb1f99626eeda180f96 (diff)
downloadscummvm-rg350-76e1be89c38cde652d22128f921f16c266ef7565.tar.gz
scummvm-rg350-76e1be89c38cde652d22128f921f16c266ef7565.tar.bz2
scummvm-rg350-76e1be89c38cde652d22128f921f16c266ef7565.zip
Partially reverting commit 28568, so now engine is back in charge for parsing locations. I'm going to convert this if/else/else hell into smaller opcode-like routines to achieve more flexibility first, and then assign version-specific opcodes to subclasses.
svn-id: r28609
-rw-r--r--engines/parallaction/location.cpp140
-rw-r--r--engines/parallaction/parallaction.h5
-rw-r--r--engines/parallaction/parallaction_br.cpp4
-rw-r--r--engines/parallaction/parallaction_ns.cpp44
4 files changed, 88 insertions, 105 deletions
diff --git a/engines/parallaction/location.cpp b/engines/parallaction/location.cpp
index 001c5a8d03..8dce3e1225 100644
--- a/engines/parallaction/location.cpp
+++ b/engines/parallaction/location.cpp
@@ -39,7 +39,7 @@ void Parallaction::parseLocation(const char *filename) {
uint16 _si = 1;
_gfx->setFont(_labelFont);
- Script *_locationScript = _disk->loadLocation(filename);
+ Script *script = _disk->loadLocation(filename);
_hasLocationSound = false;
// WORKAROUND: the original code erroneously incremented
@@ -68,71 +68,101 @@ void Parallaction::parseLocation(const char *filename) {
}
- fillBuffers(*_locationScript, true);
-
- printf("ciao (%s)\n", filename);
+ fillBuffers(*script, true);
while (scumm_stricmp(_tokens[0], "ENDLOCATION")) {
printf("inst = %s\n", _tokens[0]);
- bool parsed = parseLocationLine(filename, _locationScript);
- if (!parsed) {
+ if (!scumm_stricmp(_tokens[0], "LOCATION")) {
+ // The parameter for location is 'location.mask'.
+ // If mask is not present, then it is assumed
+ // that path & mask are encoded in the background
+ // bitmap, otherwise a separate .msk file exists.
+
+ char *mask = strchr(_tokens[1], '.');
+ if (mask) {
+ mask[0] = '\0';
+ mask++;
+ }
+
+ strcpy(_location._name, _tokens[1]);
+ switchBackground(_location._name, mask);
+
+ if (_tokens[2][0] != '\0') {
+ _char._ani._left = atoi(_tokens[2]);
+ _char._ani._top = atoi(_tokens[3]);
+ }
+
+ if (_tokens[4][0] != '\0') {
+ _char._ani._frame = atoi(_tokens[4]);
+ }
+ } else
+ if (!scumm_stricmp(_tokens[0], "DISK")) {
+ _disk->selectArchive(_tokens[1]);
+ } else
+ if (!scumm_stricmp(_tokens[0], "NODES")) {
+ parseWalkNodes(*script, _location._walkNodes);
+ } else
+ if (!scumm_stricmp(_tokens[0], "ZONE")) {
+ parseZone(*script, _zones, _tokens[1]);
+ } else
+ if (!scumm_stricmp(_tokens[0], "ANIMATION")) {
+ parseAnimation(*script, _animations, _tokens[1]);
+ } else
+ if (!scumm_stricmp(_tokens[0], "LOCALFLAGS")) {
+ _si = 1; // _localFlagNames[0] = 'visited'
+ while (_tokens[_si][0] != '\0') {
+ _localFlagNames->addData(_tokens[_si]);
+ _si++;
+ }
+ } else
+ if (!scumm_stricmp(_tokens[0], "COMMANDS")) {
+ parseCommands(*script, _location._commands);
+ } else
+ if (!scumm_stricmp(_tokens[0], "ACOMMANDS")) {
+ parseCommands(*script, _location._aCommands);
+ } else
+ if (!scumm_stricmp(_tokens[0], "FLAGS")) {
+ if ((_localFlags[_currentLocationIndex] & kFlagsVisited) == 0) {
+ // only for 1st visit
+ _localFlags[_currentLocationIndex] = 0;
+ _si = 1;
+
+ do {
+ byte _al = _localFlagNames->lookup(_tokens[_si]);
+ _localFlags[_currentLocationIndex] |= 1 << (_al - 1);
- if (!scumm_stricmp(_tokens[0], "LOCALFLAGS")) {
- _si = 1; // _localFlagNames[0] = 'visited'
- while (_tokens[_si][0] != '\0') {
- _localFlagNames->addData(_tokens[_si]);
_si++;
- }
- } else
- if (!scumm_stricmp(_tokens[0], "COMMANDS")) {
- parseCommands(*_locationScript, _location._commands);
- } else
- if (!scumm_stricmp(_tokens[0], "ACOMMANDS")) {
- parseCommands(*_locationScript, _location._aCommands);
- } else
- if (!scumm_stricmp(_tokens[0], "FLAGS")) {
- if ((_localFlags[_currentLocationIndex] & kFlagsVisited) == 0) {
- // only for 1st visit
- _localFlags[_currentLocationIndex] = 0;
- _si = 1;
-
- do {
- byte _al = _localFlagNames->lookup(_tokens[_si]);
- _localFlags[_currentLocationIndex] |= 1 << (_al - 1);
-
- _si++;
- if (scumm_stricmp(_tokens[_si], "|")) break;
- _si++;
- } while (true);
- }
- } else
- if (!scumm_stricmp(_tokens[0], "COMMENT")) {
- _location._comment = parseComment(*_locationScript);
- } else
- if (!scumm_stricmp(_tokens[0], "ENDCOMMENT")) {
- _location._endComment = parseComment(*_locationScript);
- } else
- if (!scumm_stricmp(_tokens[0], "SOUND")) {
- if (getPlatform() == Common::kPlatformAmiga) {
- strcpy(_locationSound, _tokens[1]);
- _hasLocationSound = true;
- }
- } else
- if (!scumm_stricmp(_tokens[0], "MUSIC")) {
- if (getPlatform() == Common::kPlatformAmiga)
- _soundMan->setMusicFile(_tokens[1]);
- } else
- error("unknown keyword '%s' in location '%s'", _tokens[0], filename);
- }
-
- fillBuffers(*_locationScript, true);
+ if (scumm_stricmp(_tokens[_si], "|")) break;
+ _si++;
+ } while (true);
+ }
+ } else
+ if (!scumm_stricmp(_tokens[0], "COMMENT")) {
+ _location._comment = parseComment(*script);
+ } else
+ if (!scumm_stricmp(_tokens[0], "ENDCOMMENT")) {
+ _location._endComment = parseComment(*script);
+ } else
+ if (!scumm_stricmp(_tokens[0], "SOUND")) {
+ if (getPlatform() == Common::kPlatformAmiga) {
+ strcpy(_locationSound, _tokens[1]);
+ _hasLocationSound = true;
+ }
+ } else
+ if (!scumm_stricmp(_tokens[0], "MUSIC")) {
+ if (getPlatform() == Common::kPlatformAmiga)
+ _soundMan->setMusicFile(_tokens[1]);
+ } else
+ error("unknown keyword '%s' in location '%s'", _tokens[0], filename);
+
+ fillBuffers(*script, true);
}
resolveLocationForwards();
- delete _locationScript;
+ delete script;
return;
}
diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h
index a190feff04..7c53f74215 100644
--- a/engines/parallaction/parallaction.h
+++ b/engines/parallaction/parallaction.h
@@ -424,7 +424,7 @@ public:
DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(end);
void parseLocation(const char *filename);
- virtual bool parseLocationLine(const char *filename, Script *script) = 0;
+
void changeCursor(int32 index);
void showCursor(bool visible);
void changeCharacter(const char *name);
@@ -628,8 +628,6 @@ public:
virtual void callFunction(uint index, void* parm);
void renderLabel(Graphics::Surface *cnv, char *text);
void setMousePointer(int16 index);
- virtual bool parseLocationLine(const char *filename, Script *script);
-
public:
Menu* _menu;
@@ -696,7 +694,6 @@ public:
public:
typedef void (Parallaction_br::*Callable)(void*);
virtual void callFunction(uint index, void* parm);
- virtual bool parseLocationLine(const char *filename, Script *script);
public:
Table *_countersNames;
diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp
index 82dfd96f54..955994a307 100644
--- a/engines/parallaction/parallaction_br.cpp
+++ b/engines/parallaction/parallaction_br.cpp
@@ -350,7 +350,7 @@ void skip(Script* script, const char* endToken) {
}
}
-
+#if 0
bool Parallaction_br::parseLocationLine(const char *filename, Script *script) {
bool parsed = true;
@@ -420,6 +420,6 @@ bool Parallaction_br::parseLocationLine(const char *filename, Script *script) {
return parsed;
}
-
+#endif
} // namespace Parallaction
diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp
index 38e2d999ff..e98ef3847c 100644
--- a/engines/parallaction/parallaction_ns.cpp
+++ b/engines/parallaction/parallaction_ns.cpp
@@ -199,49 +199,5 @@ int Parallaction_ns::go() {
return 0;
}
-bool Parallaction_ns::parseLocationLine(const char *filename, Script *script) {
-
- bool parsed = true;
-
- if (!scumm_stricmp(_tokens[0], "LOCATION")) {
- // The parameter for location is 'location.mask'.
- // If mask is not present, then it is assumed
- // that path & mask are encoded in the background
- // bitmap, otherwise a separate .msk file exists.
-
- char *mask = strchr(_tokens[1], '.');
- if (mask) {
- mask[0] = '\0';
- mask++;
- }
-
- strcpy(_location._name, _tokens[1]);
- switchBackground(_location._name, mask);
-
- if (_tokens[2][0] != '\0') {
- _char._ani._left = atoi(_tokens[2]);
- _char._ani._top = atoi(_tokens[3]);
- }
-
- if (_tokens[4][0] != '\0') {
- _char._ani._frame = atoi(_tokens[4]);
- }
- } else
- if (!scumm_stricmp(_tokens[0], "DISK")) {
- _disk->selectArchive(_tokens[1]);
- } else
- if (!scumm_stricmp(_tokens[0], "NODES")) {
- parseWalkNodes(*script, _location._walkNodes);
- } else
- if (!scumm_stricmp(_tokens[0], "ZONE")) {
- parseZone(*script, _zones, _tokens[1]);
- } else
- if (!scumm_stricmp(_tokens[0], "ANIMATION")) {
- parseAnimation(*script, _animations, _tokens[1]);
- } else
- parsed = false;
-
- return parsed;
-}
} // namespace Parallaction