Skip to content
Snippets Groups Projects
script.cpp 1.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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;
    }