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
1245 return TRUE;
1246}
1247
1248/*************************************************************/
1253static bool req_text_tiledef_conn(char *buf, size_t bufsz,
1254 struct player *pplayer,
1255 const struct requirement *preq,
1256 const char *prefix)
1257{
1258 if (preq->range == REQ_RANGE_CITY) {
1259 fc_strlcat(buf, prefix, bufsz);
1260 if (preq->present) {
1262 Q_("?tdconn:Requires access to tiledef %s."),
1263 tiledef_name_translation(preq->source.value.tiledef));
1264 } else {
1266 Q_("?tdconn:Prevented by access to tiledef %s."),
1267 tiledef_name_translation(preq->source.value.tiledef));
1268 }
1269 return TRUE;
1270 }
1271
1272 /* Not supported. */
1273 return FALSE;
1274}
1275
1276/*************************************************************/
1281static bool req_text_terrain(char *buf, size_t bufsz,
1282 struct player *pplayer,
1283 const struct requirement *preq,
1284 const char *prefix)
1285{
1286 switch (preq->range) {
1287 case REQ_RANGE_TILE:
1288 fc_strlcat(buf, prefix, bufsz);
1289 if (preq->present) {
1290 cat_snprintf(buf, bufsz, Q_("?terrain:Requires %s on the tile."),
1291 terrain_name_translation(preq->source.value.terrain));
1292 } else {
1293 cat_snprintf(buf, bufsz, Q_("?terrain:Prevented by %s on the tile."),
1294 terrain_name_translation(preq->source.value.terrain));
1295 }
1296 return TRUE;
1298 fc_strlcat(buf, prefix, bufsz);
1299 if (preq->present) {
1301 Q_("?terrain:Requires %s on the tile or a cardinally "
1302 "adjacent tile."),
1303 terrain_name_translation(preq->source.value.terrain));
1304 } else {
1306 Q_("?terrain:Prevented by %s on the tile or any "
1307 "cardinally adjacent tile."),
1308 terrain_name_translation(preq->source.value.terrain));
1309 }
1310 return TRUE;
1311 case REQ_RANGE_ADJACENT:
1312 fc_strlcat(buf, prefix, bufsz);
1313 if (preq->present) {
1315 Q_("?terrain:Requires %s on the tile or an adjacent "
1316 "tile."),
1317 terrain_name_translation(preq->source.value.terrain));
1318 } else {
1320 Q_("?terrain:Prevented by %s on the tile or any "
1321 "adjacent tile."),
1322 terrain_name_translation(preq->source.value.terrain));
1323 }
1324 return TRUE;
1325 case REQ_RANGE_CITY:
1326 fc_strlcat(buf, prefix, bufsz);
1327 if (preq->present) {
1329 Q_("?terrain:Requires %s on a tile within the city "
1330 "radius."),
1331 terrain_name_translation(preq->source.value.terrain));
1332 } else {
1334 Q_("?terrain:Prevented by %s on any tile within the city "
1335 "radius."),
1336 terrain_name_translation(preq->source.value.terrain));
1337 }
1338 return TRUE;
1340 fc_strlcat(buf, prefix, bufsz);
1341 if (preq->present) {
1343 Q_("?terrain:Requires %s on a tile within the city "
1344 "radius, or the city radius of a trade partner."),
1345 terrain_name_translation(preq->source.value.terrain));
1346 } else {
1348 Q_("?terrain:Prevented by %s on any tile within the city "
1349 "radius or the city radius of a trade partner."),
1350 terrain_name_translation(preq->source.value.terrain));
1351 }
1352 return TRUE;
1354 case REQ_RANGE_PLAYER:
1355 case REQ_RANGE_TEAM:
1356 case REQ_RANGE_ALLIANCE:
1357 case REQ_RANGE_WORLD:
1358 case REQ_RANGE_LOCAL:
1359 case REQ_RANGE_COUNT:
1360 /* Not supported. */
1361 return FALSE;
1362 }
1363return TRUE;
1364}
1365
1366/*************************************************************/
1371static bool req_text_nation(char *buf, size_t bufsz,
1372 struct player *pplayer,
1373 const struct requirement *preq,
1374 const char *prefix)
1375{
1376 switch (preq->range) {
1377 case REQ_RANGE_PLAYER:
1378 fc_strlcat(buf, prefix, bufsz);
1379 if (preq->present) {
1381 /* TRANS: "... playing as the Swedes." */
1382 _("Requires that you are playing as the %s."),
1383 nation_plural_translation(preq->source.value.nation));
1384 } else {
1386 /* TRANS: "... playing as the Turks." */
1387 _("Requires that you are not playing as the %s."),
1388 nation_plural_translation(preq->source.value.nation));
1389 }
1390 return TRUE;
1391 case REQ_RANGE_TEAM:
1392 fc_strlcat(buf, prefix, bufsz);
1393 if (preq->present) {
1395 /* TRANS: "... same team as the Indonesians." */
1396 _("Requires that you are on the same team as "
1397 "the %s."),
1398 nation_plural_translation(preq->source.value.nation));
1399 } else {
1401 /* TRANS: "... same team as the Greeks." */
1402 _("Requires that you are not on the same team as "
1403 "the %s."),
1404 nation_plural_translation(preq->source.value.nation));
1405 }
1406 return TRUE;
1407 case REQ_RANGE_ALLIANCE:
1408 fc_strlcat(buf, prefix, bufsz);
1409 if (preq->present) {
1411 /* TRANS: "... allied with the Koreans." */
1412 _("Requires that you are allied with the %s."),
1413 nation_plural_translation(preq->source.value.nation));
1414 } else {
1416 /* TRANS: "... allied with the Danes." */
1417 _("Requires that you are not allied with the %s."),
1418 nation_plural_translation(preq->source.value.nation));
1419 }
1420 return TRUE;
1421 case REQ_RANGE_WORLD:
1422 fc_strlcat(buf, prefix, bufsz);
1423 if (preq->survives) {
1424 if (preq->present) {
1426 /* TRANS: "Requires the Apaches to have ..." */
1427 _("Requires the %s to have been in the game."),
1428 nation_plural_translation(preq->source.value.nation));
1429 } else {
1431 /* TRANS: "Requires the Celts never to have ..." */
1432 _("Requires the %s never to have been in the "
1433 "game."),
1434 nation_plural_translation(preq->source.value.nation));
1435 }
1436 } else {
1437 if (preq->present) {
1439 /* TRANS: "Requires the Belgians in the game." */
1440 _("Requires the %s in the game."),
1441 nation_plural_translation(preq->source.value.nation));
1442 } else {
1444 /* TRANS: "Requires that the Russians are not ... */
1445 _("Requires that the %s are not in the game."),
1446 nation_plural_translation(preq->source.value.nation));
1447 }
1448 }
1449 return TRUE;
1450 case REQ_RANGE_LOCAL:
1451 case REQ_RANGE_TILE:
1453 case REQ_RANGE_ADJACENT:
1454 case REQ_RANGE_CITY:
1457 case REQ_RANGE_COUNT:
1458 /* Not supported. */
1459 return FALSE;
1460 }
1461 return TRUE;
1462}
1463
1464/*************************************************************/
1469static bool req_text_nation_group(char *buf, size_t bufsz,
1470 struct player *pplayer,
1471 const struct requirement *preq,
1472 const char *prefix)
1473{
1474 switch (preq->range) {
1475 case REQ_RANGE_PLAYER:
1476 fc_strlcat(buf, prefix, bufsz);
1477 if (preq->present) {
1479 /* TRANS: nation group: "... playing African nation." */
1480 _("Requires that you are playing %s nation."),
1481 nation_group_name_translation(preq->source.value.nationgroup));
1482 } else {
1484 /* TRANS: nation group: "... playing Imaginary nation." */
1485 _("Prevented if you are playing %s nation."),
1486 nation_group_name_translation(preq->source.value.nationgroup));
1487 }
1488 return TRUE;
1489 case REQ_RANGE_TEAM:
1490 fc_strlcat(buf, prefix, bufsz);
1491 if (preq->present) {
1493 /* TRANS: nation group: "Requires Medieval nation ..." */
1494 _("Requires %s nation on your team."),
1495 nation_group_name_translation(preq->source.value.nationgroup));
1496 } else {
1498 /* TRANS: nation group: "Prevented by Medieval nation ..." */
1499 _("Prevented by %s nation on your team."),
1500 nation_group_name_translation(preq->source.value.nationgroup));
1501 }
1502 return TRUE;
1503 case REQ_RANGE_ALLIANCE:
1504 fc_strlcat(buf, prefix, bufsz);
1505 if (preq->present) {
1507 /* TRANS: nation group: "Requires Modern nation ..." */
1508 _("Requires %s nation in alliance with you."),
1509 nation_group_name_translation(preq->source.value.nationgroup));
1510 } else {
1512 /* TRANS: nation group: "Prevented by Modern nation ..." */
1513 _("Prevented if %s nation is in alliance with you."),
1514 nation_group_name_translation(preq->source.value.nationgroup));
1515 }
1516 return TRUE;
1517 case REQ_RANGE_WORLD:
1518 fc_strlcat(buf, prefix, bufsz);
1519 if (preq->present) {
1521 /* TRANS: nation group: "Requires Asian nation ..." */
1522 _("Requires %s nation in the game."),
1523 nation_group_name_translation(preq->source.value.nationgroup));
1524 } else {
1526 /* TRANS: nation group: "Prevented by Asian nation ..." */
1527 _("Prevented by %s nation in the game."),
1528 nation_group_name_translation(preq->source.value.nationgroup));
1529 }
1530 return TRUE;
1531 case REQ_RANGE_LOCAL:
1532 case REQ_RANGE_TILE:
1534 case REQ_RANGE_ADJACENT:
1535 case REQ_RANGE_CITY:
1538 case REQ_RANGE_COUNT:
1539 /* Not supported. */
1540 return FALSE;
1541 }
1542 return TRUE;
1543}
1544
1545/*************************************************************/
1550static bool req_text_style(char *buf, size_t bufsz,
1551 struct player *pplayer,
1552 const struct requirement *preq,
1553 const char *prefix)
1554{
1555 if (preq->range != REQ_RANGE_PLAYER) {
1556 return FALSE;
1557 }
1558 fc_strlcat(buf, prefix, bufsz);
1559 if (preq->present) {
1561 /* TRANS: "Requires that you are playing Asian style
1562 * nation." */
1563 _("Requires that you are playing %s style nation."),
1564 style_name_translation(preq->source.value.style));
1565 } else {
1567 /* TRANS: "Requires that you are not playing Classical
1568 * style nation." */
1569 _("Requires that you are not playing %s style nation."),
1570 style_name_translation(preq->source.value.style));
1571 }
1572 return TRUE;
1573}
1574
1575/*************************************************************/
1580static bool req_text_nationality(char *buf, size_t bufsz,
1581 struct player *pplayer,
1582 const struct requirement *preq,
1583 const char *prefix)
1584{
1585 switch (preq->range) {
1587 fc_strlcat(buf, prefix, bufsz);
1588 if (preq->present) {
1590 /* TRANS: "Requires at least one Barbarian citizen ..." */
1591 _("Requires at least one %s citizen in the city or a "
1592 "trade partner."),
1593 nation_adjective_translation(preq->source.value.nationality));
1594 } else {
1596 /* TRANS: "... no Pirate citizens ..." */
1597 _("Requires that there are no %s citizens in "
1598 "the city or any trade partners."),
1599 nation_adjective_translation(preq->source.value.nationality));
1600 }
1601 return TRUE;
1602 case REQ_RANGE_CITY:
1603 fc_strlcat(buf, prefix, bufsz);
1604 if (preq->present) {
1606 /* TRANS: "Requires at least one Barbarian citizen ..." */
1607 _("Requires at least one %s citizen in the city."),
1608 nation_adjective_translation(preq->source.value.nationality));
1609 } else {
1611 /* TRANS: "... no Pirate citizens ..." */
1612 _("Requires that there are no %s citizens in "
1613 "the city."),
1614 nation_adjective_translation(preq->source.value.nationality));
1615 }
1616 return TRUE;
1617 case REQ_RANGE_WORLD:
1618 case REQ_RANGE_ALLIANCE:
1619 case REQ_RANGE_TEAM:
1620 case REQ_RANGE_PLAYER:
1621 case REQ_RANGE_LOCAL:
1622 case REQ_RANGE_TILE:
1624 case REQ_RANGE_ADJACENT:
1626 case REQ_RANGE_COUNT:
1627 /* Not supported. */
1628 return FALSE;
1629 }
1630 return TRUE;
1631}
1632
1633/*************************************************************/
1638static bool req_text_original_owner(char *buf, size_t bufsz,
1639 struct player *pplayer,
1640 const struct requirement *preq,
1641 const char *prefix)
1642{
1643 switch (preq->range) {
1644 case REQ_RANGE_CITY:
1645 fc_strlcat(buf, prefix, bufsz);
1646 if (preq->present) {
1648 _("Requires city to be founded by %s."),
1649 nation_adjective_translation(preq->source.value.origowner));
1650 } else {
1652 _("Requires that city was not originally owned by %s."),
1653 nation_adjective_translation(preq->source.value.origowner));
1654 }
1655 return TRUE;
1657 case REQ_RANGE_WORLD:
1658 case REQ_RANGE_ALLIANCE:
1659 case REQ_RANGE_TEAM:
1660 case REQ_RANGE_PLAYER:
1661 case REQ_RANGE_LOCAL:
1662 case REQ_RANGE_TILE:
1664 case REQ_RANGE_ADJACENT:
1666 case REQ_RANGE_COUNT:
1667 /* Not supported. */
1668 return FALSE;
1669 }
1670 return TRUE;
1671}
1672
1673/*************************************************************/
1678static bool req_text_diplrel(char *buf, size_t bufsz,
1679 struct player *pplayer,
1680 const struct requirement *preq,
1681 const char *prefix)
1682{
1683 switch (preq->range) {
1684 case REQ_RANGE_PLAYER:
1685 fc_strlcat(buf, prefix, bufsz);
1686 if (preq->present) {
1688 /* TRANS: in this and following strings, '%s' can be one
1689 * of a wide range of relationships; e.g., 'Peace',
1690 * 'Never met', 'Foreign', 'Hosts embassy',
1691 * 'Provided Casus Belli' */
1692 _("Requires that you have the relationship '%s' with at "
1693 "least one other living player."),
1694 diplrel_name_translation(preq->source.value.diplrel));
1695 } else {
1697 _("Requires that you do not have the relationship '%s' "
1698 "with any living player."),
1699 diplrel_name_translation(preq->source.value.diplrel));
1700 }
1701 return TRUE;
1702 case REQ_RANGE_TEAM:
1703 fc_strlcat(buf, prefix, bufsz);
1704 if (preq->present) {
1706 _("Requires that somebody on your team has the "
1707 "relationship '%s' with at least one other living "
1708 "player."),
1709 diplrel_name_translation(preq->source.value.diplrel));
1710 } else {
1712 _("Requires that nobody on your team has the "
1713 "relationship '%s' with any living player."),
1714 diplrel_name_translation(preq->source.value.diplrel));
1715 }
1716 return TRUE;
1717 case REQ_RANGE_ALLIANCE:
1718 fc_strlcat(buf, prefix, bufsz);
1719 if (preq->present) {
1721 _("Requires that somebody in your alliance has the "
1722 "relationship '%s' with at least one other living "
1723 "player."),
1724 diplrel_name_translation(preq->source.value.diplrel));
1725 } else {
1727 _("Requires that nobody in your alliance has the "
1728 "relationship '%s' with any living player."),
1729 diplrel_name_translation(preq->source.value.diplrel));
1730 }
1731 return TRUE;
1732 case REQ_RANGE_WORLD:
1733 fc_strlcat(buf, prefix, bufsz);
1734 if (preq->present) {
1736 _("Requires the relationship '%s' between two living "
1737 "players."),
1738 diplrel_name_translation(preq->source.value.diplrel));
1739 } else {
1741 _("Requires that no two living players have the "
1742 "relationship '%s'."),
1743 diplrel_name_translation(preq->source.value.diplrel));
1744 }
1745 return TRUE;
1746 case REQ_RANGE_LOCAL:
1747 fc_strlcat(buf, prefix, bufsz);
1748 if (preq->present) {
1750 _("Requires that you have the relationship '%s' with the "
1751 "other player."),
1752 diplrel_name_translation(preq->source.value.diplrel));
1753 } else {
1755 _("Requires that you do not have the relationship '%s' "
1756 "with the other player."),
1757 diplrel_name_translation(preq->source.value.diplrel));
1758 }
1759 return TRUE;
1760 case REQ_RANGE_TILE:
1762 case REQ_RANGE_ADJACENT:
1763 case REQ_RANGE_CITY:
1766 case REQ_RANGE_COUNT:
1767 /* Not supported. */
1768 return FALSE;
1769 }
1770 return TRUE;
1771}
1772
1773/*************************************************************/
1778static bool req_text_diplrel_tile(char *buf, size_t bufsz,
1779 struct player *pplayer,
1780 const struct requirement *preq,
1781 const char *prefix)
1782{
1783 switch (preq->range) {
1784 case REQ_RANGE_PLAYER:
1785 fc_strlcat(buf, prefix, bufsz);
1786 if (preq->present) {
1788 /* TRANS: in this and following strings, '%s' can be one
1789 * of a wide range of relationships; e.g., 'Peace',
1790 * 'Never met', 'Foreign', 'Hosts embassy',
1791 * 'Provided Casus Belli' */
1792 _("Requires that the tile owner has the relationship"
1793 " '%s' with at least one other living player."),
1794 diplrel_name_translation(preq->source.value.diplrel));
1795 } else {
1797 _("Requires that the tile owner does not have the"
1798 " relationship '%s' with any living player."),
1799 diplrel_name_translation(preq->source.value.diplrel));
1800 }
1801 return TRUE;
1802 case REQ_RANGE_TEAM:
1803 fc_strlcat(buf, prefix, bufsz);
1804 if (preq->present) {
1806 _("Requires that somebody on the tile owner's team"
1807 " has the relationship '%s' with at least one other"
1808 " living player."),
1809 diplrel_name_translation(preq->source.value.diplrel));
1810 } else {
1812 _("Requires that nobody on the tile owner's team has"
1813 " the relationship '%s' with any living player."),
1814 diplrel_name_translation(preq->source.value.diplrel));
1815 }
1816 return TRUE;
1817 case REQ_RANGE_ALLIANCE:
1818 fc_strlcat(buf, prefix, bufsz);
1819 if (preq->present) {
1821 _("Requires that somebody in the tile owner's alliance"
1822 " has the relationship '%s' with at least one other "
1823 "living player."),
1824 diplrel_name_translation(preq->source.value.diplrel));
1825 } else {
1827 _("Requires that nobody in the tile owner's alliance "
1828 "has the relationship '%s' with any living player."),
1829 diplrel_name_translation(preq->source.value.diplrel));
1830 }
1831 return TRUE;
1832 case REQ_RANGE_LOCAL:
1833 fc_strlcat(buf, prefix, bufsz);
1834 if (preq->present) {
1836 _("Requires that you have the relationship '%s' with"
1837 " the tile owner."),
1838 diplrel_name_translation(preq->source.value.diplrel));
1839 } else {
1841 _("Requires that you do not have the relationship '%s'"
1842 " with the tile owner."),
1843 diplrel_name_translation(preq->source.value.diplrel));
1844 }
1845 return TRUE;
1846 case REQ_RANGE_TILE:
1848 case REQ_RANGE_ADJACENT:
1849 case REQ_RANGE_CITY:
1852 case REQ_RANGE_WORLD:
1853 case REQ_RANGE_COUNT:
1854 /* Not supported. */
1855 return FALSE;
1856 }
1857 return TRUE;
1858}
1859
1860/*************************************************************/
1865static bool req_text_diplrel_tile_o(char *buf, size_t bufsz,
1866 struct player *pplayer,
1867 const struct requirement *preq,
1868 const char *prefix)
1869{
1870 switch (preq->range) {
1871 case REQ_RANGE_LOCAL:
1872 fc_strlcat(buf, prefix, bufsz);
1873 if (preq->present) {
1875 _("Requires that the tile owner has the relationship"
1876 " '%s' with the other player."),
1877 diplrel_name_translation(preq->source.value.diplrel));
1878 } else {
1880 _("Requires that the tile owner does not have the"
1881 " relationship '%s' with the other player."),
1882 diplrel_name_translation(preq->source.value.diplrel));
1883 }
1884 return TRUE;
1885 case REQ_RANGE_TILE:
1887 case REQ_RANGE_ADJACENT:
1888 case REQ_RANGE_CITY:
1891 case REQ_RANGE_PLAYER:
1892 case REQ_RANGE_TEAM:
1893 case REQ_RANGE_ALLIANCE:
1894 case REQ_RANGE_WORLD:
1895 case REQ_RANGE_COUNT:
1896 /* Not supported. */
1897 return FALSE;
1898 }
1899 return TRUE;
1900}
1901
1902/*************************************************************/
1907static bool req_text_diplrel_unit_any(char *buf, size_t bufsz,
1908 struct player *pplayer,
1909 const struct requirement *preq,
1910 const char *prefix)
1911{
1912 switch (preq->range) {
1913 case REQ_RANGE_PLAYER:
1914 fc_strlcat(buf, prefix, bufsz);
1915 if (preq->present) {
1917 /* TRANS: in this and following strings, '%s' can be one
1918 * of a wide range of relationships; e.g., 'Peace',
1919 * 'Never met', 'Foreign', 'Hosts embassy',
1920 * 'Provided Casus Belli' */
1921 _("Requires that the tile has at least one unit whose "
1922 "owner has the relationship "
1923 "'%s' with at least one other living player."),
1924 diplrel_name_translation(preq->source.value.diplrel));
1925 } else {
1927 _("Requires that no unit at the tile is owned by a player "
1928 "who has the relationship '%s' with any living player."),
1929 diplrel_name_translation(preq->source.value.diplrel));
1930 }
1931 return TRUE;
1932 case REQ_RANGE_TEAM:
1933 fc_strlcat(buf, prefix, bufsz);
1934 if (preq->present) {
1936 _("Requires that the tile has at least one unit whose "
1937 "owner is on a team where a member "
1938 "has the relationship '%s' with at least one other "
1939 "living player."),
1940 diplrel_name_translation(preq->source.value.diplrel));
1941 } else {
1943 _("Requires that no unit at the tile is owned by a player "
1944 "who is on a team where a member "
1945 "has the relationship '%s' with at least one other "
1946 "living player."),
1947 diplrel_name_translation(preq->source.value.diplrel));
1948 }
1949 return TRUE;
1950 case REQ_RANGE_ALLIANCE:
1951 fc_strlcat(buf, prefix, bufsz);
1952 if (preq->present) {
1954 _("Requires that the tile has at least one unit whose "
1955 "owner is allied to someone that "
1956 "has the relationship '%s' with at least one other "
1957 "living player."),
1958 diplrel_name_translation(preq->source.value.diplrel));
1959 } else {
1961 _("Requires that no unit at the tile is owned by a player "
1962 "allied to someone that "
1963 "has the relationship '%s' with any living player."),
1964 diplrel_name_translation(preq->source.value.diplrel));
1965 }
1966 return TRUE;
1967 case REQ_RANGE_LOCAL:
1968 fc_strlcat(buf, prefix, bufsz);
1969 if (preq->present) {
1971 _("Requires that you have the relationship '%s' with "
1972 "the owner of at least one unit at the tile."),
1973 diplrel_name_translation(preq->source.value.diplrel));
1974 } else {
1976 _("Requires that you do not have the relationship '%s' "
1977 "with the owner of any unit at the tile."),
1978 diplrel_name_translation(preq->source.value.diplrel));
1979 }
1980 return TRUE;
1981 case REQ_RANGE_TILE:
1983 case REQ_RANGE_ADJACENT:
1984 case REQ_RANGE_CITY:
1987 case REQ_RANGE_WORLD:
1988 case REQ_RANGE_COUNT:
1989 /* Not supported. */
1990 return FALSE;
1991 }
1992 return TRUE;
1993}
1994
1995/*************************************************************/
2000static bool req_text_diplrel_unit_any_o(char *buf, size_t bufsz,
2001 struct player *pplayer,
2002 const struct requirement *preq,
2003 const char *prefix)
2004{
2005 switch (preq->range) {
2006 case REQ_RANGE_LOCAL:
2007 fc_strlcat(buf, prefix, bufsz);
2008 if (preq->present) {
2010 _("Requires that the tile has at least one unit whose "
2011 "owner has the relationship '%s' with the other player."),
2012 diplrel_name_translation(preq->source.value.diplrel));
2013 } else {
2015 _("Requires that no unit at the tile is owned by a player "
2016 "who has the relationship '%s' with the other player."),
2017 diplrel_name_translation(preq->source.value.diplrel));
2018 }
2019 return TRUE;
2020 case REQ_RANGE_TILE:
2022 case REQ_RANGE_ADJACENT:
2023 case REQ_RANGE_CITY:
2026 case REQ_RANGE_PLAYER:
2027 case REQ_RANGE_TEAM:
2028 case REQ_RANGE_ALLIANCE:
2029 case REQ_RANGE_WORLD:
2030 case REQ_RANGE_COUNT:
2031 /* Not supported. */
2032 return FALSE;
2033 }
2034 return TRUE;
2035}
2036
2037/*************************************************************/
2042static bool req_text_utype(char *buf, size_t bufsz,
2043 struct player *pplayer,
2044 const struct requirement *preq,
2045 const char *prefix)
2046{
2047 switch (preq->range) {
2048 case REQ_RANGE_LOCAL:
2049 fc_strlcat(buf, prefix, bufsz);
2050 if (preq->present) {
2051 /* TRANS: %s is a single kind of unit (e.g., "Settlers"). */
2052 cat_snprintf(buf, bufsz, Q_("?unit:Requires %s."),
2053 utype_name_translation(preq->source.value.utype));
2054 } else {
2055 /* TRANS: %s is a single kind of unit (e.g., "Settlers"). */
2056 cat_snprintf(buf, bufsz, Q_("?unit:Does not apply to %s."),
2057 utype_name_translation(preq->source.value.utype));
2058 }
2059 return TRUE;
2060 case REQ_RANGE_TILE:
2062 case REQ_RANGE_ADJACENT:
2063 case REQ_RANGE_CITY:
2066 case REQ_RANGE_PLAYER:
2067 case REQ_RANGE_TEAM:
2068 case REQ_RANGE_ALLIANCE:
2069 case REQ_RANGE_WORLD:
2070 case REQ_RANGE_COUNT:
2071 /* Not supported. */
2072 return FALSE;
2073 }
2074 return TRUE;
2075}
2076
2077/*************************************************************/
2082static bool req_text_unitflag(char *buf, size_t bufsz,
2083 struct player *pplayer,
2084 const struct requirement *preq,
2085 const char *prefix)
2086{
2087 switch (preq->range) {
2088 case REQ_RANGE_LOCAL:
2089 {
2090 struct astring astr = ASTRING_INIT;
2091
2092 /* Unit type flags mean nothing to users. Explicitly list the unit
2093 * types with those flags. */
2094 if (role_units_translations(&astr, preq->source.value.unitflag,
2095 TRUE)) {
2096 fc_strlcat(buf, prefix, bufsz);
2097 if (preq->present) {
2098 /* TRANS: %s is a list of unit types separated by "or". */
2099 cat_snprintf(buf, bufsz, Q_("?ulist:Requires %s."),
2100 astr_str(&astr));
2101 } else {
2102 /* TRANS: %s is a list of unit types separated by "or". */
2103 cat_snprintf(buf, bufsz, Q_("?ulist:Does not apply to %s."),
2104 astr_str(&astr));
2105 }
2106 astr_free(&astr);
2107 return TRUE;
2108 }
2109 }
2110 break;
2111 case REQ_RANGE_TILE:
2113 case REQ_RANGE_ADJACENT:
2114 case REQ_RANGE_CITY:
2117 case REQ_RANGE_PLAYER:
2118 case REQ_RANGE_TEAM:
2119 case REQ_RANGE_ALLIANCE:
2120 case REQ_RANGE_WORLD:
2121 case REQ_RANGE_COUNT:
2122 /* Not supported. */
2123 return FALSE;
2124 }
2125 return TRUE;
2126}
2127
2128/*************************************************************/
2133static bool req_text_uclass(char *buf, size_t bufsz,
2134 struct player *pplayer,
2135 const struct requirement *preq,
2136 const char *prefix)
2137{
2138 switch (preq->range) {
2139 case REQ_RANGE_LOCAL:
2140 fc_strlcat(buf, prefix, bufsz);
2141 if (preq->present) {
2142 /* TRANS: %s is a single unit class (e.g., "Air"). */
2143 cat_snprintf(buf, bufsz, Q_("?uclass:Requires %s units."),
2144 uclass_name_translation(preq->source.value.uclass));
2145 } else {
2146 /* TRANS: %s is a single unit class (e.g., "Air"). */
2147 cat_snprintf(buf, bufsz, Q_("?uclass:Does not apply to %s units."),
2148 uclass_name_translation(preq->source.value.uclass));
2149 }
2150 return TRUE;
2151 case REQ_RANGE_TILE:
2153 case REQ_RANGE_ADJACENT:
2154 case REQ_RANGE_CITY:
2157 case REQ_RANGE_PLAYER:
2158 case REQ_RANGE_TEAM:
2159 case REQ_RANGE_ALLIANCE:
2160 case REQ_RANGE_WORLD:
2161 case REQ_RANGE_COUNT:
2162 /* Not supported. */
2163 return FALSE;
2164 }
2165 return TRUE;
2166}
2167
2168/*************************************************************/
2173static bool req_text_ucflag(char *buf, size_t bufsz,
2174 struct player *pplayer,
2175 const struct requirement *preq,
2176 const char *prefix)
2177{
2178 const char *classes[uclass_count()];
2179 int i = 0;
2180 bool done = FALSE;
2181 struct astring list = ASTRING_INIT;
2182
2183 unit_class_iterate(uclass) {
2184 if (uclass_has_flag(uclass, preq->source.value.unitclassflag)) {
2185 classes[i++] = uclass_name_translation(uclass);
2186 }
2189
2190 switch (preq->range) {
2191 case REQ_RANGE_LOCAL:
2192 fc_strlcat(buf, prefix, bufsz);
2193 if (preq->present) {
2194 /* TRANS: %s is a list of unit classes separated by "or". */
2195 cat_snprintf(buf, bufsz, Q_("?uclasslist:Requires %s units."),
2196 astr_str(&list));
2197 } else {
2198 /* TRANS: %s is a list of unit classes separated by "or". */
2199 cat_snprintf(buf, bufsz, Q_("?uclasslist:Does not apply to "
2200 "%s units."),
2201 astr_str(&list));
2202 }
2203 done = TRUE;
2204 break;
2205 case REQ_RANGE_TILE:
2207 case REQ_RANGE_ADJACENT:
2208 case REQ_RANGE_CITY:
2211 case REQ_RANGE_PLAYER:
2212 case REQ_RANGE_TEAM:
2213 case REQ_RANGE_ALLIANCE:
2214 case REQ_RANGE_WORLD:
2215 case REQ_RANGE_COUNT:
2216 /* Not supported. */
2217 break;
2218 }
2219 astr_free(&list);
2220
2221 return done;
2222}
2223
2224/*************************************************************/
2229static bool req_text_unit_state(char *buf, size_t bufsz,
2230 struct player *pplayer,
2231 const struct requirement *preq,
2232 const char *prefix)
2233{
2234 switch (preq->range) {
2235 case REQ_RANGE_LOCAL:
2236 switch (preq->source.value.unit_state) {
2237 case USP_TRANSPORTED:
2238 fc_strlcat(buf, prefix, bufsz);
2239 if (preq->present) {
2241 _("Requires that the unit is transported."));
2242 } else {
2244 _("Requires that the unit isn't transported."));
2245 }
2246 return TRUE;
2247 case USP_LIVABLE_TILE:
2248 fc_strlcat(buf, prefix, bufsz);
2249 if (preq->present) {
2251 _("Requires that the unit is on livable tile."));
2252 } else {
2254 _("Requires that the unit isn't on livable tile."));
2255 }
2256 return TRUE;
2257 case USP_TRANSPORTING:
2258 fc_strlcat(buf, prefix, bufsz);
2259 if (preq->present) {
2261 _("Requires that the unit does transport one or "
2262 "more cargo units."));
2263 } else {
2265 _("Requires that the unit doesn't transport "
2266 "any cargo units."));
2267 }
2268 return TRUE;
2269 case USP_HAS_HOME_CITY:
2270 fc_strlcat(buf, prefix, bufsz);
2271 if (preq->present) {
2273 _("Requires that the unit has a home city."));
2274 } else {
2276 _("Requires that the unit is homeless."));
2277 }
2278 return TRUE;
2279 case USP_NATIVE_TILE:
2280 fc_strlcat(buf, prefix, bufsz);
2281 if (preq->present) {
2283 _("Requires that the unit is on native tile."));
2284 } else {
2286 _("Requires that the unit isn't on native tile."));
2287 }
2288 return TRUE;
2289 case USP_NATIVE_EXTRA:
2290 fc_strlcat(buf, prefix, bufsz);
2291 if (preq->present) {
2293 _("Requires that the unit is in a native extra."));
2294 } else {
2296 _("Requires that the unit isn't in a native extra."));
2297 }
2298 return TRUE;
2300 fc_strlcat(buf, prefix, bufsz);
2301 if (preq->present) {
2303 _("Requires that the unit has moved this turn."));
2304 } else {
2306 _("Requires that the unit hasn't moved this turn."));
2307 }
2308 return TRUE;
2309 case USP_COUNT:
2310 fc_assert_msg(preq->source.value.unit_state != USP_COUNT,
2311 "Invalid unit state property.");
2312 }
2313 break;
2314 case REQ_RANGE_TILE:
2316 case REQ_RANGE_ADJACENT:
2317 case REQ_RANGE_CITY:
2320 case REQ_RANGE_PLAYER:
2321 case REQ_RANGE_TEAM:
2322 case REQ_RANGE_ALLIANCE:
2323 case REQ_RANGE_WORLD:
2324 case REQ_RANGE_COUNT:
2325 /* Not supported. */
2326 return FALSE;
2327 }
2328 return TRUE;
2329}
2330
2331/*************************************************************/
2336static bool req_text_activity(char *buf, size_t bufsz,
2337 struct player *pplayer,
2338 const struct requirement *preq,
2339 const char *prefix)
2340{
2341 switch (preq->range) {
2342 case REQ_RANGE_LOCAL:
2343 fc_strlcat(buf, prefix, bufsz);
2344 if (preq->present) {
2346 _("Requires that the unit is performing activity %s."),
2347 Q_(unit_activity_name(preq->source.value.activity)));
2348 } else {
2350 _("Requires that the unit is not performing activity %s."),
2351 Q_(unit_activity_name(preq->source.value.activity)));
2352 }
2353 return TRUE;
2354 case REQ_RANGE_TILE:
2356 case REQ_RANGE_ADJACENT:
2357 case REQ_RANGE_CITY:
2360 case REQ_RANGE_PLAYER:
2361 case REQ_RANGE_TEAM:
2362 case REQ_RANGE_ALLIANCE:
2363 case REQ_RANGE_WORLD:
2364 case REQ_RANGE_COUNT:
2365 /* Not supported. */
2366 return FALSE;
2367 }
2368 return TRUE;
2369}
2370
2371/*************************************************************/
2376static bool req_text_min_moves(char *buf, size_t bufsz,
2377 struct player *pplayer,
2378 const struct requirement *preq,
2379 const char *prefix)
2380{
2381 switch (preq->range) {
2382 case REQ_RANGE_LOCAL:
2383 fc_strlcat(buf, prefix, bufsz);
2384 if (preq->present) {
2386 /* TRANS: %s is numeric move points; it may have a
2387 * fractional part ("1 1/3 MP"). */
2388 _("Requires that the unit has at least %s MP left."),
2389 move_points_text(preq->source.value.minmoves, TRUE));
2390 } else {
2392 /* TRANS: %s is numeric move points; it may have a
2393 * fractional part ("1 1/3 MP"). */
2394 _("Requires that the unit has less than %s MP left."),
2395 move_points_text(preq->source.value.minmoves, TRUE));
2396 }
2397 return TRUE;
2398 case REQ_RANGE_TILE:
2400 case REQ_RANGE_ADJACENT:
2401 case REQ_RANGE_CITY:
2404 case REQ_RANGE_PLAYER:
2405 case REQ_RANGE_TEAM:
2406 case REQ_RANGE_ALLIANCE:
2407 case REQ_RANGE_WORLD:
2408 case REQ_RANGE_COUNT:
2409 /* Not supported. */
2410 return FALSE;
2411 }
2412 return TRUE;
2413}
2414
2415/*************************************************************/
2420static bool req_text_min_veteran(char *buf, size_t bufsz,
2421 struct player *pplayer,
2422 const struct requirement *preq,
2423 const char *prefix)
2424{
2425 if (preq->range != REQ_RANGE_LOCAL) {
2426 return FALSE;
2427 }
2428 /* FIXME: this would be better with veteran level names, but that's
2429 * potentially unit type dependent. */
2430 fc_strlcat(buf, prefix, bufsz);
2431 if (preq->present) {
2433 PL_("Requires a unit with at least %d veteran level.",
2434 "Requires a unit with at least %d veteran levels.",
2435 preq->source.value.minveteran),
2436 preq->source.value.minveteran);
2437 } else {
2439 PL_("Requires a unit with fewer than %d veteran level.",
2440 "Requires a unit with fewer than %d veteran levels.",
2441 preq->source.value.minveteran),
2442 preq->source.value.minveteran);
2443 }
2444 return TRUE;
2445}
2446
2447/*************************************************************/
2452static bool req_text_min_hp(char *buf, size_t bufsz,
2453 struct player *pplayer,
2454 const struct requirement *preq,
2455 const char *prefix)
2456{
2457 if (preq->range != REQ_RANGE_LOCAL) {
2458 return FALSE;
2459 }
2460
2461 fc_strlcat(buf, prefix, bufsz);
2462 if (preq->present) {
2464 PL_("Requires a unit with at least %d hit point left.",
2465 "Requires a unit with at least %d hit points left.",
2466 preq->source.value.min_hit_points),
2467 preq->source.value.min_hit_points);
2468 } else {
2470 PL_("Requires a unit with fewer than %d hit point "
2471 "left.",
2472 "Requires a unit with fewer than %d hit points "
2473 "left.",
2474 preq->source.value.min_hit_points),
2475 preq->source.value.min_hit_points);
2476 }
2477 return TRUE;
2478}
2479
2480/*************************************************************/
2485static bool req_text_otype(char *buf, size_t bufsz,
2486 struct player *pplayer,
2487 const struct requirement *preq,
2488 const char *prefix)
2489{
2490 if (preq->range != REQ_RANGE_LOCAL) {
2491 return FALSE;
2492 }
2493 fc_strlcat(buf, prefix, bufsz);
2494 if (preq->present) {
2495 /* TRANS: "Applies only to Food." */
2496 cat_snprintf(buf, bufsz, Q_("?output:Applies only to %s."),
2497 get_output_name(preq->source.value.outputtype));
2498 } else {
2499 /* TRANS: "Does not apply to Food." */
2500 cat_snprintf(buf, bufsz, Q_("?output:Does not apply to %s."),
2501 get_output_name(preq->source.value.outputtype));
2502 }
2503 return TRUE;
2504}
2505
2506/*************************************************************/
2511static bool req_text_specialist(char *buf, size_t bufsz,
2512 struct player *pplayer,
2513 const struct requirement *preq,
2514 const char *prefix)
2515{
2516 if (preq->range != REQ_RANGE_LOCAL) {
2517 return FALSE;
2518 }
2519 fc_strlcat(buf, prefix, bufsz);
2520 if (preq->present) {
2521 /* TRANS: "Applies only to Scientists." */
2522 cat_snprintf(buf, bufsz, Q_("?specialist:Applies only to %s."),
2523 specialist_plural_translation(preq->source.value.specialist));
2524 } else {
2525 /* TRANS: "Does not apply to Scientists." */
2526 cat_snprintf(buf, bufsz, Q_("?specialist:Does not apply to %s."),
2527 specialist_plural_translation(preq->source.value.specialist));
2528 }
2529 return TRUE;
2530}
2531
2532/*************************************************************/
2537static bool req_text_min_size(char *buf, size_t bufsz,
2538 struct player *pplayer,
2539 const struct requirement *preq,
2540 const char *prefix)
2541{
2542 switch (preq->range) {
2544 fc_strlcat(buf, prefix, bufsz);
2545 if (preq->present) {
2547 PL_("Requires a minimum city size of %d for this "
2548 "city or a trade partner.",
2549 "Requires a minimum city size of %d for this "
2550 "city or a trade partner.",
2551 preq->source.value.minsize),
2552 preq->source.value.minsize);
2553 } else {
2555 PL_("Requires the city size to be less than %d "
2556 "for this city and all trade partners.",
2557 "Requires the city size to be less than %d "
2558 "for this city and all trade partners.",
2559 preq->source.value.minsize),
2560 preq->source.value.minsize);
2561 }
2562 return TRUE;
2563 case REQ_RANGE_CITY:
2564 fc_strlcat(buf, prefix, bufsz);
2565 if (preq->present) {
2567 PL_("Requires a minimum city size of %d.",
2568 "Requires a minimum city size of %d.",
2569 preq->source.value.minsize),
2570 preq->source.value.minsize);
2571 } else {
2573 PL_("Requires the city size to be less than %d.",
2574 "Requires the city size to be less than %d.",
2575 preq->source.value.minsize),
2576 preq->source.value.minsize);
2577 }
2578 return TRUE;
2579 case REQ_RANGE_LOCAL:
2580 case REQ_RANGE_TILE:
2582 case REQ_RANGE_ADJACENT:
2584 case REQ_RANGE_PLAYER:
2585 case REQ_RANGE_TEAM:
2586 case REQ_RANGE_ALLIANCE:
2587 case REQ_RANGE_WORLD:
2588 case REQ_RANGE_COUNT:
2589 /* Not supported. */
2590 return FALSE;
2591 }
2592 return TRUE;
2593}
2594
2595/*************************************************************/
2600static bool req_text_min_culture(char *buf, size_t bufsz,
2601 struct player *pplayer,
2602 const struct requirement *preq,
2603 const char *prefix)
2604{
2605 switch (preq->range) {
2606 case REQ_RANGE_CITY:
2607 fc_strlcat(buf, prefix, bufsz);
2608 if (preq->present) {
2610 PL_("Requires a minimum culture of %d in the city.",
2611 "Requires a minimum culture of %d in the city.",
2612 preq->source.value.minculture),
2613 preq->source.value.minculture);
2614 } else {
2616 PL_("Requires the culture in the city to be less "
2617 "than %d.",
2618 "Requires the culture in the city to be less "
2619 "than %d.",
2620 preq->source.value.minculture),
2621 preq->source.value.minculture);
2622 }
2623 return TRUE;
2625 fc_strlcat(buf, prefix, bufsz);
2626 if (preq->present) {
2628 PL_("Requires a minimum culture of %d in this city or "
2629 "a trade partner.",
2630 "Requires a minimum culture of %d in this city or "
2631 "a trade partner.",
2632 preq->source.value.minculture),
2633 preq->source.value.minculture);
2634 } else {
2636 PL_("Requires the culture in this city and all trade "
2637 "partners to be less than %d.",
2638 "Requires the culture in this city and all trade "
2639 "partners to be less than %d.",
2640 preq->source.value.minculture),
2641 preq->source.value.minculture);
2642 }
2643 return TRUE;
2644 case REQ_RANGE_PLAYER:
2645 fc_strlcat(buf, prefix, bufsz);
2646 if (preq->present) {
2648 PL_("Requires your nation to have culture "
2649 "of at least %d.",
2650 "Requires your nation to have culture "
2651 "of at least %d.",
2652 preq->source.value.minculture),
2653 preq->source.value.minculture);
2654 } else {
2656 PL_("Prevented if your nation has culture of "
2657 "%d or more.",
2658 "Prevented if your nation has culture of "
2659 "%d or more.",
2660 preq->source.value.minculture),
2661 preq->source.value.minculture);
2662 }
2663 return TRUE;
2664 case REQ_RANGE_TEAM:
2665 fc_strlcat(buf, prefix, bufsz);
2666 if (preq->present) {
2668 PL_("Requires someone on your team to have culture of "
2669 "at least %d.",
2670 "Requires someone on your team to have culture of "
2671 "at least %d.",
2672 preq->source.value.minculture),
2673 preq->source.value.minculture);
2674 } else {
2676 PL_("Prevented if anyone on your team has culture of "
2677 "%d or more.",
2678 "Prevented if anyone on your team has culture of "
2679 "%d or more.",
2680 preq->source.value.minculture),
2681 preq->source.value.minculture);
2682 }
2683 return TRUE;
2684 case REQ_RANGE_ALLIANCE:
2685 fc_strlcat(buf, prefix, bufsz);
2686 if (preq->present) {
2688 PL_("Requires someone in your current alliance to "
2689 "have culture of at least %d.",
2690 "Requires someone in your current alliance to "
2691 "have culture of at least %d.",
2692 preq->source.value.minculture),
2693 preq->source.value.minculture);
2694 } else {
2696 PL_("Prevented if anyone in your current alliance has "
2697 "culture of %d or more.",
2698 "Prevented if anyone in your current alliance has "
2699 "culture of %d or more.",
2700 preq->source.value.minculture),
2701 preq->source.value.minculture);
2702 }
2703 return TRUE;
2704 case REQ_RANGE_WORLD:
2705 fc_strlcat(buf, prefix, bufsz);
2706 if (preq->present) {
2708 PL_("Requires that some player has culture of at "
2709 "least %d.",
2710 "Requires that some player has culture of at "
2711 "least %d.",
2712 preq->source.value.minculture),
2713 preq->source.value.minculture);
2714 } else {
2716 PL_("Requires that no player has culture of %d "
2717 "or more.",
2718 "Requires that no player has culture of %d "
2719 "or more.",
2720 preq->source.value.minculture),
2721 preq->source.value.minculture);
2722 }
2723 return TRUE;
2724 case REQ_RANGE_LOCAL:
2725 case REQ_RANGE_TILE:
2727 case REQ_RANGE_ADJACENT:
2729 case REQ_RANGE_COUNT:
2730 return FALSE;
2731 }
2732 return TRUE;
2733}
2734
2735/*************************************************************/
2740static bool req_text_min_foreign_pct(char *buf, size_t bufsz,
2741 struct player *pplayer,
2742 const struct requirement *preq,
2743 const char *prefix)
2744{
2745 switch (preq->range) {
2746 case REQ_RANGE_CITY:
2747 fc_strlcat(buf, prefix, bufsz);
2748 if (preq->present) {
2750 _("At least %d%% of the citizens of the city "
2751 "must be foreign."),
2752 preq->source.value.minforeignpct);
2753 } else {
2755 _("Less than %d%% of the citizens of the city "
2756 "must be foreign."),
2757 preq->source.value.minforeignpct);
2758 }
2759 return TRUE;
2761 fc_strlcat(buf, prefix, bufsz);
2762 if (preq->present) {
2764 _("At least %d%% of the citizens of the city "
2765 "or some trade partner must be foreign."),
2766 preq->source.value.minforeignpct);
2767 } else {
2769 _("Less than %d%% of the citizens of the city "
2770 "and each trade partner must be foreign."),
2771 preq->source.value.minforeignpct);
2772 }
2773 return TRUE;
2774 case REQ_RANGE_PLAYER:
2775 case REQ_RANGE_TEAM:
2776 case REQ_RANGE_ALLIANCE:
2777 case REQ_RANGE_WORLD:
2778 case REQ_RANGE_LOCAL:
2779 case REQ_RANGE_TILE:
2781 case REQ_RANGE_ADJACENT:
2783 case REQ_RANGE_COUNT:
2784 return FALSE;
2785 }
2786 return TRUE;
2787}
2788
2789/*************************************************************/
2794static bool req_text_max_tile_total_units(char *buf, size_t bufsz,
2795 struct player *pplayer,
2796 const struct requirement *preq,
2797 const char *prefix)
2798{
2799 switch (preq->range) {
2800 case REQ_RANGE_TILE:
2801 fc_strlcat(buf, prefix, bufsz);
2802 if (preq->present) {
2804 PL_("At most %d total unit may be present on the tile.",
2805 "At most %d total units may be present on the tile.",
2806 preq->source.value.max_tile_total_units),
2807 preq->source.value.max_tile_total_units);
2808 } else {
2810 PL_("There must be more than %d total unit present on "
2811 "the tile.",
2812 "There must be more than %d total units present on "
2813 "the tile.",
2814 preq->source.value.max_tile_total_units),
2815 preq->source.value.max_tile_total_units);
2816 }
2817 return TRUE;
2819 fc_strlcat(buf, prefix, bufsz);
2820 if (preq->present) {
2822 PL_("The tile or at least one cardinally adjacent tile "
2823 "must have %d total unit or fewer.",
2824 "The tile or at least one cardinally adjacent tile "
2825 "must have %d total units or fewer.",
2826 preq->source.value.max_tile_total_units),
2827 preq->source.value.max_tile_total_units);
2828 } else {
2830 PL_("The tile and all cardinally adjacent tiles must "
2831 "have more than %d total unit each.",
2832 "The tile and all cardinally adjacent tiles must "
2833 "have more than %d total units each.",
2834 preq->source.value.max_tile_total_units),
2835 preq->source.value.max_tile_total_units);
2836 }
2837 return TRUE;
2838 case REQ_RANGE_ADJACENT:
2839 fc_strlcat(buf, prefix, bufsz);
2840 if (preq->present) {
2842 PL_("The tile or at least one adjacent tile must have "
2843 "%d total unit or fewer.",
2844 "The tile or at least one adjacent tile must have "
2845 "%d total units or fewer.",
2846 preq->source.value.max_tile_total_units),
2847 preq->source.value.max_tile_total_units);
2848 } else {
2850 PL_("The tile and all adjacent tiles must have more "
2851 "than %d total unit each.",
2852 "The tile and all adjacent tiles must have more "
2853 "than %d total units each.",
2854 preq->source.value.max_tile_total_units),
2855 preq->source.value.max_tile_total_units);
2856 }
2857 return TRUE;
2858 case REQ_RANGE_CITY:
2861 case REQ_RANGE_PLAYER:
2862 case REQ_RANGE_TEAM:
2863 case REQ_RANGE_ALLIANCE:
2864 case REQ_RANGE_WORLD:
2865 case REQ_RANGE_LOCAL:
2866 case REQ_RANGE_COUNT:
2867 /* Not supported. */
2868 return FALSE;
2869 }
2870 return TRUE;
2871}
2872
2873/*************************************************************/
2878static bool req_text_max_tile_top_units(char *buf, size_t bufsz,
2879 struct player *pplayer,
2880 const struct requirement *preq,
2881 const char *prefix)
2882{
2883 switch (preq->range) {
2884 case REQ_RANGE_TILE:
2885 fc_strlcat(buf, prefix, bufsz);
2886 if (preq->present) {
2888 PL_("At most %d untransported unit may be present on the tile.",
2889 "At most %d untransported units may be present on the tile.",
2890 preq->source.value.max_tile_top_units),
2891 preq->source.value.max_tile_top_units);
2892 } else {
2894 PL_("There must be more than %d untransported unit present on "
2895 "the tile.",
2896 "There must be more than %d untransported units present on "
2897 "the tile.",
2898 preq->source.value.max_tile_top_units),
2899 preq->source.value.max_tile_top_units);
2900 }
2901 return TRUE;
2903 fc_strlcat(buf, prefix, bufsz);
2904 if (preq->present) {
2906 PL_("The tile or at least one cardinally adjacent tile "
2907 "must have %d untransporte unit or fewer.",
2908 "The tile or at least one cardinally adjacent tile "
2909 "must have %d untransporte units or fewer.",
2910 preq->source.value.max_tile_top_units),
2911 preq->source.value.max_tile_top_units);
2912 } else {
2914 PL_("The tile and all cardinally adjacent tiles must "
2915 "have more than %d untransported unit each.",
2916 "The tile and all cardinally adjacent tiles must "
2917 "have more than %d untransported units each.",
2918 preq->source.value.max_tile_top_units),
2919 preq->source.value.max_tile_top_units);
2920 }
2921 return TRUE;
2922 case REQ_RANGE_ADJACENT:
2923 fc_strlcat(buf, prefix, bufsz);
2924 if (preq->present) {
2926 PL_("The tile or at least one adjacent tile must have "
2927 "%d untransported unit or fewer.",
2928 "The tile or at least one adjacent tile must have "
2929 "%d untransported units or fewer.",
2930 preq->source.value.max_tile_top_units),
2931 preq->source.value.max_tile_top_units);
2932 } else {
2934 PL_("The tile and all adjacent tiles must have "
2935 "more than %d untransported unit each.",
2936 "The tile and all adjacent tiles must have "
2937 "more than %d untransported units each.",
2938 preq->source.value.max_tile_top_units),
2939 preq->source.value.max_tile_top_units);
2940 }
2941 return TRUE;
2942 case REQ_RANGE_CITY:
2945 case REQ_RANGE_PLAYER:
2946 case REQ_RANGE_TEAM:
2947 case REQ_RANGE_ALLIANCE:
2948 case REQ_RANGE_WORLD:
2949 case REQ_RANGE_LOCAL:
2950 case REQ_RANGE_COUNT:
2951 /* Not supported. */
2952 return FALSE;
2953 }
2954 return TRUE;
2955}
2956
2957/*************************************************************/
2962static bool req_text_ai_level(char *buf, size_t bufsz,
2963 struct player *pplayer,
2964 const struct requirement *preq,
2965 const char *prefix)
2966{
2967 if (preq->range != REQ_RANGE_PLAYER) {
2968 return FALSE;
2969 }
2970 fc_strlcat(buf, prefix, bufsz);
2971 if (preq->present) {
2973 /* TRANS: AI level (e.g., "Handicapped") */
2974 _("Applies to %s AI players."),
2975 ai_level_translated_name(preq->source.value.ai_level));
2976 } else {
2978 /* TRANS: AI level (e.g., "Cheating") */
2979 _("Does not apply to %s AI players."),
2980 ai_level_translated_name(preq->source.value.ai_level));
2981 }
2982 return TRUE;
2983}
2984
2985/*************************************************************/
2990static bool req_text_terrain_class(char *buf, size_t bufsz,
2991 struct player *pplayer,
2992 const struct requirement *preq,
2993 const char *prefix)
2994{
2995 switch (preq->range) {
2996 case REQ_RANGE_TILE:
2997 fc_strlcat(buf, prefix, bufsz);
2998 if (preq->present) {
3000 /* TRANS: %s is a terrain class */
3001 Q_("?terrainclass:Requires %s terrain on the tile."),
3003 (preq->source.value.terrainclass));
3004 } else {
3006 /* TRANS: %s is a terrain class */
3007 Q_("?terrainclass:Prevented by %s terrain on the tile."),
3009 (preq->source.value.terrainclass));
3010 }
3011 return TRUE;
3013 fc_strlcat(buf, prefix, bufsz);
3014 if (preq->present) {
3016 /* TRANS: %s is a terrain class */
3017 Q_("?terrainclass:Requires %s terrain on the tile or a "
3018 "cardinally adjacent tile."),
3020 (preq->source.value.terrainclass));
3021 } else {
3023 /* TRANS: %s is a terrain class */
3024 Q_("?terrainclass:Prevented by %s terrain on the tile or "
3025 "any cardinally adjacent tile."),
3027 (preq->source.value.terrainclass));
3028 }
3029 return TRUE;
3030 case REQ_RANGE_ADJACENT:
3031 fc_strlcat(buf, prefix, bufsz);
3032 if (preq->present) {
3034 /* TRANS: %s is a terrain class */
3035 Q_("?terrainclass:Requires %s terrain on the tile or an "
3036 "adjacent tile."),
3038 (preq->source.value.terrainclass));
3039 } else {
3041 /* TRANS: %s is a terrain class */
3042 Q_("?terrainclass:Prevented by %s terrain on the tile or "
3043 "any adjacent tile."),
3045 (preq->source.value.terrainclass));
3046 }
3047 return TRUE;
3048 case REQ_RANGE_CITY:
3049 fc_strlcat(buf, prefix, bufsz);
3050 if (preq->present) {
3052 /* TRANS: %s is a terrain class */
3053 Q_("?terrainclass:Requires %s terrain on a tile within "
3054 "the city radius."),
3056 (preq->source.value.terrainclass));
3057 } else {
3059 /* TRANS: %s is a terrain class */
3060 Q_("?terrainclass:Prevented by %s terrain on any tile "
3061 "within the city radius."),
3063 (preq->source.value.terrainclass));
3064 }
3065 return TRUE;
3067 fc_strlcat(buf, prefix, bufsz);
3068 if (preq->present) {
3070 /* TRANS: %s is a terrain class */
3071 Q_("?terrainclass:Requires %s terrain on a tile within "
3072 "the city radius or the city radius of a trade "
3073 "partner."),
3075 (preq->source.value.terrainclass));
3076 } else {
3078 /* TRANS: %s is a terrain class */
3079 Q_("?terrainclass:Prevented by %s terrain on any tile "
3080 "within the city radius or the city radius of a trade "
3081 "partner."),
3083 (preq->source.value.terrainclass));
3084 }
3085 return TRUE;
3087 case REQ_RANGE_PLAYER:
3088 case REQ_RANGE_TEAM:
3089 case REQ_RANGE_ALLIANCE:
3090 case REQ_RANGE_WORLD:
3091 case REQ_RANGE_LOCAL:
3092 case REQ_RANGE_COUNT:
3093 /* Not supported. */
3094 return FALSE;
3095 }
3096 return TRUE;
3097}
3098
3099/*************************************************************/
3104static bool req_text_terrain_flag(char *buf, size_t bufsz,
3105 struct player *pplayer,
3106 const struct requirement *preq,
3107 const char *prefix)
3108{
3109 switch (preq->range) {
3110 case REQ_RANGE_TILE:
3111 fc_strlcat(buf, prefix, bufsz);
3112 if (preq->present) {
3114 /* TRANS: %s is a (translatable) terrain flag. */
3115 _("Requires terrain with the \"%s\" flag on the tile."),
3116 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3117 } else {
3119 /* TRANS: %s is a (translatable) terrain flag. */
3120 _("Prevented by terrain with the \"%s\" flag on the "
3121 "tile."),
3122 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3123 }
3124 return TRUE;
3126 fc_strlcat(buf, prefix, bufsz);
3127 if (preq->present) {
3129 /* TRANS: %s is a (translatable) terrain flag. */
3130 _("Requires terrain with the \"%s\" flag on the "
3131 "tile or a cardinally adjacent tile."),
3132 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3133 } else {
3135 /* TRANS: %s is a (translatable) terrain flag. */
3136 _("Prevented by terrain with the \"%s\" flag on "
3137 "the tile or any cardinally adjacent tile."),
3138 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3139 }
3140 return TRUE;
3141 case REQ_RANGE_ADJACENT:
3142 fc_strlcat(buf, prefix, bufsz);
3143 if (preq->present) {
3145 /* TRANS: %s is a (translatable) terrain flag. */
3146 _("Requires terrain with the \"%s\" flag on the "
3147 "tile or an adjacent tile."),
3148 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3149 } else {
3151 /* TRANS: %s is a (translatable) terrain flag. */
3152 _("Prevented by terrain with the \"%s\" flag on "
3153 "the tile or any adjacent tile."),
3154 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3155 }
3156 return TRUE;
3157 case REQ_RANGE_CITY:
3158 fc_strlcat(buf, prefix, bufsz);
3159 if (preq->present) {
3161 /* TRANS: %s is a (translatable) terrain flag. */
3162 _("Requires terrain with the \"%s\" flag on a tile "
3163 "within the city radius."),
3164 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3165 } else {
3167 /* TRANS: %s is a (translatable) terrain flag. */
3168 _("Prevented by terrain with the \"%s\" flag on any tile "
3169 "within the city radius."),
3170 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3171 }
3172 return TRUE;
3174 fc_strlcat(buf, prefix, bufsz);
3175 if (preq->present) {
3177 /* TRANS: %s is a (translatable) terrain flag. */
3178 _("Requires terrain with the \"%s\" flag on a tile "
3179 "within the city radius or the city radius of "
3180 "a trade partner."),
3181 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3182 } else {
3184 /* TRANS: %s is a (translatable) terrain flag. */
3185 _("Prevented by terrain with the \"%s\" flag on any tile "
3186 "within the city radius or the city radius of "
3187 "a trade partner."),
3188 terrain_flag_id_translated_name(preq->source.value.terrainflag));
3189 }
3190 return TRUE;
3192 case REQ_RANGE_PLAYER:
3193 case REQ_RANGE_TEAM:
3194 case REQ_RANGE_ALLIANCE:
3195 case REQ_RANGE_WORLD:
3196 case REQ_RANGE_LOCAL:
3197 case REQ_RANGE_COUNT:
3198 /* Not supported. */
3199 return FALSE;
3200 }
3201 return TRUE;
3202}
3203
3204/*************************************************************/
3209static bool req_text_road_flag(char *buf, size_t bufsz,
3210 struct player *pplayer,
3211 const struct requirement *preq,
3212 const char *prefix)
3213{
3214 switch (preq->range) {
3215 case REQ_RANGE_LOCAL:
3216 fc_strlcat(buf, prefix, bufsz);
3217 if (preq->present) {
3219 /* TRANS: %s is a (translatable) road flag. */
3220 _("Only applies to roads with the \"%s\" flag."),
3222 (preq->source.value.roadflag));
3223 } else {
3225 /* TRANS: %s is a (translatable) road flag. */
3226 _("Does not apply to roads with the \"%s\" flag."),
3228 (preq->source.value.roadflag));
3229 }
3230 return TRUE;
3231 case REQ_RANGE_TILE:
3232 fc_strlcat(buf, prefix, bufsz);
3233 if (preq->present) {
3235 /* TRANS: %s is a (translatable) road flag. */
3236 _("Requires a road with the \"%s\" flag on the tile."),
3237 road_flag_id_translated_name(preq->source.value.roadflag));
3238 } else {
3240 /* TRANS: %s is a (translatable) road flag. */
3241 _("Prevented by a road with the \"%s\" flag on the "
3242 "tile."),
3243 road_flag_id_translated_name(preq->source.value.roadflag));
3244 }
3245 return TRUE;
3247 fc_strlcat(buf, prefix, bufsz);
3248 if (preq->present) {
3250 /* TRANS: %s is a (translatable) road flag. */
3251 _("Requires a road with the \"%s\" flag on the "
3252 "tile or a cardinally adjacent tile."),
3253 road_flag_id_translated_name(preq->source.value.roadflag));
3254 } else {
3256 /* TRANS: %s is a (translatable) road flag. */
3257 _("Prevented by a road with the \"%s\" flag on "
3258 "the tile or any cardinally adjacent tile."),
3259 road_flag_id_translated_name(preq->source.value.roadflag));
3260 }
3261 return TRUE;
3262 case REQ_RANGE_ADJACENT:
3263 fc_strlcat(buf, prefix, bufsz);
3264 if (preq->present) {
3266 /* TRANS: %s is a (translatable) road flag. */
3267 _("Requires a road with the \"%s\" flag on the "
3268 "tile or an adjacent tile."),
3269 road_flag_id_translated_name(preq->source.value.roadflag));
3270 } else {
3272 /* TRANS: %s is a (translatable) road flag. */
3273 _("Prevented by a road with the \"%s\" flag on "
3274 "the tile or any adjacent tile."),
3275 road_flag_id_translated_name(preq->source.value.roadflag));
3276 }
3277 return TRUE;
3278 case REQ_RANGE_CITY:
3279 fc_strlcat(buf, prefix, bufsz);
3280 if (preq->present) {
3282 /* TRANS: %s is a (translatable) road flag. */
3283 _("Requires a road with the \"%s\" flag on a tile "
3284 "within the city radius."),
3285 road_flag_id_translated_name(preq->source.value.roadflag));
3286 } else {
3288 /* TRANS: %s is a (translatable) road flag. */
3289 _("Prevented by a road with the \"%s\" flag on any tile "
3290 "within the city radius."),
3291 road_flag_id_translated_name(preq->source.value.roadflag));
3292 }
3293 return TRUE;
3295 fc_strlcat(buf, prefix, bufsz);
3296 if (preq->present) {
3298 /* TRANS: %s is a (translatable) road flag. */
3299 _("Requires a road with the \"%s\" flag on a tile "
3300 "within the city radius or the city radius of a "
3301 "trade partner."),
3302 road_flag_id_translated_name(preq->source.value.roadflag));
3303 } else {
3305 /* TRANS: %s is a (translatable) road flag. */
3306 _("Prevented by a road with the \"%s\" flag on any tile "
3307 "within the city radius or the city radius of a "
3308 "trade partner."),
3309 road_flag_id_translated_name(preq->source.value.roadflag));
3310 }
3311 return TRUE;
3313 case REQ_RANGE_PLAYER:
3314 case REQ_RANGE_TEAM:
3315 case REQ_RANGE_ALLIANCE:
3316 case REQ_RANGE_WORLD:
3317 case REQ_RANGE_COUNT:
3318 /* Not supported. */
3319 return FALSE;
3320 }
3321 return TRUE;
3322}
3323
3324/*************************************************************/
3329static bool req_text_extra_flag(char *buf, size_t bufsz,
3330 struct player *pplayer,
3331 const struct requirement *preq,
3332 const char *prefix)
3333{
3334 switch (preq->range) {
3335 case REQ_RANGE_LOCAL:
3336 fc_strlcat(buf, prefix, bufsz);
3337 if (preq->present) {
3339 /* TRANS: %s is a (translatable) extra flag. */
3340 _("Only applies to extras with the \"%s\" flag."),
3342 (preq->source.value.extraflag));
3343 } else {
3345 /* TRANS: %s is a (translatable) extra flag. */
3346 _("Does not apply to extras with the \"%s\" flag."),
3348 (preq->source.value.extraflag));
3349 }
3350 return TRUE;
3351 case REQ_RANGE_TILE:
3352 fc_strlcat(buf, prefix, bufsz);
3353 if (preq->present) {
3355 /* TRANS: %s is a (translatable) extra flag. */
3356 _("Requires an extra with the \"%s\" flag on the tile."),
3357 extra_flag_id_translated_name(preq->source.value.extraflag));
3358 } else {
3360 /* TRANS: %s is a (translatable) extra flag. */
3361 _("Prevented by an extra with the \"%s\" flag on the "
3362 "tile."),
3363 extra_flag_id_translated_name(preq->source.value.extraflag));
3364 }
3365 return TRUE;
3367 fc_strlcat(buf, prefix, bufsz);
3368 if (preq->present) {
3370 /* TRANS: %s is a (translatable) extra flag. */
3371 _("Requires an extra with the \"%s\" flag on the "
3372 "tile or a cardinally adjacent tile."),
3373 extra_flag_id_translated_name(preq->source.value.extraflag));
3374 } else {
3376 /* TRANS: %s is a (translatable) extra flag. */
3377 _("Prevented by an extra with the \"%s\" flag on "
3378 "the tile or any cardinally adjacent tile."),
3379 extra_flag_id_translated_name(preq->source.value.extraflag));
3380 }
3381 return TRUE;
3382 case REQ_RANGE_ADJACENT:
3383 fc_strlcat(buf, prefix, bufsz);
3384 if (preq->present) {
3386 /* TRANS: %s is a (translatable) extra flag. */
3387 _("Requires an extra with the \"%s\" flag on the "
3388 "tile or an adjacent tile."),
3389 extra_flag_id_translated_name(preq->source.value.extraflag));
3390 } else {
3392 /* TRANS: %s is a (translatable) extra flag. */
3393 _("Prevented by an extra with the \"%s\" flag on "
3394 "the tile or any adjacent tile."),
3395 extra_flag_id_translated_name(preq->source.value.extraflag));
3396 }
3397 return TRUE;
3398 case REQ_RANGE_CITY:
3399 fc_strlcat(buf, prefix, bufsz);
3400 if (preq->present) {
3402 /* TRANS: %s is a (translatable) extra flag. */
3403 _("Requires an extra with the \"%s\" flag on a tile "
3404 "within the city radius."),
3405 extra_flag_id_translated_name(preq->source.value.extraflag));
3406 } else {
3408 /* TRANS: %s is a (translatable) extra flag. */
3409 _("Prevented by an extra with the \"%s\" flag on any tile "
3410 "within the city radius."),
3411 extra_flag_id_translated_name(preq->source.value.extraflag));
3412 }
3413 return TRUE;
3415 fc_strlcat(buf, prefix, bufsz);
3416 if (preq->present) {
3418 /* TRANS: %s is a (translatable) extra flag. */
3419 _("Requires an extra with the \"%s\" flag on a tile "
3420 "within the city radius or the city radius of a "
3421 "trade partner."),
3422 extra_flag_id_translated_name(preq->source.value.extraflag));
3423 } else {
3425 /* TRANS: %s is a (translatable) extra flag. */
3426 _("Prevented by an extra with the \"%s\" flag on any tile "
3427 "within the city radius or the city radius of a "
3428 "trade partner."),
3429 extra_flag_id_translated_name(preq->source.value.extraflag));
3430 }
3431 return TRUE;
3433 case REQ_RANGE_PLAYER:
3434 case REQ_RANGE_TEAM:
3435 case REQ_RANGE_ALLIANCE:
3436 case REQ_RANGE_WORLD:
3437 case REQ_RANGE_COUNT:
3438 /* Not supported. */
3439 return FALSE;
3440 }
3441 return TRUE;
3442}
3443
3444/*************************************************************/
3449static bool req_text_min_year(char *buf, size_t bufsz,
3450 struct player *pplayer,
3451 const struct requirement *preq,
3452 const char *prefix)
3453{
3454 if (preq->range != REQ_RANGE_WORLD) {
3455 return FALSE;
3456 }
3457 fc_strlcat(buf, prefix, bufsz);
3458 if (preq->present) {
3460 _("Requires the game to have reached the year %s."),
3461 textyear(preq->source.value.minyear));
3462 } else {
3464 _("Requires that the game has not yet reached the "
3465 "year %s."),
3466 textyear(preq->source.value.minyear));
3467 }
3468 return TRUE;
3469}
3470
3471/*************************************************************/
3476static bool req_text_min_cal_frag(char *buf, size_t bufsz,
3477 struct player *pplayer,
3478 const struct requirement *preq,
3479 const char *prefix)
3480{
3481 if (preq->range != REQ_RANGE_WORLD) {
3482 return FALSE;
3483 }
3484 fc_strlcat(buf, prefix, bufsz);
3485 if (preq->present) {
3487 /* TRANS: %s is a representation of a calendar fragment,
3488 * from the ruleset. May be a bare number. */
3489 _("Requires the game to have reached %s."),
3490 textcalfrag(preq->source.value.mincalfrag));
3491 } else {
3493 /* TRANS: %s is a representation of a calendar fragment,
3494 * from the ruleset. May be a bare number. */
3495 _("Requires that the game has not yet reached %s."),
3496 textcalfrag(preq->source.value.mincalfrag));
3497 }
3498 return TRUE;
3499}
3500
3501/*************************************************************/
3506static bool req_text_topo_property(char *buf, size_t bufsz,
3507 struct player *pplayer,
3508 const struct requirement *preq,
3509 const char *prefix)
3510{
3511 if (preq->range != REQ_RANGE_WORLD) {
3512 return FALSE;
3513 }
3514 fc_strlcat(buf, prefix, bufsz);
3515 if (preq->present) {
3517 /* TRANS: topology flag name ("Hex", "ISO") */
3518 _("Requires %s map."),
3519 _(topo_flag_name(preq->source.value.topo_property)));
3520 } else {
3522 /* TRANS: topology flag name ("Hex", "ISO") */
3523 _("Prevented on %s map."),
3524 _(topo_flag_name(preq->source.value.topo_property)));
3525 }
3526 return TRUE;
3527}
3528
3529/*************************************************************/
3534static bool req_text_wrap_property(char *buf, size_t bufsz,
3535 struct player *pplayer,
3536 const struct requirement *preq,
3537 const char *prefix)
3538{
3539 if (preq->range != REQ_RANGE_WORLD) {
3540 return FALSE;
3541 }
3542 fc_strlcat(buf, prefix, bufsz);
3543 if (preq->present) {
3545 /* TRANS: wrap flag name ("WrapX", "WrapY") */
3546 _("Requires %s map."),
3547 _(wrap_flag_name(preq->source.value.wrap_property)));
3548 } else {
3550 /* TRANS: wrap flag name ("WrapX", "WrapY") */
3551 _("Prevented on %s map."),
3552 _(wrap_flag_name(preq->source.value.wrap_property)));
3553 }
3554 return TRUE;
3555}
3556
3557/*************************************************************/
3562static bool req_text_server_setting(char *buf, size_t bufsz,
3563 struct player *pplayer,
3564 const struct requirement *preq,
3565 const char *prefix)
3566{
3567 if (preq->range != REQ_RANGE_WORLD) {
3568 return FALSE;
3569 }
3570 fc_strlcat(buf, prefix, bufsz);
3572 /* TRANS: %s is a server setting, its value and if it is
3573 * required to be present or absent. The string's format
3574 * is specified in ssetv_human_readable().
3575 * Example: "killstack is enabled". */
3576 _("Requires that the server setting %s."),
3577 ssetv_human_readable(preq->source.value.ssetval,
3578 preq->present));
3579 return TRUE;
3580}
3581
3582/*************************************************************/
3587static bool req_text_age(char *buf, size_t bufsz,
3588 struct player *pplayer,
3589 const struct requirement *preq,
3590 const char *prefix)
3591{
3592 fc_strlcat(buf, prefix, bufsz);
3593 if (preq->present) {
3595 _("Requires age of %d turns."),
3596 preq->source.value.age);
3597 } else {
3599 _("Prevented if age is over %d turns."),
3600 preq->source.value.age);
3601 }
3602 return TRUE;
3603}
3604
3605/*************************************************************/
3610static bool req_text_form_age(char *buf, size_t bufsz,
3611 struct player *pplayer,
3612 const struct requirement *preq,
3613 const char *prefix)
3614{
3615 fc_strlcat(buf, prefix, bufsz);
3616 if (preq->present) {
3618 _("Requires form age of %d turns."),
3619 preq->source.value.form_age);
3620 } else {
3622 _("Prevented if form age is over %d turns."),
3623 preq->source.value.form_age);
3624 }
3625 return TRUE;
3626}
3627
3628/*************************************************************/
3633static bool req_text_min_techs(char *buf, size_t bufsz,
3634 struct player *pplayer,
3635 const struct requirement *preq,
3636 const char *prefix)
3637{
3638 switch (preq->range) {
3639 case REQ_RANGE_WORLD:
3640 fc_strlcat(buf, prefix, bufsz);
3641 if (preq->present) {
3643 _("Requires %d techs to be known in the world."),
3644 preq->source.value.min_techs);
3645 } else {
3647 _("Prevented when %d techs are known in the world."),
3648 preq->source.value.min_techs);
3649 }
3650 return TRUE;
3651 case REQ_RANGE_PLAYER:
3652 fc_strlcat(buf, prefix, bufsz);
3653 if (preq->present) {
3655 _("Requires player to know %d techs."),
3656 preq->source.value.min_techs);
3657 } else {
3659 _("Prevented when player knows %d techs."),
3660 preq->source.value.min_techs);
3661 }
3662 return TRUE;
3663 case REQ_RANGE_LOCAL:
3664 case REQ_RANGE_TILE:
3666 case REQ_RANGE_ADJACENT:
3667 case REQ_RANGE_CITY:
3670 case REQ_RANGE_TEAM:
3671 case REQ_RANGE_ALLIANCE:
3672 case REQ_RANGE_COUNT:
3673 /* Not supported. */
3674 return FALSE;
3675 }
3676 return TRUE;
3677}
3678
3679/*************************************************************/
3684static bool req_text_future_techs(char *buf, size_t bufsz,
3685 struct player *pplayer,
3686 const struct requirement *preq,
3687 const char *prefix)
3688{
3689 switch (preq->range) {
3690 case REQ_RANGE_WORLD:
3691 fc_strlcat(buf, prefix, bufsz);
3692 if (preq->present) {
3694 _("Requires %d future techs to be known in the world."),
3695 preq->source.value.future_techs);
3696 } else {
3698 _("Prevented when %d future techs are known in the world."),
3699 preq->source.value.future_techs);
3700 }
3701 return TRUE;
3702 case REQ_RANGE_PLAYER:
3703 fc_strlcat(buf, prefix, bufsz);
3704 if (preq->present) {
3706 _("Requires player to know %d future techs."),
3707 preq->source.value.future_techs);
3708 } else {
3710 _("Prevented when player knows %d future techs."),
3711 preq->source.value.future_techs);
3712 }
3713 return TRUE;
3714 case REQ_RANGE_LOCAL:
3715 case REQ_RANGE_TILE:
3717 case REQ_RANGE_ADJACENT:
3718 case REQ_RANGE_CITY:
3721 case REQ_RANGE_TEAM:
3722 case REQ_RANGE_ALLIANCE:
3723 case REQ_RANGE_COUNT:
3724 /* Not supported. */
3725 return FALSE;
3726 }
3727 return TRUE;
3728}
3729
3730/*************************************************************/
3735static bool req_text_min_cities(char *buf, size_t bufsz,
3736 struct player *pplayer,
3737 const struct requirement *preq,
3738 const char *prefix)
3739{
3740 switch (preq->range) {
3741 case REQ_RANGE_PLAYER:
3742 fc_strlcat(buf, prefix, bufsz);
3743 if (preq->present) {
3745 _("Requires player to have at least %d cities."),
3746 preq->source.value.min_cities);
3747 } else {
3749 _("Prevented when player has at least %d cities."),
3750 preq->source.value.min_cities);
3751 }
3752 return TRUE;
3753 case REQ_RANGE_WORLD:
3754 case REQ_RANGE_LOCAL:
3755 case REQ_RANGE_TILE:
3757 case REQ_RANGE_ADJACENT:
3758 case REQ_RANGE_CITY:
3761 case REQ_RANGE_TEAM:
3762 case REQ_RANGE_ALLIANCE:
3763 case REQ_RANGE_COUNT:
3764 /* Not supported. */
3765 return FALSE;
3766 }
3767 return TRUE;
3768}
3769
3770/*************************************************************/
3775static bool req_text_terrain_alter(char *buf, size_t bufsz,
3776 struct player *pplayer,
3777 const struct requirement *preq,
3778 const char *prefix)
3779{
3780 switch (preq->range) {
3781 case REQ_RANGE_TILE:
3782 fc_strlcat(buf, prefix, bufsz);
3783 if (preq->present) {
3785 _("Requires terrain on which alteration %s is "
3786 "possible."),
3787 Q_(terrain_alteration_name(preq->source.value.terrainalter)));
3788 } else {
3790 _("Prevented by terrain on which alteration %s "
3791 "can be made."),
3792 Q_(terrain_alteration_name(preq->source.value.terrainalter)));
3793 }
3794 return TRUE;
3796 case REQ_RANGE_ADJACENT:
3797 case REQ_RANGE_CITY:
3800 case REQ_RANGE_PLAYER:
3801 case REQ_RANGE_TEAM:
3802 case REQ_RANGE_ALLIANCE:
3803 case REQ_RANGE_WORLD:
3804 case REQ_RANGE_LOCAL:
3805 case REQ_RANGE_COUNT:
3806 /* Not supported. */
3807 return FALSE;
3808 }
3809 return TRUE;
3810}
3811
3812/*************************************************************/
3817static bool req_text_city_tile(char *buf, size_t bufsz,
3818 struct player *pplayer,
3819 const struct requirement *preq,
3820 const char *prefix)
3821{
3822 if (preq->source.value.citytile == CITYT_LAST) {
3823 return FALSE;
3824 } else {
3825 static char *tile_property = nullptr;
3826
3827 switch (preq->source.value.citytile) {
3828 case CITYT_CENTER:
3829 tile_property = _("city centers");
3830 break;
3831 case CITYT_CLAIMED:
3832 tile_property = _("claimed tiles");
3833 break;
3834 case CITYT_EXTRAS_OWNED:
3835 tile_property = _("owned extras");
3836 break;
3837 case CITYT_WORKED:
3838 tile_property = _("worked tiles");
3839 break;
3841 /* TRANS: a specific city for each use case */
3842 tile_property = _("tiles on the same continent as the city");
3843 break;
3845 {
3846 bool oceanic_cities = FALSE; /* FIXME: maybe cache globally? */
3847
3852 /* TRANS: a specific city for each use case */
3853 tile_property = _("tiles of a mass of a different "
3854 "terrain class next to the city");
3855 break;
3856 }
3858 if (oceanic_cities) {
3859 break;
3860 }
3861 /* TRANS: a specific city for each use case */
3862 tile_property = _("tiles of a body of water next to the city");
3863 }
3864 break;
3865 case CITYT_LAST:
3866 fc_assert(preq->source.value.citytile != CITYT_LAST);
3867 break;
3868 }
3869
3870 switch (preq->range) {
3871 case REQ_RANGE_TILE:
3872 fc_strlcat(buf, prefix, bufsz);
3873 if (preq->present) {
3875 /* TRANS: tile property ("city centers", etc) */
3876 Q_("?tileprop:Applies only to %s."), tile_property);
3877 } else {
3879 /* TRANS: tile property ("city centers", etc) */
3880 Q_("?tileprop:Does not apply to %s."), tile_property);
3881 }
3882 return TRUE;
3884 fc_strlcat(buf, prefix, bufsz);
3885 if (preq->present) {
3886 /* TRANS: tile property ("city centers", etc) */
3887 cat_snprintf(buf, bufsz, Q_("?tileprop:Applies only to %s and "
3888 "cardinally adjacent tiles."),
3890 } else {
3891 /* TRANS: tile property ("city centers", etc) */
3892 cat_snprintf(buf, bufsz, Q_("?tileprop:Does not apply to %s or "
3893 "cardinally adjacent tiles."),
3895 }
3896 return TRUE;
3897 case REQ_RANGE_ADJACENT:
3898 fc_strlcat(buf, prefix, bufsz);
3899 if (preq->present) {
3900 /* TRANS: tile property ("city centers", etc) */
3901 cat_snprintf(buf, bufsz, Q_("?tileprop:Applies only to %s and "
3902 "adjacent tiles."), tile_property);
3903 } else {
3904 /* TRANS: tile property ("city centers", etc) */
3905 cat_snprintf(buf, bufsz, Q_("?tileprop:Does not apply to %s or "
3906 "adjacent tiles."), tile_property);
3907 }
3908 return TRUE;
3909 case REQ_RANGE_CITY:
3912 case REQ_RANGE_PLAYER:
3913 case REQ_RANGE_TEAM:
3914 case REQ_RANGE_ALLIANCE:
3915 case REQ_RANGE_WORLD:
3916 case REQ_RANGE_LOCAL:
3917 case REQ_RANGE_COUNT:
3918 /* Not supported. */
3919 return FALSE;
3920 }
3921 }
3922 return TRUE;
3923}
3924
3925/*************************************************************/
3930static bool req_text_city_status(char *buf, size_t bufsz,
3931 struct player *pplayer,
3932 const struct requirement *preq,
3933 const char *prefix)
3934{
3935 if (preq->source.value.citystatus != CITYS_LAST) {
3936 static char *city_property = nullptr;
3937
3938 switch (preq->source.value.citystatus) {
3940 city_property = _("owned by original");
3941 break;
3942 case CITYS_STARVED:
3943 city_property = _("starved");
3944 break;
3945 case CITYS_DISORDER:
3946 city_property = _("disorder");
3947 break;
3948 case CITYS_CELEBRATION:
3949 city_property = _("celebration");
3950 break;
3951 case CITYS_TRANSFERRED:
3952 city_property = _("transferred");
3953 break;
3955 city_property = _("capitalconnected");
3956 break;
3957 case CITYS_LAST:
3958 fc_assert(preq->source.value.citystatus != CITYS_LAST);
3959 break;
3960 }
3961
3962 switch (preq->range) {
3963 case REQ_RANGE_CITY:
3964 fc_strlcat(buf, prefix, bufsz);
3965 if (preq->present) {
3966 /* TRANS: city property ("owned by original", etc) */
3967 cat_snprintf(buf, bufsz, Q_("?cityprop:Applies only to %s cities."),
3969 } else {
3970 /* TRANS: city property ("owned by original", etc) */
3971 cat_snprintf(buf, bufsz, Q_("?cityprop:Does not apply to %s cities."),
3973 }
3974 return TRUE;
3976 fc_strlcat(buf, prefix, bufsz);
3977 if (preq->present) {
3978 /* TRANS: city property ("owned by original", etc) */
3979 cat_snprintf(buf, bufsz, Q_("?cityprop:Applies only to %s cities or "
3980 "their trade partners."), city_property);
3981 } else {
3982 /* TRANS: city property ("owned by original", etc) */
3983 cat_snprintf(buf, bufsz, Q_("?cityprop:Does not apply to %s cities or "
3984 "their trade partners."), city_property);
3985 }
3986 return TRUE;
3987 case REQ_RANGE_LOCAL:
3988 case REQ_RANGE_TILE:
3989 case REQ_RANGE_ADJACENT:
3992 case REQ_RANGE_PLAYER:
3993 case REQ_RANGE_TEAM:
3994 case REQ_RANGE_ALLIANCE:
3995 case REQ_RANGE_WORLD:
3996 case REQ_RANGE_COUNT:
3997 /* Not supported. */
3998 return FALSE;
3999 }
4000 }
4001 return TRUE;
4002}
4003
4004/*************************************************************/
4009static bool req_text_min_latitude(char *buf, size_t bufsz,
4010 struct player *pplayer,
4011 const struct requirement *preq,
4012 const char *prefix)
4013{
4014 switch (preq->range) {
4015 case REQ_RANGE_WORLD:
4016 fc_strlcat(buf, prefix, bufsz);
4017 if (preq->present) {
4019 _("Some part of the world must be at latitude %d or "
4020 "further north."),
4021 preq->source.value.latitude);
4022 } else {
4024 _("The entire world must be at latitude %d or "
4025 "further south."),
4026 preq->source.value.latitude - 1);
4027 }
4028 return TRUE;
4029 case REQ_RANGE_TILE:
4030 fc_strlcat(buf, prefix, bufsz);
4031 if (preq->present) {
4033 _("Tile must be at latitude %d or further north."),
4034 preq->source.value.latitude);
4035 } else {
4037 _("Tile must be at latitude %d or further south."),
4038 preq->source.value.latitude - 1);
4039 }
4040 return TRUE;
4042 fc_strlcat(buf, prefix, bufsz);
4043 if (preq->present) {
4045 _("A cardinally adjacent tile must be at latitude "
4046 "%d or further north."),
4047 preq->source.value.latitude);
4048 } else {
4050 _("All cardinally adjacent tiles must be at latitude "
4051 "%d or further south."),
4052 preq->source.value.latitude - 1);
4053 }
4054 return TRUE;
4055 case REQ_RANGE_ADJACENT:
4056 fc_strlcat(buf, prefix, bufsz);
4057 if (preq->present) {
4059 _("An adjacent tile must be at latitude %d or "
4060 "further north."),
4061 preq->source.value.latitude);
4062 } else {
4064 _("All adjacent tiles must be at latitude %d or "
4065 "further south."),
4066 preq->source.value.latitude - 1);
4067 }
4068 return TRUE;
4069 case REQ_RANGE_CITY:
4072 case REQ_RANGE_PLAYER:
4073 case REQ_RANGE_TEAM:
4074 case REQ_RANGE_ALLIANCE:
4075 case REQ_RANGE_LOCAL:
4076 case REQ_RANGE_COUNT:
4077 /* Not supported. */
4078 return FALSE;
4079 }
4080 return TRUE;
4081}
4082
4083/*************************************************************/
4088static bool req_text_max_latitude(char *buf, size_t bufsz,
4089 struct player *pplayer,
4090 const struct requirement *preq,
4091 const char *prefix)
4092{
4093 switch (preq->range) {
4094 case REQ_RANGE_WORLD:
4095 fc_strlcat(buf, prefix, bufsz);
4096 if (preq->present) {
4098 _("Some part of the world must be at latitude %d or "
4099 "further south."),
4100 preq->source.value.latitude);
4101 } else {
4103 _("The entire world must be at latitude %d or "
4104 "further north."),
4105 preq->source.value.latitude + 1);
4106 }
4107 return TRUE;
4108 case REQ_RANGE_TILE:
4109 fc_strlcat(buf, prefix, bufsz);
4110 if (preq->present) {
4112 _("Tile must be at latitude %d or further south."),
4113 preq->source.value.latitude);
4114 } else {
4116 _("Tile must be at latitude %d or further north."),
4117 preq->source.value.latitude + 1);
4118 }
4119 return TRUE;
4121 fc_strlcat(buf, prefix, bufsz);
4122 if (preq->present) {
4124 _("A cardinally adjacent tile must be at latitude "
4125 "%d or further south."),
4126 preq->source.value.latitude);
4127 } else {
4129 _("All cardinally adjacent tiles must be at latitude "
4130 "%d or further north."),
4131 preq->source.value.latitude + 1);
4132 }
4133 return TRUE;
4134 case REQ_RANGE_ADJACENT:
4135 fc_strlcat(buf, prefix, bufsz);
4136 if (preq->present) {
4138 _("An adjacent tile must be at latitude %d or "
4139 "further south."),
4140 preq->source.value.latitude);
4141 } else {
4143 _("All adjacent tiles must be at latitude %d or "
4144 "further north."),
4145 preq->source.value.latitude + 1);
4146 }
4147 return TRUE;
4148 case REQ_RANGE_CITY:
4151 case REQ_RANGE_PLAYER:
4152 case REQ_RANGE_TEAM:
4153 case REQ_RANGE_ALLIANCE:
4154 case REQ_RANGE_LOCAL:
4155 case REQ_RANGE_COUNT:
4156 /* Not supported. */
4157 return FALSE;
4158 }
4159 return TRUE;
4160}
4161
4162/*************************************************************/
4167static bool req_text_distance_sq(char *buf, size_t bufsz,
4168 struct player *pplayer,
4169 const struct requirement *preq,
4170 const char *prefix)
4171{
4172 switch (preq->range) {
4173 case REQ_RANGE_TILE:
4174 fc_strlcat(buf, prefix, bufsz);
4175 /* Test some special cases */
4176 switch (preq->source.value.distance_sq)
4177 {
4178 case 0:
4179 if (preq->present) {
4180 fc_strlcat(buf, _("Must be the same tile."), bufsz);
4181 } else {
4182 fc_strlcat(buf, _("Must not be the same tile."), bufsz);
4183 }
4184 break;
4185 case 1:
4186 if (preq->present) {
4187 fc_strlcat(buf, _("Must be cardinally adjacent."), bufsz);
4188 } else {
4189 fc_strlcat(buf, _("Must not be cardinally adjacent."), bufsz);
4190 }
4191 break;
4192 case 2:
4193 case 3:
4194 if (preq->present) {
4195 fc_strlcat(buf, _("Must be adjacent."), bufsz);
4196 } else {
4197 fc_strlcat(buf, _("Must not be adjacent."), bufsz);
4198 }
4199 break;
4200
4201 default:
4202 if (preq->present) {
4204 _("The squared distance between the tiles "
4205 "must be at most %d."),
4206 preq->source.value.distance_sq);
4207 } else {
4209 _("The squared distance between the tiles "
4210 "must be at least %d."),
4211 preq->source.value.distance_sq + 1);
4212 }
4213 break;
4214 }
4215 return TRUE;
4217 case REQ_RANGE_ADJACENT:
4218 case REQ_RANGE_CITY:
4221 case REQ_RANGE_PLAYER:
4222 case REQ_RANGE_TEAM:
4223 case REQ_RANGE_ALLIANCE:
4224 case REQ_RANGE_WORLD:
4225 case REQ_RANGE_LOCAL:
4226 case REQ_RANGE_COUNT:
4227 /* Not supported. */
4228 return FALSE;
4229 }
4230 return TRUE;
4231}
4232
4233/*************************************************************/
4238static bool req_text_max_region_tiles(char *buf, size_t bufsz,
4239 struct player *pplayer,
4240 const struct requirement *preq,
4241 const char *prefix)
4242{
4243 switch (preq->range) {
4245 fc_strlcat(buf, prefix, bufsz);
4246 /* Off-by-one: The requirement counts the tile itself, we're phrasing
4247 * the helptext in terms of *other* tiles only. */
4248 if (preq->present) {
4249 if (preq->source.value.region_tiles == 1) {
4250 /* Special case for zero */
4252 _("No other cardinally adjacent tile may be part of "
4253 "the same continent or ocean."),
4254 bufsz);
4255 } else {
4257 PL_("No more than %d other cardinally adjacent tile "
4258 "may be part of the same continent or ocean.",
4259 "No more than %d other cardinally adjacent tiles "
4260 "may be part of the same continent or ocean.",
4261 preq->source.value.region_tiles - 1),
4262 preq->source.value.region_tiles - 1);
4263 }
4264 } else {
4266 PL_("Requires at least %d other cardinally adjacent "
4267 "tile of the same continent or ocean.",
4268 "Requires at least %d other cardinally adjacent "
4269 "tiles of the same continent or ocean.",
4270 preq->source.value.region_tiles),
4271 preq->source.value.region_tiles);
4272 }
4273
4274 return TRUE;
4275 case REQ_RANGE_ADJACENT:
4276 fc_strlcat(buf, prefix, bufsz);
4277 /* Off-by-one: The requirement counts the tile itself, we're phrasing
4278 * the helptext in terms of *other* tiles only. */
4279 if (preq->present) {
4280 if (preq->source.value.region_tiles == 1) {
4281 /* Special case for zero */
4283 _("No other adjacent tile may be part of the same "
4284 "continent or ocean."),
4285 bufsz);
4286 } else {
4288 PL_("No more than %d other adjacent tile may be "
4289 "part of the same continent or ocean.",
4290 "No more than %d other adjacent tiles may be "
4291 "part of the same continent or ocean.",
4292 preq->source.value.region_tiles - 1),
4293 preq->source.value.region_tiles - 1);
4294 }
4295 } else {
4297 PL_("Requires at least %d other adjacent tile of the "
4298 "same continent or ocean.",
4299 "Requires at least %d other adjacent tiles of the "
4300 "same continent or ocean.",
4301 preq->source.value.region_tiles),
4302 preq->source.value.region_tiles);
4303 }
4304
4305 return TRUE;
4307 fc_strlcat(buf, prefix, bufsz);
4308 if (preq->present) {
4310 _("Requires a continent or ocean size of at most %d."),
4311 preq->source.value.region_tiles);
4312 } else {
4314 _("Requires a continent or ocean size of at least %d."),
4315 preq->source.value.region_tiles + 1);
4316 }
4317
4318 return TRUE;
4319 case REQ_RANGE_PLAYER:
4320 case REQ_RANGE_TEAM:
4321 case REQ_RANGE_ALLIANCE:
4322 case REQ_RANGE_WORLD:
4323 case REQ_RANGE_LOCAL:
4324 case REQ_RANGE_TILE:
4325 case REQ_RANGE_CITY:
4327 case REQ_RANGE_COUNT:
4328 /* Not supported. */
4329 return FALSE;
4330 }
4331 return TRUE;
4332}
4333
4334/*************************************************************/
4339static bool req_text_tile_rel(char *buf, size_t bufsz,
4340 struct player *pplayer,
4341 const struct requirement *preq,
4342 const char *prefix)
4343{
4344 switch (preq->source.value.tilerel) {
4345 case TREL_SAME_TCLASS:
4346 switch (preq->range) {
4347 case REQ_RANGE_TILE:
4348 fc_strlcat(buf, prefix, bufsz);
4349 if (preq->present) {
4350 fc_strlcat(buf, _("Must be on the same terrain class."),
4351 bufsz);
4352 } else {
4353 fc_strlcat(buf, _("Must be on a different terrain class."),
4354 bufsz);
4355 }
4356 return TRUE;
4358 fc_strlcat(buf, prefix, bufsz);
4359 if (preq->present) {
4360 fc_strlcat(buf, _("Must be cardinally adjacent to the same "
4361 "terrain class."),
4362 bufsz);
4363 } else {
4364 fc_strlcat(buf, _("Must not be cardinally adjacent to the same "
4365 "terrain class."),
4366 bufsz);
4367 }
4368 return TRUE;
4369 case REQ_RANGE_ADJACENT:
4370 fc_strlcat(buf, prefix, bufsz);
4371 if (preq->present) {
4372 fc_strlcat(buf, _("Must be adjacent to the same terrain class."),
4373 bufsz);
4374 } else {
4375 fc_strlcat(buf, _("Must not be adjacent to the same terrain "
4376 "class."),
4377 bufsz);
4378 }
4379 return TRUE;
4380 case REQ_RANGE_CITY:
4383 case REQ_RANGE_PLAYER:
4384 case REQ_RANGE_TEAM:
4385 case REQ_RANGE_ALLIANCE:
4386 case REQ_RANGE_WORLD:
4387 case REQ_RANGE_LOCAL:
4388 case REQ_RANGE_COUNT:
4389 /* Not supported. */
4390 return FALSE;
4391 }
4392 break;
4393 case TREL_SAME_REGION:
4394 switch (preq->range) {
4395 case REQ_RANGE_TILE:
4396 fc_strlcat(buf, prefix, bufsz);
4397 if (preq->present) {
4398 fc_strlcat(buf, _("Must be on the same continent or ocean."),
4399 bufsz);
4400 } else {
4401 fc_strlcat(buf, _("Must be on a different continent or ocean."),
4402 bufsz);
4403 }
4404 return TRUE;
4406 fc_strlcat(buf, prefix, bufsz);
4407 if (preq->present) {
4408 fc_strlcat(buf, _("Must be cardinally adjacent to the same "
4409 "continent or ocean."),
4410 bufsz);
4411 } else {
4412 fc_strlcat(buf, _("Must not be cardinally adjacent to the same "
4413 "continent or ocean."),
4414 bufsz);
4415 }
4416 return TRUE;
4417 case REQ_RANGE_ADJACENT:
4418 fc_strlcat(buf, prefix, bufsz);
4419 if (preq->present) {
4420 fc_strlcat(buf, _("Must be adjacent to the same continent or "
4421 "ocean."),
4422 bufsz);
4423 } else {
4424 fc_strlcat(buf, _("Must not be adjacent to the same continent "
4425 "or ocean."),
4426 bufsz);
4427 }
4428 return TRUE;
4429 case REQ_RANGE_CITY:
4432 case REQ_RANGE_PLAYER:
4433 case REQ_RANGE_TEAM:
4434 case REQ_RANGE_ALLIANCE:
4435 case REQ_RANGE_WORLD:
4436 case REQ_RANGE_LOCAL:
4437 case REQ_RANGE_COUNT:
4438 /* Not supported. */
4439 return FALSE;
4440 }
4441 break;
4443 switch (preq->range) {
4445 fc_strlcat(buf, prefix, bufsz);
4446 if (preq->present) {
4447 fc_strlcat(buf, _("May only be cardinally adjacent to this "
4448 "other continent or ocean."),
4449 bufsz);
4450 } else {
4451 fc_strlcat(buf, _("Must be cardinally adjacent to more than "
4452 "just this other continent or ocean."),
4453 bufsz);
4454 }
4455 return TRUE;
4456 case REQ_RANGE_ADJACENT:
4457 fc_strlcat(buf, prefix, bufsz);
4458 if (preq->present) {
4459 fc_strlcat(buf, _("May only be adjacent to this other continent "
4460 "or ocean."),
4461 bufsz);
4462 } else {
4463 fc_strlcat(buf, _("Must be adjacent to more than just this "
4464 "other continent or ocean."),
4465 bufsz);
4466 }
4467 return TRUE;
4468 case REQ_RANGE_CITY:
4471 case REQ_RANGE_PLAYER:
4472 case REQ_RANGE_TEAM:
4473 case REQ_RANGE_ALLIANCE:
4474 case REQ_RANGE_WORLD:
4475 case REQ_RANGE_LOCAL:
4476 case REQ_RANGE_TILE:
4477 case REQ_RANGE_COUNT:
4478 /* Not supported. */
4479 return FALSE;
4480 }
4481 break;
4483 switch (preq->range) {
4484 case REQ_RANGE_TILE:
4485 fc_strlcat(buf, prefix, bufsz);
4486 if (preq->present) {
4487 fc_strlcat(buf, _("Must be on a lake or island surrounded by "
4488 "this continent or ocean."),
4489 bufsz);
4490 } else {
4491 fc_strlcat(buf, _("Must not be on a lake or island surrounded "
4492 "by this continent or ocean."),
4493 bufsz);
4494 }
4495 return TRUE;
4497 fc_strlcat(buf, prefix, bufsz);
4498 if (preq->present) {
4499 fc_strlcat(buf, _("Must be on or cardinally adjacent to a lake "
4500 "or island surrounded by this continent or "
4501 "ocean."),
4502 bufsz);
4503 } else {
4504 fc_strlcat(buf, _("Must not be on nor cardinally adjacent to a "
4505 "lake or island surrounded by this continent "
4506 "or ocean."),
4507 bufsz);
4508 }
4509 return TRUE;
4510 case REQ_RANGE_ADJACENT:
4511 fc_strlcat(buf, prefix, bufsz);
4512 if (preq->present) {
4513 fc_strlcat(buf, _("Must be on or adjacent to a lake or island "
4514 "surrounded by this continent or ocean."),
4515 bufsz);
4516 } else {
4517 fc_strlcat(buf, _("Must not be on nor adjacent to a lake or "
4518 "island surrounded by this continent or "
4519 "ocean."),
4520 bufsz);
4521 }
4522 return TRUE;
4523 case REQ_RANGE_CITY:
4526 case REQ_RANGE_PLAYER:
4527 case REQ_RANGE_TEAM:
4528 case REQ_RANGE_ALLIANCE:
4529 case REQ_RANGE_WORLD:
4530 case REQ_RANGE_LOCAL:
4531 case REQ_RANGE_COUNT:
4532 /* Not supported. */
4533 return FALSE;
4534 }
4535 break;
4536
4537 case TREL_COUNT:
4538 /* Invalid. */
4539 return FALSE;
4540 }
4541 return TRUE;
4542}
4543
4544/*************************************************************/
4555bool req_text_insert(char *buf, size_t bufsz, struct player *pplayer,
4556 const struct requirement *preq,
4557 enum rt_verbosity verb, const char *prefix)
4558{
4559 if (preq->quiet && verb != VERB_ACTUAL) {
4560 return FALSE;
4561 }
4562
4563 switch (preq->source.kind) {
4564 case VUT_NONE:
4565 return FALSE;
4566
4567 case VUT_COUNTER:
4568 return req_text_counter(buf, bufsz, pplayer, preq, prefix);
4569
4570 case VUT_ADVANCE:
4571 return req_text_advance(buf, bufsz, pplayer, preq, prefix);
4572
4573 case VUT_TECHFLAG:
4574 return req_text_techflag(buf, bufsz, pplayer, preq, prefix);
4575
4576 case VUT_GOVERNMENT:
4577 return req_text_government(buf, bufsz, pplayer, preq, prefix);
4578
4579 case VUT_GOVFLAG:
4580 return req_text_government_flag(buf, bufsz, pplayer, preq, prefix);
4581
4582 case VUT_ACHIEVEMENT:
4583 return req_text_achievement(buf, bufsz, pplayer, preq, prefix);
4584
4585 case VUT_ACTION:
4586 return req_text_action(buf, bufsz, pplayer, preq, prefix);
4587
4588 case VUT_IMPR_GENUS:
4589 return req_text_impr_genus(buf, bufsz, pplayer, preq, prefix);
4590
4591 case VUT_IMPR_FLAG:
4592 return req_text_impr_flag(buf, bufsz, pplayer, preq, prefix);
4593
4594 case VUT_PLAYER_FLAG:
4595 return req_text_player_flag(buf, bufsz, pplayer, preq, prefix);
4596
4597 case VUT_PLAYER_STATE:
4598 return req_text_player_state(buf, bufsz, pplayer, preq, prefix);
4599
4600 case VUT_IMPROVEMENT:
4601 case VUT_SITE:
4602 return req_text_improvement(buf, bufsz, pplayer, preq, prefix);
4603
4604 case VUT_EXTRA:
4605 return req_text_extra(buf, bufsz, pplayer, preq, prefix);
4606
4607 case VUT_TILEDEF:
4608 return req_text_tiledef(buf, bufsz, pplayer, preq, prefix);
4609
4611 return req_text_tiledef_conn(buf, bufsz, pplayer, preq, prefix);
4612
4613 case VUT_GOOD:
4614 return req_text_good(buf, bufsz, pplayer, preq, prefix);
4615
4616 case VUT_TERRAIN:
4617 return req_text_terrain(buf, bufsz, pplayer, preq, prefix);
4618
4619 case VUT_NATION:
4620 return req_text_nation(buf, bufsz, pplayer, preq, prefix);
4621
4622 case VUT_NATIONGROUP:
4623 return req_text_nation_group(buf, bufsz, pplayer, preq, prefix);
4624
4625 case VUT_STYLE:
4626 return req_text_style(buf, bufsz, pplayer, preq, prefix);
4627
4628 case VUT_NATIONALITY:
4629 return req_text_nationality(buf, bufsz, pplayer, preq, prefix);
4630
4631 case VUT_ORIGINAL_OWNER:
4632 return req_text_original_owner(buf, bufsz, pplayer, preq, prefix);
4633
4634 case VUT_DIPLREL:
4635 return req_text_diplrel(buf, bufsz, pplayer, preq, prefix);
4636
4637 case VUT_DIPLREL_TILE:
4638 return req_text_diplrel_tile(buf, bufsz, pplayer, preq, prefix);
4639
4640 case VUT_DIPLREL_TILE_O:
4641 return req_text_diplrel_tile_o(buf, bufsz, pplayer, preq, prefix);
4642
4644 return req_text_diplrel_unit_any(buf, bufsz, pplayer, preq, prefix);
4645
4647 return req_text_diplrel_unit_any_o(buf, bufsz, pplayer, preq, prefix);
4648
4649 case VUT_UTYPE:
4650 return req_text_utype(buf, bufsz, pplayer, preq, prefix);
4651
4652 case VUT_UTFLAG:
4653 return req_text_unitflag(buf, bufsz, pplayer, preq, prefix);
4654
4655 case VUT_UCLASS:
4656 return req_text_uclass(buf, bufsz, pplayer, preq, prefix);
4657
4658 case VUT_UCFLAG:
4659 return req_text_ucflag(buf, bufsz, pplayer, preq, prefix);
4660
4661 case VUT_UNITSTATE:
4662 return req_text_unit_state(buf, bufsz, pplayer, preq, prefix);
4663
4664 case VUT_ACTIVITY:
4665 return req_text_activity(buf, bufsz, pplayer, preq, prefix);
4666
4667 case VUT_MINMOVES:
4668 return req_text_min_moves(buf, bufsz, pplayer, preq, prefix);
4669
4670 case VUT_MINVETERAN:
4671 return req_text_min_veteran(buf, bufsz, pplayer, preq, prefix);
4672
4673 case VUT_MINHP:
4674 return req_text_min_hp(buf, bufsz, pplayer, preq, prefix);
4675
4676 case VUT_OTYPE:
4677 return req_text_otype(buf, bufsz, pplayer, preq, prefix);
4678
4679 case VUT_SPECIALIST:
4680 return req_text_specialist(buf, bufsz, pplayer, preq, prefix);
4681
4682 case VUT_MINSIZE:
4683 return req_text_min_size(buf, bufsz, pplayer, preq, prefix);
4684
4685 case VUT_MINCULTURE:
4686 return req_text_min_culture(buf, bufsz, pplayer, preq, prefix);
4687
4688 case VUT_MINFOREIGNPCT:
4689 return req_text_min_foreign_pct(buf, bufsz, pplayer, preq, prefix);
4690
4692 return req_text_max_tile_total_units(buf, bufsz, pplayer, preq, prefix);
4693
4695 return req_text_max_tile_top_units(buf, bufsz, pplayer, preq, prefix);
4696
4697 case VUT_AI_LEVEL:
4698 return req_text_ai_level(buf, bufsz, pplayer, preq, prefix);
4699
4700 case VUT_TERRAINCLASS:
4701 return req_text_terrain_class(buf, bufsz, pplayer, preq, prefix);
4702
4703 case VUT_TERRFLAG:
4704 return req_text_terrain_flag(buf, bufsz, pplayer, preq, prefix);
4705
4706 case VUT_ROADFLAG:
4707 return req_text_road_flag(buf, bufsz, pplayer, preq, prefix);
4708
4709 case VUT_EXTRAFLAG:
4710 return req_text_extra_flag(buf, bufsz, pplayer, preq, prefix);
4711
4712 case VUT_MINYEAR:
4713 return req_text_min_year(buf, bufsz, pplayer, preq, prefix);
4714
4715 case VUT_MINCALFRAG:
4716 return req_text_min_cal_frag(buf, bufsz, pplayer, preq, prefix);
4717
4718 case VUT_TOPO:
4719 return req_text_topo_property(buf, bufsz, pplayer, preq, prefix);
4720
4721 case VUT_WRAP:
4722 return req_text_wrap_property(buf, bufsz, pplayer, preq, prefix);
4723
4724 case VUT_SERVERSETTING:
4725 return req_text_server_setting(buf, bufsz, pplayer, preq, prefix);
4726
4727 case VUT_AGE:
4728 return req_text_age(buf, bufsz, pplayer, preq, prefix);
4729
4730 case VUT_FORM_AGE:
4731 return req_text_form_age(buf, bufsz, pplayer, preq, prefix);
4732
4733 case VUT_MINTECHS:
4734 return req_text_min_techs(buf, bufsz, pplayer, preq, prefix);
4735
4736 case VUT_FUTURETECHS:
4737 return req_text_future_techs(buf, bufsz, pplayer, preq, prefix);
4738
4739 case VUT_MINCITIES:
4740 return req_text_min_cities(buf, bufsz, pplayer, preq, prefix);
4741
4742 case VUT_TERRAINALTER:
4743 return req_text_terrain_alter(buf, bufsz, pplayer, preq, prefix);
4744
4745 case VUT_CITYTILE:
4746 return req_text_city_tile(buf, bufsz, pplayer, preq, prefix);
4747
4748 case VUT_CITYSTATUS:
4749 return req_text_city_status(buf, bufsz, pplayer, preq, prefix);
4750
4751 case VUT_MINLATITUDE:
4752 return req_text_min_latitude(buf, bufsz, pplayer, preq, prefix);
4753
4754 case VUT_MAXLATITUDE:
4755 return req_text_max_latitude(buf, bufsz, pplayer, preq, prefix);
4756
4758 return req_text_distance_sq(buf, bufsz, pplayer, preq, prefix);
4759
4761 return req_text_max_region_tiles(buf, bufsz, pplayer, preq, prefix);
4762
4763 case VUT_TILE_REL:
4764 return req_text_tile_rel(buf, bufsz, pplayer, preq, prefix);
4765
4766 case VUT_COUNT:
4767 break;
4768 }
4769
4770 if (verb == VERB_DEFAULT) {
4771 char text[256];
4772
4773 log_error("%s requirement %s in range %d is not supported in reqtext.c.",
4774 preq->present ? "Present" : "Absent",
4775 universal_name_translation(&preq->source, text, sizeof(text)),
4776 preq->range);
4777 }
4778
4779 return FALSE;
4780}
4781
4782/*************************************************************/
4787bool req_text_insert_nl(char *buf, size_t bufsz, struct player *pplayer,
4788 const struct requirement *preq,
4789 enum rt_verbosity verb, const char *prefix)
4790{
4791 if (req_text_insert(buf, bufsz, pplayer, preq, verb, prefix)) {
4792 fc_strlcat(buf, "\n", bufsz);
4793
4794 return TRUE;
4795 }
4796
4797 return FALSE;
4798}
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:2878
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:2000
static bool req_text_nationality(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1580
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:1907
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:3329
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:1281
static bool req_text_min_latitude(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:4009
static bool req_text_specialist(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2511
static bool req_text_topo_property(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3506
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:2420
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:2740
static bool req_text_tiledef_conn(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1253
static bool req_text_distance_sq(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:4167
static bool req_text_wrap_property(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3534
static bool req_text_diplrel_tile(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1778
static bool req_text_uclass(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2133
static bool req_text_max_latitude(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:4088
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:4238
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:2229
static bool req_text_nation_group(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1469
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:2794
static bool req_text_original_owner(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1638
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:1865
static bool req_text_future_techs(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3684
static bool req_text_min_cities(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3735
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:3930
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:3610
static bool req_text_min_year(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3449
static bool req_text_min_moves(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2376
static bool req_text_style(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1550
static bool req_text_city_tile(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3817
static bool req_text_ai_level(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2962
static bool req_text_tile_rel(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:4339
static bool req_text_diplrel(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1678
static bool req_text_terrain_alter(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3775
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:2537
static bool req_text_terrain_class(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2990
static bool req_text_min_hp(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2452
static bool req_text_min_techs(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3633
static bool req_text_ucflag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2173
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:4787
static bool req_text_road_flag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3209
static bool req_text_terrain_flag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3104
static bool req_text_unitflag(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2082
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:3476
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:2336
static bool req_text_nation(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:1371
static bool req_text_otype(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2485
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:4555
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:2600
static bool req_text_utype(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:2042
static bool req_text_age(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3587
static bool req_text_server_setting(char *buf, size_t bufsz, struct player *pplayer, const struct requirement *preq, const char *prefix)
Definition reqtext.c:3562
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:95
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