aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/parallaction/disk_br.cpp2
-rw-r--r--engines/parallaction/exec_br.cpp16
-rw-r--r--engines/parallaction/parallaction.cpp7
-rw-r--r--engines/parallaction/parallaction.h7
-rw-r--r--engines/parallaction/parallaction_br.cpp29
-rw-r--r--engines/parallaction/parallaction_ns.cpp8
6 files changed, 47 insertions, 22 deletions
diff --git a/engines/parallaction/disk_br.cpp b/engines/parallaction/disk_br.cpp
index 0a5fe90525..be8c49f829 100644
--- a/engines/parallaction/disk_br.cpp
+++ b/engines/parallaction/disk_br.cpp
@@ -255,7 +255,7 @@ Frames* DosDisk_br::loadFrames(const char* name) {
debugC(5, kDebugDisk, "DosDisk_br::loadFrames");
char path[PATH_LEN];
- sprintf(path, "%s/ani/%s.ani", _partPath, name);
+ sprintf(path, "%s/ani/%s", _partPath, name);
return createSprites(path);
}
diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp
index 69e64f6e5d..567d5ecf79 100644
--- a/engines/parallaction/exec_br.cpp
+++ b/engines/parallaction/exec_br.cpp
@@ -72,8 +72,7 @@ typedef OpcodeImpl<Parallaction_br> OpcodeV2;
void Parallaction_br::setupSubtitles(char *s, char *s2, int y) {
debugC(5, kDebugExec, "setupSubtitles(%s, %s, %i)", s, s2, y);
- _gfx->freeLabels();
- _subtitle[0] = _subtitle[1] = -1;
+ clearSubtitles();
if (!scumm_stricmp("clear", s)) {
return;
@@ -95,10 +94,17 @@ void Parallaction_br::setupSubtitles(char *s, char *s2, int y) {
_subtitleLipSync = 0;
}
+void Parallaction_br::clearSubtitles() {
+ _gfx->freeLabels();
+ _subtitle[0] = _subtitle[1] = -1;
+}
DECLARE_COMMAND_OPCODE(location) {
warning("Parallaction_br::cmdOp_location command not yet implemented");
+
+ // TODO: handle startPos and startPos2
+ scheduleLocationSwitch(_cmdRunCtxt.cmd->u._string);
}
@@ -545,12 +551,6 @@ void Parallaction_br::jobWaitRemoveLabelJob(void *parm, Job *job) {
}
-
-void Parallaction_br::jobWaitRemoveSubtitleJob(void *parm, Job *job) {
-
-}
-
-
void Parallaction_br::jobPauseSfx(void *parm, Job *job) {
}
diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp
index 2de64c8b5d..37981312fb 100644
--- a/engines/parallaction/parallaction.cpp
+++ b/engines/parallaction/parallaction.cpp
@@ -265,7 +265,6 @@ void waitUntilLeftClick() {
return;
}
-
void Parallaction::runGame() {
_inputMode = kInputModeGame;
@@ -273,11 +272,7 @@ void Parallaction::runGame() {
while ((_engineFlags & kEngineQuit) == 0) {
updateInput();
- if (_activeZone) {
- Zone *z = _activeZone; // speak Zone or sound
- _activeZone = NULL;
- runZone(z);
- }
+ runPendingZones();
if (_engineFlags & kEngineChangeLocation) {
changeLocation(_location._name);
diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h
index 9f775b5a63..712902d103 100644
--- a/engines/parallaction/parallaction.h
+++ b/engines/parallaction/parallaction.h
@@ -465,6 +465,7 @@ protected: // members
void doLocationEnterTransition();
virtual void changeLocation(char *location) = 0;
virtual void changeCharacter(const char *name) = 0;
+ virtual void runPendingZones() = 0;
void allocateLocationSlot(const char *name);
void finalizeLocationParsing();
void freeLocation();
@@ -595,6 +596,7 @@ private:
private:
void changeLocation(char *location);
void changeCharacter(const char *name);
+ void runPendingZones();
void cleanupGame();
void setArrowCursor();
@@ -894,6 +896,7 @@ private:
void changeLocation(char *location);
void changeCharacter(const char *name);
+ void runPendingZones();
void initPart();
void freePart();
@@ -1038,11 +1041,9 @@ private:
DECLARE_UNQUALIFIED_INSTRUCTION_OPCODE(endscript);
void setupSubtitles(char *s, char *s2, int y);
+ void clearSubtitles();
#if 0
void jobWaitRemoveLabelJob(void *parm, Job *job);
- void jobDisplaySubtitle(void *parm, Job *job);
- void jobEraseSubtitle(void *parm, Job *job);
- void jobWaitRemoveSubtitleJob(void *parm, Job *job);
void jobPauseSfx(void *parm, Job *job);
void jobStopFollower(void *parm, Job *job);
void jobScroll(void *parm, Job *job);
diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp
index 01b3815e6d..60f6bfe329 100644
--- a/engines/parallaction/parallaction_br.cpp
+++ b/engines/parallaction/parallaction_br.cpp
@@ -181,20 +181,41 @@ void Parallaction_br::startPart() {
strcpy(_location._name, partFirstLocation[_part]);
parseLocation("common");
- parseLocation(_location._name);
-
changeLocation(_location._name);
}
+void Parallaction_br::runPendingZones() {
+ Zone *z;
+
+ if (_activeZone) {
+ z = _activeZone; // speak Zone or sound
+ _activeZone = NULL;
+ runZone(z);
+ }
+
+ if (_activeZone2) {
+ z = _activeZone2; // speak Zone or sound
+ _activeZone2 = NULL;
+ runZone(z);
+ }
+}
+
+
void Parallaction_br::changeLocation(char *location) {
- runCommands(_location._commands);
+ // free open location stuff
+ clearSubtitles();
-// doLocationEnterTransition();
+ freeLocation();
+ // load new location
+ parseLocation(location);
+ runCommands(_location._commands);
+// doLocationEnterTransition();
runCommands(_location._aCommands);
+ _engineFlags &= ~kEngineChangeLocation;
}
void Parallaction_br::changeCharacter(const char *name) {
diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp
index fb240a6108..dabc20db00 100644
--- a/engines/parallaction/parallaction_ns.cpp
+++ b/engines/parallaction/parallaction_ns.cpp
@@ -269,6 +269,14 @@ void Parallaction_ns::showSlide(const char *name) {
_gfx->setBackground(kBackgroundSlide, name, 0, 0);
}
+void Parallaction_ns::runPendingZones() {
+ if (_activeZone) {
+ Zone *z = _activeZone; // speak Zone or sound
+ _activeZone = NULL;
+ runZone(z);
+ }
+}
+
// changeLocation handles transitions between locations, and is able to display slides
// between one and the other.
//