Initial commit
This commit is contained in:
767
engines/buried/biochip_view.cpp
Normal file
767
engines/buried/biochip_view.cpp
Normal file
@@ -0,0 +1,767 @@
|
||||
/* 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/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 "graphics/surface.h"
|
||||
|
||||
namespace Buried {
|
||||
|
||||
BioChipMainViewWindow::BioChipMainViewWindow(BuriedEngine *vm, Window *parent, int currentBioChipID) : Window(vm, parent) {
|
||||
_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() override;
|
||||
void onLButtonDown(const Common::Point &point, uint flags) override;
|
||||
void onLButtonUp(const Common::Point &point, uint flags) override;
|
||||
void onMouseMove(const Common::Point &point, uint flags) override;
|
||||
|
||||
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() override;
|
||||
void onLButtonUp(const Common::Point &point, uint flags) override;
|
||||
|
||||
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 currently 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(_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(_pageIndex * 6 + i) - 1;
|
||||
frame = _evidenceFrames.getFrame(frameIndex);
|
||||
|
||||
if (frame) {
|
||||
byte transparentColor = _vm->isTrueColor() ? 255 : 248;
|
||||
_vm->_gfx->keyBlit(&_preBuffer, _evidence[i].left, _evidence[i].top, 203, 34, frame, 2, 2, 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() override;
|
||||
void onLButtonDown(const Common::Point &point, uint flags) override;
|
||||
void onLButtonUp(const Common::Point &point, uint flags) override;
|
||||
void onMouseMove(const Common::Point &point, uint flags) override;
|
||||
|
||||
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;
|
||||
PauseToken _pauseToken;
|
||||
};
|
||||
|
||||
InterfaceBioChipViewWindow::InterfaceBioChipViewWindow(BuriedEngine *vm, Window *parent) : Window(vm, parent) {
|
||||
_pauseToken = _vm->pauseEngine();
|
||||
_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->keyBlit(_vm->_gfx->getScreen(), absoluteRect.left + _transLocation + 12, absoluteRect.top + 112, 20, 35, _caret, 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->keyBlit(_vm->_gfx->getScreen(), absoluteRect.left + _transLocation + 14, absoluteRect.top + dy, 15, 30, _caret, 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:
|
||||
_vm->handleSaveDialog();
|
||||
break;
|
||||
case REGION_RESTORE:
|
||||
_vm->handleRestoreDialog();
|
||||
break;
|
||||
case REGION_QUIT:
|
||||
if (_vm->runQuitDialog()) {
|
||||
((FrameWindow *)_vm->_mainWindow)->showMainMenu();
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case REGION_PAUSE:
|
||||
_vm->pauseGame();
|
||||
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() override;
|
||||
void onLButtonUp(const Common::Point &point, uint flags) override;
|
||||
|
||||
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.prevButtonPageIndex = fbcStream->readSint16LE();
|
||||
page.nextButtonPageIndex = 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 previous(193, 25, 241, 43);
|
||||
Common::Rect next(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;
|
||||
|
||||
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);
|
||||
|
||||
if (_curPage == 21)
|
||||
((SceneViewWindow *)(_parent->getParent()))->getGlobalFlags().scoreResearchMichelle = 1;
|
||||
else if (_curPage == 31)
|
||||
((SceneViewWindow *)(_parent->getParent()))->getGlobalFlags().scoreResearchMichelleBkg = 1;
|
||||
|
||||
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 nullptr;
|
||||
}
|
||||
|
||||
} // End of namespace Buried
|
||||
Reference in New Issue
Block a user