Freeciv-3.4
Loading...
Searching...
No Matches
reqtext.c
Go to the documentation of this file.
1/****************************************************************************
2 Freeciv - Copyright (C) 2004 - The Freeciv Team
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2, or (at your option)
6 any later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12****************************************************************************/
13
14#ifdef HAVE_CONFIG_H
15#include <fc_config.h>
16#endif
17
18/* utility */
19#include "astring.h"
20#include "fcintl.h"
21
22/* common */
23#include "achievements.h"
24#include "actions.h"
25#include "calendar.h"
26#include "counters.h"
27#include "extras.h"
28#include "government.h"
29#include "map.h"
30#include "movement.h"
31#include "nation.h"
32#include "player.h"
33#include "requirements.h"
34#include "server_settings.h"
35#include "specialist.h"
36#include "terrain.h"
37#include "tiledef.h"
38
39#include "reqtext.h"
40
41
42/*************************************************************/
47static bool req_text_counter(char *buf, size_t bufsz,
48 struct player *pplayer,
49 const struct requirement *preq,
50 const char *prefix)
51{
52 if (preq->present) {
53 fc_strlcat(buf, prefix, bufsz);
55 _("Requires counter %s to achieve at minimum %d value."),
56 counter_rule_name(preq->source.value.counter),
57 preq->source.value.counter->checkpoint);
58 } else {
59 fc_strlcat(buf, prefix, bufsz);
61 _("Requires counter %s to be less than %d value."),
62 counter_rule_name(preq->source.value.counter),
63 preq->source.value.counter->checkpoint - 1);
64 }
65 return TRUE;
66}
67
68/*************************************************************/
73static bool req_text_advance(char *buf, size_t bufsz,
74 struct player *pplayer,
75 const struct requirement *preq,
76 const char *prefix)
77{
78 switch (preq->range) {
80 fc_strlcat(buf, prefix, bufsz);
81 if (preq->present) {
83 _("Requires knowledge of the technology %s."),
84 advance_name_translation(preq->source.value.advance));
85 } else {
87 _("Prevented by knowledge of the technology %s."),
88 advance_name_translation(preq->source.value.advance));
89 }
90 return TRUE;
91 case REQ_RANGE_TEAM:
92 fc_strlcat(buf, prefix, bufsz);
93 if (preq->present) {
95 _("Requires that a player on your team knows the "
96 "technology %s."),
97 advance_name_translation(preq->source.value.advance));
98 } else {
100 _("Prevented if any player on your team knows the "
101 "technology %s."),
102 advance_name_translation(preq->source.value.advance));
103 }
104 return TRUE;
106 fc_strlcat(buf, prefix, bufsz);
107 if (preq->present) {
109 _("Requires that a player allied to you knows the "
110 "technology %s."),
111 advance_name_translation(preq->source.value.advance));
112 } else {
114 _("Prevented if any player allied to you knows the "
115 "technology %s."),
116 advance_name_translation(preq->source.value.advance));
117 }
118 return TRUE;
119 case REQ_RANGE_WORLD:
120 fc_strlcat(buf, prefix, bufsz);
121 if (preq->survives) {
122 if (preq->present) {
124 _("Requires that someone has discovered the "
125 "technology %s."),
126 advance_name_translation(preq->source.value.advance));
127 } else {
129 _("Requires that no-one has yet discovered the "
130 "technology %s."),
131 advance_name_translation(preq->source.value.advance));
132 }
133 } else {
134 if (preq->present) {
136 _("Requires that some player knows the "
137 "technology %s."),
138 advance_name_translation(preq->source.value.advance));
139 } else {
141 _("Requires that no player knows the "
142 "technology %s."),
143 advance_name_translation(preq->source.value.advance));
144 }
145 }
146 return TRUE;
147 case REQ_RANGE_LOCAL:
148 case REQ_RANGE_TILE:
151 case REQ_RANGE_CITY:
154 case REQ_RANGE_COUNT:
155 /* Not supported. */
156 return FALSE;
157 }
158 return TRUE;
159}
160
161/*************************************************************/
166static bool req_text_techflag(char *buf, size_t bufsz,
167 struct player *pplayer,
168 const struct requirement *preq,
169 const char *prefix)
170{
171 switch (preq->range) {
172 case REQ_RANGE_PLAYER:
173 fc_strlcat(buf, prefix, bufsz);
174 if (preq->present) {
176 /* TRANS: %s is a (translatable) tech flag. */
177 _("Requires knowledge of a technology with the "
178 "\"%s\" flag."),
179 tech_flag_id_translated_name(preq->source.value.techflag));
180 } else {
182 /* TRANS: %s is a (translatable) tech flag. */
183 _("Prevented by knowledge of any technology with the "
184 "\"%s\" flag."),
185 tech_flag_id_translated_name(preq->source.value.techflag));
186 }
187 return TRUE;
188 case REQ_RANGE_TEAM:
189 fc_strlcat(buf, prefix, bufsz);
190 if (preq->present) {
192 /* TRANS: %s is a (translatable) tech flag. */
193 _("Requires that a player on your team knows "
194 "a technology with the \"%s\" flag."),
195 tech_flag_id_translated_name(preq->source.value.techflag));
196 } else {
198 /* TRANS: %s is a (translatable) tech flag. */
199 _("Prevented if any player on your team knows "
200 "any technology with the \"%s\" flag."),
201 tech_flag_id_translated_name(preq->source.value.techflag));
202 }
203 return TRUE;
205 fc_strlcat(buf, prefix, bufsz);
206 if (preq->present) {
208 /* TRANS: %s is a (translatable) tech flag. */
209 _("Requires that a player allied to you knows "
210 "a technology with the \"%s\" flag."),
211 tech_flag_id_translated_name(preq->source.value.techflag));
212 } else {
214 /* TRANS: %s is a (translatable) tech flag. */
215 _("Prevented if any player allied to you knows "
216 "any technology with the \"%s\" flag."),
217 tech_flag_id_translated_name(preq->source.value.techflag));
218 }
219 return TRUE;
220 case REQ_RANGE_WORLD:
221 fc_strlcat(buf, prefix, bufsz);
222 if (preq->present) {
224 /* TRANS: %s is a (translatable) tech flag. */
225 _("Requires that some player knows a technology "
226 "with the \"%s\" flag."),
227 tech_flag_id_translated_name(preq->source.value.techflag));
228 } else {
230 /* TRANS: %s is a (translatable) tech flag. */
231 _("Requires that no player knows any technology with "
232 "the \"%s\" flag."),
233 tech_flag_id_translated_name(preq->source.value.techflag));
234 }
235 return TRUE;
236 case REQ_RANGE_LOCAL:
237 case REQ_RANGE_TILE:
240 case REQ_RANGE_CITY:
243 case REQ_RANGE_COUNT:
244 /* Not supported. */
245 return FALSE;
246 }
247 return TRUE;
248}
249
250/*************************************************************/
255static bool req_text_government(char *buf, size_t bufsz,
256 struct player *pplayer,
257 const struct requirement *preq,
258 const char *prefix)
259{
260 if (preq->range != REQ_RANGE_PLAYER) {
261 return FALSE;
262 }
263 fc_strlcat(buf, prefix, bufsz);
264 if (preq->present) {
265 cat_snprintf(buf, bufsz, _("Requires the %s government."),
266 government_name_translation(preq->source.value.govern));
267 } else {
268 cat_snprintf(buf, bufsz, _("Not available under the %s government."),
269 government_name_translation(preq->source.value.govern));
270 }
271 return TRUE;
272}
273
274/*************************************************************/
279static bool req_text_government_flag(char *buf, size_t bufsz,
280 struct player *pplayer,
281 const struct requirement *preq,
282 const char *prefix)
283{
284 if (preq->range != REQ_RANGE_PLAYER) {
285 return FALSE;
286 }
287 fc_strlcat(buf, prefix, bufsz);
288 if (preq->present) {
289 cat_snprintf(buf, bufsz, _("Requires a %s government."),
290 gov_flag_id_translated_name(preq->source.value.govflag));
291 } else {
292 cat_snprintf(buf, bufsz, _("Not available under a %s government."),
293 gov_flag_id_translated_name(preq->source.value.govflag));
294 }
295 return TRUE;
296}
297
298/*************************************************************/
303static bool req_text_achievement(char *buf, size_t bufsz,
304 struct player *pplayer,
305 const struct requirement *preq,
306 const char *prefix)
307{
308 switch (preq->range) {
309 case REQ_RANGE_PLAYER:
310 fc_strlcat(buf, prefix, bufsz);
311 if (preq->present) {
312 cat_snprintf(buf, bufsz, _("Requires you to have achieved \"%s\"."),
313 achievement_name_translation(preq->source.value.achievement));
314 } else {
315 cat_snprintf(buf, bufsz, _("Not available once you have achieved "
316 "\"%s\"."),
317 achievement_name_translation(preq->source.value.achievement));
318 }
319 return TRUE;
320 case REQ_RANGE_TEAM:
321 fc_strlcat(buf, prefix, bufsz);
322 if (preq->present) {
323 cat_snprintf(buf, bufsz, _("Requires that at least one of your "
324 "team-mates has achieved \"%s\"."),
325 achievement_name_translation(preq->source.value.achievement));
326 } else {
327 cat_snprintf(buf, bufsz, _("Not available if any of your team-mates "
328 "has achieved \"%s\"."),
329 achievement_name_translation(preq->source.value.achievement));
330 }
331 return TRUE;
333 fc_strlcat(buf, prefix, bufsz);
334 if (preq->present) {
335 cat_snprintf(buf, bufsz, _("Requires that at least one of your allies "
336 "has achieved \"%s\"."),
337 achievement_name_translation(preq->source.value.achievement));
338 } else {
339 cat_snprintf(buf, bufsz, _("Not available if any of your allies has "
340 "achieved \"%s\"."),
341 achievement_name_translation(preq->source.value.achievement));
342 }
343 return TRUE;
344 case REQ_RANGE_WORLD:
345 fc_strlcat(buf, prefix, bufsz);
346 if (preq->present) {
347 cat_snprintf(buf, bufsz, _("Requires that at least one player "
348 "has achieved \"%s\"."),
349 achievement_name_translation(preq->source.value.achievement));
350 } else {
351 cat_snprintf(buf, bufsz, _("Not available if any player has "
352 "achieved \"%s\"."),
353 achievement_name_translation(preq->source.value.achievement));
354 }
355 return TRUE;
356 case REQ_RANGE_LOCAL:
357 case REQ_RANGE_TILE:
360 case REQ_RANGE_CITY:
363 case REQ_RANGE_COUNT:
364 /* Not supported. */
365 return FALSE;
366 }
367
368 return TRUE;
369}
370
371/*************************************************************/
376static bool req_text_action(char *buf, size_t bufsz,
377 struct player *pplayer,
378 const struct requirement *preq,
379 const char *prefix)
380{
381 switch (preq->range) {
382 case REQ_RANGE_LOCAL:
383 fc_strlcat(buf, prefix, bufsz);
384 if (preq->present) {
385 cat_snprintf(buf, bufsz, _("Applies to the \"%s\" action."),
386 action_name_translation(preq->source.value.action));
387 } else {
388 cat_snprintf(buf, bufsz, _("Doesn't apply to the \"%s\""
389 " action."),
390 action_name_translation(preq->source.value.action));
391 }
392 return TRUE;
393 default:
394 /* Not supported. */
395 return FALSE;
396 }
397 return TRUE;
398}
399
400/*************************************************************/
405static bool req_text_impr_genus(char *buf, size_t bufsz,
406 struct player *pplayer,
407 const struct requirement *preq,
408 const char *prefix)
409{
410 switch (preq->range) {
411 case REQ_RANGE_LOCAL:
412 fc_strlcat(buf, prefix, bufsz);
413 if (preq->present) {
414 cat_snprintf(buf, bufsz, _("Applies to \"%s\" buildings."),
416 preq->source.value.impr_genus));
417 } else {
418 cat_snprintf(buf, bufsz, _("Doesn't apply to \"%s\" buildings."),
420 preq->source.value.impr_genus));
421 }
422 return TRUE;
423 default:
424 /* Not supported. */
425 return FALSE;
426 }
427 return TRUE;
428}
429
430/*************************************************************/
435static bool req_text_impr_flag(char *buf, size_t bufsz,
436 struct player *pplayer,
437 const struct requirement *preq,
438 const char *prefix)
439{
440 switch (preq->range) {
441 case REQ_RANGE_LOCAL:
442 fc_strlcat(buf, prefix, bufsz);
443 if (preq->present) {
444 cat_snprintf(buf, bufsz, _("Applies to \"%s\" buildings."),
446 preq->source.value.impr_flag));
447 } else {
448 cat_snprintf(buf, bufsz, _("Doesn't apply to \"%s\" buildings."),
450 preq->source.value.impr_flag));
451 }
452 return TRUE;
453 default:
454 /* Not supported. */
455 return FALSE;
456 }
457 return TRUE;
458}
459
460/*************************************************************/
465static bool req_text_player_flag(char *buf, size_t bufsz,
466 struct player *pplayer,
467 const struct requirement *preq,
468 const char *prefix)
469{
470 switch (preq->range) {
471 case REQ_RANGE_PLAYER:
472 fc_strlcat(buf, prefix, bufsz);
473 if (preq->present) {
474 cat_snprintf(buf, bufsz, _("Applies to players with \"%s\" flag."),
476 preq->source.value.plr_flag));
477 } else {
478 cat_snprintf(buf, bufsz, _("Doesn't apply to players with \"%s\" flag."),
480 preq->source.value.plr_flag));
481 }
482 return TRUE;
483 default:
484 /* Not supported. */
485 return FALSE;
486 }
487 return TRUE;
488}
489
490/*************************************************************/
495static bool req_text_player_state(char *buf, size_t bufsz,
496 struct player *pplayer,
497 const struct requirement *preq,
498 const char *prefix)
499{
500 switch (preq->range) {
501 case REQ_RANGE_PLAYER:
502 fc_strlcat(buf, prefix, bufsz);
503 if (preq->present) {
504 cat_snprintf(buf, bufsz, _("Applies to \"%s\" players."),
505 plrstate_type_translated_name(preq->source.value.plrstate));
506 } else {
507 cat_snprintf(buf, bufsz, _("Doesn't apply to \"%s\" players."),
508 plrstate_type_translated_name(preq->source.value.plrstate));
509 }
510 return TRUE;
511 default:
512 /* Not supported. */
513 return FALSE;
514 }
515 return TRUE;
516}
517
518/*************************************************************/
523static bool req_text_improvement(char *buf, size_t bufsz,
524 struct player *pplayer,
525 const struct requirement *preq,
526 const char *prefix)
527{
528 switch (preq->range) {
529 case REQ_RANGE_WORLD:
530 if (is_great_wonder(preq->source.value.building)) {
531 fc_strlcat(buf, prefix, bufsz);
532 if (preq->survives) {
533 if (preq->present) {
534 if (preq->source.kind == VUT_IMPROVEMENT
535 && can_improvement_go_obsolete(preq->source.value.building)) {
537 /* TRANS: %s is a wonder */
538 _("Requires that %s was built at some point, "
539 "and that it has not yet been rendered "
540 "obsolete."),
542 (preq->source.value.building));
543 } else {
545 /* TRANS: %s is a wonder */
546 _("Requires that %s was built at some point."),
548 (preq->source.value.building));
549 }
550 } else {
551 if (preq->source.kind == VUT_IMPROVEMENT
552 && can_improvement_go_obsolete(preq->source.value.building)) {
554 /* TRANS: %s is a wonder */
555 _("Prevented if %s has ever been built, "
556 "unless it would be obsolete."),
558 (preq->source.value.building));
559 } else {
561 /* TRANS: %s is a wonder */
562 _("Prevented if %s has ever been built."),
564 (preq->source.value.building));
565 }
566 }
567 } else {
568 /* Non-surviving requirement */
569 if (preq->present) {
570 if (preq->source.kind == VUT_IMPROVEMENT
571 && can_improvement_go_obsolete(preq->source.value.building)) {
573 /* TRANS: %s is a wonder */
574 _("Requires %s to be owned by any player "
575 "and not yet obsolete."),
577 (preq->source.value.building));
578 } else {
580 /* TRANS: %s is a wonder */
581 _("Requires %s to be owned by any player."),
583 (preq->source.value.building));
584 }
585 } else {
586 if (preq->source.kind == VUT_IMPROVEMENT
587 && can_improvement_go_obsolete(preq->source.value.building)) {
589 /* TRANS: %s is a wonder */
590 _("Prevented if %s is currently owned by "
591 "any player, unless it is obsolete."),
593 (preq->source.value.building));
594 } else {
596 /* TRANS: %s is a wonder */
597 _("Prevented if %s is currently owned by "
598 "any player."),
600 (preq->source.value.building));
601 }
602 }
603 }
604 return TRUE;
605 }
606 /* Non-great-wonder world-ranged requirements not supported */
607 return FALSE;
609 if (is_wonder(preq->source.value.building)) {
610 fc_strlcat(buf, prefix, bufsz);
611 if (preq->survives) {
612 if (preq->present) {
613 if (preq->source.kind == VUT_IMPROVEMENT
614 && can_improvement_go_obsolete(preq->source.value.building)) {
616 /* TRANS: %s is a wonder */
617 _("Requires someone who is currently allied to "
618 "you to have built %s at some point, and for "
619 "it not to have been rendered obsolete."),
621 (preq->source.value.building));
622 } else {
624 /* TRANS: %s is a wonder */
625 _("Requires someone who is currently allied to "
626 "you to have built %s at some point."),
628 (preq->source.value.building));
629 }
630 } else {
631 if (preq->source.kind == VUT_IMPROVEMENT
632 && can_improvement_go_obsolete(preq->source.value.building)) {
634 /* TRANS: %s is a wonder */
635 _("Prevented if someone currently allied to you "
636 "has ever built %s, unless it would be "
637 "obsolete."),
639 (preq->source.value.building));
640 } else {
642 /* TRANS: %s is a wonder */
643 _("Prevented if someone currently allied to you "
644 "has ever built %s."),
646 (preq->source.value.building));
647 }
648 }
649 } else {
650 /* Non-surviving requirement */
651 if (preq->present) {
652 if (preq->source.kind == VUT_IMPROVEMENT
653 && can_improvement_go_obsolete(preq->source.value.building)) {
655 /* TRANS: %s is a wonder */
656 _("Requires someone allied to you to own %s, "
657 "and for it not to have been rendered "
658 "obsolete."),
660 (preq->source.value.building));
661 } else {
663 /* TRANS: %s is a wonder */
664 _("Requires someone allied to you to own %s."),
666 (preq->source.value.building));
667 }
668 } else {
669 if (preq->source.kind == VUT_IMPROVEMENT
670 && can_improvement_go_obsolete(preq->source.value.building)) {
672 /* TRANS: %s is a wonder */
673 _("Prevented if someone allied to you owns %s, "
674 "unless it is obsolete."),
676 (preq->source.value.building));
677 } else {
679 /* TRANS: %s is a wonder */
680 _("Prevented if someone allied to you owns %s."),
682 (preq->source.value.building));
683 }
684 }
685 }
686 return TRUE;
687 }
688 /* Non-wonder alliance-ranged requirements not supported */
689 return FALSE;
690 case REQ_RANGE_TEAM:
691 if (is_wonder(preq->source.value.building)) {
692 fc_strlcat(buf, prefix, bufsz);
693 if (preq->survives) {
694 if (preq->present) {
695 if (preq->source.kind == VUT_IMPROVEMENT
696 && can_improvement_go_obsolete(preq->source.value.building)) {
698 /* TRANS: %s is a wonder */
699 _("Requires someone on your team to have "
700 "built %s at some point, and for it not "
701 "to have been rendered obsolete."),
703 (preq->source.value.building));
704 } else {
706 /* TRANS: %s is a wonder */
707 _("Requires someone on your team to have "
708 "built %s at some point."),
710 (preq->source.value.building));
711 }
712 } else {
713 if (preq->source.kind == VUT_IMPROVEMENT
714 && can_improvement_go_obsolete(preq->source.value.building)) {
716 /* TRANS: %s is a wonder */
717 _("Prevented if someone on your team has ever "
718 "built %s, unless it would be obsolete."),
720 (preq->source.value.building));
721 } else {
723 /* TRANS: %s is a wonder */
724 _("Prevented if someone on your team has ever "
725 "built %s."),
727 (preq->source.value.building));
728 }
729 }
730 } else {
731 /* Non-surviving requirement */
732 if (preq->present) {
733 if (preq->source.kind == VUT_IMPROVEMENT
734 && can_improvement_go_obsolete(preq->source.value.building)) {
736 /* TRANS: %s is a wonder */
737 _("Requires someone on your team to own %s, "
738 "and for it not to have been rendered "
739 "obsolete."),
741 (preq->source.value.building));
742 } else {
744 /* TRANS: %s is a wonder */
745 _("Requires someone on your team to own %s."),
747 (preq->source.value.building));
748 }
749 } else {
750 if (preq->source.kind == VUT_IMPROVEMENT
751 && can_improvement_go_obsolete(preq->source.value.building)) {
753 /* TRANS: %s is a wonder */
754 _("Prevented if someone on your team owns %s, "
755 "unless it is obsolete."),
757 (preq->source.value.building));
758 } else {
760 /* TRANS: %s is a wonder */
761 _("Prevented if someone on your team owns %s."),
763 (preq->source.value.building));
764 }
765 }
766 }
767 return TRUE;
768 }
769 /* Non-wonder team-ranged requirements not supported */
770 return FALSE;
771 case REQ_RANGE_PLAYER:
772 if (is_wonder(preq->source.value.building)) {
773 fc_strlcat(buf, prefix, bufsz);
774 if (preq->survives) {
775 if (preq->present) {
776 if (preq->source.kind == VUT_IMPROVEMENT
777 && can_improvement_go_obsolete(preq->source.value.building)) {
779 /* TRANS: %s is a wonder */
780 _("Requires you to have built %s at some point, "
781 "and for it not to have been rendered "
782 "obsolete."),
784 (preq->source.value.building));
785 } else {
787 /* TRANS: %s is a wonder */
788 _("Requires you to have built %s at some point."),
790 (preq->source.value.building));
791 }
792 } else {
793 if (preq->source.kind == VUT_IMPROVEMENT
794 && can_improvement_go_obsolete(preq->source.value.building)) {
796 /* TRANS: %s is a wonder */
797 _("Prevented if you have ever built %s, "
798 "unless it would be obsolete."),
800 (preq->source.value.building));
801 } else {
803 /* TRANS: %s is a wonder */
804 _("Prevented if you have ever built %s."),
806 (preq->source.value.building));
807 }
808 }
809 } else {
810 /* Non-surviving requirement */
811 if (preq->present) {
812 if (preq->source.kind == VUT_IMPROVEMENT
813 && can_improvement_go_obsolete(preq->source.value.building)) {
815 /* TRANS: %s is a wonder */
816 _("Requires you to own %s, which must not "
817 "be obsolete."),
819 (preq->source.value.building));
820 } else {
822 /* TRANS: %s is a wonder */
823 _("Requires you to own %s."),
825 (preq->source.value.building));
826 }
827 } else {
828 if (preq->source.kind == VUT_IMPROVEMENT
829 && can_improvement_go_obsolete(preq->source.value.building)) {
831 /* TRANS: %s is a wonder */
832 _("Prevented if you own %s, unless it is "
833 "obsolete."),
835 (preq->source.value.building));
836 } else {
838 /* TRANS: %s is a wonder */
839 _("Prevented if you own %s."),
841 (preq->source.value.building));
842 }
843 }
844 }
845 return TRUE;
846 }
847 /* Non-wonder player-ranged requirements not supported */
848 return FALSE;
850 if (is_wonder(preq->source.value.building)) {
851 fc_strlcat(buf, prefix, bufsz);
852 if (preq->present) {
853 if (preq->source.kind == VUT_IMPROVEMENT
854 && can_improvement_go_obsolete(preq->source.value.building)) {
856 /* TRANS: %s is a wonder */
857 _("Requires %s in one of your cities on the same "
858 "continent, and not yet obsolete."),
860 (preq->source.value.building));
861 } else {
863 /* TRANS: %s is a wonder */
864 _("Requires %s in one of your cities on the same "
865 "continent."),
867 (preq->source.value.building));
868 }
869 } else {
870 if (preq->source.kind == VUT_IMPROVEMENT
871 && can_improvement_go_obsolete(preq->source.value.building)) {
873 /* TRANS: %s is a wonder */
874 _("Prevented if %s is in one of your cities on the "
875 "same continent, unless it is obsolete."),
877 (preq->source.value.building));
878 } else {
880 /* TRANS: %s is a wonder */
881 _("Prevented if %s is in one of your cities on the "
882 "same continent."),
884 (preq->source.value.building));
885 }
886 }
887 return TRUE;
888 }
889 /* Surviving or non-wonder continent-ranged requirements not supported */
890 return FALSE;
892 fc_strlcat(buf, prefix, bufsz);
893 if (preq->present) {
894 if (preq->source.kind == VUT_IMPROVEMENT
895 && can_improvement_go_obsolete(preq->source.value.building)) {
896 /* Should only apply to wonders */
898 /* TRANS: %s is a building or wonder */
899 _("Requires %s in the city or a trade partner "
900 "(and not yet obsolete)."),
902 (preq->source.value.building));
903 } else {
905 /* TRANS: %s is a building or wonder */
906 _("Requires %s in the city or a trade partner."),
908 (preq->source.value.building));
909 }
910 } else {
911 if (preq->source.kind == VUT_IMPROVEMENT
912 && can_improvement_go_obsolete(preq->source.value.building)) {
913 /* Should only apply to wonders */
915 /* TRANS: %s is a building or wonder */
916 _("Prevented by %s in the city or a trade partner "
917 "(unless it is obsolete)."),
919 (preq->source.value.building));
920 } else {
922 /* TRANS: %s is a building or wonder */
923 _("Prevented by %s in the city or a trade partner."),
925 (preq->source.value.building));
926 }
927 }
928 return TRUE;
929 case REQ_RANGE_CITY:
930 fc_strlcat(buf, prefix, bufsz);
931 if (preq->present) {
932 if (preq->source.kind == VUT_IMPROVEMENT
933 && can_improvement_go_obsolete(preq->source.value.building)) {
934 /* Should only apply to wonders */
936 /* TRANS: %s is a building or wonder */
937 _("Requires %s in the city (and not yet obsolete)."),
939 (preq->source.value.building));
940 } else {
942 /* TRANS: %s is a building or wonder */
943 _("Requires %s in the city."),
945 (preq->source.value.building));
946 }
947 } else {
948 if (preq->source.kind == VUT_IMPROVEMENT
949 && can_improvement_go_obsolete(preq->source.value.building)) {
950 /* Should only apply to wonders */
952 /* TRANS: %s is a building or wonder */
953 _("Prevented by %s in the city (unless it is "
954 "obsolete)."),
956 (preq->source.value.building));
957 } else {
959 /* TRANS: %s is a building or wonder */
960 _("Prevented by %s in the city."),
962 (preq->source.value.building));
963 }
964 }
965 return TRUE;
966 case REQ_RANGE_LOCAL:
967 fc_strlcat(buf, prefix, bufsz);
968 if (preq->present) {
970 _("Only applies to \"%s\" buildings."),
972 (preq->source.value.building));
973 } else {
975 _("Does not apply to \"%s\" buildings."),
977 (preq->source.value.building));
978 }
979 return TRUE;
980 case REQ_RANGE_TILE:
981 fc_strlcat(buf, prefix, bufsz);
982 if (preq->present) {
984 _("Requires \"%s\" building in a city on the tile."),
986 (preq->source.value.building));
987 } else {
989 _("Prevented by \"%s\" building in a city on the tile."),
991 (preq->source.value.building));
992 }
993 return TRUE;
996 case REQ_RANGE_COUNT:
997 /* Not supported. */
998 return FALSE;
999 }
1000 return TRUE;
1001}
1002
1003/*************************************************************/
1008static bool req_text_extra(char *buf, size_t bufsz,
1009 struct player *pplayer,
1010 const struct requirement *preq,
1011 const char *prefix)
1012{
1013 switch (preq->range) {
1014 case REQ_RANGE_LOCAL:
1015 fc_strlcat(buf, prefix, bufsz);
1016 if (preq->present) {
1018 _("Only applies to \"%s\" extras."),
1019 extra_name_translation(preq->source.value.extra));
1020 } else {
1022 _("Does not apply to \"%s\" extras."),
1023 extra_name_translation(preq->source.value.extra));
1024 }
1025 return TRUE;
1026 case REQ_RANGE_TILE:
1027 fc_strlcat(buf, prefix, bufsz);
1028 if (preq->present) {
1030 Q_("?extra:Requires %s on the tile."),
1031 extra_name_translation(preq->source.value.extra));
1032 } else {
1034 Q_("?extra:Prevented by %s on the tile."),
1035 extra_name_translation(preq->source.value.extra));
1036 }
1037 return TRUE;
1039 fc_strlcat(buf, prefix, bufsz);
1040 if (preq->present) {
1042 Q_("?extra:Requires %s on the tile or a cardinally "
1043 "adjacent tile."),
1044 extra_name_translation(preq->source.value.extra));
1045 } else {
1047 Q_("?extra:Prevented by %s on the tile or any cardinally "
1048 "adjacent tile."),
1049 extra_name_translation(preq->source.value.extra));
1050 }
1051 return TRUE;
1052 case REQ_RANGE_ADJACENT:
1053 fc_strlcat(buf, prefix, bufsz);
1054 if (preq->present) {
1056 Q_("?extra:Requires %s on the tile or an adjacent "
1057 "tile."),
1058 extra_name_translation(preq->source.value.extra));
1059 } else {
1061 Q_("?extra:Prevented by %s on the tile or any adjacent "
1062 "tile."),
1063 extra_name_translation(preq->source.value.extra));
1064 }
1065 return TRUE;
1066 case REQ_RANGE_CITY:
1067 fc_strlcat(buf, prefix, bufsz);
1068 if (preq->present) {
1070 Q_("?extra:Requires %s on a tile within the city "
1071 "radius."),
1072 extra_name_translation(preq->source.value.extra));
1073 } else {
1075 Q_("?extra:Prevented by %s on any tile within the city "
1076 "radius."),
1077 extra_name_translation(preq->source.value.extra));
1078 }
1079 return TRUE;
1081 fc_strlcat(buf, prefix, bufsz);
1082 if (preq->present) {
1084 Q_("?extra:Requires %s on a tile within the city "
1085 "radius, or the city radius of a trade partner."),
1086 extra_name_translation(preq->source.value.extra));
1087 } else {
1089 Q_("?extra:Prevented by %s on any tile within the city "
1090 "radius or the city radius of a trade partner."),
1091 extra_name_translation(preq->source.value.extra));
1092 }
1093 return TRUE;
1095 case REQ_RANGE_PLAYER:
1096 case REQ_RANGE_TEAM:
1097 case REQ_RANGE_ALLIANCE:
1098 case REQ_RANGE_WORLD:
1099 case REQ_RANGE_COUNT:
1100 /* Not supported. */
1101 return FALSE;
1102 }
1103 return TRUE;
1104}
1105
1106/*************************************************************/
1111static bool req_text_good(char *buf, size_t bufsz,
1112 struct player *pplayer,
1113 const struct requirement *preq,
1114 const char *prefix)
1115{
1116 switch (preq->range) {
1117 case REQ_RANGE_CITY:
1118 fc_strlcat(buf, prefix, bufsz);
1119 if (preq->present) {
1120 cat_snprintf(buf, bufsz, Q_("?good:Requires import of %s."),
1121 goods_name_translation(preq->source.value.good));
1122 } else {
1123 cat_snprintf(buf, bufsz, Q_("?goods:Prevented by import of %s."),
1124 goods_name_translation(preq->source.value.good));
1125 }
1126 return TRUE;
1127 case REQ_RANGE_LOCAL:
1128 case REQ_RANGE_TILE:
1130 case REQ_RANGE_ADJACENT:
1133 case REQ_RANGE_PLAYER:
1134 case REQ_RANGE_TEAM:
1135 case REQ_RANGE_ALLIANCE:
1136 case REQ_RANGE_WORLD:
1137 case REQ_RANGE_COUNT:
1138 /* Not supported. */
1139 return FALSE;
1140 }
1141 return TRUE;
1142}
1143
1144/*************************************************************/
1149static bool req_text_tiledef(char *buf, size_t bufsz,
1150 struct player *pplayer,
1151 const struct requirement *preq,
1152 const char *prefix)
1153{
1154 switch (preq->range) {
1155 case REQ_RANGE_LOCAL:
1156 fc_strlcat(buf, prefix, bufsz);
1157 if (preq->present) {
1159 _("Only applies to \"%s\" tiledef."),
1160 tiledef_name_translation(preq->source.value.tiledef));
1161 } else {
1163 _("Does not apply to \"%s\" tiledef."),
1164 tiledef_name_translation(preq->source.value.tiledef));
1165 }
1166 return TRUE;
1167 case REQ_RANGE_TILE:
1168 fc_strlcat(buf, prefix, bufsz);
1169 if (preq->present) {
1171 Q_("?tiledef:Requires %s on the tile."),
1172 tiledef_name_translation(preq->source.value.tiledef));
1173 } else {
1175 Q_("?tiledef:Prevented by %s on the tile."),
1176 tiledef_name_translation(preq->source.value.tiledef));
1177 }
1178 return TRUE;
1180 fc_strlcat(buf, prefix, bufsz);
1181 if (preq->present) {
1183 Q_("?tiledef:Requires %s on the tile or a cardinally "
1184 "adjacent tile."),
1185 tiledef_name_translation(preq->source.value.tiledef));
1186 } else {
1188 Q_("?tiledef:Prevented by %s on the tile or any cardinally "
1189 "adjacent tile."),
1190 tiledef_name_translation(preq->source.value.tiledef));
1191 }
1192 return TRUE;
1193 case REQ_RANGE_ADJACENT:
1194 fc_strlcat(buf, prefix, bufsz);
1195 if (preq->present) {
1197 Q_("?tiledef:Requires %s on the tile or an adjacent "
1198 "tile."),
1199 tiledef_name_translation(preq->source.value.tiledef));
1200 } else {
1202 Q_("?tiledef:Prevented by %s on the tile or any adjacent "
1203 "tile."),
1204 tiledef_name_translation(preq->source.value.tiledef));
1205 }
1206 return TRUE;
1207 case REQ_RANGE_CITY:
1208 fc_strlcat(buf, prefix, bufsz);
1209 if (preq->present) {
1211 Q_("?tiledef:Requires %s on a tile within the city "
1212 "radius."),
1213 tiledef_name_translation(preq->source.value.tiledef));
1214 } else {
1216 Q_("?tiledef:Prevented by %s on any tile within the city "
1217 "radius."),
1218 tiledef_name_translation(preq->source.value.tiledef));
1219 }
1220 return TRUE;
1222 fc_strlcat(buf, prefix, bufsz);
1223 if (preq->present) {
1225 Q_("?tiledef:Requires %s on a tile within the city "
1226 "radius, or the city radius of a trade partner."),
1227 tiledef_name_translation(preq->source.value.tiledef));
1228 } else {
1230 Q_("?tiledef:Prevented by %s on any tile within the city "
1231 "radius or the city radius of a trade partner."),
1232 tiledef_name_translation(preq->source.value.tiledef));
1233 }
1234 return TRUE;
1236 case REQ_RANGE_PLAYER:
1237 case REQ_RANGE_TEAM:
1238 case REQ_RANGE_ALLIANCE:
1239 case REQ_RANGE_WORLD:
1240 case REQ_RANGE_COUNT:
1241 /* Not supported. */
1242 return FALSE;
1243 }
1244 return TRUE;
1245}
1246
1247/*************************************************************/
1252static bool req_text_terrain(char *buf, size_t bufsz,
1253 struct player *pplayer,
1254 const struct requirement *preq,
1255 const char *prefix)
1256{
1257 switch (preq->range) {
1258 case REQ_RANGE_TILE:
1259 fc_strlcat(buf, prefix, bufsz);
1260 if (preq->present) {
1261 cat_snprintf(buf, bufsz, Q_("?terrain:Requires %s on the tile."),
1262 terrain_name_translation(preq->source.value.terrain));
1263 } else {
1264 cat_snprintf(buf, bufsz, Q_("?terrain:Prevented by %s on the tile."),
1265 terrain_name_translation(preq->source.value.terrain));
1266 }
1267 return TRUE;
1269 fc_strlcat(buf, prefix, bufsz);
1270 if (preq->present) {
1272 Q_("?terrain:Requires %s on the tile or a cardinally "
1273 "adjacent tile."),
1274 terrain_name_translation(preq->source.value.terrain));
1275 } else {
1277 Q_("?terrain:Prevented by %s on the tile or any "
1278 "cardinally adjacent tile."),
1279 terrain_name_translation(preq->source.value.terrain));
1280 }
1281 return TRUE;
1282 case REQ_RANGE_ADJACENT:
1283 fc_strlcat(buf, prefix, bufsz);
1284 if (preq->present) {
1286 Q_("?terrain:Requires %s on the tile or an adjacent "
1287 "tile."),
1288 terrain_name_translation(preq->source.value.terrain));
1289 } else {
1291 Q_("?terrain:Prevented by %s on the tile or any "
1292 "adjacent tile."),
1293 terrain_name_translation(preq->source.value.terrain));
1294 }
1295 return TRUE;
1296 case REQ_RANGE_CITY:
1297 fc_strlcat(buf, prefix, bufsz);
1298 if (preq->present) {
1300 Q_("?terrain:Requires %s on a tile within the city "
1301 "radius."),
1302 terrain_name_translation(preq->source.value.terrain));
1303 } else {
1305 Q_("?terrain:Prevented by %s on any tile within the city "
1306 "radius."),
1307 terrain_name_translation(preq->source.value.terrain));
1308 }
1309 return TRUE;
1311 fc_strlcat(buf, prefix, bufsz);
1312 if (preq->present) {
1314 Q_("?terrain:Requires %s on a tile within the city "
1315 "radius, or the city radius of a trade partner."),
1316 terrain_name_translation(preq->source.value.terrain));
1317 } else {
1319 Q_("?terrain:Prevented by %s on any tile within the city "
1320 "radius or the city radius of a trade partner."),
1321 terrain_name_translation(preq->source.value.terrain));
1322 }
1323 return TRUE;
1325 case REQ_RANGE_PLAYER:
1326 case REQ_RANGE_TEAM:
1327 case REQ_RANGE_ALLIANCE:
1328 case REQ_RANGE_WORLD:
1329 case REQ_RANGE_LOCAL:
1330 case REQ_RANGE_COUNT:
1331 /* Not supported. */
1332 return FALSE;
1333 }
1334return TRUE;
1335}
1336
1337/*************************************************************/
1342static bool req_text_nation(char *buf, size_t bufsz,
1343 struct player *pplayer,
1344 const struct requirement *preq,
1345 const char *prefix)
1346{
1347 switch (preq->range) {
1348 case REQ_RANGE_PLAYER:
1349 fc_strlcat(buf, prefix, bufsz);
1350 if (preq->present) {
1352 /* TRANS: "... playing as the Swedes." */
1353 _("Requires that you are playing as the %s."),
1354 nation_plural_translation(preq->source.value.nation));
1355 } else {
1357 /* TRANS: "... playing as the Turks." */
1358 _("Requires that you are not playing as the %s."),
1359 nation_plural_translation(preq->source.value.nation));
1360 }
1361 return TRUE;
1362 case REQ_RANGE_TEAM:
1363 fc_strlcat(buf, prefix, bufsz);
1364 if (preq->present) {
1366 /* TRANS: "... same team as the Indonesians." */
1367 _("Requires that you are on the same team as "
1368 "the %s."),
1369 nation_plural_translation(preq->source.value.nation));
1370 } else {
1372 /* TRANS: "... same team as the Greeks." */
1373 _("Requires that you are not on the same team as "
1374 "the %s."),
1375 nation_plural_translation(preq->source.value.nation));
1376 }
1377 return TRUE;
1378 case REQ_RANGE_ALLIANCE:
1379 fc_strlcat(buf, prefix, bufsz);
1380 if (preq->present) {
1382 /* TRANS: "... allied with the Koreans." */
1383 _("Requires that you are allied with the %s."),
1384 nation_plural_translation(preq->source.value.nation));
1385 } else {
1387 /* TRANS: "... allied with the Danes." */
1388 _("Requires that you are not allied with the %s."),
1389 nation_plural_translation(preq->source.value.nation));
1390 }
1391 return TRUE;
1392 case REQ_RANGE_WORLD:
1393 fc_strlcat(buf, prefix, bufsz);
1394 if (preq->survives) {
1395 if (preq->present) {
1397 /* TRANS: "Requires the Apaches to have ..." */
1398 _("Requires the %s to have been in the game."),
1399 nation_plural_translation(preq->source.value.nation));
1400 } else {
1402 /* TRANS: "Requires the Celts never to have ..." */
1403 _("Requires the %s never to have been in the "
1404 "game."),
1405 nation_plural_translation(preq->source.value.nation));
1406 }
1407 } else {
1408 if (preq->present) {
1410 /* TRANS: "Requires the Belgians in the game." */
1411 _("Requires the %s in the game."),
1412 nation_plural_translation(preq->source.value.nation));
1413 } else {
1415 /* TRANS: "Requires that the Russians are not ... */
1416 _("Requires that the %s are not in the game."),
1417 nation_plural_translation(preq->source.value.nation));
1418 }
1419 }
1420 return TRUE;
1421 case REQ_RANGE_LOCAL:
1422 case REQ_RANGE_TILE:
1424 case REQ_RANGE_ADJACENT:
1425 case REQ_RANGE_CITY:
1428 case REQ_RANGE_COUNT:
1429 /* Not supported. */
1430 return FALSE;
1431 }
1432 return TRUE;
1433}
1434
1435/*************************************************************/
1440static bool req_text_nation_group(char *buf, size_t bufsz,
1441 struct player *pplayer,
1442 const struct requirement *preq,
1443 const char *prefix)
1444{
1445 switch (preq->range) {
1446 case REQ_RANGE_PLAYER:
1447 fc_strlcat(buf, prefix, bufsz);
1448 if (preq->present) {
1450 /* TRANS: nation group: "... playing African nation." */
1451 _("Requires that you are playing %s nation."),
1452 nation_group_name_translation(preq->source.value.nationgroup));
1453 } else {
1455 /* TRANS: nation group: "... playing Imaginary nation." */
1456 _("Prevented if you are playing %s nation."),
1457 nation_group_name_translation(preq->source.value.nationgroup));
1458 }
1459 return TRUE;
1460 case REQ_RANGE_TEAM:
1461 fc_strlcat(buf, prefix, bufsz);
1462 if (preq->present) {
1464 /* TRANS: nation group: "Requires Medieval nation ..." */
1465 _("Requires %s nation on your team."),
1466 nation_group_name_translation(preq->source.value.nationgroup));
1467 } else {
1469 /* TRANS: nation group: "Prevented by Medieval nation ..." */
1470 _("Prevented by %s nation on your team."),
1471 nation_group_name_translation(preq->source.value.nationgroup));
1472 }
1473 return TRUE;
1474 case REQ_RANGE_ALLIANCE:
1475 fc_strlcat(buf, prefix, bufsz);
1476 if (preq->present) {
1478 /* TRANS: nation group: "Requires Modern nation ..." */
1479 _("Requires %s nation in alliance with you."),
1480 nation_group_name_translation(preq->source.value.nationgroup));
1481 } else {
1483 /* TRANS: nation group: "Prevented by Modern nation ..." */
1484 _("Prevented if %s nation is in alliance with you."),
1485 nation_group_name_translation(preq->source.value.nationgroup));
1486 }
1487 return TRUE;
1488 case REQ_RANGE_WORLD:
1489 fc_strlcat(buf, prefix, bufsz);
1490 if (preq->present) {
1492 /* TRANS: nation group: "Requires Asian nation ..." */
1493 _("Requires %s nation in the game."),
1494 nation_group_name_translation(preq->source.value.nationgroup));
1495 } else {
1497 /* TRANS: nation group: "Prevented by Asian nation ..." */
1498 _("Prevented by %s nation in the game."),
1499 nation_group_name_translation(preq->source.value.nationgroup));
1500 }
1501 return TRUE;
1502 case REQ_RANGE_LOCAL:
1503 case REQ_RANGE_TILE:
1505 case REQ_RANGE_ADJACENT:
1506 case REQ_RANGE_CITY:
1509 case REQ_RANGE_COUNT:
1510 /* Not supported. */
1511 return FALSE;
1512 }
1513 return TRUE;
1514}
1515
1516/*************************************************************/
1521static bool req_text_style(char *buf, size_t bufsz,
1522 struct player *pplayer,
1523 const struct requirement *preq,
1524 const char *prefix)
1525{
1526 if (preq->range != REQ_RANGE_PLAYER) {
1527 return FALSE;
1528 }
1529 fc_strlcat(buf, prefix, bufsz);
1530 if (preq->present) {
1532 /* TRANS: "Requires that you are playing Asian style
1533 * nation." */
1534 _("Requires that you are playing %s style nation."),
1535 style_name_translation(preq->source.value.style));
1536 } else {
1538 /* TRANS: "Requires that you are not playing Classical
1539 * style nation." */
1540 _("Requires that you are not playing %s style nation."),
1541 style_name_translation(preq->source.value.style));
1542 }
1543 return TRUE;
1544}
1545
1546/*************************************************************/
1551static bool req_text_nationality(char *buf, size_t bufsz,
1552 struct player *pplayer,
1553 const struct requirement *preq,
1554 const char *prefix)
1555{
1556 switch (preq->range) {
1558 fc_strlcat(buf, prefix, bufsz);
1559 if (preq->present) {
1561 /* TRANS: "Requires at least one Barbarian citizen ..." */
1562 _("Requires at least one %s citizen in the city or a "
1563 "trade partner."),
1564 nation_adjective_translation(preq->source.value.nationality));
1565 } else {
1567 /* TRANS: "... no Pirate citizens ..." */
1568 _("Requires that there are no %s citizens in "
1569 "the city or any trade partners."),
1570 nation_adjective_translation(preq->source.value.nationality));
1571 }
1572 return TRUE;
1573 case REQ_RANGE_CITY:
1574 fc_strlcat(buf, prefix, bufsz);
1575 if (preq->present) {
1577 /* TRANS: "Requires at least one Barbarian citizen ..." */
1578 _("Requires at least one %s citizen in the city."),
1579 nation_adjective_translation(preq->source.value.nationality));
1580 } else {
1582 /* TRANS: "... no Pirate citizens ..." */
1583 _("Requires that there are no %s citizens in "
1584 "the city."),
1585 nation_adjective_translation(preq->source.value.nationality));
1586 }
1587 return TRUE;
1588 case REQ_RANGE_WORLD:
1589 case REQ_RANGE_ALLIANCE:
1590 case REQ_RANGE_TEAM:
1591 case REQ_RANGE_PLAYER:
1592 case REQ_RANGE_LOCAL:
1593 case REQ_RANGE_TILE:
1595 case REQ_RANGE_ADJACENT:
1597 case REQ_RANGE_COUNT:
1598 /* Not supported. */
1599 return FALSE;
1600 }
1601 return TRUE;
1602}
1603
1604/*************************************************************/
1609static bool req_text_original_owner(char *buf, size_t bufsz,
1610 struct player *pplayer,
1611 const struct requirement *preq,
1612 const char *prefix)
1613{
1614 switch (preq->range) {
1615 case REQ_RANGE_CITY:
1616 fc_strlcat(buf, prefix, bufsz);
1617 if (preq->present) {
1619 _("Requires city to be founded by %s."),
1620 nation_adjective_translation(preq->source.value.origowner));
1621 } else {
1623 _("Requires that city was not originally owned by %s."),
1624 nation_adjective_translation(preq->source.value.origowner));
1625 }
1626 return TRUE;
1628 case REQ_RANGE_WORLD:
1629 case REQ_RANGE_ALLIANCE:
1630 case REQ_RANGE_TEAM:
1631 case REQ_RANGE_PLAYER:
1632 case REQ_RANGE_LOCAL:
1633 case REQ_RANGE_TILE:
1635 case REQ_RANGE_ADJACENT:
1637 case REQ_RANGE_COUNT:
1638 /* Not supported. */
1639 return FALSE;
1640 }
1641 return TRUE;
1642}
1643
1644/*************************************************************/
1649static bool req_text_diplrel(char *buf, size_t bufsz,
1650 struct player *pplayer,
1651 const struct requirement *preq,
1652 const char *prefix)
1653{
1654 switch (preq->range) {
1655 case REQ_RANGE_PLAYER:
1656 fc_strlcat(buf, prefix, bufsz);
1657 if (preq->present) {
1659 /* TRANS: in this and following strings, '%s' can be one
1660 * of a wide range of relationships; e.g., 'Peace',
1661 * 'Never met', 'Foreign', 'Hosts embassy',
1662 * 'Provided Casus Belli' */
1663 _("Requires that you have the relationship '%s' with at "
1664 "least one other living player."),
1665 diplrel_name_translation(preq->source.value.diplrel));
1666 } else {
1668 _("Requires that you do not have the relationship '%s' "
1669 "with any living player."),
1670 diplrel_name_translation(preq->source.value.diplrel));
1671 }
1672 return TRUE;
1673 case REQ_RANGE_TEAM:
1674 fc_strlcat(buf, prefix, bufsz);
1675 if (preq->present) {
1677 _("Requires that somebody on your team has the "
1678 "relationship '%s' with at least one other living "
1679 "player."),
1680 diplrel_name_translation(preq->source.value.diplrel));
1681 } else {
1683 _("Requires that nobody on your team has the "
1684 "relationship '%s' with any living player."),
1685 diplrel_name_translation(preq->source.value.diplrel));
1686 }
1687 return TRUE;
1688 case REQ_RANGE_ALLIANCE:
1689 fc_strlcat(buf, prefix, bufsz);
1690 if (preq->present) {
1692 _("Requires that somebody in your alliance has the "
1693 "relationship '%s' with at least one other living "
1694 "player."),
1695 diplrel_name_translation(preq->source.value.diplrel));
1696 } else {
1698 _("Requires that nobody in your alliance has the "
1699 "relationship '%s' with any living player."),
1700 diplrel_name_translation(preq->source.value.diplrel));
1701 }
1702 return TRUE;
1703 case REQ_RANGE_WORLD:
1704 fc_strlcat(buf, prefix, bufsz);
1705 if (preq->present) {
1707 _("Requires the relationship '%s' between two living "
1708 "players."),
1709 diplrel_name_translation(preq->source.value.diplrel));
1710 } else {
1712 _("Requires that no two living players have the "
1713 "relationship '%s'."),
1714 diplrel_name_translation(preq->source.value.diplrel));
1715 }
1716 return TRUE;
1717 case REQ_RANGE_LOCAL:
1718 fc_strlcat(buf, prefix, bufsz);
1719 if (preq->present) {
1721 _("Requires that you have the relationship '%s' with the "
1722 "other player."),
1723 diplrel_name_translation(preq->source.value.diplrel));
1724 } else {
1726 _("Requires that you do not have the relationship '%s' "
1727 "with the other player."),
1728 diplrel_name_translation(preq->source.value.diplrel));
1729 }
1730 return TRUE;
1731 case REQ_RANGE_TILE:
1733 case REQ_RANGE_ADJACENT:
1734 case REQ_RANGE_CITY:
1737 case REQ_RANGE_COUNT:
1738 /* Not supported. */
1739 return FALSE;
1740 }
1741 return TRUE;
1742}
1743
1744/*************************************************************/
1749static bool req_text_diplrel_tile(char *buf, size_t bufsz,
1750 struct player *pplayer,
1751 const struct requirement *preq,
1752 const char *prefix)
1753{
1754 switch (preq->range) {
1755 case REQ_RANGE_PLAYER:
1756 fc_strlcat(buf, prefix, bufsz);
1757 if (preq->present) {
1759 /* TRANS: in this and following strings, '%s' can be one
1760 * of a wide range of relationships; e.g., 'Peace',
1761 * 'Never met', 'Foreign', 'Hosts embassy',
1762 * 'Provided Casus Belli' */
1763 _("Requires that the tile owner has the relationship"
1764 " '%s' with at least one other living player."),
1765 diplrel_name_translation(preq->source.value.diplrel));
1766 } else {
1768 _("Requires that the tile owner does not have the"
1769 " relationship '%s' with any living player."),
1770 diplrel_name_translation(preq->source.value.diplrel));
1771 }
1772 return TRUE;
1773 case REQ_RANGE_TEAM:
1774 fc_strlcat(buf, prefix, bufsz);
1775 if (preq->present) {
1777 _("Requires that somebody on the tile owner's team"
1778 " has the relationship '%s' with at least one other"
1779 " living player."),
1780 diplrel_name_translation(preq->source.value.diplrel));
1781 } else {
1783 _("Requires that nobody on the tile owner's team has"
1784 " the relationship '%s' with any living player."),
1785 diplrel_name_translation(preq->source.value.diplrel));
1786 }
1787 return TRUE;
1788 case REQ_RANGE_ALLIANCE:
1789 fc_strlcat(buf, prefix, bufsz);
1790 if (preq->present) {
1792 _("Requires that somebody in the tile owner's alliance"
1793 " has the relationship '%s' with at least one other "
1794 "living player."),
1795 diplrel_name_translation(preq->source.value.diplrel));
1796 } else {
1798 _("Requires that nobody in the tile owner's alliance "
1799 "has the relationship '%s' with any living player."),
1800 diplrel_name_translation(preq->source.value.diplrel));
1801 }
1802 return TRUE;
1803 case REQ_RANGE_LOCAL:
1804 fc_strlcat(buf, prefix, bufsz);
1805 if (preq->present) {
1807 _("Requires that you have the relationship '%s' with"
1808 " the tile owner."),
1809 diplrel_name_translation(preq->source.value.diplrel));
1810 } else {
1812 _("Requires that you do not have the relationship '%s'"
1813 " with the tile owner."),
1814 diplrel_name_translation(preq->source.value.diplrel));
1815 }
1816 return TRUE;
1817 case REQ_RANGE_TILE:
1819 case REQ_RANGE_ADJACENT:
1820 case REQ_RANGE_CITY:
1823 case REQ_RANGE_WORLD:
1824 case REQ_RANGE_COUNT:
1825 /* Not supported. */
1826 return FALSE;
1827 }
1828 return TRUE;
1829}
1830
1831/*************************************************************/
1836static bool req_text_diplrel_tile_o(char *buf, size_t bufsz,
1837 struct player *pplayer,
1838 const struct requirement *preq,
1839 const char *prefix)
1840{
1841 switch (preq->range) {
1842 case REQ_RANGE_LOCAL:
1843 fc_strlcat(buf, prefix, bufsz);
1844 if (preq->present) {
1846 _("Requires that the tile owner has the relationship"
1847 " '%s' with the other player."),
1848 diplrel_name_translation(preq->source.value.diplrel));
1849 } else {
1851 _("Requires that the tile owner does not have the"
1852 " relationship '%s' with the other player."),
1853 diplrel_name_translation(preq->source.value.diplrel));
1854 }
1855 return TRUE;
1856 case REQ_RANGE_TILE:
1858 case REQ_RANGE_ADJACENT:
1859 case REQ_RANGE_CITY:
1862 case REQ_RANGE_PLAYER:
1863 case REQ_RANGE_TEAM:
1864 case REQ_RANGE_ALLIANCE:
1865 case REQ_RANGE_WORLD:
1866 case REQ_RANGE_COUNT:
1867 /* Not supported. */
1868 return FALSE;
1869 }
1870 return TRUE;
1871}
1872
1873/*************************************************************/
1878static bool req_text_diplrel_unit_any(char *buf, size_t bufsz,
1879 struct player *pplayer,
1880 const struct requirement *preq,
1881 const char *prefix)
1882{
1883 switch (preq->range) {
1884 case REQ_RANGE_PLAYER:
1885 fc_strlcat(buf, prefix, bufsz);
1886 if (preq->present) {
1888 /* TRANS: in this and following strings, '%s' can be one
1889 * of a wide range of relationships; e.g., 'Peace',
1890 * 'Never met', 'Foreign', 'Hosts embassy',
1891 * 'Provided Casus Belli' */
1892 _("Requires that the tile has at least one unit whose "
1893 "owner has the relationship "
1894 "'%s' with at least one other living player."),
1895 diplrel_name_translation(preq->source.value.diplrel));
1896 } else {
1898 _("Requires that no unit at the tile is owned by a player "
1899 "who has the relationship '%s' with any living player."),
1900 diplrel_name_translation(preq->source.value.diplrel));
1901 }
1902 return TRUE;
1903 case REQ_RANGE_TEAM:
1904 fc_strlcat(buf, prefix, bufsz);
1905 if (preq->present) {
1907 _("Requires that the tile has at least one unit whose "
1908 "owner is on a team where a member "
1909 "has the relationship '%s' with at least one other "
1910 "living player."),
1911 diplrel_name_translation(preq->source.value.diplrel));
1912 } else {
1914 _("Requires that no unit at the tile is owned by a player "
1915 "who is on a team where a member "
1916 "has the relationship '%s' with at least one other "
1917 "living player."),
1918 diplrel_name_translation(preq->source.value.diplrel));
1919 }
1920 return TRUE;
1921 case REQ_RANGE_ALLIANCE:
1922 fc_strlcat(buf, prefix, bufsz);
1923 if (preq->present) {
1925 _("Requires that the tile has at least one unit whose "
1926 "owner is allied to someone that "
1927 "has the relationship '%s' with at least one other "
1928 "living player."),
1929 diplrel_name_translation(preq->source.value.diplrel));
1930 } else {
1932 _("Requires that no unit at the tile is owned by a player "
1933 "allied to someone that "
1934 "has the relationship '%s' with any living player."),
1935 diplrel_name_translation(preq->source.value.diplrel));
1936 }
1937 return TRUE;
1938 case REQ_RANGE_LOCAL:
1939 fc_strlcat(buf, prefix, bufsz);
1940 if (preq->present) {
1942 _("Requires that you have the relationship '%s' with "
1943 "the owner of at least one unit at the tile."),
1944 diplrel_name_translation(preq->source.value.diplrel));
1945 } else {
1947 _("Requires that you do not have the relationship '%s' "
1948 "with the owner of any unit at the tile."),
1949 diplrel_name_translation(preq->source.value.diplrel));
1950 }
1951 return TRUE;
1952 case REQ_RANGE_TILE:
1954 case REQ_RANGE_ADJACENT:
1955 case REQ_RANGE_CITY:
1958 case REQ_RANGE_WORLD:
1959 case REQ_RANGE_COUNT:
1960 /* Not supported. */
1961 return FALSE;
1962 }
1963 return TRUE;
1964}
1965
1966/*************************************************************/
1971static bool req_text_diplrel_unit_any_o(char *buf, size_t bufsz,
1972 struct player *pplayer,
1973 const struct requirement *preq,
1974 const char *prefix)
1975{
1976 switch (preq->range) {
1977 case REQ_RANGE_LOCAL:
1978 fc_strlcat(buf, prefix, bufsz);
1979 if (preq->present) {
1981 _("Requires that the tile has at least one unit whose "
1982 "owner has the relationship '%s' with the other player."),
1983 diplrel_name_translation(preq->source.value.diplrel));
1984 } else {
1986 _("Requires that no unit at the tile is owned by a player "
1987 "who has the relationship '%s' with the other player."),
1988 diplrel_name_translation(preq->source.value.diplrel));
1989 }
1990 return TRUE;
1991 case REQ_RANGE_TILE:
1993 case REQ_RANGE_ADJACENT:
1994 case REQ_RANGE_CITY:
1997 case REQ_RANGE_PLAYER:
1998 case REQ_RANGE_TEAM:
1999 case REQ_RANGE_ALLIANCE:
2000 case REQ_RANGE_WORLD:
2001 case REQ_RANGE_COUNT:
2002 /* Not supported. */
2003 return FALSE;
2004 }
2005 return TRUE;
2006}
2007
2008/*************************************************************/
2013static bool req_text_utype(char *buf, size_t bufsz,
2014 struct player *pplayer,
2015 const struct requirement *preq,
2016 const char *prefix)
2017{
2018 switch (preq->range) {
2019 case REQ_RANGE_LOCAL:
2020 fc_strlcat(buf, prefix, bufsz);
2021 if (preq->present) {
2022 /* TRANS: %s is a single kind of unit (e.g., "Settlers"). */
2023 cat_snprintf(buf, bufsz, Q_("?unit:Requires %s."),
2024 utype_name_translation(preq->source.value.utype));
2025 } else {
2026 /* TRANS: %s is a single kind of unit (e.g., "Settlers"). */
2027 cat_snprintf(buf, bufsz, Q_("?unit:Does not apply to %s."),
2028 utype_name_translation(preq->source.value.utype));
2029 }
2030 return TRUE;
2031 case REQ_RANGE_TILE:
2033 case REQ_RANGE_ADJACENT:
2034 case REQ_RANGE_CITY:
2037 case REQ_RANGE_PLAYER:
2038 case REQ_RANGE_TEAM:
2039 case REQ_RANGE_ALLIANCE:
2040 case REQ_RANGE_WORLD:
2041 case REQ_RANGE_COUNT:
2042 /* Not supported. */
2043 return FALSE;
2044 }
2045 return TRUE;
2046}
2047
2048/*************************************************************/
2053static bool req_text_unitflag(char *buf, size_t bufsz,
2054 struct player *pplayer,
2055 const struct requirement *preq,
2056 const char *prefix)
2057{
2058 switch (preq->range) {
2059 case REQ_RANGE_LOCAL:
2060 {
2061 struct astring astr = ASTRING_INIT;
2062
2063 /* Unit type flags mean nothing to users. Explicitly list the unit
2064 * types with those flags. */
2065 if (role_units_translations(&astr, preq->source.value.unitflag,
2066 TRUE)) {
2067 fc_strlcat(buf, prefix, bufsz);
2068 if (preq->present) {
2069 /* TRANS: %s is a list of unit types separated by "or". */
2070 cat_snprintf(buf, bufsz, Q_("?ulist:Requires %s."),
2071 astr_str(&astr));
2072 } else {
2073 /* TRANS: %s is a list of unit types separated by "or". */
2074 cat_snprintf(buf, bufsz, Q_("?ulist:Does not apply to %s."),
2075 astr_str(&astr));
2076 }
2077 astr_free(&astr);
2078 return TRUE;
2079 }
2080 }
2081 break;
2082 case REQ_RANGE_TILE:
2084 case REQ_RANGE_ADJACENT:
2085 case REQ_RANGE_CITY:
2088 case REQ_RANGE_PLAYER:
2089 case REQ_RANGE_TEAM:
2090 case REQ_RANGE_ALLIANCE:
2091 case REQ_RANGE_WORLD:
2092 case REQ_RANGE_COUNT:
2093 /* Not supported. */
2094 return FALSE;
2095 }
2096 return TRUE;
2097}
2098
2099/*************************************************************/
2104static bool req_text_uclass(char *buf, size_t bufsz,
2105 struct player *pplayer,
2106 const struct requirement *preq,
2107 const char *prefix)
2108{
2109 switch (preq->range) {
2110 case REQ_RANGE_LOCAL:
2111 fc_strlcat(buf, prefix, bufsz);
2112 if (preq->present) {
2113 /* TRANS: %s is a single unit class (e.g., "Air"). */
2114 cat_snprintf(buf, bufsz, Q_("?uclass:Requires %s units."),
2115 uclass_name_translation(preq->source.value.uclass));
2116 } else {
2117 /* TRANS: %s is a single unit class (e.g., "Air"). */
2118 cat_snprintf(buf, bufsz, Q_("?uclass:Does not apply to %s units."),
2119 uclass_name_translation(preq->source.value.uclass));
2120 }
2121 return TRUE;
2122 case REQ_RANGE_TILE:
2124 case REQ_RANGE_ADJACENT:
2125 case REQ_RANGE_CITY:
2128 case REQ_RANGE_PLAYER:
2129 case REQ_RANGE_TEAM:
2130 case REQ_RANGE_ALLIANCE:
2131 case REQ_RANGE_WORLD:
2132 case REQ_RANGE_COUNT:
2133 /* Not supported. */
2134 return FALSE;
2135 }
2136 return TRUE;
2137}
2138
2139/*************************************************************/
2144static bool req_text_ucflag(char *buf, size_t bufsz,
2145 struct player *pplayer,
2146 const struct requirement *preq,
2147 const char *prefix)
2148{
2149 const char *classes[uclass_count()];
2150 int i = 0;
2151 bool done = FALSE;
2152 struct astring list = ASTRING_INIT;
2153
2154 unit_class_iterate(uclass) {
2155 if (uclass_has_flag(uclass, preq->source.value.unitclassflag)) {
2156 classes[i++] = uclass_name_translation(uclass);
2157 }
2160
2161 switch (preq->range) {
2162 case REQ_RANGE_LOCAL:
2163 fc_strlcat(buf, prefix, bufsz);
2164 if (preq->present) {
2165 /* TRANS: %s is a list of unit classes separated by "or". */
2166 cat_snprintf(buf, bufsz, Q_("?uclasslist:Requires %s units."),
2167 astr_str(&list));
2168 } else {
2169 /* TRANS: %s is a list of unit classes separated by "or". */
2170 cat_snprintf(buf, bufsz, Q_("?uclasslist:Does not apply to "
2171 "%s units."),
2172 astr_str(&list));
2173 }
2174 done = TRUE;
2175 break;
2176 case REQ_RANGE_TILE:
2178 case REQ_RANGE_ADJACENT:
2179 case REQ_RANGE_CITY:
2182 case REQ_RANGE_PLAYER:
2183 case REQ_RANGE_TEAM:
2184 case REQ_RANGE_ALLIANCE:
2185 case REQ_RANGE_WORLD:
2186 case REQ_RANGE_COUNT:
2187 /* Not supported. */
2188 break;
2189 }
2190 astr_free(&list);
2191
2192 return done;
2193}
2194
2195/*************************************************************/
2200static bool req_text_unit_state(char *buf, size_t bufsz,
2201 struct player *pplayer,
2202 const struct requirement *preq,
2203 const char *prefix)
2204{
2205 switch (preq->range) {
2206 case REQ_RANGE_LOCAL:
2207 switch (preq->source.value.unit_state) {
2208 case USP_TRANSPORTED:
2209 fc_strlcat(buf, prefix, bufsz);
2210 if (preq->present) {
2212 _("Requires that the unit is transported."));
2213 } else {
2215 _("Requires that the unit isn't transported."));
2216 }
2217 return TRUE;
2218 case USP_LIVABLE_TILE:
2219 fc_strlcat(buf, prefix, bufsz);
2220 if (preq->present) {
2222 _("Requires that the unit is on livable tile."));
2223 } else {
2225 _("Requires that the unit isn't on livable tile."));
2226 }
2227 return TRUE;
2228 case USP_TRANSPORTING:
2229 fc_strlcat(buf, prefix, bufsz);
2230 if (preq->present) {
2232 _("Requires that the unit does transport one or "
2233 "more cargo units."));
2234 } else {
2236 _("Requires that the unit doesn't transport "
2237 "any cargo units."));
2238 }
2239 return TRUE;
2240 case USP_HAS_HOME_CITY:
2241 fc_strlcat(buf, prefix, bufsz);
2242 if (preq->present) {
2244 _("Requires that the unit has a home city."));
2245 } else {
2247 _("Requires that the unit is homeless."));
2248 }
2249 return TRUE;
2250 case USP_NATIVE_TILE:
2251 fc_strlcat(buf, prefix, bufsz);
2252 if (preq->present) {
2254 _("Requires that the unit is on native tile."));
2255 } else {
2257 _("Requires that the unit isn't on native tile."));
2258 }
2259 return TRUE;
2260 case USP_NATIVE_EXTRA:
2261 fc_strlcat(buf, prefix, bufsz);
2262 if (preq->present) {
2264 _("Requires that the unit is in a native extra."));
2265 } else {
2267 _("Requires that the unit isn't in a native extra."));
2268 }
2269 return TRUE;
2271 fc_strlcat(buf, prefix, bufsz);
2272 if (preq->present) {
2274 _("Requires that the unit has moved this turn."));
2275 } else {
2277 _("Requires that the unit hasn't moved this turn."));
2278 }
2279 return TRUE;
2280 case USP_COUNT:
2281 fc_assert_msg(preq->source.value.unit_state != USP_COUNT,
2282 "Invalid unit state property.");
2283 }
2284 break;
2285 case REQ_RANGE_TILE:
2287 case REQ_RANGE_ADJACENT:
2288 case REQ_RANGE_CITY:
2291 case REQ_RANGE_PLAYER:
2292 case REQ_RANGE_TEAM:
2293 case REQ_RANGE_ALLIANCE:
2294 case REQ_RANGE_WORLD:
2295 case REQ_RANGE_COUNT:
2296 /* Not supported. */
2297 return FALSE;
2298 }
2299 return TRUE;
2300}
2301
2302/*************************************************************/
2307static bool req_text_activity(char *buf, size_t bufsz,
2308 struct player *pplayer,
2309 const struct requirement *preq,
2310 const char *prefix)
2311{
2312 switch (preq->range) {
2313 case REQ_RANGE_LOCAL:
2314 fc_strlcat(buf, prefix, bufsz);
2315 if (preq->present) {
2317 _("Requires that the unit is performing activity %s."),
2318 Q_(unit_activity_name(preq->source.value.activity)));
2319 } else {
2321 _("Requires that the unit is not performing activity %s."),
2322 Q_(unit_activity_name(preq->source.value.activity)));
2323 }
2324 return TRUE;
2325 case REQ_RANGE_TILE:
2327 case REQ_RANGE_ADJACENT:
2328 case REQ_RANGE_CITY:
2331 case REQ_RANGE_PLAYER:
2332 case REQ_RANGE_TEAM:
2333 case REQ_RANGE_ALLIANCE:
2334 case REQ_RANGE_WORLD:
2335 case REQ_RANGE_COUNT:
2336 /* Not supported. */
2337 return FALSE;
2338 }
2339 return TRUE;
2340}
2341
2342/*************************************************************/
2347static bool req_text_min_moves(char *buf, size_t bufsz,
2348 struct player *pplayer,
2349 const struct requirement *preq,
2350 const char *prefix)
2351{
2352 switch (preq->range) {
2353 case REQ_RANGE_LOCAL:
2354 fc_strlcat(buf, prefix, bufsz);
2355 if (preq->present) {
2357 /* TRANS: %s is numeric move points; it may have a
2358 * fractional part ("1 1/3 MP"). */
2359 _("Requires that the unit has at least %s MP left."),
2360 move_points_text(preq->source.value.minmoves, TRUE));
2361 } else {
2363 /* TRANS: %s is numeric move points; it may have a
2364 * fractional part ("1 1/3 MP"). */
2365 _("Requires that the unit has less than %s MP left."),
2366 move_points_text(preq->source.value.minmoves, TRUE));
2367 }
2368 return TRUE;
2369 case REQ_RANGE_TILE:
2371 case REQ_RANGE_ADJACENT:
2372 case REQ_RANGE_CITY:
2375 case REQ_RANGE_PLAYER:
2376 case REQ_RANGE_TEAM:
2377 case REQ_RANGE_ALLIANCE:
2378 case REQ_RANGE_WORLD:
2379 case REQ_RANGE_COUNT:
2380 /* Not supported. */
2381 return FALSE;
2382 }
2383 return TRUE;
2384}
2385
2386/*************************************************************/
2391static bool req_text_min_veteran(char *buf, size_t bufsz,
2392 struct player *pplayer,
2393 const struct requirement *preq,
2394 const char *prefix)
2395{
2396 if (preq->range != REQ_RANGE_LOCAL) {
2397 return FALSE;
2398 }
2399 /* FIXME: this would be better with veteran level names, but that's
2400 * potentially unit type dependent. */
2401 fc_strlcat(buf, prefix, bufsz);
2402 if (preq->present) {
2404 PL_("Requires a unit with at least %d veteran level.",
2405 "Requires a unit with at least %d veteran levels.",
2406 preq->source.value.minveteran),
2407 preq->source.value.minveteran);
2408 } else {
2410 PL_("Requires a unit with fewer than %d veteran level.",
2411 "Requires a unit with fewer than %d veteran levels.",
2412 preq->source.value.minveteran),
2413 preq->source.value.minveteran);
2414 }
2415 return TRUE;
2416}
2417
2418/*************************************************************/
2423static bool req_text_min_hp(char *buf, size_t bufsz,
2424 struct player *pplayer,
2425 const struct requirement *preq,
2426 const char *prefix)
2427{
2428 if (preq->range != REQ_RANGE_LOCAL) {
2429 return FALSE;
2430 }
2431
2432 fc_strlcat(buf, prefix, bufsz);
2433 if (preq->present) {
2435 PL_("Requires a unit with at least %d hit point left.",
2436 "Requires a unit with at least %d hit points left.",
2437 preq->source.value.min_hit_points),
2438 preq->source.value.min_hit_points);
2439 } else {
2441 PL_("Requires a unit with fewer than %d hit point "
2442 "left.",
2443 "Requires a unit with fewer than %d hit points "
2444 "left.",
2445 preq->source.value.min_hit_points),
2446 preq->source.value.min_hit_points);
2447 }
2448 return TRUE;
2449}
2450
2451/*************************************************************/
2456static bool req_text_otype(char *buf, size_t bufsz,
2457 struct player *pplayer,
2458 const struct requirement *preq,
2459 const char *prefix)
2460{
2461 if (preq->range != REQ_RANGE_LOCAL) {
2462 return FALSE;
2463 }
2464 fc_strlcat(buf, prefix, bufsz);
2465 if (preq->present) {
2466 /* TRANS: "Applies only to Food." */
2467 cat_snprintf(buf, bufsz, Q_("?output:Applies only to %s."),
2468 get_output_name(preq->source.value.outputtype));
2469 } else {
2470 /* TRANS: "Does not apply to Food." */
2471 cat_snprintf(buf, bufsz, Q_("?output:Does not apply to %s."),
2472 get_output_name(preq->source.value.outputtype));
2473 }
2474 return TRUE;
2475}
2476
2477/*************************************************************/
2482static bool req_text_specialist(char *buf, size_t bufsz,
2483 struct player *pplayer,
2484 const struct requirement *preq,
2485 const char *prefix)
2486{
2487 if (preq->range != REQ_RANGE_LOCAL) {
2488 return FALSE;
2489 }
2490 fc_strlcat(buf, prefix, bufsz);
2491 if (preq->present) {
2492 /* TRANS: "Applies only to Scientists." */
2493 cat_snprintf(buf, bufsz, Q_("?specialist:Applies only to %s."),
2494 specialist_plural_translation(preq->source.value.specialist));
2495 } else {
2496 /* TRANS: "Does not apply to Scientists." */
2497 cat_snprintf(buf, bufsz, Q_("?specialist:Does not apply to %s."),
2498 specialist_plural_translation(preq->source.value.specialist));
2499 }
2500 return TRUE;
2501}
2502
2503/*************************************************************/
2508static bool req_text_min_size(char *buf, size_t bufsz,
2509 struct player *pplayer,
2510 const struct requirement *preq,
2511 const char *prefix)
2512{
2513 switch (preq->range) {
2515 fc_strlcat(buf, prefix, bufsz);
2516 if (preq->present) {
2518 PL_("Requires a minimum city size of %d for this "
2519 "city or a trade partner.",
2520 "Requires a minimum city size of %d for this "
2521 "city or a trade partner.",
2522 preq->source.value.minsize),
2523 preq->source.value.minsize);
2524 } else {
2526 PL_("Requires the city size to be less than %d "
2527 "for this city and all trade partners.",
2528 "Requires the city size to be less than %d "
2529 "for this city and all trade partners.",
2530 preq->source.value.minsize),
2531 preq->source.value.minsize);
2532 }
2533 return TRUE;
2534 case REQ_RANGE_CITY:
2535 fc_strlcat(buf, prefix, bufsz);
2536 if (preq->present) {
2538 PL_("Requires a minimum city size of %d.",
2539 "Requires a minimum city size of %d.",
2540 preq->source.value.minsize),
2541 preq->source.value.minsize);
2542 } else {
2544 PL_("Requires the city size to be less than %d.",
2545 "Requires the city size to be less than %d.",
2546 preq->source.value.minsize),
2547 preq->source.value.minsize);
2548 }
2549 return TRUE;
2550 case REQ_RANGE_LOCAL:
2551 case REQ_RANGE_TILE:
2553 case REQ_RANGE_ADJACENT:
2555 case REQ_RANGE_PLAYER:
2556 case REQ_RANGE_TEAM:
2557 case REQ_RANGE_ALLIANCE:
2558 case REQ_RANGE_WORLD:
2559 case REQ_RANGE_COUNT:
2560 /* Not supported. */
2561 return FALSE;
2562 }
2563 return TRUE;
2564}
2565
2566/*************************************************************/
2571static bool req_text_min_culture(char *buf, size_t bufsz,
2572 struct player *pplayer,
2573 const struct requirement *preq,
2574 const char *prefix)
2575{
2576 switch (preq->range) {
2577 case REQ_RANGE_CITY:
2578 fc_strlcat(buf, prefix, bufsz);
2579 if (preq->present) {
2581 PL_("Requires a minimum culture of %d in the city.",
2582 "Requires a minimum culture of %d in the city.",
2583 preq->source.value.minculture),
2584 preq->source.value.minculture);
2585 } else {
2587 PL_("Requires the culture in the city to be less "
2588 "than %d.",
2589 "Requires the culture in the city to be less "
2590 "than %d.",
2591 preq->source.value.minculture),
2592 preq->source.value.minculture);
2593 }
2594 return TRUE;
2596 fc_strlcat(buf, prefix, bufsz);
2597 if (preq->present) {
2599 PL_("Requires a minimum culture of %d in this city or "
2600 "a trade partner.",
2601 "Requires a minimum culture of %d in this city or "
2602 "a trade partner.",
2603 preq->source.value.minculture),
2604 preq->source.value.minculture);
2605 } else {
2607 PL_("Requires the culture in this city and all trade "
2608 "partners to be less than %d.",
2609 "Requires the culture in this city and all trade "
2610 "partners to be less than %d.",
2611 preq->source.value.minculture),
2612 preq->source.value.minculture);
2613 }
2614 return TRUE;
2615 case REQ_RANGE_PLAYER:
2616 fc_strlcat(buf, prefix, bufsz);
2617 if (preq->present) {
2619 PL_("Requires your nation to have culture "
2620 "of at least %d.",
2621 "Requires your nation to have culture "
2622 "of at least %d.",
2623 preq->source.value.minculture),
2624 preq->source.value.minculture);
2625 } else {
2627 PL_("Prevented if your nation has culture of "
2628 "%d or more.",
2629 "Prevented if your nation has culture of "
2630 "%d or more.",
2631 preq->source.value.minculture),
2632 preq->source.value.minculture);
2633 }
2634 return TRUE;
2635 case REQ_RANGE_TEAM:
2636 fc_strlcat(buf, prefix, bufsz);
2637 if (preq->present) {
2639 PL_("Requires someone on your team to have culture of "
2640 "at least %d.",
2641 "Requires someone on your team to have culture of "
2642 "at least %d.",
2643 preq->source.value.minculture),
2644 preq->source.value.minculture);
2645 } else {
2647 PL_("Prevented if anyone on your team has culture of "
2648 "%d or more.",
2649 "Prevented if anyone on your team has culture of "
2650 "%d or more.",
2651 preq->source.value.minculture),
2652 preq->source.value.minculture);
2653 }
2654 return TRUE;
2655 case REQ_RANGE_ALLIANCE:
2656 fc_strlcat(buf, prefix, bufsz);
2657 if (preq->present) {
2659 PL_("Requires someone in your current alliance to "
2660 "have culture of at least %d.",
2661 "Requires someone in your current alliance to "
2662 "have culture of at least %d.",
2663 preq->source.value.minculture),
2664 preq->source.value.minculture);
2665 } else {
2667 PL_("Prevented if anyone in your current alliance has "
2668 "culture of %d or more.",
2669 "Prevented if anyone in your current alliance has "
2670 "culture of %d or more.",
2671 preq->source.value.minculture),
2672 preq->source.value.minculture);
2673 }
2674 return TRUE;
2675 case REQ_RANGE_WORLD:
2676 fc_strlcat(buf, prefix, bufsz);
2677 if (preq->present) {
2679 PL_("Requires that some player has culture of at "
2680 "least %d.",
2681 "Requires that some player has culture of at "
2682 "least %d.",
2683 preq->source.value.minculture),
2684 preq->source.value.minculture);
2685 } else {
2687 PL_("Requires that no player has culture of %d "
2688 "or more.",
2689 "Requires that no player has culture of %d "
2690 "or more.",
2691 preq->source.value.minculture),
2692 preq->source.value.minculture);
2693 }
2694 return TRUE;
2695 case REQ_RANGE_LOCAL:
2696 case REQ_RANGE_TILE:
2698 case REQ_RANGE_ADJACENT:
2700 case REQ_RANGE_COUNT:
2701 return FALSE;
2702 }
2703 return TRUE;
2704}
2705
2706/*************************************************************/
2711static bool req_text_min_foreign_pct(char *buf, size_t bufsz,
2712 struct player *pplayer,
2713 const struct requirement *preq,
2714 const char *prefix)
2715{
2716 switch (preq->range) {
2717 case REQ_RANGE_CITY:
2718 fc_strlcat(buf, prefix, bufsz);
2719 if (preq->present) {
2721 _("At least %d%% of the citizens of the city "
2722 "must be foreign."),
2723 preq->source.value.minforeignpct);
2724 } else {
2726 _("Less than %d%% of the citizens of the city "
2727 "must be foreign."),
2728 preq->source.value.minforeignpct);
2729 }
2730 return TRUE;
2732 fc_strlcat(buf, prefix, bufsz);
2733 if (preq->present) {
2735 _("At least %d%% of the citizens of the city "
2736 "or some trade partner must be foreign."),
2737 preq->source.value.minforeignpct);
2738 } else {
2740 _("Less than %d%% of the citizens of the city "
2741 "and each trade partner must be foreign."),
2742 preq->source.value.minforeignpct);
2743 }
2744 return TRUE;
2745 case REQ_RANGE_PLAYER:
2746 case REQ_RANGE_TEAM:
2747 case REQ_RANGE_ALLIANCE:
2748 case REQ_RANGE_WORLD:
2749 case REQ_RANGE_LOCAL:
2750 case REQ_RANGE_TILE:
2752 case REQ_RANGE_ADJACENT:
2754 case REQ_RANGE_COUNT:
2755 return FALSE;
2756 }
2757 return TRUE;
2758}
2759
2760/*************************************************************/
2765static bool req_text_max_tile_total_units(char *buf, size_t bufsz,
2766 struct player *pplayer,
2767 const struct requirement *preq,
2768 const char *prefix)
2769{
2770 switch (preq->range) {
2771 case REQ_RANGE_TILE:
2772 fc_strlcat(buf, prefix, bufsz);
2773 if (preq->present) {
2775 PL_("At most %d total unit may be present on the tile.",
2776 "At most %d total units may be present on the tile.",
2777 preq->source.value.max_tile_total_units),
2778 preq->source.value.max_tile_total_units);
2779 } else {
2781 PL_("There must be more than %d total unit present on "
2782 "the tile.",
2783 "There must be more than %d total units present on "
2784 "the tile.",
2785 preq->source.value.max_tile_total_units),
2786 preq->source.value.max_tile_total_units);
2787 }
2788 return TRUE;
2790 fc_strlcat(buf, prefix, bufsz);
2791 if (preq->present) {
2793 PL_("The tile or at least one cardinally adjacent tile "
2794 "must have %d total unit or fewer.",
2795 "The tile or at least one cardinally adjacent tile "
2796 "must have %d total units or fewer.",
2797 preq->source.value.max_tile_total_units),
2798 preq->source.value.max_tile_total_units);
2799 } else {
2801 PL_("The tile and all cardinally adjacent tiles must "
2802 "have more than %d total unit each.",
2803 "The tile and all cardinally adjacent tiles must "
2804 "have more than %d total units each.",
2805 preq->source.value.max_tile_total_units),
2806 preq->source.value.max_tile_total_units);
2807 }
2808 return TRUE;
2809 case REQ_RANGE_ADJACENT:
2810 fc_strlcat(buf, prefix, bufsz);
2811 if (preq->present) {
2813 PL_("The tile or at least one adjacent tile must have "
2814 "%d total unit or fewer.",
2815 "The tile or at least one adjacent tile must have "
2816 "%d total units or fewer.",
2817 preq->source.value.max_tile_total_units),
2818 preq->source.value.max_tile_total_units);
2819 } else {
2821 PL_("The tile and all adjacent tiles must have more "
2822 "than %d total unit each.",
2823 "The tile and all adjacent tiles must have more "
2824 "than %d total units each.",
2825 preq->source.value.max_tile_total_units),
2826 preq->source.value.max_tile_total_units);
2827 }
2828 return TRUE;
2829 case REQ_RANGE_CITY:
2832 case REQ_RANGE_PLAYER:
2833 case REQ_RANGE_TEAM:
2834 case REQ_RANGE_ALLIANCE:
2835 case REQ_RANGE_WORLD:
2836 case REQ_RANGE_LOCAL:
2837 case REQ_RANGE_COUNT:
2838 /* Not supported. */
2839 return FALSE;
2840 }
2841 return TRUE;
2842}
2843
2844/*************************************************************/
2849static bool req_text_max_tile_top_units(char *buf, size_t bufsz,
2850 struct player *pplayer,
2851 const struct requirement *preq,
2852 const char *prefix)
2853{
2854 switch (preq->range) {
2855 case REQ_RANGE_TILE:
2856 fc_strlcat(buf, prefix, bufsz);
2857 if (preq->present) {
2859 PL_("At most %d untransported unit may be present on the tile.",
2860 "At most %d untransported units may be present on the tile.",
2861 preq->source.value.max_tile_top_units),
2862 preq->source.value.max_tile_top_units);
2863 } else {
2865 PL_("There must be more than %d untransported unit present on "
2866 "the tile.",
2867 "There must be more than %d untransported units present on "
2868 "the tile.",
2869 preq->source.value.max_tile_top_units),
2870 preq->source.value.max_tile_top_units);
2871 }
2872 return TRUE;
2874 fc_strlcat(buf, prefix, bufsz);
2875 if (preq->present) {
2877 PL_("The tile or at least one cardinally adjacent tile "
2878 "must have %d untransporte unit or fewer.",
2879 "The tile or at least one cardinally adjacent tile "
2880 "must have %d untransporte units or fewer.",
2881 preq->source.value.max_tile_top_units),
2882 preq->source.value.max_tile_top_units);
2883 } else {
2885 PL_("The tile and all cardinally adjacent tiles must "
2886 "have more than %d untransported unit each.",
2887 "The tile and all cardinally adjacent tiles must "
2888 "have more than %d untransported units each.",
2889 preq->source.value.max_tile_top_units),
2890 preq->source.value.max_tile_top_units);
2891 }
2892 return TRUE;
2893 case REQ_RANGE_ADJACENT:
2894 fc_strlcat(buf, prefix, bufsz);
2895 if (preq->present) {
2897 PL_("The tile or at least one adjacent tile must have "
2898 "%d untransported unit or fewer.",
2899 "The tile or at least one adjacent tile must have "
2900 "%d untransported units or fewer.",
2901 preq->source.value.max_tile_top_units),
2902 preq->source.value.max_tile_top_units);
2903 } else {
2905 PL_("The tile and all adjacent tiles must have "
2906 "more than %d untransported unit each.",
2907 "The tile and all adjacent tiles must have "
2908 "more than %d untransported units each.",
2909 preq->source.value.max_tile_top_units),
2910 preq->source.value.max_tile_top_units);
2911 }
2912 return TRUE;
2913 case REQ_RANGE_CITY:
2916 case REQ_RANGE_PLAYER:
2917 case REQ_RANGE_TEAM:
2918 case REQ_RANGE_ALLIANCE:
2919 case REQ_RANGE_WORLD:
2920 case REQ_RANGE_LOCAL:
2921 case REQ_RANGE_COUNT:
2922 /* Not supported. */
2923 return FALSE;
2924 }
2925 return TRUE;
2926}
2927
2928/*************************************************************/
2933static bool req_text_ai_level(char *buf, size_t bufsz,
2934 struct player *pplayer,
2935 const struct requirement *preq,
2936 const char *prefix)
2937{
2938 if (preq->range != REQ_RANGE_PLAYER) {
2939 return FALSE;
2940 }
2941 fc_strlcat(buf, prefix, bufsz);
2942 if (preq->present) {
2944 /* TRANS: AI level (e.g., "Handicapped") */
2945 _("Applies to %s AI players."),
2946 ai_level_translated_name(preq->source.value.ai_level));
2947 } else {
2949 /* TRANS: AI level (e.g., "Cheating") */
2950 _("Does not apply to %s AI players."),
2951 ai_level_translated_name(preq->source.value.ai_level));
2952 }
2953 return TRUE;
2954}
2955
2956/*************************************************************/
2961static bool req_text_terrain_class(char *buf, size_t bufsz,
2962 struct player *pplayer,
2963 const struct requirement *preq,
2964 const char *prefix)
2965{
2966 switch (preq->range) {
2967 case REQ_RANGE_TILE:
2968 fc_strlcat(buf, prefix, bufsz);
2969 if (preq->present) {
2971 /* TRANS: %s is a terrain class */
2972 Q_("?terrainclass:Requires %s terrain on the tile."),
2974 (preq->source.value.terrainclass));
2975 } else {
2977 /* TRANS: %s is a terrain class */
2978 Q_("?terrainclass:Prevented by %s terrain on the tile."),
2980 (preq->source.value.terrainclass));
2981 }
2982 return TRUE;
2984 fc_strlcat(buf, prefix, bufsz);
2985 if (preq->present) {
2987 /* TRANS: %s is a terrain class */
2988 Q_("?terrainclass:Requires %s terrain on the tile or a "
2989 "cardinally adjacent tile."),
2991 (preq->source.value.terrainclass));
2992 } else {
2994 /* TRANS: %s is a terrain class */
2995 Q_("?terrainclass:Prevented by %s terrain on the tile or "
2996 "any cardinally adjacent tile."),
2998 (preq->source.value.terrainclass));
2999 }
3000 return TRUE;
3001 case REQ_RANGE_ADJACENT:
3002 fc_strlcat(buf, prefix, bufsz);
3003 if (preq->present) {
3005 /* TRANS: %s is a terrain class */
3006 Q_("?terrainclass:Requires %s terrain on the tile or an "
3007 "adjacent tile."),
3009 (preq->source.value.terrainclass));
3010 } else {
3012 /* TRANS: %s is a terrain class */
3013 Q_("?terrainclass:Prevented by %s terrain on the tile or "
3014 "any adjacent tile."),
3016 (preq->source.value.terrainclass));
3017 }
3018 return TRUE;
3019 case REQ_RANGE_CITY:
3020 fc_strlcat(buf, prefix, bufsz);
3021 if (preq->present) {
3023 /* TRANS: %s is a terrain class */
3024 Q_("?terrainclass:Requires %s terrain on a tile within "
3025 "the city radius."),
3027 (preq->source.value.terrainclass));
3028 } else {
3030 /* TRANS: %s is a terrain class */
3031 Q_("?terrainclass:Prevented by %s terrain on any tile "
3032 "within the city radius."),
3034 (preq->source.value.terrainclass));
3035 }
3036 return TRUE;
3038 fc_strlcat(buf, prefix, bufsz);
3039 if (preq->present) {
3041 /* TRANS: %s is a terrain class */
3042 Q_("?terrainclass:Requires %s terrain on a tile within "
3043 "the city radius or the city radius of a trade "
3044 "partner."),
3046 (preq->source.value.terrainclass));
3047 } else {
3049 /* TRANS: %s is a terrain class */
3050 Q_("?terrainclass:Prevented by %s terrain on any tile "
3051 "within the city radius or the city radius of a trade "
3052 "partner."),
3054 (preq->source.value.terrainclass));
3055 }
3056 return TRUE;
3058 case REQ_RANGE_PLAYER:
3059 case REQ_RANGE_TEAM:
3060 case REQ_RANGE_ALLIANCE:
3061 case REQ_RANGE_WORLD:
3062 case REQ_RANGE_LOCAL:
3063 case REQ_RANGE_COUNT:
3064 /* Not supported. */
3065 return FALSE;
3066 }
3067 return TRUE;
3068}
3069
3070/*************************************************************/
3075static bool req_text_terrain_flag(char *buf, size_t bufsz,
3076 struct player *pplayer,
3077 const struct requirement *preq,
3078 const char *prefix)
3079{
3080 switch (preq->range) {
3081 case REQ_RANGE_TILE:
3082 fc_strlcat(buf, prefix, bufsz);
3083 if (preq->present) {
3085 /* TRANS: %s is a (translatable) terrain flag. */
3086 _("Requires terrain with the \"%s\" flag on the tile."),
3087 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3088 } else {
3090 /* TRANS: %s is a (translatable) terrain flag. */
3091 _("Prevented by terrain with the \"%s\" flag on the "
3092 "tile."),
3093 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3094 }
3095 return TRUE;
3097 fc_strlcat(buf, prefix, bufsz);
3098 if (preq->present) {
3100 /* TRANS: %s is a (translatable) terrain flag. */
3101 _("Requires terrain with the \"%s\" flag on the "
3102 "tile or a cardinally adjacent tile."),
3103 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3104 } else {
3106 /* TRANS: %s is a (translatable) terrain flag. */
3107 _("Prevented by terrain with the \"%s\" flag on "
3108 "the tile or any cardinally adjacent tile."),
3109 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3110 }
3111 return TRUE;
3112 case REQ_RANGE_ADJACENT:
3113 fc_strlcat(buf, prefix, bufsz);
3114 if (preq->present) {
3116 /* TRANS: %s is a (translatable) terrain flag. */
3117 _("Requires terrain with the \"%s\" flag on the "
3118 "tile or an adjacent tile."),
3119 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3120 } else {
3122 /* TRANS: %s is a (translatable) terrain flag. */
3123 _("Prevented by terrain with the \"%s\" flag on "
3124 "the tile or any adjacent tile."),
3125 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3126 }
3127 return TRUE;
3128 case REQ_RANGE_CITY:
3129 fc_strlcat(buf, prefix, bufsz);
3130 if (preq->present) {
3132 /* TRANS: %s is a (translatable) terrain flag. */
3133 _("Requires terrain with the \"%s\" flag on a tile "
3134 "within the city radius."),
3135 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3136 } else {
3138 /* TRANS: %s is a (translatable) terrain flag. */
3139 _("Prevented by terrain with the \"%s\" flag on any tile "
3140 "within the city radius."),
3141 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3142 }
3143 return TRUE;
3145 fc_strlcat(buf, prefix, bufsz);
3146 if (preq->present) {
3148 /* TRANS: %s is a (translatable) terrain flag. */
3149 _("Requires terrain with the \"%s\" flag on a tile "
3150 "within the city radius or the city radius of "
3151 "a trade partner."),
3152 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3153 } else {
3155 /* TRANS: %s is a (translatable) terrain flag. */
3156 _("Prevented by terrain with the \"%s\" flag on any tile "
3157 "within the city radius or the city radius of "
3158 "a trade partner."),
3159 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3160 }
3161 return TRUE;
3163 case REQ_RANGE_PLAYER:
3164 case REQ_RANGE_TEAM:
3165 case REQ_RANGE_ALLIANCE:
3166 case REQ_RANGE_WORLD:
3167 case REQ_RANGE_LOCAL:
3168 case REQ_RANGE_COUNT:
3169 /* Not supported. */
3170 return FALSE;
3171 }
3172 return TRUE;
3173}
3174
3175/*************************************************************/
3180static bool req_text_road_flag(char *buf, size_t bufsz,
3181 struct player *pplayer,
3182 const struct requirement *preq,
3183 const char *prefix)
3184{
3185 switch (preq->range) {
3186 case REQ_RANGE_LOCAL:
3187 fc_strlcat(buf, prefix, bufsz);
3188 if (preq->present) {
3190 /* TRANS: %s is a (translatable) road flag. */
3191 _("Only applies to roads with the \"%s\" flag."),
3193 (preq->source.value.roadflag));
3194 } else {
3196 /* TRANS: %s is a (translatable) road flag. */
3197 _("Does not apply to roads with the \"%s\" flag."),
3199 (preq->source.value.roadflag));
3200 }
3201 return TRUE;
3202 case REQ_RANGE_TILE:
3203 fc_strlcat(buf, prefix, bufsz);
3204 if (preq->present) {
3206 /* TRANS: %s is a (translatable) road flag. */
3207 _("Requires a road with the \"%s\" flag on the tile."),
3208 road_flag_id_translated_name(preq->source.value.roadflag));
3209 } else {
3211 /* TRANS: %s is a (translatable) road flag. */
3212 _("Prevented by a road with the \"%s\" flag on the "
3213 "tile."),
3214 road_flag_id_translated_name(preq->source.value.roadflag));
3215 }
3216 return TRUE;
3218 fc_strlcat(buf, prefix, bufsz);
3219 if (preq->present) {
3221 /* TRANS: %s is a (translatable) road flag. */
3222 _("Requires a road with the \"%s\" flag on the "
3223 "tile or a cardinally adjacent tile."),
3224 road_flag_id_translated_name(preq->source.value.roadflag));
3225 } else {
3227 /* TRANS: %s is a (translatable) road flag. */
3228 _("Prevented by a road with the \"%s\" flag on "
3229 "the tile or any cardinally adjacent tile."),
3230 road_flag_id_translated_name(preq->source.value.roadflag));
3231 }
3232 return TRUE;
3233 case REQ_RANGE_ADJACENT:
3234 fc_strlcat(buf, prefix, bufsz);
3235 if (preq->present) {
3237 /* TRANS: %s is a (translatable) road flag. */
3238 _("Requires a road with the \"%s\" flag on the "
3239 "tile or an adjacent tile."),
3240 road_flag_id_translated_name(preq->source.value.roadflag));
3241 } else {
3243 /* TRANS: %s is a (translatable) road flag. */
3244 _("Prevented by a road with the \"%s\" flag on "
3245 "the tile or any adjacent tile."),
3246 road_flag_id_translated_name(preq->source.value.roadflag));
3247 }
3248 return TRUE;
3249 case REQ_RANGE_CITY:
3250 fc_strlcat(buf, prefix, bufsz);
3251 if (preq->present) {
3253 /* TRANS: %s is a (translatable) road flag. */
3254 _("Requires a road with the \"%s\" flag on a tile "
3255 "within the city radius."),
3256 road_flag_id_translated_name(preq->source.value.roadflag));
3257 } else {
3259 /* TRANS: %s is a (translatable) road flag. */
3260 _("Prevented by a road with the \"%s\" flag on any tile "
3261 "within the city radius."),
3262 road_flag_id_translated_name(preq->source.value.roadflag));
3263 }
3264 return TRUE;
3266 fc_strlcat(buf, prefix, bufsz);
3267 if (preq->present) {
3269 /* TRANS: %s is a (translatable) road flag. */
3270 _("Requires a road with the \"%s\" flag on a tile "
3271 "within the city radius or the city radius of a "
3272 "trade partner."),
3273 road_flag_id_translated_name(preq->source.value.roadflag));
3274 } else {
3276 /* TRANS: %s is a (translatable) road flag. */
3277 _("Prevented by a road with the \"%s\" flag on any tile "
3278 "within the city radius or the city radius of a "
3279 "trade partner."),
3280 road_flag_id_translated_name(preq->source.value.roadflag));
3281 }
3282 return TRUE;
3284 case REQ_RANGE_PLAYER:
3285 case REQ_RANGE_TEAM:
3286 case REQ_RANGE_ALLIANCE:
3287 case REQ_RANGE_WORLD:
3288 case REQ_RANGE_COUNT:
3289 /* Not supported. */
3290 return FALSE;
3291 }
3292 return TRUE;
3293}
3294
3295/*************************************************************/
3300static bool req_text_extra_flag(char *buf, size_t bufsz,
3301 struct player *pplayer,
3302 const struct requirement *preq,
3303 const char *prefix)
3304{
3305 switch (preq->range) {
3306 case REQ_RANGE_LOCAL:
3307 fc_strlcat(buf, prefix, bufsz);
3308 if (preq->present) {
3310 /* TRANS: %s is a (translatable) extra flag. */
3311 _("Only applies to extras with the \"%s\" flag."),
3313 (preq->source.value.extraflag));
3314 } else {
3316 /* TRANS: %s is a (translatable) extra flag. */
3317 _("Does not apply to extras with the \"%s\" flag."),
3319 (preq->source.value.extraflag));
3320 }
3321 return TRUE;
3322 case REQ_RANGE_TILE:
3323 fc_strlcat(buf, prefix, bufsz);
3324 if (preq->present) {
3326 /* TRANS: %s is a (translatable) extra flag. */
3327 _("Requires an extra with the \"%s\" flag on the tile."),
3328 extra_flag_id_translated_name(preq->source.value.extraflag));
3329 } else {
3331 /* TRANS: %s is a (translatable) extra flag. */
3332 _("Prevented by an extra with the \"%s\" flag on the "
3333 "tile."),
3334 extra_flag_id_translated_name(preq->source.value.extraflag));
3335 }
3336 return TRUE;
3338 fc_strlcat(buf, prefix, bufsz);
3339 if (preq->present) {
3341 /* TRANS: %s is a (translatable) extra flag. */
3342 _("Requires an extra with the \"%s\" flag on the "
3343 "tile or a cardinally adjacent tile."),
3344 extra_flag_id_translated_name(preq->source.value.extraflag));
3345 } else {
3347 /* TRANS: %s is a (translatable) extra flag. */
3348 _("Prevented by an extra with the \"%s\" flag on "
3349 "the tile or any cardinally adjacent tile."),
3350 extra_flag_id_translated_name(preq->source.value.extraflag));
3351 }
3352 return TRUE;
3353 case REQ_RANGE_ADJACENT:
3354 fc_strlcat(buf, prefix, bufsz);
3355 if (preq->present) {
3357 /* TRANS: %s is a (translatable) extra flag. */
3358 _("Requires an extra with the \"%s\" flag on the "
3359 "tile or an adjacent tile."),
3360 extra_flag_id_translated_name(preq->source.value.extraflag));
3361 } else {
3363 /* TRANS: %s is a (translatable) extra flag. */
3364 _("Prevented by an extra with the \"%s\" flag on "
3365 "the tile or any adjacent tile."),
3366 extra_flag_id_translated_name(preq->source.value.extraflag));
3367 }
3368 return TRUE;
3369 case REQ_RANGE_CITY:
3370 fc_strlcat(buf, prefix, bufsz);
3371 if (preq->present) {
3373 /* TRANS: %s is a (translatable) extra flag. */
3374 _("Requires an extra with the \"%s\" flag on a tile "
3375 "within the city radius."),
3376 extra_flag_id_translated_name(preq->source.value.extraflag));
3377 } else {
3379 /* TRANS: %s is a (translatable) extra flag. */
3380 _("Prevented by an extra with the \"%s\" flag on any tile "
3381 "within the city radius."),
3382 extra_flag_id_translated_name(preq->source.value.extraflag));
3383 }
3384 return TRUE;
3386 fc_strlcat(buf, prefix, bufsz);
3387 if (preq->present) {
3389 /* TRANS: %s is a (translatable) extra flag. */
3390 _("Requires an extra with the \"%s\" flag on a tile "
3391 "within the city radius or the city radius of a "
3392 "trade partner."),
3393 extra_flag_id_translated_name(preq->source.value.extraflag));
3394 } else {
3396 /* TRANS: %s is a (translatable) extra flag. */
3397 _("Prevented by an extra with the \"%s\" flag on any tile "
3398 "within the city radius or the city radius of a "
3399 "trade partner."),
3400 extra_flag_id_translated_name(preq->source.value.extraflag));
3401 }
3402 return TRUE;
3404 case REQ_RANGE_PLAYER:
3405 case REQ_RANGE_TEAM:
3406 case REQ_RANGE_ALLIANCE:
3407 case REQ_RANGE_WORLD:
3408 case REQ_RANGE_COUNT:
3409 /* Not supported. */
3410 return FALSE;
3411 }
3412 return TRUE;
3413}
3414
3415/*************************************************************/
3420static bool req_text_min_year(char *buf, size_t bufsz,
3421 struct player *pplayer,
3422 const struct requirement *preq,
3423 const char *prefix)
3424{
3425 if (preq->range != REQ_RANGE_WORLD) {
3426 return FALSE;
3427 }
3428 fc_strlcat(buf, prefix, bufsz);
3429 if (preq->present) {
3431 _("Requires the game to have reached the year %s."),
3432 textyear(preq->source.value.minyear));
3433 } else {
3435 _("Requires that the game has not yet reached the "
3436 "year %s."),
3437 textyear(preq->source.value.minyear));
3438 }
3439 return TRUE;
3440}
3441
3442/*************************************************************/
3447static bool req_text_min_cal_frag(char *buf, size_t bufsz,
3448 struct player *pplayer,
3449 const struct requirement *preq,
3450 const char *prefix)
3451{
3452 if (preq->range != REQ_RANGE_WORLD) {
3453 return FALSE;
3454 }
3455 fc_strlcat(buf, prefix, bufsz);
3456 if (preq->present) {
3458 /* TRANS: %s is a representation of a calendar fragment,
3459 * from the ruleset. May be a bare number. */
3460 _("Requires the game to have reached %s."),
3461 textcalfrag(preq->source.value.mincalfrag));
3462 } else {
3464 /* TRANS: %s is a representation of a calendar fragment,
3465 * from the ruleset. May be a bare number. */
3466 _("Requires that the game has not yet reached %s."),
3467 textcalfrag(preq->source.value.mincalfrag));
3468 }
3469 return TRUE;
3470}
3471
3472/*************************************************************/
3477static bool req_text_topo_property(char *buf, size_t bufsz,
3478 struct player *pplayer,
3479 const struct requirement *preq,
3480 const char *prefix)
3481{
3482 if (preq->range != REQ_RANGE_WORLD) {
3483 return FALSE;
3484 }
3485 fc_strlcat(buf, prefix, bufsz);
3486 if (preq->present) {
3488 /* TRANS: topology flag name ("Hex", "ISO") */
3489 _("Requires %s map."),
3490 _(topo_flag_name(preq->source.value.topo_property)));
3491 } else {
3493 /* TRANS: topology flag name ("Hex", "ISO") */
3494 _("Prevented on %s map."),
3495 _(topo_flag_name(preq->source.value.topo_property)));
3496 }
3497 return TRUE;
3498}
3499
3500/*************************************************************/
3505static bool req_text_wrap_property(char *buf, size_t bufsz,
3506 struct player *pplayer,
3507 const struct requirement *preq,
3508 const char *prefix)
3509{
3510 if (preq->range != REQ_RANGE_WORLD) {
3511 return FALSE;
3512 }
3513 fc_strlcat(buf, prefix, bufsz);
3514 if (preq->present) {
3516 /* TRANS: wrap flag name ("WrapX", "WrapY") */
3517 _("Requires %s map."),
3518 _(wrap_flag_name(preq->source.value.wrap_property)));
3519 } else {
3521 /* TRANS: wrap flag name ("WrapX", "WrapY") */
3522 _("Prevented on %s map."),
3523 _(wrap_flag_name(preq->source.value.wrap_property)));
3524 }
3525 return TRUE;
3526}
3527
3528/*************************************************************/
3533static bool req_text_server_setting(char *buf, size_t bufsz,
3534 struct player *pplayer,
3535 const struct requirement *preq,
3536 const char *prefix)
3537{
3538 if (preq->range != REQ_RANGE_WORLD) {
3539 return FALSE;
3540 }
3541 fc_strlcat(buf, prefix, bufsz);
3543 /* TRANS: %s is a server setting, its value and if it is
3544 * required to be present or absent. The string's format
3545 * is specified in ssetv_human_readable().
3546 * Example: "killstack is enabled". */
3547 _("Requires that the server setting %s."),
3548 ssetv_human_readable(preq->source.value.ssetval,
3549 preq->present));
3550 return TRUE;
3551}
3552
3553/*************************************************************/
3558static bool req_text_age(char *buf, size_t bufsz,
3559 struct player *pplayer,
3560 const struct requirement *preq,
3561 const char *prefix)
3562{
3563 fc_strlcat(buf, prefix, bufsz);
3564 if (preq->present) {
3566 _("Requires age of %d turns."),
3567 preq->source.value.age);
3568 } else {
3570 _("Prevented if age is over %d turns."),
3571 preq->source.value.age);
3572 }
3573 return TRUE;
3574}
3575
3576/*************************************************************/
3581static bool req_text_form_age(char *buf, size_t bufsz,
3582 struct player *pplayer,
3583 const struct requirement *preq,
3584 const char *prefix)
3585{
3586 fc_strlcat(buf, prefix, bufsz);
3587 if (preq->present) {
3589 _("Requires form age of %d turns."),
3590 preq->source.value.form_age);
3591 } else {
3593 _("Prevented if form age is over %d turns."),
3594 preq->source.value.form_age);
3595 }
3596 return TRUE;
3597}
3598
3599/*************************************************************/
3604static bool req_text_min_techs(char *buf, size_t bufsz,
3605 struct player *pplayer,
3606 const struct requirement *preq,
3607 const char *prefix)
3608{
3609 switch (preq->range) {
3610 case REQ_RANGE_WORLD:
3611 fc_strlcat(buf, prefix, bufsz);
3612 if (preq->present) {
3614 _("Requires %d techs to be known in the world."),
3615 preq->source.value.min_techs);
3616 } else {
3618 _("Prevented when %d techs are known in the world."),
3619 preq->source.value.min_techs);
3620 }
3621 return TRUE;
3622 case REQ_RANGE_PLAYER:
3623 fc_strlcat(buf, prefix, bufsz);
3624 if (preq->present) {
3626 _("Requires player to know %d techs."),
3627 preq->source.value.min_techs);
3628 } else {
3630 _("Prevented when player knows %d techs."),
3631 preq->source.value.min_techs);
3632 }
3633 return TRUE;
3634 case REQ_RANGE_LOCAL:
3635 case REQ_RANGE_TILE:
3637 case REQ_RANGE_ADJACENT:
3638 case REQ_RANGE_CITY:
3641 case REQ_RANGE_TEAM:
3642 case REQ_RANGE_ALLIANCE:
3643 case REQ_RANGE_COUNT:
3644 /* Not supported. */
3645 return FALSE;
3646 }
3647 return TRUE;
3648}
3649
3650/*************************************************************/
3655static bool req_text_future_techs(char *buf, size_t bufsz,
3656 struct player *pplayer,
3657 const struct requirement *preq,
3658 const char *prefix)
3659{
3660 switch (preq->range) {
3661 case REQ_RANGE_WORLD:
3662 fc_strlcat(buf, prefix, bufsz);
3663 if (preq->present) {
3665 _("Requires %d future techs to be known in the world."),
3666 preq->source.value.future_techs);
3667 } else {
3669 _("Prevented when %d future techs are known in the world."),
3670 preq->source.value.future_techs);
3671 }
3672 return TRUE;
3673 case REQ_RANGE_PLAYER:
3674 fc_strlcat(buf, prefix, bufsz);
3675 if (preq->present) {
3677 _("Requires player to know %d future techs."),
3678 preq->source.value.future_techs);
3679 } else {
3681 _("Prevented when player knows %d future techs."),
3682 preq->source.value.future_techs);
3683 }
3684 return TRUE;
3685 case REQ_RANGE_LOCAL:
3686 case REQ_RANGE_TILE:
3688 case REQ_RANGE_ADJACENT:
3689 case REQ_RANGE_CITY:
3692 case REQ_RANGE_TEAM:
3693 case REQ_RANGE_ALLIANCE:
3694 case REQ_RANGE_COUNT:
3695 /* Not supported. */
3696 return FALSE;
3697 }
3698 return TRUE;
3699}
3700
3701/*************************************************************/
3706static bool req_text_min_cities(char *buf, size_t bufsz,
3707 struct player *pplayer,
3708 const struct requirement *preq,
3709 const char *prefix)
3710{
3711 switch (preq->range) {
3712 case REQ_RANGE_PLAYER:
3713 fc_strlcat(buf, prefix, bufsz);
3714 if (preq->present) {
3716 _("Requires player to have at least %d cities."),
3717 preq->source.value.min_cities);
3718 } else {
3720 _("Prevented when player has at least %d cities."),
3721 preq->source.value.min_cities);
3722 }
3723 return TRUE;
3724 case REQ_RANGE_WORLD:
3725 case REQ_RANGE_LOCAL:
3726 case REQ_RANGE_TILE:
3728 case REQ_RANGE_ADJACENT:
3729 case REQ_RANGE_CITY:
3732 case REQ_RANGE_TEAM:
3733 case REQ_RANGE_ALLIANCE:
3734 case REQ_RANGE_COUNT:
3735 /* Not supported. */
3736 return FALSE;
3737 }
3738 return TRUE;
3739}
3740
3741/*************************************************************/
3746static bool req_text_terrain_alter(char *buf, size_t bufsz,
3747 struct player *pplayer,
3748 const struct requirement *preq,
3749 const char *prefix)
3750{
3751 switch (preq->range) {
3752 case REQ_RANGE_TILE:
3753 fc_strlcat(buf, prefix, bufsz);
3754 if (preq->present) {
3756 _("Requires terrain on which alteration %s is "
3757 "possible."),
3758 Q_(terrain_alteration_name(preq->source.value.terrainalter)));
3759 } else {
3761 _("Prevented by terrain on which alteration %s "
3762 "can be made."),
3763 Q_(terrain_alteration_name(preq->source.value.terrainalter)));
3764 }
3765 return TRUE;
3767 case REQ_RANGE_ADJACENT:
3768 case REQ_RANGE_CITY:
3771 case REQ_RANGE_PLAYER:
3772 case REQ_RANGE_TEAM:
3773 case REQ_RANGE_ALLIANCE:
3774 case REQ_RANGE_WORLD:
3775 case REQ_RANGE_LOCAL:
3776 case REQ_RANGE_COUNT:
3777 /* Not supported. */
3778 return FALSE;
3779 }
3780 return TRUE;
3781}
3782
3783/*************************************************************/
3788static bool req_text_city_tile(char *buf, size_t bufsz,
3789 struct player *pplayer,
3790 const struct requirement *preq,
3791 const char *prefix)
3792{
3793 if (preq->source.value.citytile == CITYT_LAST) {
3794 return FALSE;
3795 } else {
3796 static char *tile_property = nullptr;
3797
3798 switch (preq->source.value.citytile) {
3799 case CITYT_CENTER:
3800 tile_property = _("city centers");
3801 break;
3802 case CITYT_CLAIMED:
3803 tile_property = _("claimed tiles");
3804 break;
3805 case CITYT_EXTRAS_OWNED:
3806 tile_property = _("owned extras");
3807 break;
3808 case CITYT_WORKED:
3809 tile_property = _("worked tiles");
3810 break;
3812 /* TRANS: a specific city for each use case */
3813 tile_property = _("tiles on the same continent as the city");
3814 break;
3816 {
3817 bool oceanic_cities = FALSE; /* FIXME: maybe cache globally? */
3818
3823 /* TRANS: a specific city for each use case */
3824 tile_property = _("tiles of a mass of a different "
3825 "terrain class next to the city");
3826 break;
3827 }
3829 if (oceanic_cities) {
3830 break;
3831 }
3832 /* TRANS: a specific city for each use case */
3833 tile_property = _("tiles of a body of water next to the city");
3834 }
3835 break;
3836 case CITYT_LAST:
3837 fc_assert(preq->source.value.citytile != CITYT_LAST);
3838 break;
3839 }
3840
3841 switch (preq->range) {
3842 case REQ_RANGE_TILE:
3843 fc_strlcat(buf, prefix, bufsz);
3844 if (preq->present) {
3846 /* TRANS: tile property ("city centers", etc) */
3847 Q_("?tileprop:Applies only to %s."), tile_property);
3848 } else {
3850 /* TRANS: tile property ("city centers", etc) */
3851 Q_("?tileprop:Does not apply to %s."), tile_property);
3852 }
3853 return TRUE;
3855 fc_strlcat(buf, prefix, bufsz);
3856 if (preq->present) {
3857 /* TRANS: tile property ("city centers", etc) */
3858 cat_snprintf(buf, bufsz, Q_("?tileprop:Applies only to %s and "
3859 "cardinally adjacent tiles."),
3861 } else {
3862 /* TRANS: tile property ("city centers", etc) */
3863 cat_snprintf(buf, bufsz, Q_("?tileprop:Does not apply to %s or "
3864 "cardinally adjacent tiles."),
3866 }
3867 return TRUE;
3868 case REQ_RANGE_ADJACENT:
3869 fc_strlcat(buf, prefix, bufsz);
3870 if (preq->present) {
3871 /* TRANS: tile property ("city centers", etc) */
3872 cat_snprintf(buf, bufsz, Q_("?tileprop:Applies only to %s and "
3873 "adjacent tiles."), tile_property);
3874 } else {
3875 /* TRANS: tile property ("city centers", etc) */
3876 cat_snprintf(buf, bufsz, Q_("?tileprop:Does not apply to %s or "
3877 "adjacent tiles."), tile_property);
3878 }
3879 return TRUE;
3880 case REQ_RANGE_CITY:
3883 case REQ_RANGE_PLAYER:
3884 case REQ_RANGE_TEAM:
3885 case REQ_RANGE_ALLIANCE:
3886 case REQ_RANGE_WORLD:
3887 case REQ_RANGE_LOCAL:
3888 case REQ_RANGE_COUNT:
3889 /* Not supported. */
3890 return FALSE;
3891 }
3892 }
3893 return TRUE;
3894}
3895
3896/*************************************************************/
3901static bool req_text_city_status(char *buf, size_t bufsz,
3902 struct player *pplayer,
3903 const struct requirement *preq,
3904 const char *prefix)
3905{
3906 if (preq->source.value.citystatus != CITYS_LAST) {
3907 static char *city_property = nullptr;
3908
3909 switch (preq->source.value.citystatus) {
3911 city_property = _("owned by original");
3912 break;
3913 case CITYS_STARVED:
3914 city_property = _("starved");
3915 break;
3916 case CITYS_DISORDER:
3917 city_property = _("disorder");
3918 break;
3919 case CITYS_CELEBRATION:
3920 city_property = _("celebration");
3921 break;
3922 case CITYS_TRANSFERRED:
3923 city_property = _("transferred");
3924 break;
3926 city_property = _("capitalconnected");
3927 break;
3928 case CITYS_LAST:
3929 fc_assert(preq->source.value.citystatus != CITYS_LAST);
3930 break;
3931 }
3932
3933 switch (preq->range) {
3934 case REQ_RANGE_CITY:
3935 fc_strlcat(buf, prefix, bufsz);
3936 if (preq->present) {
3937 /* TRANS: city property ("owned by original", etc) */
3938 cat_snprintf(buf, bufsz, Q_("?cityprop:Applies only to %s cities."),
3940 } else {
3941 /* TRANS: city property ("owned by original", etc) */
3942 cat_snprintf(buf, bufsz, Q_("?cityprop:Does not apply to %s cities."),
3944 }
3945 return TRUE;
3947 fc_strlcat(buf, prefix, bufsz);
3948 if (preq->present) {
3949 /* TRANS: city property ("owned by original", etc) */
3950 cat_snprintf(buf, bufsz, Q_("?cityprop:Applies only to %s cities or "
3951 "their trade partners."), city_property);
3952 } else {
3953 /* TRANS: city property ("owned by original", etc) */
3954 cat_snprintf(buf, bufsz, Q_("?cityprop:Does not apply to %s cities or "
3955 "their trade partners."), city_property);
3956 }
3957 return TRUE;
3958 case REQ_RANGE_LOCAL:
3959 case REQ_RANGE_TILE:
3960 case REQ_RANGE_ADJACENT:
3963 case REQ_RANGE_PLAYER:
3964 case REQ_RANGE_TEAM:
3965 case REQ_RANGE_ALLIANCE:
3966 case REQ_RANGE_WORLD:
3967 case REQ_RANGE_COUNT:
3968 /* Not supported. */
3969 return FALSE;
3970 }
3971 }
3972 return TRUE;
3973}
3974
3975/*************************************************************/
3980static bool req_text_min_latitude(char *buf, size_t bufsz,
3981 struct player *pplayer,
3982 const struct requirement *preq,
3983 const char *prefix)
3984{
3985 switch (preq->range) {
3986 case REQ_RANGE_WORLD:
3987 fc_strlcat(buf, prefix, bufsz);
3988 if (preq->present) {
3990 _("Some part of the world must be at latitude %d or "
3991 "further north."),
3992 preq->source.value.latitude);
3993 } else {
3995 _("The entire world must be at latitude %d or "
3996 "further south."),
3997 preq->source.value.latitude - 1);
3998 }
3999 return TRUE;
4000 case REQ_RANGE_TILE:
4001 fc_strlcat(buf, prefix, bufsz);
4002 if (preq->present) {
4004 _("Tile must be at latitude %d or further north."),
4005 preq->source.value.latitude);
4006 } else {
4008 _("Tile must be at latitude %d or further south."),
4009 preq->source.value.latitude - 1);
4010 }
4011 return TRUE;
4013 fc_strlcat(buf, prefix, bufsz);
4014 if (preq->present) {
4016 _("A cardinally adjacent tile must be at latitude "
4017 "%d or further north."),
4018 preq->source.value.latitude);
4019 } else {
4021 _("All cardinally adjacent tiles must be at latitude "
4022 "%d or further south."),
4023 preq->source.value.latitude - 1);
4024 }
4025 return TRUE;
4026 case REQ_RANGE_ADJACENT:
4027 fc_strlcat(buf, prefix, bufsz);
4028 if (preq->present) {
4030 _("An adjacent tile must be at latitude %d or "
4031 "further north."),
4032 preq->source.value.latitude);
4033 } else {
4035 _("All adjacent tiles must be at latitude %d or "
4036 "further south."),
4037 preq->source.value.latitude - 1);
4038 }
4039 return TRUE;
4040 case REQ_RANGE_CITY:
4043 case REQ_RANGE_PLAYER:
4044 case REQ_RANGE_TEAM:
4045 case REQ_RANGE_ALLIANCE:
4046 case REQ_RANGE_LOCAL:
4047 case REQ_RANGE_COUNT:
4048 /* Not supported. */
4049 return FALSE;
4050 }
4051 return TRUE;
4052}
4053
4054/*************************************************************/
4059static bool req_text_max_latitude(char *buf, size_t bufsz,
4060 struct player *pplayer,
4061 const struct requirement *preq,
4062 const char *prefix)
4063{
4064 switch (preq->range) {
4065 case REQ_RANGE_WORLD:
4066 fc_strlcat(buf, prefix, bufsz);
4067 if (preq->present) {
4069 _("Some part of the world must be at latitude %d or "
4070 "further south."),
4071 preq->source.value.latitude);
4072 } else {
4074 _("The entire world must be at latitude %d or "
4075 "further north."),
4076 preq->source.value.latitude + 1);
4077 }
4078 return TRUE;
4079 case REQ_RANGE_TILE:
4080 fc_strlcat(buf, prefix, bufsz);
4081 if (preq->present) {
4083 _("Tile must be at latitude %d or further south."),
4084 preq->source.value.latitude);
4085 } else {
4087 _("Tile must be at latitude %d or further north."),
4088 preq->source.value.latitude + 1);
4089 }
4090 return TRUE;
4092 fc_strlcat(buf, prefix, bufsz);
4093 if (preq->present) {
4095 _("A cardinally adjacent tile must be at latitude "
4096 "%d or further south."),
4097 preq->source.value.latitude);
4098 } else {
4100 _("All cardinally adjacent tiles must be at latitude "
4101 "%d or further north."),
4102 preq->source.value.latitude + 1);
4103 }
4104 return TRUE;
4105 case REQ_RANGE_ADJACENT:
4106 fc_strlcat(buf, prefix, bufsz);
4107 if (preq->present) {
4109 _("An adjacent tile must be at latitude %d or "
4110 "further south."),
4111 preq->source.value.latitude);
4112 } else {
4114 _("All adjacent tiles must be at latitude %d or "
4115 "further north."),
4116 preq->source.value.latitude + 1);
4117 }
4118 return TRUE;
4119 case REQ_RANGE_CITY:
4122 case REQ_RANGE_PLAYER:
4123 case REQ_RANGE_TEAM:
4124 case REQ_RANGE_ALLIANCE:
4125 case REQ_RANGE_LOCAL:
4126 case REQ_RANGE_COUNT:
4127 /* Not supported. */
4128 return FALSE;
4129 }
4130 return TRUE;
4131}
4132
4133/*************************************************************/
4138static bool req_text_distance_sq(char *buf, size_t bufsz,
4139 struct player *pplayer,
4140 const struct requirement *preq,
4141 const char *prefix)
4142{
4143 switch (preq->range) {
4144 case REQ_RANGE_TILE:
4145 fc_strlcat(buf, prefix, bufsz);
4146 /* Test some special cases */
4147 switch (preq->source.value.distance_sq)
4148 {
4149 case 0:
4150 if (preq->present) {
4151 fc_strlcat(buf, _("Must be the same tile."), bufsz);
4152 } else {
4153 fc_strlcat(buf, _("Must not be the same tile."), bufsz);
4154 }
4155 break;
4156 case 1:
4157 if (preq->present) {
4158 fc_strlcat(buf, _("Must be cardinally adjacent."), bufsz);
4159 } else {
4160 fc_strlcat(buf, _("Must not be cardinally adjacent."), bufsz);
4161 }
4162 break;
4163 case 2:
4164 case 3:
4165 if (preq->present) {
4166 fc_strlcat(buf, _("Must be adjacent."), bufsz);
4167 } else {
4168 fc_strlcat(buf, _("Must not be adjacent."), bufsz);
4169 }
4170 break;
4171
4172 default:
4173 if (preq->present) {
4175 _("The squared distance between the tiles "
4176 "must be at most %d."),
4177 preq->source.value.distance_sq);
4178 } else {
4180 _("The squared distance between the tiles "
4181 "must be at least %d."),
4182 preq->source.value.distance_sq + 1);
4183 }
4184 break;
4185 }
4186 return TRUE;
4188 case REQ_RANGE_ADJACENT:
4189 case REQ_RANGE_CITY:
4192 case REQ_RANGE_PLAYER:
4193 case REQ_RANGE_TEAM:
4194 case REQ_RANGE_ALLIANCE:
4195 case REQ_RANGE_WORLD:
4196 case REQ_RANGE_LOCAL:
4197 case REQ_RANGE_COUNT:
4198 /* Not supported. */
4199 return FALSE;
4200 }
4201 return TRUE;
4202}
4203
4204/*************************************************************/
4209static bool req_text_max_region_tiles(char *buf, size_t bufsz,
4210 struct player *pplayer,
4211 const struct requirement *preq,
4212 const char *prefix)
4213{
4214 switch (preq->range) {
4216 fc_strlcat(buf, prefix, bufsz);
4217 /* Off-by-one: The requirement counts the tile itself, we're phrasing
4218 * the helptext in terms of *other* tiles only. */
4219 if (preq->present) {
4220 if (preq->source.value.region_tiles == 1) {
4221 /* Special case for zero */
4223 _("No other cardinally adjacent tile may be part of "
4224 "the same continent or ocean."),
4225 bufsz);
4226 } else {
4228 PL_("No more than %d other cardinally adjacent tile "
4229 "may be part of the same continent or ocean.",
4230 "No more than %d other cardinally adjacent tiles "
4231 "may be part of the same continent or ocean.",
4232 preq->source.value.region_tiles - 1),
4233 preq->source.value.region_tiles - 1);
4234 }
4235 } else {
4237 PL_("Requires at least %d other cardinally adjacent "
4238 "tile of the same continent or ocean.",
4239 "Requires at least %d other cardinally adjacent "
4240 "tiles of the same continent or ocean.",
4241 preq->source.value.region_tiles),
4242 preq->source.value.region_tiles);
4243 }
4244
4245 return TRUE;
4246 case REQ_RANGE_ADJACENT:
4247 fc_strlcat(buf, prefix, bufsz);
4248 /* Off-by-one: The requirement counts the tile itself, we're phrasing
4249 * the helptext in terms of *other* tiles only. */
4250 if (preq->present) {
4251 if (preq->source.value.region_tiles == 1) {
4252 /* Special case for zero */
4254 _("No other adjacent tile may be part of the same "
4255 "continent or ocean."),
4256 bufsz);
4257 } else {
4259 PL_("No more than %d other adjacent tile may be "
4260 "part of the same continent or ocean.",
4261 "No more than %d other adjacent tiles may be "
4262 "part of the same continent or ocean.",
4263 preq->source.value.region_tiles - 1),
4264 preq->source.value.region_tiles - 1);
4265 }
4266 } else {
4268 PL_("Requires at least %d other adjacent tile of the "
4269 "same continent or ocean.",
4270 "Requires at least %d other adjacent tiles of the "
4271 "same continent or ocean.",
4272 preq->source.value.region_tiles),
4273 preq->source.value.region_tiles);
4274 }
4275
4276 return TRUE;
4278 fc_strlcat(buf, prefix, bufsz);
4279 if (preq->present) {
4281 _("Requires a continent or ocean size of at most %d."),
4282 preq->source.value.region_tiles);
4283 } else {
4285 _("Requires a continent or ocean size of at least %d."),
4286 preq->source.value.region_tiles + 1);
4287 }
4288
4289 return TRUE;
4290 case REQ_RANGE_PLAYER:
4291 case REQ_RANGE_TEAM:
4292 case REQ_RANGE_ALLIANCE:
4293 case REQ_RANGE_WORLD:
4294 case REQ_RANGE_LOCAL:
4295 case REQ_RANGE_TILE:
4296 case REQ_RANGE_CITY:
4298 case REQ_RANGE_COUNT:
4299 /* Not supported. */
4300 return FALSE;
4301 }
4302 return TRUE;
4303}
4304
4305/*************************************************************/
4310static bool req_text_tile_rel(char *buf, size_t bufsz,
4311 struct player *pplayer,
4312 const struct requirement *preq,
4313 const char *prefix)
4314{
4315 switch (preq->source.value.tilerel) {
4316 case TREL_SAME_TCLASS:
4317 switch (preq->range) {
4318 case REQ_RANGE_TILE:
4319 fc_strlcat(buf, prefix, bufsz);
4320 if (preq->present) {
4321 fc_strlcat(buf, _("Must be on the same terrain class."),
4322 bufsz);
4323 } else {
4324 fc_strlcat(buf, _("Must be on a different terrain class."),
4325 bufsz);
4326 }
4327 return TRUE;
4329 fc_strlcat(buf, prefix, bufsz);
4330 if (preq->present) {
4331 fc_strlcat(buf, _("Must be cardinally adjacent to the same "
4332 "terrain class."),
4333 bufsz);
4334 } else {
4335 fc_strlcat(buf, _("Must not be cardinally adjacent to the same "
4336 "terrain class."),
4337 bufsz);
4338 }
4339 return TRUE;
4340 case REQ_RANGE_ADJACENT:
4341 fc_strlcat(buf, prefix, bufsz);
4342 if (preq->present) {
4343 fc_strlcat(buf, _("Must be adjacent to the same terrain class."),
4344 bufsz);
4345 } else {
4346 fc_strlcat(buf, _("Must not be adjacent to the same terrain "
4347 "class."),
4348 bufsz);
4349 }
4350 return TRUE;
4351 case REQ_RANGE_CITY:
4354 case REQ_RANGE_PLAYER:
4355 case REQ_RANGE_TEAM:
4356 case REQ_RANGE_ALLIANCE:
4357 case REQ_RANGE_WORLD:
4358 case REQ_RANGE_LOCAL:
4359 case REQ_RANGE_COUNT:
4360 /* Not supported. */
4361 return FALSE;
4362 }
4363 break;
4364 case TREL_SAME_REGION:
4365 switch (preq->range) {
4366 case REQ_RANGE_TILE:
4367 fc_strlcat(buf, prefix, bufsz);
4368 if (preq->present) {
4369 fc_strlcat(buf, _("Must be on the same continent or ocean."),
4370 bufsz);
4371 } else {
4372 fc_strlcat(buf, _("Must be on a different continent or ocean."),
4373 bufsz);
4374 }
4375 return TRUE;
4377 fc_strlcat(buf, prefix, bufsz);
4378 if (preq->present) {
4379 fc_strlcat(buf, _("Must be cardinally adjacent to the same "
4380 "continent or ocean."),
4381 bufsz);
4382 } else {
4383 fc_strlcat(buf, _("Must not be cardinally adjacent to the same "
4384 "continent or ocean."),
4385 bufsz);
4386 }
4387 return TRUE;
4388 case REQ_RANGE_ADJACENT:
4389 fc_strlcat(buf, prefix, bufsz);
4390 if (preq->present) {
4391 fc_strlcat(buf, _("Must be adjacent to the same continent or "
4392 "ocean."),
4393 bufsz);
4394 } else {
4395 fc_strlcat(buf, _("Must not be adjacent to the same continent "
4396 "or ocean."),
4397 bufsz);
4398 }
4399 return TRUE;
4400 case REQ_RANGE_CITY:
4403 case REQ_RANGE_PLAYER:
4404 case REQ_RANGE_TEAM:
4405 case REQ_RANGE_ALLIANCE:
4406 case REQ_RANGE_WORLD:
4407 case REQ_RANGE_LOCAL:
4408 case REQ_RANGE_COUNT:
4409 /* Not supported. */
4410 return FALSE;
4411 }
4412 break;
4414 switch (preq->range) {
4416 fc_strlcat(buf, prefix, bufsz);
4417 if (preq->present) {
4418 fc_strlcat(buf, _("May only be cardinally adjacent to this "
4419 "other continent or ocean."),
4420 bufsz);
4421 } else {
4422 fc_strlcat(buf, _("Must be cardinally adjacent to more than "
4423 "just this other continent or ocean."),
4424 bufsz);
4425 }
4426 return TRUE;
4427 case REQ_RANGE_ADJACENT:
4428 fc_strlcat(buf, prefix, bufsz);
4429 if (preq->present) {
4430 fc_strlcat(buf, _("May only be adjacent to this other continent "
4431 "or ocean."),
4432 bufsz);
4433 } else {
4434 fc_strlcat(buf, _("Must be adjacent to more than just this "
4435 "other continent or ocean."),
4436 bufsz);
4437 }
4438 return TRUE;
4439 case REQ_RANGE_CITY:
4442 case REQ_RANGE_PLAYER:
4443 case REQ_RANGE_TEAM:
4444 case REQ_RANGE_ALLIANCE:
4445 case REQ_RANGE_WORLD:
4446 case REQ_RANGE_LOCAL:
4447 case REQ_RANGE_TILE:
4448 case REQ_RANGE_COUNT:
4449 /* Not supported. */
4450 return FALSE;
4451 }
4452 break;
4454 switch (preq->range) {
4455 case REQ_RANGE_TILE:
4456 fc_strlcat(buf, prefix, bufsz);
4457 if (preq->present) {
4458 fc_strlcat(buf, _("Must be on a lake or island surrounded by "
4459 "this continent or ocean."),
4460 bufsz);
4461 } else {
4462 fc_strlcat(buf, _("Must not be on a lake or island surrounded "
4463 "by this continent or ocean."),
4464 bufsz);
4465 }
4466 return TRUE;
4468 fc_strlcat(buf, prefix, bufsz);
4469 if (preq->present) {
4470 fc_strlcat(buf, _("Must be on or cardinally adjacent to a lake "
4471 "or island surrounded by this continent or "
4472 "ocean."),
4473 bufsz);
4474 } else {
4475 fc_strlcat(buf, _("Must not be on nor cardinally adjacent to a "
4476 "lake or island surrounded by this continent "
4477 "or ocean."),
4478 bufsz);
4479 }
4480 return TRUE;
4481 case REQ_RANGE_ADJACENT:
4482 fc_strlcat(buf, prefix, bufsz);
4483 if (preq->present) {
4484 fc_strlcat(buf, _("Must be on or adjacent to a lake or island "
4485 "surrounded by this continent or ocean."),
4486 bufsz);
4487 } else {
4488 fc_strlcat(buf, _("Must not be on nor adjacent to a lake or "
4489 "island surrounded by this continent or "
4490 "ocean."),
4491 bufsz);
4492 }
4493 return TRUE;
4494 case REQ_RANGE_CITY:
4497 case REQ_RANGE_PLAYER:
4498 case REQ_RANGE_TEAM:
4499 case REQ_RANGE_ALLIANCE:
4500 case REQ_RANGE_WORLD:
4501 case REQ_RANGE_LOCAL:
4502 case REQ_RANGE_COUNT:
4503 /* Not supported. */
4504 return FALSE;
4505 }
4506 break;
4507
4508 case TREL_COUNT:
4509 /* Invalid. */
4510 return FALSE;
4511 }
4512 return TRUE;
4513}
4514
4515/*************************************************************/
4526bool req_text_insert(char *buf, size_t bufsz, struct player *pplayer,
4527 const struct requirement *preq,
4528 enum rt_verbosity verb, const char *prefix)
4529{
4530 if (preq->quiet && verb != VERB_ACTUAL) {
4531 return FALSE;
4532 }
4533
4534 switch (preq->source.kind) {
4535 case VUT_NONE:
4536 return FALSE;
4537
4538 case VUT_COUNTER:
4539 return req_text_counter(buf, bufsz, pplayer, preq, prefix);
4540
4541 case VUT_ADVANCE:
4542 return req_text_advance(buf, bufsz, pplayer, preq, prefix);
4543
4544 case VUT_TECHFLAG:
4545 return req_text_techflag(buf, bufsz, pplayer, preq, prefix);
4546
4547 case VUT_GOVERNMENT:
4548 return req_text_government(buf, bufsz, pplayer, preq, prefix);
4549
4550 case VUT_GOVFLAG:
4551 return req_text_government_flag(buf, bufsz, pplayer, preq, prefix);
4552
4553 case VUT_ACHIEVEMENT:
4554 return req_text_achievement(buf, bufsz, pplayer, preq, prefix);
4555
4556 case VUT_ACTION:
4557 return req_text_action(buf, bufsz, pplayer, preq, prefix);
4558
4559 case VUT_IMPR_GENUS:
4560 return req_text_impr_genus(buf, bufsz, pplayer, preq, prefix);
4561
4562 case VUT_IMPR_FLAG:
4563 return req_text_impr_flag(buf, bufsz, pplayer, preq, prefix);
4564
4565 case VUT_PLAYER_FLAG:
4566 return req_text_player_flag(buf, bufsz, pplayer, preq, prefix);
4567
4568 case VUT_PLAYER_STATE:
4569 return req_text_player_state(buf, bufsz, pplayer, preq, prefix);
4570
4571 case VUT_IMPROVEMENT:
4572 case VUT_SITE:
4573 return req_text_improvement(buf, bufsz, pplayer, preq, prefix);
4574
4575 case VUT_EXTRA:
4576 return req_text_extra(buf, bufsz, pplayer, preq, prefix);
4577
4578 case VUT_TILEDEF:
4579 return req_text_tiledef(buf, bufsz, pplayer, preq, prefix);
4580
4581 case VUT_GOOD:
4582 return req_text_good(buf, bufsz, pplayer, preq, prefix);
4583
4584 case VUT_TERRAIN:
4585 return req_text_terrain(buf, bufsz, pplayer, preq, prefix);
4586
4587 case VUT_NATION:
4588 return req_text_nation(buf, bufsz, pplayer, preq, prefix);
4589
4590 case VUT_NATIONGROUP:
4591 return req_text_nation_group(buf, bufsz, pplayer, preq, prefix);
4592
4593 case VUT_STYLE:
4594 return req_text_style(buf, bufsz, pplayer, preq, prefix);
4595
4596 case VUT_NATIONALITY:
4597 return req_text_nationality(buf, bufsz, pplayer, preq, prefix);
4598
4599 case VUT_ORIGINAL_OWNER:
4600 return req_text_original_owner(buf, bufsz, pplayer, preq, prefix);
4601
4602 case VUT_DIPLREL:
4603 return req_text_diplrel(buf, bufsz, pplayer, preq, prefix);
4604
4605 case VUT_DIPLREL_TILE:
4606 return req_text_diplrel_tile(buf, bufsz, pplayer, preq, prefix);
4607
4608 case VUT_DIPLREL_TILE_O:
4609 return req_text_diplrel_tile_o(buf, bufsz, pplayer, preq, prefix);
4610
4612 return req_text_diplrel_unit_any(buf, bufsz, pplayer, preq, prefix);
4613
4615 return req_text_diplrel_unit_any_o(buf, bufsz, pplayer, preq, prefix);
4616
4617 case VUT_UTYPE:
4618 return req_text_utype(buf, bufsz, pplayer, preq, prefix);
4619
4620 case VUT_UTFLAG:
4621 return req_text_unitflag(buf, bufsz, pplayer, preq, prefix);
4622
4623 case VUT_UCLASS:
4624 return req_text_uclass(buf, bufsz, pplayer, preq, prefix);
4625
4626 case VUT_UCFLAG:
4627 return req_text_ucflag(buf, bufsz, pplayer, preq, prefix);
4628
4629 case VUT_UNITSTATE:
4630 return req_text_unit_state(buf, bufsz, pplayer, preq, prefix);
4631
4632 case VUT_ACTIVITY:
4633 return req_text_activity(buf, bufsz, pplayer, preq, prefix);
4634
4635 case VUT_MINMOVES:
4636 return req_text_min_moves(buf, bufsz, pplayer, preq, prefix);
4637
4638 case VUT_MINVETERAN:
4639 return req_text_min_veteran(buf, bufsz, pplayer, preq, prefix);
4640
4641 case VUT_MINHP:
4642 return req_text_min_hp(buf, bufsz, pplayer, preq, prefix);
4643
4644 case VUT_OTYPE:
4645 return req_text_otype(buf, bufsz, pplayer, preq, prefix);
4646
4647 case VUT_SPECIALIST:
4648 return req_text_specialist(buf, bufsz, pplayer, preq, prefix);
4649
4650 case VUT_MINSIZE:
4651 return req_text_min_size(buf, bufsz, pplayer, preq, prefix);
4652
4653 case VUT_MINCULTURE:
4654 return req_text_min_culture(buf, bufsz, pplayer, preq, prefix);
4655
4656 case VUT_MINFOREIGNPCT:
4657 return req_text_min_foreign_pct(buf, bufsz, pplayer, preq, prefix);
4658
4660 return req_text_max_tile_total_units(buf, bufsz, pplayer, preq, prefix);
4661
4663 return req_text_max_tile_top_units(buf, bufsz, pplayer, preq, prefix);
4664
4665 case VUT_AI_LEVEL:
4666 return req_text_ai_level(buf, bufsz, pplayer, preq, prefix);
4667
4668 case VUT_TERRAINCLASS:
4669 return req_text_terrain_class(buf, bufsz, pplayer, preq, prefix);
4670
4671 case VUT_TERRFLAG:
4672 return req_text_terrain_flag(buf, bufsz, pplayer, preq, prefix);
4673
4674 case VUT_ROADFLAG:
4675 return req_text_road_flag(buf, bufsz, pplayer, preq, prefix);
4676
4677 case VUT_EXTRAFLAG:
4678 return req_text_extra_flag(buf, bufsz, pplayer, preq, prefix);
4679
4680 case VUT_MINYEAR:
4681 return req_text_min_year(buf, bufsz, pplayer, preq, prefix);
4682
4683 case VUT_MINCALFRAG:
4684 return req_text_min_cal_frag(buf, bufsz, pplayer, preq, prefix);
4685
4686 case VUT_TOPO:
4687 return req_text_topo_property(buf, bufsz, pplayer, preq, prefix);
4688
4689 case VUT_WRAP:
4690 return req_text_wrap_property(buf, bufsz, pplayer, preq, prefix);
4691
4692 case VUT_SERVERSETTING:
4693 return req_text_server_setting(buf, bufsz, pplayer, preq, prefix);
4694
4695 case VUT_AGE:
4696 return req_text_age(buf, bufsz, pplayer, preq, prefix);
4697
4698 case VUT_FORM_AGE:
4699 return req_text_form_age(buf, bufsz, pplayer, preq, prefix);
4700
4701 case VUT_MINTECHS:
4702 return req_text_min_techs(buf, bufsz, pplayer, preq, prefix);
4703
4704 case VUT_FUTURETECHS:
4705 return req_text_future_techs(buf, bufsz, pplayer, preq, prefix);
4706
4707 case VUT_MINCITIES:
4708 return req_text_min_cities(buf, bufsz, pplayer, preq, prefix);
4709
4710 case VUT_TERRAINALTER:
4711 return req_text_terrain_alter(buf, bufsz, pplayer, preq, prefix);
4712
4713 case VUT_CITYTILE:
4714 return req_text_city_tile(buf, bufsz, pplayer, preq, prefix);
4715
4716 case VUT_CITYSTATUS:
4717 return req_text_city_status(buf, bufsz, pplayer, preq, prefix);
4718
4719 case VUT_MINLATITUDE:
4720 return req_text_min_latitude(buf, bufsz, pplayer, preq, prefix);
4721
4722 case VUT_MAXLATITUDE:
4723 return req_text_max_latitude(buf, bufsz, pplayer, preq, prefix);
4724
4726 return req_text_distance_sq(buf, bufsz, pplayer, preq, prefix);
4727
4729 return req_text_max_region_tiles(buf, bufsz, pplayer, preq, prefix);
4730
4731 case VUT_TILE_REL:
4732 return req_text_tile_rel(buf, bufsz, pplayer, preq, prefix);
4733
4734 case VUT_COUNT:
4735 break;
4736 }
4737
4738 if (verb == VERB_DEFAULT) {
4739 char text[256];
4740
4741 log_error("%s requirement %s in range %d is not supported in reqtext.c.",
4742 preq->present ? "Present" : "Absent",
4743 universal_name_translation(&preq->source, text, sizeof(text)),
4744 preq->range);
4745 }
4746
4747 return FALSE;
4748}
4749
4750/*************************************************************/
4755bool req_text_insert_nl(char *buf, size_t bufsz, struct player *pplayer,
4756 const struct requirement *preq,
4757 enum rt_verbosity verb, const char *prefix)
4758{
4759 if (req_text_insert(buf, bufsz, pplayer, preq, verb, prefix)) {
4760 fc_strlcat(buf, "\n", bufsz);
4761
4762 return TRUE;
4763 }
4764
4765 return FALSE;
4766}
const char * achievement_name_translation(struct achievement *pach)
const char * action_name_translation(const struct action *paction)
Definition actions.c:1251
void astr_free(struct astring *astr)
Definition astring.c:148
const char * astr_build_or_list(struct astring *astr, const char *const *items, size_t number)
Definition astring.c:313
static const char * astr_str(const struct astring *astr) fc__attribute((nonnull(1)))
Definition astring.h:93
#define ASTRING_INIT
Definition astring.h:44
const char * textcalfrag(int frag)
Definition calendar.c:101
const char * textyear(int year)
Definition calendar.c:121
const char * get_output_name(Output_type_id output)
Definition city.c:630
static struct fc_sockaddr_list * list
Definition clinet.c:102
char * incite_cost
Definition comments.c:77
const char * counter_rule_name(struct counter *pcount)
Definition counters.c:166
const char * extra_name_translation(const struct extra_type *pextra)
Definition extras.c:194
#define Q_(String)
Definition fcintl.h:70
#define PL_(String1, String2, n)
Definition fcintl.h:71
#define _(String)
Definition fcintl.h:67
const char * government_name_translation(const struct government *pgovern)
Definition government.c:145
static const int bufsz
Definition helpdlg.c:70
bool can_improvement_go_obsolete(const struct impr_type *pimprove)
bool is_wonder(const struct impr_type *pimprove)
bool is_great_wonder(const struct impr_type *pimprove)
const char * improvement_name_translation(const struct impr_type *pimprove)
#define fc_assert_msg(condition, message,...)
Definition log.h:182
#define fc_assert(condition)
Definition log.h:177
#define log_error(message,...)
Definition log.h:104
const char * move_points_text(int mp, bool reduce)
Definition movement.c:1066
const char * nation_adjective_translation(const struct nation_type *pnation)
Definition nation.c:149
const char * nation_group_name_translation(const struct nation_group *pgroup)
Definition nation.c:1080
const char * nation_plural_translation(const struct nation_type *pnation)
Definition nation.c:159
const char * diplrel_name_translation(int value)
Definition player.c:1614
static bool req_text_max_tile_top_units(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2849
static bool req_text_diplrel_unit_any_o(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1971
static bool req_text_nationality(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1551
static bool req_text_diplrel_unit_any(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1878
static bool req_text_improvement(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:523
static bool req_text_extra_flag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3300
static bool req_text_extra(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1008
static bool req_text_terrain(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1252
static bool req_text_min_latitude(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3980
static bool req_text_specialist(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2482
static bool req_text_topo_property(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3477
static bool req_text_government_flag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:279
static bool req_text_techflag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:166
static bool req_text_min_veteran(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2391
static bool req_text_impr_genus(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:405
static bool req_text_player_flag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:465
static bool req_text_min_foreign_pct(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2711
static bool req_text_distance_sq(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:4138
static bool req_text_wrap_property(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3505
static bool req_text_diplrel_tile(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1749
static bool req_text_uclass(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2104
static bool req_text_max_latitude(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:4059
static bool req_text_max_region_tiles(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:4209
static bool req_text_player_state(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:495
static bool req_text_unit_state(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2200
static bool req_text_nation_group(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1440
static bool req_text_max_tile_total_units(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2765
static bool req_text_original_owner(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1609
static bool req_text_diplrel_tile_o(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1836
static bool req_text_future_techs(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3655
static bool req_text_min_cities(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3706
static bool req_text_good(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1111
static bool req_text_action(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:376
static bool req_text_city_status(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3901
static bool req_text_impr_flag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:435
static bool req_text_form_age(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3581
static bool req_text_min_year(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3420
static bool req_text_min_moves(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2347
static bool req_text_style(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1521
static bool req_text_city_tile(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3788
static bool req_text_ai_level(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2933
static bool req_text_tile_rel(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:4310
static bool req_text_diplrel(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1649
static bool req_text_terrain_alter(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3746
static bool req_text_government(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:255
static bool req_text_advance(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:73
static bool req_text_min_size(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2508
static bool req_text_terrain_class(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2961
static bool req_text_min_hp(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2423
static bool req_text_min_techs(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3604
static bool req_text_ucflag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2144
static bool req_text_counter(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:47
bool req_text_insert_nl(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, enum rt_verbosity verb, const char *prefix)
Definition reqtext.c:4755
static bool req_text_road_flag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3180
static bool req_text_terrain_flag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3075
static bool req_text_unitflag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2053
static bool req_text_min_cal_frag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3447
static bool req_text_tiledef(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1149
static bool req_text_activity(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2307
static bool req_text_nation(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1342
static bool req_text_otype(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2456
bool req_text_insert(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, enum rt_verbosity verb, const char *prefix)
Definition reqtext.c:4526
static bool req_text_achievement(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:303
static bool req_text_min_culture(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2571
static bool req_text_utype(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2013
static bool req_text_age(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3558
static bool req_text_server_setting(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3533
rt_verbosity
Definition reqtext.h:20
@ VERB_ACTUAL
Definition reqtext.h:20
@ VERB_DEFAULT
Definition reqtext.h:20
const char * universal_name_translation(const struct universal *psource, char *buf, size_t bufsz)
const char * ssetv_human_readable(ssetv val, bool present)
const char * specialist_plural_translation(const struct specialist *sp)
Definition specialist.c:166
const char * style_name_translation(const struct nation_style *pstyle)
Definition style.c:99
size_t fc_strlcat(char *dest, const char *src, size_t n)
Definition support.c:822
int cat_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:986
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
const char * advance_name_translation(const struct advance *padvance)
Definition tech.c:305
const char * terrain_class_name_translation(enum terrain_class tclass)
Definition terrain.c:664
const char * terrain_name_translation(const struct terrain *pterrain)
Definition terrain.c:240
enum terrain_class terrain_type_terrain_class(const struct terrain *pterrain)
Definition terrain.c:585
#define terrain_type_iterate(_p)
Definition terrain.h:267
#define terrain_type_iterate_end
Definition terrain.h:273
#define terrain_has_flag(terr, flag)
Definition terrain.h:177
const char * tiledef_name_translation(const struct tiledef *td)
Definition tiledef.c:95
const char * goods_name_translation(struct goods_type *pgood)
const char * uclass_name_translation(const struct unit_class *pclass)
Definition unittype.c:1658
Unit_Class_id uclass_count(void)
Definition unittype.c:2475
const char * utype_name_translation(const struct unit_type *punittype)
Definition unittype.c:1586
bool role_units_translations(struct astring *astr, int flag, bool alts)
Definition unittype.c:1694
static bool uclass_has_flag(const struct unit_class *punitclass, enum unit_class_flag_id flag)
Definition unittype.h:773
#define unit_class_iterate(_p)
Definition unittype.h:916
#define unit_class_iterate_end
Definition unittype.h:923