summaryrefslogtreecommitdiff
path: root/Runtime/BaseClasses/GameManager.h
blob: 8d194c35f35023cf4dab36c57282e487902c8356 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#ifndef GAMEMANAGER_H
#define GAMEMANAGER_H

#include "EditorExtension.h"

/// Any game manager (eg. AudioManager, dynamicsmanager) that needs serialization
/// has to derive from either LevelGameManager or GlobalGameManager.
/// Every level contains its own GameManager for that Level (eg. Scene, PhysicsManager)
/// LevelGameManagers are destroyed and reloaded from the new scene when loading a new scene.
/// GlobalGameManagers are singletons and loaded on 
/// startup of the gameplayer/editor (eg. InputManager, TagManager)

class EXPORT_COREMODULE GameManager : public Object
{
	public:
	
	REGISTER_DERIVED_ABSTRACT_CLASS (GameManager, Object)
	GameManager(MemLabelId label, ObjectCreationMode mode) : Super(label, mode) { }
//	virtual ~GameManager ();
	
	///@TODO: Get rid of this. I am not sure why this is not just done in the destructor / cleanup class
	virtual void NetworkOnApplicationQuit () { AssertString("not implemented"); }
	virtual void NetworkUpdate () { AssertString("not implemented"); }
};


class EXPORT_COREMODULE LevelGameManager : public GameManager
{
	public:
	
	virtual char const* GetName () const { return GetClassName().c_str (); }
		
	REGISTER_DERIVED_ABSTRACT_CLASS (LevelGameManager, GameManager)
	DECLARE_OBJECT_SERIALIZE (GameManager)

	LevelGameManager(MemLabelId label, ObjectCreationMode mode);

//	virtual ~LevelGameManager ();
};


class EXPORT_COREMODULE GlobalGameManager : public GameManager
{
	public:
	
	REGISTER_DERIVED_ABSTRACT_CLASS (GlobalGameManager, GameManager)
	DECLARE_OBJECT_SERIALIZE (GlobalGameManager)

	GlobalGameManager(MemLabelId label, ObjectCreationMode mode);

//	virtual ~GlobalGameManager ();
	
	virtual char const* GetName () const;
};

GameManager* GetGameManagerIfExists (int index);

inline GameManager* CreateGameManager (int classID)
{
	Object* o = Object::Produce (classID);
	o->Reset ();
	o->AwakeFromLoad(kDefaultAwakeFromLoad);
	o->SetNameCpp (Object::ClassIDToString (classID));
	return static_cast<GameManager*> (o);
}

#define CALL_MANAGER_IF_EXISTS(x,func) { GameManager* _manager = GetGameManagerIfExists(x); if (_manager) _manager->func; }

#endif