diff --git a/openrct2.vcxproj b/openrct2.vcxproj
index 99c831daf7..2e3bfde9eb 100644
--- a/openrct2.vcxproj
+++ b/openrct2.vcxproj
@@ -102,6 +102,7 @@
+
diff --git a/src/localisation/format_codes.c b/src/localisation/format_codes.c
new file mode 100644
index 0000000000..640bdf6890
--- /dev/null
+++ b/src/localisation/format_codes.c
@@ -0,0 +1,142 @@
+#pragma region Copyright (c) 2014-2016 OpenRCT2 Developers
+/*****************************************************************************
+ * OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
+ *
+ * OpenRCT2 is the work of many authors, a full list can be found in contributors.md
+ * For more information, visit https://github.com/OpenRCT2/OpenRCT2
+ *
+ * OpenRCT2 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * A full copy of the GNU General Public License can be found in licence.txt
+ *****************************************************************************/
+#pragma endregion
+
+#include "../common.h"
+#include "format_codes.h"
+#include "localisation.h"
+
+#pragma region Format codes
+
+typedef struct format_code_token {
+ uint32 code;
+ const char *token;
+} format_code_token;
+
+format_code_token format_code_tokens[] = {
+ { FORMAT_MOVE_X, "MOVE_X" },
+ { FORMAT_ADJUST_PALETTE, "ADJUST_PALETTE" },
+ { FORMAT_NEWLINE, "NEWLINE" },
+ { FORMAT_NEWLINE_SMALLER, "NEWLINE_SMALLER" },
+ { FORMAT_TINYFONT, "TINYFONT" },
+ { FORMAT_BIGFONT, "BIGFONT" },
+ { FORMAT_MEDIUMFONT, "MEDIUMFONT" },
+ { FORMAT_SMALLFONT, "SMALLFONT" },
+ { FORMAT_OUTLINE, "OUTLINE" },
+ { FORMAT_OUTLINE_OFF, "OUTLINE_OFF" },
+ { FORMAT_WINDOW_COLOUR_1, "WINDOW_COLOUR_1" },
+ { FORMAT_WINDOW_COLOUR_2, "WINDOW_COLOUR_2" },
+ { FORMAT_WINDOW_COLOUR_3, "WINDOW_COLOUR_3" },
+ { FORMAT_NEWLINE_X_Y, "NEWLINE_X_Y" },
+ { FORMAT_INLINE_SPRITE, "INLINE_SPRITE" },
+ { FORMAT_ENDQUOTES, "ENDQUOTES" },
+ { FORMAT_COMMA32, "COMMA32" },
+ { FORMAT_INT32, "INT32" },
+ { FORMAT_COMMA2DP32, "COMMA2DP32" },
+ { FORMAT_COMMA16, "COMMA16" },
+ { FORMAT_UINT16, "UINT16" },
+ { FORMAT_CURRENCY2DP, "CURRENCY2DP" },
+ { FORMAT_CURRENCY, "CURRENCY" },
+ { FORMAT_STRINGID, "STRINGID" },
+ { FORMAT_STRINGID2, "STRINGID2" },
+ { FORMAT_STRING, "STRING" },
+ { FORMAT_MONTHYEAR, "MONTHYEAR" },
+ { FORMAT_MONTH, "MONTH" },
+ { FORMAT_VELOCITY, "VELOCITY" },
+ { FORMAT_POP16, "POP16" },
+ { FORMAT_PUSH16, "PUSH16" },
+ { FORMAT_DURATION, "DURATION" },
+ { FORMAT_REALTIME, "REALTIME" },
+ { FORMAT_LENGTH, "LENGTH" },
+ { FORMAT_SPRITE, "SPRITE" },
+ { FORMAT_BLACK, "BLACK" },
+ { FORMAT_GREY, "GREY" },
+ { FORMAT_WHITE, "WHITE" },
+ { FORMAT_RED, "RED" },
+ { FORMAT_GREEN, "GREEN" },
+ { FORMAT_YELLOW, "YELLOW" },
+ { FORMAT_TOPAZ, "TOPAZ" },
+ { FORMAT_CELADON, "CELADON" },
+ { FORMAT_BABYBLUE, "BABYBLUE" },
+ { FORMAT_PALELAVENDER, "PALELAVENDER" },
+ { FORMAT_PALEGOLD, "PALEGOLD" },
+ { FORMAT_LIGHTPINK, "LIGHTPINK" },
+ { FORMAT_PEARLAQUA, "PEARLAQUA" },
+ { FORMAT_PALESILVER, "PALESILVER" },
+ { FORMAT_AMINUSCULE, "AMINUSCULE" },
+ { FORMAT_UP, "UP" },
+ { FORMAT_POUND, "POUND" },
+ { FORMAT_YEN, "YEN" },
+ { FORMAT_COPYRIGHT, "COPYRIGHT" },
+ { FORMAT_DOWN, "DOWN" },
+ { FORMAT_LEFTGUILLEMET, "LEFTGUILLEMET" },
+ { FORMAT_TICK, "TICK" },
+ { FORMAT_CROSS, "CROSS" },
+ { FORMAT_RIGHT, "RIGHT" },
+ { FORMAT_DEGREE, "DEGREE" },
+ { FORMAT_SQUARED, "SQUARED" },
+ { FORMAT_OPENQUOTES, "OPENQUOTES" },
+ { FORMAT_EURO, "EURO" },
+ { FORMAT_APPROX, "APPROX" },
+ { FORMAT_POWERNEGATIVEONE, "POWERNEGATIVEONE" },
+ { FORMAT_BULLET, "BULLET" },
+ { FORMAT_RIGHTGUILLEMET, "RIGHTGUILLEMET" },
+ { FORMAT_SMALLUP, "SMALLUP" },
+ { FORMAT_SMALLDOWN, "SMALLDOWN" },
+ { FORMAT_LEFT, "LEFT" },
+ { FORMAT_INVERTEDQUESTION, "INVERTEDQUESTION" },
+ { FORMAT_COMMA1DP16, "COMMA1DP16" }
+};
+
+uint32 format_get_code(const char *token)
+{
+ int i;
+ for (i = 0; i < countof(format_code_tokens); i++)
+ if (_strcmpi(token, format_code_tokens[i].token) == 0)
+ return format_code_tokens[i].code;
+ return 0;
+}
+
+const char *format_get_token(uint32 code)
+{
+ int i;
+ for (i = 0; i < countof(format_code_tokens); i++)
+ if (code == format_code_tokens[i].code)
+ return format_code_tokens[i].token;
+ return 0;
+}
+
+bool utf8_should_use_sprite_for_codepoint(int codepoint)
+{
+ switch (codepoint) {
+ case FORMAT_UP:
+ case FORMAT_DOWN:
+ case FORMAT_LEFTGUILLEMET:
+ case FORMAT_TICK:
+ case FORMAT_CROSS:
+ case FORMAT_RIGHT:
+ case FORMAT_RIGHTGUILLEMET:
+ case FORMAT_SMALLUP:
+ case FORMAT_SMALLDOWN:
+ case FORMAT_LEFT:
+ case FORMAT_OPENQUOTES:
+ case FORMAT_ENDQUOTES:
+ return true;
+ default:
+ return false;
+ }
+}
+
+#pragma endregion
diff --git a/src/localisation/localisation.c b/src/localisation/localisation.c
index d6bf46fb2f..e5c53a912a 100644
--- a/src/localisation/localisation.c
+++ b/src/localisation/localisation.c
@@ -323,129 +323,6 @@ const rct_string_id DateGameShortMonthNames[MONTH_COUNT] = {
STR_MONTH_SHORT_OCT,
};
-#pragma region Format codes
-
-typedef struct format_code_token {
- uint32 code;
- const char *token;
-} format_code_token;
-
-format_code_token format_code_tokens[] = {
- { FORMAT_MOVE_X, "MOVE_X" },
- { FORMAT_ADJUST_PALETTE, "ADJUST_PALETTE" },
- { FORMAT_NEWLINE, "NEWLINE" },
- { FORMAT_NEWLINE_SMALLER, "NEWLINE_SMALLER" },
- { FORMAT_TINYFONT, "TINYFONT" },
- { FORMAT_BIGFONT, "BIGFONT" },
- { FORMAT_MEDIUMFONT, "MEDIUMFONT" },
- { FORMAT_SMALLFONT, "SMALLFONT" },
- { FORMAT_OUTLINE, "OUTLINE" },
- { FORMAT_OUTLINE_OFF, "OUTLINE_OFF" },
- { FORMAT_WINDOW_COLOUR_1, "WINDOW_COLOUR_1" },
- { FORMAT_WINDOW_COLOUR_2, "WINDOW_COLOUR_2" },
- { FORMAT_WINDOW_COLOUR_3, "WINDOW_COLOUR_3" },
- { FORMAT_NEWLINE_X_Y, "NEWLINE_X_Y" },
- { FORMAT_INLINE_SPRITE, "INLINE_SPRITE" },
- { FORMAT_ENDQUOTES, "ENDQUOTES" },
- { FORMAT_COMMA32, "COMMA32" },
- { FORMAT_INT32, "INT32" },
- { FORMAT_COMMA2DP32, "COMMA2DP32" },
- { FORMAT_COMMA16, "COMMA16" },
- { FORMAT_UINT16, "UINT16" },
- { FORMAT_CURRENCY2DP, "CURRENCY2DP" },
- { FORMAT_CURRENCY, "CURRENCY" },
- { FORMAT_STRINGID, "STRINGID" },
- { FORMAT_STRINGID2, "STRINGID2" },
- { FORMAT_STRING, "STRING" },
- { FORMAT_MONTHYEAR, "MONTHYEAR" },
- { FORMAT_MONTH, "MONTH" },
- { FORMAT_VELOCITY, "VELOCITY" },
- { FORMAT_POP16, "POP16" },
- { FORMAT_PUSH16, "PUSH16" },
- { FORMAT_DURATION, "DURATION" },
- { FORMAT_REALTIME, "REALTIME" },
- { FORMAT_LENGTH, "LENGTH" },
- { FORMAT_SPRITE, "SPRITE" },
- { FORMAT_BLACK, "BLACK" },
- { FORMAT_GREY, "GREY" },
- { FORMAT_WHITE, "WHITE" },
- { FORMAT_RED, "RED" },
- { FORMAT_GREEN, "GREEN" },
- { FORMAT_YELLOW, "YELLOW" },
- { FORMAT_TOPAZ, "TOPAZ" },
- { FORMAT_CELADON, "CELADON" },
- { FORMAT_BABYBLUE, "BABYBLUE" },
- { FORMAT_PALELAVENDER, "PALELAVENDER" },
- { FORMAT_PALEGOLD, "PALEGOLD" },
- { FORMAT_LIGHTPINK, "LIGHTPINK" },
- { FORMAT_PEARLAQUA, "PEARLAQUA" },
- { FORMAT_PALESILVER, "PALESILVER" },
- { FORMAT_AMINUSCULE, "AMINUSCULE" },
- { FORMAT_UP, "UP" },
- { FORMAT_POUND, "POUND" },
- { FORMAT_YEN, "YEN" },
- { FORMAT_COPYRIGHT, "COPYRIGHT" },
- { FORMAT_DOWN, "DOWN" },
- { FORMAT_LEFTGUILLEMET, "LEFTGUILLEMET" },
- { FORMAT_TICK, "TICK" },
- { FORMAT_CROSS, "CROSS" },
- { FORMAT_RIGHT, "RIGHT" },
- { FORMAT_DEGREE, "DEGREE" },
- { FORMAT_SQUARED, "SQUARED" },
- { FORMAT_OPENQUOTES, "OPENQUOTES" },
- { FORMAT_EURO, "EURO" },
- { FORMAT_APPROX, "APPROX" },
- { FORMAT_POWERNEGATIVEONE, "POWERNEGATIVEONE" },
- { FORMAT_BULLET, "BULLET" },
- { FORMAT_RIGHTGUILLEMET, "RIGHTGUILLEMET" },
- { FORMAT_SMALLUP, "SMALLUP" },
- { FORMAT_SMALLDOWN, "SMALLDOWN" },
- { FORMAT_LEFT, "LEFT" },
- { FORMAT_INVERTEDQUESTION, "INVERTEDQUESTION" },
- { FORMAT_COMMA1DP16, "COMMA1DP16" }
-};
-
-uint32 format_get_code(const char *token)
-{
- int i;
- for (i = 0; i < countof(format_code_tokens); i++)
- if (_strcmpi(token, format_code_tokens[i].token) == 0)
- return format_code_tokens[i].code;
- return 0;
-}
-
-const char *format_get_token(uint32 code)
-{
- int i;
- for (i = 0; i < countof(format_code_tokens); i++)
- if (code == format_code_tokens[i].code)
- return format_code_tokens[i].token;
- return 0;
-}
-
-bool utf8_should_use_sprite_for_codepoint(int codepoint)
-{
- switch (codepoint) {
- case FORMAT_UP:
- case FORMAT_DOWN:
- case FORMAT_LEFTGUILLEMET:
- case FORMAT_TICK:
- case FORMAT_CROSS:
- case FORMAT_RIGHT:
- case FORMAT_RIGHTGUILLEMET:
- case FORMAT_SMALLUP:
- case FORMAT_SMALLDOWN:
- case FORMAT_LEFT:
- case FORMAT_OPENQUOTES:
- case FORMAT_ENDQUOTES:
- return true;
- default:
- return false;
- }
-}
-
-#pragma endregion
-
#define format_push_char_safe(C) { *(*dest)++ = (C); --(*size); }
#define format_handle_overflow(X) if ((*size) <= (X)) { *(*dest) = '\0'; (*size) = 0; return; }
#define format_push_char(C) { format_handle_overflow(1); format_push_char_safe(C); }