bool LuaScriptSystem::runScript(ScriptComponent* component, const std::string& script) { try { auto res = mState->script(getScriptData(script).c_str()); if(!res.valid()) { sol::error err = res; LOG(ERROR) << "Failed to execute lua script " << err.what(); return false; } sol::object r = res.get<sol::object>(); if(r.get_type() != sol::type::function) { return true; } // If script returns a function, it means that it wants to have a sandbox sol::protected_function callback = r; auto callResult = callback(component->getOwner()); if(!callResult.valid()) { sol::error err = callResult; LOG(ERROR) << "Failed to execute lua script " << err.what(); return false; } } catch(sol::error e) { LOG(ERROR) << "Failed to execute lua script " << e.what(); return false; } catch(...) { LOG(ERROR) << "Failed to execute lua script: unknown error"; return false; } return true; }
bool LuaScriptSystem::runScript(const std::string& script) { try { auto res = mState->script(getScriptData(script).c_str()); if(!res.valid()) { return false; } } catch(sol::error e) { LOG(ERROR) << "Failed to execute lua script " << e.what(); return false; } return true; }
void HexagonGame::executeEvents(Json::Value& mRoot, float mTime) { for (Json::Value& eventRoot : mRoot) { if(eventRoot["time"].asFloat() > mTime) continue; if(eventRoot["executed"].asBool()) continue; eventRoot["executed"] = true; string type{eventRoot["type"].asString()}; float duration{eventRoot["duration"].asFloat()}; string valueName{eventRoot["value_name"].asString()}; float value{eventRoot["value"].asFloat()}; string message{eventRoot["message"].asString()}; string id{eventRoot["id"].asString()}; if (type == "level_change") changeLevel(id); else if (type == "menu") goToMenu(); else if (type == "message_add") { if(getShowMessages()) addMessage(message, duration); } else if (type == "message_clear") clearMessages(); else if (type == "time_stop") timeStop = duration; else if (type == "timeline_wait") timeline.add(new Wait(duration)); else if (type == "timeline_clear") clearAndResetTimeline(timeline); else if (type == "value_float_set") levelData.setValueFloat(valueName, value); else if (type == "value_float_add") levelData.setValueFloat(valueName, levelData.getValueFloat(valueName) + value); else if (type == "value_float_subtract") levelData.setValueFloat(valueName, levelData.getValueFloat(valueName) - value); else if (type == "value_float_multiply") levelData.setValueFloat(valueName, levelData.getValueFloat(valueName) * value); else if (type == "value_float_divide") levelData.setValueFloat(valueName, levelData.getValueFloat(valueName) / value); else if (type == "value_int_set") levelData.setValueInt(valueName, value); else if (type == "value_int_add") levelData.setValueInt(valueName, levelData.getValueFloat(valueName) + value); else if (type == "value_int_subtract") levelData.setValueInt(valueName, levelData.getValueFloat(valueName) - value); else if (type == "value_int_multiply") levelData.setValueInt(valueName, levelData.getValueFloat(valueName) * value); else if (type == "value_int_divide") levelData.setValueInt(valueName, levelData.getValueFloat(valueName) / value); else if (type == "music_set") { if(getChangeMusic()) { stopLevelMusic(); musicData = getMusicData(id); musicData.playRandomSegment(musicPtr); } } else if (type == "music_set_segment") { if(getChangeMusic()) { stopLevelMusic(); musicData = getMusicData(id); musicData.playSegment(musicPtr, eventRoot["segment_index"].asInt()); } } else if (type == "music_set_seconds") { if(getChangeMusic()) { stopLevelMusic(); musicData = getMusicData(id); musicData.playSeconds(musicPtr, eventRoot["seconds"].asInt()); } } else if (type == "style_set") { if(getChangeStyles()) styleData = getStyleData(id); } else if (type == "side_changing_stop") randomSideChangesEnabled = false; else if (type == "side_changing_start") randomSideChangesEnabled = true; else if (type == "increment_stop") incrementEnabled = false; else if (type == "increment_start") incrementEnabled = true; else if (type == "pulse_max_set") maxPulse = value; else if (type == "pulse_min_set") minPulse = value; else if (type == "pulse_speed_set") pulseSpeed = value; else if (type == "pulse_speed_b_set") pulseSpeedBackwards = value; else if (type == "script_exec") scripts.push_back(getScriptData(id, this)); else if (type == "script_queue") queueScript(getScriptData(id, this)); else log("unknown script command: " + type); } }