From 9aff6337bcfa95ba6ef6c17c9e018470f81407b4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 20 Sep 2011 08:58:07 +0000 Subject: NEVERHOOD: Try to cleanup sprite creation with a templated insertSprite function (only in Module1000 so far) --- engines/neverhood/module1000.cpp | 60 +++++++++++++++++++--------------------- engines/neverhood/scene.h | 33 ++++++++++++++++++++-- engines/neverhood/sprite.h | 1 + 3 files changed, 60 insertions(+), 34 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index ddd3e0aef9..e160a7184d 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -372,28 +372,28 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); if (getGlobalVar(0xD217189D) == 0) { - _asDoor = addSprite(new AsScene1001Door(_vm)); + _asDoor = insertSprite(); _asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); } else { _asDoor = NULL; } - _asLever = addSprite(new AsScene1001Lever(_vm, this, 150, 433, 1)); + _asLever = insertSprite(this, 150, 433, 1); insertStaticSprite(0x809861A6, 950); insertStaticSprite(0x89C03848, 1100); - _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0)); + _ssButton = insertSprite(this, 0x15288120, 100, 0); if (getGlobalVar(0x03C698DA) == 0) { tempSprite = insertStaticSprite(0x8C066150, 200); - _asWindow = addSprite(new AsScene1001Window(_vm)); + _asWindow = insertSprite(); _asWindow->setClipRect(tempSprite->getDrawRect()); } else { _asWindow = NULL; } - _asHammer = addSprite(new AsScene1001Hammer(_vm, _asDoor)); + _asHammer = insertSprite(_asDoor); } @@ -516,7 +516,7 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f SetMessageHandler(&AsScene1002Ring::handleMessage4475E0); } - setClipRect(0, clipY1, 640, 480); + setClipRect(0, clipY1, 640, 480); _x = x; _y = y; @@ -1329,38 +1329,38 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x06149428, 1100); insertStaticSprite(0x312C8774, 1100); - _ssLadderArch = addSprite(new SsScene1002LadderArch(_vm, this)); + _ssLadderArch = insertSprite(this); _ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200); _ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100); _ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100); - _class599 = addSprite(new Class599(_vm, this)); + _class599 = insertSprite(this); if (which < 0) { if (_vm->_gameState.field2 == 0) { InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); setMessageList(0x004B4270); _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); } else { InsertKlaymanInitArgs(KmScene1002, 379, 435, (_class599, _ssLadderArch)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); setMessageList(0x004B4270); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _class478->setClipRect(_klayman->getClipRect()); } } else if (which == 1) { InsertKlaymanInitArgs(KmScene1002, 650, 435, (_class599, _ssLadderArch)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); setMessageList(0x004B4478); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _class478->setClipRect(_klayman->getClipRect()); _vm->_gameState.field2 = 1; } else if (which == 2) { InsertKlaymanInitArgs(KmScene1002, 68, 645, (_class599, _ssLadderArch)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); setMessageList(0x004B4298); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _class478->setClipRect(_klayman->getClipRect()); @@ -1368,11 +1368,11 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) sendMessage(_klayman, 0x4820, 0); } else { InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); setMessageList(0x004B4470); _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); _class478->setClipRect(_klayman->getClipRect()); - _class479 = addSprite(new Class479(_vm, this, _klayman)); + _class479 = insertSprite(this, _klayman); _class479->setClipRect(_klayman->getClipRect()); _klayman->setRepl(64, 0); _vm->_gameState.field2 = 0; @@ -1384,26 +1384,22 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart2->getDrawRect().y2()); - _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 258, 191, _class599->getDrawRect().y, false)); - _asRing2 = addSprite(new AsScene1002Ring(_vm, this, false, 297, 189, _class599->getDrawRect().y, false)); - _asRing3 = addSprite(new AsScene1002Ring(_vm, this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0)); - _asRing4 = addSprite(new AsScene1002Ring(_vm, this, false, 334, 191, _class599->getDrawRect().y, false)); - _asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 425, 184, _class599->getDrawRect().y, false)); - - _asDoor = addSprite(new AsScene1002Door(_vm, tempClipRect)); - - tempSprite = addSprite(new Class505(_vm)); - - _asDoorSpy = addSprite(new AsScene1002DoorSpy(_vm, tempClipRect, this, _asDoor, tempSprite)); - - _class426 = addSprite(new Class426(_vm, this, 0x00412692, 0x140B60BE, 800, 0)); - _asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, false)); - + _asRing1 = insertSprite(this, false, 258, 191, _class599->getDrawRect().y, false); + _asRing2 = insertSprite(this, false, 297, 189, _class599->getDrawRect().y, false); + _asRing3 = insertSprite(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0); + _asRing4 = insertSprite(this, false, 334, 191, _class599->getDrawRect().y, false); + _asRing5 = insertSprite(this, false, 425, 184, _class599->getDrawRect().y, false); + + _asDoor = insertSprite(tempClipRect); + tempSprite = insertSprite(); + _asDoorSpy = insertSprite(tempClipRect, this, _asDoor, tempSprite); + _class426 = insertSprite(this, 0x00412692, 0x140B60BE, 800, 0); + _asVenusFlyTrap = insertSprite(this, _klayman, false); _vm->_collisionMan->addSprite(_asVenusFlyTrap); sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); - _class506 = addSprite(new Class506(_vm)); + _class506 = insertSprite(); setRectList(0x004B43A0); @@ -1660,7 +1656,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) updatePaletteArea(); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); insertStaticSprite(0x800034A0, 1100); insertStaticSprite(0x64402020, 1100); @@ -1670,7 +1666,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, tempSprite->getDrawRect().y, 640, 480); _class478->setClipRect(_klayman->getClipRect()); - _asTrashCan = addSprite(new AsScene1004TrashCan(_vm)); + _asTrashCan = insertSprite(); } diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index fd11509cad..d0decd2c49 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -40,8 +40,8 @@ namespace Neverhood { #define InsertKlayman(KlaymanClass, X, Y) _klayman = new KlaymanClass(_vm, this, X, Y); addSprite(_klayman) #define InsertKlaymanInitArgs(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman) -#define InsertSprite(SpriteClass) (SpriteClass*)addSprite(new SpriteClass(_vm)); -#define InsertSpriteInitArgs(SpriteClass, InitArgs) (SpriteClass*)addSprite((new SpriteClass(_vm))-> init InitArgs); +#define InsertSprite(SpriteObj, SpriteClass) SpriteObj = (SpriteClass*)addSprite(new SpriteClass(_vm)); +#define InsertSpriteInitArgs(SpriteObj, SpriteClass, InitArgs) SpriteObj = new SpriteClass(_vm); ((SpriteClass*)(SpriteObj))-> init InitArgs; addSprite(SpriteObj) class Scene : public Entity { public: @@ -69,6 +69,35 @@ public: void changeMouseCursor(uint32 fileHash); SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer); void update(); + // Some crazy templated functions to make the logic code smaller/simpler (imo!) + template + T* insertSprite() { + return (T*)addSprite(new T(_vm)); + } + template + T* insertSprite(Arg1 arg1) { + return (T*)addSprite(new T(_vm, arg1)); + } + template + T* insertSprite(Arg1 arg1, Arg2 arg2) { + return (T*)addSprite(new T(_vm, arg1, arg2)); + } + template + T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3) { + return (T*)addSprite(new T(_vm, arg1, arg2, arg3)); + } + template + T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) { + return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4)); + } + template + T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) { + return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4, arg5)); + } + template + T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) { + return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4, arg5, arg6)); + } protected: Module *_parentModule; Common::Array _entities; diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 59109d6900..10ebc197b3 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -40,6 +40,7 @@ class Sprite : public Entity { public: Sprite(NeverhoodEngine *vm, int objectPriority); ~Sprite(); + void init() {} BaseSurface *getSurface() { return _surface; } void processDelta(); void setDoDeltaX(int type); -- cgit v1.2.3