File: ScriptHandler.h

package info (click to toggle)
vcmi 1.1.0%2Bdfsg-1
  • links: PTS, VCS
  • area: contrib
  • in suites:
  • size: 14,672 kB
  • sloc: cpp: 181,738; sh: 220; python: 178; ansic: 69; objc: 66; xml: 59; makefile: 34
file content (139 lines) | stat: -rw-r--r-- 3,162 bytes parent folder | download
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * ScriptHandler.h, part of VCMI engine
 *
 * Authors: listed in file AUTHORS in main folder
 *
 * License: GNU General Public License v2.0 or later
 * Full text of license available in license.txt file, in main folder
 *
 */

#pragma once

#if SCRIPTING_ENABLED
#include <vcmi/scripting/Service.h>
#include "IHandlerBase.h"
#include "JsonNode.h"

VCMI_LIB_NAMESPACE_BEGIN

class JsonNode;
class JsonSerializeFormat;
class Services;

namespace scripting
{
class Module;
class ScriptImpl;
class ScriptHandler;

using ModulePtr = std::shared_ptr<Module>;
using ScriptPtr = std::shared_ptr<ScriptImpl>;
using ScriptMap = std::map<std::string, ScriptPtr>;

class DLL_LINKAGE ScriptImpl : public Script
{
public:
	enum class Implements
	{
		ANYTHING,
		BATTLE_EFFECT
		//todo: adventure effect, map object(unified with building), server query, client query(with gui), may be smth else
	};

	Implements implements;

	std::string identifier;
	std::string sourcePath;
	std::string sourceText;

	std::string code;

	ModulePtr host;

	ScriptImpl(const ScriptHandler * owner_);
	virtual ~ScriptImpl();

	void compile(vstd::CLoggerBase * logger);

	void serializeJson(vstd::CLoggerBase * logger, JsonSerializeFormat & handler);
	void serializeJsonState(JsonSerializeFormat & handler);

	std::shared_ptr<Context> createContext(const Environment * env) const override;
	const std::string & getName() const override;
	const std::string & getSource() const override;

	void performRegistration(Services * services) const;
private:
	const ScriptHandler * owner;

	void resolveHost();
};

class DLL_LINKAGE PoolImpl : public Pool
{
public:
	PoolImpl(const Environment * ENV);
	PoolImpl(const Environment * ENV, ServerCallback * SRV);
	std::shared_ptr<Context> getContext(const Script * script) override;

	void serializeState(const bool saving, JsonNode & data) override;
private:
	std::map<const Script *, std::shared_ptr<Context>> cache;

	JsonNode state;

	const Environment * env;
	ServerCallback * srv;
};

class DLL_LINKAGE ScriptHandler : public IHandlerBase, public Service
{
public:
	ScriptMap objects;

	ScriptHandler();
	virtual ~ScriptHandler();

	const Script * resolveScript(const std::string & name) const;

	std::vector<bool> getDefaultAllowed() const override;
	std::vector<JsonNode> loadLegacyData(size_t dataSize) override;

	ScriptPtr loadFromJson(vstd::CLoggerBase * logger, const std::string & scope, const JsonNode & json, const std::string & identifier) const;

	void loadObject(std::string scope, std::string name, const JsonNode & data) override;
	void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;

	void performRegistration(Services * services) const override;

	void run(std::shared_ptr<Pool> pool) const override;

	template <typename Handler> void serialize(Handler & h, const int version)
	{
		JsonNode state;
		if(h.saving)
			saveState(state);

		h & state;

		if(!h.saving)
			loadState(state);
	}

	ModulePtr erm;
	ModulePtr lua;

protected:

private:
	friend class ScriptImpl;

	void loadState(const JsonNode & state);
	void saveState(JsonNode & state);
};

}

VCMI_LIB_NAMESPACE_END
#endif