1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
/* Author: Tobi Vollebregt */
#include "StdAfx.h"
#include <algorithm>
#include <assert.h>
#include <locale>
#include <cctype>
#include <string>
#include <vector>
#include <map>
#include "mmgr.h"
#include "GlobalUnsynced.h"
#include "LogOutput.h"
#include "Messages.h"
#include "Lua/LuaParser.h"
#include "Util.h"
using std::string;
using std::vector;
using std::map;
CMessages::CMessages(): loaded(false) {}
/** Return a pointer to the single instance of CMessages. */
CMessages* CMessages::GetInstance()
{
static CMessages instance;
return &instance;
}
/** Load the messages from gamedata/messages.lua into memory. */
void CMessages::Load()
{
LuaParser luaParser("gamedata/messages.lua",
SPRING_VFS_MOD_BASE, SPRING_VFS_MOD_BASE);
if (!luaParser.Execute()) {
// Show parse errors in the infolog.
logOutput.Print(string("ERROR: messages.lua: ") + luaParser.GetErrorLog());
return;
}
const LuaTable root = luaParser.GetRoot();
vector<string> labels;
root.GetKeys(labels);
for (size_t l = 0; l < labels.size(); l++) {
const string label = StringToLower(labels[l]);
const LuaTable msgTable = root.SubTable(label);
if (!msgTable.IsValid()) {
continue;
}
vector<string> msgs;
for (int s = 1; true; s++) {
const string msg = msgTable.GetString(s, "");
if (msg.empty()) {
break;
}
msgs.push_back(msg);
}
if (!msgs.empty()) {
tr[label] = msgs;
}
}
loaded = true;
}
/** Translate \p msg. If multiple messages are available it picks one at random.
Returns \p msg if no messages are available. */
string CMessages::Translate(const string& msg) const
{
// all keys are lowercase
const string lower = StringToLower(msg);
message_map_t::const_iterator it = tr.find(lower);
if (it == tr.end()) {
return msg;
}
return Pick(it->second);
}
/** Returns a message from \p vec at random. */
string CMessages::Pick(const message_list_t& vec) const
{
assert(!vec.empty());
if (vec.size() == 1) {
return vec[0];
}
return vec[gu->usRandInt() % vec.size()];
}
|