Freeciv-3.4
Loading...
Searching...
No Matches
improvement.c
Go to the documentation of this file.
1/***********************************************************************
2 Freeciv - Copyright (C) 1996 - A Kjeldberg, L Gregersen, P Unold
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 "fcintl.h"
20#include "log.h"
21#include "mem.h"
22#include "shared.h" /* ARRAY_SIZE */
23#include "string_vector.h"
24#include "support.h"
25
26/* common */
27#include "game.h"
28#include "map.h"
29#include "tech.h"
30#include "victory.h"
31
32#include "improvement.h"
33
34/**************************************************************************
35All the city improvements:
36Use improvement_by_number(id) to access the array.
37The improvement_types array is now setup in:
38 server/ruleset.c (for the server)
39 client/packhand.c (for the client)
40**************************************************************************/
42
44
45/**********************************************************************/
49{
50 int i;
51
52 /* Can't use improvement_iterate() or improvement_by_number() here
53 * because num_impr_types isn't known yet. */
54 for (i = 0; i < ARRAY_SIZE(improvement_types); i++) {
55 struct impr_type *p = &improvement_types[i];
56
57 p->item_number = i;
61 p->ruledit_dlg = nullptr;
62 }
63}
64
65/**********************************************************************/
68static void improvement_free(struct impr_type *p)
69{
70 if (p->helptext != nullptr) {
72 p->helptext = nullptr;
73 }
74
77}
78
79/**********************************************************************/
88
89/**********************************************************************/
93{
94 improvement_iterate(pimprove) {
95 pimprove->allows_units = FALSE;
97 if (requirement_needs_improvement(pimprove, &putype->build_reqs)) {
98 pimprove->allows_units = TRUE;
99 break;
100 }
102
103 pimprove->allows_extras = FALSE;
104 extra_type_iterate(pextra) {
105 if (requirement_needs_improvement(pimprove, &pextra->reqs)) {
106 pimprove->allows_extras = TRUE;
107 break;
108 }
110
111 pimprove->prevents_disaster = FALSE;
113 if (!requirement_fulfilled_by_improvement(pimprove, &pdis->reqs)) {
114 pimprove->prevents_disaster = TRUE;
115 break;
116 }
118
119 pimprove->protects_vs_actions = FALSE;
122 &act->target_reqs)) {
123 pimprove->protects_vs_actions = TRUE;
124 break;
125 }
127
128 pimprove->allows_actions = FALSE;
130 if (requirement_needs_improvement(pimprove, &act->actor_reqs)) {
131 pimprove->allows_actions = TRUE;
132 break;
133 }
135
137}
138
139/**********************************************************************/
143{
144 if (game.control.num_impr_types > 0) {
145 return improvement_types;
146 }
147
148 return nullptr;
149}
150
151/**********************************************************************/
155{
156 if (game.control.num_impr_types > 0) {
158 }
159
160 return nullptr;
161}
162
163/**********************************************************************/
170
171/**********************************************************************/
178{
179 fc_assert_ret_val(pimprove != nullptr, -1);
180
181 return pimprove - improvement_types;
182}
183
184/**********************************************************************/
188{
189 fc_assert_ret_val(pimprove != nullptr, -1);
190
191 return pimprove->item_number;
192}
193
194/**********************************************************************/
199{
201 return nullptr;
202 }
203
204 return &improvement_types[id];
205}
206
207/**********************************************************************/
216const struct impr_type *valid_improvement(const struct impr_type *pimprove)
217{
218 if (pimprove == nullptr) {
219 return nullptr;
220 }
221
225 || building_has_effect(pimprove, EFT_SS_MODULE))) {
226 /* This assumes that space parts don't have any other effects. */
227 return nullptr;
228 }
229
230 return pimprove;
231}
232
233/**********************************************************************/
243
244/**********************************************************************/
248const char *improvement_name_translation(const struct impr_type *pimprove)
249{
250 return name_translation_get(&pimprove->name);
251}
252
253/**********************************************************************/
257const char *improvement_rule_name(const struct impr_type *pimprove)
258{
259 return rule_name_get(&pimprove->name);
260}
261
262/**********************************************************************/
266int impr_base_build_shield_cost(const struct impr_type *pimprove)
267{
268 int base = pimprove->build_cost;
269
270 return MAX(base * game.info.shieldbox / 100, 1);
271}
272
273/**********************************************************************/
278int impr_estimate_build_shield_cost(const struct player *pplayer,
279 const struct tile *ptile,
280 const struct impr_type *pimprove)
281{
282 int base = pimprove->build_cost
283 * (100 +
285 &(const struct req_context) {
286 .player = pplayer,
287 .building = pimprove,
288 .tile = ptile,
289 },
290 nullptr,
292
293 return MAX(base * game.info.shieldbox / 100, 1);
294}
295
296/**********************************************************************/
300 const struct impr_type *pimprove)
301{
302 int base = pimprove->build_cost
303 * (100 + get_building_bonus(pcity, pimprove, EFT_IMPR_BUILD_COST_PCT)) / 100;
304
305 return MAX(base * game.info.shieldbox / 100, 1);
306}
307
308/**********************************************************************/
311int impr_buy_gold_cost(const struct city *pcity,
312 const struct impr_type *pimprove, int shields_in_stock)
313{
314 int cost = 0;
315 const int missing = impr_build_shield_cost(pcity, pimprove) - shields_in_stock;
316
317 if (is_convert_improvement(pimprove)) {
318 /* Can't buy coinage-like improvements. */
319 return 0;
320 }
321
322 if (missing > 0) {
323 cost = 2 * missing;
324 }
325
326 if (shields_in_stock == 0) {
327 cost *= 2;
328 }
329
330 cost = cost
331 * (100 + get_building_bonus(pcity, pimprove, EFT_IMPR_BUY_COST_PCT)) / 100;
332
333 return cost;
334}
335
336/**********************************************************************/
339int impr_sell_gold(const struct impr_type *pimprove)
340{
341 return MAX(pimprove->build_cost * game.info.shieldbox / 100, 1);
342}
343
344/**********************************************************************/
348bool is_wonder(const struct impr_type *pimprove)
349{
350 return (is_great_wonder(pimprove) || is_small_wonder(pimprove));
351}
352
353/**********************************************************************/
358{
359 improvement_iterate(pimprove) {
360 if (0 == strcmp(improvement_name_translation(pimprove), name)) {
361 return pimprove;
362 }
364
365 return nullptr;
366}
367
368/**********************************************************************/
373{
374 const char *qname = Qn_(name);
375
376 improvement_iterate(pimprove) {
377 if (0 == fc_strcasecmp(improvement_rule_name(pimprove), qname)) {
378 return pimprove;
379 }
381
382 return nullptr;
383}
384
385/**********************************************************************/
388bool improvement_has_flag(const struct impr_type *pimprove,
389 enum impr_flag_id flag)
390{
392
393 return BV_ISSET(pimprove->flags, flag);
394}
395
396/**********************************************************************/
399bool is_improvement_visible(const struct impr_type *pimprove)
400{
401 return (is_wonder(pimprove)
403}
404
405/**********************************************************************/
409bool can_improvement_go_obsolete(const struct impr_type *pimprove)
410{
411 return requirement_vector_size(&pimprove->obsolete_by) > 0;
412}
413
414/**********************************************************************/
417bool improvement_obsolete(const struct player *pplayer,
418 const struct impr_type *pimprove,
419 const struct city *pcity)
420{
421 const struct req_context context = {
422 .player = pplayer,
423 .city = pcity,
424 .tile = pcity ? city_tile(pcity) : nullptr,
425 .building = pimprove,
426 };
427
429 if (is_req_active(&context, nullptr, preq, RPT_CERTAIN)) {
430 return TRUE;
431 }
433
434 return FALSE;
435}
436
437/**********************************************************************/
440static bool impr_provides_buildable_units(const struct city *pcity,
441 const struct impr_type *pimprove)
442{
443 const struct civ_map *nmap = &(wld.map);
444
445 /* Fast check */
446 if (!pimprove->allows_units) {
447 return FALSE;
448 }
449
451 if (requirement_needs_improvement(pimprove, &ut->build_reqs)
453 return TRUE;
454 }
456
457 return FALSE;
458}
459
460/**********************************************************************/
463static bool impr_provides_buildable_extras(const struct city *pcity,
464 const struct impr_type *pimprove)
465{
466 const struct civ_map *nmap = &(wld.map);
467
468 /* Fast check */
469 if (!pimprove->allows_extras) {
470 return FALSE;
471 }
472
473 extra_type_iterate(pextra) {
474 if (requirement_needs_improvement(pimprove, &pextra->reqs)) {
476 city_tile(pcity), ptile) {
477 if (player_can_build_extra(pextra, city_owner(pcity), ptile)) {
478 return TRUE;
479 }
481 }
483
484 return FALSE;
485}
486
487/**********************************************************************/
490static bool impr_prevents_disaster(const struct city *pcity,
491 const struct impr_type *pimprove)
492{
493 /* Fast check */
494 if (!pimprove->prevents_disaster) {
495 return FALSE;
496 }
497
501 return TRUE;
502 }
504
505 return FALSE;
506}
507
508/**********************************************************************/
514static bool impr_protects_vs_actions(const struct city *pcity,
515 const struct impr_type *pimprove)
516{
517 /* Fast check */
518 if (!pimprove->protects_vs_actions) {
519 return FALSE;
520 }
521
523 if (!requirement_fulfilled_by_improvement(pimprove, &enabler->target_reqs)
525 nullptr, pcity)) {
526 return TRUE;
527 }
529
530 return FALSE;
531}
532
533/**********************************************************************/
536static bool impr_allows_actions(const struct city *pcity,
537 const struct impr_type *pimprove)
538{
539 const struct civ_map *nmap = &(wld.map);
540
541 /* Fast check */
542 if (!pimprove->allows_actions) {
543 return FALSE;
544 }
545
547 if (requirement_needs_improvement(pimprove, &enabler->actor_reqs)) {
549
550 switch (action_id_get_actor_kind(act)) {
551 case AAK_UNIT:
553 if (!utype_can_do_action(ut, act)) {
554 /* Not relevant */
555 continue;
556 }
557
559 /* The player has a unit that may use the building */
560 return TRUE;
561 }
562
564 /* This city can build a unit that uses the building */
565 return TRUE;
566 }
568 break;
569 case AAK_CITY:
570 case AAK_PLAYER:
571 /* No traceable limitations */
572 return TRUE;
573 case AAK_COUNT:
575 break;
576 }
577 }
579
580 return FALSE;
581}
582
583/**********************************************************************/
593static bool improvement_has_side_effects(const struct city *pcity,
594 const struct impr_type *pimprove)
595{
596 return (impr_provides_buildable_units(pcity, pimprove)
598 || impr_prevents_disaster(pcity, pimprove)
599 || impr_allows_actions(pcity, pimprove)
600 || impr_protects_vs_actions(pcity, pimprove));
601}
602
603/**********************************************************************/
606static bool improvement_has_effects(const struct city *pcity,
607 const struct impr_type *pimprove)
608{
609 struct universal source = { .kind = VUT_IMPROVEMENT,
610 .value = { .building = pimprove } };
612
613 if (!plist || improvement_obsolete(city_owner(pcity), pimprove, pcity)) {
614 return FALSE;
615 }
616
618 if (0 != get_potential_improvement_bonus(pimprove, pcity,
619 peffect->type, RPT_CERTAIN, TRUE)) {
620 return TRUE;
621 }
623
624 return FALSE;
625}
626
627/**********************************************************************/
635 const struct impr_type *pimprove)
636{
637 return (!improvement_obsolete(city_owner(pcity), pimprove, pcity)
638 && (improvement_has_flag(pimprove, IF_GOLD)
639 || improvement_has_flag(pimprove, IF_INFRA)
641 || improvement_has_effects(pcity, pimprove)));
642}
643
644/**********************************************************************/
657 const struct impr_type *pimprove)
658{
659 /* A capitalization production is never redundant. */
660 if (improvement_has_flag(pimprove, IF_GOLD)) {
661 return FALSE;
662 }
663 if (improvement_has_flag(pimprove, IF_INFRA)) {
664 return FALSE;
665 }
666
667 /* If an improvement has side effects, don't claim it's redundant. */
668 if (improvement_has_side_effects(pcity, pimprove)) {
669 return FALSE;
670 }
671
672 /* Otherwise, it's redundant if its effects are available by other means,
673 * or if it's an obsolete wonder (great or small). */
674 return is_building_replaced(pcity, pimprove, RPT_CERTAIN)
676}
677
678/**********************************************************************/
683 const struct impr_type *pimprove)
684{
685 const struct req_context context = { .player = p };
686
687 bool space_part = FALSE;
688
689 if (!valid_improvement(pimprove)) {
690 return FALSE;
691 }
692
694 if (preq->range >= REQ_RANGE_PLAYER
695 && !is_req_active(&context, nullptr, preq, RPT_CERTAIN)) {
696 return FALSE;
697 }
699
700 /* Check for space part construction. This assumes that space parts have
701 * no other effects. */
702 if (building_has_effect(pimprove, EFT_SS_STRUCTURAL)) {
705 return FALSE;
706 }
707 }
708 if (building_has_effect(pimprove, EFT_SS_COMPONENT)) {
711 return FALSE;
712 }
713 }
714 if (building_has_effect(pimprove, EFT_SS_MODULE)) {
716 if (p->spaceship.modules >= NUM_SS_MODULES) {
717 return FALSE;
718 }
719 }
720 if (space_part
722 || p->spaceship.state >= SSHIP_LAUNCHED)) {
723 return FALSE;
724 }
725
726 if (is_great_wonder(pimprove)) {
727 /* Can't build wonder if already built */
728 if (!great_wonder_is_available(pimprove)) {
729 return FALSE;
730 }
731 }
732
733 return TRUE;
734}
735
736/**********************************************************************/
741 struct impr_type *pimprove)
742{
743 if (!can_player_build_improvement_direct(p, pimprove)) {
744 return FALSE;
745 }
746 if (improvement_obsolete(p, pimprove, nullptr)) {
747 return FALSE;
748 }
749
750 return TRUE;
751}
752
753/**********************************************************************/
759 const struct impr_type *pimprove)
760{
761 const struct req_context context = { .player = p };
762
763 if (!valid_improvement(pimprove)) {
764 return FALSE;
765 }
766 if (improvement_obsolete(p, pimprove, nullptr)) {
767 return FALSE;
768 }
769 if (is_great_wonder(pimprove) && !great_wonder_is_available(pimprove)) {
770 /* Can't build wonder if already built */
771 return FALSE;
772 }
773
774 /* Check for requirements that aren't met and that are unchanging (so
775 * they can never be met). */
777 if (preq->range >= REQ_RANGE_PLAYER
778 && is_req_preventing(&context, nullptr, preq, RPT_POSSIBLE)) {
779 return FALSE;
780 }
782 /* FIXME: should check some "unchanging" reqs here - like if there's
783 * a nation requirement, we can go ahead and check it now. */
784
785 return TRUE;
786}
787
788/**********************************************************************/
791bool is_great_wonder(const struct impr_type *pimprove)
792{
793 return (pimprove->genus == IG_GREAT_WONDER);
794}
795
796/**********************************************************************/
799bool is_small_wonder(const struct impr_type *pimprove)
800{
801 return (pimprove->genus == IG_SMALL_WONDER);
802}
803
804/**********************************************************************/
807bool is_improvement(const struct impr_type *pimprove)
808{
809 return (pimprove->genus == IG_IMPROVEMENT);
810}
811
812/**********************************************************************/
816bool is_special_improvement(const struct impr_type *pimprove)
817{
818 /* TODO: Find either a new term for traditional "special" improvements
819 * (maybe "project"?), or a new umbrella term for all improvements that
820 * can't be present in the city as a finished building (including special
821 * and convert improvements). */
822 return (pimprove->genus == IG_SPECIAL)
823 || is_convert_improvement(pimprove);
824}
825
826/**********************************************************************/
830bool is_convert_improvement(const struct impr_type *pimprove)
831{
832 return (pimprove->genus == IG_CONVERT);
833}
834
835/**********************************************************************/
838void wonder_built(const struct city *pcity, const struct impr_type *pimprove)
839{
840 struct player *pplayer;
841 int windex = improvement_number(pimprove);
842
843 fc_assert_ret(pcity != nullptr);
844 fc_assert_ret(is_wonder(pimprove));
845
846 pplayer = city_owner(pcity);
847 pplayer->wonders[windex] = pcity->id;
848
849 if (is_great_wonder(pimprove)) {
851 }
852}
853
854/**********************************************************************/
858void wonder_destroyed(const struct city *pcity,
859 const struct impr_type *pimprove)
860{
861 struct player *pplayer;
862 int windex = improvement_number(pimprove);
863
864 fc_assert_ret(pcity != nullptr);
865 fc_assert_ret(is_wonder(pimprove));
866
867 pplayer = city_owner(pcity);
868 fc_assert_ret(pplayer->wonders[windex] == pcity->id);
869 pplayer->wonders[windex] = WONDER_LOST;
870
871 if (is_great_wonder(pimprove)) {
873 == player_number(pplayer));
875 }
876}
877
878/**********************************************************************/
882bool wonder_is_lost(const struct player *pplayer,
883 const struct impr_type *pimprove)
884{
885 fc_assert_ret_val(pplayer != nullptr, FALSE);
887
888 return pplayer->wonders[improvement_index(pimprove)] == WONDER_LOST;
889}
890
891/**********************************************************************/
895bool wonder_is_built(const struct player *pplayer,
896 const struct impr_type *pimprove)
897{
898 fc_assert_ret_val(pplayer != nullptr, FALSE);
900
901 return WONDER_BUILT(pplayer->wonders[improvement_index(pimprove)]);
902}
903
904/**********************************************************************/
910struct city *city_from_wonder(const struct player *pplayer,
911 const struct impr_type *pimprove)
912{
913 int idx = improvement_index(pimprove);
914 int city_id;
915
916 if (idx < 0) {
917 return nullptr;
918 }
919
920 city_id = pplayer->wonders[idx];
921
922 fc_assert_ret_val(pplayer != nullptr, nullptr);
923 fc_assert_ret_val(is_wonder(pimprove), nullptr);
924
925 if (!WONDER_BUILT(city_id)) {
926 return nullptr;
927 }
928
929#ifdef FREECIV_DEBUG
930 if (is_server()) {
931 /* On client side, this info is not always known. */
932 struct city *pcity = player_city_by_number(pplayer, city_id);
933
934 if (pcity == nullptr) {
935 log_error("Player %s (nb %d) has outdated wonder info for "
936 "%s (nb %d), it points to city nb %d.",
937 player_name(pplayer), player_number(pplayer),
938 improvement_rule_name(pimprove),
939 improvement_number(pimprove), city_id);
940 } else if (!city_has_building(pcity, pimprove)) {
941 log_error("Player %s (nb %d) has outdated wonder info for "
942 "%s (nb %d), the city %s (nb %d) doesn't have this wonder.",
943 player_name(pplayer), player_number(pplayer),
944 improvement_rule_name(pimprove),
946 return nullptr;
947 }
948
949 return pcity;
950 }
951#endif /* FREECIV_DEBUG */
952
953 return player_city_by_number(pplayer, city_id);
954}
955
956/**********************************************************************/
964 const struct player *pplayer,
965 const struct player *owner,
966 enum fc_tristate embassy)
967{
968 if (pplayer == owner) {
969 /* Can see all own wonders,
970 * even improvements if that matters. */
971 return TRUE;
972 }
973
974 if (is_great_wonder(wonder)) {
975 return TRUE;
976 }
977
978 if (is_small_wonder(wonder)) {
980 case WV_ALWAYS:
981 return TRUE;
982 case WV_NEVER:
983 return FALSE;
984 case WV_EMBASSY:
985 return embassy == TRI_YES
986 || (embassy == TRI_MAYBE && team_has_embassy(pplayer->team, owner));
987 }
988
990
991 return FALSE;
992 }
993
994 /* Now a wonder, but regular improvement */
995 return FALSE;
996}
997
998/**********************************************************************/
1001bool great_wonder_is_built(const struct impr_type *pimprove)
1002{
1004
1006 [improvement_index(pimprove)]);
1007}
1008
1009/**********************************************************************/
1012bool great_wonder_is_destroyed(const struct impr_type *pimprove)
1013{
1015
1016 return (WONDER_DESTROYED
1018}
1019
1020/**********************************************************************/
1023bool great_wonder_is_available(const struct impr_type *pimprove)
1024{
1026
1027 return (WONDER_NOT_OWNED
1029}
1030
1031/**********************************************************************/
1035struct city *city_from_great_wonder(const struct impr_type *pimprove)
1036{
1037 int player_id = game.info.great_wonder_owners[improvement_index(pimprove)];
1038
1039 fc_assert_ret_val(is_great_wonder(pimprove), nullptr);
1040
1041 if (WONDER_OWNED(player_id)) {
1042#ifdef FREECIV_DEBUG
1043 const struct player *pplayer = player_by_number(player_id);
1044 struct city *pcity = city_from_wonder(pplayer, pimprove);
1045
1046 if (is_server() && pcity == nullptr) {
1047 log_error("Game has outdated wonder info for %s (nb %d), "
1048 "the player %s (nb %d) doesn't have this wonder.",
1049 improvement_rule_name(pimprove),
1050 improvement_number(pimprove),
1051 player_name(pplayer), player_number(pplayer));
1052 }
1053
1054 return pcity;
1055#else
1056 return city_from_wonder(player_by_number(player_id), pimprove);
1057#endif /* FREECIV_DEBUG */
1058 } else {
1059 return nullptr;
1060 }
1061}
1062
1063/**********************************************************************/
1067struct player *great_wonder_owner(const struct impr_type *pimprove)
1068{
1069 int player_id = game.info.great_wonder_owners[improvement_index(pimprove)];
1070
1071 fc_assert_ret_val(is_great_wonder(pimprove), nullptr);
1072
1073 if (WONDER_OWNED(player_id)) {
1074 return player_by_number(player_id);
1075 } else {
1076 return nullptr;
1077 }
1078}
1079
1080/**********************************************************************/
1083bool small_wonder_is_built(const struct player *pplayer,
1084 const struct impr_type *pimprove)
1085{
1087
1088 return (pplayer != nullptr
1089 && wonder_is_built(pplayer, pimprove));
1090}
1091
1092/**********************************************************************/
1095struct city *city_from_small_wonder(const struct player *pplayer,
1096 const struct impr_type *pimprove)
1097{
1098 fc_assert_ret_val(is_small_wonder(pimprove), nullptr);
1099
1100 if (pplayer == nullptr) {
1101 return nullptr; /* Used in some places in the client. */
1102 } else {
1103 return city_from_wonder(pplayer, pimprove);
1104 }
1105}
1106
1107/**********************************************************************/
1110bool can_sell_building(const struct impr_type *pimprove)
1111{
1112 return (valid_improvement(pimprove)
1113 && is_building_sellable(pimprove));
1114}
1115
1116/**********************************************************************/
1120 const struct impr_type *pimprove)
1121{
1122 return (city_has_building(pcity, pimprove)
1123 && is_building_sellable(pimprove));
1124}
1125
1126/**********************************************************************/
1129bool is_building_sellable(const struct impr_type *pimprove)
1130{
1131 return is_improvement(pimprove);
1132}
1133
1134/**********************************************************************/
1140 struct city *pcity,
1141 const struct impr_type *pimprove)
1142{
1143 /* Check if player can sell anything from this city */
1144 if (pcity->owner != pplayer) {
1145 return TR_OTHER_FAILURE;
1146 }
1147
1148 if (pcity->did_sell) {
1149 return TR_ALREADY_SOLD;
1150 }
1151
1152 /* Check if particular building can be solt */
1153 if (pimprove != nullptr
1154 && !can_city_sell_building(pcity, pimprove)) {
1155 return TR_OTHER_FAILURE;
1156 }
1157
1158 return TR_SUCCESS;
1159}
1160
1161/**********************************************************************/
1165const struct impr_type *improvement_replacement(const struct impr_type *pimprove)
1166{
1168 if (pobs->source.kind == VUT_IMPROVEMENT && pobs->present) {
1169 return pobs->source.value.building;
1170 }
1172
1173 return nullptr;
1174}
1175
1176/************************************************************************/
1180{
1181 int i;
1182
1183 for (i = 0; i < MAX_NUM_USER_BUILDING_FLAGS; i++) {
1185 }
1186}
1187
1188/************************************************************************/
1192{
1193 int i;
1194
1195 for (i = 0; i < MAX_NUM_USER_BUILDING_FLAGS; i++) {
1197 }
1198}
1199
1200/************************************************************************/
1204 const char *helptxt)
1205{
1206 int bfid = id - IF_USER_FLAG_1;
1207
1209
1210 if (user_impr_flags[bfid].name != nullptr) {
1212 user_impr_flags[bfid].name = nullptr;
1213 }
1214
1215 if (name && name[0] != '\0') {
1217 }
1218
1219 if (user_impr_flags[bfid].helptxt != nullptr) {
1220 free(user_impr_flags[bfid].helptxt);
1221 user_impr_flags[bfid].helptxt = nullptr;
1222 }
1223
1224 if (helptxt && helptxt[0] != '\0') {
1226 }
1227}
1228
1229/************************************************************************/
1233{
1235 return nullptr;
1236 }
1237
1238 return user_impr_flags[flag - IF_USER_FLAG_1].name;
1239}
1240
1241/************************************************************************/
1245{
1247
1249}
bool is_action_possible_on_city(action_id act_id, const struct player *actor_player, const struct city *target_city)
Definition actions.c:5717
#define action_enablers_iterate_end
Definition actions.h:283
#define enabler_get_action_id(_enabler_)
Definition actions.h:187
#define action_id_get_actor_kind(act_id)
Definition actions.h:413
#define action_enablers_iterate(_enabler_)
Definition actions.h:277
#define BV_ISSET(bv, bit)
Definition bitvector.h:86
bool city_has_building(const struct city *pcity, const struct impr_type *pimprove)
Definition city.c:1240
const char * city_name_get(const struct city *pcity)
Definition city.c:1137
int city_map_radius_sq_get(const struct city *pcity)
Definition city.c:137
bool can_city_build_unit_now(const struct civ_map *nmap, const struct city *pcity, const struct unit_type *punittype)
Definition city.c:947
#define city_tile(_pcity_)
Definition city.h:564
#define city_owner(_pcity_)
Definition city.h:563
#define city_tile_iterate(_nmap, _radius_sq, _city_tile, _tile)
Definition city.h:228
#define city_tile_iterate_end
Definition city.h:236
char * incite_cost
Definition comments.c:77
static void base(QVariant data1, QVariant data2)
Definition dialogs.cpp:2966
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit int const struct action *paction struct unit struct city * pcity
Definition dialogs_g.h:78
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id struct unit struct unit int cost
Definition dialogs_g.h:74
bool can_disaster_happen(const struct disaster_type *pdis, const struct city *pcity)
Definition disaster.c:139
#define disaster_type_iterate(_p)
Definition disaster.h:82
#define disaster_type_iterate_end
Definition disaster.h:88
int int id
Definition editgui_g.h:28
bool is_building_replaced(const struct city *pcity, const struct impr_type *pimprove, const enum req_problem_type prob_type)
Definition effects.c:693
int get_potential_improvement_bonus(const struct impr_type *pimprove, const struct city *pcity, enum effect_type effect_type, const enum req_problem_type prob_type, bool consider_multipliers)
Definition effects.c:1202
int get_building_bonus(const struct city *pcity, const struct impr_type *building, enum effect_type effect_type)
Definition effects.c:1004
int get_target_bonus_effects(struct effect_list *plist, const struct req_context *context, const struct req_context *other_context, enum effect_type effect_type)
Definition effects.c:744
struct effect_list * get_req_source_effects(const struct universal *psource)
Definition effects.c:153
bool building_has_effect(const struct impr_type *pimprove, enum effect_type effect_type)
Definition effects.c:639
int get_player_bonus(const struct player *pplayer, enum effect_type effect_type)
Definition effects.c:824
#define effect_list_iterate_end
Definition effects.h:81
#define effect_list_iterate(effect_list, peffect)
Definition effects.h:79
bool player_can_build_extra(const struct extra_type *pextra, const struct player *pplayer, const struct tile *ptile)
Definition extras.c:468
#define extra_type_iterate(_p)
Definition extras.h:315
#define extra_type_iterate_end
Definition extras.h:321
static bool is_server(void)
#define MAX_NUM_USER_BUILDING_FLAGS
Definition fc_types.h:493
int Impr_type_id
Definition fc_types.h:237
@ RPT_CERTAIN
Definition fc_types.h:516
@ RPT_POSSIBLE
Definition fc_types.h:515
int action_id
Definition fc_types.h:250
test_result
Definition fc_types.h:940
@ TR_ALREADY_SOLD
Definition fc_types.h:943
@ TR_OTHER_FAILURE
Definition fc_types.h:942
@ TR_SUCCESS
Definition fc_types.h:941
#define IF_LAST_USER_FLAG
Definition fc_types.h:492
@ VC_SPACERACE
Definition fc_types.h:966
#define Qn_(String)
Definition fcintl.h:89
void user_flag_init(struct user_flag *flag)
Definition game.c:832
void user_flag_free(struct user_flag *flag)
Definition game.c:841
struct civ_game game
Definition game.c:62
struct world wld
Definition game.c:63
struct city * owner
Definition citydlg.c:226
static GtkWidget * source
Definition gotodlg.c:58
const struct impr_type * valid_improvement(const struct impr_type *pimprove)
struct impr_type * improvement_by_number(const Impr_type_id id)
bool can_sell_building(const struct impr_type *pimprove)
int impr_sell_gold(const struct impr_type *pimprove)
void improvements_init(void)
Definition improvement.c:48
bool is_building_sellable(const struct impr_type *pimprove)
const struct impr_type * improvement_array_last(void)
const struct impr_type * valid_improvement_by_number(const Impr_type_id id)
bool can_city_sell_building(const struct city *pcity, const struct impr_type *pimprove)
bool can_player_build_improvement_direct(const struct player *p, const struct impr_type *pimprove)
bool great_wonder_is_built(const struct impr_type *pimprove)
static bool improvement_has_side_effects(const struct city *pcity, const struct impr_type *pimprove)
enum test_result test_player_sell_building_now(struct player *pplayer, struct city *pcity, const struct impr_type *pimprove)
void user_impr_flags_init(void)
bool is_special_improvement(const struct impr_type *pimprove)
static bool impr_prevents_disaster(const struct city *pcity, const struct impr_type *pimprove)
bool is_improvement_redundant(const struct city *pcity, const struct impr_type *pimprove)
bool can_player_build_improvement_later(const struct player *p, const struct impr_type *pimprove)
void wonder_built(const struct city *pcity, const struct impr_type *pimprove)
bool great_wonder_is_destroyed(const struct impr_type *pimprove)
bool wonder_is_lost(const struct player *pplayer, const struct impr_type *pimprove)
bool can_player_build_improvement_now(const struct player *p, struct impr_type *pimprove)
bool is_improvement(const struct impr_type *pimprove)
static bool improvement_has_effects(const struct city *pcity, const struct impr_type *pimprove)
bool wonder_is_built(const struct player *pplayer, const struct impr_type *pimprove)
int impr_base_build_shield_cost(const struct impr_type *pimprove)
Impr_type_id improvement_number(const struct impr_type *pimprove)
static bool impr_provides_buildable_extras(const struct city *pcity, const struct impr_type *pimprove)
bool small_wonder_is_built(const struct player *pplayer, const struct impr_type *pimprove)
bool can_improvement_go_obsolete(const struct impr_type *pimprove)
const char * impr_flag_id_name_cb(enum impr_flag_id flag)
const char * improvement_rule_name(const struct impr_type *pimprove)
bool is_improvement_visible(const struct impr_type *pimprove)
struct city * city_from_wonder(const struct player *pplayer, const struct impr_type *pimprove)
Impr_type_id improvement_index(const struct impr_type *pimprove)
int impr_buy_gold_cost(const struct city *pcity, const struct impr_type *pimprove, int shields_in_stock)
int impr_build_shield_cost(const struct city *pcity, const struct impr_type *pimprove)
static void improvement_free(struct impr_type *p)
Definition improvement.c:68
bool is_wonder(const struct impr_type *pimprove)
static bool impr_protects_vs_actions(const struct city *pcity, const struct impr_type *pimprove)
bool is_great_wonder(const struct impr_type *pimprove)
bool improvement_obsolete(const struct player *pplayer, const struct impr_type *pimprove, const struct city *pcity)
static bool impr_allows_actions(const struct city *pcity, const struct impr_type *pimprove)
struct impr_type * improvement_by_translated_name(const char *name)
void improvement_feature_cache_init(void)
Definition improvement.c:92
bool improvement_has_flag(const struct impr_type *pimprove, enum impr_flag_id flag)
struct impr_type * improvement_by_rule_name(const char *name)
struct city * city_from_small_wonder(const struct player *pplayer, const struct impr_type *pimprove)
void wonder_destroyed(const struct city *pcity, const struct impr_type *pimprove)
void set_user_impr_flag_name(enum impr_flag_id id, const char *name, const char *helptxt)
bool is_convert_improvement(const struct impr_type *pimprove)
void impr_flags_free(void)
static struct impr_type improvement_types[B_LAST]
Definition improvement.c:41
bool wonder_visible_to_player(const struct impr_type *wonder, const struct player *pplayer, const struct player *owner, enum fc_tristate embassy)
const char * impr_flag_helptxt(enum impr_flag_id id)
const char * improvement_name_translation(const struct impr_type *pimprove)
struct city * city_from_great_wonder(const struct impr_type *pimprove)
Impr_type_id improvement_count(void)
static bool impr_provides_buildable_units(const struct city *pcity, const struct impr_type *pimprove)
bool is_small_wonder(const struct impr_type *pimprove)
struct impr_type * improvement_array_first(void)
int impr_estimate_build_shield_cost(const struct player *pplayer, const struct tile *ptile, const struct impr_type *pimprove)
const struct impr_type * improvement_replacement(const struct impr_type *pimprove)
struct player * great_wonder_owner(const struct impr_type *pimprove)
bool great_wonder_is_available(const struct impr_type *pimprove)
void improvements_free(void)
Definition improvement.c:82
bool is_improvement_productive(const struct city *pcity, const struct impr_type *pimprove)
static struct user_flag user_impr_flags[MAX_NUM_USER_BUILDING_FLAGS]
Definition improvement.c:43
#define WONDER_NOT_OWNED
#define WONDER_BUILT(city_id)
#define improvement_iterate_end
#define WONDER_DESTROYED
#define improvement_iterate(_p)
#define WONDER_LOST
#define B_LAST
Definition improvement.h:42
#define WONDER_OWNED(player_id)
const char * name
Definition inputfile.c:127
#define fc_assert_ret(condition)
Definition log.h:192
#define fc_assert(condition)
Definition log.h:177
#define fc_assert_ret_val(condition, val)
Definition log.h:195
#define log_error(message,...)
Definition log.h:104
#define FC_FREE(ptr)
Definition mem.h:41
#define fc_strdup(str)
Definition mem.h:43
static const char * rule_name_get(const struct name_translation *ptrans)
static const char * name_translation_get(const struct name_translation *ptrans)
struct player * player_by_number(const int player_id)
Definition player.c:837
int player_number(const struct player *pplayer)
Definition player.c:826
const char * player_name(const struct player *pplayer)
Definition player.c:885
bool team_has_embassy(const struct team *pteam, const struct player *tgt_player)
Definition player.c:225
struct city * player_city_by_number(const struct player *pplayer, int city_id)
Definition player.c:1191
bool is_req_active(const struct req_context *context, const struct req_context *other_context, const struct requirement *req, const enum req_problem_type prob_type)
enum req_unchanging_status is_req_preventing(const struct req_context *context, const struct req_context *other_context, const struct requirement *req, enum req_problem_type prob_type)
#define requirement_fulfilled_by_improvement(_imp_, _rqs_)
#define requirement_vector_iterate_end
#define requirement_vector_iterate(req_vec, preq)
#define requirement_needs_improvement(_imp_, _rqs_)
fc_tristate
Definition shared.h:46
@ TRI_YES
Definition shared.h:46
@ TRI_MAYBE
Definition shared.h:46
#define ARRAY_SIZE(x)
Definition shared.h:85
#define MAX(x, y)
Definition shared.h:54
#define NUM_SS_MODULES
Definition spaceship.h:89
#define NUM_SS_COMPONENTS
Definition spaceship.h:88
#define NUM_SS_STRUCTURALS
Definition spaceship.h:87
@ SSHIP_LAUNCHED
Definition spaceship.h:85
void strvec_destroy(struct strvec *psv)
Definition city.h:318
struct packet_ruleset_control control
Definition game.h:83
struct packet_game_info info
Definition game.h:89
bool allows_actions
Definition improvement.h:75
int build_cost
Definition improvement.h:60
enum impr_genus_id genus
Definition improvement.h:63
bool ruledit_disabled
Definition improvement.h:53
bool protects_vs_actions
Definition improvement.h:74
struct requirement_vector obsolete_by
Definition improvement.h:59
Impr_type_id item_number
Definition improvement.h:51
bool prevents_disaster
Definition improvement.h:73
struct requirement_vector reqs
Definition improvement.h:58
bool allows_extras
Definition improvement.h:72
struct strvec * helptext
Definition improvement.h:65
bool allows_units
Definition improvement.h:71
struct name_translation name
Definition improvement.h:52
bv_impr_flags flags
Definition improvement.h:64
void * ruledit_dlg
Definition improvement.h:54
int great_wonder_owners[B_LAST]
enum wonder_visib_type small_wonder_visibility
enum spaceship_state state
Definition spaceship.h:108
int wonders[B_LAST]
Definition player.h:305
struct team * team
Definition player.h:261
struct player_spaceship spaceship
Definition player.h:286
const struct player * player
Definition tile.h:50
int id
Definition unit.h:147
struct tile * tile
Definition unit.h:142
struct player * owner
Definition unit.h:145
enum universals_n kind
Definition fc_types.h:595
char * name
Definition game.h:74
char * helptxt
Definition game.h:75
struct civ_map map
int fc_strcasecmp(const char *str0, const char *str1)
Definition support.c:186
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
bool utype_player_already_has_this(const struct player *pplayer, const struct unit_type *putype)
Definition unittype.c:1967
bool utype_can_do_action(const struct unit_type *putype, const action_id act_id)
Definition unittype.c:396
#define unit_type_iterate(_p)
Definition unittype.h:863
#define unit_type_iterate_end
Definition unittype.h:870
bool victory_enabled(enum victory_condition_type victory)
Definition victory.c:26