mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-04 01:46:42 +00:00
789 lines
24 KiB
C++
789 lines
24 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 2
|
|
* 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, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
#include "buried/avi_frames.h"
|
|
#include "buried/biochip_right.h"
|
|
#include "buried/biochip_view.h"
|
|
#include "buried/buried.h"
|
|
#include "buried/fbcdata.h"
|
|
#include "buried/frame_window.h"
|
|
#include "buried/gameui.h"
|
|
#include "buried/graphics.h"
|
|
#include "buried/invdata.h"
|
|
#include "buried/livetext.h"
|
|
#include "buried/resources.h"
|
|
#include "buried/scene_view.h"
|
|
|
|
#include "common/error.h"
|
|
#include "common/stream.h"
|
|
#include "common/system.h"
|
|
#include "common/translation.h"
|
|
#include "graphics/surface.h"
|
|
#include "gui/message.h"
|
|
|
|
namespace Buried {
|
|
|
|
BioChipMainViewWindow::BioChipMainViewWindow(BuriedEngine *vm, Window *parent, int currentBioChipID) : Window(vm, parent) {
|
|
_currentBioChipID = -1;
|
|
_rect = Common::Rect(0, 0, 432, 189);
|
|
_bioChipDisplayWindow = createBioChipSpecificViewWindow(currentBioChipID);
|
|
_currentBioChipID = currentBioChipID;
|
|
|
|
if (_bioChipDisplayWindow)
|
|
_bioChipDisplayWindow->showWindow(kWindowShow);
|
|
|
|
_oldCursor = _vm->_gfx->setCursor(kCursorArrow);
|
|
}
|
|
|
|
BioChipMainViewWindow::~BioChipMainViewWindow() {
|
|
delete _bioChipDisplayWindow;
|
|
}
|
|
|
|
bool BioChipMainViewWindow::onSetCursor(uint message) {
|
|
_vm->_gfx->setCursor((Cursor)_oldCursor);
|
|
return true;
|
|
}
|
|
|
|
bool BioChipMainViewWindow::changeCurrentBioChip(int newBioChipID) {
|
|
delete _bioChipDisplayWindow;
|
|
_currentBioChipID = newBioChipID;
|
|
_bioChipDisplayWindow = createBioChipSpecificViewWindow(newBioChipID);
|
|
|
|
if (_bioChipDisplayWindow)
|
|
_bioChipDisplayWindow->showWindow(kWindowShow);
|
|
|
|
return true;
|
|
}
|
|
|
|
enum {
|
|
REGION_NONE = 0
|
|
};
|
|
|
|
enum {
|
|
REGION_BRIEFING = 1,
|
|
REGION_JUMP = 2,
|
|
REGION_MAYAN = 3,
|
|
REGION_CASTLE = 4,
|
|
REGION_DAVINCI = 5,
|
|
REGION_SPACE_STATION = 6
|
|
};
|
|
|
|
class JumpBiochipViewWindow : public Window {
|
|
public:
|
|
JumpBiochipViewWindow(BuriedEngine *vm, Window *parent);
|
|
|
|
void onPaint();
|
|
void onLButtonDown(const Common::Point &point, uint flags);
|
|
void onLButtonUp(const Common::Point &point, uint flags);
|
|
void onMouseMove(const Common::Point &point, uint flags);
|
|
|
|
private:
|
|
Common::Rect _missionBriefing;
|
|
Common::Rect _jumpButton;
|
|
Common::Rect _mayanZone;
|
|
Common::Rect _castle;
|
|
Common::Rect _daVinci;
|
|
Common::Rect _spaceStation;
|
|
AVIFrames _stillFrames;
|
|
int _curSelection;
|
|
|
|
int _curState;
|
|
|
|
static const byte _briefingNavData[4][2];
|
|
int _curRegion;
|
|
int _curBriefingPage;
|
|
|
|
bool _currentMissionReviewed;
|
|
};
|
|
|
|
const byte JumpBiochipViewWindow::_briefingNavData[4][2] = {
|
|
{ 2, 2 },
|
|
{ 4, 3 },
|
|
{ 7, 2 },
|
|
{ 9, 4 }
|
|
};
|
|
|
|
JumpBiochipViewWindow::JumpBiochipViewWindow(BuriedEngine *vm, Window *parent) : Window(vm, parent) {
|
|
_missionBriefing = Common::Rect(306, 24, 422, 74);
|
|
_jumpButton = Common::Rect(306, 84, 422, 134);
|
|
_mayanZone = Common::Rect(9, 48, 272, 74);
|
|
_castle = Common::Rect(9, 78, 296, 104);
|
|
_daVinci = Common::Rect(9, 108, 284, 134);
|
|
_spaceStation = Common::Rect(9, 138, 284, 164);
|
|
_curRegion = REGION_NONE;
|
|
_curSelection = -1;
|
|
_curState = 0;
|
|
_curBriefingPage = 0;
|
|
_currentMissionReviewed = false;
|
|
|
|
_rect = Common::Rect(0, 0, 432, 189);
|
|
|
|
if (!_stillFrames.open(_vm->getFilePath(IDS_BC_JUMP_VIEW_FILENAME)))
|
|
error("Failed to open jump view video");
|
|
}
|
|
|
|
void JumpBiochipViewWindow::onPaint() {
|
|
Common::Rect absoluteRect = getAbsoluteRect();
|
|
|
|
if (_curState == 0) {
|
|
const Graphics::Surface *frame = _stillFrames.getFrame(0);
|
|
_vm->_gfx->blit(frame, absoluteRect.left, absoluteRect.top);
|
|
|
|
if (_curSelection >= 0) {
|
|
frame = _stillFrames.getFrame(1);
|
|
|
|
Common::Rect highlightRect(11, _curSelection * 30 + 50, 11 + 23, _curSelection * 30 + 50 + 23);
|
|
_vm->_gfx->blit(frame, highlightRect, makeAbsoluteRect(highlightRect));
|
|
_vm->_gfx->blit(frame, Common::Rect(306, 24, 306 + 116, 24 + 50), makeAbsoluteRect(Common::Rect(306, 24, 306 + 116, 24 + 50)));
|
|
|
|
if (_currentMissionReviewed)
|
|
_vm->_gfx->blit(frame, Common::Rect(306, 84, 306 + 116, 84 + 50), makeAbsoluteRect(Common::Rect(306, 84, 306 + 116, 84 + 50)));
|
|
}
|
|
} else {
|
|
const Graphics::Surface *frame = _stillFrames.getFrame(_briefingNavData[_curSelection][0] + _curBriefingPage);
|
|
_vm->_gfx->blit(frame, absoluteRect.left, absoluteRect.top);
|
|
}
|
|
}
|
|
|
|
void JumpBiochipViewWindow::onLButtonDown(const Common::Point &point, uint flags) {
|
|
if (_curState == 0) {
|
|
if (_jumpButton.contains(point) && _curSelection >= 0) {
|
|
if (_currentMissionReviewed) {
|
|
if (((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().faHeardAgentFigure == 1)
|
|
_curRegion = REGION_JUMP;
|
|
else
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText(_vm->getString(IDS_MBT_JUMP_LOCKOUT_TEXT));
|
|
} else {
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText(_vm->getString(IDS_JUMP_BC_REVIEW_MISSION_TEXT_A + _curSelection));
|
|
return;
|
|
}
|
|
} else if (_missionBriefing.contains(point) && _curSelection >= 0) {
|
|
_curRegion = REGION_BRIEFING;
|
|
} else if (_mayanZone.contains(point)) {
|
|
_curRegion = REGION_MAYAN;
|
|
_curSelection = 0;
|
|
} else if (_castle.contains(point)) {
|
|
_curRegion = REGION_CASTLE;
|
|
_curSelection = 1;
|
|
} else if (_daVinci.contains(point)) {
|
|
_curRegion = REGION_DAVINCI;
|
|
_curSelection = 2;
|
|
} else if (_spaceStation.contains(point)) {
|
|
_curRegion = REGION_SPACE_STATION;
|
|
_curSelection = 3;
|
|
}
|
|
|
|
invalidateWindow(false);
|
|
}
|
|
}
|
|
|
|
void JumpBiochipViewWindow::onLButtonUp(const Common::Point &point, uint flags) {
|
|
if (_curState == 0) {
|
|
switch (_curRegion) {
|
|
case REGION_BRIEFING:
|
|
if (_missionBriefing.contains(point)) {
|
|
_currentMissionReviewed = true;
|
|
_curState = 1;
|
|
_curBriefingPage = 0;
|
|
invalidateWindow(false);
|
|
|
|
switch (_curSelection) {
|
|
case 0:
|
|
((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().genJumpMayanBriefing = 1;
|
|
break;
|
|
case 1:
|
|
((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().genJumpCastleBriefing = 1;
|
|
break;
|
|
case 2:
|
|
((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().genJumpDaVinciBriefing = 1;
|
|
break;
|
|
case 3:
|
|
((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().genJumpStationBriefing = 1;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case REGION_JUMP:
|
|
if (_jumpButton.contains(point)) {
|
|
TempCursorChange cursorChange(kCursorWait);
|
|
|
|
SceneViewWindow *sceneViewWindow = (SceneViewWindow *)getParent()->getParent();
|
|
int curSelection = _curSelection;
|
|
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_bioChipRightWindow->destroyBioChipViewWindow();
|
|
sceneViewWindow->timeSuitJump(curSelection);
|
|
return;
|
|
}
|
|
break;
|
|
case REGION_MAYAN:
|
|
if (_mayanZone.contains(point)) {
|
|
if (((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().genJumpMayanBriefing == 1) {
|
|
_currentMissionReviewed = true;
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText("");
|
|
} else {
|
|
_currentMissionReviewed = false;
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText(_vm->getString(IDS_JUMP_BC_REVIEW_MISSION_TEXT_A));
|
|
}
|
|
|
|
_curSelection = 0;
|
|
invalidateWindow(false);
|
|
}
|
|
break;
|
|
case REGION_CASTLE:
|
|
if (_castle.contains(point)) {
|
|
if (((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().genJumpCastleBriefing == 1) {
|
|
_currentMissionReviewed = true;
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText("");
|
|
} else {
|
|
_currentMissionReviewed = false;
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText(_vm->getString(IDS_JUMP_BC_REVIEW_MISSION_TEXT_B));
|
|
}
|
|
|
|
_curSelection = 1;
|
|
invalidateWindow(false);
|
|
}
|
|
break;
|
|
case REGION_DAVINCI:
|
|
if (_daVinci.contains(point)) {
|
|
if (((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().genJumpDaVinciBriefing == 1) {
|
|
_currentMissionReviewed = true;
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText("");
|
|
} else {
|
|
_currentMissionReviewed = false;
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText(_vm->getString(IDS_JUMP_BC_REVIEW_MISSION_TEXT_C));
|
|
}
|
|
|
|
_curSelection = 2;
|
|
invalidateWindow(false);
|
|
}
|
|
break;
|
|
case REGION_SPACE_STATION:
|
|
if (_spaceStation.contains(point)) {
|
|
if (((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().genJumpStationBriefing == 1) {
|
|
_currentMissionReviewed = true;
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText("");
|
|
} else {
|
|
_currentMissionReviewed = false;
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText(_vm->getString(IDS_JUMP_BC_REVIEW_MISSION_TEXT_D));
|
|
}
|
|
|
|
_curSelection = 3;
|
|
invalidateWindow(false);
|
|
}
|
|
break;
|
|
}
|
|
|
|
_curRegion = REGION_NONE;
|
|
invalidateWindow(false);
|
|
} else {
|
|
// Browsing the mission review pages
|
|
Common::Rect returnRect(343, 157, 427, 185);
|
|
Common::Rect nextPage(230, 25, 270, 43);
|
|
Common::Rect prevPage(182, 25, 222, 43);
|
|
|
|
if (returnRect.contains(point)) {
|
|
_curState = 0;
|
|
invalidateWindow(false);
|
|
} else if (prevPage.contains(point)) {
|
|
if (_curBriefingPage > 0) {
|
|
_curBriefingPage--;
|
|
invalidateWindow(false);
|
|
}
|
|
} else if (nextPage.contains(point)) {
|
|
if (_curBriefingPage < _briefingNavData[_curSelection][1] - 1) {
|
|
_curBriefingPage++;
|
|
invalidateWindow(false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void JumpBiochipViewWindow::onMouseMove(const Common::Point &point, uint flags) {
|
|
if (_curState == 0 && _curRegion > 0) {
|
|
switch (_curRegion) {
|
|
case REGION_BRIEFING:
|
|
if (!_missionBriefing.contains(point))
|
|
_curRegion = REGION_NONE;
|
|
break;
|
|
case REGION_JUMP:
|
|
if (!_jumpButton.contains(point))
|
|
_curRegion = REGION_NONE;
|
|
break;
|
|
case REGION_MAYAN:
|
|
case REGION_CASTLE:
|
|
case REGION_DAVINCI:
|
|
case REGION_SPACE_STATION: {
|
|
int newRegion = REGION_NONE;
|
|
|
|
if (_mayanZone.contains(point)) {
|
|
newRegion = REGION_MAYAN;
|
|
_curSelection = 0;
|
|
} else if (_castle.contains(point)) {
|
|
newRegion = REGION_CASTLE;
|
|
_curSelection = 1;
|
|
} else if (_daVinci.contains(point)) {
|
|
newRegion = REGION_DAVINCI;
|
|
_curSelection = 2;
|
|
} else if (_spaceStation.contains(point)) {
|
|
newRegion = REGION_SPACE_STATION;
|
|
_curSelection = 3;
|
|
}
|
|
|
|
if (newRegion != REGION_NONE && _curRegion != newRegion) {
|
|
_curRegion = newRegion;
|
|
invalidateWindow(false);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
class EvidenceBioChipViewWindow : public Window {
|
|
public:
|
|
EvidenceBioChipViewWindow(BuriedEngine *vm, Window *parent);
|
|
~EvidenceBioChipViewWindow();
|
|
|
|
void onPaint();
|
|
void onLButtonUp(const Common::Point &point, uint flags);
|
|
|
|
private:
|
|
Common::Rect _evidence[6];
|
|
Common::Rect _pageButton;
|
|
AVIFrames _stillFrames;
|
|
AVIFrames _evidenceFrames;
|
|
int _status;
|
|
int _pageIndex;
|
|
Graphics::Surface _preBuffer;
|
|
|
|
bool rebuildMainPrebuffer();
|
|
};
|
|
|
|
EvidenceBioChipViewWindow::EvidenceBioChipViewWindow(BuriedEngine *vm, Window *parent) : Window(vm, parent) {
|
|
_evidence[0] = Common::Rect(14, 49, 96, 83);
|
|
_evidence[1] = Common::Rect(14, 91, 96, 125);
|
|
_evidence[2] = Common::Rect(14, 133, 96, 167);
|
|
_evidence[3] = Common::Rect(225, 20, 307, 54);
|
|
_evidence[4] = Common::Rect(225, 61, 307, 95);
|
|
_evidence[5] = Common::Rect(225, 103, 307, 137);
|
|
_pageButton = Common::Rect(336, 156, 420, 185);
|
|
_status = 0;
|
|
_pageIndex = 0;
|
|
|
|
_rect = Common::Rect(0, 0, 432, 189);
|
|
|
|
_preBuffer.create(432, 189, g_system->getScreenFormat());
|
|
|
|
if (!_stillFrames.open(_vm->getFilePath(IDS_BC_EVIDENCE_VIEW_FILENAME)))
|
|
error("Failed to open evidence still frames video");
|
|
|
|
if (!_evidenceFrames.open(_vm->getFilePath(IDS_BC_EVIDENCE_ITEMS_FILENAME)))
|
|
error("Failed to open evidence frames video");
|
|
|
|
// Build the initial page
|
|
rebuildMainPrebuffer();
|
|
|
|
// Display some live text if no evidence is present
|
|
if (((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().evcapNumCaptured == 0)
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText(_vm->getString(IDS_MBT_EVIDENCE_NONE_ACQUIRED));
|
|
}
|
|
|
|
EvidenceBioChipViewWindow::~EvidenceBioChipViewWindow() {
|
|
_preBuffer.free();
|
|
}
|
|
|
|
void EvidenceBioChipViewWindow::onPaint() {
|
|
Common::Rect absoluteRect = getAbsoluteRect();
|
|
|
|
if (_status == 0) {
|
|
_vm->_gfx->blit(&_preBuffer, absoluteRect.left, absoluteRect.top);
|
|
} else {
|
|
const Graphics::Surface *frame = _stillFrames.getFrame(_status + 2);
|
|
_vm->_gfx->blit(frame, absoluteRect.left, absoluteRect.top);
|
|
}
|
|
}
|
|
|
|
void EvidenceBioChipViewWindow::onLButtonUp(const Common::Point &point, uint flags) {
|
|
if (_status == 0) {
|
|
// Get the number of items urrently captured
|
|
int itemCount = ((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().evcapNumCaptured;
|
|
|
|
// Loop through the evidence piece regions, determining if we have another page to go to
|
|
for (int i = 0; i < 6; i++) {
|
|
if (_evidence[i].contains(point) && (_pageIndex * 6 + i) < itemCount) {
|
|
_status = ((SceneViewWindow *)getParent()->getParent())->getNumberFromGlobalFlagTable(offsetof(GlobalFlags, evcapBaseID), _pageIndex * 6 + i);
|
|
invalidateWindow(false);
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText(_vm->getString(IDS_EC_DESC_TEXT_A + _status - 1), false);
|
|
|
|
// Give scores for research
|
|
if (_status + 2 == 3)
|
|
((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().scoreResearchCastleFootprint = 1;
|
|
else if (_status + 2 == 10)
|
|
((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().scoreResearchDaVinciFootprint = 1;
|
|
}
|
|
}
|
|
|
|
// Did we click on the next page button and is it valid?
|
|
if (_pageButton.contains(point)) {
|
|
if (itemCount > 6) {
|
|
if (_pageIndex * 6 < itemCount - 6) {
|
|
_pageIndex++;
|
|
} else {
|
|
_pageIndex = 0;
|
|
}
|
|
|
|
rebuildMainPrebuffer();
|
|
invalidateWindow(false);
|
|
}
|
|
}
|
|
} else {
|
|
// Return to the last evidence page displayed
|
|
_status = 0;
|
|
invalidateWindow(false);
|
|
((GameUIWindow *)getParent()->getParent()->getParent())->_liveTextWindow->updateLiveText("");
|
|
}
|
|
}
|
|
|
|
bool EvidenceBioChipViewWindow::rebuildMainPrebuffer() {
|
|
int itemCount = ((SceneViewWindow *)getParent()->getParent())->getGlobalFlags().evcapNumCaptured;
|
|
int frameIndex = (itemCount > 6) ? 1 : 0;
|
|
const Graphics::Surface *frame = _stillFrames.getFrame(frameIndex);
|
|
_vm->_gfx->crossBlit(&_preBuffer, 0, 0, 432, 189, frame, 0, 0);
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
if ((_pageIndex * 6 + i) < itemCount) {
|
|
frameIndex = ((SceneViewWindow *)getParent()->getParent())->getNumberFromGlobalFlagTable(offsetof(GlobalFlags, evcapBaseID), _pageIndex * 6 + i) - 1;
|
|
frame = _evidenceFrames.getFrame(frameIndex);
|
|
|
|
if (frame) {
|
|
byte transparentColor = _vm->isTrueColor() ? 255 : 248;
|
|
_vm->_gfx->opaqueTransparentBlit(&_preBuffer, _evidence[i].left, _evidence[i].top, 203, 34, frame, 2, 2, 0, transparentColor, transparentColor, transparentColor);
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
enum {
|
|
REGION_SAVE = 1,
|
|
REGION_RESTORE = 2,
|
|
REGION_PAUSE = 3,
|
|
REGION_QUIT = 4,
|
|
REGION_FLICKER = 5,
|
|
REGION_TRANSITION_SPEED = 6
|
|
};
|
|
|
|
class InterfaceBioChipViewWindow : public Window {
|
|
public:
|
|
InterfaceBioChipViewWindow(BuriedEngine *vm, Window *parent);
|
|
~InterfaceBioChipViewWindow();
|
|
|
|
void onPaint();
|
|
void onLButtonDown(const Common::Point &point, uint flags);
|
|
void onLButtonUp(const Common::Point &point, uint flags);
|
|
void onMouseMove(const Common::Point &point, uint flags);
|
|
|
|
private:
|
|
Common::Rect _save;
|
|
Common::Rect _pause;
|
|
Common::Rect _restore;
|
|
Common::Rect _quit;
|
|
Common::Rect _flicker;
|
|
Common::Rect _transitionSpeed;
|
|
|
|
int _curRegion;
|
|
int _transLocation;
|
|
int _soundLocation;
|
|
|
|
Graphics::Surface *_background;
|
|
Graphics::Surface *_cycleCheck;
|
|
Graphics::Surface *_caret;
|
|
};
|
|
|
|
InterfaceBioChipViewWindow::InterfaceBioChipViewWindow(BuriedEngine *vm, Window *parent) : Window(vm, parent) {
|
|
_save = Common::Rect(192, 37, 300, 74);
|
|
_pause = Common::Rect(192, 84, 300, 121);
|
|
_restore = Common::Rect(313, 37, 421, 74);
|
|
_quit = Common::Rect(313, 84, 421, 121);
|
|
_flicker = Common::Rect(14, 146, 164, 166);
|
|
|
|
// For whatever reason, the Spanish version uses the demo coordinates.
|
|
_transitionSpeed = (_vm->getLanguage() == Common::ES_ESP || _vm->isDemo()) ? Common::Rect(14, 117, 179, 140) : Common::Rect(14, 100, 125, 140);
|
|
|
|
_curRegion = REGION_NONE;
|
|
_soundLocation = 0;
|
|
_transLocation = _vm->getTransitionSpeed() * 50;
|
|
|
|
_rect = Common::Rect(0, 0, 432, 189);
|
|
|
|
_background = _vm->_gfx->getBitmap(_vm->isDemo() ? IDB_BCM_INTERFACE_NORMAL : IDB_BCV_INTERFACE_MAIN);
|
|
_cycleCheck = _vm->_gfx->getBitmap(_vm->isDemo() ? IDB_BCM_INTERFACE_SELECTED : IDB_BCV_INTERFACE_CHECK);
|
|
_caret = _vm->_gfx->getBitmap(_vm->isDemo() ? IDB_BCM_INTERFACE_SLIDER : IDB_BCV_INTERFACE_HANDLE);
|
|
}
|
|
|
|
InterfaceBioChipViewWindow::~InterfaceBioChipViewWindow() {
|
|
_background->free();
|
|
delete _background;
|
|
|
|
_cycleCheck->free();
|
|
delete _cycleCheck;
|
|
|
|
_caret->free();
|
|
delete _caret;
|
|
}
|
|
|
|
void InterfaceBioChipViewWindow::onPaint() {
|
|
Common::Rect absoluteRect = getAbsoluteRect();
|
|
_vm->_gfx->blit(_background, absoluteRect.left, absoluteRect.top);
|
|
|
|
if (((SceneViewWindow *)getParent()->getParent())->getCyclingStatus())
|
|
_vm->_gfx->blit(_cycleCheck, absoluteRect.left + 13, absoluteRect.top + 144);
|
|
|
|
if (_caret) {
|
|
if (_vm->isDemo()) {
|
|
_vm->_gfx->opaqueTransparentBlit(_vm->_gfx->getScreen(), absoluteRect.left + _transLocation + 12, absoluteRect.top + 112, 20, 35, _caret, 0, 0, 0, 255, 255, 255);
|
|
} else {
|
|
// For whatever reason, the Spanish version has to be different.
|
|
int dy = (_vm->getLanguage() == Common::ES_ESP) ? 115 : 97;
|
|
_vm->_gfx->opaqueTransparentBlit(_vm->_gfx->getScreen(), absoluteRect.left + _transLocation + 14, absoluteRect.top + dy, 15, 30, _caret, 0, 0, 0, 248, _vm->isTrueColor() ? 252 : 248, 248);
|
|
}
|
|
}
|
|
}
|
|
|
|
void InterfaceBioChipViewWindow::onLButtonDown(const Common::Point &point, uint flags) {
|
|
if (_save.contains(point))
|
|
_curRegion = REGION_SAVE;
|
|
else if (_restore.contains(point))
|
|
_curRegion = REGION_RESTORE;
|
|
else if (_pause.contains(point))
|
|
_curRegion = REGION_PAUSE;
|
|
else if (_quit.contains(point))
|
|
_curRegion = REGION_QUIT;
|
|
else if (_flicker.contains(point))
|
|
_curRegion = REGION_FLICKER;
|
|
else if (_transitionSpeed.contains(point))
|
|
_curRegion = REGION_TRANSITION_SPEED;
|
|
}
|
|
|
|
void InterfaceBioChipViewWindow::onLButtonUp(const Common::Point &point, uint flags) {
|
|
switch (_curRegion) {
|
|
case REGION_SAVE:
|
|
if (!_vm->isDemo())
|
|
_vm->runSaveDialog();
|
|
break;
|
|
case REGION_RESTORE:
|
|
if (!_vm->isDemo()) {
|
|
FrameWindow *frameWindow = (FrameWindow *)_vm->_mainWindow;
|
|
Common::Error result = _vm->runLoadDialog();
|
|
|
|
if (result.getCode() == Common::kUnknownError) {
|
|
// Try to get us back to the main menu at this point
|
|
frameWindow->showMainMenu();
|
|
return;
|
|
} else if (result.getCode() == Common::kNoError) {
|
|
// Loaded successfully
|
|
return;
|
|
}
|
|
}
|
|
break;
|
|
case REGION_QUIT:
|
|
if (_vm->runQuitDialog()) {
|
|
((FrameWindow *)_vm->_mainWindow)->showMainMenu();
|
|
return;
|
|
}
|
|
break;
|
|
case REGION_PAUSE:
|
|
if (!_vm->isDemo()) {
|
|
((SceneViewWindow *)getParent()->getParent())->_paused = true;
|
|
|
|
// TODO: Would be nice to load the translated text from IDS_APP_MESSAGE_PAUSED_TEXT (9023)
|
|
GUI::MessageDialog dialog(_("Your game is now Paused. Click OK to continue."));
|
|
dialog.runModal();
|
|
|
|
((SceneViewWindow *)getParent()->getParent())->_paused = false;
|
|
}
|
|
break;
|
|
case REGION_FLICKER:
|
|
if (_flicker.contains(point)) {
|
|
if (((SceneViewWindow *)(_parent->getParent()))->getCyclingStatus()) {
|
|
((SceneViewWindow *)(_parent->getParent()))->enableCycling(false);
|
|
invalidateRect(_flicker, false);
|
|
} else {
|
|
((SceneViewWindow *)(_parent->getParent()))->enableCycling(true);
|
|
invalidateRect(_flicker, false);
|
|
}
|
|
}
|
|
break;
|
|
case REGION_TRANSITION_SPEED:
|
|
_transLocation = CLIP<int>(point.x - 14, 0, 150);
|
|
|
|
if ((_transLocation % 50) > 25)
|
|
_transLocation = (_transLocation / 50 + 1) * 50;
|
|
else
|
|
_transLocation = _transLocation / 50 * 50;
|
|
|
|
_vm->setTransitionSpeed(_transLocation / 50);
|
|
|
|
invalidateWindow(false);
|
|
break;
|
|
}
|
|
|
|
_curRegion = REGION_NONE;
|
|
}
|
|
|
|
void InterfaceBioChipViewWindow::onMouseMove(const Common::Point &point, uint flags) {
|
|
if (_curRegion == REGION_TRANSITION_SPEED) {
|
|
int newPos = CLIP<int>(point.x - 14, 0, 150);
|
|
|
|
if ((newPos % 50) > 25)
|
|
newPos = (newPos / 50 + 1) * 50;
|
|
else
|
|
newPos = newPos / 50 * 50;
|
|
|
|
if (_transLocation != newPos) {
|
|
_transLocation = newPos;
|
|
invalidateWindow(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
class FilesBioChipViewWindow : public Window {
|
|
public:
|
|
FilesBioChipViewWindow(BuriedEngine *vm, Window *parent);
|
|
|
|
void onPaint();
|
|
void onLButtonUp(const Common::Point &point, uint flags);
|
|
|
|
private:
|
|
int _curPage;
|
|
AVIFrames _stillFrames;
|
|
Common::Array<FilesPage> _navData;
|
|
};
|
|
|
|
FilesBioChipViewWindow::FilesBioChipViewWindow(BuriedEngine *vm, Window *parent) : Window(vm, parent) {
|
|
_curPage = 0;
|
|
_rect = Common::Rect(0, 0, 432, 189);
|
|
|
|
Common::SeekableReadStream *fbcStream = _vm->getFileBCData(IDBD_BC_VIEW_DATA);
|
|
assert(fbcStream);
|
|
|
|
fbcStream->skip(2); // Page count
|
|
|
|
while (fbcStream->pos() < fbcStream->size()) {
|
|
FilesPage page;
|
|
page.pageID = fbcStream->readSint16LE();
|
|
page.returnPageIndex = fbcStream->readSint16LE();
|
|
page.nextButtonPageIndex = fbcStream->readSint16LE();
|
|
page.prevButtonPageIndex = fbcStream->readSint16LE();
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
page.hotspots[i].left = fbcStream->readSint16LE();
|
|
page.hotspots[i].top = fbcStream->readSint16LE();
|
|
page.hotspots[i].right = fbcStream->readSint16LE();
|
|
page.hotspots[i].bottom = fbcStream->readSint16LE();
|
|
page.hotspots[i].pageIndex = fbcStream->readSint16LE();
|
|
}
|
|
|
|
_navData.push_back(page);
|
|
}
|
|
|
|
delete fbcStream;
|
|
|
|
if (!_stillFrames.open(_vm->getFilePath(IDS_BC_FILES_VIEW_FILENAME)))
|
|
error("Failed to open files biochip video");
|
|
}
|
|
|
|
void FilesBioChipViewWindow::onPaint() {
|
|
const Graphics::Surface *frame = _stillFrames.getFrame(_curPage);
|
|
assert(frame);
|
|
|
|
Common::Rect absoluteRect = getAbsoluteRect();
|
|
_vm->_gfx->blit(frame, absoluteRect.left, absoluteRect.top);
|
|
}
|
|
|
|
void FilesBioChipViewWindow::onLButtonUp(const Common::Point &point, uint flags) {
|
|
if (_curPage < 0 || _curPage >= (int)_navData.size())
|
|
return;
|
|
|
|
const FilesPage &page = _navData[_curPage];
|
|
|
|
Common::Rect returnButton(343, 157, 427, 185);
|
|
Common::Rect next(193, 25, 241, 43);
|
|
Common::Rect previous(253, 25, 301, 43);
|
|
|
|
if (page.returnPageIndex >= 0 && returnButton.contains(point)) {
|
|
_curPage = page.returnPageIndex;
|
|
invalidateWindow(false);
|
|
return;
|
|
}
|
|
|
|
if (page.nextButtonPageIndex >= 0 && next.contains(point)) {
|
|
_curPage = page.nextButtonPageIndex;
|
|
invalidateWindow(false);
|
|
|
|
if (_curPage == 6)
|
|
((SceneViewWindow *)(_parent->getParent()))->getGlobalFlags().scoreResearchBCJumpsuit = 1;
|
|
else if (_curPage == 21)
|
|
((SceneViewWindow *)(_parent->getParent()))->getGlobalFlags().scoreResearchMichelle = 1;
|
|
else if (_curPage == 31)
|
|
((SceneViewWindow *)(_parent->getParent()))->getGlobalFlags().scoreResearchMichelleBkg = 1;
|
|
|
|
return;
|
|
}
|
|
|
|
if (page.prevButtonPageIndex >= 0 && previous.contains(point)) {
|
|
_curPage = page.prevButtonPageIndex;
|
|
invalidateWindow(false);
|
|
return;
|
|
}
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
if (page.hotspots[i].pageIndex >= 0 && Common::Rect(page.hotspots[i].left, page.hotspots[i].top, page.hotspots[i].right, page.hotspots[i].bottom).contains(point)) {
|
|
_curPage = page.hotspots[i].pageIndex;
|
|
invalidateWindow(false);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
Window *BioChipMainViewWindow::createBioChipSpecificViewWindow(int bioChipID) {
|
|
switch (bioChipID) {
|
|
case kItemBioChipInterface:
|
|
return new InterfaceBioChipViewWindow(_vm, this);
|
|
case kItemBioChipJump:
|
|
return new JumpBiochipViewWindow(_vm, this);
|
|
case kItemBioChipEvidence:
|
|
return new EvidenceBioChipViewWindow(_vm, this);
|
|
case kItemBioChipFiles:
|
|
return new FilesBioChipViewWindow(_vm, this);
|
|
}
|
|
|
|
// No entry for this BioChip
|
|
return 0;
|
|
}
|
|
|
|
} // End of namespace Buried
|