aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/debugger.cpp2
-rw-r--r--scumm/object.cpp22
-rw-r--r--scumm/script_v2.cpp6
-rw-r--r--scumm/script_v5.cpp6
-rw-r--r--scumm/script_v6.cpp4
-rw-r--r--scumm/scumm.h2
6 files changed, 18 insertions, 24 deletions
diff --git a/scumm/debugger.cpp b/scumm/debugger.cpp
index 03e9414d6f..d25ddb98e9 100644
--- a/scumm/debugger.cpp
+++ b/scumm/debugger.cpp
@@ -486,7 +486,7 @@ bool ScummDebugger::Cmd_Object(int argc, const char **argv) {
_vm->putOwner(obj, _vm->VAR(_vm->VAR_EGO));
_vm->putClass(obj, kObjectClassUntouchable, 1);
_vm->putState(obj, 1);
- _vm->forceObjectRedraw(obj);
+ _vm->markObjectRectAsDirty(obj);
_vm->clearDrawObjectQueue();
_vm->runInventoryScript(obj);
} else if (!strcmp(argv[2], "state")) {
diff --git a/scumm/object.cpp b/scumm/object.cpp
index c64e3177f5..d7ea606902 100644
--- a/scumm/object.cpp
+++ b/scumm/object.cpp
@@ -851,25 +851,19 @@ void ScummEngine::clearOwnerOf(int obj) {
}
/**
- * Force a screen redraw at the location of the specifed object. This is
- * typically called when an object was just removed from the room, or when its
- * state changed.
+ * Mark the rectangle covered by the given object as dirty, thus eventually
+ * ensuring a redraw of that area. This function is typically invoked when an
+ * object gets removed from the current room, or when its state changed.
*/
-void ScummEngine::forceObjectRedraw(int obj) {
- int i, j, strip;
+void ScummEngine::markObjectRectAsDirty(int obj) {
+ int i, strip;
for (i = 1; i < _numLocalObjects; i++) {
if (_objs[i].obj_nr == (uint16)obj) {
if (_objs[i].width != 0) {
- for (j = 0; j < _objs[i].width / 8; j++) {
- strip = (_objs[i].x_pos / 8) + j;
-
- // Clip value
- if (strip < _screenStartStrip)
- continue;
- if (strip > _screenEndStrip)
- break;
-
+ const int minStrip = MAX(_screenStartStrip, _objs[i].x_pos / 8);
+ const int maxStrip = MIN(_screenEndStrip+1, _objs[i].x_pos / 8 + _objs[i].width / 8);
+ for (strip = minStrip; strip < maxStrip; strip++) {
setGfxUsageBit(strip, USAGE_BIT_DIRTY);
}
}
diff --git a/scumm/script_v2.cpp b/scumm/script_v2.cpp
index 979ddac2a6..5768f27189 100644
--- a/scumm/script_v2.cpp
+++ b/scumm/script_v2.cpp
@@ -468,14 +468,14 @@ void ScummEngine_v2::clearStateCommon(byte type) {
void ScummEngine_v2::o2_setState08() {
int obj = getVarOrDirectWord(PARAM_1);
putState(obj, getState(obj) | 0x08);
- forceObjectRedraw(obj);
+ markObjectRectAsDirty(obj);
clearDrawObjectQueue();
}
void ScummEngine_v2::o2_clearState08() {
int obj = getVarOrDirectWord(PARAM_1);
putState(obj, getState(obj) & ~0x08);
- forceObjectRedraw(obj);
+ markObjectRectAsDirty(obj);
clearDrawObjectQueue();
}
@@ -1449,7 +1449,7 @@ void ScummEngine_v2::o2_pickupObject() {
return; /* object twice */
addObjectToInventory(obj, _roomResource);
- forceObjectRedraw(obj);
+ markObjectRectAsDirty(obj);
putOwner(obj, VAR(VAR_EGO));
putState(obj, getState(obj) | 0xA);
clearDrawObjectQueue();
diff --git a/scumm/script_v5.cpp b/scumm/script_v5.cpp
index 93d6251dac..777723cde3 100644
--- a/scumm/script_v5.cpp
+++ b/scumm/script_v5.cpp
@@ -1592,7 +1592,7 @@ void ScummEngine_v5::o5_pickupObject() {
putOwner(obj, VAR(VAR_EGO));
putClass(obj, kObjectClassUntouchable, 1);
putState(obj, 1);
- forceObjectRedraw(obj);
+ markObjectRectAsDirty(obj);
clearDrawObjectQueue();
runInventoryScript(1);
}
@@ -2174,7 +2174,7 @@ void ScummEngine_v5::o5_setState() {
obj = getVarOrDirectWord(PARAM_1);
state = getVarOrDirectByte(PARAM_2);
putState(obj, state);
- forceObjectRedraw(obj);
+ markObjectRectAsDirty(obj);
if (_BgNeedsRedraw)
clearDrawObjectQueue();
}
@@ -2911,7 +2911,7 @@ void ScummEngine_v5::o5_pickupObjectOld() {
// warning("adding %d from %d to inventoryOld", obj, _currentRoom);
addObjectToInventory(obj, _roomResource);
- forceObjectRedraw(obj);
+ markObjectRectAsDirty(obj);
putOwner(obj, VAR(VAR_EGO));
putClass(obj, kObjectClassUntouchable, 1);
putState(obj, 1);
diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp
index ad23cb83f1..3a7b28e4e2 100644
--- a/scumm/script_v6.cpp
+++ b/scumm/script_v6.cpp
@@ -916,7 +916,7 @@ void ScummEngine_v6::o6_setState() {
}
putState(obj, state);
- forceObjectRedraw(obj);
+ markObjectRectAsDirty(obj);
if (_BgNeedsRedraw)
clearDrawObjectQueue();
}
@@ -1151,7 +1151,7 @@ void ScummEngine_v6::o6_pickupObject() {
putOwner(obj, VAR(VAR_EGO));
putClass(obj, kObjectClassUntouchable, 1);
putState(obj, 1);
- forceObjectRedraw(obj);
+ markObjectRectAsDirty(obj);
clearDrawObjectQueue();
runInventoryScript(obj); /* Difference */
}
diff --git a/scumm/scumm.h b/scumm/scumm.h
index 6d0be49de6..4757661f73 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -672,7 +672,7 @@ protected:
byte _numObjectsInRoom;
void setupRoomObject(ObjectData *od, const byte *room, const byte *searchptr = NULL);
- void forceObjectRedraw(int obj);
+ void markObjectRectAsDirty(int obj);
void loadFlObject(uint object, uint room);
void nukeFlObjects(int min, int max);
int findFlObjectSlot();