diff --git a/newgrf.c b/newgrf.c index 53224f5332..101025d299 100644 --- a/newgrf.c +++ b/newgrf.c @@ -1961,13 +1961,17 @@ static void FeatureNewName(byte *buf, int len) uint16 endid; const char* name; bool new_scheme = _cur_grffile->grf_version >= 7; + bool generic; check_length(len, 6, "FeatureNewName"); buf++; feature = grf_load_byte(&buf); lang = grf_load_byte(&buf); num = grf_load_byte(&buf); - id = (lang & 0x80) ? grf_load_word(&buf) : grf_load_byte(&buf); + generic = HASBIT(lang, 7); + id = generic ? grf_load_word(&buf) : grf_load_byte(&buf); + + CLRBIT(lang, 7); if (feature <= GSF_AIRCRAFT && id < _vehcounts[feature]) { id += _vehshifts[feature]; @@ -1978,7 +1982,8 @@ static void FeatureNewName(byte *buf, int len) id, endid, feature, lang); name = (const char*)buf; /*transfer read value*/ - len -= (lang & 0x80) ? 6 : 5; + len -= generic ? 6 : 5; + for (; id < endid && len > 0; id++) { size_t ofs = strlen(name) + 1; diff --git a/newgrf_text.c b/newgrf_text.c index 884e12ee4a..09a9706577 100644 --- a/newgrf_text.c +++ b/newgrf_text.c @@ -233,7 +233,7 @@ StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid_to_add, bool ne newtext = malloc(sizeof(*newtext) + strlen(text_to_add) + 1); newtext->next = NULL; - newtext->langid = GB(langid_to_add, 0, 6); + newtext->langid = langid_to_add; strcpy(newtext->text, text_to_add); TranslateTTDPatchCodes(newtext->text); @@ -252,7 +252,7 @@ StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid_to_add, bool ne /* Loop through all languages and see if we can replace a string */ for (ptext = &_grf_text[id].textholder; (text = *ptext) != NULL; ptext = &text->next) { - if (text->langid != GB(langid_to_add, 0, 6)) continue; + if (text->langid != langid_to_add) continue; newtext->next = text->next; *ptext = newtext; free(text); @@ -310,7 +310,7 @@ char *GetGRFString(char *buff, uint16 stringid, const char* last) /* If the current string is English or American, set it as the * fallback language if the specific language isn't available. */ - if (search_text->langid == GRFLX_ENGLISH || search_text->langid == GRFLX_AMERICAN) { + if (search_text->langid == GRFLX_UNSPECIFIED || (default_text == NULL && (search_text->langid == GRFLX_ENGLISH || search_text->langid == GRFLX_AMERICAN))) { default_text = search_text; } }