SCI: some big changes to kCantBeHere - kCantBeHere returns the actual "problem" instead of being a plain boolean - part of solving lsl1 casino door / qfg1vga gate

svn-id: r50919
This commit is contained in:
Martin Kiewitz 2010-07-15 19:23:18 +00:00
parent 20a0ad6833
commit ddd01ffcb6
3 changed files with 16 additions and 17 deletions

View File

@ -382,17 +382,16 @@ reg_t kCanBeHere(EngineState *s, int argc, reg_t *argv) {
reg_t curObject = argv[0];
reg_t listReference = (argc > 1) ? argv[1] : NULL_REG;
bool canBeHere = g_sci->_gfxCompare->kernelCanBeHere(curObject, listReference);
return make_reg(0, canBeHere);
reg_t canBeHere = g_sci->_gfxCompare->kernelCanBeHere(curObject, listReference);
return make_reg(0, canBeHere.isNull() ? 1 : 0);
}
// kCantBeHere does the same thing as kCanBeHere, except that it returns the opposite result.
reg_t kCantBeHere(EngineState *s, int argc, reg_t *argv) {
reg_t curObject = argv[0];
reg_t listReference = (argc > 1) ? argv[1] : NULL_REG;
bool canBeHere = g_sci->_gfxCompare->kernelCanBeHere(curObject, listReference);
return make_reg(0, !canBeHere);
reg_t canBeHere = g_sci->_gfxCompare->kernelCanBeHere(curObject, listReference);
return make_reg(0, canBeHere.isNull() ? 0 : 1);
}
reg_t kIsItSkip(EngineState *s, int argc, reg_t *argv) {

View File

@ -70,7 +70,7 @@ uint16 GfxCompare::isOnControl(uint16 screenMask, const Common::Rect &rect) {
return result;
}
bool GfxCompare::canBeHereCheckRectList(reg_t checkObject, const Common::Rect &checkRect, List *list) {
reg_t GfxCompare::canBeHereCheckRectList(reg_t checkObject, const Common::Rect &checkRect, List *list) {
reg_t curAddress = list->first;
Node *curNode = _segMan->lookupNode(curAddress);
reg_t curObject;
@ -96,14 +96,14 @@ bool GfxCompare::canBeHereCheckRectList(reg_t checkObject, const Common::Rect &c
curRect.left < checkRect.right &&
curRect.bottom > checkRect.top &&
curRect.top < checkRect.bottom) {
return false;
return curObject;
}
}
}
curAddress = curNode->succ;
curNode = _segMan->lookupNode(curAddress);
}
return true;
return NULL_REG;
}
uint16 GfxCompare::kernelOnControl(byte screenMask, const Common::Rect &rect) {
@ -150,11 +150,11 @@ void GfxCompare::kernelSetNowSeen(reg_t objectReference) {
}
}
bool GfxCompare::kernelCanBeHere(reg_t curObject, reg_t listReference) {
reg_t GfxCompare::kernelCanBeHere(reg_t curObject, reg_t listReference) {
Common::Rect checkRect;
Common::Rect adjustedRect;
uint16 signal, controlMask;
bool result;
uint16 result;
checkRect.left = readSelectorValue(_segMan, curObject, SELECTOR(brLeft));
checkRect.top = readSelectorValue(_segMan, curObject, SELECTOR(brTop));
@ -163,22 +163,22 @@ bool GfxCompare::kernelCanBeHere(reg_t curObject, reg_t listReference) {
if (!checkRect.isValidRect()) { // can occur in Iceman - HACK? TODO: is this really occuring in sierra sci? check this
warning("kCan(t)BeHere - invalid rect %d, %d -> %d, %d", checkRect.left, checkRect.top, checkRect.right, checkRect.bottom);
return false;
return NULL_REG;
}
adjustedRect = _coordAdjuster->onControl(checkRect);
signal = readSelectorValue(_segMan, curObject, SELECTOR(signal));
controlMask = readSelectorValue(_segMan, curObject, SELECTOR(illegalBits));
result = (isOnControl(GFX_SCREEN_MASK_CONTROL, adjustedRect) & controlMask) ? false : true;
if ((result) && (signal & (kSignalIgnoreActor | kSignalRemoveView)) == 0) {
result = isOnControl(GFX_SCREEN_MASK_CONTROL, adjustedRect) & controlMask;
if ((!result) && (signal & (kSignalIgnoreActor | kSignalRemoveView)) == 0) {
List *list = _segMan->lookupList(listReference);
if (!list)
error("kCanBeHere called with non-list as parameter");
result = canBeHereCheckRectList(curObject, checkRect, list);
return canBeHereCheckRectList(curObject, checkRect, list);
}
return result;
return make_reg(0, result);
}
bool GfxCompare::kernelIsItSkip(GuiResourceId viewId, int16 loopNo, int16 celNo, Common::Point position) {

View File

@ -42,7 +42,7 @@ public:
uint16 kernelOnControl(byte screenMask, const Common::Rect &rect);
void kernelSetNowSeen(reg_t objectReference);
bool kernelCanBeHere(reg_t curObject, reg_t listReference);
reg_t kernelCanBeHere(reg_t curObject, reg_t listReference);
bool kernelIsItSkip(GuiResourceId viewId, int16 loopNo, int16 celNo, Common::Point position);
void kernelBaseSetter(reg_t object);
@ -60,7 +60,7 @@ private:
* *different* from checkObject, has a brRect which is contained inside
* checkRect.
*/
bool canBeHereCheckRectList(reg_t checkObject, const Common::Rect &checkRect, List *list);
reg_t canBeHereCheckRectList(reg_t checkObject, const Common::Rect &checkRect, List *list);
};
} // End of namespace Sci