mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-06 02:10:28 +00:00
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:
parent
13afbe2792
commit
69c3fc4092
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user