forked from github/server
fix NAME FOREIGN UNIT
RENAME FOREIGN UNIT used a somewhat naive approach to check if a unit still had its generic name. Fixed that.
This commit is contained in:
parent
a31898ceb5
commit
d416a8eef1
|
@ -1461,6 +1461,28 @@ static void createunitid(unit * u, int id)
|
|||
uhash(u);
|
||||
}
|
||||
|
||||
void default_name(const unit *u, char name[], int len) {
|
||||
const char * result;
|
||||
const struct locale * lang = u->faction ? u->faction->locale : default_locale;
|
||||
if (lang) {
|
||||
static const char * prefix[MAXLOCALES];
|
||||
int i = locale_index(lang);
|
||||
/*if (!prefix[i]) {*/
|
||||
prefix[i] = LOC(lang, "unitdefault");
|
||||
if (!prefix[i]) {
|
||||
prefix[i] = parameters[P_UNIT];
|
||||
}
|
||||
/*}*/
|
||||
result = prefix[i];
|
||||
}
|
||||
else {
|
||||
result = parameters[P_UNIT];
|
||||
}
|
||||
strlcpy(name, result, len);
|
||||
strlcat(name, " ", len);
|
||||
strlcat(name, itoa36(u->no), len);
|
||||
}
|
||||
|
||||
void name_unit(unit * u)
|
||||
{
|
||||
if (u_race(u)->generate_name) {
|
||||
|
@ -1474,25 +1496,7 @@ void name_unit(unit * u)
|
|||
}
|
||||
else {
|
||||
char name[32];
|
||||
const char * result;
|
||||
const struct locale * lang = u->faction ? u->faction->locale : default_locale;
|
||||
if (lang) {
|
||||
static const char * prefix[MAXLOCALES];
|
||||
int i = locale_index(lang);
|
||||
if (!prefix[i]) {
|
||||
prefix[i] = LOC(lang, "unitdefault");
|
||||
if (!prefix[i]) {
|
||||
prefix[i] = parameters[P_UNIT];
|
||||
}
|
||||
}
|
||||
result = prefix[i];
|
||||
}
|
||||
else {
|
||||
result = parameters[P_UNIT];
|
||||
}
|
||||
strlcpy(name, result, sizeof(name));
|
||||
strlcat(name, " ", sizeof(name));
|
||||
strlcat(name, itoa36(u->no), sizeof(name));
|
||||
default_name(u, name, sizeof(name));
|
||||
unit_setname(u, name);
|
||||
}
|
||||
}
|
||||
|
@ -1917,4 +1921,4 @@ bool unit_name_equals_race(const unit *u) {
|
|||
|
||||
bool unit_can_study(const unit *u) {
|
||||
return !((u_race(u)->flags & RCF_NOLEARN) || fval(u, UFL_WERE));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -248,6 +248,7 @@ extern "C" {
|
|||
|
||||
struct unit *findunitr(const struct region *r, int n);
|
||||
|
||||
void default_name(const unit *u, char name[], int len);
|
||||
const char *unitname(const struct unit *u);
|
||||
char *write_unitname(const struct unit *u, char *buffer, size_t size);
|
||||
bool unit_name_equals_race(const struct unit *u);
|
||||
|
|
|
@ -211,6 +211,27 @@ static void test_names(CuTest *tc) {
|
|||
test_cleanup();
|
||||
}
|
||||
|
||||
static void test_default_name(CuTest *tc) {
|
||||
unit *u;
|
||||
struct locale* lang;
|
||||
char buf[32], compare[32];
|
||||
|
||||
test_cleanup();
|
||||
test_create_world();
|
||||
lang = get_or_create_locale("de");
|
||||
/* FIXME this has no real effect: default_name uses a static buffer that is initialized in some other test. This sucks. */
|
||||
locale_setstring(lang, "unitdefault", "Einheit");
|
||||
|
||||
u = test_create_unit(test_create_faction(test_create_race("human")), findregion(0, 0));
|
||||
|
||||
default_name(u, buf, sizeof(buf));
|
||||
|
||||
sprintf(compare, "Einheit %s", itoa36(u->no));
|
||||
CuAssertStrEquals(tc, compare, buf);
|
||||
|
||||
test_cleanup();
|
||||
}
|
||||
|
||||
CuSuite *get_unit_suite(void)
|
||||
{
|
||||
CuSuite *suite = CuSuiteNew();
|
||||
|
@ -224,5 +245,6 @@ CuSuite *get_unit_suite(void)
|
|||
SUITE_ADD_TEST(suite, test_remove_units_with_dead_faction);
|
||||
SUITE_ADD_TEST(suite, test_remove_empty_units_in_region);
|
||||
SUITE_ADD_TEST(suite, test_names);
|
||||
SUITE_ADD_TEST(suite, test_default_name);
|
||||
return suite;
|
||||
}
|
||||
|
|
10
src/laws.c
10
src/laws.c
|
@ -1834,12 +1834,10 @@ int name_cmd(struct unit *u, struct order *ord)
|
|||
break;
|
||||
}
|
||||
else {
|
||||
const char *udefault = LOC(u2->faction->locale, "unitdefault");
|
||||
const char *uname = unit_getname(u2);
|
||||
size_t udlen = strlen(udefault);
|
||||
size_t unlen = strlen(uname);
|
||||
if (unlen >= udlen && strncmp(uname, udefault, udlen) != 0) {
|
||||
cmistake(u2, ord, 244, MSG_EVENT);
|
||||
char udefault[32];
|
||||
default_name(u2, udefault, sizeof(udefault));
|
||||
if (strcmp(unit_getname(u2), udefault) != 0) {
|
||||
cmistake(u, ord, 244, MSG_EVENT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue