aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2014-03-28 09:19:55 -0400
committerPaul Gilbert2014-03-28 09:19:55 -0400
commitb9daf53bcd14332624f3d18fd21514b1f9146107 (patch)
tree94e8074d39a5a58d43762e60037f6744b1c85005 /engines
parent6c85572d76245f616ae3bf2ac1ccc713d8271fa9 (diff)
downloadscummvm-rg350-b9daf53bcd14332624f3d18fd21514b1f9146107.tar.gz
scummvm-rg350-b9daf53bcd14332624f3d18fd21514b1f9146107.tar.bz2
scummvm-rg350-b9daf53bcd14332624f3d18fd21514b1f9146107.zip
MADS: Cleanup of direction setup, fix sprite mirroring for walking
Diffstat (limited to 'engines')
-rw-r--r--engines/mads/assets.cpp4
-rw-r--r--engines/mads/assets.h4
-rw-r--r--engines/mads/game.cpp2
-rw-r--r--engines/mads/messages.cpp4
-rw-r--r--engines/mads/nebular/nebular_scenes1.cpp2
-rw-r--r--engines/mads/player.cpp110
-rw-r--r--engines/mads/player.h27
-rw-r--r--engines/mads/scene.cpp6
-rw-r--r--engines/mads/sequence.cpp2
9 files changed, 85 insertions, 76 deletions
diff --git a/engines/mads/assets.cpp b/engines/mads/assets.cpp
index ec5d54251f..9d022871d4 100644
--- a/engines/mads/assets.cpp
+++ b/engines/mads/assets.cpp
@@ -224,9 +224,9 @@ SpriteSetCharInfo::SpriteSetCharInfo(Common::SeekableReadStream *s) {
for (int i = 0; i < 16; ++i)
_ticksList[i] = s->readUint16LE();
- _unk1 = s->readUint16LE();
+ _velocity = s->readUint16LE();
_ticksAmount = s->readByte();
- _yScale = s->readByte();
+ _centerOfGravity = s->readByte();
}
} // End of namespace MADS
diff --git a/engines/mads/assets.h b/engines/mads/assets.h
index 31d46881ff..b5b351242d 100644
--- a/engines/mads/assets.h
+++ b/engines/mads/assets.h
@@ -51,9 +51,9 @@ public:
int _frameList2[16];
int _frameList[16];
int _ticksList[16];
- int _unk1;
+ int _velocity;
int _ticksAmount;
- int _yScale;
+ int _centerOfGravity;
};
class SpriteAsset {
diff --git a/engines/mads/game.cpp b/engines/mads/game.cpp
index 900d4dc86a..28a1d1d4ea 100644
--- a/engines/mads/game.cpp
+++ b/engines/mads/game.cpp
@@ -235,7 +235,7 @@ void Game::sectionLoop() {
_player._destPos = _player._playerPos;
_player._turnToFacing = _player._facing;
_player._targetFacing = _player._facing;
- _player.setupFrame();
+ _player.selectSeries();
_player.updateFrame();
_player._visible3 = _player._visible;
_player._special = _scene.getDepthHighBits(_player._playerPos);
diff --git a/engines/mads/messages.cpp b/engines/mads/messages.cpp
index 617bd6d2a0..5c6e11339c 100644
--- a/engines/mads/messages.cpp
+++ b/engines/mads/messages.cpp
@@ -205,9 +205,9 @@ void KernelMessages::processText(int msgIndex) {
if (msg._flags & KMSG_PLAYER_TIMEOUT) {
if (player._visible3) {
SpriteAsset &asset = *_vm->_game->_scene._sprites[player._spritesStart + player._spritesIdx];
- MSprite *frame = asset.getFrame(player._frameNum - 1);
+ MSprite *frame = asset.getFrame(player._frameNumber - 1);
- int yAmount = player._currentScale * player._yScale / 100;
+ int yAmount = player._currentScale * player._centerOfGravity / 100;
x1 = player._playerPos.x;
y1 = (frame->h * player._currentScale / -100) + yAmount +
player._playerPos.y - 15;
diff --git a/engines/mads/nebular/nebular_scenes1.cpp b/engines/mads/nebular/nebular_scenes1.cpp
index e5c0abd4bd..839c001619 100644
--- a/engines/mads/nebular/nebular_scenes1.cpp
+++ b/engines/mads/nebular/nebular_scenes1.cpp
@@ -92,7 +92,7 @@ void Scene1xx::setPlayerSpritesPrefix() {
_game._player._loadsFirst = false;
}
- _game._player._unk3 = 0;
+ _game._player._trigger = 0;
_vm->_palette->setEntry(16, 10, 63, 63);
_vm->_palette->setEntry(17, 10, 45, 45);
}
diff --git a/engines/mads/player.cpp b/engines/mads/player.cpp
index eaec85c8fc..f569e7ee2c 100644
--- a/engines/mads/player.cpp
+++ b/engines/mads/player.cpp
@@ -37,6 +37,7 @@ Player::Player(MADSEngine *vm): _vm(vm) {
_facing = FACING_NORTH;
_turnToFacing = FACING_NORTH;
_targetFacing = FACING_NORTH;
+ _mirror = false;
_spritesLoaded = false;
_spritesStart = 0;
_spritesIdx = 0;
@@ -51,24 +52,24 @@ Player::Player(MADSEngine *vm): _vm(vm) {
_special = 0;
_ticksAmount = 0;
_priorTimer = 0;
- _unk3 = _unk4 = 0;
+ _trigger = _unk4 = 0;
+ _spritesChanged = false;
_forceRefresh = false;
_highSprites = false;
_currentDepth = 0;
_currentScale = 0;
- _frameOffset = 0;
- _frameNum = 0;
- _yScale = 0;
+ _frameNumber = 0;
+ _centerOfGravity = 0;
_frameCount = 0;
- _unk1 = 0;
- _unk2 = 0;
- _unk3 = 0;
+ _velocity = 0;
+ _upcomingTrigger = 0;
+ _trigger = 0;
_frameListIndex = 0;
- _actionIndex = 0;
+ _stopWalkerIndex = 0;
_hypotenuse = 0;
- Common::fill(&_actionList[0], &_actionList[12], 0);
- Common::fill(&_actionList2[0], &_actionList2[12], 0);
+ Common::fill(&_stopWalkerList[0], &_stopWalkerList[12], 0);
+ Common::fill(&_stopWalkerTrigger[0], &_stopWalkerTrigger[12], 0);
Common::fill(&_spriteSetsPresent[0], &_spriteSetsPresent[PLAYER_SPRITES_FILE_COUNT], false);
}
@@ -170,7 +171,8 @@ void Player::dirChanged() {
_facing = (diff >= 0) ? (Facing)_directionListIndexes[_facing + 20] :
(Facing)_directionListIndexes[_facing + 10];
- setupFrame();
+ selectSeries();
+
if ((_facing == _turnToFacing) && !_moving)
updateFrame();
@@ -182,31 +184,33 @@ void Player::cancelCommand() {
_action->_inProgress = false;
}
-void Player::setupFrame() {
+void Player::selectSeries() {
Scene &scene = _vm->_game->_scene;
- resetActionList();
- _frameOffset = 0;
+ clearStopList();
+ _mirror = false;
+
_spritesIdx = _directionListIndexes[_facing];
if (!_spriteSetsPresent[_spritesIdx]) {
// Direction isn't present, so use alternate direction, with entries flipped
_spritesIdx -= 4;
- _frameOffset = 0x8000;
+ _mirror = true;
}
SpriteAsset &spriteSet = *scene._sprites[_spritesStart + _spritesIdx];
assert(spriteSet._charInfo);
- _unk1 = MAX(spriteSet._charInfo->_unk1, 100);
- setTicksAmount();
+ _velocity = MAX(spriteSet._charInfo->_velocity, 100);
+ setBaseFrameRate();
_frameCount = spriteSet._charInfo->_totalFrames;
if (_frameCount == 0)
_frameCount = spriteSet.getCount();
- _yScale = spriteSet._charInfo->_yScale;
+ _centerOfGravity = spriteSet._charInfo->_centerOfGravity;
+
+ if ((_frameNumber <= 0) || (_frameNumber > _frameCount))
+ _frameNumber = 1;
- if ((_frameNum <= 0) || (_frameNum > _frameCount))
- _frameNum = 1;
_forceRefresh = true;
}
@@ -216,32 +220,34 @@ void Player::updateFrame() {
assert(spriteSet._charInfo);
if (!spriteSet._charInfo->_numEntries) {
- _frameNum = 1;
+ _frameNumber = 1;
} else {
- _frameListIndex = _actionList[_actionIndex];
+ _frameListIndex = _stopWalkerList[_stopWalkerIndex];
if (!_visible) {
- _unk2 = 0;
+ _upcomingTrigger = 0;
}
else {
- _unk2 = _actionList2[_actionIndex];
+ _upcomingTrigger = _stopWalkerTrigger[_stopWalkerIndex];
- if (_actionIndex > 0)
- --_actionIndex;
+ if (_stopWalkerIndex > 0)
+ --_stopWalkerIndex;
}
// Set the player frame number
int frameIndex = ABS(_frameListIndex);
- _frameNum = (_frameListIndex <= 0) ? spriteSet._charInfo->_frameList[frameIndex] :
+ _frameNumber = (_frameListIndex <= 0) ? spriteSet._charInfo->_frameList[frameIndex] :
spriteSet._charInfo->_frameList2[frameIndex];
// Set next waiting period in ticks
if (frameIndex == 0) {
- setTicksAmount();
+ setBaseFrameRate();
} else {
_ticksAmount = spriteSet._charInfo->_ticksList[frameIndex];
}
}
+
+ _forceRefresh = true;
}
void Player::update() {
@@ -271,9 +277,9 @@ void Player::update() {
slot._SlotType = ST_FOREGROUND;
slot._seqIndex = PLAYER_SEQ_INDEX;
slot._spritesIndex = _spritesStart + _spritesIdx;
- slot._frameNumber = _frameOffset + _frameNum;
+ slot._frameNumber = _mirror ? -_frameNumber : _frameNumber;
slot._position.x = _playerPos.x;
- slot._position.y = _playerPos.y + (_yScale * newScale) / 100;
+ slot._position.y = _playerPos.y + (_centerOfGravity * newScale) / 100;
slot._depth = newDepth;
slot._scale = newScale;
@@ -304,7 +310,7 @@ void Player::update() {
// has moved off-screen
if (_newSceneId) {
SpriteAsset *asset = scene._sprites[slot._spritesIndex];
- MSprite *frame = asset->getFrame(_frameNum - 1);
+ MSprite *frame = asset->getFrame(_frameNumber - 1);
int xScale = frame->w * newScale / 200;
int yScale = frame->h * newScale / 100;
int playerX = slot._position.x;
@@ -326,19 +332,19 @@ void Player::update() {
_forceRefresh = false;
}
-void Player::resetActionList() {
- _actionList[0] = 0;
- _actionList2[0] = 0;
- _actionIndex = 0;
- _unk2 = 0;
- _unk3 = 0;
+void Player::clearStopList() {
+ _stopWalkerList[0] = 0;
+ _stopWalkerTrigger[0] = 0;
+ _stopWalkerIndex = 0;
+ _upcomingTrigger = 0;
+ _trigger = 0;
}
void Player::setDest(const Common::Point &pt, Facing facing) {
Scene &scene = _vm->_game->_scene;
- resetActionList();
- setTicksAmount();
+ clearStopList();
+ setBaseFrameRate();
_moving = true;
_targetFacing = facing;
@@ -433,10 +439,10 @@ void Player::move() {
else if (!_moving)
updateFrame();
- int var1 = _unk1;
+ int velocity = _velocity;
if (_unk4 && (_hypotenuse > 0)) {
int v1 = -(_currentScale - 100) * (_posDiff.x - 1) / _hypotenuse + _currentScale;
- var1 = MAX(1, 10000 / (v1 * _currentScale * var1));
+ velocity = MAX(1, 10000 / (v1 * _currentScale * velocity));
}
if (!_moving || (_facing != _turnToFacing))
@@ -444,7 +450,7 @@ void Player::move() {
Common::Point newPos = _playerPos;
- if (_v8452E < var1) {
+ if (_v8452E < velocity) {
do {
if (_v8452C < _posDiff.x)
_v8452C += _posDiff.y;
@@ -470,10 +476,10 @@ void Player::move() {
_v8452E += _v84530;
- } while ((_v8452E < var1) && !routeFlag && ((_posChange.x > 0) || (_posChange.y > 0) || (_newSceneId != 0)));
+ } while ((_v8452E < velocity) && !routeFlag && ((_posChange.x > 0) || (_posChange.y > 0) || (_newSceneId != 0)));
}
- _v8452E -= var1;
+ _v8452E -= velocity;
if (routeFlag)
cancelCommand();
@@ -512,15 +518,15 @@ void Player::idle() {
// Reset back to the start of the list
_frameListIndex = 0;
else {
- _frameNum += direction;
+ _frameNumber += direction;
_forceRefresh = true;
- if (spriteSet._charInfo->_frameList2[frameIndex] < _frameNum) {
- _unk3 = _unk2;
+ if (spriteSet._charInfo->_frameList2[frameIndex] < _frameNumber) {
+ _trigger = _upcomingTrigger;
updateFrame();
}
- if (spriteSet._charInfo->_frameList[frameIndex] < _frameNum) {
- _unk3 = _unk2;
+ if (spriteSet._charInfo->_frameList[frameIndex] < _frameNumber) {
+ _trigger = _upcomingTrigger;
updateFrame();
}
}
@@ -528,8 +534,8 @@ void Player::idle() {
void Player::postUpdate() {
if (_moving) {
- if (++_frameNum > _frameCount)
- _frameNum = 1;
+ if (++_frameNumber > _frameCount)
+ _frameNumber = 1;
_forceRefresh = true;
} else {
if (!_forceRefresh)
@@ -559,7 +565,7 @@ int Player::getScale(int yp) {
return MIN(scale, 100);
}
-void Player::setTicksAmount() {
+void Player::setBaseFrameRate() {
Scene &scene = _vm->_game->_scene;
SpriteAsset &spriteSet = *scene._sprites[_spritesStart + _spritesIdx];
diff --git a/engines/mads/player.h b/engines/mads/player.h
index 004c412901..71f3406f18 100644
--- a/engines/mads/player.h
+++ b/engines/mads/player.h
@@ -51,20 +51,20 @@ private:
MADSEngine *_vm;
bool _highSprites;
bool _spriteSetsPresent[PLAYER_SPRITES_FILE_COUNT];
- int _frameOffset;
+ bool _mirror;
int _frameCount;
int _frameListIndex;
- int _actionIndex;
bool _v844BC;
int _v8452E;
int _v8452C;
int _v84530;
int _routeLength;
- int _actionList[12];
- int _actionList2[12];
+ int _stopWalkerList[12];
+ int _stopWalkerTrigger[12];
+ int _stopWalkerIndex;
int _hypotenuse;
- void resetActionList();
+ void clearStopList();
void move();
@@ -80,7 +80,7 @@ private:
*/
int getScale(int yp);
- void setTicksAmount();
+ void setBaseFrameRate();
void setupRoute();
@@ -117,7 +117,7 @@ public:
bool _priorVisible;
bool _visible3;
bool _walkAnywhere;
- int _frameNum;
+ int _frameNumber;
bool _loadsFirst;
bool _loadedFirst;
Common::Point _playerPos;
@@ -130,12 +130,12 @@ public:
int _special;
int _ticksAmount;
uint32 _priorTimer;
- int _unk1;
- int _unk2;
- int _unk3;
+ int _velocity;
+ int _upcomingTrigger;
+ int _trigger;
bool _unk4;
bool _forceRefresh;
- int _yScale;
+ int _centerOfGravity;
int _currentDepth;
int _currentScale;
Common::String _spritesPrefix;
@@ -167,7 +167,10 @@ public:
*/
void cancelCommand();
- void setupFrame();
+ /**
+ * Set up control parameters for the current active series (the
+ * direction which the player is facing in) */
+ void selectSeries();
void updateFrame();
diff --git a/engines/mads/scene.cpp b/engines/mads/scene.cpp
index aa57a7e6b3..62702518fc 100644
--- a/engines/mads/scene.cpp
+++ b/engines/mads/scene.cpp
@@ -290,7 +290,7 @@ void Scene::doFrame() {
_action._selectedAction = 0;
}
- if (!_vm->_game->_trigger && !player._unk3) {
+ if (!_vm->_game->_trigger && !player._trigger) {
// Refresh the dynamic hotspots if they've changed
if (_dynamicHotspots._changed)
_dynamicHotspots.refresh();
@@ -301,7 +301,7 @@ void Scene::doFrame() {
}
if (_action._selectedAction && player._stepEnabled && !_action._startWalkFlag &&
- !_vm->_game->_trigger && !player._unk3) {
+ !_vm->_game->_trigger && !player._trigger) {
_action.startAction();
if (_action._activeAction._verbId == Nebular::NOUN_LOOK_AT) {
_action._activeAction._verbId = VERB_LOOK;
@@ -512,7 +512,7 @@ void Scene::doSceneStep() {
_vm->_game->_sectionHandler->step();
_vm->_game->_player.step();
- _vm->_game->_player._unk3 = 0;
+ _vm->_game->_player._trigger = 0;
if (_vm->_game->_abortTimersMode == ABORTMODE_1)
_vm->_game->_trigger = 0;
diff --git a/engines/mads/sequence.cpp b/engines/mads/sequence.cpp
index 97d8674f51..9a8e2c62e6 100644
--- a/engines/mads/sequence.cpp
+++ b/engines/mads/sequence.cpp
@@ -495,7 +495,7 @@ void SequenceList::setScale(int spriteIdx, int scale) {
void SequenceList::setMsgLayout(int seqIndex) {
Player &player = _vm->_game->_player;
- int yp = player._playerPos.y + (player._yScale * player._currentScale) / 100;
+ int yp = player._playerPos.y + (player._centerOfGravity * player._currentScale) / 100;
setMsgPosition(seqIndex, Common::Point(player._playerPos.x, yp));
setDepth(seqIndex, player._currentDepth);
setScale(seqIndex, player._currentScale);