aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/neverhood/diskplayerscene.cpp28
-rw-r--r--engines/neverhood/gamemodule.cpp4
-rw-r--r--engines/neverhood/menumodule.cpp12
-rw-r--r--engines/neverhood/module1000.cpp60
-rw-r--r--engines/neverhood/module1100.cpp28
-rw-r--r--engines/neverhood/module1200.cpp15
-rw-r--r--engines/neverhood/module1300.cpp4
-rw-r--r--engines/neverhood/module1400.cpp2
-rw-r--r--engines/neverhood/module1700.cpp2
-rw-r--r--engines/neverhood/module1900.cpp21
-rw-r--r--engines/neverhood/module2100.cpp9
-rw-r--r--engines/neverhood/module2200.cpp69
-rw-r--r--engines/neverhood/module2400.cpp6
-rw-r--r--engines/neverhood/module2500.cpp11
-rw-r--r--engines/neverhood/module2600.cpp15
-rw-r--r--engines/neverhood/module2700.cpp8
-rw-r--r--engines/neverhood/module2800.cpp157
-rw-r--r--engines/neverhood/module2900.cpp46
-rw-r--r--engines/neverhood/module3000.cpp98
-rw-r--r--engines/neverhood/sprite.cpp72
-rw-r--r--engines/neverhood/sprite.h16
21 files changed, 190 insertions, 493 deletions
diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp
index 75755ddeee..572074bd18 100644
--- a/engines/neverhood/diskplayerscene.cpp
+++ b/engines/neverhood/diskplayerscene.cpp
@@ -165,7 +165,7 @@ AsDiskplayerSceneKey::AsDiskplayerSceneKey(NeverhoodEngine *vm)
_newStickFrameIndex = 0;
_needRefresh = true;
updatePosition();
- _surface->setVisible(false);
+ setVisible(false);
}
uint32 AsDiskplayerSceneKey::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -183,29 +183,21 @@ void AsDiskplayerSceneKey::stDropKey() {
SetUpdateHandler(&AnimatedSprite::update);
SetMessageHandler(&AsDiskplayerSceneKey::handleMessage);
NextState(&AsDiskplayerSceneKey::stDropKeyDone);
- _surface->setVisible(true);
+ setVisible(true);
}
void AsDiskplayerSceneKey::stDropKeyDone() {
stopAnimation();
SetUpdateHandler(&AnimatedSprite::update);
SetMessageHandler(&Sprite::handleMessage);
- _surface->setVisible(false);
+ setVisible(false);
}
DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene)
: StaticSprite(vm, 1400), _diskplayerScene(diskplayerScene), _isPlaying(false) {
- _spriteResource.load2(0x24A4A664);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _collisionBoundsOffset = _drawOffset;
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- updateBounds();
- _needRefresh = true;
- StaticSprite::update();
- _surface->setVisible(false);
+ loadSprite(0x24A4A664, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
+ setVisible(false);
loadSound(0, 0x44043000);
loadSound(1, 0x44045000);
SetMessageHandler(&DiskplayerPlayButton::handleMessage);
@@ -225,7 +217,7 @@ uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &p
press();
}
}
- StaticSprite::update();
+ updatePosition();
messageResult = 1;
break;
}
@@ -234,8 +226,8 @@ uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &p
void DiskplayerPlayButton::press() {
if (!_isPlaying) {
- _surface->setVisible(true);
- StaticSprite::update();
+ setVisible(true);
+ updatePosition();
playSound(0);
_isPlaying = true;
}
@@ -243,8 +235,8 @@ void DiskplayerPlayButton::press() {
void DiskplayerPlayButton::release() {
if (_isPlaying) {
- _surface->setVisible(false);
- StaticSprite::update();
+ setVisible(false);
+ updatePosition();
playSound(1);
_isPlaying = false;
}
diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp
index 38d8b99c70..f9e734dd8d 100644
--- a/engines/neverhood/gamemodule.cpp
+++ b/engines/neverhood/gamemodule.cpp
@@ -307,8 +307,8 @@ void GameModule::startup() {
#if 1
_vm->gameState().which = 0;
- _vm->gameState().sceneNum = 4;
- createModule(1100, -1);
+ _vm->gameState().sceneNum = 2;
+ createModule(2800, -1);
#endif
#if 0
_vm->gameState().sceneNum = 0;
diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp
index 2e7f85d98c..fdde1a23e0 100644
--- a/engines/neverhood/menumodule.cpp
+++ b/engines/neverhood/menumodule.cpp
@@ -163,12 +163,7 @@ static const uint32 kMainMenuButtonFileHashes[] = {
MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex)
: StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) {
- _spriteResource.load2(kMainMenuButtonFileHashes[_buttonIndex]);
- createSurface(100, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
+ loadSprite(kMainMenuButtonFileHashes[_buttonIndex], kSLFDefDrawOffset | kSLFDefPosition, 100);
// TODO Move to const array
switch (_buttonIndex) {
@@ -202,15 +197,12 @@ MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint but
}
setVisible(false);
- _needRefresh = true;
-
SetUpdateHandler(&MainMenuButton::update);
SetMessageHandler(&MainMenuButton::handleMessage);
-
}
void MainMenuButton::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown != 0 && (--_countdown) == 0) {
setVisible(false);
sendMessage(_parentScene, 0x2000, _buttonIndex);
diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp
index ff26d17467..ac6830edc0 100644
--- a/engines/neverhood/module1000.cpp
+++ b/engines/neverhood/module1000.cpp
@@ -606,32 +606,16 @@ uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam &param
AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect)
: StaticSprite(vm, 1200) {
- _spriteResource.load2(0x1052370F);
- createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ loadSprite(0x1052370F, kSLFDefDrawOffset | kSLFSetPosition, 800, 526, getGlobalVar(V_FLYTRAP_RING_DOOR) ? 49 : 239);
setClipRect(clipRect);
-
- _x = 526;
-
- if (getGlobalVar(V_FLYTRAP_RING_DOOR)) {
- _y = 49;
- } else {
- _y = 239;
- }
-
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-
- _needRefresh = true;
-
SetUpdateHandler(&AsScene1002Door::update);
SetMessageHandler(&AsScene1002Door::handleMessage);
SetSpriteUpdate(NULL);
- StaticSprite::update();
-
}
void AsScene1002Door::update() {
handleSpriteUpdate();
- StaticSprite::update();
+ updatePosition();
}
uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -761,42 +745,22 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene
: StaticSprite(vm, 1100), _parentScene(parentScene), _status(0) {
_soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000;
-
_fileHashes[0] = fileHash1;
_fileHashes[1] = fileHash2;
-
- _spriteResource.load2(fileHash1);
createSurface(surfacePriority, 40, 40);
-
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
-
+ loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
setVisible(false);
- _needRefresh = true;
-
SetUpdateHandler(&SsCommonPressButton::update);
SetMessageHandler(&SsCommonPressButton::handleMessage);
-
}
void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) {
_fileHashes[0] = fileHash1;
_fileHashes[1] = fileHash2;
if (_status == 2) {
- _spriteResource.load2(fileHash2);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _needRefresh = true;
- StaticSprite::update();
+ loadSprite(fileHash2, kSLFDefDrawOffset | kSLFDefPosition);
} else {
- _spriteResource.load2(fileHash1);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _needRefresh = true;
- StaticSprite::update();
+ loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
}
}
@@ -804,21 +768,11 @@ void SsCommonPressButton::update() {
if (_countdown != 0 && (--_countdown) == 0) {
if (_status == 1) {
_status = 2;
- _spriteResource.load2(_fileHashes[1]);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _needRefresh = true;
- StaticSprite::update();
+ loadSprite(_fileHashes[1], kSLFDefDrawOffset | kSLFDefPosition);
_countdown = 4;
} else if (_status == 2) {
_status = 3;
- _spriteResource.load2(_fileHashes[0]);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _needRefresh = true;
- StaticSprite::update();
+ loadSprite(_fileHashes[0], kSLFDefDrawOffset | kSLFDefPosition);
_countdown = 4;
} else if (_status == 3) {
_status = 0;
diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp
index d21e3af2da..afcd698f86 100644
--- a/engines/neverhood/module1100.cpp
+++ b/engines/neverhood/module1100.cpp
@@ -302,19 +302,15 @@ uint32 SsScene1105Button::handleMessage(int messageNum, const MessageParam &para
}
SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y)
- : StaticSprite(vm, fileHash, 200) {
+ : StaticSprite(vm, 0) {
- _x = x;
- _y = y;
- _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
- _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- StaticSprite::update();
+ loadSprite(fileHash, kSLFCenteredDrawOffset | kSLFSetPosition, 200, x, y);
}
void SsScene1105Symbol::hide() {
setVisible(false);
_needRefresh = true;
- StaticSprite::update();
+ updatePosition();
}
SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y)
@@ -338,16 +334,13 @@ uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &p
}
void SsScene1105SymbolDie::loadSymbolSprite() {
- load(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], true, false);
- _drawOffset.x = -(_spriteResource.getDimensions().width / 2);
- _drawOffset.y = -(_spriteResource.getDimensions().height / 2);
- StaticSprite::update();
+ loadSprite(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], kSLFCenteredDrawOffset);
}
void SsScene1105SymbolDie::hide() {
setVisible(false);
_needRefresh = true;
- StaticSprite::update();
+ updatePosition();
}
AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene)
@@ -402,14 +395,7 @@ void AsScene1105TeddyBear::hide() {
SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene)
: StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _flag1(false) {
- _spriteResource.load2(0x8228A46C);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _collisionBoundsOffset = _drawOffset;
- _needRefresh = true;
- updateBounds();
+ loadSprite(0x8228A46C, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
setVisible(false);
loadSound(0, 0x44045140);
SetUpdateHandler(&SsScene1105OpenButton::update);
@@ -417,7 +403,7 @@ SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentS
}
void SsScene1105OpenButton::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown != 0 && (--_countdown == 0)) {
setVisible(false);
sendMessage(_parentScene, 0x2001, 0);
diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp
index 52375881bc..e6442a0585 100644
--- a/engines/neverhood/module1200.cpp
+++ b/engines/neverhood/module1200.cpp
@@ -169,22 +169,11 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi
int16 x = kScene1201PointArray[pointIndex].x;
int16 y = kScene1201PointArray[pointIndex].y;
if (x < 300) {
- _spriteResource.load2(kScene1201TntFileHashList1[elemIndex]);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ loadSprite(kScene1201TntFileHashList1[elemIndex], kSLFDefDrawOffset | kSLFDefPosition, 50);
} else {
- _spriteResource.load2(kScene1201TntFileHashList2[elemIndex]);
- _x = x;
- _y = y;
- _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -_spriteResource.getDimensions().height,
- _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
-
+ loadSprite(kScene1201TntFileHashList2[elemIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 50, x, y);
}
- createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
setClipRect(0, 0, 640, clipY2);
- _needRefresh = true;
- StaticSprite::update();
}
AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash)
diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp
index b623af0791..409e554b2b 100644
--- a/engines/neverhood/module1300.cpp
+++ b/engines/neverhood/module1300.cpp
@@ -370,7 +370,7 @@ SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm)
void SsScene1302Fence::update() {
handleSpriteUpdate();
- StaticSprite::update();
+ updatePosition();
}
uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1533,7 +1533,7 @@ SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int i
setVisible(false);
_x = _spriteResource.getPosition().x + index * 20;
- StaticSprite::update();
+ updatePosition();
}
AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm)
diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp
index cedb283e0b..0693417f22 100644
--- a/engines/neverhood/module1400.cpp
+++ b/engines/neverhood/module1400.cpp
@@ -791,7 +791,7 @@ SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHas
: StaticSprite(vm, fileHash, surfacePriority) {
SetFilterY(&Sprite::defFilterY);
- SetUpdateHandler(&StaticSprite::update);
+ SetUpdateHandler(&StaticSprite::updatePosition);
}
diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp
index f6dea96161..df64e1976a 100644
--- a/engines/neverhood/module1700.cpp
+++ b/engines/neverhood/module1700.cpp
@@ -145,7 +145,7 @@ SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHas
_x = _spriteResource.getPosition().x + symbolIndex * 30;
_y = _spriteResource.getPosition().y + 160;
- StaticSprite::update();
+ updatePosition();
}
SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash)
diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp
index fb98c2e29a..da02243579 100644
--- a/engines/neverhood/module1900.cpp
+++ b/engines/neverhood/module1900.cpp
@@ -455,15 +455,8 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907
: StaticSprite(vm, 1400), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol),
_countdown1(0) {
- _spriteResource.load2(0x64516424);
- createSurface(1400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ loadSprite(0x64516424, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 1400);
setVisible(false);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _collisionBoundsOffset = _drawOffset;
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- updateBounds();
- _needRefresh = true;
loadSound(0, 0x44061000);
SetUpdateHandler(&SsScene1907UpDownButton::update);
SetMessageHandler(&SsScene1907UpDownButton::handleMessage);
@@ -476,7 +469,7 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907
}
void SsScene1907UpDownButton::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown1 != 0 && (--_countdown1 == 0)) {
setVisible(false);
sendMessage(_parentScene, 0x2000, 0);
@@ -490,7 +483,7 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam
if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) {
setVisible(true);
_countdown1 = 4;
- StaticSprite::update();
+ updatePosition();
playSound(0);
}
messageResult = 1;
@@ -500,14 +493,14 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam
void SsScene1907UpDownButton::setToUpPosition() {
_y = _spriteResource.getPosition().y;
- Sprite::updateBounds();
- StaticSprite::update();
+ updateBounds();
+ updatePosition();
}
void SsScene1907UpDownButton::setToDownPosition() {
_y = _spriteResource.getPosition().y + 174;
- Sprite::updateBounds();
- StaticSprite::update();
+ updateBounds();
+ updatePosition();
}
AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm)
diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp
index 879250a624..cbd11b6b4c 100644
--- a/engines/neverhood/module2100.cpp
+++ b/engines/neverhood/module2100.cpp
@@ -165,8 +165,7 @@ SsCommonFloorButton::SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene
_soundFileHash = 0x44141000;
createSurface(1010, 61, 30);
if (_fileHash1) {
- load(_fileHash1, true, true);
- StaticSprite::update();
+ loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
} else
setVisible(false);
}
@@ -175,8 +174,7 @@ void SsCommonFloorButton::update() {
if (_countdown != 0 && (--_countdown == 0)) {
sendMessage(_parentScene, 0x1022, 1010);
if (_fileHash1) {
- load(_fileHash1, true, true);
- StaticSprite::update();
+ loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition);
} else
setVisible(false);
}
@@ -189,8 +187,7 @@ uint32 SsCommonFloorButton::handleMessage(int messageNum, const MessageParam &pa
sendMessage(_parentScene, 0x480B, 0);
setVisible(true);
sendMessage(_parentScene, 0x1022, 990);
- load(_fileHash2, true, true);
- StaticSprite::update();
+ loadSprite(_fileHash2, kSLFDefDrawOffset | kSLFDefPosition);
_countdown = 16;
playSound(0, _soundFileHash);
break;
diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp
index 06cdc1009b..102704af2c 100644
--- a/engines/neverhood/module2200.cpp
+++ b/engines/neverhood/module2200.cpp
@@ -488,13 +488,9 @@ void AsScene2201Door::stCloseDoor() {
SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex)
: StaticSprite(vm, 900) {
- _spriteResource.load2(kSsScene2201PuzzleCubeFileHashes[cubeIndex]);
createSurface(100, 16, 16);
- _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
- _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = kSsScene2201PuzzleCubePoints[positionIndex].x;
- _y = kSsScene2201PuzzleCubePoints[positionIndex].y;
- _needRefresh = true;
+ loadSprite(kSsScene2201PuzzleCubeFileHashes[cubeIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 0,
+ kSsScene2201PuzzleCubePoints[positionIndex].x, kSsScene2201PuzzleCubePoints[positionIndex].y);
}
Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which)
@@ -670,32 +666,26 @@ static const uint32 kSsScene2202PuzzleTileFileHashes2[] = {
SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value)
: StaticSprite(vm, 900), _parentScene(parentScene), _value(value), _tileIndex(tileIndex), _isMoving(false) {
-
+
+ int surfacePriority;
+
SetUpdateHandler(&SsScene2202PuzzleTile::update);
SetMessageHandler(&SsScene2202PuzzleTile::handleMessage);
- _spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]);
- if (_tileIndex >= 0 && _tileIndex <= 2) {
- createSurface(100, 128, 128);
- } else if (_tileIndex >= 3 && _tileIndex <= 5) {
- createSurface(300, 128, 128);
- } else {
- createSurface(500, 128, 128);
- }
- _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
- _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _collisionBoundsOffset = _drawOffset;
- _x = kSsScene2202PuzzleTilePoints[_tileIndex].x;
- _y = kSsScene2202PuzzleTilePoints[_tileIndex].y;
- updateBounds();
- _needRefresh = true;
- StaticSprite::update();
+ if (_tileIndex >= 0 && _tileIndex <= 2)
+ surfacePriority = 100;
+ else if (_tileIndex >= 3 && _tileIndex <= 5)
+ surfacePriority = 300;
+ else
+ surfacePriority = 500;
+ loadSprite(kSsScene2202PuzzleTileFileHashes2[_value], kSLFCenteredDrawOffset | kSLFSetPosition | kSLFDefCollisionBoundsOffset, 0,
+ kSsScene2202PuzzleTilePoints[_tileIndex].x, kSsScene2202PuzzleTilePoints[_tileIndex].y);
loadSound(0, 0x40958621);
loadSound(1, 0x51108241);
}
void SsScene2202PuzzleTile::update() {
handleSpriteUpdate();
- StaticSprite::update();
+ updatePosition();
}
uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -787,10 +777,7 @@ void SsScene2202PuzzleTile::suMoveTileY() {
void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
- _spriteResource.load2(kSsScene2202PuzzleTileFileHashes1[_value]);
- _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
- _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _needRefresh = true;
+ loadSprite(kSsScene2202PuzzleTileFileHashes1[_value], kSLFCenteredDrawOffset);
setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1);
setSubVar(VA_CUBE_POSITIONS, newTileIndex, (uint32)_value);
@@ -866,10 +853,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) {
}
void SsScene2202PuzzleTile::stopMoving() {
- _spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]);
- _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
- _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _needRefresh = true;
+ loadSprite(kSsScene2202PuzzleTileFileHashes2[_value], kSLFCenteredDrawOffset);
SetSpriteUpdate(NULL);
_isMoving = false;
sendMessage(_parentScene, 0x2002, _tileIndex);
@@ -1215,25 +1199,16 @@ SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm)
: StaticSprite(vm, 900) {
SetMessageHandler(&SsScene2205DoorFrame::handleMessage);
- _spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0);
createSurface(1100, 45, 206);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _needRefresh = true;
- StaticSprite::update();
+ loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition);
}
uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
uint32 messageResult = Sprite::handleMessage(messageNum, param, sender);
switch (messageNum) {
case 0x2000:
- _spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _needRefresh = true;
- StaticSprite::update();
+ loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition);
+ break;
}
return messageResult;
}
@@ -1388,7 +1363,7 @@ AsScene2206DoorSpikes::AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHas
void AsScene2206DoorSpikes::update() {
handleSpriteUpdate();
- StaticSprite::update();
+ updatePosition();
}
uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1440,7 +1415,7 @@ AsScene2206Platform::AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash)
void AsScene2206Platform::update() {
handleSpriteUpdate();
- StaticSprite::update();
+ updatePosition();
}
uint32 AsScene2206Platform::handleMessage(int messageNum, const MessageParam &param, Entity *sender) {
@@ -1974,7 +1949,7 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i
_x = 330;
_y = 246 + index * 50;
- StaticSprite::update();
+ updatePosition();
}
Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which)
diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp
index a017c117a8..ccc47d009f 100644
--- a/engines/neverhood/module2400.cpp
+++ b/engines/neverhood/module2400.cpp
@@ -763,8 +763,7 @@ void Scene2402::update() {
if (_countdown != 0 && (--_countdown) == 0) {
if (_pipeStatus >= 10) {
sendMessage(_asDoor, 0x4808, 0);
- _ssDoorFrame->load(0x00B415E0, true, true);
- _ssDoorFrame->update();
+ _ssDoorFrame->loadSprite(0x00B415E0, kSLFDefDrawOffset | kSLFDefPosition);
} else if (_pipeStatus >= 5) {
_countdown = 8;
playPipeSound(kScene2402FileHashes[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]);
@@ -791,8 +790,7 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam &param, Entit
}
break;
case 0x2001:
- _ssDoorFrame->load(0x406C0AE0, true, true);
- _ssDoorFrame->update();
+ _ssDoorFrame->loadSprite(0x406C0AE0, kSLFDefDrawOffset | kSLFDefPosition);
break;
case 0x480B:
if (sender == _ssButton) {
diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp
index 8345a8c3a3..de6e19e48c 100644
--- a/engines/neverhood/module2500.cpp
+++ b/engines/neverhood/module2500.cpp
@@ -485,14 +485,7 @@ void Scene2501::updateKlaymanCliprect() {
SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm)
: StaticSprite(vm, 1400), _countdown(0), _isSoundPlaying(false) {
- _spriteResource.load2(0x070220D9);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _collisionBoundsOffset = _drawOffset;
- updateBounds();
- _needRefresh = true;
+ loadSprite(0x070220D9, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
setVisible(false);
loadSound(0, 0x4600204C);
loadSound(1, 0x408C0034);
@@ -503,7 +496,7 @@ SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm)
}
void SsScene2504Button::update() {
- StaticSprite::update();
+ updatePosition();
if (_isSoundPlaying && !isSoundPlaying(0) && !isSoundPlaying(1)) {
playSound(3);
setVisible(false);
diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp
index 7008a905f4..d1b95be6bb 100644
--- a/engines/neverhood/module2600.cpp
+++ b/engines/neverhood/module2600.cpp
@@ -208,30 +208,19 @@ void Module2600::updateScene() {
SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene)
: StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) {
- _spriteResource.load2(0x825A6923);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ loadSprite(0x825A6923, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
if (!getGlobalVar(V_WATER_RUNNING))
setVisible(false);
-
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _collisionBoundsOffset = _drawOffset;
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- updateBounds();
- _needRefresh = true;
-
loadSound(0, 0x10267160);
loadSound(1, 0x7027FD64);
loadSound(2, 0x44043000);
loadSound(3, 0x44045000);
-
SetUpdateHandler(&SsScene2609Button::update);
SetMessageHandler(&SsScene2609Button::handleMessage);
-
}
void SsScene2609Button::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown != 0 && (--_countdown == 0)) {
if (getGlobalVar(V_WATER_RUNNING)) {
setGlobalVar(V_WATER_RUNNING, 0);
diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp
index c5524fa75a..1e02e64411 100644
--- a/engines/neverhood/module2700.cpp
+++ b/engines/neverhood/module2700.cpp
@@ -510,13 +510,7 @@ static const NPoint kCarShadowOffsets[] = {
SsCommonTrackShadowBackground::SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash)
: StaticSprite(vm, 0) {
- _spriteResource.load2(fileHash);
- createSurface(0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _needRefresh = true;
- StaticSprite::update();
+ loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition, 0);
}
AsCommonCarShadow::AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index)
diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp
index 53ae40c0ea..c42e0331ac 100644
--- a/engines/neverhood/module2800.cpp
+++ b/engines/neverhood/module2800.cpp
@@ -407,10 +407,9 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which)
SetMessageHandler(&Scene2801::handleMessage);
SetUpdateHandler(&Scene::update);
- if (getGlobalVar(V_RADIO_ENABLED) == 0) {
- // Display the disabled radio; only possible when the left door is open
+ // Display the disabled radio; only possible when the left door is open
+ if (!getGlobalVar(V_RADIO_ENABLED))
insertStaticSprite(0x0001264C, 100);
- }
if (which < 0) {
insertKlayman<KmScene2801>(194, 430);
@@ -1013,34 +1012,24 @@ void Scene2803::changeBackground() {
_background->load(0x412A423E);
_palette->addPalette(0x412A423E, 0, 256, 0);
_palette->addBasePalette(0x412A423E, 0, 256, 0);
- _sprite3->load(0xA40EF2FB, false, false);
- _sprite3->update();
- _sprite4->load(0x0C03AA23, false, false);
- _sprite4->update();
- _sprite5->load(0x2A822E2E, false, false);
- _sprite5->update();
- _sprite6->load(0x2603A202, false, false);
- _sprite6->update();
- _sprite7->load(0x24320220, false, false);
- _sprite7->update();
+ _sprite3->loadSprite(0xA40EF2FB);
+ _sprite4->loadSprite(0x0C03AA23);
+ _sprite5->loadSprite(0x2A822E2E);
+ _sprite6->loadSprite(0x2603A202);
+ _sprite7->loadSprite(0x24320220);
_mouseCursor->load(0xA423A41A);
_mouseCursor->updateCursor();
- _sprite8->load(0x3C42022F, false, false);
- _sprite8->update();
- _sprite9->load(0x341A0237, false, false);
- _sprite9->update();
+ _sprite8->loadSprite(0x3C42022F);
+ _sprite9->loadSprite(0x341A0237);
if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) {
- _asTestTubeOne->load(0x66121222, false, false);
- _asTestTubeOne->update();
+ _asTestTubeOne->loadSprite(0x66121222);
} else
sendMessage(_asTestTubeOne, 0x2000, 0);
if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) {
- _asTestTubeTwo->load(0x64330236, false, false);
- _asTestTubeTwo->update();
+ _asTestTubeTwo->loadSprite(0x64330236);
}
if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) {
- _asTestTubeThree->load(0x2E4A22A2, false, false);
- _asTestTubeThree->update();
+ _asTestTubeThree->loadSprite(0x2E4A22A2);
}
_sprite10->setVisible(true);
} else {
@@ -1048,34 +1037,24 @@ void Scene2803::changeBackground() {
_background->load(0x29800A01);
_palette->addPalette(0x29800A01, 0, 256, 0);
_palette->addBasePalette(0x29800A01, 0, 256, 0);
- _sprite3->load(0x234340A0, false, false);
- _sprite3->update();
- _sprite4->load(0x16202200, false, false);
- _sprite4->update();
- _sprite5->load(0x1030169A, false, false);
- _sprite5->update();
- _sprite6->load(0x1600A6A8, false, false);
- _sprite6->update();
- _sprite7->load(0xD0802EA0, false, false);
- _sprite7->update();
+ _sprite3->loadSprite(0x234340A0);
+ _sprite4->loadSprite(0x16202200);
+ _sprite5->loadSprite(0x1030169A);
+ _sprite6->loadSprite(0x1600A6A8);
+ _sprite7->loadSprite(0xD0802EA0);
_mouseCursor->load(0x00A05290);
_mouseCursor->updateCursor();
- _sprite8->load(0x108012C1, false, false);
- _sprite8->update();
- _sprite9->load(0x708072E0, false, false);
- _sprite9->update();
+ _sprite8->loadSprite(0x108012C1);
+ _sprite9->loadSprite(0x708072E0);
if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) {
- _asTestTubeOne->load(0x50C027A8, false, false);
- _asTestTubeOne->update();
+ _asTestTubeOne->loadSprite(0x50C027A8);
} else
sendMessage(_asTestTubeOne, 0x2000, 1);
if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) {
- _asTestTubeTwo->load(0xD48077A0, false, false);
- _asTestTubeTwo->update();
+ _asTestTubeTwo->loadSprite(0xD48077A0);
}
if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) {
- _asTestTubeThree->load(0x30022689, false, false);
- _asTestTubeThree->update();
+ _asTestTubeThree->loadSprite(0x30022689);
}
_sprite10->setVisible(false);
}
@@ -1368,25 +1347,15 @@ void Scene2803Small::updatePaletteArea(bool instantly) {
SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene)
: StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene) {
- if (getGlobalVar(V_SHRINK_LIGHTS_ON))
- _spriteResource.load2(0x51A10202);
- else
- _spriteResource.load2(0x11814A21);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _collisionBoundsOffset = _drawOffset;
- updateBounds();
+ loadSprite(getGlobalVar(V_SHRINK_LIGHTS_ON) ? 0x51A10202 : 0x11814A21, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
setVisible(false);
- _needRefresh = true;
SetUpdateHandler(&SsScene2804RedButton::update);
SetMessageHandler(&SsScene2804RedButton::handleMessage);
loadSound(0, 0x44241240);
}
void SsScene2804RedButton::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown != 0 && (--_countdown) == 0) {
setVisible(false);
}
@@ -1411,14 +1380,8 @@ uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam &p
SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm)
: StaticSprite(vm, 900) {
- _spriteResource.load2(0x8889B008);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
+ loadSprite(0x8889B008, kSLFDefDrawOffset | kSLFDefPosition, 400);
setVisible(false);
- _needRefresh = true;
- StaticSprite::update();
SetMessageHandler(&SsScene2804LightCoil::handleMessage);
}
@@ -1427,12 +1390,12 @@ uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam &p
switch (messageNum) {
case 0x2002:
setVisible(true);
- StaticSprite::update();
+ updatePosition();
messageResult = 1;
break;
case 0x2003:
setVisible(false);
- StaticSprite::update();
+ updatePosition();
messageResult = 1;
break;
}
@@ -1442,14 +1405,8 @@ uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam &p
SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm)
: StaticSprite(vm, 900) {
- _spriteResource.load2(0x06092132);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
+ loadSprite(0x06092132, kSLFDefDrawOffset | kSLFDefPosition, 400);
setVisible(false);
- _needRefresh = true;
- StaticSprite::update();
SetMessageHandler(&SsScene2804LightTarget::handleMessage);
}
@@ -1458,12 +1415,12 @@ uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam
switch (messageNum) {
case 0x2004:
setVisible(true);
- StaticSprite::update();
+ updatePosition();
messageResult = 1;
break;
case 0x2005:
setVisible(false);
- StaticSprite::update();
+ updatePosition();
messageResult = 1;
break;
}
@@ -1473,34 +1430,22 @@ uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam
SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm)
: StaticSprite(vm, 900) {
- _spriteResource.load2(0x211003A0);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
+ loadSprite(0x211003A0, kSLFDefDrawOffset | kSLFDefPosition, 400);
setVisible(false);
- _needRefresh = true;
- StaticSprite::update();
loadSound(0, 0xCB36BA54);
}
void SsScene2804Flash::show() {
setVisible(true);
- StaticSprite::update();
+ updatePosition();
playSound(0);
}
SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm)
: StaticSprite(vm, 900) {
- _spriteResource.load2(0x9A816000);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
+ loadSprite(0x9A816000, kSLFDefDrawOffset | kSLFDefPosition, 400);
setVisible(false);
- _needRefresh = true;
- StaticSprite::update();
}
AsScene2804CrystalWaves::AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex)
@@ -1635,26 +1580,16 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280
0x5008292B
};
- if (getGlobalVar(V_SHRINK_LIGHTS_ON))
- _spriteResource.load2(kSsScene2804CrystalButtonFileHashes1[crystalIndex]);
- else
- _spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]);
-
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _collisionBoundsOffset = _drawOffset;
- updateBounds();
+ loadSprite(getGlobalVar(V_SHRINK_LIGHTS_ON) ? kSsScene2804CrystalButtonFileHashes1[crystalIndex] : kSsScene2804CrystalButtonFileHashes2[crystalIndex],
+ kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
setVisible(false);
loadSound(0, 0x44045140);
- _needRefresh = true;
SetUpdateHandler(&SsScene2804CrystalButton::update);
SetMessageHandler(&SsScene2804CrystalButton::handleMessage);
}
void SsScene2804CrystalButton::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown != 0 && (--_countdown) == 0) {
setVisible(false);
}
@@ -1721,7 +1656,7 @@ uint32 AsScene2804BeamCoil::handleMessage(int messageNum, const MessageParam &pa
void AsScene2804BeamCoil::show() {
_ssBeamCoilBody->setVisible(true);
- // TODO _ssBeamCoilBody->update(); -> show()
+ // TODO _ssBeamCoilBody->updatePosition(); -> show()
setVisible(true);
startAnimation(0x00494891, 0, -1);
playSound(0);
@@ -1734,7 +1669,7 @@ void AsScene2804BeamCoil::hide() {
SetMessageHandler(&AsScene2804BeamCoil::handleMessage);
setVisible(false);
_ssBeamCoilBody->setVisible(false);
- // TODO _ssBeamCoilBody->update(); -> hide()
+ // TODO _ssBeamCoilBody->updatePosition(); -> hide()
_vm->_soundMan->stopSound(0xEF56B094);
}
@@ -2242,22 +2177,14 @@ SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentSce
: StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _testTubeSetNum(testTubeSetNum),
_testTubeIndex(testTubeIndex) {
- _spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]);
- createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _collisionBoundsOffset = _drawOffset;
- updateBounds();
+ loadSprite(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex], kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 1500);
+ setVisible(false);
SetUpdateHandler(&SsScene2808Dispenser::update);
SetMessageHandler(&SsScene2808Dispenser::handleMessage);
- setVisible(false);
- _needRefresh = true;
- StaticSprite::update();
}
void SsScene2808Dispenser::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown != 0 && (--_countdown) == 0) {
setVisible(false);
}
@@ -2276,7 +2203,7 @@ uint32 SsScene2808Dispenser::handleMessage(int messageNum, const MessageParam &p
void SsScene2808Dispenser::startCountdown(int index) {
setVisible(true);
- StaticSprite::update();
+ updatePosition();
if (_testTubeSetNum == 0) {
_countdown = kClass428Countdowns1[index];
} else {
diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp
index ae74b14814..4b8f28ea7e 100644
--- a/engines/neverhood/module2900.cpp
+++ b/engines/neverhood/module2900.cpp
@@ -254,24 +254,18 @@ static const uint32 kSsScene2901BigButtonFileHashes[] = {
SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index)
: StaticSprite(vm, 900), _parentScene(parentScene), _index(index), _countdown1(0) {
- _spriteResource.load2(kSsScene2901LocationButtonFileHashes[which * 6 + index]);
- createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _collisionBounds.x1 = kSsScene2901LocationButtonPoints[_index].x - 25;
- _collisionBounds.y1 = kSsScene2901LocationButtonPoints[_index].y - 25;
- _collisionBounds.x2 = kSsScene2901LocationButtonPoints[_index].x + 25;
- _collisionBounds.y2 = kSsScene2901LocationButtonPoints[_index].y + 25;
+ const NPoint &pt = kSsScene2901LocationButtonPoints[_index];
+
+ loadSprite(kSsScene2901LocationButtonFileHashes[which * 6 + index], kSLFDefDrawOffset | kSLFDefPosition, 800);
+ _collisionBounds.set(pt.x - 25, pt.y - 25, pt.x + 25, pt.y + 25);
setVisible(false);
- _needRefresh = true;
loadSound(0, 0x440430C0);
SetUpdateHandler(&SsScene2901LocationButton::update);
SetMessageHandler(&SsScene2901LocationButton::handleMessage);
}
void SsScene2901LocationButton::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown1 != 0 && (--_countdown1) == 0) {
setVisible(false);
}
@@ -296,57 +290,41 @@ uint32 SsScene2901LocationButton::handleMessage(int messageNum, const MessagePar
SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index)
: StaticSprite(vm, 900), _index(index) {
- _spriteResource.load2(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index]);
- createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
+ loadSprite(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index], kSLFDefDrawOffset | kSLFDefPosition, 900);
setVisible(false);
- _needRefresh = true;
loadSound(0, kSsScene2901LocationButtonLightFileHashes2[_index]);
}
void SsScene2901LocationButtonLight::show() {
playSound(0);
setVisible(true);
- StaticSprite::update();
+ updatePosition();
}
void SsScene2901LocationButtonLight::hide() {
setVisible(false);
- StaticSprite::update();
+ updatePosition();
}
SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which)
: StaticSprite(vm, 900) {
- _spriteResource.load2(kSsScene2901BrokenButtonFileHashes[which]);
- createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _needRefresh = true;
- StaticSprite::update();
+ loadSprite(kSsScene2901BrokenButtonFileHashes[which], kSLFDefDrawOffset | kSLFDefPosition, 900);
}
SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which)
: StaticSprite(vm, 900), _parentScene(parentScene), _which(which), _countdown1(0) {
-
- _spriteResource.load2(kSsScene2901BigButtonFileHashes[which]);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
+
+ loadSprite(kSsScene2901BigButtonFileHashes[which], kSLFDefDrawOffset | kSLFDefPosition, 400);
_collisionBounds.set(62, 94, 322, 350);
setVisible(false);
- _needRefresh = true;
loadSound(0, 0xF3D420C8);
SetUpdateHandler(&SsScene2901BigButton::update);
SetMessageHandler(&SsScene2901BigButton::handleMessage);
}
void SsScene2901BigButton::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown1 != 0 && (--_countdown1) == 0) {
setVisible(false);
sendMessage(_parentScene, 0x2000, 0);
diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp
index cb4faafbed..713d72de3f 100644
--- a/engines/neverhood/module3000.cpp
+++ b/engines/neverhood/module3000.cpp
@@ -471,22 +471,15 @@ static const uint32 kSsScene3009SymbolArrowFileHashes2[] = {
SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene)
: StaticSprite(vm, 1400), _parentScene(parentScene), _isClicked(false) {
- _spriteResource.load2(0x120B24B0);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _collisionBoundsOffset = _drawOffset;
+ loadSprite(0x120B24B0, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
setVisible(false);
- updateBounds();
- _needRefresh = true;
SetUpdateHandler(&SsScene3009FireCannonButton::update);
SetMessageHandler(&SsScene3009FireCannonButton::handleMessage);
loadSound(0, 0x3901B44F);
}
void SsScene3009FireCannonButton::update() {
- StaticSprite::update();
+ updatePosition();
if (_isClicked && !isSoundPlaying(0)) {
sendMessage(_parentScene, 0x2000, 0);
setVisible(false);
@@ -511,17 +504,11 @@ uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageP
SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index)
: StaticSprite(vm, 1400), _blinkCountdown(0) {
- _spriteResource.load2(kSsScene3009SymbolEdgesFileHashes[index]);
- createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _needRefresh = true;
- if (getGlobalVar(V_ROBOT_HIT)) {
+ loadSprite(kSsScene3009SymbolEdgesFileHashes[index], kSLFDefDrawOffset | kSLFDefPosition, 600);
+ if (getGlobalVar(V_ROBOT_HIT))
hide();
- } else {
+ else
startBlinking();
- }
SetUpdateHandler(&SsScene3009SymbolEdges::update);
}
@@ -532,7 +519,7 @@ void SsScene3009SymbolEdges::update() {
} else {
setVisible(false);
}
- StaticSprite::update();
+ updatePosition();
_blinkCountdown = 3;
_blinkToggle = !_blinkToggle;
}
@@ -540,19 +527,19 @@ void SsScene3009SymbolEdges::update() {
void SsScene3009SymbolEdges::show() {
setVisible(true);
- StaticSprite::update();
+ updatePosition();
_blinkCountdown = 0;
}
void SsScene3009SymbolEdges::hide() {
setVisible(false);
- StaticSprite::update();
+ updatePosition();
_blinkCountdown = 0;
}
void SsScene3009SymbolEdges::startBlinking() {
setVisible(true);
- StaticSprite::update();
+ updatePosition();
_blinkCountdown = 3;
_blinkToggle = true;
}
@@ -560,18 +547,13 @@ void SsScene3009SymbolEdges::startBlinking() {
SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index)
: StaticSprite(vm, 1400) {
- _spriteResource.load2(kSsScene3009TargetLineFileHashes[index]);
- createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ loadSprite(kSsScene3009TargetLineFileHashes[index], kSLFDefDrawOffset | kSLFDefPosition, 600);
setVisible(false);
- _needRefresh = true;
}
void SsScene3009TargetLine::show() {
setVisible(true);
- StaticSprite::update();
+ updatePosition();
}
SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index)
@@ -579,14 +561,13 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy
_incrDecr = _index % 2;
- _spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]);
createSurface(1200, 33, 31);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
+ loadSprite(kSsScene3009SymbolArrowFileHashes2[_index], kSLFDefPosition);
_drawOffset.set(0, 0, 33, 31);
_collisionBoundsOffset = _drawOffset;
updateBounds();
_needRefresh = true;
+
SetUpdateHandler(&SsScene3009SymbolArrow::update);
SetMessageHandler(&SsScene3009SymbolArrow::handleMessage);
loadSound(0, 0x2C852206);
@@ -598,11 +579,9 @@ void SsScene3009SymbolArrow::hide() {
}
void SsScene3009SymbolArrow::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown != 0 && (--_countdown == 0)) {
- _spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]);
- _needRefresh = true;
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ loadSprite(kSsScene3009SymbolArrowFileHashes2[_index], kSLFDefDrawOffset);
}
}
@@ -612,9 +591,7 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam
case 0x1011:
if (_enabled && _countdown == 0) {
_countdown = 2;
- _spriteResource.load2(kSsScene3009SymbolArrowFileHashes1[_index]);
- _needRefresh = true;
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ loadSprite(kSsScene3009SymbolArrowFileHashes1[_index], kSLFDefDrawOffset);
playSound(0);
sendMessage(_asSymbol, 0x2005, _incrDecr);
}
@@ -1063,22 +1040,13 @@ static const uint32 kAsScene3010DeadBoltFileHashes1[] = {
SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled)
: StaticSprite(vm, 900), _parentScene(parentScene), _buttonLocked(false), _countdown1(0), _countdown2(0), _buttonIndex(buttonIndex) {
- NDimensions dimensions1, dimensions2;
-
_buttonEnabled = getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_buttonIndex]) != 0;
- _spriteResource.load2(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]);
- dimensions1 = _spriteResource.getDimensions();
- _spriteResource.load2(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
- dimensions2 = _spriteResource.getDimensions();
- createSurface(400,
- MAX(dimensions1.width, dimensions2.width),
- MAX(dimensions1.height, dimensions2.height));
+ createSurface(400, 88, 95);
setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]);
- if (initDisabled) {
+ if (initDisabled)
disableButton();
- } else if (_buttonEnabled) {
+ else if (_buttonEnabled)
_countdown1 = initCountdown * 12 + 1;
- }
loadSound(0, 0xF4217243);
loadSound(1, 0x44049000);
loadSound(2, 0x6408107E);
@@ -1116,7 +1084,7 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar
sendMessage(_parentScene, 0x2002, _buttonIndex);
}
_needRefresh = true;
- StaticSprite::update();
+ updatePosition();
}
messageResult = 1;
break;
@@ -1131,14 +1099,7 @@ void SsScene3010DeadBoltButton::disableButton() {
}
void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) {
- _spriteResource.load(fileHash);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _collisionBoundsOffset = _drawOffset;
- updateBounds();
- _needRefresh = true;
- StaticSprite::update();
+ loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset);
}
void SsScene3010DeadBoltButton::setCountdown(int count) {
@@ -1397,26 +1358,15 @@ static const uint32 kAsScene3011SymbolFileHashes[] = {
SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag)
: StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) {
- if (flag) {
- _spriteResource.load2(0x11282020);
- } else {
- _spriteResource.load2(0x994D0433);
- }
- loadSound(0, 0x44061000);
- createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- _collisionBoundsOffset = _drawOffset;
+ loadSprite(flag ? 0x11282020 : 0x994D0433, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400);
setVisible(false);
- updateBounds();
- _needRefresh = true;
+ loadSound(0, 0x44061000);
SetUpdateHandler(&SsScene3011Button::update);
SetMessageHandler(&SsScene3011Button::handleMessage);
}
void SsScene3011Button::update() {
- StaticSprite::update();
+ updatePosition();
if (_countdown != 0 && (--_countdown == 0)) {
setVisible(false);
}
diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp
index 40b651e53b..d034783b03 100644
--- a/engines/neverhood/sprite.cpp
+++ b/engines/neverhood/sprite.cpp
@@ -120,42 +120,43 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority)
}
-StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
+StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y)
: Sprite(vm, 0), _spriteResource(vm) {
- init(calcHash(filename), surfacePriority, x, y, width, height);
-}
-
-StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height)
- : Sprite(vm, 0), _spriteResource(vm) {
-
- init(fileHash, surfacePriority, x, y, width, height);
-}
-
-void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) {
-
_spriteResource.load2(fileHash);
-
- if (width == 0)
- width = _spriteResource.getDimensions().width;
-
- if (height == 0)
- height = _spriteResource.getDimensions().height;
-
- createSurface(surfacePriority, width, height);
-
+ createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
_x = x == kDefPosition ? _spriteResource.getPosition().x : x;
_y = y == kDefPosition ? _spriteResource.getPosition().y : y;
-
- _drawOffset.set(0, 0, width, height);
-
+ _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
_needRefresh = true;
+ updatePosition();
+}
- update();
-
+void StaticSprite::loadSprite(uint32 fileHash, uint flags, int surfacePriority, int16 x, int16 y) {
+ _spriteResource.load2(fileHash);
+ if (!_surface)
+ createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ if (flags & kSLFDefDrawOffset)
+ _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ else if (flags & kSLFCenteredDrawOffset)
+ _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2),
+ _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
+ if (flags & kSLFDefPosition) {
+ _x = _spriteResource.getPosition().x;
+ _y = _spriteResource.getPosition().y;
+ } else if (flags & kSLFSetPosition) {
+ _x = x;
+ _y = y;
+ }
+ if (flags & kSLFDefCollisionBoundsOffset) {
+ _collisionBoundsOffset = _drawOffset;
+ updateBounds();
+ }
+ _needRefresh = true;
+ updatePosition();
}
-void StaticSprite::update() {
+void StaticSprite::updatePosition() {
if (!_surface)
return;
@@ -179,23 +180,6 @@ void StaticSprite::update() {
}
-void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) {
-
- _spriteResource.load2(fileHash);
-
- if (dimensions) {
- _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height);
- }
-
- if (position) {
- _x = _spriteResource.getPosition().x;
- _y = _spriteResource.getPosition().y;
- }
-
- _needRefresh = true;
-
-}
-
// AnimatedSprite
AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, int objectPriority)
diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h
index 7e07f3a412..80da1768bd 100644
--- a/engines/neverhood/sprite.h
+++ b/engines/neverhood/sprite.h
@@ -93,16 +93,22 @@ protected:
}
};
+enum {
+ kSLFDefDrawOffset = 1 << 0,
+ kSLFCenteredDrawOffset = 1 << 1,
+ kSLFDefPosition = 1 << 2,
+ kSLFSetPosition = 1 << 3,
+ kSLFDefCollisionBoundsOffset = 1 << 4
+};
+
class StaticSprite : public Sprite {
public:
StaticSprite(NeverhoodEngine *vm, int objectPriority);
- StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
- StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
- void load(uint32 fileHash, bool dimensions, bool position);
- void update();
+ StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition);
+ void loadSprite(uint32 fileHash, uint flags = 0, int surfacePriority = 0, int16 x = kDefPosition, int16 y = kDefPosition);
+ void updatePosition();
protected:
SpriteResource _spriteResource;
- void init(uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0);
};
#define AnimationCallback(callback) static_cast <void (AnimatedSprite::*)()> (callback)