Skip to content
Snippets Groups Projects
script.cpp 1.7 KiB
Newer Older
Vicki Pfau's avatar
Vicki Pfau committed
#include "script.h"

#include "data.h"

#include "script-lua.h"

using namespace Retro;
using namespace std;

Variant::Variant(int64_t i)
	: m_type(Type::INT)
	, m_vi(i) {
}

Variant::Variant(double d)
	: m_type(Type::FLOAT)
	, m_vf(d) {
}

Variant::Variant(bool b)
	: m_type(Type::BOOL)
	, m_vb(b) {
}

Variant::operator int64_t() const {
	return cast<int64_t>();
}

Variant::operator int() const {
	return cast<int>();
}

Variant::operator float() const {
	return cast<float>();
}

Variant::operator double() const {
	return cast<double>();
}

Variant::operator bool() const {
	return cast<bool>();
}

static unordered_map<string, function<shared_ptr<ScriptContext>()>> s_scriptTypes{
	make_pair("lua", ScriptLua::create),
};

static unordered_map<string, shared_ptr<ScriptContext>> s_scriptContexts;

shared_ptr<ScriptContext> ScriptContext::get(const string& type) {
	if (type.empty() && s_scriptContexts.size() == 1) {
		return s_scriptContexts.begin()->second;
	}
	const auto& foundContext = s_scriptContexts.find(type);
	if (foundContext != s_scriptContexts.end()) {
		return foundContext->second;
	}

	const auto& found = s_scriptTypes.find(type);
	if (found == s_scriptTypes.end()) {
		return nullptr;
	}
	shared_ptr<ScriptContext> context = found->second();
	if (!context->init()) {
		return nullptr;
	}
	s_scriptContexts[type] = context;
	return context;
}

vector<string> ScriptContext::listContexts() {
	vector<string> contexts;
	for (const auto& context : s_scriptContexts) {
		contexts.emplace_back(context.first);
	}
	return contexts;
}

void ScriptContext::reset() {
	s_scriptContexts.clear();
}

void ScriptContext::setData(const GameData* data) {
	m_data = data;
}

const GameData* ScriptContext::data() {
	return m_data;
}