|
@@ -935,13 +935,13 @@ static char *FormatString(char *buff, co
|
|
|
/* If we didn't error out, we can actually print the string. */
|
|
|
if (*str != '\0') {
|
|
|
str = p;
|
|
|
buff = GetStringWithArgs(buff, MakeStringID(TEXT_TAB_GAMESCRIPT_START, stringid), &sub_args, last, true);
|
|
|
}
|
|
|
|
|
|
for (int i = 0; i < 20; i++) {
|
|
|
for (i = 0; i < 20; i++) {
|
|
|
if (sub_args_need_free[i]) free((void *)sub_args.GetParam(i));
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case SCC_NEWGRF_STRINL: {
|
|
@@ -1041,45 +1041,45 @@ static char *FormatString(char *buff, co
|
|
|
case SCC_REVISION: // {REV}
|
|
|
buff = strecpy(buff, _openttd_revision, last);
|
|
|
break;
|
|
|
|
|
|
case SCC_RAW_STRING_POINTER: { // {RAW_STRING}
|
|
|
if (game_script) break;
|
|
|
const char *str = (const char *)(size_t)args->GetInt64(SCC_RAW_STRING_POINTER);
|
|
|
buff = FormatString(buff, str, args, last);
|
|
|
const char *raw_string = (const char *)(size_t)args->GetInt64(SCC_RAW_STRING_POINTER);
|
|
|
buff = FormatString(buff, raw_string, args, last);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case SCC_STRING: {// {STRING}
|
|
|
StringID str = args->GetInt32(SCC_STRING);
|
|
|
if (game_script && GetStringTab(str) != TEXT_TAB_GAMESCRIPT_START) break;
|
|
|
StringID string_id = args->GetInt32(SCC_STRING);
|
|
|
if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break;
|
|
|
/* WARNING. It's prohibited for the included string to consume any arguments.
|
|
|
* For included strings that consume argument, you should use STRING1, STRING2 etc.
|
|
|
* To debug stuff you can set argv to nullptr and it will tell you */
|
|
|
StringParameters tmp_params(args->GetDataPointer(), args->GetDataLeft(), nullptr);
|
|
|
buff = GetStringWithArgs(buff, str, &tmp_params, last, next_substr_case_index, game_script);
|
|
|
buff = GetStringWithArgs(buff, string_id, &tmp_params, last, next_substr_case_index, game_script);
|
|
|
next_substr_case_index = 0;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case SCC_STRING1:
|
|
|
case SCC_STRING2:
|
|
|
case SCC_STRING3:
|
|
|
case SCC_STRING4:
|
|
|
case SCC_STRING5:
|
|
|
case SCC_STRING6:
|
|
|
case SCC_STRING7: { // {STRING1..7}
|
|
|
/* Strings that consume arguments */
|
|
|
StringID str = args->GetInt32(b);
|
|
|
if (game_script && GetStringTab(str) != TEXT_TAB_GAMESCRIPT_START) break;
|
|
|
StringID string_id = args->GetInt32(b);
|
|
|
if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break;
|
|
|
uint size = b - SCC_STRING1 + 1;
|
|
|
if (game_script && size > args->GetDataLeft()) {
|
|
|
buff = strecat(buff, "(too many parameters)", last);
|
|
|
} else {
|
|
|
StringParameters sub_args(*args, size);
|
|
|
buff = GetStringWithArgs(buff, str, &sub_args, last, next_substr_case_index, game_script);
|
|
|
buff = GetStringWithArgs(buff, string_id, &sub_args, last, next_substr_case_index, game_script);
|
|
|
}
|
|
|
next_substr_case_index = 0;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case SCC_COMMA: // {COMMA}
|
|
@@ -1453,29 +1453,29 @@ static char *FormatString(char *buff, co
|
|
|
|
|
|
if (!st->name.empty()) {
|
|
|
int64 args_array[] = {(int64)(size_t)st->name.c_str()};
|
|
|
StringParameters tmp_params(args_array);
|
|
|
buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, &tmp_params, last);
|
|
|
} else {
|
|
|
StringID str = st->string_id;
|
|
|
StringID string_id = st->string_id;
|
|
|
if (st->indtype != IT_INVALID) {
|
|
|
/* Special case where the industry provides the name for the station */
|
|
|
const IndustrySpec *indsp = GetIndustrySpec(st->indtype);
|
|
|
|
|
|
/* Industry GRFs can change which might remove the station name and
|
|
|
* thus cause very strange things. Here we check for that before we
|
|
|
* actually set the station name. */
|
|
|
if (indsp->station_name != STR_NULL && indsp->station_name != STR_UNDEFINED) {
|
|
|
str = indsp->station_name;
|
|
|
string_id = indsp->station_name;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
uint64 args_array[] = {STR_TOWN_NAME, st->town->index, st->index};
|
|
|
WChar types_array[] = {0, SCC_TOWN_NAME, SCC_NUM};
|
|
|
StringParameters tmp_params(args_array, 3, types_array);
|
|
|
buff = GetStringWithArgs(buff, str, &tmp_params, last);
|
|
|
buff = GetStringWithArgs(buff, string_id, &tmp_params, last);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case SCC_TOWN_NAME: { // {TOWN}
|
|
|
const Town *t = Town::GetIfValid(args->GetInt32(SCC_TOWN_NAME));
|
|
@@ -1499,15 +1499,15 @@ static char *FormatString(char *buff, co
|
|
|
int64 args_array[] = {(int64)(size_t)wp->name.c_str()};
|
|
|
StringParameters tmp_params(args_array);
|
|
|
buff = GetStringWithArgs(buff, STR_JUST_RAW_STRING, &tmp_params, last);
|
|
|
} else {
|
|
|
int64 args_array[] = {wp->town->index, wp->town_cn + 1};
|
|
|
StringParameters tmp_params(args_array);
|
|
|
StringID str = ((wp->string_id == STR_SV_STNAME_BUOY) ? STR_FORMAT_BUOY_NAME : STR_FORMAT_WAYPOINT_NAME);
|
|
|
if (wp->town_cn != 0) str++;
|
|
|
buff = GetStringWithArgs(buff, str, &tmp_params, last);
|
|
|
StringID string_id = ((wp->string_id == STR_SV_STNAME_BUOY) ? STR_FORMAT_BUOY_NAME : STR_FORMAT_WAYPOINT_NAME);
|
|
|
if (wp->town_cn != 0) string_id++;
|
|
|
buff = GetStringWithArgs(buff, string_id, &tmp_params, last);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case SCC_VEHICLE_NAME: { // {VEHICLE}
|
|
|
const Vehicle *v = Vehicle::GetIfValid(args->GetInt32(SCC_VEHICLE_NAME));
|
|
@@ -1523,22 +1523,22 @@ static char *FormatString(char *buff, co
|
|
|
StringParameters tmp_params(args_array);
|
|
|
buff = GetStringWithArgs(buff, STR_FORMAT_GROUP_VEHICLE_NAME, &tmp_params, last);
|
|
|
} else {
|
|
|
int64 args_array[] = {v->unitnumber};
|
|
|
StringParameters tmp_params(args_array);
|
|
|
|
|
|
StringID str;
|
|
|
StringID string_id;
|
|
|
switch (v->type) {
|
|
|
default: str = STR_INVALID_VEHICLE; break;
|
|
|
case VEH_TRAIN: str = STR_SV_TRAIN_NAME; break;
|
|
|
case VEH_ROAD: str = STR_SV_ROAD_VEHICLE_NAME; break;
|
|
|
case VEH_SHIP: str = STR_SV_SHIP_NAME; break;
|
|
|
case VEH_AIRCRAFT: str = STR_SV_AIRCRAFT_NAME; break;
|
|
|
default: string_id = STR_INVALID_VEHICLE; break;
|
|
|
case VEH_TRAIN: string_id = STR_SV_TRAIN_NAME; break;
|
|
|
case VEH_ROAD: string_id = STR_SV_ROAD_VEHICLE_NAME; break;
|
|
|
case VEH_SHIP: string_id = STR_SV_SHIP_NAME; break;
|
|
|
case VEH_AIRCRAFT: string_id = STR_SV_AIRCRAFT_NAME; break;
|
|
|
}
|
|
|
|
|
|
buff = GetStringWithArgs(buff, str, &tmp_params, last);
|
|
|
buff = GetStringWithArgs(buff, string_id, &tmp_params, last);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case SCC_SIGN_NAME: { // {SIGN}
|
|
|
const Sign *si = Sign::GetIfValid(args->GetInt32());
|