aboutsummaryrefslogtreecommitdiff
path: root/extension/src/openvic-extension/singletons
diff options
context:
space:
mode:
Diffstat (limited to 'extension/src/openvic-extension/singletons')
-rw-r--r--extension/src/openvic-extension/singletons/AssetManager.cpp72
-rw-r--r--extension/src/openvic-extension/singletons/AssetManager.hpp10
-rw-r--r--extension/src/openvic-extension/singletons/GameSingleton.cpp142
-rw-r--r--extension/src/openvic-extension/singletons/GameSingleton.hpp2
-rw-r--r--extension/src/openvic-extension/singletons/LoadLocalisation.cpp41
5 files changed, 101 insertions, 166 deletions
diff --git a/extension/src/openvic-extension/singletons/AssetManager.cpp b/extension/src/openvic-extension/singletons/AssetManager.cpp
index 581c7fa..a81a0a2 100644
--- a/extension/src/openvic-extension/singletons/AssetManager.cpp
+++ b/extension/src/openvic-extension/singletons/AssetManager.cpp
@@ -32,66 +32,50 @@ AssetManager::~AssetManager() {
_singleton = nullptr;
}
-Ref<Image> AssetManager::_load_image(StringName path) {
+Ref<Image> AssetManager::_load_image(StringName const& path) {
GameSingleton* game_singleton = GameSingleton::get_singleton();
ERR_FAIL_NULL_V(game_singleton, nullptr);
const String lookedup_path =
std_to_godot_string(game_singleton->get_dataloader().lookup_image_file(godot_to_std_string(path)).string());
- if (lookedup_path.is_empty()) {
- UtilityFunctions::push_error("Failed to look up image: ", path);
- return nullptr;
- }
+ ERR_FAIL_COND_V_MSG(lookedup_path.is_empty(), nullptr, vformat("Failed to look up image: %s", path));
const Ref<Image> image = Utilities::load_godot_image(lookedup_path);
- if (image.is_null() || image->is_empty()) {
- UtilityFunctions::push_error("Failed to load image: ", lookedup_path, " (looked up from ", path, ")");
- return nullptr;
- } else {
- return image;
- }
+ ERR_FAIL_COND_V_MSG(
+ image.is_null() || image->is_empty(), nullptr, vformat("Failed to load image: %s (looked up: %s)", path, lookedup_path)
+ );
+ return image;
}
-AssetManager::image_asset_map_t::iterator AssetManager::_get_image_asset(StringName path) {
+AssetManager::image_asset_map_t::iterator AssetManager::_get_image_asset(StringName const& path) {
const image_asset_map_t::iterator it = image_assets.find(path);
if (it != image_assets.end()) {
return it;
}
const Ref<Image> image = _load_image(path);
- if (image.is_valid()) {
- return image_assets.emplace(std::move(path), AssetManager::image_asset_t { image, nullptr }).first;
- } else {
- return image_assets.end();
- }
+ ERR_FAIL_NULL_V(image, image_assets.end());
+ return image_assets.emplace(std::move(path), AssetManager::image_asset_t { image, nullptr }).first;
}
-Ref<Image> AssetManager::get_image(StringName path, bool cache) {
+Ref<Image> AssetManager::get_image(StringName const& path, bool cache) {
if (cache) {
const image_asset_map_t::const_iterator it = _get_image_asset(path);
- if (it != image_assets.end()) {
- return it->second.image;
- } else {
- return nullptr;
- }
+ ERR_FAIL_COND_V(it == image_assets.end(), nullptr);
+ return it->second.image;
} else {
return _load_image(path);
}
}
-Ref<ImageTexture> AssetManager::get_texture(StringName path) {
+Ref<ImageTexture> AssetManager::get_texture(StringName const& path) {
const image_asset_map_t::iterator it = _get_image_asset(path);
- if (it != image_assets.end()) {
- if (it->second.texture.is_null()) {
- it->second.texture = ImageTexture::create_from_image(it->second.image);
- if (it->second.texture.is_null()) {
- UtilityFunctions::push_error("Failed to turn image into texture: ", path);
- }
- }
- return it->second.texture;
- } else {
- return nullptr;
+ ERR_FAIL_COND_V(it == image_assets.end(), nullptr);
+ if (it->second.texture.is_null()) {
+ it->second.texture = ImageTexture::create_from_image(it->second.image);
+ ERR_FAIL_NULL_V_MSG(it->second.texture, nullptr, vformat("Failed to turn image into texture: %s", path));
}
+ return it->second.texture;
}
-Ref<Font> AssetManager::get_font(StringName name) {
+Ref<Font> AssetManager::get_font(StringName const& name) {
const font_map_t::const_iterator it = fonts.find(name);
if (it != fonts.end()) {
return it->second;
@@ -101,21 +85,19 @@ Ref<Font> AssetManager::get_font(StringName name) {
static const String font_ext = ".fnt";
static const String image_ext = ".tga";
- const String image_path = font_dir + name + image_ext;
+ const StringName image_path = font_dir + name + image_ext;
const Ref<Image> image = get_image(image_path);
- if (image.is_null()) {
- UtilityFunctions::push_error("Failed to load font image: ", image_path, " for the font named ", name);
- return nullptr;
- }
+ ERR_FAIL_NULL_V_MSG(image, nullptr, vformat("Failed to load font image %s for the font named %s", image_path, name));
GameSingleton* game_singleton = GameSingleton::get_singleton();
ERR_FAIL_NULL_V(game_singleton, nullptr);
+ const String font_path = font_dir + name + font_ext;
const String lookedup_font_path =
- std_to_godot_string(game_singleton->get_dataloader().lookup_file(godot_to_std_string(font_dir + name + font_ext)).string());
+ std_to_godot_string(game_singleton->get_dataloader().lookup_file(godot_to_std_string(font_path)).string());
const Ref<Font> font = Utilities::load_godot_font(lookedup_font_path, image);
- if (font.is_null()) {
- UtilityFunctions::push_error("Failed to load font file ", lookedup_font_path, " for the font named ", name);
- return nullptr;
- }
+ ERR_FAIL_NULL_V_MSG(
+ font, nullptr,
+ vformat("Failed to load font file %s (looked up: %s) for the font named %s", font_path, lookedup_font_path, name)
+ );
fonts.emplace(std::move(name), font);
return font;
}
diff --git a/extension/src/openvic-extension/singletons/AssetManager.hpp b/extension/src/openvic-extension/singletons/AssetManager.hpp
index e6a7664..40577ad 100644
--- a/extension/src/openvic-extension/singletons/AssetManager.hpp
+++ b/extension/src/openvic-extension/singletons/AssetManager.hpp
@@ -23,8 +23,8 @@ namespace OpenVic {
image_asset_map_t image_assets;
font_map_t fonts;
- static godot::Ref<godot::Image> _load_image(godot::StringName path);
- image_asset_map_t::iterator _get_image_asset(godot::StringName path);
+ static godot::Ref<godot::Image> _load_image(godot::StringName const& path);
+ image_asset_map_t::iterator _get_image_asset(godot::StringName const& path);
protected:
static void _bind_methods();
@@ -37,15 +37,15 @@ namespace OpenVic {
/* Search for and load an image at the specified path relative to the game defines, first checking the AssetManager's
* image cache (if cache is true) in case it has already been loaded, and returning nullptr if image loading fails. */
- godot::Ref<godot::Image> get_image(godot::StringName path, bool cache = true);
+ godot::Ref<godot::Image> get_image(godot::StringName const& path, bool cache = true);
/* Create a texture from an image found at the specified path relative to the game defines, fist checking
* AssetManager's texture cache in case it has already been loaded, and returning nullptr if image loading
* or texture creation fails. */
- godot::Ref<godot::ImageTexture> get_texture(godot::StringName path);
+ godot::Ref<godot::ImageTexture> get_texture(godot::StringName const& path);
/* Search for and load a font with the specified name from the game defines' font directory, first checking the
* AssetManager's font cache in case it has already been loaded, and returning nullptr if font loading fails. */
- godot::Ref<godot::Font> get_font(godot::StringName name);
+ godot::Ref<godot::Font> get_font(godot::StringName const& name);
};
}
diff --git a/extension/src/openvic-extension/singletons/GameSingleton.cpp b/extension/src/openvic-extension/singletons/GameSingleton.cpp
index 0e64313..7ad0db0 100644
--- a/extension/src/openvic-extension/singletons/GameSingleton.cpp
+++ b/extension/src/openvic-extension/singletons/GameSingleton.cpp
@@ -118,10 +118,7 @@ Dataloader const& GameSingleton::get_dataloader() const {
Error GameSingleton::setup_game(int32_t bookmark_index) {
Bookmark const* bookmark = game_manager.get_history_manager().get_bookmark_manager().get_bookmark_by_index(bookmark_index);
- if (bookmark == nullptr) {
- UtilityFunctions::push_error("Failed to get bookmark with index: ", bookmark_index);
- return FAILED;
- }
+ ERR_FAIL_NULL_V_MSG(bookmark, FAILED, vformat("Failed to get bookmark with index: %d", bookmark_index));
bool ret = game_manager.load_bookmark(bookmark);
for (Province& province : game_manager.get_map().get_provinces()) {
province.set_crime(
@@ -272,24 +269,18 @@ Ref<Texture> GameSingleton::get_terrain_texture() const {
}
Ref<Image> GameSingleton::get_flag_image(Country const* country, StringName const& flag_type) const {
- if (country != nullptr) {
- const typename decltype(flag_image_map)::const_iterator it = flag_image_map.find(country);
- if (it != flag_image_map.end()) {
- const typename decltype(it->second)::const_iterator it2 = it->second.find(flag_type);
- if (it2 != it->second.end()) {
- return it2->second;
- } else {
- UtilityFunctions::push_error(
- "Failed to find ", flag_type, " flag for country: ", std_view_to_godot_string(country->get_identifier())
- );
- }
- } else {
- UtilityFunctions::push_error(
- "Failed to find flags for country: ", std_view_to_godot_string(country->get_identifier())
- );
- }
- }
- return nullptr;
+ ERR_FAIL_NULL_V(country, nullptr);
+ const typename decltype(flag_image_map)::const_iterator it = flag_image_map.find(country);
+ ERR_FAIL_COND_V_MSG(
+ it == flag_image_map.end(), nullptr,
+ vformat("Failed to find flags for country: %s", std_view_to_godot_string(country->get_identifier()))
+ );
+ const typename decltype(it->second)::const_iterator it2 = it->second.find(flag_type);
+ ERR_FAIL_COND_V_MSG(
+ it2 == it->second.end(), nullptr,
+ vformat("Failed to find %s flag for country: %s", flag_type, std_view_to_godot_string(country->get_identifier()))
+ );
+ return it2->second;
}
Vector2i GameSingleton::get_province_shape_image_subdivisions() const {
@@ -306,10 +297,10 @@ Ref<Texture> GameSingleton::get_province_colour_texture() const {
Error GameSingleton::_update_colour_image() {
Map const& map = game_manager.get_map();
- if (!map.provinces_are_locked()) {
- UtilityFunctions::push_error("Cannot generate province colour image before provinces are locked!");
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(
+ !map.provinces_are_locked(), FAILED, "Cannot generate province colour image before provinces are locked!"
+ );
+
/* We reshape the list of colours into a square, as each texture dimensions cannot exceed 16384. */
static constexpr int32_t PROVINCE_INDEX_SQRT = 1 << (sizeof(Province::index_t) * CHAR_BIT / 2);
static constexpr int32_t colour_image_width = PROVINCE_INDEX_SQRT * sizeof(Mapmode::base_stripe_t) / sizeof(colour_argb_t);
@@ -357,13 +348,9 @@ String GameSingleton::get_mapmode_identifier(int32_t index) const {
Error GameSingleton::set_mapmode(String const& identifier) {
Mapmode const* mapmode = game_manager.get_map().get_mapmode_by_identifier(godot_to_std_string(identifier));
- if (mapmode == nullptr) {
- UtilityFunctions::push_error("Failed to set mapmode to: ", identifier);
- return FAILED;
- }
+ ERR_FAIL_NULL_V_MSG(mapmode, FAILED, vformat("Failed to find mapmode with identifier: %s", identifier));
mapmode_index = mapmode->get_index();
- _update_colour_image();
- return OK;
+ return _update_colour_image();
}
int32_t GameSingleton::get_selected_province_index() const {
@@ -390,37 +377,28 @@ String GameSingleton::get_province_building_identifier(int32_t index) const {
}
Error GameSingleton::expand_selected_province_building(int32_t building_index) {
- const bool ret = game_manager.expand_selected_province_building(building_index);
- if (!ret) {
- UtilityFunctions::push_error("Failed to expand the currently selected province's building index ", building_index);
- }
- return ERR(ret);
+ ERR_FAIL_COND_V_MSG(
+ !game_manager.expand_selected_province_building(building_index), FAILED,
+ vformat("Failed to expand the currently selected province's building index %d", building_index)
+ );
+ return OK;
}
int32_t GameSingleton::get_slave_pop_icon_index() const {
const PopType::sprite_t sprite = game_manager.get_pop_manager().get_slave_sprite();
- if (sprite <= 0) {
- UtilityFunctions::push_error("Slave sprite unset!");
- return 0;
- }
+ ERR_FAIL_COND_V_MSG(sprite <= 0, 0, "Slave sprite unset!");
return sprite;
}
int32_t GameSingleton::get_administrative_pop_icon_index() const {
const PopType::sprite_t sprite = game_manager.get_pop_manager().get_administrative_sprite();
- if (sprite <= 0) {
- UtilityFunctions::push_error("Administrative sprite unset!");
- return 0;
- }
+ ERR_FAIL_COND_V_MSG(sprite <= 0, 0, "Administrative sprite unset!");
return sprite;
}
int32_t GameSingleton::get_rgo_owner_pop_icon_index() const {
const PopType::sprite_t sprite = game_manager.get_economy_manager().get_production_type_manager().get_rgo_owner_sprite();
- if (sprite <= 0) {
- UtilityFunctions::push_error("RGO owner sprite unset!");
- return 0;
- }
+ ERR_FAIL_COND_V_MSG(sprite <= 0, 0, "RGO owner sprite unset!");
return sprite;
}
@@ -473,10 +451,7 @@ void GameSingleton::try_tick() {
}
Error GameSingleton::_load_map_images(bool flip_vertical) {
- if (province_shape_texture.is_valid()) {
- UtilityFunctions::push_error("Map images have already been loaded!");
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(province_shape_texture.is_valid(), FAILED, "Map images have already been loaded!");
Error err = OK;
@@ -535,33 +510,26 @@ Error GameSingleton::_load_map_images(bool flip_vertical) {
}
Error GameSingleton::_load_terrain_variants() {
- if (terrain_texture.is_valid()) {
- UtilityFunctions::push_error("Terrain variants have already been loaded!");
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(terrain_texture.is_valid(), FAILED, "Terrain variants have already been loaded!");
- static const String terrain_texturesheet_path = "map/terrain/texturesheet.tga";
+ static const StringName terrain_texturesheet_path = "map/terrain/texturesheet.tga";
AssetManager* asset_manager = AssetManager::get_singleton();
ERR_FAIL_NULL_V(asset_manager, FAILED);
// Load the terrain texture sheet and prepare to slice it up
Ref<Image> terrain_sheet = asset_manager->get_image(terrain_texturesheet_path);
- if (terrain_sheet.is_null()) {
- UtilityFunctions::push_error("Failed to load terrain texture sheet: ", terrain_texturesheet_path);
- return FAILED;
- }
+ ERR_FAIL_NULL_V_MSG(terrain_sheet, FAILED, vformat("Failed to load terrain texture sheet: %s", terrain_texturesheet_path));
static constexpr int32_t SHEET_DIMS = 8, SHEET_SIZE = SHEET_DIMS * SHEET_DIMS;
terrain_sheet->flip_y();
const int32_t sheet_width = terrain_sheet->get_width(), sheet_height = terrain_sheet->get_height();
- if (sheet_width < 1 || sheet_width % SHEET_DIMS != 0 || sheet_width != sheet_height) {
- UtilityFunctions::push_error(
- "Invalid terrain texture sheet dims: ", sheet_width, "x", sheet_height,
- " (must be square with dims positive multiples of ", SHEET_DIMS, ")"
- );
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(
+ sheet_width < 1 || sheet_width % SHEET_DIMS != 0 || sheet_width != sheet_height, FAILED, vformat(
+ "Invalid terrain texture sheet dims: %dx%d (must be square with dims positive multiples of %d)",
+ sheet_width, sheet_height, SHEET_DIMS
+ )
+ );
const int32_t slice_size = sheet_width / SHEET_DIMS;
TypedArray<Image> terrain_images;
@@ -588,29 +556,24 @@ Error GameSingleton::_load_terrain_variants() {
}
terrain_texture.instantiate();
- if (terrain_texture->create_from_images(terrain_images) != OK) {
- UtilityFunctions::push_error("Failed to create terrain texture array!");
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(
+ terrain_texture->create_from_images(terrain_images) != OK, FAILED, "Failed to create terrain texture array!"
+ );
return err;
}
Error GameSingleton::_load_flag_images() {
- if (!flag_image_map.empty()) {
- UtilityFunctions::push_error("Flag images have already been loaded!");
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(!flag_image_map.empty(), FAILED, "Flag images have already been loaded!");
GovernmentTypeManager const& government_type_manager = game_manager.get_politics_manager().get_government_type_manager();
- if (!government_type_manager.government_types_are_locked()) {
- UtilityFunctions::push_error("Cannot load flag images before government types are locked!");
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(
+ !government_type_manager.government_types_are_locked(), FAILED,
+ "Cannot load flag images before government types are locked!"
+ );
CountryManager const& country_manager = game_manager.get_country_manager();
- if (!country_manager.countries_are_locked()) {
- UtilityFunctions::push_error("Cannot load flag images before countries are locked!");
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(
+ !country_manager.countries_are_locked(), FAILED, "Cannot load flag images before countries are locked!"
+ );
AssetManager* asset_manager = AssetManager::get_singleton();
ERR_FAIL_NULL_V(asset_manager, FAILED);
@@ -629,11 +592,8 @@ Error GameSingleton::_load_flag_images() {
std::map<StringName, Ref<Image>>& flag_images = flag_image_map[&country];
const String country_name = std_view_to_godot_string(country.get_identifier());
for (StringName const& flag_type : flag_types) {
- String flag_path = flag_directory + country_name;
- if (!flag_type.is_empty()) {
- flag_path += flag_separator + flag_type;
- }
- flag_path += flag_extension;
+ const StringName flag_path =
+ flag_directory + country_name + (flag_type.is_empty() ? "" : flag_separator + flag_type) + flag_extension;
const Ref<Image> flag_image = asset_manager->get_image(flag_path);
if (flag_image.is_valid()) {
flag_images.emplace(flag_type, flag_image);
@@ -687,6 +647,6 @@ Error GameSingleton::load_defines_compatibility_mode(PackedStringArray const& fi
return err;
}
-String GameSingleton::search_for_game_path(String hint_path) {
+String GameSingleton::search_for_game_path(String const& hint_path) {
return std_to_godot_string(Dataloader::search_for_game_path(godot_to_std_string(hint_path)).string());
}
diff --git a/extension/src/openvic-extension/singletons/GameSingleton.hpp b/extension/src/openvic-extension/singletons/GameSingleton.hpp
index 1f3905e..56f3c25 100644
--- a/extension/src/openvic-extension/singletons/GameSingleton.hpp
+++ b/extension/src/openvic-extension/singletons/GameSingleton.hpp
@@ -52,7 +52,7 @@ namespace OpenVic {
* pointing to the defines folder. */
godot::Error load_defines_compatibility_mode(godot::PackedStringArray const& file_paths);
- static godot::String search_for_game_path(godot::String hint_path = {});
+ static godot::String search_for_game_path(godot::String const& hint_path = {});
/* Post-load/restart game setup - reset the game to post-load state and load the specified bookmark. */
godot::Error setup_game(int32_t bookmark_index);
diff --git a/extension/src/openvic-extension/singletons/LoadLocalisation.cpp b/extension/src/openvic-extension/singletons/LoadLocalisation.cpp
index 3da8bc8..6469820 100644
--- a/extension/src/openvic-extension/singletons/LoadLocalisation.cpp
+++ b/extension/src/openvic-extension/singletons/LoadLocalisation.cpp
@@ -33,10 +33,9 @@ LoadLocalisation::~LoadLocalisation() {
Error LoadLocalisation::_load_file(String const& file_path, Ref<Translation> translation) const {
const Ref<FileAccess> file = FileAccess::open(file_path, FileAccess::ModeFlags::READ);
Error err = FileAccess::get_open_error();
- if (err != OK || file.is_null()) {
- UtilityFunctions::push_error("Failed to load localisation file: ", file_path);
- return err == OK ? FAILED : err;
- }
+ ERR_FAIL_COND_V_MSG(
+ err != OK || file.is_null(), err == OK ? FAILED : err, vformat("Failed to open localisation file: %s", file_path)
+ );
int line_number = 0;
while (!file->eof_reached()) {
static const String delimeter = ";";
@@ -81,10 +80,10 @@ Error LoadLocalisation::load_file(String const& file_path, String const& locale)
* FS-18, FS-24, FS-25
*/
Error LoadLocalisation::load_locale_dir(String const& dir_path, String const& locale) const {
- if (!DirAccess::dir_exists_absolute(dir_path)) {
- UtilityFunctions::push_error("Locale directory does not exist: ", dir_path);
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(
+ !DirAccess::dir_exists_absolute(dir_path), FAILED, vformat("Locale directory does not exist: %s", dir_path)
+ );
+
/* This will add the locale to the list of loaded locales even if it has no
* localisation files - this is useful for testing other aspects of localisation
* such as number formatting and text direction. To disable this behaviour and
@@ -93,10 +92,7 @@ Error LoadLocalisation::load_locale_dir(String const& dir_path, String const& lo
*/
const Ref<Translation> translation = _get_translation(locale);
const PackedStringArray files = DirAccess::get_files_at(dir_path);
- if (files.size() < 1) {
- UtilityFunctions::push_error("Locale directory does not contain any files: ", dir_path);
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(files.size() < 1, FAILED, vformat("Locale directory does not contain any files: %s", dir_path));
Error err = OK;
for (String const& file_name : files) {
if (file_name.get_extension().to_lower() == "csv") {
@@ -112,15 +108,13 @@ Error LoadLocalisation::load_locale_dir(String const& dir_path, String const& lo
* FS-23
*/
Error LoadLocalisation::load_localisation_dir(String const& dir_path) const {
- if (!DirAccess::dir_exists_absolute(dir_path)) {
- UtilityFunctions::push_error("Localisation directory does not exist: ", dir_path);
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(
+ !DirAccess::dir_exists_absolute(dir_path), FAILED, vformat("Localisation directory does not exist: %s", dir_path)
+ );
PackedStringArray const dirs = DirAccess::get_directories_at(dir_path);
- if (dirs.size() < 1) {
- UtilityFunctions::push_error("Localisation directory does not contain any sub-directories: ", dir_path);
- return FAILED;
- }
+ ERR_FAIL_COND_V_MSG(
+ dirs.size() < 1, FAILED, vformat("Localisation directory does not contain any sub-directories: %s", dir_path)
+ );
TranslationServer* server = TranslationServer::get_singleton();
ERR_FAIL_NULL_V(server, FAILED);
Error err = OK;
@@ -138,10 +132,9 @@ bool LoadLocalisation::add_message(std::string_view key, Dataloader::locale_t lo
Ref<Translation>& translation = translations[locale];
if (translation.is_null()) {
translation = _singleton->_get_translation(Dataloader::locale_names[locale]);
- if (translation.is_null()) {
- UtilityFunctions::push_error("Failed to get translation object: ", Dataloader::locale_names[locale]);
- return false;
- }
+ ERR_FAIL_NULL_V_MSG(
+ translation, false, vformat("Failed to get translation object: %s", Dataloader::locale_names[locale])
+ );
}
const StringName godot_key = Utilities::std_view_to_godot_string_name(key);
const StringName godot_localisation = Utilities::std_view_to_godot_string_name(localisation);