// $Id$
//
-// SuperTux - A Jump'n Run
+// SuperTux
// Copyright (C) 2004 Ricardo Cruz <rick2@aeiou.pt>
+// Copyright (C) 2006 Matthias Braun <matze@braunis.de>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
#include <string>
#include <map>
-#include "lisp/lisp.hpp"
-#include "game_object.hpp"
-#include "math/vector.hpp"
+#include "direction.hpp"
+
+namespace lisp { class Lisp; }
+class Vector;
+class GameObject;
class Factory
{
public:
virtual ~Factory()
{ }
-
+
/** Creates a new gameobject from a lisp node.
* Remember to delete the objects later
*/
virtual GameObject* create_object(const lisp::Lisp& reader) = 0;
-};
-typedef std::map<std::string, Factory*> Factories;
-extern Factories* object_factories;
+ typedef std::map<std::string, Factory*> Factories;
+ static Factories &get_factories()
+ {
+ static Factories object_factories;
+ return object_factories;
+ }
+};
GameObject* create_object(const std::string& name, const lisp::Lisp& reader);
GameObject* create_object(const std::string& name, const Vector& pos);
+GameObject* create_badguy_object(const std::string& name, const Vector& pos, Direction dir = LEFT);
/** comment from Matze:
* Yes I know macros are evil, but in this specific case they save
public: \
INTERN_##CLASS##Factory() \
{ \
- if(object_factories == 0) \
- object_factories = new Factories; \
+ get_factories()[NAME] = this; \
+ } \
\
- object_factories->insert(std::make_pair(NAME, this)); \
+ ~INTERN_##CLASS##Factory() \
+ { \
+ get_factories().erase(NAME); \
} \
\
virtual GameObject* create_object(const lisp::Lisp& reader) \