diff options
author | truebrain <truebrain@openttd.org> | 2011-12-19 21:05:57 +0000 |
---|---|---|
committer | truebrain <truebrain@openttd.org> | 2011-12-19 21:05:57 +0000 |
commit | b0ac529a6ff4e087520a14d2a0169f445952e7e0 (patch) | |
tree | f545f15ff52b6c1ad6279f7e028f2a058465d672 /src/script/api/script_text.cpp | |
parent | 2ae87e72131a8e88327dbb0b5b286accddafe05d (diff) | |
download | openttd-b0ac529a6ff4e087520a14d2a0169f445952e7e0.tar.xz |
(svn r23635) -Add: introduce GSText, to allow translating GameScript text, even over network
Diffstat (limited to 'src/script/api/script_text.cpp')
-rw-r--r-- | src/script/api/script_text.cpp | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/script/api/script_text.cpp b/src/script/api/script_text.cpp new file mode 100644 index 000000000..10120bcde --- /dev/null +++ b/src/script/api/script_text.cpp @@ -0,0 +1,167 @@ +/* $Id$ */ + +/* + * 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 script_text.cpp Implementation of ScriptText. */ + +#include "../../stdafx.h" +#include "../../string_func.h" +#include "script_text.hpp" +#include "../squirrel.hpp" +#include "../../table/control_codes.h" + +ScriptText::ScriptText(StringID string) : + ZeroedMemoryAllocator(), + string(string) +{ +} + +ScriptText::~ScriptText() +{ + for (int i = 0; i < SCRIPT_TEXT_MAX_PARAMETERS; i++) { + free(this->params[i]); + if (this->paramt[i] != NULL) this->paramt[i]->Release(); + } +} + +SQInteger ScriptText::_SetParam(int parameter, HSQUIRRELVM vm) +{ + if (parameter >= SCRIPT_TEXT_MAX_PARAMETERS) return SQ_ERROR; + + free(this->params[parameter]); + if (this->paramt[parameter] != NULL) this->paramt[parameter]->Release(); + + this->parami[parameter] = 0; + this->params[parameter] = NULL; + this->paramt[parameter] = NULL; + + switch (sq_gettype(vm, -1)) { + case OT_STRING: { + const SQChar *value; + sq_getstring(vm, -1, &value); + + this->params[parameter] = strdup(SQ2OTTD(value)); + break; + } + + case OT_INTEGER: { + SQInteger value; + sq_getinteger(vm, -1, &value); + + this->parami[parameter] = value; + break; + } + + case OT_INSTANCE: { + SQUserPointer real_instance = NULL; + HSQOBJECT instance; + + sq_getstackobj(vm, -1, &instance); + + /* Validate if it is a GSText instance */ + sq_pushroottable(vm); + sq_pushstring(vm, _SC("GSText"), -1); + sq_get(vm, -2); + sq_pushobject(vm, instance); + if (sq_instanceof(vm) != SQTrue) return SQ_ERROR; + sq_pop(vm, 3); + + /* Get the 'real' instance of this class */ + sq_getinstanceup(vm, -1, &real_instance, 0); + if (real_instance == NULL) return SQ_ERROR; + + ScriptText *value = static_cast<ScriptText *>(real_instance); + value->AddRef(); + this->paramt[parameter] = value; + break; + } + + default: return SQ_ERROR; + } + + if (this->paramc <= parameter) this->paramc = parameter + 1; + return 0; +} + +SQInteger ScriptText::SetParam(HSQUIRRELVM vm) +{ + if (sq_gettype(vm, 2) != OT_INTEGER) return SQ_ERROR; + + SQInteger k; + sq_getinteger(vm, 2, &k); + + if (k > SCRIPT_TEXT_MAX_PARAMETERS) return SQ_ERROR; + if (k < 1) return SQ_ERROR; + k--; + + return this->_SetParam(k, vm); +} + +SQInteger ScriptText::AddParam(HSQUIRRELVM vm) +{ + SQInteger res; + res = this->_SetParam(this->paramc, vm); + if (res != 0) return res; + + /* Push our own instance back on top of the stack */ + sq_push(vm, 1); + return 1; +} + +SQInteger ScriptText::_set(HSQUIRRELVM vm) +{ + int32 k; + + if (sq_gettype(vm, 2) == OT_STRING) { + const SQChar *key; + sq_getstring(vm, 2, &key); + const char *key_string = SQ2OTTD(key); + + if (strncmp(key_string, "param_", 6) != 0 || strlen(key_string) > 8) return SQ_ERROR; + k = atoi(key_string + 6); + } else if (sq_gettype(vm, 2) == OT_INTEGER) { + SQInteger key; + sq_getinteger(vm, 2, &key); + k = (int32)key; + } else { + return SQ_ERROR; + } + + if (k > SCRIPT_TEXT_MAX_PARAMETERS) return SQ_ERROR; + if (k < 1) return SQ_ERROR; + k--; + + return this->_SetParam(k, vm); +} + +const char *ScriptText::GetEncodedText() +{ + static char buf[1024]; + this->_GetEncodedText(buf, lastof(buf)); + return buf; +} + +char *ScriptText::_GetEncodedText(char *p, char *lastofp) +{ + p += Utf8Encode(p, SCC_ENCODED); + p += seprintf(p, lastofp, "%X", this->string); + for (int i = 0; i < this->paramc; i++) { + if (this->params[i] != NULL) { + p += seprintf(p, lastofp, ":\"%s\"", this->params[i]); + continue; + } + if (this->paramt[i] != NULL) { + p += seprintf(p, lastofp, ":"); + p = this->paramt[i]->_GetEncodedText(p, lastofp); + continue; + } + p += seprintf(p, lastofp,":%X", this->parami[i]); + } + + return p; +} |