diff --git a/Makefile.bundle.in b/Makefile.bundle.in index 08e7a33dc5..7498c347ba 100644 --- a/Makefile.bundle.in +++ b/Makefile.bundle.in @@ -139,6 +139,13 @@ bundle_lzma: bundle $(Q)cd "$(BUNDLES_DIR)/.lzma" && tar --lzma -c$(shell if test -n "$(VERBOSE)"; then echo 'v'; fi)f "$(BUNDLES_DIR)/$(BUNDLE_NAME).tar.lzma" "$(BUNDLE_NAME)" $(Q)rm -rf "$(BUNDLES_DIR)/.lzma" +bundle_xz: bundle + @echo '[BUNDLE] Creating $(BUNDLE_NAME).tar.xz' + $(Q)mkdir -p "$(BUNDLES_DIR)/.xz/$(BUNDLE_NAME)" + $(Q)cp -R "$(BUNDLE_DIR)/"* "$(BUNDLES_DIR)/.xz/$(BUNDLE_NAME)/" + $(Q)cd "$(BUNDLES_DIR)/.xz" && tar --xz -c$(shell if test -n "$(VERBOSE)"; then echo 'v'; fi)f "$(BUNDLES_DIR)/$(BUNDLE_NAME).tar.xz" "$(BUNDLE_NAME)" + $(Q)rm -rf "$(BUNDLES_DIR)/.xz" + bundle_lha: bundle @echo '[BUNDLE] Creating $(BUNDLE_NAME).lha' $(Q)mkdir -p "$(BUNDLES_DIR)/.lha/$(BUNDLE_NAME)" diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index feb694c1ab..f11de77283 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -23,6 +23,7 @@ #include "gfx_func.h" #include "sortlist_type.h" #include "core/geometry_func.hpp" +#include "currency.h" #include "table/strings.h" #include "table/sprites.h" @@ -1234,8 +1235,24 @@ struct PerformanceRatingDetailWindow : Window { /* At this number we are roughly at the max; it can become wider, * but then you need at 1000 times more money. At that time you're - * not that interested anymore in the last few digits anyway. */ - uint max = 999999999; // nine 9s + * not that interested anymore in the last few digits anyway. + * The 500 is because 999 999 500 to 999 999 999 are rounded to + * 1 000 M, and not 999 999 k. Use negative numbers to account for + * the negative income/amount of money etc. as well. */ + int max = -(999999999 - 500); + + /* Scale max for the display currency. Prior to rendering the value + * is converted into the display currency, which may cause it to + * raise significantly. We need to compensate for that since {{CURRCOMPACT}} + * is used, which can produce quite short renderings of very large + * values. Otherwise the calculated width could be too narrow. + * Note that it doesn't work if there was a currency with an exchange + * rate greater than max. + * When the currency rate is more than 1000, the 999 999 k becomes at + * least 999 999 M which roughly is equally long. Furthermore if the + * exchange rate is that high, 999 999 k is usually not enough anymore + * to show the different currency numbers. */ + if (_currency->rate < 1000) max /= _currency->rate; SetDParam(0, max); SetDParam(1, max); uint score_detail_width = GetStringBoundingBox(STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY).width; diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index bad4269c7f..6734765772 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -381,7 +381,7 @@ struct GameOptionsWindow : Window { case GOW_CURRENCY_DROPDOWN: // Currency if (index == CUSTOM_CURRENCY_ID) ShowCustCurrency(); this->opt->locale.currency = index; - MarkWholeScreenDirty(); + ReInitAllWindows(); break; case GOW_DISTANCE_DROPDOWN: // Measuring units diff --git a/src/strings.cpp b/src/strings.cpp index 8a8c167cc8..552e4bfb69 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -333,7 +333,9 @@ static char *FormatGenericCurrency(char *buff, const CurrencySpec *spec, Money n /* for huge numbers, compact the number into k or M */ if (compact) { - if (number >= 1000000000) { + /* Take care of the 'k' rounding. Having 1 000 000 k + * and 1 000 M is inconsistent, so always use 1 000 M. */ + if (number >= 1000000000 - 500) { number = (number + 500000) / 1000000; multiplier = "M"; } else if (number >= 1000000) { @@ -1549,7 +1551,7 @@ static bool FindMissingGlyphs(const char **str) text++; } else if (c == SCC_SETXY) { text += 2; - } else if (IsPrintable(c) && c != '?' && GetGlyph(FS_NORMAL, c) == question_mark) { + } else if (IsPrintable(c) && !IsTextDirectionChar(c) && c != '?' && GetGlyph(FS_NORMAL, c) == question_mark) { /* The character is printable, but not in the normal font. This is the case we were testing for. */ return true; } diff --git a/src/window.cpp b/src/window.cpp index 75681d6ab7..cf25124f22 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1652,6 +1652,11 @@ static bool HandleWindowDragging() if (w->resize.step_width == 0) x = 0; if (w->resize.step_height == 0) y = 0; + /* Check the resize button won't go past the bottom of the screen */ + if (w->top + w->height + y > _screen.height) { + y = _screen.height - w->height - w->top; + } + /* X and Y has to go by step.. calculate it. * The cast to int is necessary else x/y are implicitly casted to * unsigned int, which won't work. */