Mercurial > hg > openttd
changeset 16485:d10cc518045a draft
(svn r21209) -Feature: [NewGRF] Allow setting the gender of the current string or select the case of the next substring
author | rubidium <rubidium@openttd.org> |
---|---|
date | Tue, 16 Nov 2010 14:00:02 +0000 |
parents | 92174638bc84 |
children | 5213db8704cd |
files | src/newgrf.cpp src/newgrf_text.cpp src/newgrf_text.h |
diffstat | 3 files changed, 46 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -1765,6 +1765,19 @@ return ret; } +/** + * Get the language map associated with a given NewGRF and language. + * @param grfid The NewGRF to get the map for. + * @param language_id The (NewGRF) language ID to get the map for. + * @return the LanguageMap, or NULL if it couldn't be found. + */ +/* static */ const LanguageMap *LanguageMap::GetLanguageMap(uint32 grfid, uint8 language_id) +{ + /* LanguageID "MAX_LANG", i.e. 7F is any. This language can't have a gender/case mapping, but has to be handled gracefully. */ + const GRFFile *grffile = GetFileByGRFID(grfid); + return (grffile != NULL && grffile->language_map != NULL && language_id < MAX_LANG) ? &grffile->language_map[language_id] : NULL; +} + static ChangeInfoResult GlobalVarChangeInfo(uint gvid, int numinfo, int prop, ByteReader *buf) { ChangeInfoResult ret = CIR_SUCCESS;
--- a/src/newgrf_text.cpp +++ b/src/newgrf_text.cpp @@ -25,6 +25,7 @@ #include "string_func.h" #include "date_type.h" #include "debug.h" +#include "language.h" #include "table/strings.h" #include "table/control_codes.h" @@ -216,6 +217,20 @@ static GRFTextEntry _grf_text[(1 << TABSIZE) * 3]; static byte _currentLangID = GRFLX_ENGLISH; ///< by default, english is used. +/** + * Get the mapping from the NewGRF supplied ID to OpenTTD's internal ID. + * @param newgrf_id The NewGRF ID to map. + * @param gender Whether to map genders or cases. + * @return The, to OpenTTD's internal ID, mapped index, or -1 if there is no mapping. + */ +int LanguageMap::GetMapping(int newgrf_id, bool gender) const +{ + const SmallVector<Mapping, 1> &map = gender ? this->gender_map : this->case_map; + for (const Mapping *m = map.Begin(); m != map.End(); m++) { + if (m->newgrf_id == newgrf_id) return m->openttd_id; + } + return -1; +} /** * Translate TTDPatch string codes into something OpenTTD can handle (better). @@ -305,8 +320,9 @@ case 0x96: d += Utf8Encode(d, SCC_GRAY); break; case 0x97: d += Utf8Encode(d, SCC_DKBLUE); break; case 0x98: d += Utf8Encode(d, SCC_BLACK); break; - case 0x9A: - switch (*str++) { + case 0x9A: { + int code = *str++; + switch (code) { case 0x00: // FALL THROUGH case 0x01: d += Utf8Encode(d, SCC_NEWGRF_PRINT_QWORD_CURRENCY); break; /* 0x02: ignore next colour byte is not supported. It works on the final @@ -334,12 +350,24 @@ case 0x0B: d += Utf8Encode(d, SCC_NEWGRF_PRINT_HEX_QWORD); break; case 0x0C: d += Utf8Encode(d, SCC_NEWGRF_PRINT_WORD_STATION_NAME); break; case 0x0D: d += Utf8Encode(d, SCC_NEWGRF_PRINT_WORD_WEIGHT); break; + case 0x0E: + case 0x0F: { + const LanguageMap *lm = LanguageMap::GetLanguageMap(grfid, language_id); + int index = *str++; + int mapped = lm != NULL ? lm->GetMapping(index, code == 0x0E) : -1; + if (mapped >= 0) { + d += Utf8Encode(d, code == 0x0E ? SCC_GENDER_INDEX : SCC_SETCASE); + d += Utf8Encode(d, mapped); + } + break; + } default: grfmsg(1, "missing handler for extended format code"); break; } break; + } case 0x9E: d += Utf8Encode(d, 0x20AC); break; // Euro case 0x9F: d += Utf8Encode(d, 0x0178); break; // Y with diaeresis
--- a/src/newgrf_text.h +++ b/src/newgrf_text.h @@ -59,6 +59,9 @@ * both cases. Thus we are basically implementing a multi-map. */ SmallVector<Mapping, 1> gender_map; ///< Mapping of NewGRF and OpenTTD IDs for genders. SmallVector<Mapping, 1> case_map; ///< Mapping of NewGRF and OpenTTD IDs for cases. + + int GetMapping(int newgrf_id, bool gender) const; + static const LanguageMap *GetLanguageMap(uint32 grfid, uint8 language_id); }; #endif /* NEWGRF_TEXT_H */