aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2014-01-03 09:20:53 -1000
committerPaul Gilbert2014-01-03 09:20:53 -1000
commit1c3708630bd4e2698704883e1b1aeea94ef8379b (patch)
treec4eb0b701775f2b00fadad6cf118626e543cbf9e
parent76f7d974f6f0fe97033e07481f0b9d8f2cc2b42b (diff)
downloadscummvm-rg350-1c3708630bd4e2698704883e1b1aeea94ef8379b.tar.gz
scummvm-rg350-1c3708630bd4e2698704883e1b1aeea94ef8379b.tar.bz2
scummvm-rg350-1c3708630bd4e2698704883e1b1aeea94ef8379b.zip
VOYEUR: Replaced original game mansion scrolling with a more effective one
The original had the cursor fixed in the middle of the screen, and scrolled the mansion view as the mouse moves. Since this doesn't really work for windowed mode nor tablets, I've replaced it with a new version that scrolls when the mouse cursor is near any edge of the screen
-rw-r--r--engines/voyeur/events.cpp2
-rw-r--r--engines/voyeur/files.h8
-rw-r--r--engines/voyeur/files_threads.cpp93
-rw-r--r--engines/voyeur/voyeur.cpp1
-rw-r--r--engines/voyeur/voyeur.h14
-rw-r--r--engines/voyeur/voyeur_game.cpp5
6 files changed, 86 insertions, 37 deletions
diff --git a/engines/voyeur/events.cpp b/engines/voyeur/events.cpp
index 6ac36ddb94..e7f7916676 100644
--- a/engines/voyeur/events.cpp
+++ b/engines/voyeur/events.cpp
@@ -488,7 +488,7 @@ void EventsManager::setCursor(PictureResource *pic) {
}
void EventsManager::setCursor(byte *cursorData, int width, int height) {
- CursorMan.replaceCursor(cursorData, width, height, 0, 0, 0);
+ CursorMan.replaceCursor(cursorData, width, height, width / 2, height / 2, 0);
}
void EventsManager::setCursorColor(int idx, int mode) {
diff --git a/engines/voyeur/files.h b/engines/voyeur/files.h
index 0532b7c3d4..17f5ccc125 100644
--- a/engines/voyeur/files.h
+++ b/engines/voyeur/files.h
@@ -445,8 +445,6 @@ public:
static CMapResource *_cmd14Pal;
static void initUseCount();
static void unloadAllStacks(VoyeurEngine *vm);
- static int _currentMouseX;
- static int _currentMouseY;
static int _doAptPosX;
static int _doAptPosY;
@@ -487,6 +485,12 @@ private:
* Does any necessary animation at the start or end of showing the apartment.
*/
void doAptAnim(int mode);
+
+ /**
+ * Updates the mansion scroll position if ncessary, and returns true if it
+ * has been changed.
+ */
+ bool checkMansionScroll();
public:
VoyeurEngine *_vm;
diff --git a/engines/voyeur/files_threads.cpp b/engines/voyeur/files_threads.cpp
index df6ad3ae75..2d9ae816eb 100644
--- a/engines/voyeur/files_threads.cpp
+++ b/engines/voyeur/files_threads.cpp
@@ -31,8 +31,6 @@ int ThreadResource::_stampFlags;
int ThreadResource::_useCount[8];
byte *ThreadResource::_threadDataPtr;
CMapResource *ThreadResource::_cmd14Pal;
-int ThreadResource::_currentMouseX;
-int ThreadResource::_currentMouseY;
int ThreadResource::_doAptPosX;
int ThreadResource::_doAptPosY;
@@ -41,8 +39,6 @@ void ThreadResource::init() {
Common::fill(&_useCount[0], &_useCount[8], 0);
_threadDataPtr = nullptr;
_cmd14Pal = nullptr;
- _currentMouseX = 392;
- _currentMouseY = 57;
_doAptPosX = -1;
_doAptPosY = -1;
}
@@ -1361,7 +1357,6 @@ int ThreadResource::doInterface() {
_vm->_voy._RTVNum = _vm->_voy._field476;
_vm->makeViewFinder();
- _vm->_eventsManager.setMousePos(Common::Point(_currentMouseX, _currentMouseY));
_vm->initIFace();
_vm->_voy._RTVNum = _vm->_voy._field476 - 4;
_vm->_voy._field478 &= ~1;
@@ -1378,7 +1373,6 @@ int ThreadResource::doInterface() {
_vm->checkTransition();
_vm->makeViewFinder();
_vm->_eventsManager.getMouseInfo();
- _vm->_eventsManager.setMousePos(Common::Point(_currentMouseX, _currentMouseY));
_vm->initIFace();
Common::Array<Common::Rect> &hotspots = _vm->_bVoy->boltEntry(
@@ -1389,26 +1383,34 @@ int ThreadResource::doInterface() {
Common::String fname = _vm->_soundManager.getVOCFileName(_vm->_playStamp2);
_vm->_soundManager.startVOCPlay(fname);
_vm->_eventsManager.getMouseInfo();
- _vm->_eventsManager.setMousePos(Common::Point(_currentMouseX, _currentMouseY));
_vm->_graphicsManager.setColor(240, 220, 220, 220);
_vm->_eventsManager._intPtr.field38 = true;
_vm->_eventsManager._intPtr._hasPalette = true;
_vm->_voy._field478 &= ~1;
+ // Set the cusor
+ PictureResource *crosshairsCursor = _vm->_bVoy->boltEntry(0x112)._picResource;
+ PictureResource *mangifyCursor = _vm->_bVoy->boltEntry(0x114)._picResource;
+ PictureResource *unk1Cursor = _vm->_bVoy->boltEntry(0x115)._picResource;
+ PictureResource *unk2Cursor = _vm->_bVoy->boltEntry(0x113)._picResource;
+
+ _vm->_eventsManager.setCursor(crosshairsCursor);
+ _vm->_eventsManager.showCursor();
+
+ // Main loop
int priorRegionIndex = -1;
int regionIndex = 0;
+ Common::Rect mansionViewBounds(MANSION_VIEW_X, MANSION_VIEW_Y,
+ MANSION_VIEW_X + MANSION_VIEW_WIDTH, MANSION_VIEW_Y + MANSION_VIEW_HEIGHT);
+
do {
_vm->doTimeBar(true);
_vm->_eventsManager.getMouseInfo();
- pt = _vm->_eventsManager.getMousePos();
- if (pt.x != _currentMouseX || pt.y != _currentMouseY || regionIndex != priorRegionIndex) {
+ if (checkMansionScroll()) {
priorRegionIndex = regionIndex;
- _vm->doScroll(pt);
-
- _currentMouseX = pt.x;
- _currentMouseY = pt.y;
+ _vm->doScroll(_vm->_mansionViewPos);
}
_vm->checkPhoneCall();
@@ -1417,7 +1419,13 @@ int ThreadResource::doInterface() {
_vm->_soundManager.startVOCPlay(_vm->_soundManager.getVOCFileName(_vm->_playStamp2));
}
- pt = _vm->_eventsManager.getMousePos() + Common::Point(120, 75);
+ // Calculate the mouse position within the entire mansion
+ pt = _vm->_eventsManager.getMousePos();
+ if (!mansionViewBounds.contains(pt))
+ pt = Common::Point(-1, -1);
+ else
+ pt = _vm->_mansionViewPos +
+ Common::Point(pt.x - MANSION_VIEW_X, pt.y - MANSION_VIEW_Y);
regionIndex = -1;
for (int idx = 0; idx < (int)hotspots.size(); ++idx) {
@@ -1426,19 +1434,15 @@ int ThreadResource::doInterface() {
for (int arrIndex = 0; arrIndex < 3; ++arrIndex) {
if (_vm->_voy._arr3[arrIndex][idx] <= _vm->_voy._RTVNum &&
_vm->_voy._arr4[arrIndex][idx] > _vm->_voy._RTVNum) {
- // Draw the picture
- pic = _vm->_bVoy->boltEntry(276)._picResource;
- _vm->_graphicsManager.sDrawPic(pic, *_vm->_graphicsManager._vPort,
- Common::Point(178, 108));
+ // Found a hotspot - switch to the magnifying glass cursor
+ _vm->_eventsManager.setCursor(mangifyCursor);
regionIndex = idx;
}
if (_vm->_voy._arr5[arrIndex][idx] <= _vm->_voy._RTVNum &&
_vm->_voy._arr6[idx][idx] > _vm->_voy._RTVNum) {
- // Draw the picture
- pic = _vm->_bVoy->boltEntry(277)._picResource;
- _vm->_graphicsManager.sDrawPic(pic, *_vm->_graphicsManager._vPort,
- Common::Point(178, 108));
+ // Set unk? cursor
+ _vm->_eventsManager.setCursor(unk1Cursor);
regionIndex = idx;
}
}
@@ -1447,9 +1451,7 @@ int ThreadResource::doInterface() {
if (_vm->_voy._arr1[arrIndex][idx] <= _vm->_voy._RTVNum &&
_vm->_voy._arr2[arrIndex][idx] > _vm->_voy._RTVNum) {
// Draw the picture
- pic = _vm->_bVoy->boltEntry(375)._picResource;
- _vm->_graphicsManager.sDrawPic(pic, *_vm->_graphicsManager._vPort,
- Common::Point(178, 108));
+ _vm->_eventsManager.setCursor(unk2Cursor);
regionIndex = idx;
}
}
@@ -1457,10 +1459,8 @@ int ThreadResource::doInterface() {
}
if (regionIndex == -1) {
- // Draw the crosshairs cursor in the center of the screen
- pic = _vm->_bVoy->boltEntry(274)._picResource;
- _vm->_graphicsManager.sDrawPic(pic, *_vm->_graphicsManager._vPort,
- Common::Point(178, 108));
+ // Reset back to the crosshairs cursor
+ _vm->_eventsManager.setCursor(crosshairsCursor);
}
// Regularly update the time display
@@ -1499,20 +1499,16 @@ int ThreadResource::doInterface() {
_vm->_eventsManager._leftClick = true;
} else {
_vm->_voy._field478 = 1;
- _currentMouseX = pt.x;
- _currentMouseY = pt.y;
chooseSTAMPButton(20);
parsePlayCommands();
_vm->checkTransition();
_vm->makeViewFinder();
- _vm->_eventsManager.setMousePos(Common::Point(_currentMouseX, _currentMouseY));
_vm->initIFace();
hotspots = _vm->_bVoy->boltEntry(_vm->_playStamp1 + 1)._rectResource->_entries;
_vm->_eventsManager.getMouseInfo();
- _vm->_eventsManager.setMousePos(Common::Point(_currentMouseX, _currentMouseY));
_vm->_voy._field478 &= ~2;
_vm->_eventsManager._intPtr.field1E = 1;
@@ -1522,6 +1518,7 @@ int ThreadResource::doInterface() {
} while (!_vm->_eventsManager._rightClick && !_vm->shouldQuit() &&
(!_vm->_eventsManager._leftClick || regionIndex == -1));
+ _vm->_eventsManager.hideCursor();
_vm->_voy._field478 |= 1;
_vm->_bVoy->freeBoltGroup(_vm->_playStamp1);
if (_vm->_playStamp2 != -1)
@@ -1530,6 +1527,36 @@ int ThreadResource::doInterface() {
return !_vm->_eventsManager._rightClick ? regionIndex : -2;
}
+bool ThreadResource::checkMansionScroll() {
+ Common::Point pt = _vm->_eventsManager.getMousePos() -
+ Common::Point(MANSION_VIEW_X, MANSION_VIEW_Y);
+ Common::Point &viewPos = _vm->_mansionViewPos;
+ bool result = false;
+
+ // Scroll mansion view if close to any of the mansion edges
+ if (pt.x >= 0 && pt.x < MANSION_SCROLL_AREA_X && viewPos.x > 0) {
+ viewPos.x = MAX(viewPos.x - MANSION_SCROLL_INC_X, 0);
+ result = true;
+ }
+ if (pt.x >= (MANSION_VIEW_WIDTH - MANSION_SCROLL_AREA_X) &&
+ pt.x < MANSION_VIEW_WIDTH && viewPos.x < MANSION_MAX_X) {
+ viewPos.x = MIN(viewPos.x + MANSION_SCROLL_INC_X, MANSION_MAX_X);
+ result = true;
+ }
+ if (pt.y >= 0 && pt.y < MANSION_SCROLL_AREA_Y && viewPos.y > 0) {
+ viewPos.y = MAX(viewPos.y - MANSION_SCROLL_INC_Y, 0);
+ result = true;
+ }
+ if (pt.y >= (MANSION_VIEW_HEIGHT - MANSION_SCROLL_AREA_Y) &&
+ pt.y < MANSION_VIEW_HEIGHT && viewPos.y < MANSION_MAX_Y) {
+ viewPos.y = MIN(viewPos.y + MANSION_SCROLL_INC_Y, MANSION_MAX_Y);
+ result = true;
+ }
+
+ // Return whether mansion view area has changed
+ return result;
+}
+
bool ThreadResource::goToStateID(int stackId, int sceneId) {
debugC(DEBUG_BASIC, kDebugScripts, "goToStateID - %d, %d", stackId, sceneId);
diff --git a/engines/voyeur/voyeur.cpp b/engines/voyeur/voyeur.cpp
index fa9b12e70f..cf4a1352f2 100644
--- a/engines/voyeur/voyeur.cpp
+++ b/engines/voyeur/voyeur.cpp
@@ -51,6 +51,7 @@ VoyeurEngine::VoyeurEngine(OSystem *syst, const VoyeurGameDescription *gameDesc)
_flashTimeFlag = false;
_timeBarVal = -1;
_checkPhoneVal = 0;
+ _mansionScrollCountdown = 0;
initialiseManagers();
}
diff --git a/engines/voyeur/voyeur.h b/engines/voyeur/voyeur.h
index 8cf13259dc..209f5ec303 100644
--- a/engines/voyeur/voyeur.h
+++ b/engines/voyeur/voyeur.h
@@ -52,6 +52,18 @@ namespace Voyeur {
#define MAX_RESOLVE 1000
+// Maximum scroll x, y for viewing the mansion
+#define MANSION_MAX_X 784
+#define MANSION_MAX_Y 150
+#define MANSION_VIEW_X 40
+#define MANSION_VIEW_Y 27
+#define MANSION_VIEW_WIDTH 240
+#define MANSION_VIEW_HEIGHT 148
+#define MANSION_SCROLL_AREA_X 20
+#define MANSION_SCROLL_AREA_Y 10
+#define MANSION_SCROLL_INC_X 4
+#define MANSION_SCROLL_INC_Y 2
+
enum VoyeurDebugChannels {
kDebugPath = 1 << 0,
kDebugScripts = 1 << 1
@@ -156,6 +168,8 @@ public:
bool _flashTimeFlag;
int _timeBarVal;
int _checkPhoneVal;
+ Common::Point _mansionViewPos;
+ int _mansionScrollCountdown;
public:
VoyeurEngine(OSystem *syst, const VoyeurGameDescription *gameDesc);
virtual ~VoyeurEngine();
diff --git a/engines/voyeur/voyeur_game.cpp b/engines/voyeur/voyeur_game.cpp
index dab7149c2a..73484d72e9 100644
--- a/engines/voyeur/voyeur_game.cpp
+++ b/engines/voyeur/voyeur_game.cpp
@@ -1021,7 +1021,10 @@ void VoyeurEngine::initIFace(){
CMapResource *pal = _bVoy->boltEntry(_playStamp1 + 2)._cMapResource;
pal->startFade();
- doScroll(_eventsManager.getMousePos());
+ // Start the mansion off centered
+ _mansionViewPos = Common::Point((MANSION_MAX_X - MANSION_VIEW_WIDTH) / 2,
+ (MANSION_MAX_Y - MANSION_VIEW_HEIGHT) / 2);
+ doScroll(_mansionViewPos);
_voy._viewBounds = _bVoy->boltEntry(_playStamp1)._rectResource;