summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/newgrf.cpp22
-rw-r--r--src/newgrf_config.cpp7
-rw-r--r--src/newgrf_config.h8
3 files changed, 36 insertions, 1 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 3a2001b71..c5b91b723 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -5931,6 +5931,27 @@ static bool ChangeGRFNumUsedParams(size_t len, ByteReader *buf)
return true;
}
+/** Callback function for 'INFO'->'PALS' to set the number of valid parameters. */
+static bool ChangeGRFPalette(size_t len, ByteReader *buf)
+{
+ if (len != 1) {
+ grfmsg(2, "StaticGRFInfo: expected only 1 byte for 'INFO'->'PALS' but got " PRINTF_SIZE ", ignoring this field", len);
+ buf->Skip(len);
+ } else {
+ char data = buf->ReadByte();
+ switch (data) {
+ case '*':
+ case 'A': _cur_grfconfig->palette |= GRFP_GRF_ANY; break;
+ case 'W': _cur_grfconfig->palette |= GRFP_GRF_WINDOWS; break;
+ case 'D': _cur_grfconfig->palette |= GRFP_GRF_DOS; break;
+ default:
+ grfmsg(2, "StaticGRFInfo: unexpected value '%02x' for 'INFO'->'PALS', ignoring this field", data);
+ break;
+ }
+ }
+ return true;
+}
+
typedef bool (*DataHandler)(size_t, ByteReader *); ///< Type of callback function for binary nodes
typedef bool (*TextHandler)(byte, const char *str); ///< Type of callback function for text nodes
typedef bool (*BranchHandler)(ByteReader *); ///< Type of callback function for branch nodes
@@ -6018,6 +6039,7 @@ AllowedSubtags _tags_info[] = {
AllowedSubtags('NAME', ChangeGRFName),
AllowedSubtags('DESC', ChangeGRFDescription),
AllowedSubtags('NPAR', ChangeGRFNumUsedParams),
+ AllowedSubtags('PALS', ChangeGRFPalette),
AllowedSubtags()
};
diff --git a/src/newgrf_config.cpp b/src/newgrf_config.cpp
index c7a4f01b0..6bdf5117d 100644
--- a/src/newgrf_config.cpp
+++ b/src/newgrf_config.cpp
@@ -92,7 +92,12 @@ const char *GRFConfig::GetDescription() const
*/
void GRFConfig::SetSuitablePalette()
{
- PaletteType pal = _use_palette;
+ PaletteType pal;
+ switch (this->palette & GRFP_GRF_MASK) {
+ case GRFP_GRF_DOS: pal = PAL_DOS; break;
+ case GRFP_GRF_WINDOWS: pal = PAL_WINDOWS; break;
+ default: pal = _use_palette; break;
+ }
SB(this->palette, GRFP_USE_BIT, 1, pal == PAL_WINDOWS ? GRFP_USE_WINDOWS : GRFP_USE_DOS);
}
diff --git a/src/newgrf_config.h b/src/newgrf_config.h
index c9d2079a0..588d8b826 100644
--- a/src/newgrf_config.h
+++ b/src/newgrf_config.h
@@ -52,10 +52,18 @@ enum GRFListCompatibility {
/** Information that can/has to be stored about a GRF's palette. */
enum GRFPalette {
GRFP_USE_BIT = 0, ///< The bit used for storing the palette to use.
+ GRFP_GRF_OFFSET = 2, ///< The offset of the GRFP_GRF data.
+ GRFP_GRF_SIZE = 2, ///< The size of the GRFP_GRF data.
GRFP_USE_DOS = 0x0, ///< The palette state is set to use the DOS palette.
GRFP_USE_WINDOWS = 0x1, ///< The palette state is set to use the Windows palette.
GRFP_USE_MASK = 0x1, ///< Bitmask to get only the use palette use states.
+
+ GRFP_GRF_UNSET = 0x0 << GRFP_GRF_OFFSET, ///< The NewGRF provided no information.
+ GRFP_GRF_DOS = 0x1 << GRFP_GRF_OFFSET, ///< The NewGRF says the DOS palette can be used.
+ GRFP_GRF_WINDOWS = 0x2 << GRFP_GRF_OFFSET, ///< The NewGRF says the Windows palette can be used.
+ GRFP_GRF_ANY = GRFP_GRF_DOS | GRFP_GRF_WINDOWS, ///< The NewGRF says any palette can be used.
+ GRFP_GRF_MASK = GRFP_GRF_ANY, ///< Bitmask to get only the NewGRF supplied information.
};