strings_sl.cpp
Go to the documentation of this file.00001
00002
00005 #include "../stdafx.h"
00006 #include "../core/alloc_func.hpp"
00007 #include "../string_func.h"
00008 #include "saveload_internal.h"
00009
00010 #include "table/strings.h"
00011
00017 StringID RemapOldStringID(StringID s)
00018 {
00019 switch (s) {
00020 case 0x0006: return STR_SV_EMPTY;
00021 case 0x7000: return STR_SV_UNNAMED;
00022 case 0x70E4: return SPECSTR_PLAYERNAME_ENGLISH;
00023 case 0x70E9: return SPECSTR_PLAYERNAME_ENGLISH;
00024 case 0x8864: return STR_SV_TRAIN_NAME;
00025 case 0x902B: return STR_SV_ROADVEH_NAME;
00026 case 0x9830: return STR_SV_SHIP_NAME;
00027 case 0xA02F: return STR_SV_AIRCRAFT_NAME;
00028
00029 default:
00030 if (IsInsideMM(s, 0x300F, 0x3030)) {
00031 return s - 0x300F + STR_SV_STNAME;
00032 } else {
00033 return s;
00034 }
00035 }
00036 }
00037
00039 char *_old_name_array = NULL;
00040
00048 char *CopyFromOldName(StringID id)
00049 {
00050
00051 if (GB(id, 11, 5) != 15) return NULL;
00052
00053 if (CheckSavegameVersion(37)) {
00054
00055
00056 char tmp[128];
00057 uint offs = _savegame_type == SGT_TTO ? 24 * GB(id, 0, 8) : 32 * GB(id, 0, 9);
00058 const char *strfrom = &_old_name_array[offs];
00059 char *strto = tmp;
00060
00061 for (; *strfrom != '\0'; strfrom++) {
00062 WChar c = (byte)*strfrom;
00063
00064
00065 switch (c) {
00066 case 0xA4: c = 0x20AC; break;
00067 case 0xA6: c = 0x0160; break;
00068 case 0xA8: c = 0x0161; break;
00069 case 0xB4: c = 0x017D; break;
00070 case 0xB8: c = 0x017E; break;
00071 case 0xBC: c = 0x0152; break;
00072 case 0xBD: c = 0x0153; break;
00073 case 0xBE: c = 0x0178; break;
00074 default: break;
00075 }
00076
00077
00078 if (strto + Utf8CharLen(c) > lastof(tmp)) break;
00079
00080 strto += Utf8Encode(strto, c);
00081 }
00082
00083
00084 *strto = '\0';
00085
00086 return strdup(tmp);
00087 } else {
00088
00089 return strdup(&_old_name_array[32 * GB(id, 0, 9)]);
00090 }
00091 }
00092
00097 void ResetOldNames()
00098 {
00099 free(_old_name_array);
00100 _old_name_array = NULL;
00101 }
00102
00106 void InitializeOldNames()
00107 {
00108 free(_old_name_array);
00109 _old_name_array = CallocT<char>(512 * 32);
00110 }
00111
00112 static void Load_NAME()
00113 {
00114 int index;
00115
00116 while ((index = SlIterateArray()) != -1) {
00117 SlArray(&_old_name_array[32 * index], SlGetFieldLength(), SLE_UINT8);
00118 }
00119 }
00120
00121 extern const ChunkHandler _name_chunk_handlers[] = {
00122 { 'NAME', NULL, Load_NAME, CH_ARRAY | CH_LAST},
00123 };