diff options
25 files changed, 198 insertions, 163 deletions
diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp index a1e01b2373..2c0cba8f84 100644 --- a/engines/fullpipe/behavior.cpp +++ b/engines/fullpipe/behavior.cpp @@ -63,7 +63,7 @@ void BehaviorManager::initBehavior(Scene *sc, GameVar *var) { StaticANIObject *ani = sc->getStaticANIObject1ByName(subvar->_varName, -1); if (ani) { for (uint i = 0; i < sc->_staticANIObjectList1.size(); i++) { - if (((StaticANIObject *)sc->_staticANIObjectList1[i])->_id == ani->_id) { + if (sc->_staticANIObjectList1[i]->_id == ani->_id) { _behaviors.push_back(BehaviorInfo()); BehaviorInfo &behinfo = _behaviors.back(); behinfo.initObjectBehavior(subvar, sc, ani); diff --git a/engines/fullpipe/gameloader.cpp b/engines/fullpipe/gameloader.cpp index 70cb937da4..ce98d7c1be 100644 --- a/engines/fullpipe/gameloader.cpp +++ b/engines/fullpipe/gameloader.cpp @@ -38,12 +38,32 @@ Inventory2 *getGameLoaderInventory() { return &g_fp->_gameLoader->_inventory; } -MctlCompound *getSc2MctlCompoundBySceneId(int16 sceneId) { - for (uint i = 0; i < g_fp->_gameLoader->_sc2array.size(); i++) - if (g_fp->_gameLoader->_sc2array[i]._sceneId == sceneId) - return (MctlCompound *)g_fp->_gameLoader->_sc2array[i]._motionController; +static MotionController *getMotionControllerBySceneId(int16 sceneId) { + for (uint i = 0; i < g_fp->_gameLoader->_sc2array.size(); i++) { + if (g_fp->_gameLoader->_sc2array[i]._sceneId == sceneId) { + return g_fp->_gameLoader->_sc2array[i]._motionController; + } + } + + return nullptr; +} - return 0; +MovGraph *getSc2MovGraphBySceneId(int16 sceneId) { + MotionController *mc = getMotionControllerBySceneId(sceneId); + if (mc) { + assert(mc->_objtype == kObjTypeMovGraph); + return static_cast<MovGraph *>(mc); + } + return nullptr; +} + +MctlCompound *getSc2MctlCompoundBySceneId(int16 sceneId) { + MotionController *mc = getMotionControllerBySceneId(sceneId); + if (mc) { + assert(mc->_objtype == kObjTypeMctlCompound); + return static_cast<MctlCompound *>(mc); + } + return nullptr; } InteractionController *getGameLoaderInteractionController() { @@ -136,7 +156,7 @@ bool GameLoader::load(MfcArchive &file) { debugC(1, kDebugLoading, "sc: %s", tmp); - _sc2array[i].loadFile((const char *)tmp); + _sc2array[i].loadFile(tmp); } _preloadItems.load(file); @@ -146,7 +166,7 @@ bool GameLoader::load(MfcArchive &file) { debugC(1, kDebugLoading, "_field_FA: %d\n_field_F8: %d", _field_FA, _field_F8); - _gameVar = (GameVar *)file.readClass(); + _gameVar = file.readClass<GameVar>(); return true; } @@ -615,7 +635,7 @@ bool Sc2::load(MfcArchive &file) { _sceneId = file.readUint16LE(); - _motionController = (MotionController *)file.readClass(); + _motionController = file.readClass<MotionController>(); _count1 = file.readUint32LE(); debugC(4, kDebugLoading, "count1: %d", _count1); diff --git a/engines/fullpipe/gameloader.h b/engines/fullpipe/gameloader.h index 39ccb7784c..10c0912416 100644 --- a/engines/fullpipe/gameloader.h +++ b/engines/fullpipe/gameloader.h @@ -39,6 +39,7 @@ class MctlCompound; class InputController; class InteractionController; class MotionController; +class MovGraph; class Sc2 : public CObject { public: @@ -148,6 +149,7 @@ void parseSavegameHeader(Fullpipe::FullpipeSavegameHeader &header, SaveStateDesc Inventory2 *getGameLoaderInventory(); InteractionController *getGameLoaderInteractionController(); MctlCompound *getSc2MctlCompoundBySceneId(int16 sceneId); +MovGraph *getSc2MovGraphBySceneId(int16 sceneId); MctlCompound *getCurrSceneSc2MotionController(); } // End of namespace Fullpipe diff --git a/engines/fullpipe/gfx.cpp b/engines/fullpipe/gfx.cpp index da626c7f1f..b12edcb621 100644 --- a/engines/fullpipe/gfx.cpp +++ b/engines/fullpipe/gfx.cpp @@ -300,8 +300,8 @@ void GameObject::renumPictures(Common::Array<StaticANIObject *> *lst) { int *buf = (int *)calloc(lst->size() + 2, sizeof(int)); for (uint i = 0; i < lst->size(); i++) { - if (_id == ((GameObject *)((*lst)[i]))->_id) - buf[((GameObject *)((*lst)[i]))->_odelay] = 1; + if (_id == (*lst)[i]->_id) + buf[(*lst)[i]->_odelay] = 1; } if (buf[_odelay]) { @@ -318,8 +318,8 @@ void GameObject::renumPictures(Common::Array<PictureObject *> *lst) { int *buf = (int *)calloc(lst->size() + 2, sizeof(int)); for (uint i = 0; i < lst->size(); i++) { - if (_id == ((GameObject *)((*lst)[i]))->_id) - buf[((GameObject *)((*lst)[i]))->_odelay] = 1; + if (_id == (*lst)[i]->_id) + buf[(*lst)[i]->_odelay] = 1; } if (buf[_odelay]) { @@ -348,7 +348,7 @@ bool GameObject::getPicAniInfo(PicAniInfo *info) { } if (_objtype == kObjTypeStaticANIObject) { - StaticANIObject *ani = (StaticANIObject *)this; + StaticANIObject *ani = static_cast<StaticANIObject *>(this); info->type = (ani->_messageQueueId << 16) | 1; info->objectId = ani->_id; @@ -398,8 +398,8 @@ bool GameObject::setPicAniInfo(PicAniInfo *picAniInfo) { return true; } - if (picAniInfo->type & 1) { - StaticANIObject *ani = (StaticANIObject *)this; + if (picAniInfo->type & 1 && _objtype == kObjTypeStaticANIObject) { + StaticANIObject *ani = static_cast<StaticANIObject *>(this); ani->_messageQueueId = (picAniInfo->type >> 16) & 0xffff; ani->_odelay = picAniInfo->field_8; diff --git a/engines/fullpipe/input.cpp b/engines/fullpipe/input.cpp index 499b985d22..6bd992a4d2 100644 --- a/engines/fullpipe/input.cpp +++ b/engines/fullpipe/input.cpp @@ -215,7 +215,7 @@ void FullpipeEngine::winArcade() { void FullpipeEngine::updateCursorCommon() { GameObject *ani = _currentScene->getStaticANIObjectAtPos(_mouseVirtX, _mouseVirtY); - GameObject *pic = _currentScene->getPictureObjectAtPos(_mouseVirtX, _mouseVirtY); + PictureObject *pic = _currentScene->getPictureObjectAtPos(_mouseVirtX, _mouseVirtY); if (!ani || (pic && pic->_priority < ani->_priority)) ani = pic; @@ -241,7 +241,7 @@ void FullpipeEngine::updateCursorCommon() { _cursorId = PIC_CSR_DEFAULT_INV; return; } - if (_objectIdAtCursor == ANI_LIFTBUTTON && lift_getButtonIdP(((StaticANIObject *)ani)->_statics->_staticsId)) { + if (_objectIdAtCursor == ANI_LIFTBUTTON && ani->_objtype == kObjTypeStaticANIObject && lift_getButtonIdP(static_cast<StaticANIObject *>(ani)->_statics->_staticsId)) { _cursorId = PIC_CSR_LIFT; return; } diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp index 1d04aa019d..b15ae80150 100644 --- a/engines/fullpipe/interaction.cpp +++ b/engines/fullpipe/interaction.cpp @@ -40,8 +40,8 @@ bool canInteractAny(GameObject *obj1, GameObject *obj2, int invId) { sceneId = g_fp->_currentScene->_sceneId; InteractionController *intC = getGameLoaderInteractionController(); - for (ObList::iterator i = intC->_interactions.begin(); i != intC->_interactions.end(); ++i) { - Interaction *intr = (Interaction *)*i; + for (InteractionController::InteractionList::iterator i = intC->_interactions.begin(); i != intC->_interactions.end(); ++i) { + Interaction *intr = *i; if (intr->_sceneId > 0 && intr->_sceneId != sceneId) break; @@ -69,10 +69,7 @@ bool InteractionController::load(MfcArchive &file) { int static_compSceneId = 0; -bool InteractionController::compareInteractions(const void *p1, const void *p2) { - const Interaction *i1 = (const Interaction *)p1; - const Interaction *i2 = (const Interaction *)p2; - +bool InteractionController::compareInteractions(const Interaction *i1, const Interaction *i2) { if (i2->_sceneId < i1->_sceneId) { if (i1->_sceneId != static_compSceneId) return false; @@ -118,8 +115,8 @@ bool InteractionController::handleInteraction(StaticANIObject *subj, GameObject MessageQueue *mq; ExCommand *ex; - for (ObList::iterator i = _interactions.begin(); i != _interactions.end(); ++i) { - Interaction *cinter = (Interaction *)*i; + for (InteractionList::iterator i = _interactions.begin(); i != _interactions.end(); ++i) { + Interaction *cinter = *i; if (!cinter->canInteract(subj, obj, invId)) continue; @@ -134,8 +131,8 @@ bool InteractionController::handleInteraction(StaticANIObject *subj, GameObject obj->getPicAniInfo(&aniInfo); - if (cinter->_staticsId1) { - StaticANIObject *ani = (StaticANIObject *)obj; + if (cinter->_staticsId1 && obj->_objtype == kObjTypeStaticANIObject) { + StaticANIObject *ani = static_cast<StaticANIObject *>(obj); ani->_messageQueueId = 0; ani->changeStatics2(cinter->_staticsId1); } @@ -241,7 +238,7 @@ LABEL_38: if (inter->isOverlapping(subj, obj)) { if (obj->_objtype == kObjTypeStaticANIObject) { - StaticANIObject *ani = (StaticANIObject *)obj; + StaticANIObject *ani = static_cast<StaticANIObject *>(obj); ani->queueMessageQueue(0); @@ -304,7 +301,7 @@ LABEL_38: obj->getPicAniInfo(&aniInfo); if (obj->_objtype == kObjTypeStaticANIObject && inter->_staticsId1) { - StaticANIObject *ani = (StaticANIObject *)obj; + StaticANIObject *ani = static_cast<StaticANIObject *>(obj); ani->_messageQueueId = 0; ani->changeStatics2(inter->_staticsId1); @@ -346,7 +343,10 @@ LABEL_38: if (!inter->_staticsId1 || !(inter->_flags & 1)) return true; - StaticANIObject *ani = (StaticANIObject *)obj; + if (obj->_objtype != kObjTypeStaticANIObject) + return false; + + StaticANIObject *ani = static_cast<StaticANIObject *>(obj); if (!ani->isIdle()) return false; @@ -407,8 +407,8 @@ LABEL_38: } Interaction *InteractionController::getInteractionByObjectIds(int obId, int obId2, int obId3) { - for (ObList::iterator i = _interactions.begin(); i != _interactions.end(); ++i) { - Interaction *intr = (Interaction *)*i; + for (InteractionList::iterator i = _interactions.begin(); i != _interactions.end(); ++i) { + Interaction *intr = *i; if (intr->_objectId1 == obId && intr->_objectId2 == obId2 && intr->_objectId3 == obId3) return intr; @@ -458,7 +458,7 @@ bool Interaction::load(MfcArchive &file) { _flags = file.readUint32LE(); _actionName = file.readPascalString(); - _messageQueue = (MessageQueue *)file.readClass(); + _messageQueue = file.readClass<MessageQueue>(); return true; } @@ -480,7 +480,7 @@ bool Interaction::canInteract(GameObject *obj1, GameObject *obj2, int invId) { if (obj2->_objtype != kObjTypeStaticANIObject) return false; - StaticANIObject *st = (StaticANIObject *)obj2; + StaticANIObject *st = static_cast<StaticANIObject *>(obj2); if (!st->_statics) return false; diff --git a/engines/fullpipe/interaction.h b/engines/fullpipe/interaction.h index 97fb19beb9..9ffcdccc91 100644 --- a/engines/fullpipe/interaction.h +++ b/engines/fullpipe/interaction.h @@ -62,13 +62,16 @@ class Interaction : public CObject { }; class InteractionController : public CObject { - public: - ObList _interactions; - int16 _field_20; + friend bool canInteractAny(GameObject *obj1, GameObject *obj2, int invId); + +public: + typedef ObList<Interaction> InteractionList; bool _flag24; private: - static bool compareInteractions(const void *p1, const void *p2); + InteractionList _interactions; + int16 _field_20; + static bool compareInteractions(const Interaction *i1, const Interaction *i2); public: InteractionController() : _field_20(0), _flag24(true) {} diff --git a/engines/fullpipe/inventory.cpp b/engines/fullpipe/inventory.cpp index 5ddf26d06a..cb9eec75c3 100644 --- a/engines/fullpipe/inventory.cpp +++ b/engines/fullpipe/inventory.cpp @@ -238,7 +238,7 @@ void Inventory2::rebuildItemRects() { int itemY = 0; for (uint i = 0; i < _scene->_picObjList.size(); i++) { - PictureObject *pic = (PictureObject *)_scene->_picObjList[i]; + PictureObject *pic = _scene->_picObjList[i]; for (uint j = 0; j < _itemsPool.size(); j++) { if (_itemsPool[j]->pictureObjectNormal == pic->_id) { diff --git a/engines/fullpipe/lift.cpp b/engines/fullpipe/lift.cpp index 113ddf719e..1bbe5a726b 100644 --- a/engines/fullpipe/lift.cpp +++ b/engines/fullpipe/lift.cpp @@ -195,7 +195,7 @@ void FullpipeEngine::lift_init(Scene *sc, int enterSeq, int exitSeq) { _lift = sc->getStaticANIObject1ById(ANI_LIFT, -1); for (uint i = 0; i < sc->_staticANIObjectList1.size(); i++) { - StaticANIObject *ani = (StaticANIObject *)sc->_staticANIObjectList1[i]; + StaticANIObject *ani = sc->_staticANIObjectList1[i]; if (ani->_id == ANI_LIFTBUTTON) ani->_statics = ani->getStaticsById(lift_getButtonIdP(ani->_statics->_staticsId)); @@ -205,7 +205,7 @@ void FullpipeEngine::lift_init(Scene *sc, int enterSeq, int exitSeq) { if (var) { for (var = var->_subVars; var; var = var->_nextVarObj) { for (uint i = 0; i < sc->_staticANIObjectList1.size(); i++) { - StaticANIObject *ani = (StaticANIObject *)sc->_staticANIObjectList1[i]; + StaticANIObject *ani = sc->_staticANIObjectList1[i]; if (ani->_id == ANI_LIFTBUTTON) { int id = lift_getButtonIdN(ani->_statics->_staticsId); @@ -506,7 +506,7 @@ bool FullpipeEngine::lift_checkButton(const char *varName) { void FullpipeEngine::lift_setButtonStatics(Scene *sc, int buttonId) { for (uint i = 0; i < sc->_staticANIObjectList1.size(); i++) { - StaticANIObject *ani = (StaticANIObject *)sc->_staticANIObjectList1[i]; + StaticANIObject *ani = sc->_staticANIObjectList1[i]; if (ani->_id == ANI_LIFTBUTTON) { int id = lift_getButtonIdN(ani->_statics->_staticsId); diff --git a/engines/fullpipe/messagehandlers.cpp b/engines/fullpipe/messagehandlers.cpp index 61b3429c50..d5f0e0d700 100644 --- a/engines/fullpipe/messagehandlers.cpp +++ b/engines/fullpipe/messagehandlers.cpp @@ -517,7 +517,7 @@ int global_messageHandler3(ExCommand *cmd) { return doSomeAnimation2(cmd->_parentId, cmd->_param); case 63: if (cmd->_objtype == kObjTypeObjstateCommand) { - ObjstateCommand *c = (ObjstateCommand *)cmd; + ObjstateCommand *c = static_cast<ObjstateCommand *>(cmd); result = 1; g_fp->setObjectState(c->_objCommandName.c_str(), c->_value); } @@ -595,12 +595,14 @@ int global_messageHandler4(ExCommand *cmd) { if (flags <= 0) flags = -1; - ExCommand2 *cmd2 = (ExCommand2 *)cmd; + if (cmd->_objtype == kObjTypeExCommand2) { + ExCommand2 *cmd2 = static_cast<ExCommand2 *>(cmd); - if (cmd->_excFlags & 1) { - ani->startAnimSteps(cmd->_messageNum, 0, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize, flags); - } else { - ani->startAnimSteps(cmd->_messageNum, cmd->_parId, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize, flags); + if (cmd->_excFlags & 1) { + ani->startAnimSteps(cmd->_messageNum, 0, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize, flags); + } else { + ani->startAnimSteps(cmd->_messageNum, cmd->_parId, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize, flags); + } } break; } @@ -769,20 +771,20 @@ int MovGraph::messageHandler(ExCommand *cmd) { if (getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->_objtype != kObjTypeMovGraph || !ani) return 0; - MovGraph *gr = (MovGraph *)getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId); + MovGraph *gr = getSc2MovGraphBySceneId(g_fp->_currentScene->_sceneId); MovGraphLink *link = 0; double mindistance = 1.0e10; Common::Point point; - for (ObList::iterator i = gr->_links.begin(); i != gr->_links.end(); ++i) { + for (LinkList::iterator i = gr->_links.begin(); i != gr->_links.end(); ++i) { point.x = ani->_ox; point.y = ani->_oy; - double dst = gr->putToLink(&point, (MovGraphLink *)(*i), 0); + double dst = gr->putToLink(&point, *i, 0); if (dst >= 0.0 && dst < mindistance) { mindistance = dst; - link = (MovGraphLink *)(*i); + link = *i; } } diff --git a/engines/fullpipe/messages.cpp b/engines/fullpipe/messages.cpp index 22a1fe7108..e332728f5b 100644 --- a/engines/fullpipe/messages.cpp +++ b/engines/fullpipe/messages.cpp @@ -317,7 +317,7 @@ MessageQueue::MessageQueue(MessageQueue *src, int parId, int field_38) { MessageQueue::~MessageQueue() { for (Common::List<ExCommand *>::iterator it = _exCommands.begin(); it != _exCommands.end(); ++it) { - ExCommand *ex = (ExCommand *)*it; + ExCommand *ex = *it; if (ex && ex->_excFlags & 2) delete ex; @@ -347,8 +347,7 @@ bool MessageQueue::load(MfcArchive &file) { _queueName = file.readPascalString(); for (int i = 0; i < count; i++) { - ExCommand *tmp = (ExCommand *)file.readClass(); - + ExCommand *tmp = file.readClass<ExCommand>(); _exCommands.push_back(tmp); } diff --git a/engines/fullpipe/modal.cpp b/engines/fullpipe/modal.cpp index 1c98f5e2df..ef3546788a 100644 --- a/engines/fullpipe/modal.cpp +++ b/engines/fullpipe/modal.cpp @@ -2340,7 +2340,7 @@ bool ModalDemo::launch() { _scene = sc; for (uint i = 1; i < sc->_picObjList.size(); i++) { - if (((PictureObject *)sc->_picObjList[i])->_id == 399) + if (sc->_picObjList[i]->_id == 399) sc->_picObjList[i]->_flags |= 4; else sc->_picObjList[i]->_flags &= 0xFFFB; diff --git a/engines/fullpipe/motion.cpp b/engines/fullpipe/motion.cpp index cfe9ecb5cb..5a106ed527 100644 --- a/engines/fullpipe/motion.cpp +++ b/engines/fullpipe/motion.cpp @@ -49,10 +49,10 @@ void MotionController::enableLinks(const char *linkName, bool enable) { if (con->_objtype == kObjTypeMovGraph) { MovGraph *gr = static_cast<MovGraph *>(con); - for (ObList::iterator l = gr->_links.begin(); l != gr->_links.end(); ++l) { - assert(((CObject *)*l)->_objtype == kObjTypeMovGraphLink); + for (MovGraph::LinkList::iterator l = gr->_links.begin(); l != gr->_links.end(); ++l) { + assert((*l)->_objtype == kObjTypeMovGraphLink); - MovGraphLink *lnk = (MovGraphLink *)*l; + MovGraphLink *lnk = static_cast<MovGraphLink *>(*l); if (lnk->_name == linkName) { if (enable) @@ -69,18 +69,18 @@ MovGraphLink *MotionController::getLinkByName(const char *name) { debugC(4, kDebugPathfinding, "MotionController::getLinkByName(%s)", name); if (_objtype == kObjTypeMctlCompound) { - MctlCompound *obj = (MctlCompound *)this; + MctlCompound *obj = static_cast<MctlCompound *>(this); for (uint i = 0; i < obj->getMotionControllerCount(); i++) { MotionController *con = obj->getMotionController(i); if (con->_objtype == kObjTypeMovGraph) { - MovGraph *gr = (MovGraph *)con; + MovGraph *gr = static_cast<MovGraph *>(con); - for (ObList::iterator l = gr->_links.begin(); l != gr->_links.end(); ++l) { - assert(((CObject *)*l)->_objtype == kObjTypeMovGraphLink); + for (MovGraph::LinkList::iterator l = gr->_links.begin(); l != gr->_links.end(); ++l) { + assert((*l)->_objtype == kObjTypeMovGraphLink); - MovGraphLink *lnk = (MovGraphLink *)*l; + MovGraphLink *lnk = static_cast<MovGraphLink *>(*l); if (lnk->_name == name) return lnk; @@ -90,12 +90,12 @@ MovGraphLink *MotionController::getLinkByName(const char *name) { } if (_objtype == kObjTypeMovGraph) { - MovGraph *gr = (MovGraph *)this; + MovGraph *gr = static_cast<MovGraph *>(this); - for (ObList::iterator l = gr->_links.begin(); l != gr->_links.end(); ++l) { - assert(((CObject *)*l)->_objtype == kObjTypeMovGraphLink); + for (MovGraph::LinkList::iterator l = gr->_links.begin(); l != gr->_links.end(); ++l) { + assert((*l)->_objtype == kObjTypeMovGraphLink); - MovGraphLink *lnk = (MovGraphLink *)*l; + MovGraphLink *lnk = static_cast<MovGraphLink *>(*l); if (lnk->_name == name) return lnk; @@ -116,14 +116,14 @@ bool MctlCompound::load(MfcArchive &file) { debugC(6, kDebugLoading, "CompoundArray[%d]", i); MctlItem *obj = new MctlItem(); - obj->_motionControllerObj = (MotionController *)file.readClass(); + obj->_motionControllerObj = file.readClass<MotionController>(); int count1 = file.readUint32LE(); debugC(6, kDebugLoading, "ConnectionPoint::count: %d", count1); for (int j = 0; j < count1; j++) { debugC(6, kDebugLoading, "ConnectionPoint[%d]", j); - MctlConnectionPoint *obj1 = (MctlConnectionPoint *)file.readClass(); + MctlConnectionPoint *obj1 = file.readClass<MctlConnectionPoint>(); obj->_connectionPoints.push_back(obj1); } @@ -132,7 +132,7 @@ bool MctlCompound::load(MfcArchive &file) { obj->_field_24 = file.readUint32LE(); debugC(6, kDebugLoading, "graphReact"); - obj->_movGraphReactObj = (MovGraphReact *)file.readClass(); + obj->_movGraphReactObj = file.readClass<MovGraphReact>(); _motionControllers.push_back(obj); } @@ -166,7 +166,7 @@ void MctlCompound::initMctlGraph() { if (_motionControllers[i]->_motionControllerObj->_objtype != kObjTypeMovGraph) continue; - MovGraph *gr = (MovGraph *)_motionControllers[i]->_motionControllerObj; + MovGraph *gr = static_cast<MovGraph *>(_motionControllers[i]->_motionControllerObj); MctlGraph *newgr = new MctlGraph(); @@ -701,10 +701,10 @@ MctlConnectionPoint *MctlCompound::findClosestConnectionPoint(int ox, int oy, in void MctlCompound::replaceNodeX(int from, int to) { for (uint i = 0; i < _motionControllers.size(); i++) { if (_motionControllers[i]->_motionControllerObj->_objtype == kObjTypeMovGraph) { - MovGraph *gr = (MovGraph *)_motionControllers[i]->_motionControllerObj; + MovGraph *gr = static_cast<MovGraph *>(_motionControllers[i]->_motionControllerObj); - for (ObList::iterator n = gr->_nodes.begin(); n != gr->_nodes.end(); ++n) { - MovGraphNode *node = (MovGraphNode *)*n; + for (MovGraph::NodeList::iterator n = gr->_nodes.begin(); n != gr->_nodes.end(); ++n) { + MovGraphNode *node = static_cast<MovGraphNode *>(*n); if (node->_x == from) node->_x = to; @@ -816,10 +816,10 @@ MovGraph::MovGraph() { } MovGraph::~MovGraph() { - for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) + for (LinkList::iterator i = _links.begin(); i != _links.end(); ++i) delete *i; - for (ObList::iterator i = _nodes.begin(); i != _nodes.end(); ++i) + for (NodeList::iterator i = _nodes.begin(); i != _nodes.end(); ++i) delete *i; detachAllObjects(); @@ -1395,10 +1395,10 @@ double MovGraph::putToLink(Common::Point *point, MovGraphLink *link, int fuzzyMa void MovGraph::recalcLinkParams() { debugC(4, kDebugPathfinding, "MovGraph::recalcLinkParams()"); - for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) { - assert(((CObject *)*i)->_objtype == kObjTypeMovGraphLink); + for (LinkList::iterator i = _links.begin(); i != _links.end(); ++i) { + assert((*i)->_objtype == kObjTypeMovGraphLink); - MovGraphLink *lnk = (MovGraphLink *)*i; + MovGraphLink *lnk = static_cast<MovGraphLink *>(*i); lnk->_flags &= 0x7FFFFFFF; @@ -1413,8 +1413,8 @@ bool MovGraph::getNearestPoint(int unusedArg, Common::Point *p, MovArr *movarr) double mindist = 1.0e20; int resx = 0, resy = 0; - for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) { - MovGraphLink *lnk = (MovGraphLink *)*i; + for (LinkList::iterator i = _links.begin(); i != _links.end(); ++i) { + MovGraphLink *lnk = static_cast<MovGraphLink *>(*i); if ((lnk->_flags & 0x10000000) && !(lnk->_flags & 0x20000000) ) { double dx1 = lnk->_graphSrc->_x - p->x; @@ -1483,8 +1483,8 @@ Common::Array<MovArr *> *MovGraph::getHitPoints(int x, int y, int *arrSize, int Common::Array<MovArr *> *arr = new Common::Array<MovArr *>; MovArr *movarr; - for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) { - MovGraphLink *lnk = (MovGraphLink *)*i; + for (LinkList::iterator i = _links.begin(); i != _links.end(); ++i) { + MovGraphLink *lnk = static_cast<MovGraphLink *>(*i); if (flag1) { Common::Point point(x, y); @@ -1556,8 +1556,8 @@ void MovGraph::findAllPaths(MovGraphLink *lnk, MovGraphLink *lnk2, Common::Array tempObList1.push_back(lnk); - for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) { - MovGraphLink *l = (MovGraphLink *)*i; + for (LinkList::iterator i = _links.begin(); i != _links.end(); ++i) { + MovGraphLink *l = static_cast<MovGraphLink *>(*i); if (l->_graphSrc != lnk->_graphSrc) { if (l->_graphDst != lnk->_graphSrc) { @@ -2430,10 +2430,10 @@ MessageQueue *MctlGraph::makeQueue(StaticANIObject *obj, int xpos, int ypos, int } MovGraphNode *MctlGraph::getHitNode(int x, int y, int strictMatch) { - for (ObList::iterator i = _nodes.begin(); i != _nodes.end(); ++i) { - assert(((CObject *)*i)->_objtype == kObjTypeMovGraphNode); + for (NodeList::iterator i = _nodes.begin(); i != _nodes.end(); ++i) { + assert((*i)->_objtype == kObjTypeMovGraphNode); - MovGraphNode *node = (MovGraphNode *)*i; + MovGraphNode *node = *i; if (!strictMatch) { if (abs(node->_x - x) < 15 && abs(node->_y - y) < 15) @@ -2719,10 +2719,10 @@ MovGraphLink *MctlGraph::getHitLink(int x, int y, int idx, int fuzzyMatch) { Common::Point point; MovGraphLink *res = 0; - for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) { - assert(((CObject *)*i)->_objtype == kObjTypeMovGraphLink); + for (LinkList::iterator i = _links.begin(); i != _links.end(); ++i) { + assert((*i)->_objtype == kObjTypeMovGraphLink); - MovGraphLink *lnk = (MovGraphLink *)*i; + MovGraphLink *lnk = static_cast<MovGraphLink *>(*i); if (fuzzyMatch) { point.x = x; @@ -2755,10 +2755,10 @@ MovGraphLink *MctlGraph::getNearestLink(int x, int y) { double mindist = 1.0e20; MovGraphLink *res = 0; - for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) { - assert(((CObject *)*i)->_objtype == kObjTypeMovGraphLink); + for (LinkList::iterator i = _links.begin(); i != _links.end(); ++i) { + assert((*i)->_objtype == kObjTypeMovGraphLink); - MovGraphLink *lnk = (MovGraphLink *)*i; + MovGraphLink *lnk = static_cast<MovGraphLink *>(*i); if (!(lnk->_flags & 0x20000000)) { double n1x = lnk->_graphSrc->_x; @@ -2802,8 +2802,8 @@ double MctlGraph::iterate(LinkInfo *linkInfoSource, LinkInfo *linkInfoDest, Comm double minDistance = -1.0; if (linkInfoSource->node) { - for (ObList::iterator i = _links.begin(); i != _links.end(); ++i) { - MovGraphLink *lnk = (MovGraphLink *)*i; + for (LinkList::iterator i = _links.begin(); i != _links.end(); ++i) { + MovGraphLink *lnk = static_cast<MovGraphLink *>(*i); if ((lnk->_graphSrc == linkInfoSource->node || lnk->_graphDst == linkInfoSource->node) && !(lnk->_flags & 0xA0000000)) { linkInfoWorkSource.node = 0; @@ -2872,10 +2872,10 @@ MovGraphNode *MovGraph::calcOffset(int ox, int oy) { MovGraphNode *res = 0; double mindist = 1.0e10; - for (ObList::iterator i = _nodes.begin(); i != _nodes.end(); ++i) { - assert(((CObject *)*i)->_objtype == kObjTypeMovGraphNode); + for (NodeList::iterator i = _nodes.begin(); i != _nodes.end(); ++i) { + assert((*i)->_objtype == kObjTypeMovGraphNode); - MovGraphNode *node = (MovGraphNode *)*i; + MovGraphNode *node = static_cast<MovGraphNode *>(*i); double dist = sqrt((double)((node->_x - oy) * (node->_x - oy) + (node->_x - ox) * (node->_x - ox))); if (dist < mindist) { @@ -2917,16 +2917,16 @@ bool MovGraphLink::load(MfcArchive &file) { _flags = file.readUint32LE(); debugC(8, kDebugLoading, "GraphNode1"); - _graphSrc = (MovGraphNode *)file.readClass(); + _graphSrc = file.readClass<MovGraphNode>(); debugC(8, kDebugLoading, "GraphNode2"); - _graphDst = (MovGraphNode *)file.readClass(); + _graphDst = file.readClass<MovGraphNode>(); _length = file.readDouble(); _angle = file.readDouble(); debugC(8, kDebugLoading, "length: %g, angle: %g", _length, _angle); - _movGraphReact = (MovGraphReact *)file.readClass(); + _movGraphReact = file.readClass<MovGraphReact>(); _name = file.readPascalString(); return true; diff --git a/engines/fullpipe/motion.h b/engines/fullpipe/motion.h index c08d56fd8c..c86c161b09 100644 --- a/engines/fullpipe/motion.h +++ b/engines/fullpipe/motion.h @@ -280,8 +280,10 @@ friend class MctlCompound; friend class MctlGraph; friend class MotionController; private: - ObList _nodes; - ObList _links; + typedef ObList<MovGraphNode> NodeList; + typedef ObList<MovGraphLink> LinkList; + NodeList _nodes; + LinkList _links; int _field_44; Common::Array<MovGraphItem> _items; MovArr *(*_callback1)(StaticANIObject *ani, Common::Array<MovItem *> *items, signed int counter); diff --git a/engines/fullpipe/scene.cpp b/engines/fullpipe/scene.cpp index 76384c3785..69ab170e4d 100644 --- a/engines/fullpipe/scene.cpp +++ b/engines/fullpipe/scene.cpp @@ -251,7 +251,7 @@ void Scene::init() { g_fp->_sceneRect.moveTo(0, 0); for (uint i = 0; i < _picObjList.size(); i++) - ((PictureObject *)_picObjList[i])->clearFlags(); + _picObjList[i]->clearFlags(); for (uint i = 0; i < _staticANIObjectList1.size(); i++) _staticANIObjectList1[i]->clearFlags(); @@ -324,7 +324,7 @@ void Scene::addStaticANIObject(StaticANIObject *obj, bool addList2) { void Scene::setPictureObjectsFlag4() { for (uint i = 0; i < _picObjList.size(); i++) { - ((PictureObject *)_picObjList[i])->_flags |= 4; + _picObjList[i]->_flags |= 4; } } @@ -335,8 +335,8 @@ void Scene::stopAllSounds() { PictureObject *Scene::getPictureObjectById(int objId, int flags) { for (uint i = 1; i < _picObjList.size(); i++) { - if (((PictureObject *)_picObjList[i])->_id == objId && ((PictureObject *)_picObjList[i])->_odelay == flags) - return (PictureObject *)_picObjList[i]; + if (_picObjList[i]->_id == objId && _picObjList[i]->_odelay == flags) + return _picObjList[i]; } return 0; @@ -344,8 +344,8 @@ PictureObject *Scene::getPictureObjectById(int objId, int flags) { PictureObject *Scene::getPictureObjectByName(const Common::String &objName, int flags) { for (uint i = 0; i < _picObjList.size(); i++) { - if ((((PictureObject *)_picObjList[i])->_objectName == objName) && (((PictureObject *)_picObjList[i])->_odelay == flags || flags == -1)) - return (PictureObject *)_picObjList[i]; + if ((_picObjList[i]->_objectName == objName) && (_picObjList[i]->_odelay == flags || flags == -1)) + return _picObjList[i]; } return 0; @@ -353,7 +353,7 @@ PictureObject *Scene::getPictureObjectByName(const Common::String &objName, int void Scene::deletePictureObject(PictureObject *obj) { for (uint i = 0; i < _picObjList.size(); i++) { - if (((PictureObject *)_picObjList[i]) == obj) { + if (_picObjList[i] == obj) { _picObjList.remove_at(i); delete obj; @@ -547,7 +547,7 @@ void Scene::updateScrolling() { int offsetY = 0; if (_x < 0) { - if (!g_fp->_sceneRect.left && !(((PictureObject *)_picObjList[0])->_flags & 2)) + if (!g_fp->_sceneRect.left && !(_picObjList[0]->_flags & 2)) _x = 0; if (_x <= -g_fp->_scrollSpeed) { @@ -620,7 +620,7 @@ PictureObject *Scene::getPictureObjectAtPos(int x, int y) { PictureObject *res = 0; for (uint i = 0; i < _picObjList.size(); i++) { - PictureObject *p = (PictureObject *)_picObjList[i]; + PictureObject *p = _picObjList[i]; if ((p->_field_8 & 0x100) && (p->_flags & 4) && p->isPixelHitAtPos(x, y) && (!res || res->_priority >= p->_priority)) @@ -635,7 +635,7 @@ int Scene::getPictureObjectIdAtPos(int x, int y) { int res = 0; for (uint i = 0; i < _picObjList.size(); i++) { - PictureObject *p = (PictureObject *)_picObjList[i]; + PictureObject *p = _picObjList[i]; if ((p->_field_8 & 0x100) && (p->_flags & 4) && p->isPixelHitAtPos(x, y) && (!res || resp->_priority >= p->_priority)) { @@ -673,7 +673,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) { #endif if (minPri == -1 && _picObjList.size()) - minPri = ((PictureObject *)_picObjList.back())->_priority - 1; + minPri = _picObjList.back()->_priority - 1; if (maxPri == -1) maxPri = 60000; @@ -725,7 +725,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) { v25++; if (v25 >= _bigPictureArray2Count) { - if (!(((PictureObject *)_picObjList[0])->_flags & 0x20)) + if (!(_picObjList[0]->_flags & 0x20)) break; v25 = 0; } @@ -736,7 +736,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) { bgNumX++; if (bgNumX >= _bigPictureArray1Count) { - if (!(((PictureObject *)_picObjList[0])->_flags & 0x2)) + if (!(_picObjList[0]->_flags & 0x2)) break; bgNumX = 0; } @@ -748,7 +748,7 @@ void Scene::drawContent(int minPri, int maxPri, bool drawBg) { for (uint i = 1; i < _picObjList.size(); i++) { - PictureObject *obj = (PictureObject *)_picObjList[i]; + PictureObject *obj = _picObjList[i]; if (obj->_priority < minPri || obj->_priority >= maxPri) continue; diff --git a/engines/fullpipe/scenes/scene03.cpp b/engines/fullpipe/scenes/scene03.cpp index 25b48dea3c..1882ecf459 100644 --- a/engines/fullpipe/scenes/scene03.cpp +++ b/engines/fullpipe/scenes/scene03.cpp @@ -210,7 +210,7 @@ void sceneHandler03_takeEgg(ExCommand *ex) { && ex1) { if (ex1->_objtype == kObjTypeObjstateCommand) { - ObjstateCommand *com = (ObjstateCommand *)ex1; + ObjstateCommand *com = static_cast<ObjstateCommand *>(ex1); com->_value = g_fp->getObjectEnumState(sO_EggGulper, sO_WantsNothing); } diff --git a/engines/fullpipe/scenes/scene04.cpp b/engines/fullpipe/scenes/scene04.cpp index ae8e5674f7..c899e46ab9 100644 --- a/engines/fullpipe/scenes/scene04.cpp +++ b/engines/fullpipe/scenes/scene04.cpp @@ -958,7 +958,7 @@ void sceneHandler04_walkKozyawka() { void sceneHandler04_bottleUpdateObjects(int off) { for (Common::List<GameObject *>::iterator it = g_vars->scene04_bottleObjList.begin(); it != g_vars->scene04_bottleObjList.end(); ++it) { if ((*it)->_objtype == kObjTypeStaticANIObject) { - StaticANIObject *st = (StaticANIObject *)*it; + StaticANIObject *st = static_cast<StaticANIObject *>(*it); st->setOXY(st->_ox, off + st->_oy); } else { @@ -1138,7 +1138,7 @@ void sceneHandler04_leaveLadder(ExCommand *ex) { if (!(g_fp->_aniMan->_flags & 0x100)) { if (getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)->_objtype == kObjTypeMctlCompound) { - MctlCompound *mc = (MctlCompound *)getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId); + MctlCompound *mc = static_cast<MctlCompound *>(getSc2MctlCompoundBySceneId(g_fp->_currentScene->_sceneId)); if (mc->_motionControllers[0]->_movGraphReactObj->pointInRegion(g_fp->_sceneRect.left + ex->_x, g_fp->_sceneRect.top + ex->_y)) { if (g_vars->scene04_ladder->collisionDetection(g_fp->_aniMan)) { diff --git a/engines/fullpipe/scenes/scene06.cpp b/engines/fullpipe/scenes/scene06.cpp index f434848c05..54b3fb7ed5 100644 --- a/engines/fullpipe/scenes/scene06.cpp +++ b/engines/fullpipe/scenes/scene06.cpp @@ -53,13 +53,13 @@ int scene06_updateCursor() { return PIC_CSR_ARCADE2_D; } - if (g_fp->_aniMan == (StaticANIObject *)g_fp->_objectAtCursor) { + if (g_fp->_aniMan == g_fp->_objectAtCursor) { if (g_fp->_aniMan->_statics->_staticsId == ST_MAN6_BALL && g_fp->_cursorId == PIC_CSR_DEFAULT) { g_fp->_cursorId = PIC_CSR_ITN; return PIC_CSR_ITN; } - } else if (g_fp->_objectAtCursor && (StaticANIObject *)g_fp->_objectAtCursor == g_vars->scene06_currentBall + } else if (g_fp->_objectAtCursor && g_fp->_objectAtCursor == g_vars->scene06_currentBall && g_fp->_cursorId == PIC_CSR_DEFAULT) { g_fp->_cursorId = PIC_CSR_ITN; } diff --git a/engines/fullpipe/scenes/scene11.cpp b/engines/fullpipe/scenes/scene11.cpp index 72af59aacf..6a08677571 100644 --- a/engines/fullpipe/scenes/scene11.cpp +++ b/engines/fullpipe/scenes/scene11.cpp @@ -134,9 +134,7 @@ void scene11_initScene(Scene *sc) { getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing1, 1); getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing2, 1); getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing3, 0); - - ((MctlCompound *)getCurrSceneSc2MotionController())->replaceNodeX(805, 905); - + getCurrSceneSc2MotionController()->replaceNodeX(805, 905); getSc2MctlCompoundBySceneId(sc->_sceneId)->replaceNodeX(303, 353); } else if (swingie == g_fp->getObjectEnumState(sO_Swingie, sO_IsStandingInBoots) || swingie == g_fp->getObjectEnumState(sO_Swingie, sO_IsStandingInCorner)) { @@ -148,8 +146,7 @@ void scene11_initScene(Scene *sc) { getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing1, 0); getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing2, 1); getCurrSceneSc2MotionController()->enableLinks(sO_CloseThing3, 0); - - ((MctlCompound *)getCurrSceneSc2MotionController())->replaceNodeX(905, 805); + getCurrSceneSc2MotionController()->replaceNodeX(905, 805); } else { g_vars->scene11_swingIsSwinging = false; g_vars->scene11_swingieStands = false; diff --git a/engines/fullpipe/scenes/scene33.cpp b/engines/fullpipe/scenes/scene33.cpp index 717e9f6572..6719673c7b 100644 --- a/engines/fullpipe/scenes/scene33.cpp +++ b/engines/fullpipe/scenes/scene33.cpp @@ -211,7 +211,7 @@ void sceneHandler33_clickZones(ExCommand *cmd) { double mindist = 1e10; for (uint i = 0; i < g_fp->_currentScene->_staticANIObjectList1.size(); i++) { - StaticANIObject *ani = (StaticANIObject *)g_fp->_currentScene->_staticANIObjectList1[i]; + StaticANIObject *ani = g_fp->_currentScene->_staticANIObjectList1[i]; if (ani->_id == ANI_VENT_33) { int dx = ani->_ox - cmd->_sceneClickX; diff --git a/engines/fullpipe/scenes/sceneDbg.cpp b/engines/fullpipe/scenes/sceneDbg.cpp index 4d061e603c..759480d1f0 100644 --- a/engines/fullpipe/scenes/sceneDbg.cpp +++ b/engines/fullpipe/scenes/sceneDbg.cpp @@ -45,7 +45,7 @@ GameObject *sceneHandlerDbgMenu_getObjectAtXY(int x, int y) { return 0; for (uint i = 1; i < g_fp->_currentScene->_picObjList.size(); i++) { - PictureObject *pic = (PictureObject *)g_fp->_currentScene->_picObjList[i]; + PictureObject *pic = g_fp->_currentScene->_picObjList[i]; if (x >= pic->_ox && y >= pic->_oy) { const Dims dims = pic->getDimensions(); diff --git a/engines/fullpipe/stateloader.cpp b/engines/fullpipe/stateloader.cpp index 0ff8c60d42..cc5c904897 100644 --- a/engines/fullpipe/stateloader.cpp +++ b/engines/fullpipe/stateloader.cpp @@ -85,7 +85,7 @@ bool GameLoader::readSavegame(const char *fname) { Common::MemoryReadStream *archiveStream = new Common::MemoryReadStream(data, header.encSize); MfcArchive *archive = new MfcArchive(archiveStream); - GameVar *var = (GameVar *)archive->readClass(); + GameVar *var = archive->readClass<GameVar>(); GameVar *v = _gameVar->getSubVarByName("OBJSTATES"); @@ -301,7 +301,7 @@ bool FullpipeEngine::loadGam(const char *fname, int scene) { _inventory->rebuildItemRects(); for (uint i = 0; i < _inventory->getScene()->_picObjList.size(); i++) - ((MemoryObject *)_inventory->getScene()->_picObjList[i]->_picture)->load(); + _inventory->getScene()->_picObjList[i]->_picture->MemoryObject::load(); // _sceneSwitcher = sceneSwitcher; // substituted with direct call _gameLoader->_preloadCallback = preloadCallback; @@ -474,11 +474,11 @@ bool GameVar::load(MfcArchive &file) { } file.incLevel(); - _parentVarObj = (GameVar *)file.readClass(); - _prevVarObj = (GameVar *)file.readClass(); - _nextVarObj = (GameVar *)file.readClass(); - _field_14 = (GameVar *)file.readClass(); - _subVars = (GameVar *)file.readClass(); + _parentVarObj = file.readClass<GameVar>(); + _prevVarObj = file.readClass<GameVar>(); + _nextVarObj = file.readClass<GameVar>(); + _field_14 = file.readClass<GameVar>(); + _subVars = file.readClass<GameVar>(); file.decLevel(); return true; diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index 8c0a045aa9..994feee866 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -1592,8 +1592,8 @@ Movement::Movement(Movement *src, int *oldIdxs, int newSize, StaticANIObject *an _framePosOffsets[i]->y = src->_framePosOffsets[oldIdxs[i]]->y; } } - _staticsObj1 = (Statics *)_dynamicPhases.front(); - _staticsObj2 = (Statics *)_dynamicPhases.back(); + _staticsObj1 = dynamic_cast<Statics *>(_dynamicPhases.front()); + _staticsObj2 = dynamic_cast<Statics *>(_dynamicPhases.back()); } else { for (int i = 0; i < newSize; i++) { src->setDynamicPhaseIndex(i); @@ -2231,7 +2231,7 @@ bool StaticPhase::load(MfcArchive &file) { _field_6A = file.readUint16LE(); if (g_fp->_gameProjectVersion >= 12) { - _exCommand = (ExCommand *)file.readClass(); + _exCommand = file.readClass<ExCommand>(); return true; } diff --git a/engines/fullpipe/utils.cpp b/engines/fullpipe/utils.cpp index 72a3377f74..f3f07b0514 100644 --- a/engines/fullpipe/utils.cpp +++ b/engines/fullpipe/utils.cpp @@ -45,22 +45,6 @@ bool CObject::loadFile(const Common::String &fname) { return load(archive); } -bool ObList::load(MfcArchive &file) { - debugC(5, kDebugLoading, "ObList::load()"); - int count = file.readCount(); - - debugC(9, kDebugLoading, "ObList::count: %d:", count); - - for (int i = 0; i < count; i++) { - debugC(9, kDebugLoading, "ObList::[%d]", i); - CObject *t = file.readClass(); - - push_back(t); - } - - return true; -} - bool ObArray::load(MfcArchive &file) { debugC(5, kDebugLoading, "ObArray::load()"); int count = file.readCount(); @@ -68,7 +52,7 @@ bool ObArray::load(MfcArchive &file) { resize(count); for (int i = 0; i < count; i++) { - CObject *t = file.readClass(); + CObject *t = file.readClass<CObject>(); push_back(*t); } @@ -379,7 +363,7 @@ void MfcArchive::init() { _objectIdMap.push_back(kNullObject); } -CObject *MfcArchive::readClass() { +CObject *MfcArchive::readBaseClass() { bool isCopyReturned; CObject *res = parseClass(&isCopyReturned); diff --git a/engines/fullpipe/utils.h b/engines/fullpipe/utils.h index 2b97ab6480..8966ceb8ba 100644 --- a/engines/fullpipe/utils.h +++ b/engines/fullpipe/utils.h @@ -58,7 +58,17 @@ public: int readCount(); double readDouble(); CObject *parseClass(bool *isCopyReturned); - CObject *readClass(); + + template <typename T> + T *readClass() { + CObject *obj = readBaseClass(); + if (!obj) + return nullptr; + + T *res = dynamic_cast<T *>(obj); + assert(res); + return res; + } void writeObject(CObject *obj); @@ -76,6 +86,7 @@ public: private: void init(); + CObject *readBaseClass(); }; enum ObjType { @@ -106,9 +117,24 @@ public: bool loadFile(const Common::String &fname); }; -class ObList : public Common::List<CObject *>, public CObject { +template <class T> +class ObList : public Common::List<T *>, public CObject { public: - virtual bool load(MfcArchive &file); + virtual bool load(MfcArchive &file) { + debugC(5, kDebugLoading, "ObList::load()"); + int count = file.readCount(); + + debugC(9, kDebugLoading, "ObList::count: %d:", count); + + for (int i = 0; i < count; i++) { + debugC(9, kDebugLoading, "ObList::[%d]", i); + T *t = file.readClass<T>(); + + this->push_back(t); + } + + return true; + } }; class MemoryObject : CObject { |