From 899fdcb3677925a8c1d9b4c9335ae17a2f1cccff Mon Sep 17 00:00:00 2001 From: Nicola Mettifogo Date: Sat, 2 Feb 2008 22:45:31 +0000 Subject: Enabled rudimentary location switch in BRA. svn-id: r30748 --- engines/parallaction/disk_br.cpp | 2 +- engines/parallaction/exec_br.cpp | 16 ++++++++-------- engines/parallaction/parallaction.cpp | 7 +------ engines/parallaction/parallaction.h | 7 ++++--- engines/parallaction/parallaction_br.cpp | 29 +++++++++++++++++++++++++---- engines/parallaction/parallaction_ns.cpp | 8 ++++++++ 6 files changed, 47 insertions(+), 22 deletions(-) (limited to 'engines/parallaction') 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 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. // -- cgit v1.2.3