Project

General

Profile

Feature #1836 » 1836.patch

Dean Brown, 01/06/2026 03:45 AM

View differences:

common/reqtext.c
#include "reqtext.h"
/*************************************************************//**
Append text for the requirement. Something like
"Requires knowledge of the technology Communism."
/*************************************************************//**
Append text for a requirement type.
pplayer may be nullptr. Note that it must be updated every time
a new requirement type or range is defined.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
bool req_text_insert(char *buf, size_t bufsz, struct player *pplayer,
const struct requirement *preq,
enum rt_verbosity verb, const char *prefix)
static bool req_text_counter(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
if (preq->quiet && verb != VERB_ACTUAL) {
return FALSE;
if (preq->present) {
fc_strlcat(buf, prefix, bufsz);
cat_snprintf(buf, bufsz,
_("Requires counter %s to achieve at minimum %d value."),
counter_rule_name(preq->source.value.counter),
preq->source.value.counter->checkpoint);
} else {
fc_strlcat(buf, prefix, bufsz);
cat_snprintf(buf, bufsz,
_("Requires counter %s to be less than %d value."),
counter_rule_name(preq->source.value.counter),
preq->source.value.counter->checkpoint - 1);
}
return TRUE;
}
switch (preq->source.kind) {
case VUT_NONE:
return FALSE;
/*************************************************************//**
Append text for a requirement type.
case VUT_COUNTER:
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_advance(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_PLAYER:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
fc_strlcat(buf, prefix, bufsz);
cat_snprintf(buf, bufsz,
_("Requires counter %s to achieve at minimum %d value."),
counter_rule_name(preq->source.value.counter),
preq->source.value.counter->checkpoint);
_("Requires knowledge of the technology %s."),
advance_name_translation(preq->source.value.advance));
} else {
fc_strlcat(buf, prefix, bufsz);
cat_snprintf(buf, bufsz,
_("Requires counter %s to be less than %d value."),
counter_rule_name(preq->source.value.counter),
preq->source.value.counter->checkpoint - 1);
_("Prevented by knowledge of the technology %s."),
advance_name_translation(preq->source.value.advance));
}
break;
case VUT_ADVANCE:
switch (preq->range) {
case REQ_RANGE_PLAYER:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
_("Requires knowledge of the technology %s."),
advance_name_translation(preq->source.value.advance));
} else {
cat_snprintf(buf, bufsz,
_("Prevented by knowledge of the technology %s."),
advance_name_translation(preq->source.value.advance));
}
return TRUE;
case REQ_RANGE_TEAM:
fc_strlcat(buf, prefix, bufsz);
return TRUE;
case REQ_RANGE_TEAM:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
_("Requires that a player on your team knows the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
} else {
cat_snprintf(buf, bufsz,
_("Prevented if any player on your team knows the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
}
return TRUE;
case REQ_RANGE_ALLIANCE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
_("Requires that a player allied to you knows the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
} else {
cat_snprintf(buf, bufsz,
_("Prevented if any player allied to you knows the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
}
return TRUE;
case REQ_RANGE_WORLD:
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
cat_snprintf(buf, bufsz,
_("Requires that a player on your team knows the "
_("Requires that someone has discovered the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
} else {
cat_snprintf(buf, bufsz,
_("Prevented if any player on your team knows the "
"technology %s."),
_("Requires that no-one has yet discovered the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
}
return TRUE;
case REQ_RANGE_ALLIANCE:
fc_strlcat(buf, prefix, bufsz);
} else {
if (preq->present) {
cat_snprintf(buf, bufsz,
_("Requires that a player allied to you knows the "
_("Requires that some player knows the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
} else {
cat_snprintf(buf, bufsz,
_("Prevented if any player allied to you knows the "
_("Requires that no player knows the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
}
return TRUE;
case REQ_RANGE_WORLD:
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
cat_snprintf(buf, bufsz,
_("Requires that someone has discovered the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
} else {
cat_snprintf(buf, bufsz,
_("Requires that no-one has yet discovered the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
}
} else {
if (preq->present) {
cat_snprintf(buf, bufsz,
_("Requires that some player knows the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
} else {
cat_snprintf(buf, bufsz,
_("Requires that no player knows the "
"technology %s."),
advance_name_translation(preq->source.value.advance));
}
}
return TRUE;
case REQ_RANGE_LOCAL:
case REQ_RANGE_TILE:
case REQ_RANGE_CADJACENT:
case REQ_RANGE_ADJACENT:
case REQ_RANGE_CITY:
case REQ_RANGE_TRADE_ROUTE:
case REQ_RANGE_CONTINENT:
case REQ_RANGE_COUNT:
/* Not supported. */
break;
}
break;
return TRUE;
case REQ_RANGE_LOCAL:
case REQ_RANGE_TILE:
case REQ_RANGE_CADJACENT:
case REQ_RANGE_ADJACENT:
case REQ_RANGE_CITY:
case REQ_RANGE_TRADE_ROUTE:
case REQ_RANGE_CONTINENT:
case REQ_RANGE_COUNT:
/* Not supported. */
return FALSE;
}
return TRUE;
}
case VUT_TECHFLAG:
switch (preq->range) {
case REQ_RANGE_PLAYER:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Requires knowledge of a technology with the "
"\"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Prevented by knowledge of any technology with the "
"\"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
}
return TRUE;
case REQ_RANGE_TEAM:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Requires that a player on your team knows "
"a technology with the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Prevented if any player on your team knows "
"any technology with the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
}
return TRUE;
case REQ_RANGE_ALLIANCE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Requires that a player allied to you knows "
"a technology with the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Prevented if any player allied to you knows "
"any technology with the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
}
return TRUE;
case REQ_RANGE_WORLD:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Requires that some player knows a technology "
"with the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Requires that no player knows any technology with "
"the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
}
return TRUE;
case REQ_RANGE_LOCAL:
case REQ_RANGE_TILE:
case REQ_RANGE_CADJACENT:
case REQ_RANGE_ADJACENT:
case REQ_RANGE_CITY:
case REQ_RANGE_TRADE_ROUTE:
case REQ_RANGE_CONTINENT:
case REQ_RANGE_COUNT:
/* Not supported. */
break;
}
break;
/*************************************************************//**
Append text for a requirement type.
case VUT_GOVERNMENT:
if (preq->range != REQ_RANGE_PLAYER) {
break;
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_techflag(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_PLAYER:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Requires knowledge of a technology with the "
"\"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Prevented by knowledge of any technology with the "
"\"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
}
return TRUE;
case REQ_RANGE_TEAM:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires the %s government."),
government_name_translation(preq->source.value.govern));
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Requires that a player on your team knows "
"a technology with the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
} else {
cat_snprintf(buf, bufsz, _("Not available under the %s government."),
government_name_translation(preq->source.value.govern));
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Prevented if any player on your team knows "
"any technology with the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
}
return TRUE;
case VUT_GOVFLAG:
if (preq->range != REQ_RANGE_PLAYER) {
break;
case REQ_RANGE_ALLIANCE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Requires that a player allied to you knows "
"a technology with the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Prevented if any player allied to you knows "
"any technology with the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
}
return TRUE;
case REQ_RANGE_WORLD:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires a %s government."),
gov_flag_id_translated_name(preq->source.value.govflag));
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Requires that some player knows a technology "
"with the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
} else {
cat_snprintf(buf, bufsz, _("Not available under a %s government."),
gov_flag_id_translated_name(preq->source.value.govflag));
cat_snprintf(buf, bufsz,
/* TRANS: %s is a (translatable) tech flag. */
_("Requires that no player knows any technology with "
"the \"%s\" flag."),
tech_flag_id_translated_name(preq->source.value.techflag));
}
return TRUE;
case VUT_ACHIEVEMENT:
switch (preq->range) {
case REQ_RANGE_PLAYER:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires you to have achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
} else {
cat_snprintf(buf, bufsz, _("Not available once you have achieved "
"\"%s\"."),
achievement_name_translation(preq->source.value.achievement));
}
return TRUE;
case REQ_RANGE_TEAM:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires that at least one of your "
"team-mates has achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
} else {
cat_snprintf(buf, bufsz, _("Not available if any of your team-mates "
"has achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
}
return TRUE;
case REQ_RANGE_ALLIANCE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires that at least one of your allies "
"has achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
} else {
cat_snprintf(buf, bufsz, _("Not available if any of your allies has "
"achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
}
return TRUE;
case REQ_RANGE_WORLD:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires that at least one player "
"has achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
} else {
cat_snprintf(buf, bufsz, _("Not available if any player has "
"achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
}
return TRUE;
case REQ_RANGE_LOCAL:
case REQ_RANGE_TILE:
case REQ_RANGE_CADJACENT:
case REQ_RANGE_ADJACENT:
case REQ_RANGE_CITY:
case REQ_RANGE_TRADE_ROUTE:
case REQ_RANGE_CONTINENT:
case REQ_RANGE_COUNT:
/* Not supported. */
break;
case REQ_RANGE_LOCAL:
case REQ_RANGE_TILE:
case REQ_RANGE_CADJACENT:
case REQ_RANGE_ADJACENT:
case REQ_RANGE_CITY:
case REQ_RANGE_TRADE_ROUTE:
case REQ_RANGE_CONTINENT:
case REQ_RANGE_COUNT:
/* Not supported. */
return FALSE;
}
break;
return TRUE;
}
case VUT_ACTION:
switch (preq->range) {
case REQ_RANGE_LOCAL:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Applies to the \"%s\" action."),
action_name_translation(preq->source.value.action));
} else {
cat_snprintf(buf, bufsz, _("Doesn't apply to the \"%s\""
" action."),
action_name_translation(preq->source.value.action));
}
return TRUE;
default:
/* Not supported. */
break;
}
break;
/*************************************************************//**
Append text for a requirement type.
case VUT_IMPR_GENUS:
switch (preq->range) {
case REQ_RANGE_LOCAL:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Applies to \"%s\" buildings."),
impr_genus_id_translated_name(
preq->source.value.impr_genus));
} else {
cat_snprintf(buf, bufsz, _("Doesn't apply to \"%s\" buildings."),
impr_genus_id_translated_name(
preq->source.value.impr_genus));
}
return TRUE;
default:
/* Not supported. */
break;
}
break;
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_government(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
if (preq->range != REQ_RANGE_PLAYER) {
return FALSE;
}
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires the %s government."),
government_name_translation(preq->source.value.govern));
} else {
cat_snprintf(buf, bufsz, _("Not available under the %s government."),
government_name_translation(preq->source.value.govern));
}
return TRUE;
}
case VUT_IMPR_FLAG:
switch (preq->range) {
case REQ_RANGE_LOCAL:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Applies to \"%s\" buildings."),
impr_flag_id_translated_name(
preq->source.value.impr_flag));
} else {
cat_snprintf(buf, bufsz, _("Doesn't apply to \"%s\" buildings."),
impr_flag_id_translated_name(
preq->source.value.impr_flag));
}
return TRUE;
default:
/* Not supported. */
break;
}
break;
/*************************************************************//**
Append text for a requirement type.
case VUT_PLAYER_FLAG:
switch (preq->range) {
case REQ_RANGE_PLAYER:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Applies to players with \"%s\" flag."),
plr_flag_id_translated_name(
preq->source.value.plr_flag));
} else {
cat_snprintf(buf, bufsz, _("Doesn't apply to players with \"%s\" flag."),
plr_flag_id_translated_name(
preq->source.value.plr_flag));
}
return TRUE;
default:
/* Not supported. */
break;
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_government_flag(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
if (preq->range != REQ_RANGE_PLAYER) {
return FALSE;
}
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires a %s government."),
gov_flag_id_translated_name(preq->source.value.govflag));
} else {
cat_snprintf(buf, bufsz, _("Not available under a %s government."),
gov_flag_id_translated_name(preq->source.value.govflag));
}
return TRUE;
}
/*************************************************************//**
Append text for a requirement type.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_achievement(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_PLAYER:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires you to have achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
} else {
cat_snprintf(buf, bufsz, _("Not available once you have achieved "
"\"%s\"."),
achievement_name_translation(preq->source.value.achievement));
}
break;
return TRUE;
case REQ_RANGE_TEAM:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires that at least one of your "
"team-mates has achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
} else {
cat_snprintf(buf, bufsz, _("Not available if any of your team-mates "
"has achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
}
return TRUE;
case REQ_RANGE_ALLIANCE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires that at least one of your allies "
"has achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
} else {
cat_snprintf(buf, bufsz, _("Not available if any of your allies has "
"achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
}
return TRUE;
case REQ_RANGE_WORLD:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Requires that at least one player "
"has achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
} else {
cat_snprintf(buf, bufsz, _("Not available if any player has "
"achieved \"%s\"."),
achievement_name_translation(preq->source.value.achievement));
}
return TRUE;
case REQ_RANGE_LOCAL:
case REQ_RANGE_TILE:
case REQ_RANGE_CADJACENT:
case REQ_RANGE_ADJACENT:
case REQ_RANGE_CITY:
case REQ_RANGE_TRADE_ROUTE:
case REQ_RANGE_CONTINENT:
case REQ_RANGE_COUNT:
/* Not supported. */
return FALSE;
}
case VUT_PLAYER_STATE:
switch (preq->range) {
case REQ_RANGE_PLAYER:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Applies to \"%s\" players."),
plrstate_type_translated_name(preq->source.value.plrstate));
} else {
cat_snprintf(buf, bufsz, _("Doesn't apply to \"%s\" players."),
plrstate_type_translated_name(preq->source.value.plrstate));
}
return TRUE;
default:
/* Not supported. */
break;
return TRUE;
}
/*************************************************************//**
Append text for a requirement type.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_action(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_LOCAL:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Applies to the \"%s\" action."),
action_name_translation(preq->source.value.action));
} else {
cat_snprintf(buf, bufsz, _("Doesn't apply to the \"%s\""
" action."),
action_name_translation(preq->source.value.action));
}
break;
return TRUE;
default:
/* Not supported. */
return FALSE;
}
return TRUE;
}
case VUT_IMPROVEMENT:
case VUT_SITE:
switch (preq->range) {
case REQ_RANGE_WORLD:
if (is_great_wonder(preq->source.value.building)) {
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires that %s was built at some point, "
"and that it has not yet been rendered "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires that %s was built at some point."),
improvement_name_translation
(preq->source.value.building));
}
/*************************************************************//**
Append text for a requirement type.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_impr_genus(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_LOCAL:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Applies to \"%s\" buildings."),
impr_genus_id_translated_name(
preq->source.value.impr_genus));
} else {
cat_snprintf(buf, bufsz, _("Doesn't apply to \"%s\" buildings."),
impr_genus_id_translated_name(
preq->source.value.impr_genus));
}
return TRUE;
default:
/* Not supported. */
return FALSE;
}
return TRUE;
}
/*************************************************************//**
Append text for a requirement type.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_impr_flag(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_LOCAL:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Applies to \"%s\" buildings."),
impr_flag_id_translated_name(
preq->source.value.impr_flag));
} else {
cat_snprintf(buf, bufsz, _("Doesn't apply to \"%s\" buildings."),
impr_flag_id_translated_name(
preq->source.value.impr_flag));
}
return TRUE;
default:
/* Not supported. */
return FALSE;
}
return TRUE;
}
/*************************************************************//**
Append text for a requirement type.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_player_flag(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_PLAYER:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Applies to players with \"%s\" flag."),
plr_flag_id_translated_name(
preq->source.value.plr_flag));
} else {
cat_snprintf(buf, bufsz, _("Doesn't apply to players with \"%s\" flag."),
plr_flag_id_translated_name(
preq->source.value.plr_flag));
}
return TRUE;
default:
/* Not supported. */
return FALSE;
}
return TRUE;
}
/*************************************************************//**
Append text for a requirement type.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_player_state(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_PLAYER:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, _("Applies to \"%s\" players."),
plrstate_type_translated_name(preq->source.value.plrstate));
} else {
cat_snprintf(buf, bufsz, _("Doesn't apply to \"%s\" players."),
plrstate_type_translated_name(preq->source.value.plrstate));
}
return TRUE;
default:
/* Not supported. */
return FALSE;
}
return TRUE;
}
/*************************************************************//**
Append text for a requirement type.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_improvement(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_WORLD:
if (is_great_wonder(preq->source.value.building)) {
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires that %s was built at some point, "
"and that it has not yet been rendered "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if %s has ever been built, "
"unless it would be obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if %s has ever been built."),
improvement_name_translation
(preq->source.value.building));
}
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires that %s was built at some point."),
improvement_name_translation
(preq->source.value.building));
}
} else {
/* Non-surviving requirement */
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires %s to be owned by any player "
"and not yet obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires %s to be owned by any player."),
improvement_name_translation
(preq->source.value.building));
}
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if %s has ever been built, "
"unless it would be obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if %s is currently owned by "
"any player, unless it is obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if %s is currently owned by "
"any player."),
improvement_name_translation
(preq->source.value.building));
}
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if %s has ever been built."),
improvement_name_translation
(preq->source.value.building));
}
}
return TRUE;
}
/* Non-great-wonder world-ranged requirements not supported */
break;
case REQ_RANGE_ALLIANCE:
if (is_wonder(preq->source.value.building)) {
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone who is currently allied to "
"you to have built %s at some point, and for "
"it not to have been rendered obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone who is currently allied to "
"you to have built %s at some point."),
improvement_name_translation
(preq->source.value.building));
}
} else {
/* Non-surviving requirement */
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires %s to be owned by any player "
"and not yet obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone currently allied to you "
"has ever built %s, unless it would be "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone currently allied to you "
"has ever built %s."),
improvement_name_translation
(preq->source.value.building));
}
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires %s to be owned by any player."),
improvement_name_translation
(preq->source.value.building));
}
} else {
/* Non-surviving requirement */
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone allied to you to own %s, "
"and for it not to have been rendered "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone allied to you to own %s."),
improvement_name_translation
(preq->source.value.building));
}
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if %s is currently owned by "
"any player, unless it is obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone allied to you owns %s, "
"unless it is obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone allied to you owns %s."),
improvement_name_translation
(preq->source.value.building));
}
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if %s is currently owned by "
"any player."),
improvement_name_translation
(preq->source.value.building));
}
}
return TRUE;
}
/* Non-wonder alliance-ranged requirements not supported */
break;
case REQ_RANGE_TEAM:
if (is_wonder(preq->source.value.building)) {
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone on your team to have "
"built %s at some point, and for it not "
"to have been rendered obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone on your team to have "
"built %s at some point."),
improvement_name_translation
(preq->source.value.building));
}
return TRUE;
}
/* Non-great-wonder world-ranged requirements not supported */
return FALSE;
case REQ_RANGE_ALLIANCE:
if (is_wonder(preq->source.value.building)) {
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone who is currently allied to "
"you to have built %s at some point, and for "
"it not to have been rendered obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone on your team has ever "
"built %s, unless it would be obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone on your team has ever "
"built %s."),
improvement_name_translation
(preq->source.value.building));
}
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone who is currently allied to "
"you to have built %s at some point."),
improvement_name_translation
(preq->source.value.building));
}
} else {
/* Non-surviving requirement */
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone on your team to own %s, "
"and for it not to have been rendered "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone on your team to own %s."),
improvement_name_translation
(preq->source.value.building));
}
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone currently allied to you "
"has ever built %s, unless it would be "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone on your team owns %s, "
"unless it is obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone on your team owns %s."),
improvement_name_translation
(preq->source.value.building));
}
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone currently allied to you "
"has ever built %s."),
improvement_name_translation
(preq->source.value.building));
}
}
return TRUE;
}
/* Non-wonder team-ranged requirements not supported */
break;
case REQ_RANGE_PLAYER:
if (is_wonder(preq->source.value.building)) {
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires you to have built %s at some point, "
"and for it not to have been rendered "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires you to have built %s at some point."),
improvement_name_translation
(preq->source.value.building));
}
} else {
/* Non-surviving requirement */
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone allied to you to own %s, "
"and for it not to have been rendered "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if you have ever built %s, "
"unless it would be obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if you have ever built %s."),
improvement_name_translation
(preq->source.value.building));
}
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone allied to you to own %s."),
improvement_name_translation
(preq->source.value.building));
}
} else {
/* Non-surviving requirement */
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires you to own %s, which must not "
"be obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires you to own %s."),
improvement_name_translation
(preq->source.value.building));
}
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone allied to you owns %s, "
"unless it is obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if you own %s, unless it is "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if you own %s."),
improvement_name_translation
(preq->source.value.building));
}
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone allied to you owns %s."),
improvement_name_translation
(preq->source.value.building));
}
}
return TRUE;
}
/* Non-wonder player-ranged requirements not supported */
break;
case REQ_RANGE_CONTINENT:
if (is_wonder(preq->source.value.building)) {
fc_strlcat(buf, prefix, bufsz);
return TRUE;
}
/* Non-wonder alliance-ranged requirements not supported */
return FALSE;
case REQ_RANGE_TEAM:
if (is_wonder(preq->source.value.building)) {
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires %s in one of your cities on the same "
"continent, and not yet obsolete."),
_("Requires someone on your team to have "
"built %s at some point, and for it not "
"to have been rendered obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires %s in one of your cities on the same "
"continent."),
_("Requires someone on your team to have "
"built %s at some point."),
improvement_name_translation
(preq->source.value.building));
}
......
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if %s is in one of your cities on the "
"same continent, unless it is obsolete."),
_("Prevented if someone on your team has ever "
"built %s, unless it would be obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if %s is in one of your cities on the "
"same continent."),
_("Prevented if someone on your team has ever "
"built %s."),
improvement_name_translation
(preq->source.value.building));
}
}
return TRUE;
}
/* Surviving or non-wonder continent-ranged requirements not supported */
break;
case REQ_RANGE_TRADE_ROUTE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
/* Should only apply to wonders */
cat_snprintf(buf, bufsz,
/* TRANS: %s is a building or wonder */
_("Requires %s in the city or a trade partner "
"(and not yet obsolete)."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a building or wonder */
_("Requires %s in the city or a trade partner."),
improvement_name_translation
(preq->source.value.building));
} else {
/* Non-surviving requirement */
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone on your team to own %s, "
"and for it not to have been rendered "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires someone on your team to own %s."),
improvement_name_translation
(preq->source.value.building));
}
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone on your team owns %s, "
"unless it is obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if someone on your team owns %s."),
improvement_name_translation
(preq->source.value.building));
}
}
}
return TRUE;
}
/* Non-wonder team-ranged requirements not supported */
return FALSE;
case REQ_RANGE_PLAYER:
if (is_wonder(preq->source.value.building)) {
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires you to have built %s at some point, "
"and for it not to have been rendered "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires you to have built %s at some point."),
improvement_name_translation
(preq->source.value.building));
}
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if you have ever built %s, "
"unless it would be obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if you have ever built %s."),
improvement_name_translation
(preq->source.value.building));
}
}
} else {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
/* Should only apply to wonders */
cat_snprintf(buf, bufsz,
/* TRANS: %s is a building or wonder */
_("Prevented by %s in the city or a trade partner "
"(unless it is obsolete)."),
improvement_name_translation
(preq->source.value.building));
/* Non-surviving requirement */
if (preq->present) {
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires you to own %s, which must not "
"be obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Requires you to own %s."),
improvement_name_translation
(preq->source.value.building));
}
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a building or wonder */
_("Prevented by %s in the city or a trade partner."),
improvement_name_translation
(preq->source.value.building));
if (preq->source.kind == VUT_IMPROVEMENT
&& can_improvement_go_obsolete(preq->source.value.building)) {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if you own %s, unless it is "
"obsolete."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: %s is a wonder */
_("Prevented if you own %s."),
improvement_name_translation
(preq->source.value.building));
}
}
}
return TRUE;
case REQ_RANGE_CITY:
}
... This diff was truncated because it exceeds the maximum size that can be displayed.
(3-3/3)