diff options
author | Colin Snover | 2016-03-07 16:43:58 -0600 |
---|---|---|
committer | Colin Snover | 2016-03-07 16:46:25 -0600 |
commit | d4869218200a3dd165c2f1c156f3c1620c813241 (patch) | |
tree | 2ce2b4a8a9df18dc0f83e29208a8492339404355 /engines/sci/engine | |
parent | 13f2a2c3bd889efba0009e205e3bfb811790956e (diff) | |
download | scummvm-rg350-d4869218200a3dd165c2f1c156f3c1620c813241.tar.gz scummvm-rg350-d4869218200a3dd165c2f1c156f3c1620c813241.tar.bz2 scummvm-rg350-d4869218200a3dd165c2f1c156f3c1620c813241.zip |
SCI32: Add reg_t comparisons for graphics sorting
Diffstat (limited to 'engines/sci/engine')
-rw-r--r-- | engines/sci/engine/vm_types.cpp | 22 | ||||
-rw-r--r-- | engines/sci/engine/vm_types.h | 4 |
2 files changed, 26 insertions, 0 deletions
diff --git a/engines/sci/engine/vm_types.cpp b/engines/sci/engine/vm_types.cpp index 53a5a5c507..00a67fc9cc 100644 --- a/engines/sci/engine/vm_types.cpp +++ b/engines/sci/engine/vm_types.cpp @@ -230,6 +230,10 @@ int reg_t::cmp(const reg_t right, bool treatAsUnsigned) const { return toUint16() - right.toUint16(); else return toSint16() - right.toSint16(); +#ifdef ENABLE_SCI32 + } else if (getSciVersion() >= SCI_VERSION_2) { + return sci32Comparison(right); +#endif } else if (pointerComparisonWithInteger(right)) { return 1; } else if (right.pointerComparisonWithInteger(*this)) { @@ -238,6 +242,24 @@ int reg_t::cmp(const reg_t right, bool treatAsUnsigned) const { return lookForWorkaround(right, "comparison").toSint16(); } +int reg_t::sci32Comparison(const reg_t right) const { + // In SCI32, MemIDs are normally indexes into the memory manager's handle + // list, but the engine reserves indexes at and above 20000 for objects + // that were created inside the engine (as opposed to inside the VM). The + // engine compares these as a tiebreaker for graphics objects that are at + // the same priority, and it is necessary to at least minimally handle + // this situation. + // This is obviously a bogus comparision, but then, this entire thing is + // bogus. For the moment, it just needs to be deterministic. + if (isNumber() && !right.isNumber()) { + return 1; + } else if (right.isNumber() && !isNumber()) { + return -1; + } + + return getOffset() - right.getOffset(); +} + bool reg_t::pointerComparisonWithInteger(const reg_t right) const { // This function handles the case where a script tries to compare a pointer // to a number. Normally, we would not want to allow that. However, SCI0 - diff --git a/engines/sci/engine/vm_types.h b/engines/sci/engine/vm_types.h index a646478a8e..e60f52e85c 100644 --- a/engines/sci/engine/vm_types.h +++ b/engines/sci/engine/vm_types.h @@ -160,6 +160,10 @@ private: int cmp(const reg_t right, bool treatAsUnsigned) const; reg_t lookForWorkaround(const reg_t right, const char *operation) const; bool pointerComparisonWithInteger(const reg_t right) const; + +#ifdef ENABLE_SCI32 + int sci32Comparison(const reg_t right) const; +#endif }; static inline reg_t make_reg(SegmentId segment, uint16 offset) { |