Files
@ r24498:e9114d9ab04a
Branch filter:
Location: cpp/openttd-patchpack/source/src/newgrf_text.h - annotation
r24498:e9114d9ab04a
4.0 KiB
text/x-c
Fix #6468: don't store version of AIs-started-via-console in name
You can do: "startai myai.3", which starts version 3 of "myai".
This is very useful for testing save/load code between different
versions of your AI.
However, when using this syntax, the AI got saved as "myai.3" as
name of the AI, instead of "myai". This caused several problems,
like indicating to the user the AI could not be found, but still
load the AI. But in all cases, the AI never got the chance to
load the saved data, making the whole reason this exists pointless.
By splitting the name and version already in the console command,
the code becomes simpler and AIs started this way now follow the
normal flow after initialization.
You can do: "startai myai.3", which starts version 3 of "myai".
This is very useful for testing save/load code between different
versions of your AI.
However, when using this syntax, the AI got saved as "myai.3" as
name of the AI, instead of "myai". This caused several problems,
like indicating to the user the AI could not be found, but still
load the AI. But in all cases, the AI never got the chance to
load the saved data, making the whole reason this exists pointless.
By splitting the name and version already in the console command,
the code becomes simpler and AIs started this way now follow the
normal flow after initialization.
r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r10560:8bdfc4b8040a r10560:8bdfc4b8040a r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r5475:3f5cd13d1b63 r16473:ab4ba67dd531 r14248:a9050881acd7 r16474:f9eb86a38244 r18947:4f70a151c5a8 r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r14248:a9050881acd7 r16473:ab4ba67dd531 r16473:ab4ba67dd531 r16473:ab4ba67dd531 r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r18135:506fefd4fc51 r22638:25031cce3180 r24209:155ba259d4af r24209:155ba259d4af r8445:07810e0b20bf r6247:96e840dbefcc r11341:5f61a8391e15 r24211:16bc9477a90c r24209:155ba259d4af r24209:155ba259d4af r24209:155ba259d4af r5475:3f5cd13d1b63 r6873:011bb2269607 r6873:011bb2269607 r24209:155ba259d4af r7616:d6611d4fd004 r7750:5f71f85fde96 r16692:f5d38cba4303 r16692:f5d38cba4303 r16692:f5d38cba4303 r21153:2d47234494cd r7616:d6611d4fd004 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r16474:f9eb86a38244 r23538:8df50944b27a r23538:8df50944b27a r23539:bce8329ee42d r16475:65a52dcc7b07 r16475:65a52dcc7b07 r16477:0f1fcd3c927b r16475:65a52dcc7b07 r16474:f9eb86a38244 r16474:f9eb86a38244 r5475:3f5cd13d1b63 | /*
* This file is part of OpenTTD.
* OpenTTD 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, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file newgrf_text.h Header of Action 04 "universal holder" structure and functions */
#ifndef NEWGRF_TEXT_H
#define NEWGRF_TEXT_H
#include "string_type.h"
#include "strings_type.h"
#include "core/smallvec_type.hpp"
#include "table/control_codes.h"
#include <utility>
#include <vector>
#include <string>
/** This character, the thorn ('รพ'), indicates a unicode string to NFO. */
static const WChar NFO_UTF8_IDENTIFIER = 0x00DE;
/** A GRF text with associated language ID. */
struct GRFText {
byte langid; ///< The language associated with this GRFText.
std::string text; ///< The actual (translated) text.
};
/** A GRF text with a list of translations. */
typedef std::vector<GRFText> GRFTextList;
/** Reference counted wrapper around a GRFText pointer. */
typedef std::shared_ptr<GRFTextList> GRFTextWrapper;
StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid, bool new_scheme, bool allow_newlines, const char *text_to_add, StringID def_string);
StringID GetGRFStringID(uint32 grfid, StringID stringid);
const char *GetGRFStringFromGRFText(const GRFTextList &text_list);
const char *GetGRFStringFromGRFText(const GRFTextWrapper &text);
const char *GetGRFStringPtr(uint16 stringid);
void CleanUpStrings();
void SetCurrentGrfLangID(byte language_id);
std::string TranslateTTDPatchCodes(uint32 grfid, uint8 language_id, bool allow_newlines, const std::string &str, StringControlCode byte80 = SCC_NEWGRF_PRINT_WORD_STRING_ID);
void AddGRFTextToList(GRFTextList &list, byte langid, uint32 grfid, bool allow_newlines, const char *text_to_add);
void AddGRFTextToList(GRFTextWrapper &list, byte langid, uint32 grfid, bool allow_newlines, const char *text_to_add);
void AddGRFTextToList(GRFTextWrapper &list, const char *text_to_add);
bool CheckGrfLangID(byte lang_id, byte grf_version);
void StartTextRefStackUsage(const struct GRFFile *grffile, byte numEntries, const uint32 *values = nullptr);
void StopTextRefStackUsage();
void RewindTextRefStack();
bool UsingNewGRFTextStack();
struct TextRefStack *CreateTextRefStackBackup();
void RestoreTextRefStackBackup(struct TextRefStack *backup);
uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const char **str, int64 *argv, uint argv_size, bool modify_argv);
/** Mapping of language data between a NewGRF and OpenTTD. */
struct LanguageMap {
/** Mapping between NewGRF and OpenTTD IDs. */
struct Mapping {
byte newgrf_id; ///< NewGRF's internal ID for a case/gender.
byte openttd_id; ///< OpenTTD's internal ID for a case/gender.
};
/* We need a vector and can't use SmallMap due to the fact that for "setting" a
* gender of a string or requesting a case for a substring we want to map from
* the NewGRF's internal ID to OpenTTD's ID whereas for the choice lists we map
* the genders/cases/plural OpenTTD IDs to the NewGRF's internal IDs. In this
* case a NewGRF developer/translator might want a different translation for
* both cases. Thus we are basically implementing a multi-map. */
std::vector<Mapping> gender_map; ///< Mapping of NewGRF and OpenTTD IDs for genders.
std::vector<Mapping> case_map; ///< Mapping of NewGRF and OpenTTD IDs for cases.
int plural_form; ///< The plural form used for this language.
int GetMapping(int newgrf_id, bool gender) const;
int GetReverseMapping(int openttd_id, bool gender) const;
static const LanguageMap *GetLanguageMap(uint32 grfid, uint8 language_id);
};
#endif /* NEWGRF_TEXT_H */
|