aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjohndoe1232011-09-20 08:58:07 +0000
committerWillem Jan Palenstijn2013-05-08 20:39:40 +0200
commit9aff6337bcfa95ba6ef6c17c9e018470f81407b4 (patch)
treee9bbc008dcde756797fceea799c824568e1e1618
parent1b2d496d186c6f838526f51f7d0b3eea70a8b322 (diff)
downloadscummvm-rg350-9aff6337bcfa95ba6ef6c17c9e018470f81407b4.tar.gz
scummvm-rg350-9aff6337bcfa95ba6ef6c17c9e018470f81407b4.tar.bz2
scummvm-rg350-9aff6337bcfa95ba6ef6c17c9e018470f81407b4.zip
NEVERHOOD: Try to cleanup sprite creation with a templated insertSprite function (only in Module1000 so far)
-rw-r--r--engines/neverhood/module1000.cpp60
-rw-r--r--engines/neverhood/scene.h33
-rw-r--r--engines/neverhood/sprite.h1
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<AsScene1001Door>();
_asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480);
} else {
_asDoor = NULL;
}
- _asLever = addSprite(new AsScene1001Lever(_vm, this, 150, 433, 1));
+ _asLever = insertSprite<AsScene1001Lever>(this, 150, 433, 1);
insertStaticSprite(0x809861A6, 950);
insertStaticSprite(0x89C03848, 1100);
- _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0));
+ _ssButton = insertSprite<SsCommonButtonSprite>(this, 0x15288120, 100, 0);
if (getGlobalVar(0x03C698DA) == 0) {
tempSprite = insertStaticSprite(0x8C066150, 200);
- _asWindow = addSprite(new AsScene1001Window(_vm));
+ _asWindow = insertSprite<AsScene1001Window>();
_asWindow->setClipRect(tempSprite->getDrawRect());
} else {
_asWindow = NULL;
}
- _asHammer = addSprite(new AsScene1001Hammer(_vm, _asDoor));
+ _asHammer = insertSprite<AsScene1001Hammer>(_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<SsScene1002LadderArch>(this);
_ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200);
_ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100);
_ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100);
- _class599 = addSprite(new Class599(_vm, this));
+ _class599 = insertSprite<Class599>(this);
if (which < 0) {
if (_vm->_gameState.field2 == 0) {
InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch));
- _class478 = addSprite(new Class478(_vm, _klayman));
+ _class478 = insertSprite<Class478>(_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<Class478>(_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<Class478>(_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<Class478>(_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<Class478>(_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<Class479>(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<AsScene1002Ring>(this, false, 258, 191, _class599->getDrawRect().y, false);
+ _asRing2 = insertSprite<AsScene1002Ring>(this, false, 297, 189, _class599->getDrawRect().y, false);
+ _asRing3 = insertSprite<AsScene1002Ring>(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0);
+ _asRing4 = insertSprite<AsScene1002Ring>(this, false, 334, 191, _class599->getDrawRect().y, false);
+ _asRing5 = insertSprite<AsScene1002Ring>(this, false, 425, 184, _class599->getDrawRect().y, false);
+
+ _asDoor = insertSprite<AsScene1002Door>(tempClipRect);
+ tempSprite = insertSprite<Class505>();
+ _asDoorSpy = insertSprite<AsScene1002DoorSpy>(tempClipRect, this, _asDoor, tempSprite);
+ _class426 = insertSprite<Class426>(this, 0x00412692, 0x140B60BE, 800, 0);
+ _asVenusFlyTrap = insertSprite<AsScene1002VenusFlyTrap>(this, _klayman, false);
_vm->_collisionMan->addSprite(_asVenusFlyTrap);
sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap);
- _class506 = addSprite(new Class506(_vm));
+ _class506 = insertSprite<Class506>();
setRectList(0x004B43A0);
@@ -1660,7 +1656,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which)
updatePaletteArea();
- _class478 = addSprite(new Class478(_vm, _klayman));
+ _class478 = insertSprite<Class478>(_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<AsScene1004TrashCan>();
}
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<class T>
+ T* insertSprite() {
+ return (T*)addSprite(new T(_vm));
+ }
+ template<class T, class Arg1>
+ T* insertSprite(Arg1 arg1) {
+ return (T*)addSprite(new T(_vm, arg1));
+ }
+ template<class T, class Arg1, class Arg2>
+ T* insertSprite(Arg1 arg1, Arg2 arg2) {
+ return (T*)addSprite(new T(_vm, arg1, arg2));
+ }
+ template<class T, class Arg1, class Arg2, class Arg3>
+ T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3) {
+ return (T*)addSprite(new T(_vm, arg1, arg2, arg3));
+ }
+ template<class T, class Arg1, class Arg2, class Arg3, class Arg4>
+ T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) {
+ return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4));
+ }
+ template<class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5>
+ T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) {
+ return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4, arg5));
+ }
+ template<class T, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6>
+ 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<Entity*> _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);