aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/dreamweb/dreamweb.cpp3
-rw-r--r--engines/dreamweb/dreamweb.h6
-rw-r--r--engines/dreamweb/structs.h12
-rw-r--r--engines/dreamweb/stubs.cpp89
4 files changed, 75 insertions, 35 deletions
diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp
index 79c5e0d7be..0a5deb4657 100644
--- a/engines/dreamweb/dreamweb.cpp
+++ b/engines/dreamweb/dreamweb.cpp
@@ -190,9 +190,6 @@ DreamWebEngine::DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gam
_monAdX = 0;
_monAdY = 0;
_timeCount = 0;
- _countToTimed = 0;
- _timedY = 0;
- _timedX = 0;
_needToDumpTimed = 0;
_loadingOrSave = 0;
_saveLoadPage = 0;
diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h
index 8eeb006844..38016e5897 100644
--- a/engines/dreamweb/dreamweb.h
+++ b/engines/dreamweb/dreamweb.h
@@ -186,7 +186,6 @@ private:
uint8 _channel0, _channel1;
protected:
- const char *_timedString;
GameVars _vars; // saved variables
// from backdrop.cpp
@@ -416,10 +415,9 @@ public:
uint16 _monAdX;
uint16 _monAdY;
uint16 _timeCount;
- uint16 _countToTimed;
- uint8 _timedY;
- uint8 _timedX;
uint8 _needToDumpTimed;
+ TimedTemp _previousTimedTemp;
+ TimedTemp _timedTemp;
uint8 _loadingOrSave;
uint8 _saveLoadPage;
uint8 _currentSlot;
diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h
index ddc027120d..cedf2b6d76 100644
--- a/engines/dreamweb/structs.h
+++ b/engines/dreamweb/structs.h
@@ -418,6 +418,18 @@ struct GameVars {
uint8 _shakeCounter;
};
+struct TimedTemp {
+ TimedTemp() : _timeCount(0), _string(0) { }
+
+ uint8 _x;
+ uint8 _y;
+
+ uint16 _timeCount;
+ uint16 _countToTimed;
+
+ const char *_string;
+};
+
} // End of namespace DreamWeb
#endif
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 5f05f290ad..d93add6b42 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -864,16 +864,16 @@ void DreamWebEngine::dumpTextLine() {
void DreamWebEngine::getUnderTimed() {
if (_foreignRelease)
- multiGet(_underTimedText, _timedX, _timedY - 3, 240, kUnderTimedTextSizeY_f);
+ multiGet(_underTimedText, _timedTemp._x, _timedTemp._y - 3, 240, kUnderTimedTextSizeY_f);
else
- multiGet(_underTimedText, _timedX, _timedY, 240, kUnderTimedTextSizeY);
+ multiGet(_underTimedText, _timedTemp._x, _timedTemp._y, 240, kUnderTimedTextSizeY);
}
void DreamWebEngine::putUnderTimed() {
if (_foreignRelease)
- multiPut(_underTimedText, _timedX, _timedY - 3, 240, kUnderTimedTextSizeY_f);
+ multiPut(_underTimedText, _timedTemp._x, _timedTemp._y - 3, 240, kUnderTimedTextSizeY_f);
else
- multiPut(_underTimedText, _timedX, _timedY, 240, kUnderTimedTextSizeY);
+ multiPut(_underTimedText, _timedTemp._x, _timedTemp._y, 240, kUnderTimedTextSizeY);
}
void DreamWebEngine::triggerMessage(uint16 index) {
@@ -903,6 +903,23 @@ void DreamWebEngine::processTrigger() {
}
void DreamWebEngine::useTimedText() {
+ if (_previousTimedTemp._string) {
+ // TODO: It might be nice to make subtitles wait for the speech
+ // to finish (_channel1Playing) when we're in speech+subtitles mode,
+ // instead of waiting the pre-specified amount of time.
+
+
+ // Ugly... (Maybe make this an argument to putUnderTimed()?)
+ TimedTemp t = _timedTemp;
+ _timedTemp = _previousTimedTemp;
+
+ // Force-reset the previous string to make room for the next one
+ putUnderTimed();
+
+ _timedTemp = t;
+ return;
+ }
+
if (_timeCount == 0)
return;
--_timeCount;
@@ -912,49 +929,65 @@ void DreamWebEngine::useTimedText() {
return;
}
- if (_timeCount == _countToTimed)
+ if (_timeCount == _timedTemp._countToTimed)
getUnderTimed();
- else if (_timeCount > _countToTimed)
+ else if (_timeCount > _timedTemp._countToTimed)
return;
- const uint8 *string = (const uint8 *)_timedString;
- printDirect(string, _timedX, _timedY, 237, true);
+ const uint8 *string = (const uint8 *)_timedTemp._string;
+ printDirect(string, _timedTemp._x, _timedTemp._y, 237, true);
_needToDumpTimed = 1;
}
void DreamWebEngine::setupTimedTemp(uint8 textIndex, uint8 voiceIndex, uint8 x, uint8 y, uint16 countToTimed, uint16 timeCount) {
+
if (hasSpeech() && voiceIndex != 0) {
if (loadSpeech('T', voiceIndex, 'T', textIndex)) {
playChannel1(50+12);
}
- // FIXME: This fallthrough does not properly support subtitles+speech
- // mode. The parameters to setuptimedtemp() are sometimes different
- // for speech and for subtitles. See e.g., madmantext()
if (_speechLoaded && !_subtitles)
return;
+
+ if (_timeCount != 0) {
+ // store previous TimedTemp for deletion
+ _previousTimedTemp = _timedTemp;
+ _timeCount = 0;
+ }
}
if (_timeCount != 0)
return;
- _timedY = y;
- _timedX = x;
- _countToTimed = countToTimed;
- _timeCount = timeCount + countToTimed;
- _timedString = _textFile1.getString(textIndex);
- debug(1, "setupTimedTemp: (%d, %d) => '%s'", textIndex, voiceIndex, _timedString);
+
+ _timedTemp._y = y;
+ _timedTemp._x = x;
+ _timedTemp._countToTimed = countToTimed;
+ _timeCount = _timedTemp._timeCount = timeCount + countToTimed;
+ _timedTemp._string = _textFile1.getString(textIndex);
+ debug(1, "setupTimedTemp: (%d, %d) => '%s'", textIndex, voiceIndex, _timedTemp._string);
}
void DreamWebEngine::dumpTimedText() {
- const uint16 kUndertimedysize = 30;
- if (_needToDumpTimed != 1)
+ const TimedTemp *tt;
+ if (_previousTimedTemp._string) {
+ assert(!_needToDumpTimed);
+
+ tt = &_previousTimedTemp;
+ _previousTimedTemp._string = 0;
+ _previousTimedTemp._timeCount = 0;
+ } else if (_needToDumpTimed != 1) {
return;
- uint8 y = _timedY;
+ } else {
+ tt = &_timedTemp;
+ _needToDumpTimed = 0;
+ }
+
+ const uint16 kUndertimedysize = 30;
+ uint8 y = tt->_y;
if (_foreignRelease)
y -= 3;
- multiDump(_timedX, y, 240, kUndertimedysize);
- _needToDumpTimed = 0;
+ multiDump(tt->_x, y, 240, kUndertimedysize);
}
void DreamWebEngine::getTime() {
@@ -2822,12 +2855,12 @@ void DreamWebEngine::setupTimedUse(uint16 textIndex, uint16 countToTimed, uint16
if (_timeCount != 0)
return; // can't setup
- _timedY = y;
- _timedX = x;
- _countToTimed = countToTimed;
- _timeCount = timeCount + countToTimed;
- _timedString = _puzzleText.getString(textIndex);
- debug(1, "setupTimedUse: %d => '%s'", textIndex, _timedString);
+ _timedTemp._y = y;
+ _timedTemp._x = x;
+ _timedTemp._countToTimed = countToTimed;
+ _timeCount = _timedTemp._timeCount = timeCount + countToTimed;
+ _timedTemp._string = _puzzleText.getString(textIndex);
+ debug(1, "setupTimedUse: %d => '%s'", textIndex, _timedTemp._string);
}
void DreamWebEngine::entryTexts() {