[Scummvm-git-logs] scummvm master -> 5118fa466ff4a6037d8b404325ae0b39e5ffd298
yuv422
noreply at scummvm.org
Sat Oct 12 12:25:40 UTC 2024
This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
3bf0db4283 DARKSEED: Move and rename player flip sprite state var.
9611f50320 DARKSEED: Add doll cutscene.
84c243376f DARKSEED: Add book & nightmare2 scenes.
5118fa466f DARKSEED: Started work on nightmare 3 cutscene
Commit: 3bf0db4283a001a2f13bed37e1d611ff9618ee4a
https://github.com/scummvm/scummvm/commit/3bf0db4283a001a2f13bed37e1d611ff9618ee4a
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-10-12T23:25:36+11:00
Commit Message:
DARKSEED: Move and rename player flip sprite state var.
Changed paths:
engines/darkseed/animation.cpp
engines/darkseed/darkseed.cpp
engines/darkseed/darkseed.h
engines/darkseed/player.cpp
engines/darkseed/player.h
diff --git a/engines/darkseed/animation.cpp b/engines/darkseed/animation.cpp
index 609db394d85..e8bc745312c 100644
--- a/engines/darkseed/animation.cpp
+++ b/engines/darkseed/animation.cpp
@@ -41,7 +41,7 @@ void Animation::setupOtherNspAnimation(int nspAnimIdx, int animId) {
_isPlayingAnimation_maybe = true;
_otherNspAnimationType_maybe = animId;
- g_engine->_player_sprite_related_2c85_82f3 = 0;
+ g_engine->_player->_flipSprite = false;
_objRestarted = false;
if (_otherNspAnimationType_maybe < 2) {
diff --git a/engines/darkseed/darkseed.cpp b/engines/darkseed/darkseed.cpp
index 41433e8e676..1fb37c83ded 100644
--- a/engines/darkseed/darkseed.cpp
+++ b/engines/darkseed/darkseed.cpp
@@ -1194,7 +1194,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
&playerSprite,
240 - _player->_position.y,
_scaledSpriteWidth,
- _scaledSpriteHeight, _player_sprite_related_2c85_82f3);
+ _scaledSpriteHeight, _player->_flipSprite);
}
} else {
if (_animation->_otherNspAnimationType_maybe == 37) {
@@ -1206,7 +1206,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
&playerSprite,
240 - _player->_position.y,
_scaledSpriteWidth,
- _scaledSpriteHeight, _player_sprite_related_2c85_82f3);
+ _scaledSpriteHeight, _player->_flipSprite);
}
if (_animation->_otherNspAnimationType_maybe == 39 || _animation->_otherNspAnimationType_maybe == 59 ||
_animation->_otherNspAnimationType_maybe == 60 || _animation->_otherNspAnimationType_maybe == 61) {
@@ -1218,7 +1218,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
&playerSprite,
240 - _player->_position.y,
_scaledSpriteWidth,
- _scaledSpriteHeight, _player_sprite_related_2c85_82f3);
+ _scaledSpriteHeight, _player->_flipSprite);
if (_animation->_otherNspAnimationType_maybe == 60 || _animation->_otherNspAnimationType_maybe == 61) {
_sprite_y_scaling_threshold_maybe = 240;
// DrawObjectsMenu(); TODO do we need this logic?
@@ -1259,7 +1259,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
} else if (!_animation->_scaleSequence) {
if (_animation->_otherNspAnimationType_maybe == 17) { // open trunk
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 5 || _animation->_otherNspAnimationType_maybe == 1) {
int x = 0xa6;
int y = 0x69;
@@ -1276,25 +1276,25 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
/* bed wake sequence is played here. */
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(x, y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(x, y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 43 || _animation->_otherNspAnimationType_maybe == 44) {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(303, 105, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(303, 105, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 62) { // sargent approaches jail cell.
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 45 || _animation->_otherNspAnimationType_maybe == 46) { // pull lever
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(446, 124, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(446, 124, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 36) {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(339, 78, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(339, 78, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 59) {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(433, 91, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(433, 91, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 37) {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(428, 78, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(428, 78, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 10 || _animation->_otherNspAnimationType_maybe == 11) {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
_sprites.addSpriteToDrawList(118, 62, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, false);
@@ -1303,41 +1303,41 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
_sprites.addSpriteToDrawList(407, 73, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, false);
} else if (_animation->_otherNspAnimationType_maybe == 20) {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList((_player->_position.x - animSprite._width / 2) - 4, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList((_player->_position.x - animSprite._width / 2) - 4, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe < 30 || _animation->_otherNspAnimationType_maybe > 34) {
if (_animation->_otherNspAnimationType_maybe == 40) {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(373, 99, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(373, 99, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
const Sprite &legsSprite = _player->_animations.getSpriteAt(12);
- _sprites.addSpriteToDrawList(373, 99 + animSprite._height, &legsSprite, 240 - _player->_position.y, legsSprite._width, legsSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(373, 99 + animSprite._height, &legsSprite, 240 - _player->_position.y, legsSprite._width, legsSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe < 48 || _animation->_otherNspAnimationType_maybe > 52) {
if (_animation->_otherNspAnimationType_maybe == 35) {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(_player->_position.x - 10, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(_player->_position.x - 10, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe >= 53 && _animation->_otherNspAnimationType_maybe <= 56) {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 57 || _animation->_otherNspAnimationType_maybe == 58) {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
Common::Point spritePos = {344, 57};
if (_room->_roomNumber == 41) {
spritePos = {295, 46};
}
- _sprites.addSpriteToDrawList(spritePos.x, spritePos.y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(spritePos.x, spritePos.y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
} else {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(_player->_position.x, _player->_position.y, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
}
} else {
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(_player->_position.x - animSprite._width / 2, _player->_position.y - animSprite._height, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
}
} else {
// drinking water in bathroom
const Sprite &animSprite = _player->_animations.getSpriteAt(_player->_frameIdx);
- _sprites.addSpriteToDrawList(448, 97, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(448, 97, &animSprite, 240 - _player->_position.y, animSprite._width, animSprite._height, _player->_flipSprite);
const Sprite &legsSprite = _player->_animations.getSpriteAt(0);
- _sprites.addSpriteToDrawList(451, 160, &legsSprite, 240 - _player->_position.y, legsSprite._width, legsSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(451, 160, &legsSprite, 240 - _player->_position.y, legsSprite._width, legsSprite._height, _player->_flipSprite);
}
} else if (_animation->_otherNspAnimationType_maybe == 6) {
@@ -1349,7 +1349,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
0xff,
_scaledSpriteWidth,
_scaledSpriteHeight,
- _player_sprite_related_2c85_82f3);
+ _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 22) { // dig grave
_sprites.addSpriteToDrawList(
_player->_position.x - ((_scaledWalkSpeed_maybe * 30) / 1000),
@@ -1358,7 +1358,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
240 - _player->_position.y,
_scaledSpriteWidth,
_scaledSpriteHeight,
- _player_sprite_related_2c85_82f3);
+ _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 4 || _animation->_otherNspAnimationType_maybe == 21) { // dig grave
_sprites.addSpriteToDrawList(
_player->_position.x - ((_scaledWalkSpeed_maybe * 95) / 1000),
@@ -1367,7 +1367,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
240 - _player->_position.y,
_scaledSpriteWidth,
_scaledSpriteHeight,
- _player_sprite_related_2c85_82f3);
+ _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 39) {
int16 spriteX = 110;
int16 spriteY = _player->_position.y;
@@ -1387,7 +1387,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
240 - _player->_position.y,
_scaledSpriteWidth,
_scaledSpriteHeight,
- _player_sprite_related_2c85_82f3);
+ _player->_flipSprite);
} else if (_animation->_otherNspAnimationType_maybe == 47) {
const Sprite &sprite = _room->_locationSprites.getSpriteAt(_player->_frameIdx);
_room->calculateScaledSpriteDimensions(
@@ -1401,7 +1401,7 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
240 - _player->_position.y,
_scaledSpriteWidth,
_scaledSpriteHeight,
- _player_sprite_related_2c85_82f3);
+ _player->_flipSprite);
} else {
_sprites.addSpriteToDrawList(
_player->_position.x - _scaledSpriteWidth / 2,
@@ -1410,26 +1410,26 @@ void DarkseedEngine::updateDisplay() { // AKA ServiceRoom
240 - _player->_position.y,
_scaledSpriteWidth,
_scaledSpriteHeight,
- _player_sprite_related_2c85_82f3);
+ _player->_flipSprite);
}
if (_animation->_isPlayingAnimation_maybe && _animation->_otherNspAnimationType_maybe == 14 && _animation->_animIndexTbl[0] > 1) {
if (_objectVar.getObjectRunningCode(140) == 0 || _room->_roomNumber != 6) {
if (_room->_roomNumber == 6 && _player->_isAutoWalkingToBed) {
const Sprite &animSprite = _player->_animations.getSpriteAt(8);
- _sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_room->_roomNumber == 6) {
const Sprite &animSprite = _player->_animations.getSpriteAt(2);
- _sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_room->_roomNumber == 11) {
const Sprite &animSprite = _player->_animations.getSpriteAt(6);
- _sprites.addSpriteToDrawList(369, 119, &animSprite, 255, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(369, 119, &animSprite, 255, animSprite._width, animSprite._height, _player->_flipSprite);
} else if (_room->_roomNumber == 12) {
const Sprite &animSprite = _player->_animations.getSpriteAt(6);
- _sprites.addSpriteToDrawList(252, 121, &animSprite, 255, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(252, 121, &animSprite, 255, animSprite._width, animSprite._height, _player->_flipSprite);
}
} else {
const Sprite &animSprite = _player->_animations.getSpriteAt(3);
- _sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite._width, animSprite._height, _player_sprite_related_2c85_82f3);
+ _sprites.addSpriteToDrawList(132, 70, &animSprite, 255, animSprite._width, animSprite._height, _player->_flipSprite);
}
}
}
diff --git a/engines/darkseed/darkseed.h b/engines/darkseed/darkseed.h
index dc630b0f01e..6f6046ad411 100644
--- a/engines/darkseed/darkseed.h
+++ b/engines/darkseed/darkseed.h
@@ -125,7 +125,6 @@ public:
uint16 _scaledSpriteWidth = 0;
uint16 _scaledSpriteHeight = 0;
- bool _player_sprite_related_2c85_82f3 = false;
int _frameBottom = 0;
// Unknown variables
diff --git a/engines/darkseed/player.cpp b/engines/darkseed/player.cpp
index 03ea31dcc9a..5d2621fe02d 100644
--- a/engines/darkseed/player.cpp
+++ b/engines/darkseed/player.cpp
@@ -44,13 +44,13 @@ bool Player::loadAnimations(const Common::Path &filename) {
}
uint8 playerSpriteIndexDirectionTbl[] = { 24, 26, 28, 26 };
-bool BYTE_ARRAY_2c85_41eb[] = { false, false, false, true };
+static constexpr bool DIRECTION_FLIP_SPRITE_TBL[] = { false, false, false, true };
uint16 walkFrameOffsetTbl[] = { 0, 8, 16, 8 };
void Player::updateSprite() {
if (!_playerIsChangingDirection) {
if ((_direction == 3) || (_direction == 1)) {
- g_engine->_player_sprite_related_2c85_82f3 = BYTE_ARRAY_2c85_41eb[_direction];
+ _flipSprite = DIRECTION_FLIP_SPRITE_TBL[_direction];
}
if (_position.x == _walkTarget.x && _position.y == _walkTarget.y && !_heroMoving) {
_frameIdx = playerSpriteIndexDirectionTbl[_direction];
@@ -59,21 +59,21 @@ void Player::updateSprite() {
}
if (_direction == 2) {
if (_position.x < _walkTarget.x) {
- g_engine->_player_sprite_related_2c85_82f3 = true;
+ _flipSprite = true;
} else if (_walkTarget.x < _position.x) {
- g_engine->_player_sprite_related_2c85_82f3 = false;
+ _flipSprite = false;
}
}
if (_direction == 0) {
if (_walkTarget.x < _position.x) {
- g_engine->_player_sprite_related_2c85_82f3 = true;
+ _flipSprite = true;
} else if (_position.x < _walkTarget.x) {
- g_engine->_player_sprite_related_2c85_82f3 = false;
+ _flipSprite = false;
}
}
} else {
- g_engine->_player_sprite_related_2c85_82f3 = 4 < _playerSpriteWalkIndex_maybe;
- if (g_engine->_player_sprite_related_2c85_82f3) {
+ _flipSprite = (4 < _playerSpriteWalkIndex_maybe);
+ if (_flipSprite) {
_frameIdx = 0x20 - _playerSpriteWalkIndex_maybe;
} else {
_frameIdx = _playerSpriteWalkIndex_maybe + 0x18;
diff --git a/engines/darkseed/player.h b/engines/darkseed/player.h
index b81ee889872..20e2c6a275c 100644
--- a/engines/darkseed/player.h
+++ b/engines/darkseed/player.h
@@ -56,6 +56,7 @@ public:
int16 _sequenceRotation = -1;
bool _walkToSequence = false;
Common::Point _walkToSequencePoint;
+ bool _flipSprite = false;
public:
Player();
Commit: 9611f50320bdeca20d5b18c7561f8b99b7179599
https://github.com/scummvm/scummvm/commit/9611f50320bdeca20d5b18c7561f8b99b7179599
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-10-12T23:25:36+11:00
Commit Message:
DARKSEED: Add doll cutscene.
Changed paths:
A engines/darkseed/morph.cpp
A engines/darkseed/morph.h
engines/darkseed/cutscene.cpp
engines/darkseed/cutscene.h
engines/darkseed/module.mk
diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index b9312e1b793..18df09d633a 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -46,7 +46,7 @@ void Cutscene::update() {
_movieStep = 9999;
break;
case 'D' :
- _movieStep = 9999;
+ babyDollScene();
break;
case 'E' :
shipLaunchScene();
@@ -87,6 +87,9 @@ void Cutscene::update() {
play('I');
} else if (_cutsceneId == 'G') {
g_engine->_cursor.showCursor(true);
+ } else if (_cutsceneId == 'D') {
+ g_engine->_cursor.showCursor(true);
+ g_engine->_room->restorePalette();
}
}
}
@@ -677,6 +680,93 @@ bool Cutscene::alienBornScene() {
return true;
}
+bool Cutscene::babyDollScene() {
+ switch (_movieStep) {
+ case 1: {
+ delete _morph;
+ _morph = new Morph({73, 46, 472, 240});
+ _palette.load("art/norm.pal");
+ Img left00Img;
+ left00Img.load("art/bdoll0.img");
+ left00Img.draw();
+ Img left01Img;
+ left01Img.load("art/bdoll1.img");
+ left01Img.draw();
+ _morph->loadSrcFromScreen();
+
+ Img born1Img;
+ born1Img.load("art/embryo.img");
+ born1Img.draw(1);
+ _morph->loadDestFromScreen();
+
+ g_engine->_screen->clear();
+ left00Img.draw();
+ left01Img.draw();
+ g_engine->_screen->clearPalette();
+ break;
+ }
+ case 2:
+ break;
+ case 3:
+ // TODO play doll music here.
+ g_engine->fadeIn(_palette);
+ break;
+ case 4:
+ if (g_engine->fadeStep()) {
+ return true;
+ }
+ break;
+ case 5:
+ _morph->start(MorphDirection::Forward);
+ registTime();
+ break;
+ case 6:
+ if (waitTime(50)) {
+ return true;
+ }
+ break;
+ case 7: {
+ if (_morph->morphStep()) {
+ return true;
+ }
+ registTime();
+ break;
+ }
+ case 8:
+ if (waitTime(40)) {
+ return true;
+ }
+ _morph->start(MorphDirection::Backward);
+ break;
+ case 9:
+ if (_morph->morphStep()) {
+ return true;
+ }
+ registTime();
+ break;
+ case 10:
+ if (waitTime(30)) {
+ return true;
+ }
+ break;
+ case 11:
+ g_engine->fadeOut();
+ break;
+ case 12:
+ if (g_engine->fadeStep()) {
+ return true;
+ }
+ delete _morph;
+ _morph = nullptr;
+ break;
+ default:
+ _movieStep = 9999;
+ return false;
+ }
+ _movieStep++;
+ return true;
+}
+
bool Cutscene::stepAnim(int drawMode) {
if (_animDelayCount == 0) {
Img animFrame;
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index 99f8694592c..05b523162b9 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -22,9 +22,12 @@
#ifndef DARKSEED_CUTSCENE_H
#define DARKSEED_CUTSCENE_H
+#include "common/rect.h"
#include "common/str.h"
+#include "graphics/managed_surface.h"
#include "darkseed/pal.h"
#include "darkseed/titlefont.h"
+#include "darkseed/morph.h"
namespace Darkseed {
@@ -40,6 +43,7 @@ private:
int _animDelayCount;
int _animDirection;
uint32 _startTime = 0;
+ Morph *_morph = nullptr;
public:
virtual ~Cutscene();
@@ -54,6 +58,7 @@ private:
bool embryoInsertedScene();
bool shipLaunchScene();
bool alienBornScene();
+ bool babyDollScene();
void runAnim(int direction = 1);
bool stepAnim(int drawMode = 1);
diff --git a/engines/darkseed/module.mk b/engines/darkseed/module.mk
index 4a36874ef67..c6fa3787ed1 100644
--- a/engines/darkseed/module.mk
+++ b/engines/darkseed/module.mk
@@ -12,6 +12,7 @@ MODULE_OBJS = \
img.o \
inventory.o \
metaengine.o \
+ morph.o \
nsp.o \
objects.o \
pal.o \
diff --git a/engines/darkseed/morph.cpp b/engines/darkseed/morph.cpp
new file mode 100644
index 00000000000..c08618d2302
--- /dev/null
+++ b/engines/darkseed/morph.cpp
@@ -0,0 +1,68 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "darkseed/morph.h"
+#include "darkseed/darkseed.h"
+
+namespace Darkseed {
+
+Morph::Morph(const Common::Rect &area) : _area(area) {}
+void Morph::loadSrcFromScreen() {
+ _src.copyFrom(*(Graphics::ManagedSurface *)g_engine->_screen);
+}
+
+void Morph::loadDestFromScreen() {
+ _dest.copyFrom(*(Graphics::ManagedSurface *)g_engine->_screen);
+}
+
+void Morph::start(MorphDirection direction) {
+ _stepCount = 0;
+ _direction = direction;
+}
+
+bool Morph::morphStep() {
+ if (_stepCount > 16) {
+ return false;
+ }
+ draw(_direction == MorphDirection::Forward ? _stepCount : 16 - _stepCount);
+ _stepCount += 2;
+ return _stepCount < 17;
+}
+
+void Morph::draw(int16 drawIdx) {
+ uint8 *screen = (uint8 *)g_engine->_screen->getBasePtr(_area.left, _area.top);
+ uint8 *src = (uint8 *)_src.getBasePtr(_area.left, _area.top);
+ uint8 *dest = (uint8 *)_dest.getBasePtr(_area.left, _area.top);
+
+ for (int y = 0; y < _area.height(); y++) {
+ for (int x = 0; x < _area.width(); x++) {
+ if (src[x] != dest[x]) {
+ screen[x] = (src[x] * (16 - drawIdx) + dest[x] * drawIdx) >> 4;
+ }
+ }
+ screen += g_engine->_screen->pitch;
+ src += _src.pitch;
+ dest += _dest.pitch;
+ }
+ g_engine->_screen->addDirtyRect(_area);
+}
+
+} // End of namespace Darkseed
diff --git a/engines/darkseed/morph.h b/engines/darkseed/morph.h
new file mode 100644
index 00000000000..2db15ca2b82
--- /dev/null
+++ b/engines/darkseed/morph.h
@@ -0,0 +1,56 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+#ifndef DARKSEED_MORPH_H
+#define DARKSEED_MORPH_H
+
+#include "common/rect.h"
+#include "graphics/managed_surface.h"
+
+namespace Darkseed {
+
+enum class MorphDirection : uint8 {
+ Forward,
+ Backward
+};
+
+class Morph {
+private:
+ Common::Rect _area;
+ Graphics::ManagedSurface _src;
+ Graphics::ManagedSurface _dest;
+ MorphDirection _direction = MorphDirection::Forward;
+ int16 _stepCount = 0;
+public:
+ explicit Morph(const Common::Rect &area);
+
+ void loadSrcFromScreen();
+ void loadDestFromScreen();
+
+ void start(MorphDirection direction);
+
+ bool morphStep();
+private:
+ void draw(int16 drawIdx);
+};
+
+} // End of namespace Darkseed
+
+#endif // DARKSEED_MORPH_H
Commit: 84c243376fa0cb0d3a30c82104460fcd98c19e45
https://github.com/scummvm/scummvm/commit/84c243376fa0cb0d3a30c82104460fcd98c19e45
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-10-12T23:25:36+11:00
Commit Message:
DARKSEED: Add book & nightmare2 scenes.
Changed paths:
engines/darkseed/cutscene.cpp
engines/darkseed/cutscene.h
engines/darkseed/morph.cpp
diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index 18df09d633a..365fe700d64 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -40,7 +40,7 @@ void Cutscene::play(char cutsceneId) {
void Cutscene::update() {
switch (_cutsceneId) {
case 'B' :
- _movieStep = 9999;
+ nightmare2Scene();
break;
case 'C' :
_movieStep = 9999;
@@ -52,7 +52,7 @@ void Cutscene::update() {
shipLaunchScene();
break;
case 'G' :
- _movieStep = 9999;
+ bookScene();
break;
case 'H' :
_movieStep = 9999;
@@ -85,10 +85,8 @@ void Cutscene::update() {
g_engine->newGame();
} else if (_cutsceneId == 'Y') {
play('I');
- } else if (_cutsceneId == 'G') {
- g_engine->_cursor.showCursor(true);
- } else if (_cutsceneId == 'D') {
- g_engine->_cursor.showCursor(true);
+ } else if (_cutsceneId == 'B' || _cutsceneId == 'D' || _cutsceneId == 'G') {
+ g_engine->_cursor.showCursor(true); // TODO fade in here
g_engine->_room->restorePalette();
}
}
@@ -767,6 +765,220 @@ bool Cutscene::babyDollScene() {
return true;
}
+bool Cutscene::bookScene() {
+ switch (_movieStep) {
+ case 1:
+ g_engine->fadeOut();
+ break;
+ case 2:
+ if (g_engine->fadeStep()) {
+ return true;
+ }
+ break;
+ case 3: {
+ delete _morph;
+ _morph = new Morph({136, 41, 423, 239});
+ _palette.load("art/norm.pal");
+ Img left00Img;
+ left00Img.load("art/bdoll0.img");
+ left00Img.draw();
+ Img left01Img;
+ left01Img.load("art/bdoll1.img");
+ left01Img.draw();
+ Img book1Img;
+ book1Img.load("art/book1.img");
+ book1Img.draw(1);
+ _morph->loadSrcFromScreen();
+
+ Img book2Img;
+ book2Img.load("art/book2.img");
+ book2Img.draw(1);
+ _morph->loadDestFromScreen();
+
+ g_engine->_screen->clear();
+ left00Img.draw();
+ left01Img.draw();
+ book1Img.draw(1);
+ g_engine->_screen->clearPalette();
+ break;
+ }
+ case 4:
+ break;
+ case 5:
+ g_engine->fadeIn(_palette);
+ break;
+ case 6:
+ if (g_engine->fadeStep()) {
+ return true;
+ }
+ break;
+ case 7:
+ // TODO play book music
+ registTime();
+ break;
+ case 8:
+ if (waitTime(70)) {
+ return true;
+ }
+ _morph->start(MorphDirection::Forward);
+ break;
+ case 9:
+ if (_morph->morphStep()) {
+ return true;
+ }
+ registTime();
+ break;
+ case 10:
+ if (waitTime(70)) {
+ return true;
+ }
+ break;
+ case 11:
+ registTime();
+ _morph->start(MorphDirection::Backward);
+ break;
+ case 12:
+ if (_morph->morphStep()) {
+ return true;
+ }
+ registTime();
+ break;
+ case 13:
+ if (waitTime(40)) {
+ return true;
+ }
+ break;
+ case 14:
+ delete _morph;
+ g_engine->fadeOut();
+ break;
+ case 15:
+ if (g_engine->fadeStep()) {
+ return true;
+ }
+ break;
+ case 16:
+ // TODO stop audio
+ break;
+ default:
+ _movieStep = 9999;
+ return false;
+ }
+ _movieStep++;
+ return true;
+}
+
+bool Cutscene::nightmare2Scene() {
+ switch (_movieStep) {
+ case 1: {
+ delete _morph;
+ _morph = new Morph({264, 85, 515, 267});
+ _palette.load("art/ship.pal");
+ Img left00Img;
+ left00Img.load("art/nmf0.img");
+ left00Img.draw();
+ Img left01Img;
+ left01Img.load("art/nmf1.img");
+ left01Img.draw();
+ _morph->loadSrcFromScreen();
+
+ Img book2Img;
+ book2Img.load("art/dmik.img");
+ book2Img.draw(1);
+ _morph->loadDestFromScreen();
+
+ g_engine->_screen->clear();
+ left00Img.draw();
+ left01Img.draw();
+ g_engine->_screen->clearPalette();
+ break;
+ }
+ case 2:
+ break;
+ case 3:
+ // TODO play night2 music
+ break;
+ case 4:
+ g_engine->fadeIn(_palette);
+ break;
+ case 5:
+ if (g_engine->fadeStep()) {
+ return true;
+ }
+ break;
+ case 6:
+ registTime();
+ break;
+ case 7:
+ if (waitTime(20)) {
+ return true;
+ }
+ _morph->start(MorphDirection::Forward);
+ break;
+ case 8:
+ if (_morph->morphStep()) {
+ return true;
+ }
+ registTime();
+ break;
+ case 9:
+ if (waitTime(10)) {
+ return true;
+ }
+ _morph->start(MorphDirection::Backward);
+ break;
+ case 10:
+ if (_morph->morphStep()) {
+ return true;
+ }
+ registTime();
+ break;
+ case 11:
+ if (waitTime(40)) {
+ return true;
+ }
+ _morph->start(MorphDirection::Forward);
+ break;
+ case 12:
+ if (_morph->morphStep()) {
+ return true;
+ }
+ registTime();
+ break;
+ case 13:
+ if (waitTime(10)) {
+ return true;
+ }
+ _morph->start(MorphDirection::Backward);
+ break;
+ case 14:
+ if (_morph->morphStep()) {
+ return true;
+ }
+ registTime();
+ break;
+ case 15:
+ if (waitTime(40)) {
+ return true;
+ }
+ break;
+ case 16:
+ delete _morph;
+ g_engine->fadeOut();
+ break;
+ case 17:
+ if (g_engine->fadeStep()) {
+ return true;
+ }
+ break;
+ default:
+ _movieStep = 9999;
+ return false;
+ }
+ _movieStep++;
+ return true;
+}
+
bool Cutscene::stepAnim(int drawMode) {
if (_animDelayCount == 0) {
Img animFrame;
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index 05b523162b9..287bd36609b 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -59,6 +59,8 @@ private:
bool shipLaunchScene();
bool alienBornScene();
bool babyDollScene();
+ bool bookScene();
+ bool nightmare2Scene();
void runAnim(int direction = 1);
bool stepAnim(int drawMode = 1);
diff --git a/engines/darkseed/morph.cpp b/engines/darkseed/morph.cpp
index c08618d2302..d0ca8d9194d 100644
--- a/engines/darkseed/morph.cpp
+++ b/engines/darkseed/morph.cpp
@@ -43,7 +43,7 @@ bool Morph::morphStep() {
return false;
}
draw(_direction == MorphDirection::Forward ? _stepCount : 16 - _stepCount);
- _stepCount += 2;
+ _stepCount += 1;
return _stepCount < 17;
}
Commit: 5118fa466ff4a6037d8b404325ae0b39e5ffd298
https://github.com/scummvm/scummvm/commit/5118fa466ff4a6037d8b404325ae0b39e5ffd298
Author: Eric Fry (yuv422 at reversedgames.com)
Date: 2024-10-12T23:25:36+11:00
Commit Message:
DARKSEED: Started work on nightmare 3 cutscene
Changed paths:
engines/darkseed/anm.cpp
engines/darkseed/anm.h
engines/darkseed/cutscene.cpp
engines/darkseed/cutscene.h
diff --git a/engines/darkseed/anm.cpp b/engines/darkseed/anm.cpp
index f1ba8109f93..42d8579d252 100644
--- a/engines/darkseed/anm.cpp
+++ b/engines/darkseed/anm.cpp
@@ -23,7 +23,7 @@
#include "darkseed/anm.h"
namespace Darkseed {
-bool Anm::load(const Common::Path &filename) {
+bool Anm::load(const Common::Path &filename, int deltaOffset) {
if (_file.isOpen()) {
_file.close();
}
@@ -31,14 +31,14 @@ bool Anm::load(const Common::Path &filename) {
return false;
}
_numRecords = _file.readUint16LE();
- _assetOffset = _file.readUint16LE();
-
+ _assetFileId = _file.readUint16LE();
+ _deltaOffset = deltaOffset;
return true;
}
bool Anm::getImg(uint16 index, Img &img, bool includesPosition) {
_file.seek(4 + index * 2);
- int offset = _file.readUint16LE();
+ int offset = _file.readUint16LE() + _deltaOffset;
_file.seek((offset * 16) + (4 + _numRecords * 2));
if (includesPosition) {
img.load(_file);
diff --git a/engines/darkseed/anm.h b/engines/darkseed/anm.h
index 4edc71c2267..5ec86531e6f 100644
--- a/engines/darkseed/anm.h
+++ b/engines/darkseed/anm.h
@@ -30,10 +30,11 @@ class Anm {
private:
Common::File _file;
uint16 _numRecords = 0;
- uint16 _assetOffset = 0;
+ uint16 _assetFileId = 0;
+ int _deltaOffset = 0;
public:
- bool load(const Common::Path &filename);
+ bool load(const Common::Path &filename, int deltaOffset = 0);
bool getImg(uint16 index, Img &img, bool includesPosition = true);
int numImages();
};
diff --git a/engines/darkseed/cutscene.cpp b/engines/darkseed/cutscene.cpp
index 365fe700d64..31782dde20e 100644
--- a/engines/darkseed/cutscene.cpp
+++ b/engines/darkseed/cutscene.cpp
@@ -43,7 +43,7 @@ void Cutscene::update() {
nightmare2Scene();
break;
case 'C' :
- _movieStep = 9999;
+ nightmare3Scene();
break;
case 'D' :
babyDollScene();
@@ -85,9 +85,10 @@ void Cutscene::update() {
g_engine->newGame();
} else if (_cutsceneId == 'Y') {
play('I');
- } else if (_cutsceneId == 'B' || _cutsceneId == 'D' || _cutsceneId == 'G') {
+ } else if (_cutsceneId == 'B' || _cutsceneId == 'C' || _cutsceneId == 'D' || _cutsceneId == 'G') {
g_engine->_cursor.showCursor(true); // TODO fade in here
g_engine->_room->restorePalette();
+ g_engine->_frame.draw();
}
}
}
@@ -681,7 +682,7 @@ bool Cutscene::alienBornScene() {
bool Cutscene::babyDollScene() {
switch (_movieStep) {
case 1: {
- delete _morph;
+ freeMorph();
_morph = new Morph({73, 46, 472, 240});
_palette.load("art/norm.pal");
Img left00Img;
@@ -754,8 +755,7 @@ bool Cutscene::babyDollScene() {
if (g_engine->fadeStep()) {
return true;
}
- delete _morph;
- _morph = nullptr;
+ freeMorph();
break;
default:
_movieStep = 9999;
@@ -776,7 +776,7 @@ bool Cutscene::bookScene() {
}
break;
case 3: {
- delete _morph;
+ freeMorph();
_morph = new Morph({136, 41, 423, 239});
_palette.load("art/norm.pal");
Img left00Img;
@@ -849,7 +849,7 @@ bool Cutscene::bookScene() {
}
break;
case 14:
- delete _morph;
+ freeMorph();
g_engine->fadeOut();
break;
case 15:
@@ -871,7 +871,7 @@ bool Cutscene::bookScene() {
bool Cutscene::nightmare2Scene() {
switch (_movieStep) {
case 1: {
- delete _morph;
+ freeMorph();
_morph = new Morph({264, 85, 515, 267});
_palette.load("art/ship.pal");
Img left00Img;
@@ -963,7 +963,7 @@ bool Cutscene::nightmare2Scene() {
}
break;
case 16:
- delete _morph;
+ freeMorph();
g_engine->fadeOut();
break;
case 17:
@@ -979,6 +979,74 @@ bool Cutscene::nightmare2Scene() {
return true;
}
+bool Cutscene::nightmare3Scene() { // TODO fix animation of values + face here.
+ switch (_movieStep) {
+ case 1: {
+ _palette.load("art/ship.pal");
+ Img left00Img;
+ left00Img.load("art/nmf0.img");
+ left00Img.draw();
+ Img left01Img;
+ left01Img.load("art/nmf1.img");
+ left01Img.draw();
+
+ Img book2Img;
+ book2Img.load("art/nm3a.img");
+ book2Img.draw(1);
+
+ g_engine->_screen->clearPalette();
+ break;
+ }
+ case 2: {
+ _animation.load("art/valves.anm", -9340);
+ // TODO play night3 music here.
+ g_engine->fadeIn(_palette);
+ break;
+ }
+ case 3:
+ if (g_engine->fadeStep()) {
+ return true;
+ }
+ break;
+ case 4:
+ _animIdx = 0;
+ _animCount = 12;
+ // TODO speed = 2
+ runAnim();
+ break;
+ case 5:
+ if (stepAnim(1)) {
+ return true;
+ }
+ registTime();
+ break;
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ registTime();
+ break;
+ case 10:
+ if (waitTime(10)) {
+ return true;
+ }
+ break;
+ case 11:
+ g_engine->fadeOut();
+ break;
+ case 12:
+ if (g_engine->fadeStep()) {
+ return true;
+ }
+ break;
+ default:
+ _movieStep = 9999;
+ return false;
+ }
+ _movieStep++;
+ return true;
+}
+
bool Cutscene::stepAnim(int drawMode) {
if (_animDelayCount == 0) {
Img animFrame;
@@ -1024,4 +1092,9 @@ void Cutscene::runAnim(int direction) {
_animDirection = direction;
}
+void Cutscene::freeMorph() {
+ delete _morph;
+ _morph = nullptr;
+}
+
} // End of namespace Darkseed
diff --git a/engines/darkseed/cutscene.h b/engines/darkseed/cutscene.h
index 287bd36609b..469a16b019b 100644
--- a/engines/darkseed/cutscene.h
+++ b/engines/darkseed/cutscene.h
@@ -61,6 +61,7 @@ private:
bool babyDollScene();
bool bookScene();
bool nightmare2Scene();
+ bool nightmare3Scene();
void runAnim(int direction = 1);
bool stepAnim(int drawMode = 1);
@@ -69,6 +70,8 @@ private:
void registTime();
bool waitTime(int16 duration);
+
+ void freeMorph();
};
}; // End of namespace Darkseed
More information about the Scummvm-git-logs
mailing list