From 614f69ab47b6451385134332292c2d8e32acfeb2 Mon Sep 17 00:00:00 2001 From: GenevensiS <66968533+G-e-n-e-v-e-n-s-i-S@users.noreply.github.com> Date: Fri, 28 Nov 2025 19:12:33 +0100 Subject: [PATCH] sundry tweaks - prevent infinite loop and warn when a game has no card fields - choice fields are no longer ignored if they have no choices defined - templates can now have the same name as their game folder (no hyphen needed) - indent made by 4 spaces is now considered a tab (but will still produce a warning let's no kid ourselves) --- data/en.mse-locale/locale | 1 + src/data/field/choice.cpp | 5 ++++- src/data/game.cpp | 6 +++++- src/gui/new_window.cpp | 2 +- src/util/io/reader.cpp | 8 ++++---- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/data/en.mse-locale/locale b/data/en.mse-locale/locale index 7239444d..438c6154 100644 --- a/data/en.mse-locale/locale +++ b/data/en.mse-locale/locale @@ -985,6 +985,7 @@ error: images used for blending must have the same size: Images used for blending must have the same size # error from files + no card fields: Game '%s' does not have any card fields. Define at least one card field. no game specified: No game specified for the %s no stylesheet specified for the set: No stylesheet specified for the set stylesheet and set refer to different game: diff --git a/src/data/field/choice.cpp b/src/data/field/choice.cpp index d7d6b409..fb2e88e4 100644 --- a/src/data/field/choice.cpp +++ b/src/data/field/choice.cpp @@ -39,7 +39,10 @@ IMPLEMENT_REFLECTION(ChoiceField) { } void ChoiceField::after_reading(Version ver) { - Field::after_reading(ver); + Field::after_reading(ver); + if (choices->choices.size() < 1) { + choices->choices.push_back(make_intrusive(name)); + } choices->initIds(); } // ----------------------------------------------------------------------------- : ChoiceField::Choice diff --git a/src/data/game.cpp b/src/data/game.cpp index 6b2a9deb..9fb6996b 100644 --- a/src/data/game.cpp +++ b/src/data/game.cpp @@ -66,7 +66,11 @@ IMPLEMENT_REFLECTION(Game) { REFLECT_NO_SCRIPT(auto_replaces); } -void Game::validate(Version v) { +void Game::validate(Version v) { + // check that we have at least one card field + if (card_fields.size() < 1) { + throw Error(_ERROR_1_("no card fields", name())); + } Packaged::validate(v); // automatic statistics dimensions { diff --git a/src/gui/new_window.cpp b/src/gui/new_window.cpp index 1bf76097..13ab7f7f 100644 --- a/src/gui/new_window.cpp +++ b/src/gui/new_window.cpp @@ -78,7 +78,7 @@ void NewSetWindow::onGameSelect(wxCommandEvent&) { GameP game = game_list->getSelection(false); //handle_pending_errors(); // errors are ignored until set window is shown settings.default_game = game->name(); - stylesheet_list->showData(game->name() + _("-*")); + stylesheet_list->showData(game->name() + _("*")); stylesheet_list->select(settings.gameSettingsFor(*game).default_stylesheet); UpdateWindowUI(wxUPDATE_UI_RECURSE); // resize (yuck) diff --git a/src/util/io/reader.cpp b/src/util/io/reader.cpp index caa3b45d..e0bd3298 100644 --- a/src/util/io/reader.cpp +++ b/src/util/io/reader.cpp @@ -208,10 +208,10 @@ void Reader::readLine(bool in_string) { size_t pos = line.find_first_of(_(':'), indent); key = line.substr(indent, pos - indent); if (!ignore_invalid && !in_string && starts_with(key, _(" "))) { - warning(_("key: '") + key + _("' starts with a space; only use TABs for indentation!"), 0, false); - // try to fix up: 8 spaces is a tab - while (starts_with(key, _(" "))) { - key = key.substr(8); + warning(String(_("key: '")) << key << _("' on line number ") << line_number << _(" starts with a space; only use TABs for indentation!"), 0, false); + // try to fix up: 4 spaces is a tab + while (starts_with(key, _(" "))) { + key = key.substr(4); indent += 1; } }