[Scummvm-git-logs] scummvm master -> 5d45afb18be2eee06587663b92ea9b0654aff2d9
rvanlaar
roland at rolandvanlaar.nl
Thu Aug 26 10:24:26 UTC 2021
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
5d45afb18b DIRECTOR: Convert cursor setting into Datum
Commit: 5d45afb18be2eee06587663b92ea9b0654aff2d9
https://github.com/scummvm/scummvm/commit/5d45afb18be2eee06587663b92ea9b0654aff2d9
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2021-08-26T12:23:07+02:00
Commit Message:
DIRECTOR: Convert cursor setting into Datum
This fixes two bugs in one go:
- setting a cursor to 0 wasn't possible when a cast+mask cursor was used
- querying a sprite for cast+mask cursor returned 0 instead of the cast
ids.
Cursors can be set in two ways:
1) set cursor of sprite X to INT
2) set cursor of sprite X to [INT, INT]
A `cursor of sprite X` should return the same values that as were used
when setting the cursor.
Changed paths:
engines/director/cursor.cpp
engines/director/cursor.h
engines/director/lingo/lingo-builtins.cpp
engines/director/lingo/lingo-funcs.cpp
engines/director/lingo/lingo-the.cpp
engines/director/lingo/lingo.h
diff --git a/engines/director/cursor.cpp b/engines/director/cursor.cpp
index 193cb414eb..0086b4ea17 100644
--- a/engines/director/cursor.cpp
+++ b/engines/director/cursor.cpp
@@ -33,12 +33,9 @@ namespace Director {
Cursor::Cursor() {
_keyColor = 0xff;
- _cursorResId = 0;
+ _cursorResId = Datum(0);
_cursorType = Graphics::kMacCursorArrow;
- _cursorCastId = CastMemberID(0, 0);
- _cursorMaskId = CastMemberID(0, 0);
-
_usePalette = false;
}
@@ -46,29 +43,30 @@ CursorRef Cursor::getRef() {
CursorRef res;
res._cursorType = _cursorType;
res._cursorResId = _cursorResId;
- res._cursorCastId = _cursorCastId;
- res._cursorMaskId = _cursorMaskId;
return res;
}
bool Cursor::operator==(const Cursor &c) {
return _cursorType == c._cursorType &&
- _cursorResId == c._cursorResId &&
- _cursorCastId == c._cursorCastId &&
- _cursorMaskId == c._cursorMaskId;
+ c._cursorResId.equalTo(_cursorResId);
}
bool Cursor::operator==(const CursorRef &c) {
return _cursorType == c._cursorType &&
- _cursorResId == c._cursorResId &&
- _cursorCastId == c._cursorCastId &&
- _cursorMaskId == c._cursorMaskId;
+ c._cursorResId.equalTo(_cursorResId);
}
-void Cursor::readFromCast(CastMemberID cursorId, CastMemberID maskId) {
- if (cursorId == _cursorCastId && maskId == _cursorMaskId)
+void Cursor::readFromCast(Datum cursorCasts) {
+ if (cursorCasts.type != ARRAY && cursorCasts.u.farr->arr.size() != 2 ) {
+ warning("Cursor::readFromCast: Needs array");
+ return;
+ }
+ if (_cursorResId.equalTo(cursorCasts))
return;
+ CastMemberID cursorId = cursorCasts.u.farr->arr[0].asMemberID();
+ CastMemberID maskId = cursorCasts.u.farr->arr[1].asMemberID();
+
CastMember *cursorCast = g_director->getCurrentMovie()->getCastMember(cursorId);
CastMember *maskCast = g_director->getCurrentMovie()->getCastMember(maskId);
@@ -83,7 +81,7 @@ void Cursor::readFromCast(CastMemberID cursorId, CastMemberID maskId) {
_usePalette = false;
_keyColor = 3;
- resetCursor(Graphics::kMacCursorCustom, true, 0, cursorId, maskId);
+ resetCursor(Graphics::kMacCursorCustom, true, cursorCasts);
BitmapCastMember *cursorBitmap = (BitmapCastMember *)cursorCast;
BitmapCastMember *maskBitmap = (BitmapCastMember *)maskCast;
@@ -122,11 +120,16 @@ void Cursor::readFromCast(CastMemberID cursorId, CastMemberID maskId) {
_hotspotY = bc->_regY - bc->_initialRect.top;
}
-void Cursor::readBuiltinType(int resourceId) {
- if (resourceId == _cursorResId)
+void Cursor::readBuiltinType(Datum resourceId) {
+ if (resourceId.equalTo(_cursorResId))
return;
- switch(resourceId) {
+ if (resourceId.type != INT) {
+ warning("readBuiltinType: failed to read cursor. It's not type int");
+ }
+
+
+ switch(resourceId.asInt()) {
case -1:
case 0:
resetCursor(Graphics::kMacCursorArrow, true, resourceId);
@@ -147,16 +150,20 @@ void Cursor::readBuiltinType(int resourceId) {
resetCursor(Graphics::kMacCursorOff, true, resourceId);
break;
default:
- warning("Cursor::readBuiltinType failed to read cursor %d", resourceId);
+ warning("Cursor::readBuiltinType failed to read cursor %d", resourceId.asInt());
break;
}
}
-void Cursor::readFromResource(int resourceId) {
- if (resourceId == _cursorResId)
+void Cursor::readFromResource(Datum resourceId) {
+ if (resourceId.equalTo(_cursorResId))
return;
- switch(resourceId) {
+ if (resourceId.type != INT) {
+ warning("Cursor:readFromResource is not of type INT");
+ return;
+ }
+ switch(resourceId.asInt()) {
case -1:
case 0:
case 1:
@@ -172,9 +179,9 @@ void Cursor::readFromResource(int resourceId) {
for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = g_director->_openResFiles.begin(); it != g_director->_openResFiles.end(); ++it) {
Common::SeekableReadStreamEndian *cursorStream;
- cursorStream = ((MacArchive *)it->_value)->getResource(MKTAG('C', 'U', 'R', 'S'), resourceId);
+ cursorStream = ((MacArchive *)it->_value)->getResource(MKTAG('C', 'U', 'R', 'S'), resourceId.asInt());
if (!cursorStream)
- cursorStream = ((MacArchive *)it->_value)->getResource(MKTAG('C', 'R', 'S', 'R'), resourceId);
+ cursorStream = ((MacArchive *)it->_value)->getResource(MKTAG('C', 'R', 'S', 'R'), resourceId.asInt());
if (cursorStream && readFromStream(*((Common::SeekableReadStream *)cursorStream), false, 0)) {
_usePalette = true;
@@ -196,11 +203,11 @@ void Cursor::readFromResource(int resourceId) {
// for win platform, try the cursor from exe
if (!readSuccessful && g_director->getPlatform() == Common::kPlatformWindows) {
// i'm not sure, in jman we have cursor id 2, 3, 4. and custom cursor id 128 129 130
- uint id = (resourceId & 0x7f) + 2;
+ uint id = (resourceId.asInt() & 0x7f) + 2;
for (uint i = 0; i < g_director->_winCursor.size(); i++) {
for (uint j = 0; j < g_director->_winCursor[i]->cursors.size(); j++) {
if (id == g_director->_winCursor[i]->cursors[j].id.getID()) {
- resetCursor(Graphics::kMacCursorCustom, false, id);
+ resetCursor(Graphics::kMacCursorCustom, false, Datum((int)id));
readSuccessful = true;
}
}
@@ -209,11 +216,11 @@ void Cursor::readFromResource(int resourceId) {
// fallback method. try to use builtin cursor by regarding resourceId as a single byte.
if (!readSuccessful)
- readBuiltinType(resourceId & 0x7f);
+ readBuiltinType(resourceId.asInt() & 0x7f);
}
}
-void Cursor::resetCursor(Graphics::MacCursorType type, bool shouldClear, int resId, CastMemberID castId, CastMemberID maskId) {
+void Cursor::resetCursor(Graphics::MacCursorType type, bool shouldClear, Datum resId) {
if (shouldClear)
clear();
@@ -223,32 +230,23 @@ void Cursor::resetCursor(Graphics::MacCursorType type, bool shouldClear, int res
_cursorResId = resId;
- _cursorCastId = castId;
- _cursorMaskId = maskId;
-
_hotspotX = 0;
_hotspotY = 0;
}
CursorRef::CursorRef() {
_cursorType = Graphics::kMacCursorArrow;
- _cursorResId = 0;
- _cursorCastId = CastMemberID(0, 0);
- _cursorMaskId = CastMemberID(0, 0);
+ _cursorResId = Datum(0);
}
bool CursorRef::operator==(const Cursor &c) {
return _cursorType == c._cursorType &&
- _cursorResId == c._cursorResId &&
- _cursorCastId == c._cursorCastId &&
- _cursorMaskId == c._cursorMaskId;
+ c._cursorResId.equalTo(_cursorResId);
}
bool CursorRef::operator==(const CursorRef &c) {
return _cursorType == c._cursorType &&
- _cursorResId == c._cursorResId &&
- _cursorCastId == c._cursorCastId &&
- _cursorMaskId == c._cursorMaskId;
+ c._cursorResId.equalTo(_cursorResId);
}
} // End of namespace Director
diff --git a/engines/director/cursor.h b/engines/director/cursor.h
index 2faeed923b..5b0a38281b 100644
--- a/engines/director/cursor.h
+++ b/engines/director/cursor.h
@@ -26,6 +26,8 @@
#include "graphics/macgui/macwindowmanager.h"
+#include "engines/director/lingo/lingo.h"
+
namespace Graphics {
class ManagedSurface;
class MacCursor;
@@ -41,11 +43,11 @@ class Cursor : public Graphics::MacCursor {
CursorRef getRef();
- void readFromCast(CastMemberID cursorId, CastMemberID maskId);
- void readFromResource(int resourceId);
- void readBuiltinType(int resourceId);
+ void readFromCast(Datum casts);
+ void readFromResource(Datum resourceId);
+ void readBuiltinType(Datum resourceId);
- bool isEmpty() { return _cursorResId == 0 && _cursorCastId.member == 0; }
+ bool isEmpty() {return Datum(0).equalTo(_cursorResId);}
bool operator==(const Cursor &c);
bool operator==(const CursorRef &c);
@@ -54,13 +56,10 @@ class Cursor : public Graphics::MacCursor {
public:
Graphics::MacCursorType _cursorType;
- int _cursorResId;
-
- CastMemberID _cursorCastId;
- CastMemberID _cursorMaskId;
+ Datum _cursorResId;
private:
- void resetCursor(Graphics::MacCursorType type, bool shouldClear = false, int resId = 0, CastMemberID castId = CastMemberID(0, 0), CastMemberID maskId = CastMemberID(0, 0));
+ void resetCursor(Graphics::MacCursorType type, bool shouldClear = false, Datum resId = Datum(0));
private:
bool _usePalette;
@@ -75,9 +74,7 @@ struct CursorRef {
bool operator==(const CursorRef &c);
Graphics::MacCursorType _cursorType;
- int _cursorResId;
- CastMemberID _cursorCastId;
- CastMemberID _cursorMaskId;
+ Datum _cursorResId;
};
} // End of namespace Director
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 303ad1e2f2..4f4de8496a 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1615,15 +1615,7 @@ void LB::b_clearGlobals(int nargs) {
void LB::b_cursor(int nargs) {
Datum d = g_lingo->pop();
-
- if (d.type == ARRAY) {
- Datum sprite = d.u.farr->arr[0];
- Datum mask = d.u.farr->arr[1];
-
- g_lingo->func_cursor(sprite.asMemberID(), mask.asMemberID());
- } else {
- g_lingo->func_cursor(d.asInt());
- }
+ g_lingo->func_cursor(d);
}
void LB::b_put(int nargs) {
diff --git a/engines/director/lingo/lingo-funcs.cpp b/engines/director/lingo/lingo-funcs.cpp
index 5ab97d941b..293c589b05 100644
--- a/engines/director/lingo/lingo-funcs.cpp
+++ b/engines/director/lingo/lingo-funcs.cpp
@@ -313,15 +313,13 @@ void Lingo::func_play(Datum &frame, Datum &movie) {
func_goto(frame, movie);
}
-void Lingo::func_cursor(CastMemberID cursorId, CastMemberID maskId) {
+void Lingo::func_cursor(Datum cursorDatum) {
Score *score = _vm->getCurrentMovie()->getScore();
- score->_defaultCursor.readFromCast(cursorId, maskId);
- score->_cursorDirty = true;
-}
-
-void Lingo::func_cursor(int cursorId) {
- Score *score = _vm->getCurrentMovie()->getScore();
- score->_defaultCursor.readFromResource(cursorId);
+ if (cursorDatum.type == ARRAY){
+ score->_defaultCursor.readFromCast(cursorDatum);
+ } else {
+ score->_defaultCursor.readFromResource(cursorDatum);
+ }
score->_cursorDirty = true;
}
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 08fbc5bfd2..f2ba681ccf 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1280,16 +1280,7 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
d.u.i = channel->_constraint;
break;
case kTheCursor:
- if (channel->_cursor._cursorResId) {
- d.u.i = channel->_cursor._cursorResId;
- } else {
- d.type = ARRAY;
- d.u.farr = new FArray(2);
-
- // TODO: How is this handled with multiple casts in D5?
- d.u.farr->arr[0] = (int)channel->_cursor._cursorCastId.member;
- d.u.farr->arr[1] = (int)channel->_cursor._cursorMaskId.member;
- }
+ d = channel->_cursor._cursorResId;
break;
case kTheEditableText:
d.u.i = sprite->_editable;
@@ -1486,20 +1477,12 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
}
break;
case kTheCursor:
- if (d.type == INT && channel->_cursor._cursorResId != d.asInt()) {
- channel->_cursor.readFromResource(d.asInt());
- score->_cursorDirty = true;
- } else if (d.type == ARRAY && d.u.farr->arr.size() == 2) {
- CastMemberID cursorId = d.u.farr->arr[0].asMemberID();
- CastMemberID maskId = d.u.farr->arr[1].asMemberID();
-
- if (cursorId == channel->_cursor._cursorCastId &&
- maskId == channel->_cursor._cursorMaskId)
- break;
-
- channel->_cursor.readFromCast(cursorId, maskId);
- score->_cursorDirty = true;
+ if (d.type == INT) {
+ channel->_cursor.readFromResource(d);
+ } else {
+ channel->_cursor.readFromCast(d);
}
+ score->_cursorDirty = true;
break;
case kTheEditableText:
channel->_sprite->_editable = d.asInt();
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 62c18b6bb0..92fdf97bd3 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -358,8 +358,7 @@ public:
void func_gotoprevious();
void func_play(Datum &frame, Datum &movie);
void func_playdone();
- void func_cursor(CastMemberID cursorId, CastMemberID maskId);
- void func_cursor(int cursorId);
+ void func_cursor(Datum cursorDatum);
int func_marker(int m);
uint16 func_label(Datum &label);
More information about the Scummvm-git-logs
mailing list