aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/neverhood/module1000.cpp2
-rw-r--r--engines/neverhood/mouse.cpp98
-rw-r--r--engines/neverhood/mouse.h14
3 files changed, 112 insertions, 2 deletions
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 547f8c1ee0..bc52cfd573 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -629,7 +629,7 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF
_background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0));
_palette = new Palette(_vm, backgroundFileHash);
_palette->usePalette();
- // TODO _mouseCursor = addSprite(new Class435(_vm, cursorFileHash, 20, 620));
+ _mouseCursor = addSprite(new Mouse435(_vm, cursorFileHash, 20, 620));
}
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index 5693048ed5..c753183269 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -112,7 +112,103 @@ void Mouse433::updateCursor() {
_surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1);
} else {
_surface->getDrawRect().x = filterX(_x + _drawRect.x);
- }
+ }
+
+ if (_doDeltaY) {
+ _surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1);
+ } else {
+ _surface->getDrawRect().y = filterY(_y + _drawRect.y);
+ }
+
+ if (_needRefresh) {
+ _needRefresh = false;
+ _drawRect = _mouseCursorResource.getRect();
+ _surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2);
+ }
+
+}
+
+Mouse435::Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2)
+ : StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) {
+
+ debug("Mouse435::Mouse435(%08X)", fileHash);
+
+ _mouseCursorResource.load(fileHash);
+ _x = _vm->getMouseX();
+ _y = _vm->getMouseY();
+ if (_x <= _x1) {
+ _mouseCursorResource.setCursorNum(6);
+ } else if (_x >= _x2) {
+ _mouseCursorResource.setCursorNum(5);
+ } else {
+ _mouseCursorResource.setCursorNum(4);
+ }
+ createSurface(2000, 32, 32);
+ SetUpdateHandler(&Mouse435::update);
+ SetMessageHandler(&Mouse435::handleMessage);
+ _drawRect.x = 0;
+ _drawRect.y = 0;
+ _drawRect.width = 32;
+ _drawRect.height = 32;
+ _deltaRect.x = 0;
+ _deltaRect.y = 0;
+ _deltaRect.width = 32;
+ _deltaRect.height = 32;
+ processDelta();
+ _needRefresh = true;
+ updateCursor();
+}
+
+void Mouse435::load(uint32 fileHash) {
+ _mouseCursorResource.load(fileHash);
+ _needRefresh = true;
+}
+
+void Mouse435::update() {
+ debug("Mouse435::update()");
+ updateCursor();
+ _frameNum++;
+ if (_frameNum >= 6)
+ _frameNum = 0;
+ _needRefresh = _frameNum % 2 == 0;
+}
+
+uint32 Mouse435::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+ debug("Mouse435::handleMessage(%04X)", messageNum);
+ uint32 messageResult = 0;
+ if (messageNum != 5) {
+ messageResult = Sprite::handleMessage(messageNum, param, sender);
+ switch (messageNum) {
+ case 0x4002:
+ _x = param.asPoint().x;
+ _y = param.asPoint().y;
+ if (_x <= _x1) {
+ _mouseCursorResource.setCursorNum(6);
+ } else if (_x >= _x2) {
+ _mouseCursorResource.setCursorNum(5);
+ } else {
+ _mouseCursorResource.setCursorNum(4);
+ }
+ processDelta();
+ break;
+ }
+ } else {
+ // TODO: Debug stuff
+ }
+ return messageResult;
+}
+
+void Mouse435::updateCursor() {
+ debug("Mouse435::updateCursor()");
+
+ if (!_surface)
+ return;
+
+ if (_doDeltaX) {
+ _surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1);
+ } else {
+ _surface->getDrawRect().x = filterX(_x + _drawRect.x);
+ }
if (_doDeltaY) {
_surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1);
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
index d03588f4e0..4bda936a91 100644
--- a/engines/neverhood/mouse.h
+++ b/engines/neverhood/mouse.h
@@ -43,6 +43,20 @@ protected:
void updateCursor();
};
+class Mouse435 : public StaticSprite {
+public:
+ Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2);
+ void load(uint32 fileHash);
+protected:
+ MouseCursorResource _mouseCursorResource;
+ int _frameNum;
+ int16 _x1;
+ int16 _x2;
+ void update();
+ uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+ void updateCursor();
+};
+
} // End of namespace Neverhood
#endif /* NEVERHOOD_MOUSE_H */