commit
e6dea9ed48
@ -1 +0,0 @@
|
|||||||
base
|
|
||||||
@ -1,14 +1,14 @@
|
|||||||
<splitbox id="editorRoot" orientation="horizontal" split-pos="0.3">
|
<splitbox id="editorRoot" orientation="horizontal" split-pos="0.3">
|
||||||
<splitbox split-pos="0.75">
|
<splitbox split-pos="0.75">
|
||||||
<panel interval="2" color="0" padding="2">
|
<panel interval="2" color="0" padding="2">
|
||||||
<textbox pos="2" sub-consumer="filter_files"></textbox>
|
<textbox pos="2" padding="4,0,4,0" sub-consumer="filter_files" hint="@Filter"></textbox>
|
||||||
<panel id="filesList" color="#00000010" interval="6" padding="4"
|
<panel id="filesList" color="#00000030" interval="6" padding="4"
|
||||||
size-func="-1,-45" pos="2,38">
|
size-func="-1,-45" pos="2,38">
|
||||||
<!-- content is generated in script -->
|
<!-- content is generated in script -->
|
||||||
</panel>
|
</panel>
|
||||||
</panel>
|
</panel>
|
||||||
<panel id="problemsLog"
|
<panel id="problemsLog"
|
||||||
color="#00000010"
|
color="#00000030"
|
||||||
padding="5,15,5,15">
|
padding="5,15,5,15">
|
||||||
<label margin="0,0,0,5">@Problems</label>
|
<label margin="0,0,0,5">@Problems</label>
|
||||||
</panel>
|
</panel>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
local writeables = {}
|
local writeables = {}
|
||||||
local registry = require "core:internal/scripts_registry"
|
local registry
|
||||||
local filenames
|
local filenames
|
||||||
|
|
||||||
local current_file = {
|
local current_file = {
|
||||||
@ -163,7 +163,6 @@ end
|
|||||||
|
|
||||||
events.on("core:open_traceback", function(traceback_b64)
|
events.on("core:open_traceback", function(traceback_b64)
|
||||||
local traceback = bjson.frombytes(base64.decode(traceback_b64))
|
local traceback = bjson.frombytes(base64.decode(traceback_b64))
|
||||||
modes:set('debug')
|
|
||||||
|
|
||||||
clear_traceback()
|
clear_traceback()
|
||||||
|
|
||||||
@ -257,14 +256,16 @@ function build_files_list(filenames, selected)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function on_open(mode)
|
function on_open(mode)
|
||||||
local files_list = document.filesList
|
registry = require "core:internal/scripts_registry"
|
||||||
|
|
||||||
filenames = registry.filenames
|
local files_list = document.filesList
|
||||||
table.sort(filenames)
|
|
||||||
build_files_list(filenames)
|
|
||||||
|
|
||||||
document.editorContainer:setInterval(200, refresh_file_title)
|
document.editorContainer:setInterval(200, refresh_file_title)
|
||||||
|
|
||||||
clear_traceback()
|
clear_traceback()
|
||||||
clear_output()
|
clear_output()
|
||||||
|
|
||||||
|
filenames = registry.filenames
|
||||||
|
table.sort(filenames)
|
||||||
|
build_files_list(filenames)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -3,6 +3,12 @@ console_mode = "console"
|
|||||||
history = session.get_entry("commands_history")
|
history = session.get_entry("commands_history")
|
||||||
history_pointer = #history
|
history_pointer = #history
|
||||||
|
|
||||||
|
events.on("core:open_traceback", function()
|
||||||
|
if modes then
|
||||||
|
modes:set('debug')
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
function setup_variables()
|
function setup_variables()
|
||||||
local pid = hud.get_player()
|
local pid = hud.get_player()
|
||||||
local x,y,z = player.get_pos(pid)
|
local x,y,z = player.get_pos(pid)
|
||||||
|
|||||||
@ -2,6 +2,6 @@
|
|||||||
<button onclick='menu.page="worlds"'>@Worlds</button>
|
<button onclick='menu.page="worlds"'>@Worlds</button>
|
||||||
<button onclick='menu.page="scripts"'>@Scripts</button>
|
<button onclick='menu.page="scripts"'>@Scripts</button>
|
||||||
<button onclick='menu.page="settings"'>@Settings</button>
|
<button onclick='menu.page="settings"'>@Settings</button>
|
||||||
<button onclick='menu.page="content_menu"'>@Contents Menu</button>
|
<button onclick='menu.page="content_menu"'>@Content</button>
|
||||||
<button onclick='core.quit()'>@Quit</button>
|
<button onclick='core.quit()'>@Quit</button>
|
||||||
</panel>
|
</panel>
|
||||||
|
|||||||
@ -1,4 +1,7 @@
|
|||||||
local export = {}
|
local export = {
|
||||||
|
filenames = {},
|
||||||
|
classification = {}
|
||||||
|
}
|
||||||
|
|
||||||
local function collect_components(dirname, dest)
|
local function collect_components(dirname, dest)
|
||||||
if file.isdir(dirname) then
|
if file.isdir(dirname) then
|
||||||
|
|||||||
3
res/project.toml
Normal file
3
res/project.toml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# default project
|
||||||
|
name = "default"
|
||||||
|
base_packs = ["base"]
|
||||||
@ -24,6 +24,7 @@ Save=Сохранить
|
|||||||
Grant %{0} pack modification permission?=Выдать разрешение на модификацию пака %{0}?
|
Grant %{0} pack modification permission?=Выдать разрешение на модификацию пака %{0}?
|
||||||
Error at line %{0}=Ошибка на строке %{0}
|
Error at line %{0}=Ошибка на строке %{0}
|
||||||
Run=Запустить
|
Run=Запустить
|
||||||
|
Filter=Фильтр
|
||||||
|
|
||||||
editor.info.tooltip=CTRL+S - Сохранить\nCTRL+R - Запустить\nCTRL+Z - Отменить\nCTRL+Y - Повторить
|
editor.info.tooltip=CTRL+S - Сохранить\nCTRL+R - Запустить\nCTRL+Z - Отменить\nCTRL+Y - Повторить
|
||||||
devtools.traceback=Стек вызовов (от последнего)
|
devtools.traceback=Стек вызовов (от последнего)
|
||||||
@ -58,7 +59,6 @@ menu.Quit=Выход
|
|||||||
menu.Save and Quit to Menu=Сохранить и Выйти в Меню
|
menu.Save and Quit to Menu=Сохранить и Выйти в Меню
|
||||||
menu.Settings=Настройки
|
menu.Settings=Настройки
|
||||||
menu.Reset settings=Сбросить настройки
|
menu.Reset settings=Сбросить настройки
|
||||||
menu.Contents Menu=Меню контентпаков
|
|
||||||
menu.Open data folder=Открыть папку данных
|
menu.Open data folder=Открыть папку данных
|
||||||
menu.Open content folder=Открыть папку [content]
|
menu.Open content folder=Открыть папку [content]
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@
|
|||||||
#include "ContentLoader.hpp"
|
#include "ContentLoader.hpp"
|
||||||
#include "PacksManager.hpp"
|
#include "PacksManager.hpp"
|
||||||
#include "objects/rigging.hpp"
|
#include "objects/rigging.hpp"
|
||||||
|
#include "devtools/Project.hpp"
|
||||||
#include "logic/scripting/scripting.hpp"
|
#include "logic/scripting/scripting.hpp"
|
||||||
#include "core_defs.hpp"
|
#include "core_defs.hpp"
|
||||||
|
|
||||||
@ -16,12 +17,15 @@ static void load_configs(Input& input, const io::path& root) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ContentControl::ContentControl(
|
ContentControl::ContentControl(
|
||||||
EnginePaths& paths, Input& input, std::function<void()> postContent
|
const Project& project,
|
||||||
|
EnginePaths& paths,
|
||||||
|
Input& input,
|
||||||
|
std::function<void()> postContent
|
||||||
)
|
)
|
||||||
: paths(paths),
|
: paths(paths),
|
||||||
input(input),
|
input(input),
|
||||||
postContent(std::move(postContent)),
|
postContent(std::move(postContent)),
|
||||||
basePacks(io::read_list("res:config/builtins.list")),
|
basePacks(project.basePacks),
|
||||||
manager(std::make_unique<PacksManager>()) {
|
manager(std::make_unique<PacksManager>()) {
|
||||||
manager->setSources({
|
manager->setSources({
|
||||||
"world:content",
|
"world:content",
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class Content;
|
|||||||
class PacksManager;
|
class PacksManager;
|
||||||
class EnginePaths;
|
class EnginePaths;
|
||||||
class Input;
|
class Input;
|
||||||
|
struct Project;
|
||||||
|
|
||||||
namespace io {
|
namespace io {
|
||||||
class path;
|
class path;
|
||||||
@ -19,7 +20,10 @@ namespace io {
|
|||||||
class ContentControl {
|
class ContentControl {
|
||||||
public:
|
public:
|
||||||
ContentControl(
|
ContentControl(
|
||||||
EnginePaths& paths, Input& input, std::function<void()> postContent
|
const Project& project,
|
||||||
|
EnginePaths& paths,
|
||||||
|
Input& input,
|
||||||
|
std::function<void()> postContent
|
||||||
);
|
);
|
||||||
~ContentControl();
|
~ContentControl();
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
namespace dv {
|
namespace dv {
|
||||||
template <int n, typename T>
|
template <int n, typename T>
|
||||||
inline dv::value to_value(glm::vec<n, T> vec) {
|
dv::value to_value(const glm::vec<n, T>& vec) {
|
||||||
auto list = dv::list();
|
auto list = dv::list();
|
||||||
for (size_t i = 0; i < n; i++) {
|
for (size_t i = 0; i < n; i++) {
|
||||||
list.add(vec[i]);
|
list.add(vec[i]);
|
||||||
@ -15,7 +15,7 @@ namespace dv {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <int n, int m, typename T>
|
template <int n, int m, typename T>
|
||||||
inline dv::value to_value(glm::mat<n, m, T> mat) {
|
dv::value to_value(const glm::mat<n, m, T>& mat) {
|
||||||
auto list = dv::list();
|
auto list = dv::list();
|
||||||
for (size_t i = 0; i < n; i++) {
|
for (size_t i = 0; i < n; i++) {
|
||||||
for (size_t j = 0; j < m; j++) {
|
for (size_t j = 0; j < m; j++) {
|
||||||
@ -25,6 +25,15 @@ namespace dv {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
dv::value to_value(const std::vector<T>& vec) {
|
||||||
|
auto values = dv::list();
|
||||||
|
for (const auto& value : vec) {
|
||||||
|
values.add(value);
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
template <int n>
|
template <int n>
|
||||||
void get_vec(const dv::value& list, glm::vec<n, float>& vec) {
|
void get_vec(const dv::value& list, glm::vec<n, float>& vec) {
|
||||||
for (size_t i = 0; i < n; i++) {
|
for (size_t i = 0; i < n; i++) {
|
||||||
@ -68,11 +77,24 @@ namespace dv {
|
|||||||
if (!map.has(key)) {
|
if (!map.has(key)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto& list = map[key];
|
auto& arr = map[key];
|
||||||
for (size_t y = 0; y < n; y++) {
|
for (size_t y = 0; y < n; y++) {
|
||||||
for (size_t x = 0; x < m; x++) {
|
for (size_t x = 0; x < m; x++) {
|
||||||
mat[y][x] = list[y * m + x].asNumber();
|
mat[y][x] = arr[y * m + x].asNumber();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void get(const dv::value& map, const std::string& key, std::vector<T>& vec) {
|
||||||
|
if (!map.has(key)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const auto& arr = map[key];
|
||||||
|
for (size_t i = 0; i < arr.size(); i++) {
|
||||||
|
T value;
|
||||||
|
arr.at(i).get(value);
|
||||||
|
vec.emplace_back(std::move(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
17
src/devtools/Project.cpp
Normal file
17
src/devtools/Project.cpp
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include "Project.hpp"
|
||||||
|
|
||||||
|
#include "data/dv_util.hpp"
|
||||||
|
|
||||||
|
dv::value Project::serialize() const {
|
||||||
|
return dv::object({
|
||||||
|
{"name", name},
|
||||||
|
{"title", title},
|
||||||
|
{"base_packs", dv::to_value(basePacks)},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Project::deserialize(const dv::value& src) {
|
||||||
|
src.at("name").get(name);
|
||||||
|
src.at("title").get(title);
|
||||||
|
dv::get(src, "base_packs", basePacks);
|
||||||
|
}
|
||||||
15
src/devtools/Project.hpp
Normal file
15
src/devtools/Project.hpp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "interfaces/Serializable.hpp"
|
||||||
|
|
||||||
|
struct Project : Serializable {
|
||||||
|
std::string name;
|
||||||
|
std::string title;
|
||||||
|
std::vector<std::string> basePacks;
|
||||||
|
|
||||||
|
dv::value serialize() const override;
|
||||||
|
void deserialize(const dv::value& src) override;
|
||||||
|
};
|
||||||
@ -13,6 +13,7 @@
|
|||||||
#include "coders/toml.hpp"
|
#include "coders/toml.hpp"
|
||||||
#include "coders/commons.hpp"
|
#include "coders/commons.hpp"
|
||||||
#include "devtools/Editor.hpp"
|
#include "devtools/Editor.hpp"
|
||||||
|
#include "devtools/Project.hpp"
|
||||||
#include "content/ContentControl.hpp"
|
#include "content/ContentControl.hpp"
|
||||||
#include "core_defs.hpp"
|
#include "core_defs.hpp"
|
||||||
#include "io/io.hpp"
|
#include "io/io.hpp"
|
||||||
@ -74,17 +75,24 @@ Engine& Engine::getInstance() {
|
|||||||
void Engine::initialize(CoreParameters coreParameters) {
|
void Engine::initialize(CoreParameters coreParameters) {
|
||||||
params = std::move(coreParameters);
|
params = std::move(coreParameters);
|
||||||
settingsHandler = std::make_unique<SettingsHandler>(settings);
|
settingsHandler = std::make_unique<SettingsHandler>(settings);
|
||||||
editor = std::make_unique<devtools::Editor>(*this);
|
|
||||||
cmd = std::make_unique<cmd::CommandsInterpreter>();
|
|
||||||
network = network::Network::create(settings.network);
|
|
||||||
|
|
||||||
logger.info() << "engine version: " << ENGINE_VERSION_STRING;
|
logger.info() << "engine version: " << ENGINE_VERSION_STRING;
|
||||||
if (params.headless) {
|
if (params.headless) {
|
||||||
logger.info() << "headless mode is enabled";
|
logger.info() << "headless mode is enabled";
|
||||||
}
|
}
|
||||||
|
if (params.projectFolder.empty()) {
|
||||||
|
params.projectFolder = params.resFolder;
|
||||||
|
}
|
||||||
paths.setResourcesFolder(params.resFolder);
|
paths.setResourcesFolder(params.resFolder);
|
||||||
paths.setUserFilesFolder(params.userFolder);
|
paths.setUserFilesFolder(params.userFolder);
|
||||||
|
paths.setProjectFolder(params.projectFolder);
|
||||||
paths.prepare();
|
paths.prepare();
|
||||||
|
loadProject();
|
||||||
|
|
||||||
|
editor = std::make_unique<devtools::Editor>(*this);
|
||||||
|
cmd = std::make_unique<cmd::CommandsInterpreter>();
|
||||||
|
network = network::Network::create(settings.network);
|
||||||
|
|
||||||
if (!params.scriptFile.empty()) {
|
if (!params.scriptFile.empty()) {
|
||||||
paths.setScriptFolder(params.scriptFile.parent_path());
|
paths.setScriptFolder(params.scriptFile.parent_path());
|
||||||
}
|
}
|
||||||
@ -92,9 +100,12 @@ void Engine::initialize(CoreParameters coreParameters) {
|
|||||||
|
|
||||||
controller = std::make_unique<EngineController>(*this);
|
controller = std::make_unique<EngineController>(*this);
|
||||||
if (!params.headless) {
|
if (!params.headless) {
|
||||||
std::string title = "VoxelCore v" +
|
std::string title = project->title;
|
||||||
|
if (title.empty()) {
|
||||||
|
title = "VoxelCore v" +
|
||||||
std::to_string(ENGINE_VERSION_MAJOR) + "." +
|
std::to_string(ENGINE_VERSION_MAJOR) + "." +
|
||||||
std::to_string(ENGINE_VERSION_MINOR);
|
std::to_string(ENGINE_VERSION_MINOR);
|
||||||
|
}
|
||||||
if (ENGINE_DEBUG_BUILD) {
|
if (ENGINE_DEBUG_BUILD) {
|
||||||
title += " [debug]";
|
title += " [debug]";
|
||||||
}
|
}
|
||||||
@ -135,7 +146,7 @@ void Engine::initialize(CoreParameters coreParameters) {
|
|||||||
langs::locale_by_envlocale(platform::detect_locale())
|
langs::locale_by_envlocale(platform::detect_locale())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
content = std::make_unique<ContentControl>(paths, *input, [this]() {
|
content = std::make_unique<ContentControl>(*project, paths, *input, [this]() {
|
||||||
editor->loadTools();
|
editor->loadTools();
|
||||||
langs::setup(langs::get_current(), paths.resPaths.collectRoots());
|
langs::setup(langs::get_current(), paths.resPaths.collectRoots());
|
||||||
if (!isHeadless()) {
|
if (!isHeadless()) {
|
||||||
@ -325,6 +336,13 @@ void Engine::loadAssets() {
|
|||||||
gui->onAssetsLoad(assets.get());
|
gui->onAssetsLoad(assets.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Engine::loadProject() {
|
||||||
|
io::path projectFile = "project:project.toml";
|
||||||
|
project = std::make_unique<Project>();
|
||||||
|
project->deserialize(io::read_object(projectFile));
|
||||||
|
logger.info() << "loaded project " << util::quote(project->name);
|
||||||
|
}
|
||||||
|
|
||||||
void Engine::setScreen(std::shared_ptr<Screen> screen) {
|
void Engine::setScreen(std::shared_ptr<Screen> screen) {
|
||||||
// reset audio channels (stop all sources)
|
// reset audio channels (stop all sources)
|
||||||
audio::reset_channel(audio::get_channel_index("regular"));
|
audio::reset_channel(audio::get_channel_index("regular"));
|
||||||
|
|||||||
@ -20,6 +20,7 @@ class Screen;
|
|||||||
class ContentControl;
|
class ContentControl;
|
||||||
class EngineController;
|
class EngineController;
|
||||||
class Input;
|
class Input;
|
||||||
|
struct Project;
|
||||||
|
|
||||||
namespace gui {
|
namespace gui {
|
||||||
class GUI;
|
class GUI;
|
||||||
@ -48,6 +49,7 @@ struct CoreParameters {
|
|||||||
std::filesystem::path resFolder = "res";
|
std::filesystem::path resFolder = "res";
|
||||||
std::filesystem::path userFolder = ".";
|
std::filesystem::path userFolder = ".";
|
||||||
std::filesystem::path scriptFile;
|
std::filesystem::path scriptFile;
|
||||||
|
std::filesystem::path projectFolder;
|
||||||
};
|
};
|
||||||
|
|
||||||
using OnWorldOpen = std::function<void(std::unique_ptr<Level>, int64_t)>;
|
using OnWorldOpen = std::function<void(std::unique_ptr<Level>, int64_t)>;
|
||||||
@ -57,6 +59,7 @@ class Engine : public util::ObjectsKeeper {
|
|||||||
EngineSettings settings;
|
EngineSettings settings;
|
||||||
EnginePaths paths;
|
EnginePaths paths;
|
||||||
|
|
||||||
|
std::unique_ptr<Project> project;
|
||||||
std::unique_ptr<SettingsHandler> settingsHandler;
|
std::unique_ptr<SettingsHandler> settingsHandler;
|
||||||
std::unique_ptr<Assets> assets;
|
std::unique_ptr<Assets> assets;
|
||||||
std::shared_ptr<Screen> screen;
|
std::shared_ptr<Screen> screen;
|
||||||
@ -78,6 +81,7 @@ class Engine : public util::ObjectsKeeper {
|
|||||||
void saveSettings();
|
void saveSettings();
|
||||||
void updateHotkeys();
|
void updateHotkeys();
|
||||||
void loadAssets();
|
void loadAssets();
|
||||||
|
void loadProject();
|
||||||
public:
|
public:
|
||||||
Engine();
|
Engine();
|
||||||
~Engine();
|
~Engine();
|
||||||
|
|||||||
@ -26,7 +26,7 @@ void menus::create_version_label(gui::GUI& gui) {
|
|||||||
auto text = ENGINE_VERSION_STRING + " debug build";
|
auto text = ENGINE_VERSION_STRING + " debug build";
|
||||||
gui.add(guiutil::create(
|
gui.add(guiutil::create(
|
||||||
gui,
|
gui,
|
||||||
"<label z-index='1000' color='#FFFFFF80' gravity='top-right' "
|
"<label z-index='1000' color='#FFFFFF30' gravity='top-right' "
|
||||||
"margin='4'>" +
|
"margin='4'>" +
|
||||||
text + "</label>"
|
text + "</label>"
|
||||||
));
|
));
|
||||||
|
|||||||
@ -434,6 +434,11 @@ static std::shared_ptr<UINode> read_text_box(
|
|||||||
auto placeholder =
|
auto placeholder =
|
||||||
util::str2wstr_utf8(element.attr("placeholder", "").getText());
|
util::str2wstr_utf8(element.attr("placeholder", "").getText());
|
||||||
auto hint = util::str2wstr_utf8(element.attr("hint", "").getText());
|
auto hint = util::str2wstr_utf8(element.attr("hint", "").getText());
|
||||||
|
if (!hint.empty() && hint[0] == '@') {
|
||||||
|
hint = langs::get(
|
||||||
|
hint.substr(1), util::str2wstr_utf8(reader.getContext())
|
||||||
|
);
|
||||||
|
}
|
||||||
auto text = parse_inner_text(element, reader.getContext());
|
auto text = parse_inner_text(element, reader.getContext());
|
||||||
auto textbox = std::make_shared<TextBox>(
|
auto textbox = std::make_shared<TextBox>(
|
||||||
reader.getGUI(), placeholder, glm::vec4(0.0f)
|
reader.getGUI(), placeholder, glm::vec4(0.0f)
|
||||||
@ -614,7 +619,7 @@ static slotcallback read_slot_func(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static void readSlot(
|
static void read_slot(
|
||||||
InventoryView* view, UiXmlReader& reader, const xml::xmlelement& element
|
InventoryView* view, UiXmlReader& reader, const xml::xmlelement& element
|
||||||
) {
|
) {
|
||||||
int index = element.attr("index", "0").asInt();
|
int index = element.attr("index", "0").asInt();
|
||||||
@ -644,7 +649,7 @@ static void readSlot(
|
|||||||
view->add(slot);
|
view->add(slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void readSlotsGrid(
|
static void read_slots_grid(
|
||||||
InventoryView* view,
|
InventoryView* view,
|
||||||
const UiXmlReader& reader,
|
const UiXmlReader& reader,
|
||||||
const xml::xmlelement& element
|
const xml::xmlelement& element
|
||||||
@ -721,9 +726,9 @@ static std::shared_ptr<UINode> read_inventory(
|
|||||||
|
|
||||||
for (auto& sub : element.getElements()) {
|
for (auto& sub : element.getElements()) {
|
||||||
if (sub->getTag() == "slot") {
|
if (sub->getTag() == "slot") {
|
||||||
readSlot(view.get(), reader, *sub);
|
read_slot(view.get(), reader, *sub);
|
||||||
} else if (sub->getTag() == "slots-grid") {
|
} else if (sub->getTag() == "slots-grid") {
|
||||||
readSlotsGrid(view.get(), reader, *sub);
|
read_slots_grid(view.get(), reader, *sub);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return view;
|
return view;
|
||||||
|
|||||||
@ -46,6 +46,7 @@ void EnginePaths::prepare() {
|
|||||||
}
|
}
|
||||||
logger.info() << "resources folder: " << fs::canonical(resourcesFolder).u8string();
|
logger.info() << "resources folder: " << fs::canonical(resourcesFolder).u8string();
|
||||||
logger.info() << "user files folder: " << fs::canonical(userFilesFolder).u8string();
|
logger.info() << "user files folder: " << fs::canonical(userFilesFolder).u8string();
|
||||||
|
logger.info() << "project folder: " << fs::canonical(projectFolder).u8string();
|
||||||
|
|
||||||
if (!io::is_directory(CONTENT_FOLDER)) {
|
if (!io::is_directory(CONTENT_FOLDER)) {
|
||||||
io::create_directories(CONTENT_FOLDER);
|
io::create_directories(CONTENT_FOLDER);
|
||||||
@ -142,6 +143,11 @@ void EnginePaths::setScriptFolder(std::filesystem::path folder) {
|
|||||||
this->scriptFolder = std::move(folder);
|
this->scriptFolder = std::move(folder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EnginePaths::setProjectFolder(std::filesystem::path folder) {
|
||||||
|
io::set_device("project", std::make_shared<io::StdfsDevice>(folder));
|
||||||
|
this->projectFolder = std::move(folder);
|
||||||
|
}
|
||||||
|
|
||||||
void EnginePaths::setCurrentWorldFolder(io::path folder) {
|
void EnginePaths::setCurrentWorldFolder(io::path folder) {
|
||||||
this->currentWorldFolder = std::move(folder);
|
this->currentWorldFolder = std::move(folder);
|
||||||
io::create_subdevice("world", "user", currentWorldFolder);
|
io::create_subdevice("world", "user", currentWorldFolder);
|
||||||
|
|||||||
@ -56,6 +56,8 @@ public:
|
|||||||
|
|
||||||
void setScriptFolder(std::filesystem::path folder);
|
void setScriptFolder(std::filesystem::path folder);
|
||||||
|
|
||||||
|
void setProjectFolder(std::filesystem::path folder);
|
||||||
|
|
||||||
io::path getWorldFolderByName(const std::string& name);
|
io::path getWorldFolderByName(const std::string& name);
|
||||||
io::path getWorldsFolder() const;
|
io::path getWorldsFolder() const;
|
||||||
|
|
||||||
@ -80,6 +82,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
std::filesystem::path userFilesFolder {"."};
|
std::filesystem::path userFilesFolder {"."};
|
||||||
std::filesystem::path resourcesFolder {"res"};
|
std::filesystem::path resourcesFolder {"res"};
|
||||||
|
std::filesystem::path projectFolder = resourcesFolder;
|
||||||
io::path currentWorldFolder;
|
io::path currentWorldFolder;
|
||||||
std::optional<std::filesystem::path> scriptFolder;
|
std::optional<std::filesystem::path> scriptFolder;
|
||||||
std::vector<PathsRoot> entryPoints;
|
std::vector<PathsRoot> entryPoints;
|
||||||
|
|||||||
@ -12,18 +12,19 @@ static bool perform_keyword(
|
|||||||
util::ArgsReader& reader, const std::string& keyword, CoreParameters& params
|
util::ArgsReader& reader, const std::string& keyword, CoreParameters& params
|
||||||
) {
|
) {
|
||||||
if (keyword == "--res") {
|
if (keyword == "--res") {
|
||||||
auto token = reader.next();
|
params.resFolder = reader.next();
|
||||||
params.resFolder = token;
|
|
||||||
} else if (keyword == "--dir") {
|
} else if (keyword == "--dir") {
|
||||||
auto token = reader.next();
|
params.userFolder = reader.next();
|
||||||
params.userFolder = token;
|
} else if (keyword == "--project") {
|
||||||
|
params.projectFolder = reader.next();
|
||||||
} else if (keyword == "--help" || keyword == "-h") {
|
} else if (keyword == "--help" || keyword == "-h") {
|
||||||
std::cout << "VoxelCore v" << ENGINE_VERSION_STRING << "\n\n";
|
std::cout << "VoxelCore v" << ENGINE_VERSION_STRING << "\n\n";
|
||||||
std::cout << "command-line arguments:\n";
|
std::cout << "command-line arguments:\n";
|
||||||
std::cout << " --help - show help\n";
|
std::cout << " --help - display this help\n";
|
||||||
std::cout << " --version - print engine version\n";
|
std::cout << " --version - display engine version\n";
|
||||||
std::cout << " --res <path> - set resources directory\n";
|
std::cout << " --res <path> - set resources directory\n";
|
||||||
std::cout << " --dir <path> - set userfiles directory\n";
|
std::cout << " --dir <path> - set userfiles directory\n";
|
||||||
|
std::cout << " --project <path> - set project directory\n";
|
||||||
std::cout << " --headless - run in headless mode\n";
|
std::cout << " --headless - run in headless mode\n";
|
||||||
std::cout << " --test <path> - test script file\n";
|
std::cout << " --test <path> - test script file\n";
|
||||||
std::cout << " --script <path> - main script file\n";
|
std::cout << " --script <path> - main script file\n";
|
||||||
|
|||||||
@ -1,18 +0,0 @@
|
|||||||
#include "listutil.hpp"
|
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
#include "stringutil.hpp"
|
|
||||||
|
|
||||||
std::string util::to_string(const std::vector<std::string>& vec) {
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << "[";
|
|
||||||
for (size_t i = 0; i < vec.size(); i++) {
|
|
||||||
ss << util::quote(vec[1]);
|
|
||||||
if (i < vec.size() - 1) {
|
|
||||||
ss << ", ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ss << "]";
|
|
||||||
return ss.str();
|
|
||||||
}
|
|
||||||
@ -33,6 +33,4 @@ namespace util {
|
|||||||
a.reserve(a.size() + b.size());
|
a.reserve(a.size() + b.size());
|
||||||
a.insert(a.end(), b.begin(), b.end());
|
a.insert(a.end(), b.begin(), b.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string to_string(const std::vector<std::string>& vec);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user