BURIED: Rewrite the pod and pod item flag logic in RetrieveFromPods()

This simplifies the code significantly and reduces the usage of
getGlobalFlagByte() and setGlobalFlagByte()
This commit is contained in:
Filippos Karapetis 2022-01-01 02:58:02 +02:00
parent 13afbe2792
commit 69c3fc4092

View File

@ -44,8 +44,8 @@ public:
RetrieveFromPods(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
int doorLeft = -1, int doorTop = -1, int doorRight = -1, int doorBottom = -1, int openAnim = -1, int openNormFrame = -1,
int popAnim = -1, int openPoppedAnim = -1, int openPoppedFrame = -1, int grabLeft = -1, int grabTop = -1, int grabRight = -1,
int grabBottom = -1, int openEmptyAnim = -1, int openEmptyFrame = -1, int itemID = -1, int takenFlagOffset = -1,
int podStatusFlagOffset = -1, int returnDepth = -1, int popSwordAnim = -1);
int grabBottom = -1, int openEmptyAnim = -1, int openEmptyFrame = -1, byte pod = 0, int itemID = -1, int returnDepth = -1,
int popSwordAnim = -1);
int mouseDown(Window *viewWindow, const Common::Point &pointLocation) override;
int mouseUp(Window *viewWindow, const Common::Point &pointLocation) override;
int draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
@ -56,8 +56,6 @@ protected:
Common::Rect _openDoor;
Common::Rect _grabObject;
int _itemID;
int _itemFlagOffset;
int _podStatusFlagOffset;
int _openNormFrame;
int _openPoppedFrame;
int _openEmptyFrame;
@ -68,19 +66,27 @@ protected:
int _popSwordAnim;
int _returnDepth;
bool _doorOpen;
byte _pod;
GlobalFlags &_globalFlags;
byte *podStatusFlag(byte pod);
byte *podItemFlag();
byte getPodStatus();
void setPodStatus(byte status);
void setPodStatus(byte pod, byte status);
byte getPodItemFlag();
void setPodItemFlag(byte value);
};
RetrieveFromPods::RetrieveFromPods(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
int doorLeft, int doorTop, int doorRight, int doorBottom, int openAnim, int openNormFrame,
int popAnim, int openPoppedAnim, int openPoppedFrame, int grabLeft, int grabTop, int grabRight,
int grabBottom, int openEmptyAnim, int openEmptyFrame, int itemID, int takenFlagOffset,
int podStatusFlagOffset, int returnDepth, int popSwordAnim) :
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
int grabBottom, int openEmptyAnim, int openEmptyFrame, byte pod, int itemID, int returnDepth, int popSwordAnim) :
SceneBase(vm, viewWindow, sceneStaticData, priorLocation),
_globalFlags(((SceneViewWindow *)viewWindow)->getGlobalFlags()) {
_openDoor = Common::Rect(doorLeft, doorTop, doorRight, doorBottom);
_grabObject = Common::Rect(grabLeft, grabTop, grabRight, grabBottom);
_itemID = itemID;
_itemFlagOffset = takenFlagOffset;
_podStatusFlagOffset = podStatusFlagOffset;
_openNormFrame = openNormFrame;
_openPoppedFrame = openPoppedFrame;
_openEmptyFrame = openEmptyFrame;
@ -91,13 +97,79 @@ RetrieveFromPods::RetrieveFromPods(BuriedEngine *vm, Window *viewWindow, const L
_returnDepth = returnDepth;
_doorOpen = false;
_popSwordAnim = popSwordAnim;
_pod = pod;
}
byte *RetrieveFromPods::podStatusFlag(byte pod) {
switch (pod) {
case 1:
return &_globalFlags.asRBPodAStatus;
case 2:
return &_globalFlags.asRBPodBStatus;
case 3:
return &_globalFlags.asRBPodCStatus;
case 4:
return &_globalFlags.asRBPodDStatus;
case 5:
return &_globalFlags.asRBPodEStatus;
case 6:
return &_globalFlags.asRBPodFStatus;
default:
return nullptr;
}
}
byte RetrieveFromPods::getPodStatus() {
byte *flag = podStatusFlag(_pod);
return flag ? *flag : 0;
}
void RetrieveFromPods::setPodStatus(byte status) {
byte *flag = podStatusFlag(_pod);
if (flag)
*flag = status;
}
void RetrieveFromPods::setPodStatus(byte pod, byte status) {
byte *flag = podStatusFlag(pod);
if (flag)
*flag = status;
}
byte *RetrieveFromPods::podItemFlag() {
switch (_pod) {
case 1:
return &_globalFlags.asRBPodATakenEnvironCart;
case 2:
return &_globalFlags.asRBPodBTakenPuzzleBox;
case 3:
return &_globalFlags.asRBPodCTakenCodex;
case 4:
return &_globalFlags.asRBPodDTakenSculpture;
case 5:
return &_globalFlags.asRBPodETakenSword;
default:
// Cheese girl in pod 6 cannot be picked up
return nullptr;
}
}
byte RetrieveFromPods::getPodItemFlag() {
byte *flag = podItemFlag();
return flag ? *flag : 0;
}
void RetrieveFromPods::setPodItemFlag(byte value) {
byte *flag = podStatusFlag(_pod);
if (flag)
*flag = value;
}
int RetrieveFromPods::mouseDown(Window *viewWindow, const Common::Point &pointLocation) {
if (_doorOpen && _grabObject.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_podStatusFlagOffset) == 1 && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_itemFlagOffset) == 0) {
if (_doorOpen && _grabObject.contains(pointLocation) && getPodStatus() == 1 && getPodItemFlag() == 0) {
_staticData.navFrameIndex = _openEmptyFrame;
((SceneViewWindow *)viewWindow)->setGlobalFlagByte(_itemFlagOffset, 1);
((SceneViewWindow *)viewWindow)->setGlobalFlagByte(_podStatusFlagOffset, 2);
setPodItemFlag(1);
setPodStatus(2);
// Begin dragging
Common::Point ptInventoryWindow = viewWindow->convertPointToGlobal(pointLocation);
@ -116,7 +188,7 @@ int RetrieveFromPods::mouseUp(Window *viewWindow, const Common::Point &pointLoca
if (!_doorOpen && _openDoor.contains(pointLocation)) {
_doorOpen = true;
switch (((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_podStatusFlagOffset)) {
switch (getPodStatus()) {
case 0:
((SceneViewWindow *)viewWindow)->playSynchronousAnimation(_openAnim);
_staticData.navFrameIndex = _openNormFrame;
@ -151,20 +223,20 @@ int RetrieveFromPods::mouseUp(Window *viewWindow, const Common::Point &pointLoca
int RetrieveFromPods::draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
if (itemID == kItemExplosiveCharge || itemID == kItemRichardsSword) {
if (_doorOpen && _openDoor.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_podStatusFlagOffset) == 0)
if (_doorOpen && _openDoor.contains(pointLocation) && getPodStatus() == 0)
return 1;
return 0;
}
if (itemID == _itemID && _doorOpen && _grabObject.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_itemFlagOffset) == 1 && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_podStatusFlagOffset) == 2)
if (itemID == _itemID && _doorOpen && _grabObject.contains(pointLocation) && getPodItemFlag() == 1 && getPodStatus() == 2)
return 1;
return 0;
}
int RetrieveFromPods::droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
if ((itemID == kItemExplosiveCharge || itemID == kItemRichardsSword) && _doorOpen && _openDoor.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_podStatusFlagOffset) == 0) {
if ((itemID == kItemExplosiveCharge || itemID == kItemRichardsSword) && _doorOpen && _openDoor.contains(pointLocation) && getPodStatus() == 0) {
// Play the popping movie and change the still frame
if (itemID == kItemRichardsSword && _popSwordAnim >= 0)
((SceneViewWindow *)viewWindow)->playSynchronousAnimation(_popSwordAnim);
@ -173,16 +245,12 @@ int RetrieveFromPods::droppedItem(Window *viewWindow, int itemID, const Common::
_staticData.navFrameIndex = _openPoppedFrame;
((SceneViewWindow *)viewWindow)->setGlobalFlagByte(_podStatusFlagOffset, 1);
setPodStatus(1);
// If in walkthrough mode, open all the pods
if (((SceneViewWindow *)viewWindow)->getGlobalFlags().generalWalkthroughMode == 1) {
((SceneViewWindow *)viewWindow)->getGlobalFlags().asRBPodAStatus = 1;
((SceneViewWindow *)viewWindow)->getGlobalFlags().asRBPodBStatus = 1;
((SceneViewWindow *)viewWindow)->getGlobalFlags().asRBPodCStatus = 1;
((SceneViewWindow *)viewWindow)->getGlobalFlags().asRBPodDStatus = 1;
((SceneViewWindow *)viewWindow)->getGlobalFlags().asRBPodEStatus = 1;
((SceneViewWindow *)viewWindow)->getGlobalFlags().asRBPodFStatus = 1;
if (_globalFlags.generalWalkthroughMode == 1) {
for (int i = 1; i <= 6; i++)
setPodStatus(i, 1);
}
// Explosive charge doesn't get returned
@ -195,19 +263,19 @@ int RetrieveFromPods::droppedItem(Window *viewWindow, int itemID, const Common::
if (itemID == _itemID && _doorOpen) {
if (pointLocation.x == -1 && pointLocation.y == -1) {
((SceneViewWindow *)viewWindow)->getGlobalFlags().asTakenEvidenceThisTrip = 1;
_globalFlags.asTakenEvidenceThisTrip = 1;
InventoryWindow *invWindow = ((GameUIWindow *)viewWindow->getParent())->_inventoryWindow;
if (invWindow->isItemInInventory(kItemEnvironCart) && invWindow->isItemInInventory(kItemMayanPuzzleBox) && invWindow->isItemInInventory(kItemCodexAtlanticus) && invWindow->isItemInInventory(kItemInteractiveSculpture) && invWindow->isItemInInventory(kItemRichardsSword))
((SceneViewWindow *)viewWindow)->getGlobalFlags().scoreGotKrynnArtifacts = 1;
} else if (_grabObject.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_itemFlagOffset) == 1 && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_podStatusFlagOffset) == 2) {
_globalFlags.scoreGotKrynnArtifacts = 1;
} else if (_grabObject.contains(pointLocation) && getPodItemFlag() == 1 && getPodStatus() == 2) {
// Change the still frame to reflect the return of the inventory item
_staticData.navFrameIndex = _openPoppedFrame;
viewWindow->invalidateWindow(false);
// Reset flags
((SceneViewWindow *)viewWindow)->setGlobalFlagByte(_itemFlagOffset, 0);
((SceneViewWindow *)viewWindow)->setGlobalFlagByte(_podStatusFlagOffset, 1);
setPodItemFlag(0);
setPodStatus(1);
return SIC_ACCEPT;
}
}
@ -265,7 +333,7 @@ int RetrieveFromPods::specifyCursor(Window *viewWindow, const Common::Point &poi
if (_openDoor.contains(pointLocation) && !_doorOpen)
return kCursorFinger;
if (_grabObject.contains(pointLocation) && _itemFlagOffset >= 0 && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_podStatusFlagOffset) == 1 && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_itemFlagOffset) == 0)
if (_grabObject.contains(pointLocation) && getPodStatus() == 1 && getPodItemFlag() == 0)
return kCursorOpenHand;
if (_returnDepth >= 0)
@ -981,11 +1049,11 @@ public:
};
CheeseGirlPod::CheeseGirlPod(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
RetrieveFromPods(vm, viewWindow, sceneStaticData, priorLocation, 128, 0, 352, 189, 20, 76, 21, 22, 77, 170, 54, 252, 156, 23, 78, -1, -1, offsetof(GlobalFlags, asRBPodFStatus), 0, 28) {
RetrieveFromPods(vm, viewWindow, sceneStaticData, priorLocation, 128, 0, 352, 189, 20, 76, 21, 22, 77, 170, 54, 252, 156, 23, 78, 6, -1, 0, 28) {
}
int CheeseGirlPod::mouseDown(Window *viewWindow, const Common::Point &pointLocation) {
if (_doorOpen && _grabObject.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_podStatusFlagOffset) == 1) {
if (_doorOpen && _grabObject.contains(pointLocation) && getPodStatus() == 1) {
((SceneViewWindow *)viewWindow)->playSynchronousAnimation(23);
return SC_TRUE;
}
@ -998,7 +1066,7 @@ int CheeseGirlPod::specifyCursor(Window *viewWindow, const Common::Point &pointL
return kCursorFinger;
// If we're over the grab region, use the finger cursor so we can click on Frank
if (_grabObject.contains(pointLocation) && ((SceneViewWindow *)viewWindow)->getGlobalFlagByte(_podStatusFlagOffset) == 1)
if (_grabObject.contains(pointLocation) && getPodStatus() == 1)
return kCursorFinger;
if (_returnDepth >= 0)
@ -1085,17 +1153,15 @@ int TransporterStatusRead::specifyCursor(Window *viewWindow, const Common::Point
bool SceneViewWindow::initializeAlienTimeZoneAndEnvironment(Window *viewWindow, int environment) {
if (environment == -1) {
GlobalFlags &flags = ((SceneViewWindow *)viewWindow)->getGlobalFlags();
flags.asInitialGuardsPass = 0;
flags.asRBPodAStatus = 0;
flags.asRBPodBStatus = 0;
flags.asRBPodCStatus = 0;
flags.asRBPodDStatus = 0;
flags.asRBPodEStatus = 0;
flags.asRBPodFStatus = 0;
_globalFlags.asInitialGuardsPass = 0;
_globalFlags.asRBPodAStatus = 0;
_globalFlags.asRBPodBStatus = 0;
_globalFlags.asRBPodCStatus = 0;
_globalFlags.asRBPodDStatus = 0;
_globalFlags.asRBPodEStatus = 0;
_globalFlags.asRBPodFStatus = 0;
} else if (environment == 1) {
((SceneViewWindow *)viewWindow)->getGlobalFlags().scoreTransportToKrynn = 1;
_globalFlags.scoreTransportToKrynn = 1;
}
return true;
@ -1138,19 +1204,19 @@ SceneBase *SceneViewWindow::constructAlienSceneObject(Window *viewWindow, const
case 13:
return new EntryWithoutLensFilter(_vm, viewWindow, sceneStaticData, priorLocation);
case 20:
return new RetrieveFromPods(_vm, viewWindow, sceneStaticData, priorLocation, 172, 46, 272, 166, 0, 61, 1, 2, 62, 198, 78, 248, 116, 3, 63, kItemEnvironCart, offsetof(GlobalFlags, asRBPodATakenEnvironCart), offsetof(GlobalFlags, asRBPodAStatus), -1, 29);
return new RetrieveFromPods(_vm, viewWindow, sceneStaticData, priorLocation, 172, 46, 272, 166, 0, 61, 1, 2, 62, 198, 78, 248, 116, 3, 63, 1, kItemEnvironCart, -1, 29);
case 21:
return new DoubleZoomIn(_vm, viewWindow, sceneStaticData, priorLocation, 240, 88, 300, 178, 1, 100, 0, 160, 98, 2);
case 22:
return new RetrieveFromPods(_vm, viewWindow, sceneStaticData, priorLocation, 150, 0, 394, 189, 4, 64, 5, 6, 65, 190, 74, 312, 142, 7, 66, kItemMayanPuzzleBox, offsetof(GlobalFlags, asRBPodBTakenPuzzleBox), offsetof(GlobalFlags, asRBPodBStatus), 0, 25);
return new RetrieveFromPods(_vm, viewWindow, sceneStaticData, priorLocation, 150, 0, 394, 189, 4, 64, 5, 6, 65, 190, 74, 312, 142, 7, 66, 2, kItemMayanPuzzleBox, 0, 25);
case 23:
return new RetrieveFromPods(_vm, viewWindow, sceneStaticData, priorLocation, 140, 8, 274, 189, 8, 67, 9, 10, 68, 176, 42, 232, 124, 11, 69, kItemCodexAtlanticus, offsetof(GlobalFlags, asRBPodCTakenCodex), offsetof(GlobalFlags, asRBPodCStatus), 0, 26);
return new RetrieveFromPods(_vm, viewWindow, sceneStaticData, priorLocation, 140, 8, 274, 189, 8, 67, 9, 10, 68, 176, 42, 232, 124, 11, 69, 3, kItemCodexAtlanticus, 0, 26);
case 24:
return new RetrieveFromPods(_vm, viewWindow, sceneStaticData, priorLocation, 100, 0, 280, 189, 12, 70, 13, 14, 71, 146, 60, 252, 156, 15, 72, kItemInteractiveSculpture, offsetof(GlobalFlags, asRBPodDTakenSculpture), offsetof(GlobalFlags, asRBPodDStatus), -1, 27);
return new RetrieveFromPods(_vm, viewWindow, sceneStaticData, priorLocation, 100, 0, 280, 189, 12, 70, 13, 14, 71, 146, 60, 252, 156, 15, 72, 4, kItemInteractiveSculpture, -1, 27);
case 25:
return new DoubleZoomIn(_vm, viewWindow, sceneStaticData, priorLocation, 256, 0, 322, 100, 1, 106, 84, 172, 189, 2);
case 26:
return new RetrieveFromPods(_vm, viewWindow, sceneStaticData, priorLocation, 134, 0, 276, 189, 16, 73, 17, 18, 74, 190, 4, 224, 166, 19, 75, kItemRichardsSword, offsetof(GlobalFlags, asRBPodETakenSword), offsetof(GlobalFlags, asRBPodEStatus), 0);
return new RetrieveFromPods(_vm, viewWindow, sceneStaticData, priorLocation, 134, 0, 276, 189, 16, 73, 17, 18, 74, 190, 4, 224, 166, 19, 75, 5, kItemRichardsSword, 0);
case 27:
return new CheeseGirlPod(_vm, viewWindow, sceneStaticData, priorLocation);
case 30: