aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/dreamweb/dreamweb.h2
-rw-r--r--engines/dreamweb/object.cpp16
-rw-r--r--engines/dreamweb/vgagrafx.cpp1
3 files changed, 14 insertions, 5 deletions
diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h
index 45bacdba86..f4a3c0020c 100644
--- a/engines/dreamweb/dreamweb.h
+++ b/engines/dreamweb/dreamweb.h
@@ -893,7 +893,7 @@ public:
void cantDrop();
void entryAnims();
bool finishedWalking();
- void emergencyPurge();
+ void emergencyPurge(uint8 from);
void purgeAnItem();
uint8 nextSymbol(uint8 symbol);
void enterSymbol();
diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
index 181987d721..9191702eee 100644
--- a/engines/dreamweb/object.cpp
+++ b/engines/dreamweb/object.cpp
@@ -253,6 +253,7 @@ void DreamWebEngine::transferText(uint8 from, uint8 to) {
char *dst = _exText._text + _vars._exTextPos;
size_t len = strlen(src);
+ assert(_vars._exTextPos + len + 1 <= kExtextlen);
memcpy(dst, src, len + 1);
_vars._exTextPos += len + 1;
}
@@ -1010,7 +1011,7 @@ ObjectRef DreamWebEngine::findOpenPos() {
}
byte DreamWebEngine::transferToEx(uint8 from) {
- emergencyPurge();
+ emergencyPurge(from);
byte pos = getExPos();
DynObject *exObject = getExAd(pos);
@@ -1128,11 +1129,18 @@ void DreamWebEngine::incRyanPage() {
delPointer();
}
-void DreamWebEngine::emergencyPurge() {
+void DreamWebEngine::emergencyPurge(uint8 from) {
debug(2, "Ex memory: frames %d/%d, text %d/%d", _vars._exFramePos, kExframeslen, _vars._exTextPos, kExtextlen);
- while (_vars._exFramePos + 4000 >= kExframeslen ||
- _vars._exTextPos + 400 >= kExtextlen)
+ uint16 frameBytesNeeded = 0;
+ for (int offset = 0; offset <= 1; ++offset) {
+ const Frame &freeFrame = _freeFrames._frames[3 * from + offset];
+ frameBytesNeeded += freeFrame.width * freeFrame.height;
+ }
+ const uint16 textBytesNeeded = strlen(_freeDesc.getString(from)) + 1;
+
+ while (_vars._exFramePos + frameBytesNeeded > kExframeslen ||
+ _vars._exTextPos + textBytesNeeded > kExtextlen)
{
purgeAnItem();
debug(2, "Ex memory after purging: frames %d/%d, text %d/%d", _vars._exFramePos, kExframeslen, _vars._exTextPos, kExtextlen);
diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp
index aa58352e81..2eba37579a 100644
--- a/engines/dreamweb/vgagrafx.cpp
+++ b/engines/dreamweb/vgagrafx.cpp
@@ -425,6 +425,7 @@ void DreamWebEngine::transferFrame(uint8 from, uint8 to, uint8 offset) {
const uint8 *src = _freeFrames.getFrameData(3*from + offset);
uint8 *dst = _exFrames._data + _vars._exFramePos;
+ assert(_vars._exFramePos + byteCount <= kExframeslen);
memcpy(dst, src, byteCount);
exFrame.setPtr(_vars._exFramePos);