1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Merge pull request #4464 from IntelOrca/refactor/language-pack

Refactor LanguagePack to interface / implementation
This commit is contained in:
Ted John
2016-09-20 19:18:26 +01:00
committed by GitHub
4 changed files with 632 additions and 611 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -16,86 +16,23 @@
#pragma once
#include <string>
#include <vector>
#include "../common.h"
extern "C"
interface ILanguagePack
{
#include "../common.h"
#include "../util/util.h"
#include "localisation.h"
}
virtual ~ILanguagePack() = default;
#include "../core/StringBuilder.hpp"
#include "../core/StringReader.hpp"
virtual uint16 GetId() const abstract;
virtual uint32 GetCount() const abstract;
class LanguagePack final {
public:
static LanguagePack * FromFile(uint16 id, const utf8 * path);
static LanguagePack * FromText(uint16 id, const utf8 * text);
~LanguagePack();
uint16 GetId() const { return _id; }
uint32 GetCount() const { return (uint32)_strings.size(); }
const utf8 * GetString(rct_string_id stringId) const;
void SetString(rct_string_id stringId, const utf8 * str)
{
if (_strings.size() >= (size_t)stringId)
{
_strings[stringId] = str;
}
}
rct_string_id GetObjectOverrideStringId(const char * objectIdentifier, uint8 index);
rct_string_id GetScenarioOverrideStringId(const utf8 * scenarioFilename, uint8 index);
private:
struct ObjectOverride
{
char name[8];
const utf8 * strings[4];
};
struct ScenarioOverride
{
std::string filename;
union {
const utf8 * strings[3];
struct {
const utf8 * name;
const utf8 * park;
const utf8 * details;
};
};
};
uint16 _id;
utf8 * _stringData;
std::vector<const utf8*> _strings;
std::vector<ObjectOverride> _objectOverrides;
std::vector<ScenarioOverride> _scenarioOverrides;
LanguagePack(uint16 id, const utf8 * text);
ObjectOverride * GetObjectOverride(const char * objectIdentifier);
ScenarioOverride * GetScenarioOverride(const utf8 * scenarioFilename);
///////////////////////////////////////////////////////////////////////////
// Parsing
///////////////////////////////////////////////////////////////////////////
StringBuilder _stringDataSB;
utf8 * _currentGroup;
ObjectOverride * _currentObjectOverride;
ScenarioOverride * _currentScenarioOverride;
void ParseLine(IStringReader * reader);
void ParseGroupObject(IStringReader * reader);
void ParseGroupScenario(IStringReader * reader);
void ParseString(IStringReader * reader);
bool ParseToken(IStringReader * reader, uint32 * token, bool * isByte);
virtual void SetString(rct_string_id stringId, const utf8 * str) abstract;
virtual const utf8 * GetString(rct_string_id stringId) const abstract;
virtual rct_string_id GetObjectOverrideStringId(const char * objectIdentifier, uint8 index) abstract;
virtual rct_string_id GetScenarioOverrideStringId(const utf8 * scenarioFilename, uint8 index) abstract;
};
namespace LanguagePackFactory
{
ILanguagePack * FromFile(uint16 id, const utf8 * path);
ILanguagePack * FromText(uint16 id, const utf8 * text);
}

View File

@@ -15,6 +15,7 @@
#pragma endregion
#include <stack>
#include "../core/String.hpp"
#include "../object/ObjectManager.h"
#include "LanguagePack.h"
@@ -106,8 +107,8 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = {
int gCurrentLanguage = LANGUAGE_UNDEFINED;
bool gUseTrueTypeFont = false;
LanguagePack *_languageFallback = nullptr;
LanguagePack *_languageCurrent = nullptr;
ILanguagePack *_languageFallback = nullptr;
ILanguagePack *_languageCurrent = nullptr;
const utf8 BlackUpArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xB2, (utf8)0x00 };
const utf8 BlackDownArrowString[] = { (utf8)0xC2, (utf8)0x8E, (utf8)0xE2, (utf8)0x96, (utf8)0xBC, (utf8)0x00 };
@@ -158,11 +159,11 @@ bool language_open(int id)
platform_get_openrct_data_path(dataPath);
if (id != LANGUAGE_ENGLISH_UK) {
sprintf(filename, languagePath, dataPath, LanguagesDescriptors[LANGUAGE_ENGLISH_UK].locale);
_languageFallback = LanguagePack::FromFile(LANGUAGE_ENGLISH_UK, filename);
_languageFallback = LanguagePackFactory::FromFile(LANGUAGE_ENGLISH_UK, filename);
}
sprintf(filename, languagePath, dataPath, LanguagesDescriptors[id].locale);
_languageCurrent = LanguagePack::FromFile(id, filename);
_languageCurrent = LanguagePackFactory::FromFile(id, filename);
if (_languageCurrent != nullptr) {
gCurrentLanguage = id;

View File

@@ -21,6 +21,11 @@
#include "Object.h"
#include "StringTable.h"
extern "C"
{
#include "../localisation/localisation.h"
}
constexpr uint8 RCT2_LANGUAGE_ID_ENGLISH_UK = 0;
constexpr uint8 RCT2_LANGUAGE_ID_BLANK = 254;
constexpr uint8 RCT2_LANGUAGE_ID_END = 255;