Project

General

Profile

Feature #1836 ยป 1836.patch

Dean Brown, 12/26/2025 12:03 AM

View differences:

common/reqtext.c
#include "reqtext.h"
/*************************************************************//**
Append text for a requirement type.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_counter(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
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;
}
/*************************************************************//**
Append text for a requirement type.
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) {
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);
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 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. */
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_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,
/* 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. */
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_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;
}
/*************************************************************//**
Append text for a requirement type.
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));
}
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;
}
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));
}
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_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 {
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 {
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));
}
}
} 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));
}
} 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));
}
}
}
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 {
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 {
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));
}
}
} 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));
}
} 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));
}
}
}
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 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));
}
} 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));
}
}
} 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 {
/* 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 {
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;
}
/* Non-wonder player-ranged requirements not supported */
return FALSE;
case REQ_RANGE_CONTINENT:
if (is_wonder(preq->source.value.building)) {
fc_strlcat(buf, prefix, bufsz);
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."),
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."),
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 in one of your cities on the "
"same continent, 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 in one of your cities on the "
"same continent."),
improvement_name_translation
(preq->source.value.building));
}
}
return TRUE;
}
/* Surviving or non-wonder continent-ranged requirements not supported */
return FALSE;
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 {
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));
} 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));
}
}
return TRUE;
case REQ_RANGE_CITY:
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 (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."),
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 (unless it is "
"obsolete)."),
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."),
improvement_name_translation
(preq->source.value.building));
}
}
return TRUE;
case REQ_RANGE_LOCAL:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
_("Only applies to \"%s\" buildings."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
_("Does not apply to \"%s\" buildings."),
improvement_name_translation
(preq->source.value.building));
}
return TRUE;
case REQ_RANGE_TILE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
_("Requires \"%s\" building in a city on the tile."),
improvement_name_translation
(preq->source.value.building));
} else {
cat_snprintf(buf, bufsz,
_("Prevented by \"%s\" building in a city on the tile."),
improvement_name_translation
(preq->source.value.building));
}
return TRUE;
case REQ_RANGE_CADJACENT:
case REQ_RANGE_ADJACENT:
case REQ_RANGE_COUNT:
/* 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_extra(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,
_("Only applies to \"%s\" extras."),
extra_name_translation(preq->source.value.extra));
} else {
cat_snprintf(buf, bufsz,
_("Does not apply to \"%s\" extras."),
extra_name_translation(preq->source.value.extra));
}
return TRUE;
case REQ_RANGE_TILE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?extra:Requires %s on the tile."),
extra_name_translation(preq->source.value.extra));
} else {
cat_snprintf(buf, bufsz,
Q_("?extra:Prevented by %s on the tile."),
extra_name_translation(preq->source.value.extra));
}
return TRUE;
case REQ_RANGE_CADJACENT:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?extra:Requires %s on the tile or a cardinally "
"adjacent tile."),
extra_name_translation(preq->source.value.extra));
} else {
cat_snprintf(buf, bufsz,
Q_("?extra:Prevented by %s on the tile or any cardinally "
"adjacent tile."),
extra_name_translation(preq->source.value.extra));
}
return TRUE;
case REQ_RANGE_ADJACENT:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?extra:Requires %s on the tile or an adjacent "
"tile."),
extra_name_translation(preq->source.value.extra));
} else {
cat_snprintf(buf, bufsz,
Q_("?extra:Prevented by %s on the tile or any adjacent "
"tile."),
extra_name_translation(preq->source.value.extra));
}
return TRUE;
case REQ_RANGE_CITY:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?extra:Requires %s on a tile within the city "
"radius."),
extra_name_translation(preq->source.value.extra));
} else {
cat_snprintf(buf, bufsz,
Q_("?extra:Prevented by %s on any tile within the city "
"radius."),
extra_name_translation(preq->source.value.extra));
}
return TRUE;
case REQ_RANGE_TRADE_ROUTE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?extra:Requires %s on a tile within the city "
"radius, or the city radius of a trade partner."),
extra_name_translation(preq->source.value.extra));
} else {
cat_snprintf(buf, bufsz,
Q_("?extra:Prevented by %s on any tile within the city "
"radius or the city radius of a trade partner."),
extra_name_translation(preq->source.value.extra));
}
return TRUE;
case REQ_RANGE_CONTINENT:
case REQ_RANGE_PLAYER:
case REQ_RANGE_TEAM:
case REQ_RANGE_ALLIANCE:
case REQ_RANGE_WORLD:
case REQ_RANGE_COUNT:
/* 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_good(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_CITY:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, Q_("?good:Requires import of %s."),
goods_name_translation(preq->source.value.good));
} else {
cat_snprintf(buf, bufsz, Q_("?goods:Prevented by import of %s."),
goods_name_translation(preq->source.value.good));
}
return TRUE;
case REQ_RANGE_LOCAL:
case REQ_RANGE_TILE:
case REQ_RANGE_CADJACENT:
case REQ_RANGE_ADJACENT:
case REQ_RANGE_TRADE_ROUTE:
case REQ_RANGE_CONTINENT:
case REQ_RANGE_PLAYER:
case REQ_RANGE_TEAM:
case REQ_RANGE_ALLIANCE:
case REQ_RANGE_WORLD:
case REQ_RANGE_COUNT:
/* 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_tiledef(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,
_("Only applies to \"%s\" tiledef."),
tiledef_name_translation(preq->source.value.tiledef));
} else {
cat_snprintf(buf, bufsz,
_("Does not apply to \"%s\" tiledef."),
tiledef_name_translation(preq->source.value.tiledef));
}
return TRUE;
case REQ_RANGE_TILE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?tiledef:Requires %s on the tile."),
tiledef_name_translation(preq->source.value.tiledef));
} else {
cat_snprintf(buf, bufsz,
Q_("?tiledef:Prevented by %s on the tile."),
tiledef_name_translation(preq->source.value.tiledef));
}
return TRUE;
case REQ_RANGE_CADJACENT:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?tiledef:Requires %s on the tile or a cardinally "
"adjacent tile."),
tiledef_name_translation(preq->source.value.tiledef));
} else {
cat_snprintf(buf, bufsz,
Q_("?tiledef:Prevented by %s on the tile or any cardinally "
"adjacent tile."),
tiledef_name_translation(preq->source.value.tiledef));
}
return TRUE;
case REQ_RANGE_ADJACENT:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?tiledef:Requires %s on the tile or an adjacent "
"tile."),
tiledef_name_translation(preq->source.value.tiledef));
} else {
cat_snprintf(buf, bufsz,
Q_("?tiledef:Prevented by %s on the tile or any adjacent "
"tile."),
tiledef_name_translation(preq->source.value.tiledef));
}
return TRUE;
case REQ_RANGE_CITY:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?tiledef:Requires %s on a tile within the city "
"radius."),
tiledef_name_translation(preq->source.value.tiledef));
} else {
cat_snprintf(buf, bufsz,
Q_("?tiledef:Prevented by %s on any tile within the city "
"radius."),
tiledef_name_translation(preq->source.value.tiledef));
}
return TRUE;
case REQ_RANGE_TRADE_ROUTE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?tiledef:Requires %s on a tile within the city "
"radius, or the city radius of a trade partner."),
tiledef_name_translation(preq->source.value.tiledef));
} else {
cat_snprintf(buf, bufsz,
Q_("?tiledef:Prevented by %s on any tile within the city "
"radius or the city radius of a trade partner."),
tiledef_name_translation(preq->source.value.tiledef));
}
return TRUE;
case REQ_RANGE_CONTINENT:
case REQ_RANGE_PLAYER:
case REQ_RANGE_TEAM:
case REQ_RANGE_ALLIANCE:
case REQ_RANGE_WORLD:
case REQ_RANGE_COUNT:
/* 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_terrain(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
const char *prefix)
{
switch (preq->range) {
case REQ_RANGE_TILE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz, Q_("?terrain:Requires %s on the tile."),
terrain_name_translation(preq->source.value.terrain));
} else {
cat_snprintf(buf, bufsz, Q_("?terrain:Prevented by %s on the tile."),
terrain_name_translation(preq->source.value.terrain));
}
return TRUE;
case REQ_RANGE_CADJACENT:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?terrain:Requires %s on the tile or a cardinally "
"adjacent tile."),
terrain_name_translation(preq->source.value.terrain));
} else {
cat_snprintf(buf, bufsz,
Q_("?terrain:Prevented by %s on the tile or any "
"cardinally adjacent tile."),
terrain_name_translation(preq->source.value.terrain));
}
return TRUE;
case REQ_RANGE_ADJACENT:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?terrain:Requires %s on the tile or an adjacent "
"tile."),
terrain_name_translation(preq->source.value.terrain));
} else {
cat_snprintf(buf, bufsz,
Q_("?terrain:Prevented by %s on the tile or any "
"adjacent tile."),
terrain_name_translation(preq->source.value.terrain));
}
return TRUE;
case REQ_RANGE_CITY:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?terrain:Requires %s on a tile within the city "
"radius."),
terrain_name_translation(preq->source.value.terrain));
} else {
cat_snprintf(buf, bufsz,
Q_("?terrain:Prevented by %s on any tile within the city "
"radius."),
terrain_name_translation(preq->source.value.terrain));
}
return TRUE;
case REQ_RANGE_TRADE_ROUTE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
Q_("?terrain:Requires %s on a tile within the city "
"radius, or the city radius of a trade partner."),
terrain_name_translation(preq->source.value.terrain));
} else {
cat_snprintf(buf, bufsz,
Q_("?terrain:Prevented by %s on any tile within the city "
"radius or the city radius of a trade partner."),
terrain_name_translation(preq->source.value.terrain));
}
return TRUE;
case REQ_RANGE_CONTINENT:
case REQ_RANGE_PLAYER:
case REQ_RANGE_TEAM:
case REQ_RANGE_ALLIANCE:
case REQ_RANGE_WORLD:
case REQ_RANGE_LOCAL:
case REQ_RANGE_COUNT:
/* 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_nation(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: "... playing as the Swedes." */
_("Requires that you are playing as the %s."),
nation_plural_translation(preq->source.value.nation));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: "... playing as the Turks." */
_("Requires that you are not playing as the %s."),
nation_plural_translation(preq->source.value.nation));
}
return TRUE;
case REQ_RANGE_TEAM:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: "... same team as the Indonesians." */
_("Requires that you are on the same team as "
"the %s."),
nation_plural_translation(preq->source.value.nation));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: "... same team as the Greeks." */
_("Requires that you are not on the same team as "
"the %s."),
nation_plural_translation(preq->source.value.nation));
}
return TRUE;
case REQ_RANGE_ALLIANCE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: "... allied with the Koreans." */
_("Requires that you are allied with the %s."),
nation_plural_translation(preq->source.value.nation));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: "... allied with the Danes." */
_("Requires that you are not allied with the %s."),
nation_plural_translation(preq->source.value.nation));
}
return TRUE;
case REQ_RANGE_WORLD:
fc_strlcat(buf, prefix, bufsz);
if (preq->survives) {
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: "Requires the Apaches to have ..." */
_("Requires the %s to have been in the game."),
nation_plural_translation(preq->source.value.nation));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: "Requires the Celts never to have ..." */
_("Requires the %s never to have been in the "
"game."),
nation_plural_translation(preq->source.value.nation));
}
} else {
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: "Requires the Belgians in the game." */
_("Requires the %s in the game."),
nation_plural_translation(preq->source.value.nation));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: "Requires that the Russians are not ... */
_("Requires that the %s are not in the game."),
nation_plural_translation(preq->source.value.nation));
}
}
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;
}
/*************************************************************//**
Append text for a requirement type.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_nation_group(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: nation group: "... playing African nation." */
_("Requires that you are playing %s nation."),
nation_group_name_translation(preq->source.value.nationgroup));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: nation group: "... playing Imaginary nation." */
_("Prevented if you are playing %s nation."),
nation_group_name_translation(preq->source.value.nationgroup));
}
return TRUE;
case REQ_RANGE_TEAM:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: nation group: "Requires Medieval nation ..." */
_("Requires %s nation on your team."),
nation_group_name_translation(preq->source.value.nationgroup));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: nation group: "Prevented by Medieval nation ..." */
_("Prevented by %s nation on your team."),
nation_group_name_translation(preq->source.value.nationgroup));
}
return TRUE;
case REQ_RANGE_ALLIANCE:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: nation group: "Requires Modern nation ..." */
_("Requires %s nation in alliance with you."),
nation_group_name_translation(preq->source.value.nationgroup));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: nation group: "Prevented by Modern nation ..." */
_("Prevented if %s nation is in alliance with you."),
nation_group_name_translation(preq->source.value.nationgroup));
}
return TRUE;
case REQ_RANGE_WORLD:
fc_strlcat(buf, prefix, bufsz);
if (preq->present) {
cat_snprintf(buf, bufsz,
/* TRANS: nation group: "Requires Asian nation ..." */
_("Requires %s nation in the game."),
nation_group_name_translation(preq->source.value.nationgroup));
} else {
cat_snprintf(buf, bufsz,
/* TRANS: nation group: "Prevented by Asian nation ..." */
_("Prevented by %s nation in the game."),
nation_group_name_translation(preq->source.value.nationgroup));
}
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;
}
/*************************************************************//**
Append text for a requirement type.
returns TRUE if success, FALSE if any problem or "Not supported".
*****************************************************************/
static bool req_text_style(char *buf, size_t bufsz,
struct player *pplayer,
const struct requirement *preq,
... This diff was truncated because it exceeds the maximum size that can be displayed.
    (1-1/1)