#include "Application.hpp"
-#include "ClientState.hpp"
#include "Environment.hpp"
#include "Runtime.hpp"
#include "ServerState.hpp"
#include "WorldState.hpp"
#include "init.hpp"
+#include "../client/MasterState.hpp"
#include "../io/filesystem.hpp"
#include "../io/WorldSave.hpp"
namespace blank {
-HeadlessEnvironment::HeadlessEnvironment(const string &asset_path)
-: loader(asset_path)
+HeadlessEnvironment::HeadlessEnvironment(const Config &config)
+: config(config)
+, loader(config.asset_path)
, counter()
, state() {
}
-Environment::Environment(Window &win, const string &asset_path)
-: HeadlessEnvironment(asset_path)
+string HeadlessEnvironment::Config::GetWorldPath(const string &world_name) const {
+ return save_path + "worlds/" + world_name + '/';
+}
+
+string HeadlessEnvironment::Config::GetWorldPath(const string &world_name, const string &host_name) const {
+ return save_path + "cache/" + host_name + '/' + world_name + '/';
+}
+
+Environment::Environment(Window &win, const Config &config)
+: HeadlessEnvironment(config)
, assets(loader)
, audio()
, viewport()
viewport.Clear();
window.Flip();
keymap.LoadDefault();
+
+ string keys_path = config.save_path + "keys.conf";
+ if (!is_file(keys_path)) {
+ std::ofstream file(keys_path);
+ keymap.Save(file);
+ } else {
+ std::ifstream file(keys_path);
+ keymap.Load(file);
+ }
}
cerr << "missing argument to --asset-path" << endl;
error = true;
} else {
- config.asset_path = argv[i];
+ config.env.asset_path = argv[i];
}
} else if (strcmp(param, "host") == 0) {
++i;
cerr << "missing argument to --save-path" << endl;
error = true;
} else {
- config.save_path = argv[i];
+ config.env.save_path = argv[i];
}
} else if (strcmp(param, "world-name") == 0) {
++i;
cerr << "missing argument to --world-name" << endl;
error = true;
} else {
- config.world_name = argv[i];
+ config.world.name = argv[i];
}
} else {
cerr << "unknown option " << arg << endl;
cerr << "missing argument to -s" << endl;
error = true;
} else {
- config.world.gen.seed = strtoul(argv[i], nullptr, 10);
+ config.gen.seed = strtoul(argv[i], nullptr, 10);
}
break;
case 't':
return;
}
- if (config.asset_path.empty()) {
- config.asset_path = default_asset_path();
+ if (config.env.asset_path.empty()) {
+ config.env.asset_path = default_asset_path();
} else if (
- config.asset_path[config.asset_path.size() - 1] != '/' &&
- config.asset_path[config.asset_path.size() - 1] != '\\'
+ config.env.asset_path[config.env.asset_path.size() - 1] != '/' &&
+ config.env.asset_path[config.env.asset_path.size() - 1] != '\\'
) {
- config.asset_path += '/';
+ config.env.asset_path += '/';
}
- if (config.save_path.empty()) {
- config.save_path = default_save_path();
+ if (config.env.save_path.empty()) {
+ config.env.save_path = default_save_path();
} else if (
- config.save_path[config.save_path.size() - 1] != '/' &&
- config.save_path[config.save_path.size() - 1] != '\\'
+ config.env.save_path[config.env.save_path.size() - 1] != '/' &&
+ config.env.save_path[config.env.save_path.size() - 1] != '\\'
) {
- config.save_path += '/';
+ config.env.save_path += '/';
}
if (n > 0) {
void Runtime::RunStandalone() {
Init init(config.doublebuf, config.multisampling);
- Environment env(init.window, config.asset_path);
+ Environment env(init.window, config.env);
env.viewport.VSync(config.vsync);
- WorldSave save(config.save_path + config.world_name + '/');
+ WorldSave save(config.env.GetWorldPath(config.world.name));
if (save.Exists()) {
save.Read(config.world);
+ save.Read(config.gen);
} else {
save.Write(config.world);
- }
-
- std::string keys_path = config.save_path + "keys.conf";
- if (!is_file(keys_path)) {
- std::ofstream file(keys_path);
- env.keymap.Save(file);
- } else {
- std::ifstream file(keys_path);
- env.keymap.Load(file);
+ save.Write(config.gen);
}
Application app(env);
- WorldState world_state(env, config.interface, config.world, save);
+ WorldState world_state(env, config.gen, config.interface, config.world, save);
app.PushState(&world_state);
Run(app);
}
void Runtime::RunServer() {
- HeadlessEnvironment env(config.asset_path);
+ HeadlessEnvironment env(config.env);
- WorldSave save(config.save_path + config.world_name + '/');
+ WorldSave save(config.env.GetWorldPath(config.world.name));
if (save.Exists()) {
save.Read(config.world);
+ save.Read(config.gen);
} else {
save.Write(config.world);
+ save.Write(config.gen);
}
HeadlessApplication app(env);
- ServerState server_state(env, config.world, save, config.server);
+ ServerState server_state(env, config.gen, config.world, save, config.server);
app.PushState(&server_state);
Run(app);
}
void Runtime::RunClient() {
Init init(config.doublebuf, config.multisampling);
- Environment env(init.window, config.asset_path);
+ Environment env(init.window, config.env);
env.viewport.VSync(config.vsync);
- WorldSave save(config.save_path + config.world_name + '/');
- if (save.Exists()) {
- save.Read(config.world);
- } else {
- save.Write(config.world);
- }
-
- std::string keys_path = config.save_path + "keys.conf";
- if (!is_file(keys_path)) {
- std::ofstream file(keys_path);
- env.keymap.Save(file);
- } else {
- std::ifstream file(keys_path);
- env.keymap.Load(file);
- }
-
Application app(env);
- ClientState client_state(env, config.world, save, config.client);
+ client::MasterState client_state(env, config.world, config.interface, config.client);
app.PushState(&client_state);
Run(app);
}