aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/graphics.cpp
diff options
context:
space:
mode:
authorMatthew Stewart2018-05-16 18:21:34 -0400
committerEugene Sandulenko2018-08-09 08:37:30 +0200
commit2120ce106210538c9508be1e275bdba97ddda63a (patch)
treee255e695c4c0253fba4545fa935f0c450a5ef1b2 /engines/startrek/graphics.cpp
parent2731ae228795ca1a8d823f147212ef5c22261598 (diff)
downloadscummvm-rg350-2120ce106210538c9508be1e275bdba97ddda63a.tar.gz
scummvm-rg350-2120ce106210538c9508be1e275bdba97ddda63a.tar.bz2
scummvm-rg350-2120ce106210538c9508be1e275bdba97ddda63a.zip
STARTREK: Action menu
Diffstat (limited to 'engines/startrek/graphics.cpp')
-rw-r--r--engines/startrek/graphics.cpp63
1 files changed, 57 insertions, 6 deletions
diff --git a/engines/startrek/graphics.cpp b/engines/startrek/graphics.cpp
index ec3c4d0d4d..cf1fa7f4ed 100644
--- a/engines/startrek/graphics.cpp
+++ b/engines/startrek/graphics.cpp
@@ -51,8 +51,9 @@ Graphics::Graphics(StarTrekEngine *vm) : _vm(vm), _egaMode(false) {
_lutData = new byte[256 * 3];
_paletteFadeLevel = 0;
+ _mouseLocked = false;
- setMouseCursor(loadBitmap("pushbtn"));
+ setMouseBitmap(loadBitmap("pushbtn"));
CursorMan.showMouse(true);
}
@@ -180,9 +181,58 @@ Common::Point Graphics::getMousePos() {
return _vm->_system->getEventManager()->getMousePos();
}
-void Graphics::setMouseCursor(SharedPtr<Bitmap> bitmap) {
+void Graphics::setMouseBitmap(SharedPtr<Bitmap> bitmap) {
_mouseBitmap = bitmap;
_vm->_system->setMouseCursor(bitmap->pixels, bitmap->width, bitmap->height, bitmap->xoffset, bitmap->yoffset, 0);
+
+ if (_mouseLocked) {
+ _lockedMouseSprite.setBitmap(_mouseBitmap);
+ drawAllSprites(false);
+ }
+}
+
+/**
+ * This function is a workaround for when the mouse position needs to be locked in a set
+ * position (used in the action menu). This only affects the position it is drawn at; the
+ * sprite's "real" position is still updated normally.
+ *
+ * This does not call updateScreen.
+ */
+void Graphics::lockMousePosition(int16 x, int16 y) {
+ if (_mouseLocked) {
+ if (x != _lockedMouseSprite.pos.x || y != _lockedMouseSprite.pos.y) {
+ _lockedMouseSprite.pos.x = x;
+ _lockedMouseSprite.pos.y = y;
+ _lockedMouseSprite.bitmapChanged = true;
+ drawAllSprites(false);
+ }
+ return;
+ }
+
+ CursorMan.showMouse(false);
+ _mouseLocked = true;
+
+ _lockedMouseSprite = Sprite();
+ _lockedMouseSprite.setBitmap(_mouseBitmap);
+ _lockedMouseSprite.drawPriority = 15;
+ _lockedMouseSprite.drawPriority2 = 16;
+ _lockedMouseSprite.pos.x = x;
+ _lockedMouseSprite.pos.y = y;
+
+ addSprite(&_lockedMouseSprite);
+ drawAllSprites(false);
+}
+
+void Graphics::unlockMousePosition() {
+ if (!_mouseLocked)
+ return;
+
+ _mouseLocked = false;
+ CursorMan.showMouse(true);
+
+ _lockedMouseSprite.dontDrawNextFrame();
+ drawAllSprites();
+ delSprite(&_lockedMouseSprite);
}
void Graphics::drawSprite(const Sprite &sprite) {
@@ -340,14 +390,14 @@ void Graphics::drawSprite(const Sprite &sprite, const Common::Rect &rect) {
bool compareSpritesByLayer(Sprite *s1, Sprite *s2) {
if (s1->drawPriority != s2->drawPriority)
return s1->drawPriority < s2->drawPriority;
- if (s1->field6 != s2->field6)
- return s1->field6 < s2->field6;
+ if (s1->drawPriority2 != s2->drawPriority2)
+ return s1->drawPriority2 < s2->drawPriority2;
if (s1->pos.y != s2->pos.y)
return s1->pos.y < s2->pos.y;
return s1->pos.x < s2->pos.x;
}
-void Graphics::drawAllSprites() {
+void Graphics::drawAllSprites(bool updateScreen) {
// TODO: different video modes?
if (_numSprites == 0)
@@ -458,7 +508,8 @@ void Graphics::drawAllSprites() {
spr->lastDrawRect = spr->drawRect;
}
- _vm->_system->updateScreen();
+ if (updateScreen)
+ _vm->_system->updateScreen();
}
void Graphics::addSprite(Sprite *sprite) {