mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
This allows us to remove the last traces of offsetof(), together with struct packing for the GlobalFlags struct, since its members are now accessed directly, without using offsets
2872 lines
114 KiB
C++
2872 lines
114 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* Additional copyright for this file:
|
|
* Copyright (C) 1995 Presto Studios, Inc.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#include "buried/avi_frames.h"
|
|
#include "buried/biochip_right.h"
|
|
#include "buried/buried.h"
|
|
#include "buried/gameui.h"
|
|
#include "buried/graphics.h"
|
|
#include "buried/invdata.h"
|
|
#include "buried/inventory_window.h"
|
|
#include "buried/navarrow.h"
|
|
#include "buried/resources.h"
|
|
#include "buried/scene_view.h"
|
|
#include "buried/sound.h"
|
|
#include "buried/environ/scene_base.h"
|
|
#include "buried/environ/scene_common.h"
|
|
|
|
#include "common/system.h"
|
|
#include "graphics/surface.h"
|
|
|
|
namespace Buried {
|
|
|
|
enum {
|
|
WAR_GOD_HEAD_TIMER_VALUE = 3000
|
|
};
|
|
|
|
class PlaceCeramicBowl : public SceneBase {
|
|
public:
|
|
PlaceCeramicBowl(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
|
|
int droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
|
|
int timerCallback(Window *viewWindow) override;
|
|
|
|
private:
|
|
bool _dropped;
|
|
};
|
|
|
|
PlaceCeramicBowl::PlaceCeramicBowl(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
_dropped = false;
|
|
}
|
|
|
|
int PlaceCeramicBowl::droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
if (pointLocation.x == -1 && pointLocation.y == -1)
|
|
return SIC_REJECT;
|
|
|
|
if (itemID != kItemCeramicBowl)
|
|
return SIC_REJECT;
|
|
|
|
_staticData.navFrameIndex = 112;
|
|
viewWindow->invalidateWindow(false);
|
|
_dropped = true;
|
|
return SIC_ACCEPT;
|
|
}
|
|
|
|
int PlaceCeramicBowl::timerCallback(Window *viewWindow) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (_dropped) {
|
|
if (globalFlags.myTPCodeWheelStatus == 0) {
|
|
// Play slide death animation
|
|
sceneView->playSynchronousAnimation(4);
|
|
|
|
// Notify the player of his gruesome death
|
|
sceneView->showDeathScene(11);
|
|
return SC_DEATH;
|
|
} else {
|
|
// Kill the ambient
|
|
_vm->_sound->setAmbientSound();
|
|
|
|
// Jump to the start of the main cavern
|
|
DestinationScene newDest;
|
|
newDest.destinationScene.timeZone = 2;
|
|
newDest.destinationScene.environment = 2;
|
|
newDest.destinationScene.node = 0;
|
|
newDest.destinationScene.facing = 1;
|
|
newDest.destinationScene.orientation = 1;
|
|
newDest.destinationScene.depth = 0;
|
|
newDest.transitionType = TRANSITION_VIDEO;
|
|
newDest.transitionData = 3;
|
|
newDest.transitionStartFrame = -1;
|
|
newDest.transitionLength = -1;
|
|
sceneView->moveToDestination(newDest);
|
|
}
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
class AdjustWheels : public SceneBase {
|
|
public:
|
|
AdjustWheels(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
|
|
void preDestructor() override;
|
|
int paint(Window *viewWindow, Graphics::Surface *preBuffer) override;
|
|
int gdiPaint(Window *viewWindow) override;
|
|
int mouseUp(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int mouseMove(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int specifyCursor(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
|
|
private:
|
|
AVIFrames _leftWheelFrames;
|
|
int _curLeftFrame;
|
|
AVIFrames _rightWheelFrames;
|
|
int _curRightFrame;
|
|
Common::Rect _leftUpRegion;
|
|
Common::Rect _leftDownRegion;
|
|
Common::Rect _rightUpRegion;
|
|
Common::Rect _rightDownRegion;
|
|
bool _translateText;
|
|
};
|
|
|
|
AdjustWheels::AdjustWheels(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
_curLeftFrame = globalFlags.myTPCodeWheelLeftIndex;
|
|
_curRightFrame = globalFlags.myTPCodeWheelRightIndex;
|
|
_leftUpRegion = Common::Rect(46, 0, 200, 70);
|
|
_leftDownRegion = Common::Rect(46, 106, 200, 189);
|
|
_rightUpRegion = Common::Rect(212, 0, 432, 66);
|
|
_rightDownRegion = Common::Rect(212, 109, 432, 189);
|
|
_translateText = false;
|
|
|
|
if (!_leftWheelFrames.open(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 9)))
|
|
error("Failed to open left wheel frames video");
|
|
|
|
if (!_rightWheelFrames.open(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 10)))
|
|
error("Failed to open right wheel frames video");
|
|
}
|
|
|
|
void AdjustWheels::preDestructor() {
|
|
_leftWheelFrames.close();
|
|
_rightWheelFrames.close();
|
|
}
|
|
|
|
int AdjustWheels::paint(Window *viewWindow, Graphics::Surface *preBuffer) {
|
|
if (_staticData.navFrameIndex >= 0) {
|
|
const Graphics::Surface *leftFrame = _leftWheelFrames.getFrame(_curLeftFrame);
|
|
if (leftFrame)
|
|
_vm->_gfx->crossBlit(preBuffer, 0, 0, 208, 189, leftFrame, 0, 0);
|
|
|
|
const Graphics::Surface *rightFrame = _rightWheelFrames.getFrame(_curRightFrame);
|
|
if (rightFrame)
|
|
_vm->_gfx->crossBlit(preBuffer, 208, 0, 224, 189, rightFrame, 0, 0);
|
|
}
|
|
|
|
return SC_REPAINT;
|
|
}
|
|
|
|
int AdjustWheels::gdiPaint(Window *viewWindow) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (_translateText && globalFlags.bcTranslateEnabled == 1) {
|
|
Common::Rect absoluteRect = viewWindow->getAbsoluteRect();
|
|
Common::Rect rect(168, 70, 262, 108);
|
|
rect.translate(absoluteRect.left, absoluteRect.top);
|
|
_vm->_gfx->getScreen()->frameRect(rect, _vm->_gfx->getColor(255, 0, 0));
|
|
}
|
|
|
|
return SC_REPAINT;
|
|
}
|
|
|
|
int AdjustWheels::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
// TODO: Wait between frames after figuring out timing
|
|
|
|
if (_leftUpRegion.contains(pointLocation) || _leftDownRegion.contains(pointLocation) ||
|
|
_rightUpRegion.contains(pointLocation) || _rightDownRegion.contains(pointLocation)) {
|
|
if (_leftDownRegion.contains(pointLocation)) {
|
|
// Move the wheel one frame and redraw
|
|
_curLeftFrame++;
|
|
|
|
if (_curLeftFrame > _leftWheelFrames.getFrameCount() - 1)
|
|
_curLeftFrame = 0;
|
|
|
|
viewWindow->invalidateWindow(false);
|
|
|
|
// And again for the final frame
|
|
_curLeftFrame++;
|
|
|
|
if (_curLeftFrame > _leftWheelFrames.getFrameCount() - 1)
|
|
_curLeftFrame = 0;
|
|
|
|
viewWindow->invalidateWindow(false);
|
|
} else if (_leftUpRegion.contains(pointLocation)) {
|
|
// Move the wheel one frame and redraw
|
|
_curLeftFrame--;
|
|
|
|
if (_curLeftFrame < 0)
|
|
_curLeftFrame = _leftWheelFrames.getFrameCount() - 1;
|
|
|
|
viewWindow->invalidateWindow(false);
|
|
|
|
// And again for the final frame
|
|
_curLeftFrame--;
|
|
|
|
if (_curLeftFrame < 0)
|
|
_curLeftFrame = _leftWheelFrames.getFrameCount() - 1;
|
|
|
|
viewWindow->invalidateWindow(false);
|
|
} else if (_rightDownRegion.contains(pointLocation)) {
|
|
// Move the wheel one frame and redraw
|
|
_curRightFrame++;
|
|
|
|
if (_curRightFrame > _rightWheelFrames.getFrameCount() - 1)
|
|
_curRightFrame = 0;
|
|
|
|
viewWindow->invalidateWindow(false);
|
|
|
|
// And again for the final frame
|
|
_curRightFrame++;
|
|
|
|
if (_curRightFrame > _rightWheelFrames.getFrameCount() - 1)
|
|
_curRightFrame = 0;
|
|
|
|
viewWindow->invalidateWindow(false);
|
|
} else if (_rightUpRegion.contains(pointLocation)) {
|
|
// Move the wheel one frame and redraw
|
|
_curRightFrame--;
|
|
|
|
if (_curRightFrame < 0)
|
|
_curRightFrame = _rightWheelFrames.getFrameCount() - 1;
|
|
|
|
viewWindow->invalidateWindow(false);
|
|
|
|
// And again for the final frame
|
|
_curRightFrame--;
|
|
|
|
if (_curRightFrame < 0)
|
|
_curRightFrame = _rightWheelFrames.getFrameCount() - 1;
|
|
|
|
viewWindow->invalidateWindow(false);
|
|
}
|
|
|
|
globalFlags.myTPCodeWheelLeftIndex = _curLeftFrame;
|
|
globalFlags.myTPCodeWheelRightIndex = _curRightFrame;
|
|
|
|
byte status = 0;
|
|
if (_curLeftFrame == 8 && _curRightFrame == 12)
|
|
status = 1;
|
|
else if (_curLeftFrame == 16 && _curRightFrame == 22)
|
|
status = 1;
|
|
else if (_curLeftFrame == 20 && _curRightFrame == 4)
|
|
status = 1;
|
|
else if (_curLeftFrame == 0 && _curRightFrame == 24)
|
|
status = 1;
|
|
else if (_curLeftFrame == 14 && _curRightFrame == 8)
|
|
status = 1;
|
|
else if (_curLeftFrame == 6 && _curRightFrame == 6)
|
|
status = 1;
|
|
else if (_curLeftFrame == 6 && _curRightFrame == 30)
|
|
status = 1;
|
|
else if (_curLeftFrame == 24 && _curRightFrame == 0)
|
|
status = 1;
|
|
else if (_curLeftFrame == 10 && _curRightFrame == 28)
|
|
status = 1;
|
|
|
|
globalFlags.myTPCodeWheelStatus = status;
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
// Did not click on the wheels, pop back to depth 0
|
|
DestinationScene newDest;
|
|
newDest.destinationScene = _staticData.location;
|
|
newDest.destinationScene.depth = 0;
|
|
newDest.transitionType = TRANSITION_NONE;
|
|
newDest.transitionData = -1;
|
|
newDest.transitionStartFrame = -1;
|
|
newDest.transitionLength = -1;
|
|
sceneView->moveToDestination(newDest);
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int AdjustWheels::mouseMove(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (globalFlags.bcTranslateEnabled == 1) {
|
|
Common::Rect translateTextRegion(168, 72, 260, 106);
|
|
|
|
if (translateTextRegion.contains(pointLocation)) {
|
|
if (!_translateText) {
|
|
Common::String leftText = _vm->getString(IDMYTP_WHEELS_LEFT_TRANS_TEXT_BASE + _curLeftFrame / 2);
|
|
Common::String rightText = _vm->getString(IDMYTP_WHEELS_RIGHT_TRANS_TEXT_BASE + _curRightFrame / 2);
|
|
Common::String finalString = leftText + rightText;
|
|
|
|
if (globalFlags.generalWalkthroughMode == 1 &&
|
|
globalFlags.myTPCodeWheelStatus == 1) {
|
|
|
|
if (_vm->getVersion() >= MAKEVERSION(1, 0, 4, 0))
|
|
finalString += _vm->getString(IDS_MYTP_WALKTHROUGH_HINT_TEXT);
|
|
else
|
|
finalString += " (Mayan Sacred Day)";
|
|
}
|
|
|
|
sceneView->displayTranslationText(finalString);
|
|
_translateText = true;
|
|
viewWindow->invalidateWindow(false);
|
|
}
|
|
} else {
|
|
if (_translateText) {
|
|
_translateText = false;
|
|
viewWindow->invalidateWindow(false);
|
|
}
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
int AdjustWheels::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
|
|
if (_leftUpRegion.contains(pointLocation) || _rightUpRegion.contains(pointLocation))
|
|
return kCursorArrowUp;
|
|
|
|
if (_leftDownRegion.contains(pointLocation) || _rightDownRegion.contains(pointLocation))
|
|
return kCursorArrowDown;
|
|
|
|
return kCursorPutDown;
|
|
}
|
|
|
|
class DateCombinationRead : public SceneBase {
|
|
public:
|
|
DateCombinationRead(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
|
|
int gdiPaint(Window *viewWindow) override;
|
|
int mouseMove(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
|
|
private:
|
|
int _currentRegion;
|
|
};
|
|
|
|
DateCombinationRead::DateCombinationRead(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
_currentRegion = -1;
|
|
}
|
|
|
|
int DateCombinationRead::gdiPaint(Window *viewWindow) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (_currentRegion >= 0 && globalFlags.bcTranslateEnabled == 1) {
|
|
Common::Rect absoluteRect = viewWindow->getAbsoluteRect();
|
|
int left = _currentRegion * 43 + 20 + absoluteRect.left;
|
|
Common::Rect rect(left, absoluteRect.top + 18, left + 43, absoluteRect.top + 110);
|
|
_vm->_gfx->getScreen()->frameRect(rect, _vm->_gfx->getColor(255, 0, 0));
|
|
}
|
|
|
|
return SC_REPAINT;
|
|
}
|
|
|
|
int DateCombinationRead::mouseMove(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (globalFlags.bcTranslateEnabled == 1) {
|
|
Common::Rect symbols(20, 18, 407, 110);
|
|
|
|
if (symbols.contains(pointLocation)) {
|
|
int translatedSymbolIndex = (pointLocation.x - 20) / 43;
|
|
|
|
if (_currentRegion != translatedSymbolIndex) {
|
|
// Update flags
|
|
globalFlags.myTPCalendarListTranslated = 1;
|
|
globalFlags.myTPTextTranslated = 1;
|
|
|
|
// Display the text
|
|
sceneView->displayTranslationText(_vm->getString(IDMYTP_WALLS_COMBO_TRANS_TEXT_BASE + translatedSymbolIndex));
|
|
|
|
// Reset the current region and redraw
|
|
_currentRegion = translatedSymbolIndex;
|
|
viewWindow->invalidateWindow(false);
|
|
}
|
|
} else {
|
|
if (_currentRegion >= 0) {
|
|
_currentRegion = -1;
|
|
viewWindow->invalidateWindow(false);
|
|
}
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
class ViewSingleTranslation : public SceneBase {
|
|
public:
|
|
ViewSingleTranslation(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int translatedTextID, int left, int top, int right, int bottom,
|
|
byte &flagA, byte &flagB, byte &visitedFlag);
|
|
int gdiPaint(Window *viewWindow) override;
|
|
int mouseUp(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int mouseMove(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int specifyCursor(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
|
|
private:
|
|
bool _textTranslated;
|
|
int _textID;
|
|
Common::Rect _clickableRegion;
|
|
byte &_flagA;
|
|
byte &_flagB;
|
|
};
|
|
|
|
ViewSingleTranslation::ViewSingleTranslation(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int translatedTextID, int left, int top, int right, int bottom,
|
|
byte &flagA, byte &flagB, byte &visitedFlag) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation),
|
|
_flagA(flagA), _flagB(flagB) {
|
|
_textTranslated = false;
|
|
_textID = translatedTextID;
|
|
_clickableRegion = Common::Rect(left, top, right, bottom);
|
|
visitedFlag = 1;
|
|
}
|
|
|
|
int ViewSingleTranslation::gdiPaint(Window *viewWindow) {
|
|
// Draw the translated box, if applicable
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
if (_textTranslated && sceneView->getGlobalFlags().bcTranslateEnabled == 1) {
|
|
Common::Rect absoluteRect = viewWindow->getAbsoluteRect();
|
|
Common::Rect rect(_clickableRegion);
|
|
rect.translate(absoluteRect.left, absoluteRect.top);
|
|
_vm->_gfx->getScreen()->frameRect(rect, _vm->_gfx->getColor(255, 0, 0));
|
|
}
|
|
|
|
return SC_REPAINT;
|
|
}
|
|
|
|
int ViewSingleTranslation::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
if (_staticData.location.depth != 0) {
|
|
// If we're not at depth zero, move to depth zero
|
|
Location newLocation = _staticData.location;
|
|
newLocation.depth = 0;
|
|
sceneView->jumpToScene(newLocation);
|
|
return SC_TRUE;
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
int ViewSingleTranslation::mouseMove(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
if (sceneView->getGlobalFlags().bcTranslateEnabled == 1) {
|
|
if (_clickableRegion.contains(pointLocation)) {
|
|
// Make sure we didn't already render the text
|
|
if (!_textTranslated) {
|
|
_flagA = 1;
|
|
_flagB = 1;
|
|
|
|
// Load and display the text
|
|
sceneView->displayTranslationText(_vm->getString(_textID));
|
|
_textTranslated = true;
|
|
viewWindow->invalidateWindow(false);
|
|
}
|
|
} else {
|
|
if (_textTranslated) {
|
|
_textTranslated = false;
|
|
viewWindow->invalidateWindow(false);
|
|
}
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
int ViewSingleTranslation::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
|
|
if (_staticData.location.depth != 0)
|
|
return kCursorPutDown;
|
|
|
|
return kCursorArrow;
|
|
}
|
|
|
|
class GenericCavernDoorMainView : public SceneBase {
|
|
public:
|
|
GenericCavernDoorMainView(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int topZoomDepth = 0, int topLeft = -1, int topTop = -1, int topRight = -1, int topBottom = -1,
|
|
int rightZoomDepth = 0, int rightLeft = -1, int rightTop = -1, int rightRight = -1, int rightBottom = -1,
|
|
int offeringHeadZoomDepth = 0, int offeringHeadLeft = -1, int offeringHeadTop = -1, int offeringHeadRight = -1, int offeringHeadBottom = -1);
|
|
int postEnterRoom(Window *viewWindow, const Location &priorLocation) override;
|
|
int mouseUp(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int specifyCursor(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
|
|
private:
|
|
int _topZoomDepth;
|
|
int _rightZoomDepth;
|
|
int _offeringHeadZoomDepth;
|
|
Common::Rect _topZoomRegion;
|
|
Common::Rect _rightZoomRegion;
|
|
Common::Rect _offeringHeadZoomRegion;
|
|
};
|
|
|
|
GenericCavernDoorMainView::GenericCavernDoorMainView(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int topZoomDepth, int topLeft, int topTop, int topRight, int topBottom,
|
|
int rightZoomDepth, int rightLeft, int rightTop, int rightRight, int rightBottom,
|
|
int offeringHeadZoomDepth, int offeringHeadLeft, int offeringHeadTop, int offeringHeadRight, int offeringHeadBottom) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
_topZoomDepth = topZoomDepth;
|
|
_rightZoomDepth = rightZoomDepth;
|
|
_offeringHeadZoomDepth = offeringHeadZoomDepth;
|
|
_topZoomRegion = Common::Rect(topLeft, topTop, topRight, topBottom);
|
|
_rightZoomRegion = Common::Rect(rightLeft, rightTop, rightRight, rightBottom);
|
|
_offeringHeadZoomRegion = Common::Rect(offeringHeadLeft, offeringHeadTop, offeringHeadRight, offeringHeadBottom);
|
|
|
|
if (_staticData.location.node == 7)
|
|
globalFlags.myMCViewedDeathGodDoor = 1;
|
|
}
|
|
|
|
int GenericCavernDoorMainView::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
Location &loc = _staticData.location;
|
|
|
|
if (loc.node == 7 && (loc.timeZone != priorLocation.timeZone ||
|
|
loc.environment != priorLocation.environment || loc.node != priorLocation.node ||
|
|
loc.facing != priorLocation.facing || loc.orientation != priorLocation.orientation ||
|
|
loc.depth != priorLocation.depth) && !sceneView->isNumberInGlobalFlagTable(MAYAN_EVIDENCE_BROKEN_GLASS_PYRAMID))
|
|
sceneView->displayLiveText(_vm->getString(IDS_MBT_EVIDENCE_PRESENT));
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int GenericCavernDoorMainView::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
// Build a default structure
|
|
DestinationScene newDestination;
|
|
newDestination.destinationScene = _staticData.location;
|
|
newDestination.transitionType = TRANSITION_FADE;
|
|
newDestination.transitionData = -1;
|
|
newDestination.transitionStartFrame = -1;
|
|
newDestination.transitionLength = -1;
|
|
|
|
if (_topZoomRegion.contains(pointLocation)) {
|
|
newDestination.destinationScene.depth = _topZoomDepth;
|
|
sceneView->moveToDestination(newDestination);
|
|
return SC_TRUE;
|
|
}
|
|
|
|
if (_rightZoomRegion.contains(pointLocation)) {
|
|
newDestination.destinationScene.depth = _rightZoomDepth;
|
|
sceneView->moveToDestination(newDestination);
|
|
return SC_TRUE;
|
|
}
|
|
|
|
if (_offeringHeadZoomRegion.contains(pointLocation)) {
|
|
newDestination.destinationScene.depth = _offeringHeadZoomDepth;
|
|
sceneView->moveToDestination(newDestination);
|
|
return SC_TRUE;
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
int GenericCavernDoorMainView::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
|
|
if (_topZoomRegion.contains(pointLocation) || _rightZoomRegion.contains(pointLocation) || _offeringHeadZoomRegion.contains(pointLocation))
|
|
return kCursorMagnifyingGlass;
|
|
|
|
return kCursorArrow;
|
|
}
|
|
|
|
class GenericCavernDoorOfferingHead : public SceneBase {
|
|
public:
|
|
GenericCavernDoorOfferingHead(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int correctOfferingID = -1, int correctOfferingDestDepth = 0, int transitionType = -1, int transitionData = -1, int transitionStartFrame = -1, int transitionLength = -1);
|
|
int draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
|
|
int droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
|
|
int mouseUp(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int specifyCursor(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
|
|
private:
|
|
DestinationScene _correctDestination;
|
|
int _correctOfferingID;
|
|
Common::Rect _dropRegion;
|
|
|
|
bool isValidItemToDrop(Window *viewWindow, int itemID);
|
|
};
|
|
|
|
GenericCavernDoorOfferingHead::GenericCavernDoorOfferingHead(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int correctOfferingID, int correctOfferingDestDepth, int transitionType, int transitionData, int transitionStartFrame, int transitionLength) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
_correctDestination.destinationScene = _staticData.location;
|
|
_correctDestination.destinationScene.depth = correctOfferingDestDepth;
|
|
_correctDestination.transitionType = transitionType;
|
|
_correctDestination.transitionData = transitionData;
|
|
_correctDestination.transitionStartFrame = transitionStartFrame;
|
|
_correctDestination.transitionLength = transitionLength;
|
|
_correctOfferingID = correctOfferingID;
|
|
_dropRegion = Common::Rect(24, 92, 226, 154);
|
|
}
|
|
|
|
int GenericCavernDoorOfferingHead::draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
// If this is walkthrough mode, only accept the correct item
|
|
if (isValidItemToDrop(viewWindow, itemID) && _dropRegion.contains(pointLocation))
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int GenericCavernDoorOfferingHead::droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
if (pointLocation.x == -1 && pointLocation.y == -1)
|
|
return SIC_REJECT;
|
|
|
|
if (!isValidItemToDrop(viewWindow, itemID))
|
|
return SIC_REJECT;
|
|
|
|
if (_dropRegion.contains(pointLocation)) {
|
|
switch (itemID) {
|
|
case kItemBalconyKey:
|
|
sceneView->playSynchronousAnimation(2);
|
|
break;
|
|
case kItemBloodyArrow:
|
|
sceneView->playSynchronousAnimation(3);
|
|
break;
|
|
case kItemObsidianBlock:
|
|
sceneView->playSynchronousAnimation(5);
|
|
break;
|
|
case kItemCoilOfRope:
|
|
sceneView->playSynchronousAnimation(6);
|
|
break;
|
|
case kItemCopperKey:
|
|
sceneView->playSynchronousAnimation(7);
|
|
break;
|
|
case kItemCopperMedallion:
|
|
sceneView->playSynchronousAnimation(8);
|
|
break;
|
|
case kItemCeramicBowl:
|
|
sceneView->playSynchronousAnimation(9);
|
|
break;
|
|
case kItemGrapplingHook:
|
|
sceneView->playSynchronousAnimation(10);
|
|
break;
|
|
case kItemHammer:
|
|
sceneView->playSynchronousAnimation(11);
|
|
break;
|
|
case kItemPreservedHeart:
|
|
sceneView->playSynchronousAnimation(12);
|
|
break;
|
|
case kItemJadeBlock:
|
|
sceneView->playSynchronousAnimation(13);
|
|
break;
|
|
case kItemLimestoneBlock:
|
|
sceneView->playSynchronousAnimation(14);
|
|
break;
|
|
case kItemMetalBar:
|
|
sceneView->playSynchronousAnimation(15);
|
|
break;
|
|
case kItemCavernSkull:
|
|
sceneView->playSynchronousAnimation(16);
|
|
break;
|
|
case kItemEntrySkull:
|
|
sceneView->playSynchronousAnimation(17);
|
|
break;
|
|
case kItemSpearSkull:
|
|
sceneView->playSynchronousAnimation(18);
|
|
break;
|
|
case kItemWaterCanFull:
|
|
sceneView->playSynchronousAnimation(19);
|
|
break;
|
|
case kItemWoodenPegs:
|
|
sceneView->playSynchronousAnimation(20);
|
|
break;
|
|
case kItemGoldCoins:
|
|
sceneView->playSynchronousAnimation(21);
|
|
break;
|
|
}
|
|
|
|
// Reset the offering flag
|
|
sceneView->getGlobalFlags().myMCTransMadeAnOffering = 1;
|
|
|
|
// If this was the correct offering, move to the open door scene
|
|
if (itemID == _correctOfferingID) {
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 10), 128, false, true);
|
|
sceneView->moveToDestination(_correctDestination);
|
|
}
|
|
|
|
// These items don't get consumed
|
|
if (itemID == kItemWaterCanFull || itemID == kItemGoldCoins)
|
|
return SIC_REJECT;
|
|
|
|
return SIC_ACCEPT;
|
|
}
|
|
|
|
return SIC_REJECT;
|
|
}
|
|
|
|
int GenericCavernDoorOfferingHead::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
Location newLocation = _staticData.location;
|
|
newLocation.depth = 0;
|
|
sceneView->jumpToScene(newLocation);
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int GenericCavernDoorOfferingHead::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
|
|
return kCursorPutDown;
|
|
}
|
|
|
|
bool GenericCavernDoorOfferingHead::isValidItemToDrop(Window *viewWindow, int itemID) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
// If this is walkthrough mode, only accept the correct item
|
|
if (globalFlags.generalWalkthroughMode == 1) {
|
|
if (itemID == _correctOfferingID || (_staticData.location.node == 8 && itemID == kItemBloodyArrow))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
// Otherwise, any of the allowed items
|
|
switch (itemID) {
|
|
case kItemCavernSkull:
|
|
case kItemEntrySkull:
|
|
case kItemSpearSkull:
|
|
case kItemBloodyArrow:
|
|
case kItemCopperMedallion:
|
|
case kItemCoilOfRope:
|
|
case kItemCopperKey:
|
|
case kItemJadeBlock:
|
|
case kItemLimestoneBlock:
|
|
case kItemObsidianBlock:
|
|
case kItemGrapplingHook:
|
|
case kItemPreservedHeart:
|
|
case kItemHammer:
|
|
case kItemGoldCoins:
|
|
case kItemWaterCanEmpty:
|
|
case kItemWaterCanFull:
|
|
case kItemWoodenPegs:
|
|
case kItemBalconyKey:
|
|
case kItemBurnedLetter: // Can't actually drop this, though
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
class DeathGodCavernDoorOfferingHead : public SceneBase {
|
|
public:
|
|
DeathGodCavernDoorOfferingHead(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int correctOfferingDestDepth = 0, int transitionType = -1, int transitionData = -1, int transitionStartFrame = -1, int transitionLength = -1);
|
|
int preExitRoom(Window *viewWindow, const Location &newLocation) override;
|
|
int mouseUp(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
|
|
int droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
|
|
int specifyCursor(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
|
|
private:
|
|
DestinationScene _correctDestination;
|
|
Common::Rect _dropRegion;
|
|
};
|
|
|
|
DeathGodCavernDoorOfferingHead::DeathGodCavernDoorOfferingHead(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int correctOfferingDestDepth, int transitionType, int transitionData, int transitionStartFrame, int transitionLength) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
_correctDestination.destinationScene = _staticData.location;
|
|
_correctDestination.destinationScene.depth = correctOfferingDestDepth;
|
|
_correctDestination.transitionType = transitionType;
|
|
_correctDestination.transitionData = transitionData;
|
|
_correctDestination.transitionStartFrame = transitionStartFrame;
|
|
_correctDestination.transitionLength = transitionLength;
|
|
_dropRegion = Common::Rect(50, 76, 228, 182);
|
|
|
|
byte offerings = globalFlags.myMCDeathGodOfferings;
|
|
|
|
if (offerings & 1) {
|
|
if (offerings & 2) {
|
|
if (offerings & 4)
|
|
_staticData.navFrameIndex = 190;
|
|
else
|
|
_staticData.navFrameIndex = 189;
|
|
} else if (offerings & 4) {
|
|
_staticData.navFrameIndex = 188;
|
|
} else {
|
|
_staticData.navFrameIndex = 186;
|
|
}
|
|
} else if (offerings & 2) {
|
|
if (offerings & 4)
|
|
_staticData.navFrameIndex = 187;
|
|
else
|
|
_staticData.navFrameIndex = 185;
|
|
} else if (offerings & 4) {
|
|
_staticData.navFrameIndex = 184;
|
|
}
|
|
}
|
|
|
|
int DeathGodCavernDoorOfferingHead::preExitRoom(Window *viewWindow, const Location &newLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
InventoryWindow *inventoryWindow = ((GameUIWindow *)viewWindow->getParent())->_inventoryWindow;
|
|
|
|
// Put any pieces placed in the head back in the inventory
|
|
byte &offerings = globalFlags.myMCDeathGodOfferings;
|
|
|
|
if (offerings & 1)
|
|
inventoryWindow->addItem(kItemObsidianBlock);
|
|
if (offerings & 2)
|
|
inventoryWindow->addItem(kItemJadeBlock);
|
|
if (offerings & 4)
|
|
inventoryWindow->addItem(kItemLimestoneBlock);
|
|
|
|
offerings = 0;
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int DeathGodCavernDoorOfferingHead::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
// Return to depth zero
|
|
DestinationScene newDest;
|
|
newDest.destinationScene = _staticData.location;
|
|
newDest.destinationScene.depth = 0;
|
|
newDest.transitionType = TRANSITION_NONE;
|
|
newDest.transitionData = -1;
|
|
newDest.transitionStartFrame = -1;
|
|
newDest.transitionLength = -1;
|
|
sceneView->moveToDestination(newDest);
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int DeathGodCavernDoorOfferingHead::draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if ((itemID == kItemJadeBlock || itemID == kItemLimestoneBlock || itemID == kItemObsidianBlock) && _dropRegion.contains(pointLocation)) {
|
|
byte offerings = globalFlags.myMCDeathGodOfferings;
|
|
|
|
if ((offerings & 1) != 0 && itemID == kItemObsidianBlock)
|
|
return 0;
|
|
if ((offerings & 2) != 0 && itemID == kItemJadeBlock)
|
|
return 0;
|
|
if ((offerings & 4) != 0 && itemID == kItemLimestoneBlock)
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int DeathGodCavernDoorOfferingHead::droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (pointLocation.x == -1 && pointLocation.y == -1)
|
|
return SIC_REJECT;
|
|
|
|
if ((itemID == kItemJadeBlock || itemID == kItemLimestoneBlock || itemID == kItemObsidianBlock) && _dropRegion.contains(pointLocation)) {
|
|
byte &offerings = globalFlags.myMCDeathGodOfferings;
|
|
|
|
// Make sure we didn't already place the item
|
|
if ((offerings & 1) != 0 && itemID == kItemObsidianBlock)
|
|
return SIC_REJECT;
|
|
if ((offerings & 2) != 0 && itemID == kItemJadeBlock)
|
|
return SIC_REJECT;
|
|
if ((offerings & 4) != 0 && itemID == kItemLimestoneBlock)
|
|
return SIC_REJECT;
|
|
|
|
// Add the item
|
|
if (itemID == kItemObsidianBlock)
|
|
offerings |= 1;
|
|
else if (itemID == kItemJadeBlock)
|
|
offerings |= 2;
|
|
else if (itemID == kItemLimestoneBlock)
|
|
offerings |= 4;
|
|
|
|
// Change the image
|
|
if (offerings & 1) {
|
|
if (offerings & 2) {
|
|
if (offerings & 4)
|
|
_staticData.navFrameIndex = 190;
|
|
else
|
|
_staticData.navFrameIndex = 189;
|
|
} else if (offerings & 4) {
|
|
_staticData.navFrameIndex = 188;
|
|
} else {
|
|
_staticData.navFrameIndex = 186;
|
|
}
|
|
} else if (offerings & 2) {
|
|
if (offerings & 4)
|
|
_staticData.navFrameIndex = 187;
|
|
else
|
|
_staticData.navFrameIndex = 185;
|
|
} else if (offerings & 4) {
|
|
_staticData.navFrameIndex = 184;
|
|
} else {
|
|
_staticData.navFrameIndex = 152;
|
|
}
|
|
|
|
viewWindow->invalidateWindow(false);
|
|
|
|
if ((offerings & 1) != 0 && (offerings & 2) != 0 && (offerings & 4) != 0) {
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 10), 128, false, true);
|
|
sceneView->moveToDestination(_correctDestination);
|
|
}
|
|
|
|
return SIC_ACCEPT;
|
|
}
|
|
|
|
return SIC_REJECT;
|
|
}
|
|
|
|
int DeathGodCavernDoorOfferingHead::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
|
|
return kCursorPutDown;
|
|
}
|
|
|
|
class WealthGodRopeDrop : public SceneBase {
|
|
public:
|
|
WealthGodRopeDrop(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
|
|
int postEnterRoom(Window *viewWindow, const Location &priorLocation) override;
|
|
int draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
|
|
int droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
|
|
|
|
private:
|
|
Common::Rect _dropRope;
|
|
};
|
|
|
|
WealthGodRopeDrop::WealthGodRopeDrop(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (globalFlags.myWGPlacedRope == 1)
|
|
_staticData.navFrameIndex = 121;
|
|
|
|
_dropRope = Common::Rect(222, 149, 282, 189);
|
|
}
|
|
|
|
int WealthGodRopeDrop::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (globalFlags.myWGPlacedRope != 0) {
|
|
Location newLocation = _staticData.location;
|
|
newLocation.depth = 1;
|
|
sceneView->jumpToScene(newLocation);
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int WealthGodRopeDrop::draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
// OK, I honestly didn't know you could use the grappling hook here
|
|
if (_dropRope.contains(pointLocation) && (itemID == kItemCoilOfRope || itemID == kItemGrapplingHook))
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int WealthGodRopeDrop::droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (pointLocation.x == -1 && pointLocation.y == -1)
|
|
return SIC_REJECT;
|
|
|
|
if (_dropRope.contains(pointLocation) && (itemID == kItemCoilOfRope || itemID == kItemGrapplingHook)) {
|
|
globalFlags.myWGPlacedRope = 1;
|
|
Location newLocation = _staticData.location;
|
|
newLocation.depth = 1;
|
|
sceneView->jumpToScene(newLocation);
|
|
return SIC_ACCEPT;
|
|
}
|
|
|
|
return SIC_REJECT;
|
|
}
|
|
|
|
class WaterGodInitialWalkSetFlag : public SceneBase {
|
|
public:
|
|
WaterGodInitialWalkSetFlag(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
|
|
};
|
|
|
|
WaterGodInitialWalkSetFlag::WaterGodInitialWalkSetFlag(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
// Set flag on entry
|
|
globalFlags.myWTCurrentBridgeStatus = 1;
|
|
}
|
|
|
|
class WaterGodBridgeJump : public SceneBase {
|
|
public:
|
|
WaterGodBridgeJump(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int movieFileNameID = 0, int playingStartingFrame = 0, int sequenceStartingFrame = 0, int framesPerCycle = 0,
|
|
int jumpFudgeFrames = 0, int sequenceLength = 0, bool jumpMidCycle = false, int frameOffsetToEndOfSwing = 0);
|
|
int postEnterRoom(Window *viewWindow, const Location &priorLocation) override;
|
|
int preExitRoom(Window *viewWindow, const Location &newLocation) override;
|
|
int postExitRoom(Window *viewWindow, const Location &newLocation) override;
|
|
int timerCallback(Window *viewWindow) override;
|
|
int movieCallback(Window *viewWindow, VideoWindow *movie, int animationID, int status) override;
|
|
|
|
private:
|
|
int _movieID;
|
|
int _startingMovieFrame;
|
|
int _playingStartingFrame;
|
|
int _framesPerCycle;
|
|
int _sequenceLength;
|
|
int _jumpFudgeFrames;
|
|
int _finalFrameIndex;
|
|
int _soundID;
|
|
DestinationScene _savedDestForward;
|
|
bool _jumpMidCycle;
|
|
int _frameOffsetToEndOfSwing;
|
|
};
|
|
|
|
WaterGodBridgeJump::WaterGodBridgeJump(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int movieFileNameID, int playingStartingFrame, int sequenceStartingFrame, int framesPerCycle,
|
|
int jumpFudgeFrames, int sequenceLength, bool jumpMidCycle, int frameOffsetToEndOfSwing) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
_movieID = movieFileNameID;
|
|
_playingStartingFrame = playingStartingFrame;
|
|
_startingMovieFrame = sequenceStartingFrame;
|
|
_framesPerCycle = framesPerCycle;
|
|
_sequenceLength = sequenceLength;
|
|
_jumpFudgeFrames = jumpFudgeFrames;
|
|
_finalFrameIndex = -1;
|
|
_soundID = -1;
|
|
_jumpMidCycle = jumpMidCycle;
|
|
_frameOffsetToEndOfSwing = frameOffsetToEndOfSwing;
|
|
|
|
// Save the forward movement data for later
|
|
_savedDestForward = _staticData.destForward;
|
|
_staticData.destForward.destinationScene = Location(-1, -1, -1, -1, -1, -1);
|
|
_staticData.destForward.transitionType = -1;
|
|
_staticData.destForward.transitionData = -1;
|
|
_staticData.destForward.transitionStartFrame = -1;
|
|
_staticData.destForward.transitionLength = -1;
|
|
|
|
// Set visited flag
|
|
globalFlags.myWTSteppedOnSwings = 1;
|
|
}
|
|
|
|
int WaterGodBridgeJump::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
// Raise the ambient sound
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
uint32 ambientPos = _vm->_sound->getSecondaryAmbientPosition();
|
|
|
|
int frameStartingOffset = (ambientPos / 1838) % _sequenceLength + (_startingMovieFrame - _playingStartingFrame) % _sequenceLength;
|
|
|
|
// Load and start the new asynchronous animation
|
|
sceneView->startAsynchronousAnimation(_movieID, _startingMovieFrame, _playingStartingFrame + frameStartingOffset, _sequenceLength, true);
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int WaterGodBridgeJump::preExitRoom(Window *viewWindow, const Location &newLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
_finalFrameIndex = sceneView->getAsynchronousAnimationCurrentPosition();
|
|
|
|
// Moving to another node should kill the anim
|
|
if (newLocation.node != 4 || newLocation.timeZone != 2 || newLocation.environment != 4)
|
|
sceneView->stopAsynchronousAnimation();
|
|
|
|
// If we are walking into a node less than 5, kill the ambient
|
|
if (newLocation.node <= 3)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int WaterGodBridgeJump::postExitRoom(Window *viewWindow, const Location &newLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
if (newLocation.facing == _staticData.location.facing && newLocation.timeZone == _staticData.location.timeZone &&
|
|
newLocation.environment == _staticData.location.environment) {
|
|
if (_jumpMidCycle) {
|
|
int diff = (_finalFrameIndex - _playingStartingFrame) % (_framesPerCycle * 2);
|
|
int diffB = (_finalFrameIndex - _playingStartingFrame - _framesPerCycle) % _framesPerCycle;
|
|
int diffC = _framesPerCycle - (_finalFrameIndex - _playingStartingFrame) % _framesPerCycle;
|
|
|
|
if (diff > _framesPerCycle || diffB > _framesPerCycle || diffC > _jumpFudgeFrames * 2) {
|
|
if (_staticData.location.facing == 0)
|
|
sceneView->showDeathScene(14);
|
|
else
|
|
sceneView->showDeathScene(15);
|
|
|
|
return SC_DEATH;
|
|
}
|
|
} else {
|
|
if ((_finalFrameIndex - _playingStartingFrame) % _framesPerCycle > _jumpFudgeFrames && _framesPerCycle - (_finalFrameIndex - _playingStartingFrame) % _framesPerCycle > _jumpFudgeFrames) {
|
|
if (_staticData.location.facing == 0)
|
|
sceneView->showDeathScene(14);
|
|
else
|
|
sceneView->showDeathScene(15);
|
|
|
|
return SC_DEATH;
|
|
}
|
|
}
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int WaterGodBridgeJump::timerCallback(Window *viewWindow) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
NavArrowWindow *navArrow = ((GameUIWindow *)viewWindow->getParent())->_navArrowWindow;
|
|
|
|
// If we have reached the end of the starting sequence, reset the arrows
|
|
if (_staticData.destForward.destinationScene.timeZone == -1 && sceneView->getAsynchronousAnimationCurrentPosition() >= _startingMovieFrame) {
|
|
_staticData.destForward = _savedDestForward;
|
|
navArrow->updateAllArrows(_staticData);
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int WaterGodBridgeJump::movieCallback(Window *viewWindow, VideoWindow *movie, int animationID, int status) {
|
|
if (status == MOVIE_LOOPING_RESTART)
|
|
_vm->_sound->restartSecondaryAmbientSound();
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
class ArrowGodHead : public SceneBase {
|
|
public:
|
|
ArrowGodHead(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int headID = 0, int clickLeft = -1, int clickTop = -1, int clickRight = -1, int clickBottom = -1,
|
|
int emptyClosedStill = -1, int emptyOpenStill = -1, int fullClosedStill = -1, int fullOpenStill = -1,
|
|
int emptyClosedAnim = -1, int emptyOpenAnim = -1, int fullClosedAnim = -1, int fullOpenAnim = -1);
|
|
int postEnterRoom(Window *viewWindow, const Location &priorLocation) override;
|
|
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;
|
|
int droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
|
|
int specifyCursor(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int timerCallback(Window *viewWindow) override;
|
|
|
|
private:
|
|
int _headID;
|
|
Common::Rect _skullRegion;
|
|
int _stillFrames[4];
|
|
int _soundID;
|
|
int _headAnimations[4];
|
|
GlobalFlags &_globalFlags;
|
|
|
|
uint32 *headOpenedTime(byte headId);
|
|
uint32 getHeadOpenedTime(byte headId);
|
|
void setHeadOpenedTime(byte headId, uint32 value);
|
|
byte *headTouched(byte headId);
|
|
void setHeadTouched(byte value);
|
|
byte *headStatus(byte headId);
|
|
byte getHeadStatus();
|
|
byte getHeadStatus(byte headId);
|
|
void setHeadStatus(byte headId, byte value);
|
|
void setHeadStatus(byte value);
|
|
byte *headStatusSkullId(byte headId);
|
|
byte getHeadStatusSkullId();
|
|
void setHeadStatusSkullId(byte value);
|
|
};
|
|
|
|
ArrowGodHead::ArrowGodHead(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
int headID, int clickLeft, int clickTop, int clickRight, int clickBottom,
|
|
int emptyClosedStill, int emptyOpenStill, int fullClosedStill, int fullOpenStill,
|
|
int emptyClosedAnim, int emptyOpenAnim, int fullClosedAnim, int fullOpenAnim) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation),
|
|
_globalFlags(((SceneViewWindow *)viewWindow)->getGlobalFlags()) {
|
|
_soundID = -1;
|
|
_headID = headID;
|
|
_skullRegion = Common::Rect(clickLeft, clickTop, clickRight, clickBottom);
|
|
_stillFrames[0] = emptyClosedStill;
|
|
_stillFrames[1] = emptyOpenStill;
|
|
_stillFrames[2] = fullClosedStill;
|
|
_stillFrames[3] = fullOpenStill;
|
|
_headAnimations[0] = emptyClosedAnim;
|
|
_headAnimations[1] = emptyOpenAnim;
|
|
_headAnimations[2] = fullClosedAnim;
|
|
_headAnimations[3] = fullOpenAnim;
|
|
_staticData.navFrameIndex = _stillFrames[getHeadStatus()];
|
|
}
|
|
|
|
uint32 *ArrowGodHead::headOpenedTime(byte headId) {
|
|
switch (headId) {
|
|
case 0:
|
|
return &_globalFlags.myAGHeadAOpenedTime;
|
|
case 1:
|
|
return &_globalFlags.myAGHeadBOpenedTime;
|
|
case 2:
|
|
return &_globalFlags.myAGHeadCOpenedTime;
|
|
case 3:
|
|
return &_globalFlags.myAGHeadDOpenedTime;
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
uint32 ArrowGodHead::getHeadOpenedTime(byte headId) {
|
|
uint32 *openedTime = headOpenedTime(headId);
|
|
return openedTime ? *openedTime : 0;
|
|
}
|
|
|
|
void ArrowGodHead::setHeadOpenedTime(byte headId, uint32 value) {
|
|
uint32 *openedTime = headOpenedTime(headId);
|
|
if (openedTime)
|
|
*openedTime = value;
|
|
}
|
|
|
|
byte *ArrowGodHead::headTouched(byte headId) {
|
|
switch (headId) {
|
|
case 0:
|
|
return &_globalFlags.myAGHeadATouched;
|
|
case 1:
|
|
return &_globalFlags.myAGHeadBTouched;
|
|
case 2:
|
|
return &_globalFlags.myAGHeadCTouched;
|
|
case 3:
|
|
return &_globalFlags.myAGHeadDTouched;
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
void ArrowGodHead::setHeadTouched(byte value) {
|
|
byte *touched = headTouched(_headID);
|
|
if (touched)
|
|
*touched = value;
|
|
}
|
|
|
|
byte *ArrowGodHead::headStatus(byte headId) {
|
|
switch (headId) {
|
|
case 0:
|
|
return &_globalFlags.myAGHeadAStatus;
|
|
case 1:
|
|
return &_globalFlags.myAGHeadBStatus;
|
|
case 2:
|
|
return &_globalFlags.myAGHeadCStatus;
|
|
case 3:
|
|
return &_globalFlags.myAGHeadDStatus;
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
byte ArrowGodHead::getHeadStatus() {
|
|
return getHeadStatus(_headID);
|
|
}
|
|
|
|
byte ArrowGodHead::getHeadStatus(byte headId) {
|
|
byte *status = headStatus(headId);
|
|
return status ? *status : 0;
|
|
}
|
|
|
|
void ArrowGodHead::setHeadStatus(byte value) {
|
|
setHeadStatus(_headID, value);
|
|
}
|
|
|
|
void ArrowGodHead::setHeadStatus(byte headId, byte value) {
|
|
byte *status = headStatus(headId);
|
|
if (status)
|
|
*status = value;
|
|
}
|
|
|
|
byte *ArrowGodHead::headStatusSkullId(byte headId) {
|
|
switch (headId) {
|
|
case 0:
|
|
return &_globalFlags.myAGHeadAStatusSkullID;
|
|
case 1:
|
|
return &_globalFlags.myAGHeadBStatusSkullID;
|
|
case 2:
|
|
return &_globalFlags.myAGHeadCStatusSkullID;
|
|
case 3:
|
|
return &_globalFlags.myAGHeadDStatusSkullID;
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
byte ArrowGodHead::getHeadStatusSkullId() {
|
|
byte *status = headStatusSkullId(_headID);
|
|
return status ? *status : 0;
|
|
}
|
|
|
|
void ArrowGodHead::setHeadStatusSkullId(byte value) {
|
|
byte *status = headStatusSkullId(_headID);
|
|
if (status)
|
|
*status = value;
|
|
}
|
|
|
|
int ArrowGodHead::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
|
|
byte headAStatus = _globalFlags.myAGHeadAStatus;
|
|
byte headDStatus = _globalFlags.myAGHeadDStatus;
|
|
|
|
if (_staticData.location.node == 0) {
|
|
if (headAStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else if (headDStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(64, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
} else if (_staticData.location.node == 2) {
|
|
if (headAStatus == 0 || headDStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int ArrowGodHead::mouseDown(Window *viewWindow, const Common::Point &pointLocation) {
|
|
BioChipRightWindow *bioChipRightWindow = ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow;
|
|
InventoryWindow *inventoryWindow = ((GameUIWindow *)viewWindow->getParent())->_inventoryWindow;
|
|
|
|
// For walkthrough mode, don't allow input
|
|
if (_globalFlags.generalWalkthroughMode == 1 && (_headID == 0 || _headID == 3))
|
|
return SC_FALSE;
|
|
|
|
if (_skullRegion.contains(pointLocation) && getHeadStatus() == 3) {
|
|
byte skullIndex = getHeadStatusSkullId();
|
|
setHeadStatusSkullId(0);
|
|
setHeadStatus(1);
|
|
_staticData.navFrameIndex = _stillFrames[1];
|
|
setHeadTouched(1);
|
|
|
|
// Begin dragging
|
|
Common::Point ptInventoryWindow = viewWindow->convertPointToWindow(pointLocation, inventoryWindow);
|
|
inventoryWindow->startDraggingNewItem(skullIndex, ptInventoryWindow);
|
|
bioChipRightWindow->sceneChanged();
|
|
return SC_TRUE;
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
int ArrowGodHead::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
BioChipRightWindow *bioChipRightWindow = ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow;
|
|
Location &loc = _staticData.location;
|
|
|
|
// For walkthrough mode, don't allow input
|
|
if (_globalFlags.generalWalkthroughMode == 1 && (_headID == 0 || _headID == 3))
|
|
return SC_FALSE;
|
|
|
|
// Did we click on the head?
|
|
if (_skullRegion.contains(pointLocation)) {
|
|
byte headStatus = getHeadStatus();
|
|
setHeadTouched(1);
|
|
|
|
if (headStatus & 1)
|
|
headStatus--;
|
|
else
|
|
headStatus++;
|
|
|
|
setHeadStatus(headStatus);
|
|
|
|
// Play the proper movie
|
|
int currentSoundID = -1;
|
|
if (headStatus == 2)
|
|
currentSoundID = _vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 14), 128, false, true);
|
|
else
|
|
currentSoundID = _vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 13), 128, false, true);
|
|
|
|
if ((_headID == 1 || _headID == 2) && headStatus == 0) {
|
|
if (loc.node == 0)
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 11), 127);
|
|
else
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 11), 96);
|
|
}
|
|
|
|
sceneView->playSynchronousAnimation(_headAnimations[headStatus]);
|
|
|
|
_staticData.navFrameIndex = _stillFrames[headStatus];
|
|
viewWindow->invalidateWindow(false);
|
|
|
|
byte headAStatus = _globalFlags.myAGHeadAStatus;
|
|
byte headBStatus = _globalFlags.myAGHeadBStatus;
|
|
byte headCStatus = _globalFlags.myAGHeadCStatus;
|
|
byte headDStatus = _globalFlags.myAGHeadDStatus;
|
|
|
|
if (loc.node == 0) {
|
|
if (headAStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else if (headDStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(64, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
} else if (loc.node == 2) {
|
|
if (headAStatus == 0 || headDStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
}
|
|
|
|
_vm->_sound->stopSoundEffect(currentSoundID);
|
|
|
|
if (loc.node == 0 && (headBStatus < 3 && headCStatus < 3))
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 11), 127);
|
|
else if (loc.node == 2 && (headBStatus < 3 && headCStatus < 3))
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 11), 96);
|
|
|
|
if (headStatus & 1)
|
|
setHeadOpenedTime(_headID, g_system->getMillis());
|
|
|
|
bioChipRightWindow->sceneChanged();
|
|
return SC_TRUE;
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
int ArrowGodHead::draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
if (_globalFlags.generalWalkthroughMode == 1 && (_headID == 0 || _headID == 3))
|
|
return 0;
|
|
|
|
if ((itemID == kItemCavernSkull || itemID == kItemEntrySkull || itemID == kItemSpearSkull) && getHeadStatus() < 2 && _skullRegion.contains(pointLocation))
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ArrowGodHead::droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
BioChipRightWindow *bioChipRightWindow = ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow;
|
|
|
|
if (_globalFlags.generalWalkthroughMode == 1 && (_headID == 0 || _headID == 3))
|
|
return SIC_REJECT;
|
|
|
|
if (pointLocation.x == -1 && pointLocation.y == -1)
|
|
return SIC_REJECT;
|
|
|
|
if ((itemID == kItemCavernSkull || itemID == kItemEntrySkull || itemID == kItemSpearSkull) && getHeadStatus() == 1 && _skullRegion.contains(pointLocation)) {
|
|
setHeadStatus(2);
|
|
setHeadTouched(1);
|
|
setHeadStatusSkullId(itemID);
|
|
|
|
int currentSoundID = _vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 14), 128, false, true);
|
|
|
|
sceneView->playSynchronousAnimation(_headAnimations[2]);
|
|
|
|
_staticData.navFrameIndex = _stillFrames[2];
|
|
viewWindow->invalidateWindow(false);
|
|
|
|
byte headAStatus = _globalFlags.myAGHeadAStatus;
|
|
byte headDStatus = _globalFlags.myAGHeadDStatus;
|
|
|
|
if (_staticData.location.node == 0) {
|
|
if (headAStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else if (headDStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(64, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
} else if (_staticData.location.node == 2) {
|
|
if (headAStatus == 0 || headDStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
}
|
|
|
|
_vm->_sound->stopSoundEffect(currentSoundID);
|
|
|
|
bioChipRightWindow->sceneChanged();
|
|
return SIC_ACCEPT;
|
|
}
|
|
|
|
return SIC_REJECT;
|
|
}
|
|
|
|
int ArrowGodHead::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
|
|
if (_globalFlags.generalWalkthroughMode == 1 && (_headID == 0 || _headID == 3))
|
|
return 0;
|
|
|
|
if (_skullRegion.contains(pointLocation)) {
|
|
if (getHeadStatus() == 3)
|
|
return kCursorOpenHand;
|
|
|
|
return kCursorFinger;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ArrowGodHead::timerCallback(Window *viewWindow) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
BioChipRightWindow *bioChipRightWindow = ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow;
|
|
Location &loc = _staticData.location;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
uint32 lastStartedTimer = getHeadOpenedTime(i);
|
|
|
|
if (lastStartedTimer > 0 && g_system->getMillis() > (lastStartedTimer + WAR_GOD_HEAD_TIMER_VALUE)) {
|
|
setHeadOpenedTime(i, 0);
|
|
|
|
TempCursorChange cursorChange(kCursorWait);
|
|
|
|
if (i == _headID) {
|
|
byte status = getHeadStatus();
|
|
|
|
if (status & 1) {
|
|
status--;
|
|
setHeadStatus(status);
|
|
|
|
int currentSoundID = -1;
|
|
if (status == 2)
|
|
currentSoundID = _vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 14), 128, false, true);
|
|
else
|
|
currentSoundID = _vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 13), 128, false, true);
|
|
|
|
sceneView->playSynchronousAnimation(_headAnimations[status]);
|
|
|
|
_staticData.navFrameIndex = _stillFrames[status];
|
|
viewWindow->invalidateWindow(false);
|
|
|
|
_vm->_sound->stopSoundEffect(currentSoundID);
|
|
|
|
byte headAStatus = _globalFlags.myAGHeadAStatus;
|
|
byte headBStatus = _globalFlags.myAGHeadBStatus;
|
|
byte headCStatus = _globalFlags.myAGHeadCStatus;
|
|
byte headDStatus = _globalFlags.myAGHeadDStatus;
|
|
|
|
if (loc.node == 0) {
|
|
if (headAStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else if (headDStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(64, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
} else if (loc.node == 2) {
|
|
if (headAStatus == 0 || headDStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
}
|
|
|
|
// Play the door closing sound, if applicable
|
|
if (i == 1 || i == 2) {
|
|
if (loc.node == 0 && (headBStatus == 0 || headCStatus == 0))
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 11), 127);
|
|
else if (loc.node == 2 && (headBStatus == 0 || headCStatus == 0))
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 11), 96);
|
|
}
|
|
}
|
|
|
|
bioChipRightWindow->sceneChanged();
|
|
} else {
|
|
byte status = getHeadStatus(i);
|
|
|
|
if (status & 1) {
|
|
status--;
|
|
setHeadStatus(i, status);
|
|
|
|
if (status == 2)
|
|
_vm->_sound->playSynchronousSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 14), 128);
|
|
else
|
|
_vm->_sound->playSynchronousSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 13), 128);
|
|
|
|
byte headAStatus = _globalFlags.myAGHeadAStatus;
|
|
byte headDStatus = _globalFlags.myAGHeadDStatus;
|
|
|
|
if (loc.node == 0) {
|
|
if (headAStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else if (headDStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(64, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
} else if (loc.node == 2) {
|
|
if (headAStatus == 0 || headDStatus == 0)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
}
|
|
}
|
|
|
|
bioChipRightWindow->sceneChanged();
|
|
|
|
if (_headID == 1 || _headID == 2) {
|
|
if (loc.node == 0)
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 11), 127);
|
|
else if (loc.node == 2)
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, 11), 96);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
class ArrowGodDepthChange : public SceneBase {
|
|
public:
|
|
ArrowGodDepthChange(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
|
|
int postEnterRoom(Window *viewWindow, const Location &priorLocation) override;
|
|
int postExitRoom(Window *viewWindow, const Location &newLocation) override;
|
|
int timerCallback(Window *viewWindow) override;
|
|
|
|
private:
|
|
bool _scheduledDepthChange;
|
|
int _soundID;
|
|
GlobalFlags &_globalFlags;
|
|
|
|
bool adjustSpearVolume(Window *viewWindow);
|
|
uint32 *headOpenedTime(byte headId);
|
|
uint32 getHeadOpenedTime(byte headId);
|
|
void setHeadOpenedTime(byte headId, uint32 value);
|
|
byte *headStatus(byte headId);
|
|
byte getHeadStatus(byte headId);
|
|
void setHeadStatus(byte headId, byte value);
|
|
};
|
|
|
|
ArrowGodDepthChange::ArrowGodDepthChange(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation),
|
|
_globalFlags(((SceneViewWindow *)viewWindow)->getGlobalFlags()) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
_scheduledDepthChange = false;
|
|
_soundID = -1;
|
|
|
|
byte headAStatus = _globalFlags.myAGHeadAStatus;
|
|
byte headBStatus = _globalFlags.myAGHeadBStatus;
|
|
byte headCStatus = _globalFlags.myAGHeadCStatus;
|
|
byte headDStatus = _globalFlags.myAGHeadDStatus;
|
|
|
|
int targetDepth = 0;
|
|
|
|
if (headBStatus > 0 || headCStatus > 0) {
|
|
if (headBStatus > 0) {
|
|
if (headAStatus == 0 || headDStatus == 0) {
|
|
if (headAStatus == 0 && headDStatus == 0) {
|
|
targetDepth = 11;
|
|
} else if (headAStatus > 0 && headDStatus == 0) {
|
|
targetDepth = 10;
|
|
} else if (headAStatus == 0 && headDStatus > 0) {
|
|
targetDepth = 9;
|
|
}
|
|
} else {
|
|
targetDepth = 8;
|
|
}
|
|
} else if (headCStatus > 0) {
|
|
if (headAStatus == 0 || headDStatus == 0) {
|
|
if (headAStatus == 0 && headDStatus == 0) {
|
|
targetDepth = 7;
|
|
} else if (headAStatus > 0 && headDStatus == 0) {
|
|
targetDepth = 6;
|
|
} else if (headAStatus == 0 && headDStatus > 0) {
|
|
targetDepth = 5;
|
|
}
|
|
} else {
|
|
targetDepth = 4;
|
|
}
|
|
}
|
|
} else if (headAStatus == 0 || headDStatus == 0) {
|
|
if (headAStatus == 0 && headBStatus == 0) {
|
|
targetDepth = 3;
|
|
} else {
|
|
if (headAStatus > 0 && headDStatus == 0) {
|
|
targetDepth = 2;
|
|
} else if (headAStatus == 0 && headDStatus > 0) {
|
|
targetDepth = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_staticData.location.depth != targetDepth) {
|
|
Location newLocation = _staticData.location;
|
|
newLocation.depth = targetDepth;
|
|
sceneView->getSceneStaticData(newLocation, _staticData);
|
|
_frameCycleCount = _staticData.cycleStartFrame;
|
|
|
|
// Reload the frame files, if applicable
|
|
sceneView->changeStillFrameMovie(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, SF_STILLS));
|
|
|
|
if (_staticData.cycleStartFrame >= 0)
|
|
sceneView->changeCycleFrameMovie(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, SF_CYCLES));
|
|
}
|
|
}
|
|
|
|
int ArrowGodDepthChange::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
|
|
if (((priorLocation.depth >= 8 && priorLocation.depth <= 11) && _staticData.location.depth < 8) ||
|
|
((priorLocation.depth >= 4 && priorLocation.depth <= 7) && _staticData.location.depth < 4)) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
|
|
byte headBStatus = _globalFlags.myAGHeadBStatus;
|
|
byte headCStatus = _globalFlags.myAGHeadCStatus;
|
|
byte &headDStatus = _globalFlags.myAGHeadDStatus;
|
|
byte doorLevelVolume = 0;
|
|
|
|
switch (_staticData.location.node) {
|
|
case 0:
|
|
case 1:
|
|
doorLevelVolume = 127;
|
|
break;
|
|
case 2:
|
|
doorLevelVolume = 96;
|
|
|
|
if (headDStatus == 2) {
|
|
headDStatus--;
|
|
_vm->_sound->playSynchronousSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 13), 128);
|
|
_scheduledDepthChange = true;
|
|
adjustSpearVolume(viewWindow);
|
|
sceneView->jumpToScene(_staticData.location);
|
|
return SC_TRUE; // Original does not return here, but the status of this would be bad in that case
|
|
}
|
|
break;
|
|
case 3:
|
|
if (headCStatus == 0)
|
|
doorLevelVolume = 127;
|
|
else if (headBStatus == 0)
|
|
doorLevelVolume = 64;
|
|
break;
|
|
}
|
|
|
|
if (doorLevelVolume > 0)
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 11), doorLevelVolume);
|
|
}
|
|
|
|
adjustSpearVolume(viewWindow);
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int ArrowGodDepthChange::postExitRoom(Window *viewWindow, const Location &newLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
Location &loc = _staticData.location;
|
|
|
|
if (loc.timeZone == newLocation.timeZone &&
|
|
loc.environment == newLocation.environment &&
|
|
loc.node == newLocation.node &&
|
|
loc.facing == newLocation.facing &&
|
|
loc.orientation == newLocation.orientation &&
|
|
loc.depth == newLocation.depth &&
|
|
!_scheduledDepthChange) {
|
|
// Notify the player of his gruesome death
|
|
sceneView->showDeathScene(13);
|
|
return SC_DEATH;
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
uint32 *ArrowGodDepthChange::headOpenedTime(byte headId) {
|
|
switch (headId) {
|
|
case 0:
|
|
return &_globalFlags.myAGHeadAOpenedTime;
|
|
case 1:
|
|
return &_globalFlags.myAGHeadBOpenedTime;
|
|
case 2:
|
|
return &_globalFlags.myAGHeadCOpenedTime;
|
|
case 3:
|
|
return &_globalFlags.myAGHeadDOpenedTime;
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
uint32 ArrowGodDepthChange::getHeadOpenedTime(byte headId) {
|
|
uint32 *openedTime = headOpenedTime(headId);
|
|
return openedTime ? *openedTime : 0;
|
|
}
|
|
|
|
void ArrowGodDepthChange::setHeadOpenedTime(byte headId, uint32 value) {
|
|
uint32 *openedTime = headOpenedTime(headId);
|
|
if (openedTime)
|
|
*openedTime = value;
|
|
}
|
|
|
|
byte *ArrowGodDepthChange::headStatus(byte headId) {
|
|
switch (headId) {
|
|
case 0:
|
|
return &_globalFlags.myAGHeadAStatus;
|
|
case 1:
|
|
return &_globalFlags.myAGHeadBStatus;
|
|
case 2:
|
|
return &_globalFlags.myAGHeadCStatus;
|
|
case 3:
|
|
return &_globalFlags.myAGHeadDStatus;
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
byte ArrowGodDepthChange::getHeadStatus(byte headId) {
|
|
byte *status = headStatus(headId);
|
|
return status ? *status : 0;
|
|
}
|
|
|
|
void ArrowGodDepthChange::setHeadStatus(byte headId, byte value) {
|
|
byte *status = headStatus(headId);
|
|
if (status)
|
|
*status = value;
|
|
}
|
|
|
|
int ArrowGodDepthChange::timerCallback(Window *viewWindow) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
BioChipRightWindow *bioChipRightWindow = ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow;
|
|
Location &loc = _staticData.location;
|
|
|
|
SceneBase::timerCallback(viewWindow);
|
|
|
|
// Check to see if we moved into a death scene
|
|
if (loc.timeZone == 2 && loc.environment == 5 &&
|
|
loc.node == 1 && loc.facing == 3 &&
|
|
loc.orientation == 1 && (
|
|
loc.depth == 1 || loc.depth == 3 || loc.depth == 11 ||
|
|
loc.depth == 7 || loc.depth == 5 || loc.depth == 9)) {
|
|
if (loc.depth == 1)
|
|
sceneView->playSynchronousAnimation(19);
|
|
|
|
sceneView->showDeathScene(13);
|
|
return SC_DEATH;
|
|
}
|
|
|
|
if (loc.timeZone == 2 && loc.environment == 5 &&
|
|
loc.node == 3 && loc.facing == 3 &&
|
|
loc.orientation == 1 && (
|
|
loc.depth == 2 || loc.depth == 3 || loc.depth == 11 ||
|
|
loc.depth == 10 || loc.depth == 6 || loc.depth == 7)) {
|
|
sceneView->playSynchronousAnimation(17);
|
|
sceneView->showDeathScene(13);
|
|
return SC_DEATH;
|
|
}
|
|
|
|
// Loop through the four heads
|
|
for (int i = 0; i < 4; i++) {
|
|
uint32 lastStartedTimer = getHeadOpenedTime(i);
|
|
|
|
// Check if there is a timer going for this head
|
|
if (lastStartedTimer > 0 && (g_system->getMillis() > (lastStartedTimer + WAR_GOD_HEAD_TIMER_VALUE) ||
|
|
i == 0 || (_globalFlags.generalWalkthroughMode == 1 && i == 1) ||
|
|
(getHeadStatus(i) == 2 && i == 3))) {
|
|
setHeadOpenedTime(i, 0);
|
|
TempCursorChange cursorChange(kCursorWait);
|
|
byte status = getHeadStatus(i);
|
|
|
|
if (status & 1) {
|
|
status--;
|
|
setHeadStatus(i, status);
|
|
_vm->_sound->playSynchronousSoundEffect(_vm->getFilePath(loc.timeZone, loc.environment, (status == 2) ? 14 : 13), 128);
|
|
_scheduledDepthChange = true;
|
|
adjustSpearVolume(viewWindow);
|
|
}
|
|
|
|
bioChipRightWindow->sceneChanged();
|
|
}
|
|
}
|
|
|
|
if (_scheduledDepthChange) {
|
|
_scheduledDepthChange = false;
|
|
sceneView->jumpToScene(loc);
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
bool ArrowGodDepthChange::adjustSpearVolume(Window *viewWindow) {
|
|
// TODO: Looks like there's a bug in the original. node == 3 should also be in here, I think
|
|
// Need to investigate
|
|
if (_staticData.location.node >= 0 && _staticData.location.node <= 2) {
|
|
byte headAStatus = _globalFlags.myAGHeadAStatus;
|
|
byte headDStatus = _globalFlags.myAGHeadDStatus;
|
|
|
|
if (headAStatus == 0) {
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
} else if (headDStatus == 0) {
|
|
if (_staticData.location.node == 2)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
else
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(64, false, 0, 0);
|
|
} else {
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
class DeathGodAltar : public SceneBase {
|
|
public:
|
|
DeathGodAltar(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
|
|
int postEnterRoom(Window *viewWindow, const Location &priorLocation) override;
|
|
int mouseUp(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
|
|
int droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) override;
|
|
int specifyCursor(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int locateAttempted(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
|
|
private:
|
|
Common::Rect _heartPool;
|
|
Common::Rect _puzzleBox;
|
|
Common::Rect _blood;
|
|
};
|
|
|
|
DeathGodAltar::DeathGodAltar(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
_heartPool = Common::Rect(89, 80, 159, 112);
|
|
_puzzleBox = Common::Rect(150, 45, 260, 111);
|
|
_blood = Common::Rect(88, 76, 162, 114);
|
|
}
|
|
|
|
int DeathGodAltar::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
Location &loc = _staticData.location;
|
|
|
|
if (globalFlags.myDGOfferedHeart == 1) {
|
|
if (!sceneView->isNumberInGlobalFlagTable(MAYAN_EVIDENCE_ENVIRON_CART)) {
|
|
sceneView->playSynchronousAnimation(3);
|
|
_staticData.navFrameIndex = 51;
|
|
viewWindow->invalidateWindow(false);
|
|
|
|
if ((loc.timeZone != priorLocation.timeZone || loc.environment != priorLocation.environment ||
|
|
loc.node != priorLocation.node || loc.facing != priorLocation.facing ||
|
|
loc.orientation != priorLocation.orientation || loc.depth != priorLocation.depth) &&
|
|
!sceneView->isNumberInGlobalFlagTable(MAYAN_EVIDENCE_ENVIRON_CART))
|
|
sceneView->displayLiveText(_vm->getString(IDS_MBT_EVIDENCE_PRESENT));
|
|
}
|
|
} else if ((loc.timeZone != priorLocation.timeZone || loc.environment != priorLocation.environment ||
|
|
loc.node != priorLocation.node || loc.facing != priorLocation.facing ||
|
|
loc.orientation != priorLocation.orientation || loc.depth != priorLocation.depth) &&
|
|
!sceneView->isNumberInGlobalFlagTable(MAYAN_EVIDENCE_PHONY_BLOOD)) {
|
|
sceneView->displayLiveText(_vm->getString(IDS_MBT_EVIDENCE_PRESENT));
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int DeathGodAltar::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (_puzzleBox.contains(pointLocation) && globalFlags.myDGOfferedHeart == 1 && globalFlags.takenEnvironCart == 0) {
|
|
Location puzzleLocation = _staticData.location;
|
|
puzzleLocation.depth = 1;
|
|
sceneView->jumpToScene(puzzleLocation);
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
int DeathGodAltar::draggingItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (itemID == kItemPreservedHeart && globalFlags.myDGOfferedHeart == 0 && _heartPool.contains(pointLocation))
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int DeathGodAltar::droppedItem(Window *viewWindow, int itemID, const Common::Point &pointLocation, int itemFlags) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (pointLocation.x == -1 && pointLocation.y == -1)
|
|
return SIC_REJECT;
|
|
|
|
if (itemID == kItemPreservedHeart && globalFlags.myDGOfferedHeart == 0 && _heartPool.contains(pointLocation)) {
|
|
globalFlags.myDGOfferedHeart = 1;
|
|
sceneView->playSynchronousAnimation(2);
|
|
sceneView->playSynchronousAnimation(3);
|
|
_staticData.navFrameIndex = 51;
|
|
|
|
if (!sceneView->isNumberInGlobalFlagTable(MAYAN_EVIDENCE_ENVIRON_CART))
|
|
sceneView->displayLiveText(_vm->getString(IDS_MBT_EVIDENCE_PRESENT));
|
|
|
|
return SIC_ACCEPT;
|
|
}
|
|
|
|
return SIC_REJECT;
|
|
}
|
|
|
|
int DeathGodAltar::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (globalFlags.bcLocateEnabled == 1) {
|
|
if (globalFlags.myDGOfferedHeart == 1 &&
|
|
globalFlags.takenEnvironCart == 0 &&
|
|
_staticData.navFrameIndex == 51 && _puzzleBox.contains(pointLocation))
|
|
return -2;
|
|
|
|
if (_blood.contains(pointLocation))
|
|
return -2;
|
|
|
|
return -1;
|
|
} else if (_puzzleBox.contains(pointLocation) && globalFlags.myDGOfferedHeart == 1 && globalFlags.takenEnvironCart == 0) {
|
|
// This logic is broken in 1.04, 1.05, and 1.10. I fixed it here to match mouseUp
|
|
return kCursorFinger;
|
|
}
|
|
|
|
return kCursorArrow;
|
|
}
|
|
|
|
int DeathGodAltar::locateAttempted(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
BioChipRightWindow *bioChipRightWindow = ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow;
|
|
|
|
if (globalFlags.bcLocateEnabled == 1 &&
|
|
globalFlags.takenEnvironCart == 0 &&
|
|
_puzzleBox.contains(pointLocation) && _staticData.navFrameIndex == 51 &&
|
|
!sceneView->isNumberInGlobalFlagTable(MAYAN_EVIDENCE_ENVIRON_CART)) {
|
|
sceneView->displayLiveText(_vm->getString(IDS_MBT_EVIDENCE_MUST_BE_REVEALED)); // All will be reveaaaaaaaaled (Yes, I used this joke twice now)
|
|
return SC_TRUE;
|
|
}
|
|
|
|
if (globalFlags.bcLocateEnabled == 1) {
|
|
if (_blood.contains(pointLocation)) {
|
|
sceneView->playSynchronousAnimation(6);
|
|
|
|
// Attempt to add it to the biochip
|
|
if (sceneView->addNumberToGlobalFlagTable(MAYAN_EVIDENCE_PHONY_BLOOD))
|
|
sceneView->displayLiveText(_vm->getString(IDS_MBT_EVIDENCE_ACQUIRED));
|
|
else
|
|
sceneView->displayLiveText(_vm->getString(IDS_MBT_EVIDENCE_ALREADY_ACQUIRED));
|
|
|
|
// Disable capture
|
|
bioChipRightWindow->disableEvidenceCapture();
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
class DeathGodPuzzleBox : public SceneBase {
|
|
public:
|
|
DeathGodPuzzleBox(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
|
|
~DeathGodPuzzleBox();
|
|
void preDestructor() override;
|
|
int paint(Window *viewWindow, Graphics::Surface *preBuffer) override;
|
|
int gdiPaint(Window *viewWindow) override;
|
|
int mouseUp(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int mouseMove(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int specifyCursor(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
|
|
private:
|
|
int _puzzleIndexes[4];
|
|
Common::Rect _clickableRegions[4];
|
|
Common::Rect _puzzleRightHandle;
|
|
AVIFrames _puzzleFrames[4];
|
|
bool _translateText;
|
|
|
|
bool isPuzzleSolved() const;
|
|
};
|
|
|
|
DeathGodPuzzleBox::DeathGodPuzzleBox(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
Location &loc = _staticData.location;
|
|
_translateText = false;
|
|
_puzzleIndexes[0] = _puzzleIndexes[1] = _puzzleIndexes[2] = _puzzleIndexes[3] = 0;
|
|
_clickableRegions[0] = Common::Rect(30, 0, 111, 189);
|
|
_clickableRegions[1] = Common::Rect(112, 0, 187, 189);
|
|
_clickableRegions[2] = Common::Rect(188, 0, 252, 189);
|
|
_clickableRegions[3] = Common::Rect(253, 0, 330, 189);
|
|
_puzzleRightHandle = Common::Rect(380, 0, 432, 189);
|
|
|
|
// Load the spinner movies
|
|
_puzzleFrames[0].open(_vm->getFilePath(loc.timeZone, loc.environment, 4));
|
|
_puzzleFrames[1].open(_vm->getFilePath(loc.timeZone, loc.environment, 5));
|
|
_puzzleFrames[2].open(_vm->getFilePath(loc.timeZone, loc.environment, 6));
|
|
_puzzleFrames[3].open(_vm->getFilePath(loc.timeZone, loc.environment, 7));
|
|
}
|
|
|
|
DeathGodPuzzleBox::~DeathGodPuzzleBox() {
|
|
preDestructor();
|
|
}
|
|
|
|
void DeathGodPuzzleBox::preDestructor() {
|
|
_puzzleFrames[0].close();
|
|
_puzzleFrames[1].close();
|
|
_puzzleFrames[2].close();
|
|
_puzzleFrames[3].close();
|
|
}
|
|
|
|
int DeathGodPuzzleBox::paint(Window *viewWindow, Graphics::Surface *preBuffer) {
|
|
SceneBase::paint(viewWindow, preBuffer);
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
const Graphics::Surface *spinnerFrame = _puzzleFrames[i].getFrame(_puzzleIndexes[i]);
|
|
_vm->_gfx->crossBlit(preBuffer, _clickableRegions[i].left, _clickableRegions[i].top, _clickableRegions[i].width(), _clickableRegions[i].height(), spinnerFrame, 0, 0);
|
|
}
|
|
|
|
return SC_REPAINT;
|
|
}
|
|
|
|
int DeathGodPuzzleBox::gdiPaint(Window *viewWindow) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (_translateText && globalFlags.bcTranslateEnabled == 1) {
|
|
Common::Rect absoluteRect = viewWindow->getAbsoluteRect();
|
|
Common::Rect rect(42, 64, 324, 125);
|
|
rect.translate(absoluteRect.left, absoluteRect.top);
|
|
_vm->_gfx->getScreen()->frameRect(rect, _vm->_gfx->getColor(255, 0, 0));
|
|
}
|
|
|
|
return SC_REPAINT;
|
|
}
|
|
|
|
int DeathGodPuzzleBox::mouseUp(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
BioChipRightWindow *bioChipRightWindow = ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow;
|
|
InventoryWindow *inventoryWindow = ((GameUIWindow *)viewWindow->getParent())->_inventoryWindow;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (_clickableRegions[i].contains(pointLocation)) {
|
|
if (pointLocation.y - _clickableRegions[i].top > _clickableRegions[i].height() / 2) {
|
|
// Start the roll sound
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 14), 128, false, true);
|
|
|
|
// Spin the wheel, stop at the new value
|
|
// FIXME: Timing
|
|
for (int j = 0; j < 6; j++) {
|
|
_puzzleIndexes[i]--;
|
|
if (_puzzleIndexes[i] < 0)
|
|
_puzzleIndexes[i] = _puzzleFrames[i].getFrameCount() - 2;
|
|
viewWindow->invalidateWindow();
|
|
_vm->_gfx->updateScreen();
|
|
}
|
|
|
|
_translateText = false;
|
|
mouseMove(viewWindow, pointLocation);
|
|
} else {
|
|
// Start the roll sound
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, 14), 128, false, true);
|
|
|
|
// Spin the wheel, stop at the new value
|
|
// FIXME: Timing
|
|
for (int j = 0; j < 6; j++) {
|
|
_puzzleIndexes[i]++;
|
|
if (_puzzleIndexes[i] > _puzzleFrames[i].getFrameCount() - 2)
|
|
_puzzleIndexes[i] = 0;
|
|
viewWindow->invalidateWindow();
|
|
_vm->_gfx->updateScreen();
|
|
}
|
|
|
|
_translateText = false;
|
|
mouseMove(viewWindow, pointLocation);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_puzzleRightHandle.contains(pointLocation)) {
|
|
if (isPuzzleSolved()) {
|
|
DestinationScene newDestination;
|
|
newDestination.destinationScene = _staticData.location;
|
|
newDestination.destinationScene.depth = 2;
|
|
newDestination.transitionType = TRANSITION_VIDEO;
|
|
newDestination.transitionStartFrame = -1;
|
|
newDestination.transitionLength = -1;
|
|
|
|
if (globalFlags.takenEnvironCart == 0)
|
|
newDestination.transitionData = 4;
|
|
else
|
|
newDestination.transitionData = 5;
|
|
|
|
BuriedEngine *vm = _vm;
|
|
sceneView->moveToDestination(newDestination);
|
|
|
|
// Play animation capturing the evidence
|
|
// FIXME: Is this right? Shouldn't this be if takenEnvironCart == 0 only?
|
|
sceneView->playSynchronousAnimation(7);
|
|
|
|
// Attempt to add it to the biochip
|
|
if (sceneView->addNumberToGlobalFlagTable(MAYAN_EVIDENCE_ENVIRON_CART))
|
|
sceneView->displayLiveText(vm->getString(IDS_MBT_EVIDENCE_RIPPLE_DOCUMENTED));
|
|
else
|
|
sceneView->displayLiveText(vm->getString(IDS_MBT_EVIDENCE_ALREADY_ACQUIRED));
|
|
|
|
// Disable capture
|
|
bioChipRightWindow->disableEvidenceCapture();
|
|
|
|
// Set the scoring flag
|
|
globalFlags.scoreCompletedDeathGod = 1;
|
|
globalFlags.myDGOpenedPuzzleBox = 1;
|
|
|
|
// Play an Arthur comment
|
|
if (globalFlags.takenEnvironCart == 0 && inventoryWindow->isItemInInventory(kItemBioChipAI))
|
|
vm->_sound->playSoundEffect("BITDATA/MAYAN/MYDG_C01.BTA"); // Broken in 1.01
|
|
|
|
return SC_TRUE;
|
|
} else {
|
|
// We did the puzzle incorrectly, so spin the wheels and kill the player
|
|
sceneView->playPlacedSynchronousAnimation(8, 320, 0);
|
|
sceneView->showDeathScene(12);
|
|
return SC_DEATH;
|
|
}
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
int DeathGodPuzzleBox::mouseMove(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (globalFlags.bcTranslateEnabled == 1) {
|
|
Common::Rect translateTextRegion(42, 64, 324, 126);
|
|
|
|
if (translateTextRegion.contains(pointLocation)) {
|
|
if (!_translateText) {
|
|
Common::String translatedText = _vm->getString(IDMYDG_PUZZLE_BOX_TRANS_TEXT_BASE + _puzzleIndexes[0] / 6);
|
|
translatedText += ' ';
|
|
translatedText += _vm->getString(IDMYDG_PUZZLE_BOX_TRANS_TEXT_BASE + 10 + _puzzleIndexes[1] / 6);
|
|
translatedText += ' ';
|
|
translatedText += _vm->getString(IDMYDG_PUZZLE_BOX_TRANS_TEXT_BASE + 20 + _puzzleIndexes[2] / 6);
|
|
translatedText += ' ';
|
|
translatedText += _vm->getString(IDMYDG_PUZZLE_BOX_TRANS_TEXT_BASE + 30 + _puzzleIndexes[3] / 6);
|
|
|
|
sceneView->displayTranslationText(translatedText);
|
|
|
|
_translateText = true;
|
|
viewWindow->invalidateWindow(false);
|
|
}
|
|
} else {
|
|
if (_translateText) {
|
|
_translateText = false;
|
|
viewWindow->invalidateWindow(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
int DeathGodPuzzleBox::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
|
|
for (int i = 0; i < 4; i++) {
|
|
if (_clickableRegions[i].contains(pointLocation)) {
|
|
if (pointLocation.y - _clickableRegions[i].top > _clickableRegions[i].height() / 2)
|
|
return kCursorArrowDown;
|
|
|
|
return kCursorArrowUp;
|
|
}
|
|
}
|
|
|
|
if (_puzzleRightHandle.contains(pointLocation))
|
|
return kCursorFinger;
|
|
|
|
return kCursorArrow;
|
|
}
|
|
|
|
bool DeathGodPuzzleBox::isPuzzleSolved() const {
|
|
switch (_vm->getLanguage()) {
|
|
case Common::DE_DEU:
|
|
case Common::ES_ESP:
|
|
case Common::IT_ITA:
|
|
return _puzzleIndexes[0] == 12 && _puzzleIndexes[1] == 18 && _puzzleIndexes[2] == 30 && _puzzleIndexes[3] == 24;
|
|
case Common::EN_ANY:
|
|
return _puzzleIndexes[0] == 18 && _puzzleIndexes[1] == 36 && _puzzleIndexes[2] == 12 && _puzzleIndexes[3] == 24;
|
|
case Common::FR_FRA:
|
|
return _puzzleIndexes[0] == 12 && _puzzleIndexes[1] == 18 && _puzzleIndexes[2] == 42 && _puzzleIndexes[3] == 24;
|
|
case Common::JA_JPN:
|
|
return _puzzleIndexes[0] == 12 && _puzzleIndexes[1] == 24 && _puzzleIndexes[2] == 30 && _puzzleIndexes[3] == 18;
|
|
default:
|
|
// Default to English, but warn about it
|
|
warning("Unknown language for puzzle box");
|
|
return _puzzleIndexes[0] == 18 && _puzzleIndexes[1] == 36 && _puzzleIndexes[2] == 12 && _puzzleIndexes[3] == 24;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
class MainCavernGlassCapture : public SceneBase {
|
|
public:
|
|
MainCavernGlassCapture(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
|
|
int locateAttempted(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
int specifyCursor(Window *viewWindow, const Common::Point &pointLocation) override;
|
|
|
|
private:
|
|
Common::Rect _glass;
|
|
};
|
|
|
|
MainCavernGlassCapture::MainCavernGlassCapture(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
_glass = Common::Rect(305, 126, 355, 156);
|
|
}
|
|
|
|
int MainCavernGlassCapture::locateAttempted(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
BioChipRightWindow *bioChipRightWindow = ((GameUIWindow *)viewWindow->getParent())->_bioChipRightWindow;
|
|
|
|
if (globalFlags.bcLocateEnabled == 1) {
|
|
if (_glass.contains(pointLocation)) {
|
|
// Play the animation
|
|
sceneView->playSynchronousAnimation(22);
|
|
|
|
// Attempt to add it to the biochip
|
|
if (sceneView->addNumberToGlobalFlagTable(MAYAN_EVIDENCE_BROKEN_GLASS_PYRAMID))
|
|
sceneView->displayLiveText(_vm->getString(IDS_MBT_EVIDENCE_ACQUIRED));
|
|
else
|
|
sceneView->displayLiveText(_vm->getString(IDS_MBT_EVIDENCE_ALREADY_ACQUIRED));
|
|
|
|
// Disable capture
|
|
bioChipRightWindow->disableEvidenceCapture();
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
return SC_FALSE;
|
|
}
|
|
|
|
int MainCavernGlassCapture::specifyCursor(Window *viewWindow, const Common::Point &pointLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
|
|
if (globalFlags.bcLocateEnabled == 1) {
|
|
if (_glass.contains(pointLocation))
|
|
return -2;
|
|
|
|
return -1;
|
|
}
|
|
|
|
return kCursorArrow;
|
|
}
|
|
|
|
class WalkVolumeChange : public SceneBase {
|
|
public:
|
|
WalkVolumeChange(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
byte newVolume = 0, uint32 volumeChangeTime = 0, int stepCount = -1, int entryEffectFileNameID = -1);
|
|
int postEnterRoom(Window *viewWindow, const Location &priorLocation) override;
|
|
int preExitRoom(Window *viewWindow, const Location &newLocation) override;
|
|
|
|
private:
|
|
byte _newVolume;
|
|
uint32 _volumeChangeTime;
|
|
int _stepCount;
|
|
int _entryEffectFileNameID;
|
|
};
|
|
|
|
WalkVolumeChange::WalkVolumeChange(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
byte newVolume, uint32 volumeChangeTime, int stepCount, int entryEffectFileNameID) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
_newVolume = newVolume;
|
|
_volumeChangeTime = volumeChangeTime;
|
|
_stepCount = stepCount;
|
|
_entryEffectFileNameID = entryEffectFileNameID;
|
|
}
|
|
|
|
int WalkVolumeChange::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
|
|
if (_entryEffectFileNameID >= 0 && priorLocation.node != _staticData.location.node)
|
|
_vm->_sound->playSoundEffect(_vm->getFilePath(_staticData.location.timeZone, _staticData.location.environment, _entryEffectFileNameID), 128, false, true);
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int WalkVolumeChange::preExitRoom(Window *viewWindow, const Location &newLocation) {
|
|
if (_stepCount >= 0 && newLocation.node != _staticData.location.node)
|
|
_vm->_sound->adjustAmbientSoundVolume(_newVolume, true, _stepCount, _volumeChangeTime);
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
class AdjustSecondaryAmbientOnEntry : public SceneBase {
|
|
public:
|
|
AdjustSecondaryAmbientOnEntry(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation);
|
|
int postEnterRoom(Window *viewWindow, const Location &priorLocation) override;
|
|
int preExitRoom(Window *viewWindow, const Location &newLocation) override;
|
|
};
|
|
|
|
AdjustSecondaryAmbientOnEntry::AdjustSecondaryAmbientOnEntry(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
}
|
|
|
|
int AdjustSecondaryAmbientOnEntry::postEnterRoom(Window *viewWindow, const Location &priorLocation) {
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(128, false, 0, 0);
|
|
return SC_TRUE;
|
|
}
|
|
|
|
int AdjustSecondaryAmbientOnEntry::preExitRoom(Window *viewWindow, const Location &newLocation) {
|
|
// Kill the ambient if moving to a different node
|
|
if (newLocation.node != _staticData.location.node)
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(0, false, 0, 0);
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
class WalkDualAmbientVolumeChange : public SceneBase {
|
|
public:
|
|
WalkDualAmbientVolumeChange(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
byte newVolume = 0, byte secondVolume = 0, uint32 volumeChangeTime = 0, int stepCount = -1);
|
|
int preExitRoom(Window *viewWindow, const Location &newLocation) override;
|
|
|
|
private:
|
|
byte _newVolume;
|
|
uint32 _volumeChangeTime;
|
|
int _stepCount;
|
|
byte _secondVolume;
|
|
};
|
|
|
|
WalkDualAmbientVolumeChange::WalkDualAmbientVolumeChange(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
byte newVolume, byte secondVolume, uint32 volumeChangeTime, int stepCount) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
Location &loc = _staticData.location;
|
|
|
|
_newVolume = newVolume;
|
|
_volumeChangeTime = volumeChangeTime;
|
|
_stepCount = stepCount;
|
|
_secondVolume = secondVolume;
|
|
|
|
// If we have stepped on the far ledge, set the flag
|
|
if (loc.timeZone == 2 && loc.environment == 4 &&
|
|
loc.node == 5 && loc.facing == 0 &&
|
|
loc.orientation == 1 && loc.depth == 0)
|
|
globalFlags.myWTSteppedOnFarLedge = 1;
|
|
}
|
|
|
|
int WalkDualAmbientVolumeChange::preExitRoom(Window *viewWindow, const Location &newLocation) {
|
|
if (_stepCount >= 0 && newLocation.node != _staticData.location.node) {
|
|
_vm->_sound->adjustAmbientSoundVolume(_newVolume, true, _stepCount, _volumeChangeTime);
|
|
_vm->_sound->adjustSecondaryAmbientSoundVolume(_secondVolume, true, _stepCount, _volumeChangeTime);
|
|
}
|
|
|
|
return SC_TRUE;
|
|
}
|
|
|
|
class SetVolumeAndFlag : public SceneBase {
|
|
public:
|
|
SetVolumeAndFlag(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
byte newVolume, byte &flag, byte flagValue = 255);
|
|
};
|
|
|
|
SetVolumeAndFlag::SetVolumeAndFlag(BuriedEngine *vm, Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation,
|
|
byte newVolume, byte &flag, byte flagValue) :
|
|
SceneBase(vm, viewWindow, sceneStaticData, priorLocation) {
|
|
_vm->_sound->adjustAmbientSoundVolume(newVolume, false, 0, 0);
|
|
flag = flagValue;
|
|
}
|
|
|
|
bool SceneViewWindow::initializeMayanTimeZoneAndEnvironment(Window *viewWindow, int environment) {
|
|
InventoryWindow *inventoryWindow = ((GameUIWindow *)viewWindow->getParent())->_inventoryWindow;
|
|
|
|
if (environment == -1) {
|
|
_globalFlags.myTPCodeWheelStatus = _globalFlags.generalWalkthroughMode;
|
|
_globalFlags.myTPCodeWheelLeftIndex = _globalFlags.generalWalkthroughMode == 1 ? 8 : 0;
|
|
_globalFlags.myTPCodeWheelRightIndex = _globalFlags.generalWalkthroughMode == 1 ? 12 : 0;
|
|
_globalFlags.myMCDeathGodOfferings = 0;
|
|
_globalFlags.myWGPlacedRope = _globalFlags.generalWalkthroughMode;
|
|
_globalFlags.myWTCurrentBridgeStatus = 0;
|
|
_globalFlags.myAGHeadAStatus = _globalFlags.generalWalkthroughMode == 1 ? 2 : 0;
|
|
_globalFlags.myAGHeadBStatus = 0;
|
|
_globalFlags.myAGHeadCStatus = 0;
|
|
_globalFlags.myAGHeadDStatus = _globalFlags.generalWalkthroughMode == 1 ? 2 : 0;
|
|
_globalFlags.myAGHeadAStatusSkullID = _globalFlags.generalWalkthroughMode == 1 ? kItemCavernSkull : 0;
|
|
_globalFlags.myAGHeadBStatusSkullID = 0;
|
|
_globalFlags.myAGHeadCStatusSkullID = 0;
|
|
_globalFlags.myAGHeadDStatusSkullID = _globalFlags.generalWalkthroughMode == 1 ? kItemSpearSkull : 0;
|
|
_globalFlags.myAGTimerHeadID = 0;
|
|
_globalFlags.myAGTimerStartTime = 0;
|
|
_globalFlags.myDGOfferedHeart = 0;
|
|
_globalFlags.myAGHeadAOpenedTime = 0;
|
|
_globalFlags.myAGHeadBOpenedTime = 0;
|
|
_globalFlags.myAGHeadCOpenedTime = 0;
|
|
_globalFlags.myAGHeadDOpenedTime = 0;
|
|
|
|
_globalFlags.myPickedUpCeramicBowl = inventoryWindow->isItemInInventory(kItemCeramicBowl) ? 1 : 0;
|
|
_globalFlags.myMCPickedUpSkull = inventoryWindow->isItemInInventory(kItemCavernSkull) ? 1 : 0;
|
|
_globalFlags.myWGRetrievedJadeBlock = inventoryWindow->isItemInInventory(kItemJadeBlock) ? 1 : 0;
|
|
_globalFlags.myWTRetrievedLimestoneBlock = inventoryWindow->isItemInInventory(kItemLimestoneBlock) ? 1 : 0;
|
|
_globalFlags.myAGRetrievedEntrySkull = inventoryWindow->isItemInInventory(kItemEntrySkull) ? 1 : 0;
|
|
_globalFlags.myAGRetrievedSpearSkull = inventoryWindow->isItemInInventory(kItemSpearSkull) ? 1 : 0;
|
|
_globalFlags.myAGRetrievedCopperMedal = inventoryWindow->isItemInInventory(kItemCopperMedallion) ? 1 : 0;
|
|
_globalFlags.myAGRetrievedObsidianBlock = inventoryWindow->isItemInInventory(kItemObsidianBlock) ? 1 : 0;
|
|
_globalFlags.takenEnvironCart = inventoryWindow->isItemInInventory(kItemEnvironCart) ? 1 : 0;
|
|
|
|
if (_globalFlags.generalWalkthroughMode == 1) {
|
|
_globalFlags.myMCPickedUpSkull = 1;
|
|
_globalFlags.myAGRetrievedSpearSkull = 1;
|
|
_globalFlags.myAGRetrievedCopperMedal = 1;
|
|
}
|
|
} else if (environment == 2) {
|
|
_globalFlags.scoreEnteredMainCavern = 1;
|
|
_globalFlags.myVisitedMainCavern = 1;
|
|
} else if (environment == 3) {
|
|
_globalFlags.myVisitedWealthGod = 1;
|
|
_globalFlags.myVisitedSpecRooms = 1;
|
|
} else if (environment == 4) {
|
|
_globalFlags.myVisitedWaterGod = 1;
|
|
_globalFlags.myVisitedSpecRooms = 1;
|
|
} else if (environment == 5) {
|
|
_globalFlags.myVisitedArrowGod = 1;
|
|
_globalFlags.myVisitedSpecRooms = 1;
|
|
} else if (environment == 6) {
|
|
_globalFlags.myVisitedDeathGod = 1;
|
|
_globalFlags.myVisitedSpecRooms = 1;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool SceneViewWindow::startMayanAmbient(int oldTimeZone, int oldEnvironment, int environment, bool fade) {
|
|
bool checkFade = true;
|
|
|
|
if (environment == 3) {
|
|
if (oldEnvironment == 2)
|
|
return _vm->_sound->setAmbientSound(_vm->getFilePath(2, environment, SF_AMBIENT), checkFade, 64);
|
|
|
|
return _vm->_sound->setAmbientSound(_vm->getFilePath(2, environment, SF_AMBIENT), checkFade, 16);
|
|
} else if (environment == 4) {
|
|
if (oldTimeZone == -2)
|
|
_vm->_sound->setAmbientSound(_vm->getFilePath(2, environment, SF_AMBIENT), fade, 64);
|
|
else
|
|
_vm->_sound->setAmbientSound(_vm->getFilePath(2, environment, SF_AMBIENT), fade, 16);
|
|
|
|
return _vm->_sound->setSecondaryAmbientSound(_vm->getFilePath(2, environment, 13), checkFade, 0);
|
|
} else if (environment == 5) {
|
|
_vm->_sound->setAmbientSound(_vm->getFilePath(2, environment, SF_AMBIENT), fade, 64);
|
|
return _vm->_sound->setSecondaryAmbientSound(_vm->getFilePath(2, environment, 12), checkFade, 128);
|
|
}
|
|
|
|
_vm->_sound->setAmbientSound(_vm->getFilePath(2, environment, SF_AMBIENT), fade, 64);
|
|
return true;
|
|
}
|
|
|
|
bool SceneViewWindow::checkCustomMayanAICommentDependencies(const Location &commentLocation, const AIComment &commentData) {
|
|
InventoryWindow *inventoryWindow = ((GameUIWindow *)getParent())->_inventoryWindow;
|
|
|
|
switch (commentData.dependencyFlagOffsetB) {
|
|
case 1: // Player hasn't translated any inscriptions
|
|
return _globalFlags.myTPTextTranslated == 0;
|
|
case 2: // Player hasn't translated any inscriptions, has translate biochip
|
|
return _globalFlags.myTPTextTranslated == 0 && inventoryWindow->isItemInInventory(kItemBioChipTranslate);
|
|
case 3: // Player hasn't translated any inscriptions, doesn't have translate biochip
|
|
return _globalFlags.myTPTextTranslated == 0 && !inventoryWindow->isItemInInventory(kItemBioChipTranslate);
|
|
case 4: // Has translated inscription above calendar, calendar not set to sacred day, player has never been to main cavern
|
|
return _globalFlags.myTPCalendarTopTranslated == 1 && _globalFlags.myTPCodeWheelStatus == 0 && _globalFlags.myVisitedMainCavern == 0;
|
|
case 5: // Has translated inscription above calendar, calendar is set to sacred day, player has never been to main cavern
|
|
return _globalFlags.myTPCalendarTopTranslated == 1 && _globalFlags.myTPCodeWheelStatus == 1 && _globalFlags.myVisitedMainCavern == 0;
|
|
case 6: // Player has never been to main cavern
|
|
return _globalFlags.myVisitedMainCavern == 0;
|
|
case 7: // Player has never been to main cavern, calendar not set to sacred day
|
|
return _globalFlags.myVisitedMainCavern == 0 && _globalFlags.myTPCodeWheelStatus == 0;
|
|
case 8: // Ceramic bowl not in the inventory
|
|
return !inventoryWindow->isItemInInventory(kItemCeramicBowl);
|
|
case 9: // If node is not 5, 6, or 8
|
|
return commentLocation.node != 6 && commentLocation.node != 5 && commentLocation.node != 8;
|
|
case 10: // If node is not 1, 0, 7, or 8
|
|
return commentLocation.node != 1 && commentLocation.node != 0 && commentLocation.node != 7 && commentLocation.node != 8;
|
|
case 11: // If node is not 0, 8, or 1
|
|
return commentLocation.node != 0 && commentLocation.node != 8 && commentLocation.node != 1;
|
|
case 12: // If not translated any sacred days
|
|
return _globalFlags.myTPCalendarListTranslated == 0;
|
|
case 13: // Not any door, no translations
|
|
return _globalFlags.myVisitedSpecRooms == 0 && _globalFlags.myMCTransDoor == 0;
|
|
case 14: // Not any door, no translations, has translate chip
|
|
return _globalFlags.myVisitedSpecRooms == 0 && _globalFlags.myMCTransDoor == 0 && inventoryWindow->isItemInInventory(kItemBioChipTranslate);
|
|
case 15: // Not any door, has translated arrow or translated water or translated wealth
|
|
return _globalFlags.myVisitedSpecRooms == 0 && (_globalFlags.myMCTransAGOffering == 1 || _globalFlags.myMCTransWGOffering == 1 || _globalFlags.myMCTransWTOffering == 1);
|
|
case 16: // Has translated wealth, has not been through wealth god door
|
|
return _globalFlags.myMCTransWGOffering == 1 && _globalFlags.myVisitedWealthGod == 0;
|
|
case 17: // Has translated water, has not been through water god door
|
|
return _globalFlags.myMCTransWTOffering == 1 && _globalFlags.myVisitedWaterGod == 0;
|
|
case 18: // Has translated arrow, has not been through arrow god door
|
|
return _globalFlags.myMCTransAGOffering == 1 && _globalFlags.myVisitedArrowGod == 0;
|
|
case 19: // Has translated death, has not been through death god door
|
|
return _globalFlags.myMCTransDGOffering == 1 && _globalFlags.myVisitedDeathGod == 0;
|
|
case 20: // Has not been through death god door
|
|
return _globalFlags.myVisitedDeathGod == 0;
|
|
case 21: // Has translated death
|
|
return _globalFlags.myMCTransDGOffering == 1;
|
|
case 22: // After making any offering
|
|
return _globalFlags.myMCTransMadeAnOffering == 1;
|
|
case 23: // Before crossing rope bridge
|
|
return _globalFlags.myWGCrossedRopeBridge == 0;
|
|
case 24: // If player has translated inscription above wealth god door in cavern
|
|
return _globalFlags.myMCTransWGOffering == 1;
|
|
case 25: // If player has not translated inscription above wealth god door in cavern
|
|
return _globalFlags.myMCTransWGOffering == 0;
|
|
case 26: // If player has translated inscription above wealth god door in cavern, has never been to wealth god altar room
|
|
return _globalFlags.myMCTransWGOffering == 1 && _globalFlags.myWGSeenLowerPassage == 0;
|
|
case 27: // Has not attached either rope or grappling hook, has never been to wealth god altar room
|
|
return _globalFlags.myWGPlacedRope == 0 && _globalFlags.myWGSeenLowerPassage == 0;
|
|
case 28: // Player has never stepped on swings
|
|
return _globalFlags.myWTSteppedOnSwings == 0;
|
|
case 29: // Player has never been on far ledge
|
|
return _globalFlags.myWTSteppedOnFarLedge == 0;
|
|
case 30: // Never put in heart
|
|
return _globalFlags.myDGOfferedHeart == 0;
|
|
case 31: // Never put in heart, no heart in inventory
|
|
return _globalFlags.myDGOfferedHeart == 0 && inventoryWindow->isItemInInventory(kItemPreservedHeart);
|
|
case 32: // After put in heart, puzzle box never opened
|
|
return _globalFlags.myDGOfferedHeart == 1 && _globalFlags.myDGOpenedPuzzleBox == 0;
|
|
case 33: // After put in heart, puzzle box never opened, player has not translated 'Itzamna' inscription over inside door of temple
|
|
return _globalFlags.myDGOfferedHeart == 1 && _globalFlags.myDGOpenedPuzzleBox == 0 && _globalFlags.myTPTransBreathOfItzamna == 0;
|
|
case 34: // After put in heart, puzzle box never opened, player has translated 'Itzamna' inscription over inside door of temple
|
|
return _globalFlags.myDGOfferedHeart == 1 && _globalFlags.myDGOpenedPuzzleBox == 0 && _globalFlags.myTPTransBreathOfItzamna == 1;
|
|
case 35: // Before interacting with any heads
|
|
return _globalFlags.myAGHeadATouched == 0 && _globalFlags.myAGHeadBTouched == 0 && _globalFlags.myAGHeadCTouched == 0 && _globalFlags.myAGHeadDTouched == 0;
|
|
case 36: // After interacting with any head, before jamming any head
|
|
return (_globalFlags.myAGHeadATouched == 1 || _globalFlags.myAGHeadBTouched == 1 || _globalFlags.myAGHeadCTouched == 1 || _globalFlags.myAGHeadDTouched == 1) && _globalFlags.myAGHeadAStatus == 0 && _globalFlags.myAGHeadBStatus == 0 && _globalFlags.myAGHeadCStatus == 0 && _globalFlags.myAGHeadDStatus == 0;
|
|
case 37: // S2 jam, S1 not jam, not altar
|
|
return _globalFlags.myAGHeadAStatus == 0 && _globalFlags.myAGHeadBStatus == 2 && _globalFlags.myAGVisitedAltar == 0;
|
|
case 38: // S1 jam, S2 not jam, S3 not jam, not altar
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadBStatus == 0 && _globalFlags.myAGHeadCStatus == 0 && _globalFlags.myAGHeadDStatus == 0 && _globalFlags.myAGVisitedAltar == 0;
|
|
case 39: // S1 jam, S2 not jam, S3 not jam, S4 not jam, not altar, no skulls
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadBStatus == 0 && _globalFlags.myAGHeadCStatus == 0 && _globalFlags.myAGHeadDStatus == 0 && _globalFlags.myAGVisitedAltar == 0 && !inventoryWindow->isItemInInventory(kItemCavernSkull) && !inventoryWindow->isItemInInventory(kItemEntrySkull) && !inventoryWindow->isItemInInventory(kItemSpearSkull);
|
|
case 40: // Before interacting with S3 or S4, not altar
|
|
return _globalFlags.myAGHeadCTouched == 0 && _globalFlags.myAGHeadDTouched == 0 && _globalFlags.myAGVisitedAltar == 0;
|
|
case 41: // S1 jam, S2 jam, S3 not jam, S4 not jam, after interacting with S3 and S4, not altar, no skulls
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadBStatus == 2 && _globalFlags.myAGHeadCStatus == 0 && _globalFlags.myAGHeadDStatus == 0 && _globalFlags.myAGHeadCTouched == 1 && _globalFlags.myAGHeadDTouched == 1 && _globalFlags.myAGVisitedAltar == 0 && !inventoryWindow->isItemInInventory(kItemCavernSkull) && !inventoryWindow->isItemInInventory(kItemEntrySkull) && !inventoryWindow->isItemInInventory(kItemSpearSkull);
|
|
case 42: // S1 jam, S2 not jam, S3 not jam, S4 not jam, after interacting with S3 and S4, not altar, only 1 skull in inventory
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadBStatus == 0 && _globalFlags.myAGHeadCStatus == 0 && _globalFlags.myAGHeadDStatus == 0 && _globalFlags.myAGHeadCTouched == 1 && _globalFlags.myAGHeadDTouched == 1 && _globalFlags.myAGVisitedAltar == 0 && (inventoryWindow->isItemInInventory(kItemCavernSkull) ^ inventoryWindow->isItemInInventory(kItemEntrySkull) ^ inventoryWindow->isItemInInventory(kItemSpearSkull));
|
|
case 43: // S1 jam, S2 jam, S3 not jam, S4 not jam, after interacting with S3 and S4, not altar, no skulls
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadBStatus == 2 && _globalFlags.myAGHeadCStatus == 0 && _globalFlags.myAGHeadDStatus == 0 && _globalFlags.myAGHeadCTouched == 1 && _globalFlags.myAGHeadDTouched == 1 && _globalFlags.myAGVisitedAltar == 0 && !inventoryWindow->isItemInInventory(kItemCavernSkull) && !inventoryWindow->isItemInInventory(kItemEntrySkull) && !inventoryWindow->isItemInInventory(kItemSpearSkull);
|
|
case 44: // S1 jam, S2 not jam, S3 jam, S4 not jam, not altar, no skulls
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadBStatus == 0 && _globalFlags.myAGHeadCStatus == 2 && _globalFlags.myAGHeadDStatus == 0 && _globalFlags.myAGVisitedAltar == 0 && !inventoryWindow->isItemInInventory(kItemCavernSkull) && !inventoryWindow->isItemInInventory(kItemEntrySkull) && !inventoryWindow->isItemInInventory(kItemSpearSkull);
|
|
case 45: // S1 jam, S2 not jam, S3 not jam, S4 jam, not altar, no skulls
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadBStatus == 0 && _globalFlags.myAGHeadCStatus == 0 && _globalFlags.myAGHeadDStatus == 2 && _globalFlags.myAGVisitedAltar == 0 && !inventoryWindow->isItemInInventory(kItemCavernSkull) && !inventoryWindow->isItemInInventory(kItemEntrySkull) && !inventoryWindow->isItemInInventory(kItemSpearSkull);
|
|
case 46: // S1 jam, S2 not jam, S3 not jam, S4 jam, not altar, only 1 skull in inventory
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadBStatus == 0 && _globalFlags.myAGHeadCStatus == 0 && _globalFlags.myAGHeadDStatus == 2 && _globalFlags.myAGVisitedAltar == 0 && (inventoryWindow->isItemInInventory(kItemCavernSkull) ^ inventoryWindow->isItemInInventory(kItemEntrySkull) ^ inventoryWindow->isItemInInventory(kItemSpearSkull));
|
|
case 47: // S1 jam, S3 jam, S4 jam, not altar
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadCStatus == 2 && _globalFlags.myAGHeadDStatus == 2 && _globalFlags.myAGVisitedAltar == 0;
|
|
case 48: // S1 jam, S3 jam, not altar, only 1 skull in inventory
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadCStatus == 2 && _globalFlags.myAGHeadDStatus == 2 && _globalFlags.myAGVisitedAltar == 0 && (inventoryWindow->isItemInInventory(kItemCavernSkull) ^ inventoryWindow->isItemInInventory(kItemEntrySkull) ^ inventoryWindow->isItemInInventory(kItemSpearSkull));
|
|
case 49: // S1 jam, S2 jam, S3 jam, not altar
|
|
return _globalFlags.myAGHeadAStatus == 2 && _globalFlags.myAGHeadCStatus == 2 && _globalFlags.myAGHeadDStatus == 2 && _globalFlags.myAGVisitedAltar == 0;
|
|
case 50: // S1 not jam, S2 jam, not altar
|
|
return _globalFlags.myAGHeadAStatus == 0 && _globalFlags.myAGHeadBStatus == 2 && _globalFlags.myAGVisitedAltar == 0;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
SceneBase *SceneViewWindow::constructMayanSceneObject(Window *viewWindow, const LocationStaticData &sceneStaticData, const Location &priorLocation) {
|
|
SceneViewWindow *sceneView = ((SceneViewWindow *)viewWindow);
|
|
GlobalFlags &globalFlags = sceneView->getGlobalFlags();
|
|
byte dummyFlag = 0; // a dummy flag, used as a placeholder for writing (but not reading)
|
|
|
|
// Special scene for the trial version
|
|
if (_vm->isTrial())
|
|
return new TrialRecallScene(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
|
|
switch (sceneStaticData.classID) {
|
|
case 0:
|
|
// Default scene
|
|
break;
|
|
case 1:
|
|
return new VideoDeath(_vm, viewWindow, sceneStaticData, priorLocation, 10, IDS_HUMAN_PRESENCE_500METERS);
|
|
case 2:
|
|
return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 60, 134, 118, 180, kItemCeramicBowl, 96, globalFlags.myPickedUpCeramicBowl);
|
|
case 3:
|
|
return new PlaceCeramicBowl(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
case 4:
|
|
return new ClickChangeDepth(_vm, viewWindow, sceneStaticData, priorLocation, 1, kCursorMagnifyingGlass, 0, 0, 432, 189);
|
|
case 5:
|
|
return new AdjustWheels(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
case 6:
|
|
return new DateCombinationRead(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
case 7:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYTP_INNER_DOOR_TRANS_TEXT, 16, 6, 402, 110, globalFlags.myTPTextTranslated, globalFlags.myTPTransBreathOfItzamna, dummyFlag);
|
|
case 8:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYTP_INNER_LEFT_TRANS_TEXT, 1, 6, 431, 98, globalFlags.myTPTextTranslated, dummyFlag, dummyFlag);
|
|
case 9:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYTP_INNER_MIDDLE_TRANS_TEXT, 16, 8, 430, 114, globalFlags.myTPTextTranslated, globalFlags.myTPCalendarTopTranslated, dummyFlag);
|
|
case 10:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYTP_OUTER_SOUTHLEFT_TRANS_TEXT, 4, 55, 426, 95, globalFlags.myTPTextTranslated, dummyFlag, dummyFlag);
|
|
case 11:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYTP_OUTER_WEST_TRANS_TEXT, 4, 72, 420, 108, globalFlags.myTPTextTranslated, dummyFlag, dummyFlag);
|
|
case 12:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYTP_OUTER_NORTH_TRANS_TEXT, 6, 38, 428, 76, globalFlags.myTPTextTranslated, dummyFlag, dummyFlag);
|
|
case 13:
|
|
return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 140, 124, 174, 158, kItemCavernSkull, 3, globalFlags.myMCPickedUpSkull);
|
|
case 14:
|
|
return new GenericCavernDoorMainView(_vm, viewWindow, sceneStaticData, priorLocation, 1, 126, 1, 306, 30, 2, 287, 30, 379, 82, 3, 275, 84, 401, 174);
|
|
case 15:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYMC_WG_DOOR_TOP_TRANS_TEXT, 12, 128, 426, 156, globalFlags.myMCTransDoor, globalFlags.myWGTransDoorTop, dummyFlag);
|
|
case 16:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYMC_WG_DOOR_RIGHT_TRANS_TEXT, 46, 1, 315, 188, globalFlags.myMCTransDoor, globalFlags.myMCTransWGOffering, dummyFlag);
|
|
case 17:
|
|
return new GenericCavernDoorOfferingHead(_vm, viewWindow, sceneStaticData, priorLocation, kItemGoldCoins, 4, TRANSITION_WALK, -1, 1082, 13);
|
|
case 18:
|
|
return new GenericCavernDoorMainView(_vm, viewWindow, sceneStaticData, priorLocation, 1, 126, 1, 306, 30, 2, 287, 30, 379, 82, 3, 275, 84, 401, 174);
|
|
case 19:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYMC_WATERGOD_DOOR_TOP_TRANS_TEXT, 12, 128, 426, 156, globalFlags.myMCTransDoor, dummyFlag, dummyFlag);
|
|
case 20:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYMC_WATERGOD_DOOR_RIGHT_TRANS_TEXT, 46, 1, 315, 188, globalFlags.myMCTransDoor, globalFlags.myMCTransWTOffering, dummyFlag);
|
|
case 21:
|
|
return new GenericCavernDoorOfferingHead(_vm, viewWindow, sceneStaticData, priorLocation, kItemWaterCanFull, 4, TRANSITION_WALK, -1, 1125, 13);
|
|
case 22:
|
|
return new GenericCavernDoorMainView(_vm, viewWindow, sceneStaticData, priorLocation, 1, 126, 1, 306, 30, 2, 287, 30, 379, 82, 3, 275, 84, 401, 174);
|
|
case 23:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYMC_AG_DOOR_TOP_TRANS_TEXT, 12, 128, 426, 156, globalFlags.myMCTransDoor, dummyFlag, dummyFlag);
|
|
case 24:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYMC_AG_DOOR_RIGHT_TRANS_TEXT, 46, 1, 315, 188, globalFlags.myMCTransDoor, globalFlags.myMCTransAGOffering, dummyFlag);
|
|
case 25:
|
|
return new GenericCavernDoorOfferingHead(_vm, viewWindow, sceneStaticData, priorLocation, kItemBloodyArrow, 4, TRANSITION_WALK, -1, 1010, 12);
|
|
case 26:
|
|
return new GenericCavernDoorMainView(_vm, viewWindow, sceneStaticData, priorLocation, 1, 126, 1, 306, 30, 2, 287, 30, 379, 82, 3, 275, 84, 401, 174);
|
|
case 27:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYMC_DEATHGOD_DOOR_TOP_TRANS_TEXT, 12, 128, 426, 156, globalFlags.myMCTransDoor, dummyFlag, dummyFlag);
|
|
case 28:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDMYMC_DEATHGOD_DOOR_RIGHT_TRANS_TEXT, 46, 1, 315, 188, globalFlags.myMCTransDoor, globalFlags.myMCTransDGOffering, dummyFlag);
|
|
case 29:
|
|
return new DeathGodCavernDoorOfferingHead(_vm, viewWindow, sceneStaticData, priorLocation, 4, TRANSITION_WALK, -1, 1045, 13);
|
|
case 30:
|
|
return new WealthGodRopeDrop(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
case 31:
|
|
return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 194, 106, 278, 126, kItemJadeBlock, 105, globalFlags.myWGRetrievedJadeBlock);
|
|
case 32:
|
|
return new BasicDoor(_vm, viewWindow, sceneStaticData, priorLocation, 140, 22, 306, 189, 2, 3, 0, 3, 1, 1, TRANSITION_WALK, -1, 264, 14, 14);
|
|
case 33:
|
|
return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 158, 88, 288, 116, kItemLimestoneBlock, 84, globalFlags.myWTRetrievedLimestoneBlock);
|
|
case 34:
|
|
return new BasicDoor(_vm, viewWindow, sceneStaticData, priorLocation, 80, 0, 332, 189, 2, 4, 0, 2, 1, 1, TRANSITION_WALK, -1, 401, 14, 14);
|
|
case 35:
|
|
return new WaterGodInitialWalkSetFlag(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
case 36:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 0, 93, 37, 10, 73, false, 18);
|
|
case 37:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 166, 259, 37, 10, 73);
|
|
case 38:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 332, 425, 37, 10, 73);
|
|
case 39:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 498, 591, 37, 10, 73);
|
|
case 40:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 664, 757, 37, 10, 73);
|
|
case 41:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 830, 925, 37, 10, 71, true);
|
|
case 42:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 999, 1075, 37, 10, 73);
|
|
case 43:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 1149, 1242, 37, 10, 73);
|
|
case 44:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 1315, 1408, 37, 10, 73);
|
|
case 45:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 1481, 1574, 37, 10, 73);
|
|
case 46:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 1647, 1740, 37, 10, 73);
|
|
case 47:
|
|
return new WaterGodBridgeJump(_vm, viewWindow, sceneStaticData, priorLocation, 4, 1813, 1906, 37, 10, 73);
|
|
case 50:
|
|
return new BasicDoor(_vm, viewWindow, sceneStaticData, priorLocation,106, 0, 294, 189, 2, 5, 0, 1, 1, 1, TRANSITION_WALK, -1, 427, 13, 11);
|
|
case 51:
|
|
return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 235, 144, 285, 181, kItemEntrySkull, 3, globalFlags.myAGRetrievedEntrySkull);
|
|
case 52:
|
|
return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 200, 138, 231, 185, kItemSpearSkull, 46, globalFlags.myAGRetrievedSpearSkull);
|
|
case 53:
|
|
return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 201, 4, 235, 22, kItemCopperMedallion, 45, globalFlags.myAGRetrievedCopperMedal);
|
|
case 54:
|
|
return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 206, 110, 280, 142, kItemObsidianBlock, 72, globalFlags.myAGRetrievedObsidianBlock);
|
|
case 55:
|
|
return new ArrowGodHead(_vm, viewWindow, sceneStaticData, priorLocation, 0, 182, 87, 242, 189, 4, 75, 83, 79, 0, 2, 1, 3);
|
|
case 56:
|
|
return new ArrowGodHead(_vm, viewWindow, sceneStaticData, priorLocation, 1, 194, 89, 256, 189, 10, 76, 84, 80, 4, 6, 5, 7);
|
|
case 57:
|
|
return new ArrowGodHead(_vm, viewWindow, sceneStaticData, priorLocation, 2, 178, 93, 246, 189, 28, 77, 85, 81, 8, 10, 9, 11);
|
|
case 58:
|
|
return new ArrowGodHead(_vm, viewWindow, sceneStaticData, priorLocation, 3, 188, 92, 252, 189, 34, 78, 86, 82, 12, 14, 13, 15);
|
|
case 59:
|
|
return new ArrowGodDepthChange(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
case 60:
|
|
return new PlaySoundExitingFromScene(_vm, viewWindow, sceneStaticData, priorLocation, 11);
|
|
case 65:
|
|
return new BasicDoor(_vm, viewWindow, sceneStaticData, priorLocation, 90, 15, 346, 189, 2, 6, 0, 0, 1, 1, TRANSITION_WALK, -1, 33, 12, 13);
|
|
case 66:
|
|
return new DeathGodAltar(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
case 67:
|
|
return new DeathGodPuzzleBox(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
case 68:
|
|
return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 206, 76, 246, 116, kItemEnvironCart, 53, globalFlags.takenEnvironCart);
|
|
case 69:
|
|
return new PlaySoundExitingFromScene(_vm, viewWindow, sceneStaticData, priorLocation, 10);
|
|
case 70:
|
|
return new PlayStingers(_vm, viewWindow, sceneStaticData, priorLocation, 128, globalFlags.myMCStingerID, globalFlags.myMCStingerChannelID, 11, 14);
|
|
case 71:
|
|
return new DisplayMessageWithEvidenceWhenEnteringNode(_vm, viewWindow, sceneStaticData, priorLocation, MAYAN_EVIDENCE_BROKEN_GLASS_PYRAMID, IDS_MBT_EVIDENCE_PRESENT);
|
|
case 72:
|
|
return new MainCavernGlassCapture(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
case 75:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 40, 4500, 12, 14);
|
|
case 76:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 64, 6333, 12);
|
|
case 77:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 2, 1000, 2);
|
|
case 78:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 2, 1000, 2, 14);
|
|
case 79:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 40, 6500, 12);
|
|
case 80:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 16, 4750, 12);
|
|
case 81:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 30, 7750, 6);
|
|
case 82:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 16, 2250, 18);
|
|
case 83:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 30, 2410, 6);
|
|
case 84:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 64, 7666, 18);
|
|
case 85:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 255, 0, -1, 10); // First param has to be wrong
|
|
case 86:
|
|
return new SetVolumeAndFlag(_vm, viewWindow, sceneStaticData, priorLocation, 64, globalFlags.myWGSeenLowerPassage);
|
|
case 87:
|
|
return new SetVolumeAndFlag(_vm, viewWindow, sceneStaticData, priorLocation, 64, globalFlags.myWGCrossedRopeBridge);
|
|
case 88:
|
|
return new SetVolumeAndFlag(_vm, viewWindow, sceneStaticData, priorLocation, 64, dummyFlag);
|
|
case 90:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 40, 3160, 12, 14);
|
|
case 91:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 64, 4160, 12);
|
|
case 92:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 40, 4160, 12);
|
|
case 93:
|
|
return new WalkVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 16, 3160, 12);
|
|
case 100:
|
|
return new AdjustSecondaryAmbientOnEntry(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
case 101:
|
|
return new WalkDualAmbientVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 16, 32, 6900, 12);
|
|
case 102:
|
|
return new WalkDualAmbientVolumeChange(_vm, viewWindow, sceneStaticData, priorLocation, 64, 128, 6900, 12);
|
|
case 103:
|
|
return new PlaySoundEnteringFromScene(_vm, viewWindow, sceneStaticData, priorLocation, 12, 2, 4, 4, 2, 1, 5);
|
|
case 120:
|
|
return new PlaySoundExitingFromScene(_vm, viewWindow, sceneStaticData, priorLocation, 10);
|
|
case 121:
|
|
return new PlaySoundExitingFromScene(_vm, viewWindow, sceneStaticData, priorLocation, 14);
|
|
case 125:
|
|
return new GenericItemAcquire(_vm, viewWindow, sceneStaticData, priorLocation, 226, 90, 256, 104, kItemCopperMedallion, 15, globalFlags.myAGRetrievedCopperMedal);
|
|
case 126:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDS_MY_AG_ALTAR_TEXT, 120, 44, 330, 72, dummyFlag, dummyFlag, globalFlags.myAGVisitedAltar);
|
|
case 127:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDS_MY_WG_ALTAR_TEXT, 118, 14, 338, 44, dummyFlag, dummyFlag, dummyFlag);
|
|
case 128:
|
|
return new ViewSingleTranslation(_vm, viewWindow, sceneStaticData, priorLocation, IDS_MY_WT_ALTAR_TEXT, 106, 128, 344, 162, dummyFlag, dummyFlag, dummyFlag);
|
|
default:
|
|
warning("Unknown Mayan scene object %d", sceneStaticData.classID);
|
|
break;
|
|
}
|
|
|
|
return new SceneBase(_vm, viewWindow, sceneStaticData, priorLocation);
|
|
}
|
|
|
|
} // End of namespace Buried
|