diff options
author | Eugene Sandulenko | 2013-08-10 02:32:00 +0300 |
---|---|---|
committer | Eugene Sandulenko | 2013-09-06 14:51:12 +0300 |
commit | d866e2aabf5e69481b0feb797a075b469eaa1bb9 (patch) | |
tree | 787facf16f63965c5b824625fa24959acaebfc57 /engines/fullpipe/statics.cpp | |
parent | a80f93464031b9d48c05dc167ec220574b887ce0 (diff) | |
download | scummvm-rg350-d866e2aabf5e69481b0feb797a075b469eaa1bb9.tar.gz scummvm-rg350-d866e2aabf5e69481b0feb797a075b469eaa1bb9.tar.bz2 scummvm-rg350-d866e2aabf5e69481b0feb797a075b469eaa1bb9.zip |
FULLPIPE: First phase of StaticANIObject::update() implementation
Diffstat (limited to 'engines/fullpipe/statics.cpp')
-rw-r--r-- | engines/fullpipe/statics.cpp | 170 |
1 files changed, 159 insertions, 11 deletions
diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index e64c3d2dfc..edbb5f7990 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -62,6 +62,26 @@ void CStepArray::clear() { } } +Common::Point *CStepArray::getCurrPoint(Common::Point *point) { + if (_isEos || _points == 0) { + point->x = 0; + point->y = 0; + } else { + point = _points[_currPointIndex]; + } + return point; +} + +bool CStepArray::gotoNextPoint() { + if (_currPointIndex < _maxPointIndex) { + _currPointIndex++; + return true; + } else { + _isEos = 1; + return false; + } +} + StaticANIObject::StaticANIObject() { _shadowsOn = 1; _field_30 = 0; @@ -405,7 +425,116 @@ Common::Point *StaticANIObject::getCurrDimensions(Common::Point &p) { } void StaticANIObject::update(int counterdiff) { - warning("STUB: StaticANIObject::update(%d)", counterdiff); + int mqid; + + debug(0, "StaticANIObject::update()"); + + if (_flags & 2) { + _messageNum--; + if (_messageNum) + return; + + mqid = _messageQueueId; + _messageQueueId = 0; + _flags ^= 2; + + updateGlobalMessageQueue(mqid, _id); + return; + } + + Common::Point point; + ExCommand *ex, *newex, *newex1, *newex2; + + if (_movement) { + _movement->_counter += counterdiff; + if (_movement->_counter >= _movement->_counterMax) { + _movement->_counter = 0; + + if (_flags & 1) { + if (_counter) { + _counter--; + } else { + DynamicPhase *dyn = _movement->_currDynamicPhase; + if (dyn->_initialCountdown != dyn->_countdown) + goto LABEL_40; + ex = dyn->getExCommand(); + if (!ex || ex->_messageKind == 35) + goto LABEL_40; + newex = new ExCommand(ex); + newex->_excFlags |= 2; + if (newex->_messageKind == 17) { + newex->_parentId = _id; + newex->_keyCode = _field_4; + } + ex->sendMessage(); + if (_movement) { + LABEL_40: + if (dyn->_initialCountdown != dyn->_countdown + || dyn->_field_68 == 0 + || (newex1 = new ExCommand(_id, 17, dyn->_field_68, 0, 0, 0, 1, 0, 0, 0)), + newex1->_excFlags = 2, + newex1->_keyCode = _field_4, + newex1->sendMessage(), + (_movement != 0)) { + if (_movement->gotoNextFrame(_callback1, _callback2)) { + setOXY(_movement->_ox, _movement->_oy); + _counter = _initialCounter; + if (dyn->_initialCountdown == dyn->_countdown) { + ex = dyn->getExCommand(); + if (ex) { + if (ex->_messageKind == 35) { + newex2 = new ExCommand(ex); + ex->_excFlags |= 2; + ex->sendMessage(); + } + } + } + } else { + stopAnim_maybe(); + } + if (_movement) { + _stepArray.getCurrPoint(&point); + setOXY(point.x + _ox, point.y + _oy); + _stepArray.gotoNextPoint(); + if (_someDynamicPhaseIndex == _movement->_currDynamicPhaseIndex) + adjustSomeXY(); + } + } + } + } + } else if (_flags & 0x20) { + _flags ^= 0x20; + _flags |= 1; + _movement->gotoFirstFrame(); + _movement->getCurrDynamicPhaseXY(point); + + Common::Point pointS; + _statics->getSomeXY(pointS); + setOXY(_ox + point.x + _movement->_mx - pointS.x, + _oy + point.y + _movement->_my - pointS.y); + } + } + } else { + if (_statics) { + if (_messageQueueId) { + if (_statics->_countdown) { + _statics->_countdown--; + return; + } + mqid = _messageQueueId; + _messageQueueId = 0; + updateGlobalMessageQueue(mqid, _id); + } + } + } +} + +void StaticANIObject::stopAnim_maybe() { + warning("STUB: StaticANIObject::stopAnim_maybe()"); +} + +void StaticANIObject::adjustSomeXY() { + warning("STUB: StaticANIObject::adjustSomeXY()"); } bool StaticANIObject::setPicAniInfo(PicAniInfo *picAniInfo) { @@ -731,7 +860,7 @@ void Movement::setDynamicPhaseIndex(int index) { gotoNextFrame(0, 0); while (_currDynamicPhaseIndex > index) - gotoPrevFrame(0, 0); + gotoPrevFrame(); } void Movement::loadPixelData() { @@ -768,24 +897,24 @@ void Movement::removeFirstPhase() { _updateFlag1 = 0; } -void Movement::gotoNextFrame(int callback1, int callback2) { +bool Movement::gotoNextFrame(int callback1, int callback2) { debug(0, "Movement::gotoNextFrame(%d, %d)", callback1, callback2); if (!callback2) { if (_currMovement) { if ((uint)_currDynamicPhaseIndex == _currMovement->_dynamicPhases.size() - 1 && !(((DynamicPhase *)(_currMovement->_dynamicPhases.back()))->_countdown)) { - return; + return false; } } else if ((uint)_currDynamicPhaseIndex == _dynamicPhases.size() - 1 && !(((DynamicPhase *)(_dynamicPhases.back()))->_countdown)) { - return; + return false; } } if (_currDynamicPhase->_countdown) { _currDynamicPhase->_countdown--; - return; + return true; } Common::Point point; @@ -806,11 +935,17 @@ void Movement::gotoNextFrame(int callback1, int callback2) { else _currDynamicPhaseIndex++; + bool result = true; + if (_currMovement) { - if (_currMovement->_dynamicPhases.size() <= (uint)_currDynamicPhaseIndex) + if (_currMovement->_dynamicPhases.size() <= (uint)_currDynamicPhaseIndex) { _currDynamicPhaseIndex = _currMovement->_dynamicPhases.size() - 1; - if (_currDynamicPhaseIndex < 0) + result = (callback2 == 0); + } + if (_currDynamicPhaseIndex < 0) { _currDynamicPhaseIndex = 0; + result = false; + } if (_currMovement->_framePosOffsets) { if (callback1) { point = *_currMovement->_framePosOffsets[_currDynamicPhaseIndex]; @@ -842,10 +977,14 @@ void Movement::gotoNextFrame(int callback1, int callback2) { } } } else { - if (_dynamicPhases.size() <= (uint)_currDynamicPhaseIndex) + if (_dynamicPhases.size() <= (uint)_currDynamicPhaseIndex) { _currDynamicPhaseIndex = _dynamicPhases.size() - 1; - if (_currDynamicPhaseIndex < 0) + result = (callback2 == 0); + } + if (_currDynamicPhaseIndex < 0) { _currDynamicPhaseIndex = 0; + result = false; + } if (_framePosOffsets) { if (callback1) { @@ -875,10 +1014,19 @@ void Movement::gotoNextFrame(int callback1, int callback2) { _oy += point.y; _currDynamicPhase->_countdown = _currDynamicPhase->_initialCountdown; + + return result; } -void Movement::gotoPrevFrame(int callback1, int callback2) { +bool Movement::gotoPrevFrame() { warning("STUB: Movement::gotoPrevFrame()"); + + return true; +} + +void Movement::gotoFirstFrame() { + while (_currDynamicPhaseIndex) + gotoPrevFrame(); } void Movement::gotoLastFrame() { |