aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/neverhood/module1000.cpp51
-rw-r--r--engines/neverhood/module1000.h12
-rw-r--r--engines/neverhood/mouse.cpp155
-rw-r--r--engines/neverhood/mouse.h13
-rw-r--r--engines/neverhood/sprite.cpp14
-rw-r--r--engines/neverhood/sprite.h6
-rw-r--r--engines/neverhood/staticdata.cpp27
-rw-r--r--engines/neverhood/staticdata.h14
8 files changed, 272 insertions, 20 deletions
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index 04059caf7d..bb15998063 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -790,17 +790,17 @@ uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam &param,
switch (messageNum) {
case 0x4808:
setGlobalVar(0x8306F218, 1);
- SetSpriteCallback(&AsScene1002Door::spriteUpdate447D10);
+ SetSpriteCallback(&AsScene1002Door::suOpenDoor);
break;
case 0x4809:
setGlobalVar(0x8306F218, 0);
- SetSpriteCallback(&AsScene1002Door::spriteUpdate447D40);
+ SetSpriteCallback(&AsScene1002Door::suCloseDoor);
break;
}
return messageResult;
}
-void AsScene1002Door::spriteUpdate447D10() {
+void AsScene1002Door::suOpenDoor() {
if (_y > 49) {
_y -= 8;
if (_y < 49) {
@@ -811,7 +811,7 @@ void AsScene1002Door::spriteUpdate447D10() {
}
}
-void AsScene1002Door::spriteUpdate447D40() {
+void AsScene1002Door::suCloseDoor() {
if (_y < 239) {
_y += 8;
if (_y > 239) {
@@ -1332,6 +1332,36 @@ void Class506::sub4492C0() {
setFileHash1();
}
+Class478::Class478(NeverhoodEngine *vm, Klayman *klayman)
+ : AnimatedSprite(vm, 1200), _klayman(klayman) {
+
+ createSurface(1200, 40, 163);
+ SetUpdateHandler(&Class478::update);
+ SetMessageHandler(&Sprite::handleMessage);
+ _surface->setVisible(false);
+}
+
+void Class478::update() {
+ if (_klayman->getCurrAnimFileHash() == 0x3A292504) {
+ setFileHash(0xBA280522, _frameIndex, -1);
+ _newHashListIndex = _klayman->getFrameIndex();
+ _surface->setVisible(true);
+ _x = _klayman->getX();
+ _y = _klayman->getY();
+ setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
+ } else if (_klayman->getCurrAnimFileHash() == 0x122D1505) {
+ setFileHash(0x1319150C, _frameIndex, -1);
+ _newHashListIndex = _klayman->getFrameIndex();
+ _surface->setVisible(true);
+ _x = _klayman->getX();
+ _y = _klayman->getY();
+ setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0);
+ } else {
+ _surface->setVisible(false);
+ }
+ AnimatedSprite::update();
+}
+
Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
: Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm),
_flag1B4(false), _flag1BE(false) {
@@ -1373,36 +1403,39 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which)
_class599 = addSprite(new Class599(_vm, this));
+ // DEBUG/HACK!!!!
+ which = 1; setGlobalVar(0x8306F218, 1);
+
if (which < 0) {
if (_vm->_gameState.field2 == 0) {
_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
- //_class478 = addSprite(new Class478(_vm, _klayman));
+ _class478 = addSprite(new Class478(_vm, _klayman));
setMessageList(0x004B4270);
// TODO
_klayman->setRepl(64, 0);
} else {
_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435);
- //_class478 = addSprite(new Class478(_vm, _klayman));
+ _class478 = addSprite(new Class478(_vm, _klayman));
setMessageList(0x004B4270);
// TODO
}
} else {
if (which == 1) {
_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435);
- //_class478 = addSprite(new Class478(_vm, _klayman));
+ _class478 = addSprite(new Class478(_vm, _klayman));
setMessageList(0x004B4478);
// TODO
_vm->_gameState.field2 = 1;
} else if (which == 2) {
_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645);
- //_class478 = addSprite(new Class478(_vm, _klayman));
+ _class478 = addSprite(new Class478(_vm, _klayman));
setMessageList(0x004B4298);
// TODO
_vm->_gameState.field2 = 1;
_klayman->sendMessage(0x4820, 0, this);
} else {
_klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226);
- //_class478 = addSprite(new Class478(_vm, _klayman));
+ _class478 = addSprite(new Class478(_vm, _klayman));
setMessageList(0x004B4470);
// TODO
//_class479 = addSprite(new Class479(_vm, this, _klayman));
diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h
index 79a4985ffc..51cb9a4126 100644
--- a/engines/neverhood/module1000.h
+++ b/engines/neverhood/module1000.h
@@ -172,8 +172,8 @@ public:
protected:
void update();
uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
- void spriteUpdate447D10();
- void spriteUpdate447D40();
+ void suOpenDoor();
+ void suCloseDoor();
};
class Class505 : public AnimatedSprite {
@@ -254,6 +254,14 @@ protected:
void sub4492C0();
};
+class Class478 : public AnimatedSprite {
+public:
+ Class478(NeverhoodEngine *vm, Klayman *klayman);
+protected:
+ Klayman *_klayman;
+ void update();
+};
+
class Scene1002 : public Scene {
public:
Scene1002(NeverhoodEngine *vm, Module *parentModule, int which);
diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp
index 381f4a7186..63d98666d6 100644
--- a/engines/neverhood/mouse.cpp
+++ b/engines/neverhood/mouse.cpp
@@ -224,4 +224,159 @@ void Mouse435::updateCursor() {
}
+// NavigationMouse
+
+NavigationMouse::NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type)
+ : StaticSprite(vm, 2000), _mouseCursorResource(vm), _type(type), _frameNum(0) {
+
+ _mouseCursorResource.load(fileHash);
+ _mouseCursorResource.setCursorNum(0);
+ _x = _vm->getMouseX();
+ _y = _vm->getMouseY();
+ createSurface(2000, 32, 32);
+ SetUpdateHandler(&NavigationMouse::update);
+ SetMessageHandler(&NavigationMouse::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 NavigationMouse::update() {
+ updateCursor();
+ _frameNum++;
+ if (_frameNum >= 6)
+ _frameNum = 0;
+ _needRefresh = _frameNum % 2 == 0;
+}
+
+uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
+ uint32 messageResult = 0;
+ switch (messageNum) {
+ case 0x2064:
+ _x = param.asPoint().x;
+ _y = param.asPoint().y;
+ switch (_type) {
+ case 1:
+ if (_x >= 320)
+ messageResult = 1;
+ else
+ messageResult = 0;
+ break;
+ case 2:
+ default:
+ if (_x < 100)
+ messageResult = 0;
+ else if (_x > 540)
+ messageResult = 1;
+ else
+ messageResult = 2;
+ break;
+ case 3:
+ if (_x < 100)
+ messageResult = 0;
+ else if (_x > 540)
+ messageResult = 1;
+ else
+ messageResult = 4;
+ break;
+ case 4:
+ if (_x < 100)
+ messageResult = 0;
+ else if (_x > 540)
+ messageResult = 1;
+ else if (_y >= 150)
+ messageResult = 2;
+ else
+ messageResult = 3;
+ break;
+ case 5:
+ if (_y >= 240)
+ messageResult = 4;
+ else
+ messageResult = 3;
+ break;
+ }
+ break;
+ case 0x4002:
+ _x = param.asPoint().x;
+ _y = param.asPoint().y;
+ switch (_type) {
+ case 1:
+ if (_x >= 320)
+ _mouseCursorResource.setCursorNum(6);
+ else
+ _mouseCursorResource.setCursorNum(5);
+ break;
+ case 2:
+ default:
+ if (_x < 100)
+ _mouseCursorResource.setCursorNum(6);
+ else if (_x > 540)
+ _mouseCursorResource.setCursorNum(5);
+ else
+ _mouseCursorResource.setCursorNum(0);
+ break;
+ case 3:
+ if (_x < 100)
+ _mouseCursorResource.setCursorNum(1);
+ else if (_x > 540)
+ _mouseCursorResource.setCursorNum(1);
+ break;
+ case 4:
+ if (_x < 100)
+ _mouseCursorResource.setCursorNum(6);
+ else if (_x > 540)
+ _mouseCursorResource.setCursorNum(5);
+ else if (_y >= 150)
+ _mouseCursorResource.setCursorNum(0);
+ else
+ _mouseCursorResource.setCursorNum(3);
+ break;
+ case 5:
+ if (_y >= 240)
+ _mouseCursorResource.setCursorNum(2);
+ else
+ _mouseCursorResource.setCursorNum(3);
+ break;
+ }
+ _needRefresh = true;
+ processDelta();
+ break;
+ }
+ return messageResult;
+}
+
+void NavigationMouse::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);
+ } else {
+ _surface->getDrawRect().y = filterY(_y + _drawRect.y);
+ }
+
+ if (_needRefresh) {
+ _needRefresh = false;
+ _drawRect = _mouseCursorResource.getRect();
+ _surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2);
+ }
+
+}
+
} // End of namespace Neverhood
diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h
index 4bda936a91..4f27cb4e95 100644
--- a/engines/neverhood/mouse.h
+++ b/engines/neverhood/mouse.h
@@ -57,6 +57,19 @@ protected:
void updateCursor();
};
+class NavigationMouse : public StaticSprite {
+public:
+ NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type);
+ void load(uint32 fileHash);
+protected:
+ MouseCursorResource _mouseCursorResource;
+ int _frameNum;
+ int _type;
+ void update();
+ uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
+ void updateCursor();
+};
+
} // End of namespace Neverhood
#endif /* NEVERHOOD_MOUSE_H */
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 78c780bdbb..4996bdd28a 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -286,11 +286,11 @@ void AnimatedSprite::updateAnim() {
if (_fileHash2 != 0) {
if (_animResource.loadInternal(_fileHash2)) {
- _fileHash3 = _fileHash2;
+ _currAnimFileHash = _fileHash2;
} else {
debug("TODO");
// TODO _animResource.loadInternal(calcHash("sqDefault"));
- _fileHash3 = 0;
+ _currAnimFileHash = 0;
}
if (_replOldColor != _replNewColor) {
_animResource.setRepl(_replOldColor, _replNewColor);
@@ -318,11 +318,11 @@ void AnimatedSprite::updateAnim() {
} else {
if (_animStatus == 1) {
if (_animResource.loadInternal(_fileHash1)) {
- _fileHash3 = _fileHash1;
+ _currAnimFileHash = _fileHash1;
} else {
debug("TODO");
// TODO _animResource.loadInternal(calcHash("sqDefault"));
- _fileHash3 = 0;
+ _currAnimFileHash = 0;
}
if (_replOldColor != _replNewColor) {
_animResource.setRepl(_replOldColor, _replNewColor);
@@ -332,11 +332,11 @@ void AnimatedSprite::updateAnim() {
_frameIndex2 = _fileHash5 != 0 ? MAX<int16>(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1;
} else {
if (_animResource.loadInternal(_fileHash1)) {
- _fileHash3 = _fileHash1;
+ _currAnimFileHash = _fileHash1;
} else {
debug("TODO");
// TODO _animResource.loadInternal(calcHash("sqDefault"));
- _fileHash3 = 0;
+ _currAnimFileHash = 0;
}
if (_replOldColor != _replNewColor) {
_animResource.setRepl(_replOldColor, _replNewColor);
@@ -386,7 +386,7 @@ void AnimatedSprite::updatePosition() {
void AnimatedSprite::updateFrameIndex() {
if (!_playBackwards) {
- //debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _fileHash3, _frameIndex, _frameIndex2);
+ //debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _currAnimFileHash, _frameIndex, _frameIndex2);
if (_frameIndex < _frameIndex2) {
_frameIndex++;
} else {
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 71660ff985..f1d8a87b69 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -52,6 +52,7 @@ public:
bool isDoDeltaX() const { return _doDeltaX; }
bool isDoDeltaY() const { return _doDeltaY; }
NRect& getRect() { return _rect; }
+ uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
protected:
void (Sprite::*_spriteUpdateCb)();
Common::String _spriteUpdateCbName; // For debugging purposes
@@ -70,7 +71,6 @@ protected:
//0000004A field4A dw ? // seems to be unused except in ctor
//0000004C rectResource RectResource ?
//void update();
- uint32 handleMessage(int messageNum, const MessageParam &param, Entity *sender);
void createSurface(int surfacePriority, int16 width, int16 height);
void handleSpriteUpdate() {
if (_spriteUpdateCb)
@@ -109,12 +109,14 @@ public:
void updateDeltaXY();
void setRepl(byte oldColor, byte newColor);
void clearRepl();
+ uint32 getCurrAnimFileHash() const { return _currAnimFileHash; }
+ int16 getFrameIndex() const { return _frameIndex; }
protected:
typedef void (AnimatedSprite::*AnimationCb)();
AnimResource _animResource;
+ uint32 _currAnimFileHash;
uint32 _fileHash1;
uint32 _fileHash2;
- uint32 _fileHash3;
int16 _frameIndex;
int16 _frameIndex3;
int16 _frameIndex2;
diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp
index b9ac232707..42af4975ea 100644
--- a/engines/neverhood/staticdata.cpp
+++ b/engines/neverhood/staticdata.cpp
@@ -104,6 +104,27 @@ void StaticData::load(const char *filename) {
_hitRectLists[id] = hitRectList;
}
+ // Load navigation lists
+ uint32 navigationListsCount = fd.readUint32LE();
+ debug("navigationListsCount: %d", navigationListsCount);
+ for (uint32 i = 0; i < navigationListsCount; i++) {
+ NavigationList *navigationList = new NavigationList();
+ uint32 id = fd.readUint32LE();
+ uint32 itemCount = fd.readUint32LE();
+ for (uint32 itemIndex = 0; itemIndex < itemCount; itemIndex++) {
+ NavigationItem navigationItem;
+ navigationItem.fileHash = fd.readUint32LE();
+ navigationItem.leftSmackerFileHash = fd.readUint32LE();
+ navigationItem.rightSmackerFileHash = fd.readUint32LE();
+ navigationItem.middleSmackerFileHash = fd.readUint32LE();
+ navigationItem.interactive = fd.readByte();
+ navigationItem.middleFlag = fd.readByte();
+ navigationItem.mouseCursorFileHash = fd.readUint32LE();
+ navigationList->push_back(navigationItem);
+ }
+ _navigationLists[id] = navigationList;
+ }
+
}
HitRectList *StaticData::getHitRectList(uint32 id) {
@@ -124,4 +145,10 @@ MessageList *StaticData::getMessageList(uint32 id) {
return _messageLists[id];
}
+NavigationList *StaticData::getNavigationList(uint32 id) {
+ if (!_navigationLists[id])
+ error("StaticData::getNavigationList() NavigationList with id %08X not found", id);
+ return _navigationLists[id];
+}
+
} // End of namespace Neverhood
diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h
index a7d8a65bdd..178e5c9eb5 100644
--- a/engines/neverhood/staticdata.h
+++ b/engines/neverhood/staticdata.h
@@ -56,6 +56,18 @@ struct MessageItem {
typedef Common::Array<MessageItem> MessageList;
+struct NavigationItem {
+ uint32 fileHash;
+ uint32 leftSmackerFileHash;
+ uint32 rightSmackerFileHash;
+ uint32 middleSmackerFileHash;
+ byte interactive;
+ byte middleFlag;
+ uint32 mouseCursorFileHash;
+};
+
+typedef Common::Array<NavigationItem> NavigationList;
+
class StaticData {
public:
StaticData();
@@ -64,10 +76,12 @@ public:
HitRectList *getHitRectList(uint32 id);
RectList *getRectList(uint32 id);
MessageList *getMessageList(uint32 id);
+ NavigationList *getNavigationList(uint32 id);
protected:
Common::HashMap<uint32, HitRectList*> _hitRectLists;
Common::HashMap<uint32, RectList*> _rectLists;
Common::HashMap<uint32, MessageList*> _messageLists;
+ Common::HashMap<uint32, NavigationList*> _navigationLists;
};
} // End of namespace Neverhood