Skip to content

Commit

Permalink
FULLPIPE: First phase of StaticANIObject::update() implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
sev- committed Sep 6, 2013
1 parent a80f934 commit d866e2a
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 20 deletions.
1 change: 1 addition & 0 deletions engines/fullpipe/fullpipe.cpp
Expand Up @@ -329,6 +329,7 @@ void FullpipeEngine::updateScreen() {
}
}
} else if (_currentScene) {
_currentScene->update(42); // HACK. FIXME
_currentScene->draw();

if (_inventoryScene)
Expand Down
7 changes: 7 additions & 0 deletions engines/fullpipe/messages.cpp
Expand Up @@ -510,4 +510,11 @@ void processMessages() {
}
}

void updateGlobalMessageQueue(int id, int objid) {
MessageQueue *m = g_fullpipe->_globalMessageQueueList->getMessageQueueById(id);
if (m) {
m->update();
}
}

} // End of namespace Fullpipe
1 change: 1 addition & 0 deletions engines/fullpipe/messages.h
Expand Up @@ -147,6 +147,7 @@ bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id);
void clearMessageHandlers();
void postMessage(ExCommand *ex);
void processMessages();
void updateGlobalMessageQueue(int id, int objid);

} // End of namespace Fullpipe

Expand Down
2 changes: 2 additions & 0 deletions engines/fullpipe/scene.cpp
Expand Up @@ -407,6 +407,8 @@ void Scene::updateScrolling() {
}

void Scene::update(int counterdiff) {
debug(0, "Scene::update(%d)", counterdiff);

for (CPtrList::iterator s = _staticANIObjectList2.begin(); s != _staticANIObjectList2.end(); ++s)
((StaticANIObject *)*s)->update(counterdiff);
}
Expand Down
170 changes: 159 additions & 11 deletions engines/fullpipe/statics.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -731,7 +860,7 @@ void Movement::setDynamicPhaseIndex(int index) {
gotoNextFrame(0, 0);

while (_currDynamicPhaseIndex > index)
gotoPrevFrame(0, 0);
gotoPrevFrame();
}

void Movement::loadPixelData() {
Expand Down Expand Up @@ -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;
Expand All @@ -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];
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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() {
Expand Down
19 changes: 10 additions & 9 deletions engines/fullpipe/statics.h
Expand Up @@ -42,12 +42,12 @@ class CStepArray : public CObject {
void clear();

int getCurrPointIndex() { return _currPointIndex; }
Common::Point *getCurrPoint(Common::Point *point);
bool gotoNextPoint();
};

class StaticPhase : public Picture {
friend class DynamicPhase;
friend class Movement;

public:
int16 _initialCountdown;
int16 _countdown;
int16 _field_68;
Expand All @@ -63,10 +63,7 @@ class StaticPhase : public Picture {
};

class DynamicPhase : public StaticPhase {
friend class Movement;
friend class Statics;
friend class StaticANIObject;

public:
int _someX;
int _someY;
Common::Rect *_rect;
Expand Down Expand Up @@ -150,8 +147,9 @@ class Movement : public GameObject {
void setDynamicPhaseIndex(int index);

void removeFirstPhase();
void gotoNextFrame(int callback1, int callback2);
void gotoPrevFrame(int callback1, int callback2);
bool gotoNextFrame(int callback1, int callback2);
bool gotoPrevFrame();
void gotoFirstFrame();
void gotoLastFrame();

void loadPixelData();
Expand Down Expand Up @@ -218,6 +216,9 @@ class StaticANIObject : public GameObject {

MovTable *countMovements();
void setSpeed(int speed);

void stopAnim_maybe();
void adjustSomeXY();
};

struct MovTable {
Expand Down

0 comments on commit d866e2a

Please sign in to comment.