diff --git a/src/lang/extra/english.txt b/src/lang/extra/english.txt index 0acf511f4b..3b3b272b5d 100644 --- a/src/lang/extra/english.txt +++ b/src/lang/extra/english.txt @@ -54,6 +54,27 @@ STR_ORDER_CONDITIONAL_DISPATCH_SLOT :Dispatch slot ##after STR_ORDER_STOP_LOCATION_FAR_END STR_ORDER_STOP_LOCATION_THROUGH :[through load] +##before STR_VIEWPORT_TOWN_POP +STR_VIEWPORT_TOWN_POP_VERY_POOR_RATING :{WHITE}{TOWN} {RED}({COMMA}) +STR_VIEWPORT_TOWN_POP_MEDIOCRE_RATING :{WHITE}{TOWN} {ORANGE}({COMMA}) +STR_VIEWPORT_TOWN_POP_GOOD_RATING :{WHITE}{TOWN} {YELLOW}({COMMA}) +##after STR_VIEWPORT_TOWN_POP +STR_VIEWPORT_TOWN_POP_EXCELLENT_RATING :{WHITE}{TOWN} {GREEN}({COMMA}) + +##before STR_VIEWPORT_TOWN +STR_VIEWPORT_TOWN_VERY_POOR_RATING :{RED}{TOWN} +STR_VIEWPORT_TOWN_MEDIOCRE_RATING :{ORANGE}{TOWN} +STR_VIEWPORT_TOWN_GOOD_RATING :{YELLOW}{TOWN} +##after STR_VIEWPORT_TOWN +STR_VIEWPORT_TOWN_EXCELLENT_RATING :{GREEN}{TOWN} + +##before STR_VIEWPORT_TOWN_TINY_WHITE +STR_VIEWPORT_TOWN_TINY_VERY_POOR_RATING :{TINY_FONT}{RED}{TOWN} +STR_VIEWPORT_TOWN_TINY_MEDIOCRE_RATING :{TINY_FONT}{ORANGE}{TOWN} +STR_VIEWPORT_TOWN_TINY_GOOD_RATING :{TINY_FONT}{YELLOW}{TOWN} +##after STR_VIEWPORT_TOWN_TINY_WHITE +STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GREEN}{TOWN} + ##end-after STR_UNIT_NAME_VELOCITY_IMPERIAL :mph @@ -1760,20 +1781,6 @@ STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_IMPLICIT :{GRAY}IM STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_DEPOT :{RED}DE STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_OVERFLOW :{RED}{NUM}x -STR_VIEWPORT_TOWN_POP_VERY_POOR_RATING :{WHITE}{TOWN} {RED}({COMMA}) -STR_VIEWPORT_TOWN_POP_MEDIOCRE_RATING :{WHITE}{TOWN} {ORANGE}({COMMA}) -STR_VIEWPORT_TOWN_POP_GOOD_RATING :{WHITE}{TOWN} {YELLOW}({COMMA}) -STR_VIEWPORT_TOWN_POP_EXCELLENT_RATING :{WHITE}{TOWN} {GREEN}({COMMA}) -STR_VIEWPORT_TOWN_VERY_POOR_RATING :{RED}{TOWN} -STR_VIEWPORT_TOWN_MEDIOCRE_RATING :{ORANGE}{TOWN} -STR_VIEWPORT_TOWN_GOOD_RATING :{YELLOW}{TOWN} -STR_VIEWPORT_TOWN_EXCELLENT_RATING :{GREEN}{TOWN} - -STR_VIEWPORT_TOWN_TINY_VERY_POOR_RATING :{TINY_FONT}{RED}{TOWN} -STR_VIEWPORT_TOWN_TINY_MEDIOCRE_RATING :{TINY_FONT}{ORANGE}{TOWN} -STR_VIEWPORT_TOWN_TINY_GOOD_RATING :{TINY_FONT}{YELLOW}{TOWN} -STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GREEN}{TOWN} - STR_JUST_DECIMAL :{DECIMAL} STR_JUST_DECIMAL1 :{DECIMAL1} diff --git a/src/lang/extra/galician.txt b/src/lang/extra/galician.txt index 6ef8209fb1..1006f790c9 100644 --- a/src/lang/extra/galician.txt +++ b/src/lang/extra/galician.txt @@ -28,6 +28,21 @@ STR_ORDER_CONDITIONAL_DISPATCH_SLOT :Slot de despach STR_ORDER_STOP_LOCATION_THROUGH :[a través da carga] +STR_VIEWPORT_TOWN_POP_VERY_POOR_RATING :{WHITE}{TOWN} {RED}({COMMA}) +STR_VIEWPORT_TOWN_POP_MEDIOCRE_RATING :{WHITE}{TOWN} {ORANGE}({COMMA}) +STR_VIEWPORT_TOWN_POP_GOOD_RATING :{WHITE}{TOWN} {YELLOW}({COMMA}) +STR_VIEWPORT_TOWN_POP_EXCELLENT_RATING :{WHITE}{TOWN} {GREEN}({COMMA}) + +STR_VIEWPORT_TOWN_VERY_POOR_RATING :{RED}{TOWN} +STR_VIEWPORT_TOWN_MEDIOCRE_RATING :{ORANGE}{TOWN} +STR_VIEWPORT_TOWN_GOOD_RATING :{YELLOW}{TOWN} +STR_VIEWPORT_TOWN_EXCELLENT_RATING :{GREEN}{TOWN} + +STR_VIEWPORT_TOWN_TINY_VERY_POOR_RATING :{TINY_FONT}{RED}{TOWN} +STR_VIEWPORT_TOWN_TINY_MEDIOCRE_RATING :{TINY_FONT}{ORANGE}{TOWN} +STR_VIEWPORT_TOWN_TINY_GOOD_RATING :{TINY_FONT}{YELLOW}{TOWN} +STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GREEN}{TOWN} + STR_UNIT_NAME_VELOCITY_IMPERIAL :mph STR_UNIT_NAME_VELOCITY_METRIC :km/h STR_UNIT_NAME_VELOCITY_SI :m/s @@ -1610,6 +1625,7 @@ STR_CARGO_TYPE_ORDERS_SET_TO_ALL_LABEL :{BLACK}Fixar to STR_CARGO_TYPE_ORDERS_SET_TO_ALL_TOOLTIP :{BLACK}Fixar todas as ordes de tipo de cargamento o que está seleccionado no despregable. STR_SCREENSHOT_WORLD_SCREENSHOT_CURRENT_ZOOM :{BLACK}Captura de pantalla de todo o mapa co zoom actual + STR_SCREENSHOT_TOPOGRAPHY_SCREENSHOT :{BLACK}Captura de pantalla topográfica STR_SCREENSHOT_INDUSTRY_SCREENSHOT :{BLACK}Captura de pantalla de industrias @@ -1720,20 +1736,6 @@ STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_IMPLICIT :{GRAY}IM STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_DEPOT :{RED}DE STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_OVERFLOW :{RED}{NUM}x -STR_VIEWPORT_TOWN_POP_VERY_POOR_RATING :{WHITE}{TOWN} {RED}({COMMA}) -STR_VIEWPORT_TOWN_POP_MEDIOCRE_RATING :{WHITE}{TOWN} {ORANGE}({COMMA}) -STR_VIEWPORT_TOWN_POP_GOOD_RATING :{WHITE}{TOWN} {YELLOW}({COMMA}) -STR_VIEWPORT_TOWN_POP_EXCELLENT_RATING :{WHITE}{TOWN} {GREEN}({COMMA}) -STR_VIEWPORT_TOWN_VERY_POOR_RATING :{RED}{TOWN} -STR_VIEWPORT_TOWN_MEDIOCRE_RATING :{ORANGE}{TOWN} -STR_VIEWPORT_TOWN_GOOD_RATING :{YELLOW}{TOWN} -STR_VIEWPORT_TOWN_EXCELLENT_RATING :{GREEN}{TOWN} - -STR_VIEWPORT_TOWN_TINY_VERY_POOR_RATING :{TINY_FONT}{RED}{TOWN} -STR_VIEWPORT_TOWN_TINY_MEDIOCRE_RATING :{TINY_FONT}{ORANGE}{TOWN} -STR_VIEWPORT_TOWN_TINY_GOOD_RATING :{TINY_FONT}{YELLOW}{TOWN} -STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GREEN}{TOWN} - STR_JUST_DECIMAL :{DECIMAL} STR_JUST_DECIMAL1 :{DECIMAL1} diff --git a/src/lang/extra/german.txt b/src/lang/extra/german.txt index 29798bdfa3..63b1019fa1 100644 --- a/src/lang/extra/german.txt +++ b/src/lang/extra/german.txt @@ -28,6 +28,21 @@ STR_ORDER_CONDITIONAL_DISPATCH_SLOT :Abfahrztszeitfe STR_ORDER_STOP_LOCATION_THROUGH :[durchgehendes Laden] +STR_VIEWPORT_TOWN_POP_VERY_POOR_RATING :{WHITE}{TOWN} {RED}({COMMA}) +STR_VIEWPORT_TOWN_POP_MEDIOCRE_RATING :{WHITE}{TOWN} {ORANGE}({COMMA}) +STR_VIEWPORT_TOWN_POP_GOOD_RATING :{WHITE}{TOWN} {YELLOW}({COMMA}) +STR_VIEWPORT_TOWN_POP_EXCELLENT_RATING :{WHITE}{TOWN} {GREEN}({COMMA}) + +STR_VIEWPORT_TOWN_VERY_POOR_RATING :{RED}{TOWN} +STR_VIEWPORT_TOWN_MEDIOCRE_RATING :{ORANGE}{TOWN} +STR_VIEWPORT_TOWN_GOOD_RATING :{YELLOW}{TOWN} +STR_VIEWPORT_TOWN_EXCELLENT_RATING :{GREEN}{TOWN} + +STR_VIEWPORT_TOWN_TINY_VERY_POOR_RATING :{TINY_FONT}{RED}{TOWN} +STR_VIEWPORT_TOWN_TINY_MEDIOCRE_RATING :{TINY_FONT}{ORANGE}{TOWN} +STR_VIEWPORT_TOWN_TINY_GOOD_RATING :{TINY_FONT}{YELLOW}{TOWN} +STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GREEN}{TOWN} + STR_UNIT_NAME_VELOCITY_IMPERIAL :mph STR_UNIT_NAME_VELOCITY_METRIC :km/h STR_UNIT_NAME_VELOCITY_SI :m/s @@ -1522,6 +1537,7 @@ STR_CARGO_TYPE_ORDERS_SET_TO_ALL_LABEL :{BLACK}Setze al STR_CARGO_TYPE_ORDERS_SET_TO_ALL_TOOLTIP :{BLACK}Lege für alle Frachttypaufträge das hier gewählten Verhalten fest STR_SCREENSHOT_WORLD_SCREENSHOT_CURRENT_ZOOM :{BLACK}Screenshot des ganzen Spielfeldes auf der gegenwärtigen Zoomstufe + STR_SCREENSHOT_TOPOGRAPHY_SCREENSHOT :{BLACK}Topographischer Screenshot STR_SCREENSHOT_INDUSTRY_SCREENSHOT :{BLACK}Industrie-Screenshot @@ -1630,20 +1646,6 @@ STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_IMPLICIT :{GRAY}IM STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_DEPOT :{RED}DE STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_OVERFLOW :{RED}{NUM}x -STR_VIEWPORT_TOWN_POP_VERY_POOR_RATING :{WHITE}{TOWN} {RED}({COMMA}) -STR_VIEWPORT_TOWN_POP_MEDIOCRE_RATING :{WHITE}{TOWN} {ORANGE}({COMMA}) -STR_VIEWPORT_TOWN_POP_GOOD_RATING :{WHITE}{TOWN} {YELLOW}({COMMA}) -STR_VIEWPORT_TOWN_POP_EXCELLENT_RATING :{WHITE}{TOWN} {GREEN}({COMMA}) -STR_VIEWPORT_TOWN_VERY_POOR_RATING :{RED}{TOWN} -STR_VIEWPORT_TOWN_MEDIOCRE_RATING :{ORANGE}{TOWN} -STR_VIEWPORT_TOWN_GOOD_RATING :{YELLOW}{TOWN} -STR_VIEWPORT_TOWN_EXCELLENT_RATING :{GREEN}{TOWN} - -STR_VIEWPORT_TOWN_TINY_VERY_POOR_RATING :{TINY_FONT}{RED}{TOWN} -STR_VIEWPORT_TOWN_TINY_MEDIOCRE_RATING :{TINY_FONT}{ORANGE}{TOWN} -STR_VIEWPORT_TOWN_TINY_GOOD_RATING :{TINY_FONT}{YELLOW}{TOWN} -STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GREEN}{TOWN} - STR_JUST_DECIMAL :{DECIMAL} STR_JUST_DECIMAL1 :{DECIMAL1} diff --git a/src/lang/extra/korean.txt b/src/lang/extra/korean.txt index 12b301d2b1..e530e7f20b 100644 --- a/src/lang/extra/korean.txt +++ b/src/lang/extra/korean.txt @@ -28,6 +28,21 @@ STR_ORDER_CONDITIONAL_DISPATCH_SLOT :{G=m}배차일 STR_ORDER_STOP_LOCATION_THROUGH :[차례로 나눠 싣기] +STR_VIEWPORT_TOWN_POP_VERY_POOR_RATING :{WHITE}{TOWN} {RED}({COMMA}) +STR_VIEWPORT_TOWN_POP_MEDIOCRE_RATING :{WHITE}{TOWN} {ORANGE}({COMMA}) +STR_VIEWPORT_TOWN_POP_GOOD_RATING :{WHITE}{TOWN} {YELLOW}({COMMA}) +STR_VIEWPORT_TOWN_POP_EXCELLENT_RATING :{WHITE}{TOWN} {GREEN}({COMMA}) + +STR_VIEWPORT_TOWN_VERY_POOR_RATING :{RED}{TOWN} +STR_VIEWPORT_TOWN_MEDIOCRE_RATING :{ORANGE}{TOWN} +STR_VIEWPORT_TOWN_GOOD_RATING :{YELLOW}{TOWN} +STR_VIEWPORT_TOWN_EXCELLENT_RATING :{GREEN}{TOWN} + +STR_VIEWPORT_TOWN_TINY_VERY_POOR_RATING :{TINY_FONT}{RED}{TOWN} +STR_VIEWPORT_TOWN_TINY_MEDIOCRE_RATING :{TINY_FONT}{ORANGE}{TOWN} +STR_VIEWPORT_TOWN_TINY_GOOD_RATING :{TINY_FONT}{YELLOW}{TOWN} +STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GREEN}{TOWN} + STR_UNIT_NAME_VELOCITY_IMPERIAL :mph STR_UNIT_NAME_VELOCITY_METRIC :km/h STR_UNIT_NAME_VELOCITY_SI :m/s @@ -1727,20 +1742,6 @@ STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_IMPLICIT :{GRAY}암 STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_DEPOT :{RED}기 STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_OVERFLOW :{RED}{NUM}x -STR_VIEWPORT_TOWN_POP_VERY_POOR_RATING :{WHITE}{TOWN} {RED}({COMMA}) -STR_VIEWPORT_TOWN_POP_MEDIOCRE_RATING :{WHITE}{TOWN} {ORANGE}({COMMA}) -STR_VIEWPORT_TOWN_POP_GOOD_RATING :{WHITE}{TOWN} {YELLOW}({COMMA}) -STR_VIEWPORT_TOWN_POP_EXCELLENT_RATING :{WHITE}{TOWN} {GREEN}({COMMA}) -STR_VIEWPORT_TOWN_VERY_POOR_RATING :{RED}{TOWN} -STR_VIEWPORT_TOWN_MEDIOCRE_RATING :{ORANGE}{TOWN} -STR_VIEWPORT_TOWN_GOOD_RATING :{YELLOW}{TOWN} -STR_VIEWPORT_TOWN_EXCELLENT_RATING :{GREEN}{TOWN} - -STR_VIEWPORT_TOWN_TINY_VERY_POOR_RATING :{TINY_FONT}{RED}{TOWN} -STR_VIEWPORT_TOWN_TINY_MEDIOCRE_RATING :{TINY_FONT}{ORANGE}{TOWN} -STR_VIEWPORT_TOWN_TINY_GOOD_RATING :{TINY_FONT}{YELLOW}{TOWN} -STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GREEN}{TOWN} - STR_JUST_DECIMAL :{DECIMAL} STR_JUST_DECIMAL1 :{DECIMAL1} diff --git a/src/lang/extra/simplified_chinese.txt b/src/lang/extra/simplified_chinese.txt index df0ad40557..18ce75a72f 100644 --- a/src/lang/extra/simplified_chinese.txt +++ b/src/lang/extra/simplified_chinese.txt @@ -28,6 +28,21 @@ STR_ORDER_CONDITIONAL_DISPATCH_SLOT :调度条目 STR_ORDER_STOP_LOCATION_THROUGH :[通过式装载] +STR_VIEWPORT_TOWN_POP_VERY_POOR_RATING :{WHITE}{TOWN} {RED}({COMMA}) +STR_VIEWPORT_TOWN_POP_MEDIOCRE_RATING :{WHITE}{TOWN} {ORANGE}({COMMA}) +STR_VIEWPORT_TOWN_POP_GOOD_RATING :{WHITE}{TOWN} {YELLOW}({COMMA}) +STR_VIEWPORT_TOWN_POP_EXCELLENT_RATING :{WHITE}{TOWN} {GREEN}({COMMA}) + +STR_VIEWPORT_TOWN_VERY_POOR_RATING :{RED}{TOWN} +STR_VIEWPORT_TOWN_MEDIOCRE_RATING :{ORANGE}{TOWN} +STR_VIEWPORT_TOWN_GOOD_RATING :{YELLOW}{TOWN} +STR_VIEWPORT_TOWN_EXCELLENT_RATING :{GREEN}{TOWN} + +STR_VIEWPORT_TOWN_TINY_VERY_POOR_RATING :{TINY_FONT}{RED}{TOWN} +STR_VIEWPORT_TOWN_TINY_MEDIOCRE_RATING :{TINY_FONT}{ORANGE}{TOWN} +STR_VIEWPORT_TOWN_TINY_GOOD_RATING :{TINY_FONT}{YELLOW}{TOWN} +STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GREEN}{TOWN} + STR_UNIT_NAME_VELOCITY_IMPERIAL :英里/小时 STR_UNIT_NAME_VELOCITY_METRIC :千米/小时 STR_UNIT_NAME_VELOCITY_SI :米/秒 @@ -1605,6 +1620,7 @@ STR_CARGO_TYPE_ORDERS_SET_TO_ALL_LABEL :{BLACK}设置 STR_CARGO_TYPE_ORDERS_SET_TO_ALL_TOOLTIP :{BLACK}设置全部的货物类型顺序到当前所选的 STR_SCREENSHOT_WORLD_SCREENSHOT_CURRENT_ZOOM :{BLACK}以当前缩放比例全地图截图 + STR_SCREENSHOT_TOPOGRAPHY_SCREENSHOT :{BLACK}地形截图 STR_SCREENSHOT_INDUSTRY_SCREENSHOT :{BLACK}工业截图 @@ -1715,20 +1731,6 @@ STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_IMPLICIT :{GRAY}转 STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_DEPOT :{RED}库 STR_VIEWPORT_SHOW_VEHICLE_ROUTE_STEP_OVERFLOW :{RED}{NUM}x -STR_VIEWPORT_TOWN_POP_VERY_POOR_RATING :{WHITE}{TOWN} {RED}({COMMA}) -STR_VIEWPORT_TOWN_POP_MEDIOCRE_RATING :{WHITE}{TOWN} {ORANGE}({COMMA}) -STR_VIEWPORT_TOWN_POP_GOOD_RATING :{WHITE}{TOWN} {YELLOW}({COMMA}) -STR_VIEWPORT_TOWN_POP_EXCELLENT_RATING :{WHITE}{TOWN} {GREEN}({COMMA}) -STR_VIEWPORT_TOWN_VERY_POOR_RATING :{RED}{TOWN} -STR_VIEWPORT_TOWN_MEDIOCRE_RATING :{ORANGE}{TOWN} -STR_VIEWPORT_TOWN_GOOD_RATING :{YELLOW}{TOWN} -STR_VIEWPORT_TOWN_EXCELLENT_RATING :{GREEN}{TOWN} - -STR_VIEWPORT_TOWN_TINY_VERY_POOR_RATING :{TINY_FONT}{RED}{TOWN} -STR_VIEWPORT_TOWN_TINY_MEDIOCRE_RATING :{TINY_FONT}{ORANGE}{TOWN} -STR_VIEWPORT_TOWN_TINY_GOOD_RATING :{TINY_FONT}{YELLOW}{TOWN} -STR_VIEWPORT_TOWN_TINY_EXCELLENT_RATING :{TINY_FONT}{GREEN}{TOWN} - STR_JUST_DECIMAL :{DECIMAL} STR_JUST_DECIMAL1 :{DECIMAL1} diff --git a/src/strgen/strgen.cpp b/src/strgen/strgen.cpp index f713c85483..fb94d840cb 100644 --- a/src/strgen/strgen.cpp +++ b/src/strgen/strgen.cpp @@ -244,6 +244,16 @@ void FileStringReader::HandlePragma(char *str) LangString *ent = this->data.Find(str + 6); if (ent != nullptr) { this->data.insert_after = ent; + this->data.insert_before = nullptr; + } else { + error("Can't find string to insert after: '%s'", str + 6); + } + } else if (!memcmp(str, "before ", 7)) { + if (this->translation) error("Insert before is only allowed in the base translation."); + LangString *ent = this->data.Find(str + 7); + if (ent != nullptr) { + this->data.insert_after = nullptr; + this->data.insert_before = ent; } else { error("Can't find string to insert after: '%s'", str + 6); } diff --git a/src/strgen/strgen.h b/src/strgen/strgen.h index f910047592..06e81afa5a 100644 --- a/src/strgen/strgen.h +++ b/src/strgen/strgen.h @@ -35,7 +35,8 @@ struct LangString { int index; ///< The index in the language file. int line; ///< Line of string in source-file. Case *translated_case; ///< Cases of the translation. - std::unique_ptr chain_next; + std::unique_ptr chain_before; + std::unique_ptr chain_after; LangString *default_translation = nullptr; LangString(const char *name, const char *english, size_t index, int line); @@ -53,6 +54,7 @@ struct StringData { int next_string_id; ///< The next string ID to allocate. std::vector> string_store; + LangString *insert_before = nullptr; LangString *insert_after = nullptr; bool override_mode = false; LangString *default_translation = nullptr; @@ -97,6 +99,8 @@ struct StringReader { * Start parsing the file. */ virtual void ParseFile(); + + void AssignIDs(size_t &next_id, LangString *ls); }; /** Base class for writing the header, i.e. the STR_XXX to numeric value. */ diff --git a/src/strgen/strgen_base.cpp b/src/strgen/strgen_base.cpp index fba697fa11..32d5b37ea3 100644 --- a/src/strgen/strgen_base.cpp +++ b/src/strgen/strgen_base.cpp @@ -773,8 +773,8 @@ void StringReader::HandleString(char *str) return; } - if (this->data.next_string_id >= 0 && this->data.insert_after != nullptr) { - strgen_error("Cannot use insert_after and id at the same time: '%s'", str); + if (this->data.next_string_id >= 0 && (this->data.insert_after != nullptr || this->data.insert_before != nullptr)) { + strgen_error("Cannot use insert_after/insert_before and id at the same time: '%s'", str); } /* Allocate a new LangString */ @@ -789,7 +789,12 @@ void StringReader::HandleString(char *str) if (this->data.insert_after != nullptr) { LangString *cur = ls.get(); - this->data.insert_after->chain_next = std::move(ls); + this->data.insert_after->chain_after = std::move(ls); + this->data.insert_after = cur; + } else if (this->data.insert_before != nullptr) { + LangString *cur = ls.get(); + this->data.insert_before->chain_before = std::move(ls); + this->data.insert_before = nullptr; this->data.insert_after = cur; } else { this->data.string_store.push_back(std::move(ls)); @@ -873,31 +878,37 @@ void StringReader::ParseFile() /* Allocate IDs */ size_t next_id = 0; for (const std::unique_ptr &item : this->data.string_store) { - LangString *ls = item.get(); - do { - if (ls->index >= 0) { - next_id = ls->index; - } else { - ls->index = next_id; - } - - if ((size_t)ls->index >= this->data.max_strings) { - strgen_error("Too many strings, maximum allowed is " PRINTF_SIZE, this->data.max_strings); - return; - } else if (this->data.strings[ls->index] != nullptr) { - strgen_error("String ID 0x%X for '%s' already in use by '%s'", (uint)ls->index, ls->name, this->data.strings[ls->index]->name); - return; - } else { - this->data.strings[ls->index] = ls; - } - - next_id++; - ls = ls->chain_next.get(); - } while (ls != nullptr); + this->AssignIDs(next_id, item.get()); } } } +void StringReader::AssignIDs(size_t &next_id, LangString *ls) +{ + do { + if (ls->chain_before) this->AssignIDs(next_id, ls->chain_before.get()); + + if (ls->index >= 0) { + next_id = ls->index; + } else { + ls->index = next_id; + } + + if ((size_t)ls->index >= this->data.max_strings) { + strgen_error("Too many strings, maximum allowed is " PRINTF_SIZE, this->data.max_strings); + return; + } else if (this->data.strings[ls->index] != nullptr) { + strgen_error("String ID 0x%X for '%s' already in use by '%s'", (uint)ls->index, ls->name, this->data.strings[ls->index]->name); + return; + } else { + this->data.strings[ls->index] = ls; + } + + next_id++; + ls = ls->chain_after.get(); + } while (ls != nullptr); +} + /** * Write the header information. * @param data The data about the string.