Freeciv-3.4
Loading...
Searching...
No Matches
climisc.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/***********************************************************************
15 This module contains various general - mostly highlevel - functions
16 used throughout the client.
17***********************************************************************/
18
19#ifdef HAVE_CONFIG_H
20#include <fc_config.h>
21#endif
22
23#include <stdarg.h>
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27
28/* utility */
29#include "bitvector.h"
30#include "fcintl.h"
31#include "log.h"
32#include "support.h"
33
34/* common */
35#include "city.h"
36#include "diptreaty.h"
37#include "featured_text.h"
38#include "game.h"
39#include "government.h"
40#include "map.h"
41#include "mapimg.h"
42#include "packets.h"
43#include "research.h"
44#include "spaceship.h"
45#include "unitlist.h"
46
47/* client/include */
48#include "chatline_g.h"
49#include "citydlg_g.h"
50#include "cityrep_g.h"
51#include "dialogs_g.h"
52#include "gui_main_g.h"
53#include "mapview_g.h"
54
55/* client */
56#include "client_main.h"
57#include "climap.h"
58#include "climisc.h"
59#include "control.h"
60#include "mapctrl_common.h"
61#include "mapview_common.h"
62#include "messagewin_common.h"
63#include "options.h"
64#include "packhand.h"
65#include "repodlgs_common.h"
66#include "tilespec.h"
67
68
69/**********************************************************************/
73{
74 struct city *pcity;
75 struct tile *ptile = unit_tile(punit);
76 int hc = punit->homecity;
77 struct unit old_unit = *punit;
79 bool update;
80
81 log_debug("removing unit %d, %s %s (%d %d) hcity %d",
84
86
87 /* Check transport status. */
91 /* The server should take care that the unit is on the right terrain. */
94 }
95
98 punit = NULL;
99 if (old > 0 && get_num_units_in_focus() == 0) {
101 } else if (update) {
104 }
105
106 pcity = tile_city(ptile);
107 if (NULL != pcity) {
111 }
112
113 log_debug("map city %s, %s, (%d %d)",
116 }
117
120 if (NULL != pcity) {
122 log_debug("home city %s, %s, (%d %d)",
125 }
126 }
127
129}
130
131/**********************************************************************/
135{
136 bool effect_update;
137 struct tile *ptile = city_tile(pcity);
138 struct city old_city = *pcity;
139
140 log_debug("client_remove_city() %d, %s", pcity->id, city_name_get(pcity));
141
142 /* Explicitly remove all improvements, to properly remove any global effects
143 and to handle the preservation of "destroyed" effects. */
145
146 city_built_iterate(pcity, pimprove) {
150
151 if (effect_update) {
152 /* nothing yet */
153 }
154
159}
160
161/**********************************************************************/
165void client_change_all(struct universal *from, struct universal *to)
166{
168 return;
169 }
170
172 _("Changing production of every %s into %s."),
173 VUT_UTYPE == from->kind
176 VUT_UTYPE == to->kind
179
182 if (are_universals_equal(&pcity->production, from)
183 && can_city_build_now(&(wld.map), pcity, to)) {
185 }
187
189}
190
191/**********************************************************************/
194const char *get_embassy_status(const struct player *me,
195 const struct player *them)
196{
197 if (!me || !them
198 || me == them
199 || !them->is_alive
200 || !me->is_alive) {
201 return "-";
202 }
203 if (player_has_embassy(me, them)) {
204 if (player_has_embassy(them, me)) {
205 return Q_("?embassy:Both");
206 } else {
207 return Q_("?embassy:Yes");
208 }
209 } else if (player_has_embassy(them, me)) {
210 return Q_("?embassy:With Us");
211 } else if (player_diplstate_get(me, them)->contact_turns_left > 0
212 || player_diplstate_get(them, me)->contact_turns_left > 0) {
213 return Q_("?embassy:Contact");
214 } else {
215 return Q_("?embassy:No Contact");
216 }
217}
218
219/**********************************************************************/
222const char *get_vision_status(const struct player *me,
223 const struct player *them)
224{
225 if (me && them && gives_shared_vision(me, them)) {
227 return Q_("?vision:Both");
228 } else {
229 return Q_("?vision:To Them");
230 }
231 } else if (me && them && gives_shared_vision(them, me)) {
232 return Q_("?vision:To Us");
233 } else {
234 return "";
235 }
236}
237
238/**********************************************************************/
242 struct Clause *pclause)
243{
244 struct city *pcity;
245
246 switch (pclause->type) {
247 case CLAUSE_ADVANCE:
248 fc_snprintf(buf, bufsiz, _("The %s give %s"),
251 return;
252 case CLAUSE_CITY:
254 if (pcity) {
255 fc_snprintf(buf, bufsiz, _("The %s give %s"),
258 } else {
259 fc_snprintf(buf, bufsiz,_("The %s give an unknown city"),
261 }
262 return;
263 case CLAUSE_GOLD:
264 fc_snprintf(buf, bufsiz, PL_("The %s give %d gold",
265 "The %s give %d gold", pclause->value),
267 pclause->value);
268 return;
269 case CLAUSE_MAP:
270 fc_snprintf(buf, bufsiz, _("The %s give their worldmap"),
272 return;
273 case CLAUSE_SEAMAP:
274 fc_snprintf(buf, bufsiz, _("The %s give their seamap"),
276 return;
277 case CLAUSE_CEASEFIRE:
278 fc_snprintf(buf, bufsiz, _("The parties agree on a cease-fire"));
279 return;
280 case CLAUSE_PEACE:
281 fc_snprintf(buf, bufsiz, _("The parties agree on a peace"));
282 return;
283 case CLAUSE_ALLIANCE:
284 fc_snprintf(buf, bufsiz, _("The parties create an alliance"));
285 return;
286 case CLAUSE_VISION:
287 fc_snprintf(buf, bufsiz, _("The %s give shared vision"),
289 return;
290 case CLAUSE_EMBASSY:
291 fc_snprintf(buf, bufsiz, _("The %s give an embassy"),
293 return;
295 fc_snprintf(buf, bufsiz, _("The %s share tiles"),
297 return;
298 case CLAUSE_COUNT:
300 return;
301 }
302
304 if (bufsiz > 0) {
305 *buf = '\0';
306 }
307}
308
309/**********************************************************************/
314static void catastrophe_scaled(int *chance, int *rate, int max,
315 int current, int accum, int level)
316{
317 /* 20 from factor in update_environmental_upset() */
318 int numer = 20 * max;
319 int denom = map_num_tiles();
320
321 if (chance) {
322 *chance = CLIP(0,
323 (int)((((long)accum * numer) + (denom - 1)) / denom),
324 max);
325 }
326 if (rate) {
327 *rate = DIVIDE(((long)(current - level) * numer) + (denom - 1), denom);
328 }
329}
330
331/**********************************************************************/
334void global_warming_scaled(int *chance, int *rate, int max)
335{
336 return catastrophe_scaled(chance, rate, max,
339}
340
341/**********************************************************************/
344void nuclear_winter_scaled(int *chance, int *rate, int max)
345{
346 return catastrophe_scaled(chance, rate, max,
349}
350
351/**********************************************************************/
355{
357 const struct research *presearch = research_get(client_player());
358 int idx = 0;
359
360 if (A_UNSET != presearch->researching) {
361 idx = (NUM_TILES_PROGRESS * presearch->bulbs_researched
362 / (presearch->client.researching_cost + 1));
363 }
364
365 /* This clipping can be necessary since we can end up with excess
366 * research */
367 idx = CLIP(0, idx, NUM_TILES_PROGRESS - 1);
369 } else {
371 }
372}
373
374/**********************************************************************/
378{
379 int idx;
380
382 /* Highest sprite kicks in at about 25% risk */
384 idx = CLIP(0, idx, NUM_TILES_PROGRESS-1);
385 } else {
386 idx = 0;
387 }
389}
390
391/**********************************************************************/
395{
396 int idx;
397
399 /* Highest sprite kicks in at about 25% risk */
401 idx = CLIP(0, idx, NUM_TILES_PROGRESS-1);
402 } else {
403 idx = 0;
404 }
405
407}
408
409/**********************************************************************/
413{
415 && government_count() > 0) {
417
418 return get_government_sprite(tileset, gov);
419 } else {
420 /* HACK: the UNHAPPY citizen is used for the government
421 * when we don't know any better. */
423 }
424}
425
426/**********************************************************************/
431{
432 struct city *pcity;
433 struct unit *punit;
434 const struct civ_map *nmap = &(wld.map);
435
436 if (!can_client_change_view()) {
437 return;
438 }
439
441 if (get_num_units_in_focus() > 0) {
443 } else if (client_has_player()
445 /* Else focus on the capital. */
447 } else if (NULL != client.conn.playing
449 /* Just focus on any city. */
453 } else if (NULL != client.conn.playing
455 /* Just focus on any unit. */
459 } else {
462
463 /* Just any known tile will do; search near the middle first. */
464 /* Iterate outward from the center tile. We have to give a radius that
465 * is guaranteed to be larger than the map will be. Although this is
466 * a misuse of map.xsize and map.ysize (which are native dimensions),
467 * it should give a sufficiently large radius. */
469 if (client_tile_get_known(ptile) != TILE_UNKNOWN) {
470 ctile = ptile;
471 break;
472 }
474
476 }
477 can_slide = TRUE;
478}
479
480/**********************************************************************/
484{
485 return VUT_UTYPE == target.kind
486 ? B_LAST + utype_number(target.value.utype)
488}
489
490/**********************************************************************/
494{
495 struct universal target = {
496 .kind = VUT_UTYPE,
497 .value = {.utype = punittype}};
498
499 return cid_encode(target);
500}
501
502/**********************************************************************/
505cid cid_encode_building(const struct impr_type *pimprove)
506{
507 struct universal target = {
509 .value = {.building = pimprove}
510 };
511
512 return cid_encode(target);
513}
514
515/**********************************************************************/
519{
520 return cid_encode(pcity->production);
521}
522
523/**********************************************************************/
527{
528 struct universal target;
529
530 if (id >= B_LAST) {
531 target.kind = VUT_UTYPE;
532 target.value.utype = utype_by_number(id - B_LAST);
533 } else {
534 target.kind = VUT_IMPROVEMENT;
536 }
537
538 return target;
539}
540
541/**********************************************************************/
545bool city_unit_supported(const struct city *pcity,
546 const struct universal *target)
547{
548 if (VUT_UTYPE == target->kind) {
549 const struct unit_type *tvtype = target->value.utype;
550
551 unit_list_iterate(pcity->units_supported, punit) {
552 if (unit_type_get(punit) == tvtype) {
553 return TRUE;
554 }
556 }
557 return FALSE;
558}
559
560/**********************************************************************/
564bool city_unit_present(const struct city *pcity,
565 const struct universal *target)
566{
567 if (VUT_UTYPE == target->kind) {
568 const struct unit_type *tvtype = target->value.utype;
569
571 if (unit_type_get(punit) == tvtype) {
572 return TRUE;
573 }
574 }
576 }
577 return FALSE;
578}
579
580/**********************************************************************/
584 const struct universal *target)
585{
586 return VUT_IMPROVEMENT == target->kind
588}
589
590/**********************************************************************/
594 const struct universal *target)
595{
596 return can_city_build_now(&(wld.map), pcity, target);
597}
598
599/**********************************************************************/
602static int target_get_section(struct universal target)
603{
604 if (VUT_UTYPE == target.kind) {
606 return 2;
607 } else {
608 return 3;
609 }
610 } else {
612 return 1;
613 } else if (is_small_wonder(target.value.building)) {
614 return 4;
615 } else if (is_great_wonder(target.value.building)) {
616 return 5;
617 } else {
618 return 0;
619 }
620 }
621}
622
623/**********************************************************************/
626static int fc_cmp(const void *p1, const void *p2)
627{
628 const struct item *i1 = p1, *i2 = p2;
629 int s1 = target_get_section(i1->item);
630 int s2 = target_get_section(i2->item);
631
632 if (s1 == s2) {
633 return fc_strcasecmp(i1->descr, i2->descr);
634 }
635
636 return s1 - s2;
637}
638
639/**********************************************************************/
650void name_and_sort_items(struct universal *targets, int num_targets,
651 struct item *items,
652 bool show_cost, struct city *pcity)
653{
654 int i;
655
656 for (i = 0; i < num_targets; i++) {
657 struct universal target = targets[i];
658 int cost;
659 struct item *pitem = &items[i];
660 const char *name;
661
662 pitem->item = target;
663
664 if (VUT_UTYPE == target.kind) {
667 } else {
670 cost = -1;
671 } else {
672 if (pcity != NULL) {
674 } else {
675 cost = MAX(target.value.building->build_cost * game.info.shieldbox / 100, 1);
676 }
677 }
678 }
679
680 if (show_cost) {
681 if (cost < 0) {
682 fc_snprintf(pitem->descr, sizeof(pitem->descr), "%s (XX)", name);
683 } else {
684 fc_snprintf(pitem->descr, sizeof(pitem->descr),
685 "%s (%d)", name, cost);
686 }
687 } else {
688 (void) fc_strlcpy(pitem->descr, name, sizeof(pitem->descr));
689 }
690 }
691
692 qsort(items, num_targets, sizeof(struct item), fc_cmp);
693}
694
695/**********************************************************************/
701 struct city **selected_cities,
703 bool append_wonders, bool change_prod,
705{
706 cid first = append_units ? B_LAST : 0;
707 cid last = (append_units
708 ? utype_count() + B_LAST
710 cid id;
711 int items_used = 0;
712
713 for (id = first; id < last; id++) {
714 bool append = FALSE;
715 struct universal target = cid_decode(id);
716
717 if (!append_units && (append_wonders != is_wonder(target.value.building))) {
718 continue;
719 }
720
721 if (!change_prod) {
722 if (client_has_player()) {
724 append |= test_func(pcity, &target);
726 } else {
728 append |= test_func(pcity, &target);
730 }
731 } else {
732 int i;
733
734 for (i = 0; i < num_selected_cities; i++) {
735 append |= test_func(selected_cities[i], &target);
736 }
737 }
738
739 if (!append) {
740 continue;
741 }
742
743 targets[items_used] = target;
744 items_used++;
745 }
746
747 return items_used;
748}
749
750/**********************************************************************/
757{
759 int cids_used = 0;
760 cid id;
761
762 if (NULL == client.conn.playing) {
763 return 0;
764 }
765
766 memset(mapping, 0, sizeof(mapping));
769 }
771
772 for (id = 0; id < ARRAY_SIZE(mapping); id++) {
773 if (mapping[id]) {
774 targets[cids_used] = cid_decode(id);
775 cids_used++;
776 }
777 }
778
779 return cids_used;
780}
781
782/**********************************************************************/
789{
790 int cids_used = 0;
791
792 if (NULL == client.conn.playing) {
793 return 0;
794 }
795
796 improvement_iterate(pimprove) {
798 RPT_CERTAIN)) {
799 targets[cids_used].kind = VUT_IMPROVEMENT;
800 targets[cids_used].value.building = pimprove;
801 cids_used++;
802 }
804
807 RPT_CERTAIN)) {
808 targets[cids_used].kind = VUT_UTYPE;
809 targets[cids_used].value.utype = punittype;
810 cids_used++;
811 }
813
814 return cids_used;
815}
816
817/**********************************************************************/
822 struct city *pcity,
823 bool advanced_tech)
824{
825 struct player *pplayer = client_player();
826 int cids_used = 0;
827 const struct civ_map *nmap = &(wld.map);
828
829 improvement_iterate(pimprove) {
830 bool can_build;
832
833 if (NULL != pcity) {
834 /* Can the city build? */
838 pimprove);
839 } else if (NULL != pplayer) {
840 /* Can our player build? */
844 pimprove);
845 } else {
846 /* Global observer case: can any player build? */
850 RPT_CERTAIN)) {
851 can_build = TRUE;
852 break;
853 }
855
860 break;
861 }
863 }
864
866 || (!advanced_tech && can_build)) {
867 targets[cids_used].kind = VUT_IMPROVEMENT;
868 targets[cids_used].value.building = pimprove;
869 cids_used++;
870 }
872
874 bool can_build;
876
877 if (NULL != pcity) {
878 /* Can the city build? */
881 } else if (NULL != pplayer) {
882 /* Can our player build? */
885 } else {
886 /* Global observer case: can any player build? */
890 can_build = TRUE;
891 break;
892 }
894
899 break;
900 }
902 }
903
905 || (!advanced_tech && can_build)) {
906 targets[cids_used].kind = VUT_UTYPE;
907 targets[cids_used].value.utype = punittype;
908 cids_used++;
909 }
911
912 return cids_used;
913}
914
915/**********************************************************************/
919 struct city *pcity)
920{
921 int cids_used = 0;
922
924
925 city_built_iterate(pcity, pimprove) {
926 targets[cids_used].kind = VUT_IMPROVEMENT;
927 targets[cids_used].value.building = pimprove;
928 cids_used++;
930
931 return cids_used;
932}
933
934/**********************************************************************/
939{
940 struct unit_list *plist;
941
943 /* Other players don't see inside the city (but observers do). */
944 plist = pcity->client.info_units_supported;
945 } else {
946 plist = pcity->units_supported;
947 }
948
949 return unit_list_size(plist);
950}
951
952/**********************************************************************/
957{
958 struct unit_list *plist;
959
961 /* Other players don't see inside the city (but observers do). */
962 plist = pcity->client.info_units_present;
963 } else {
964 plist = pcity->tile->units;
965 }
966
967 return unit_list_size(plist);
968}
969
970/**********************************************************************/
973void handle_event(const char *featured_text, struct tile *ptile,
974 enum event_type event, int turn, int phase, int conn_id)
975{
977 struct text_tag_list *tags;
978 int where = MW_OUTPUT; /* where to display the message */
979 bool fallback_needed = FALSE; /* we want fallback if actual 'where' is not
980 * usable */
981 bool shown = FALSE; /* Message displayed somewhere at least */
982
984 /* Server may have added a new event; leave as MW_OUTPUT */
985 log_verbose("Unknown event type %d!", event);
986 } else {
988 }
989
990 /* Get the original text. */
992 sizeof(plain_text), &tags, conn_id != -1);
993
994 /* Display link marks when an user is pointed us something. */
995 if (conn_id != -1) {
997 if (text_tag_type(ptag) == TTT_LINK) {
999 }
1001 }
1002
1003 /* Maybe highlight our player and user names if someone is talking
1004 * about us. */
1005 if (-1 != conn_id
1006 && client.conn.id != conn_id
1008 const char *username = client.conn.username;
1009 size_t userlen = strlen(username);
1010 const char *playername = ((client_player() && !client_is_observer())
1012 size_t playerlen = playername ? strlen(playername) : 0;
1013 const char *p;
1014
1015 if (playername && playername[0] == '\0') {
1016 playername = NULL;
1017 }
1018
1019 if (username && username[0] == '\0') {
1020 username = NULL;
1021 }
1022
1023 for (p = plain_text; *p != '\0'; p++) {
1024 if (NULL != username
1025 && 0 == fc_strncasecmp(p, username, userlen)) {
1027 p - plain_text + userlen,
1029
1030 fc_assert(ptag != NULL);
1031
1032 if (ptag != NULL) {
1033 /* Appends to be sure it will be applied at last. */
1035 }
1036 } else if (NULL != playername
1037 && 0 == fc_strncasecmp(p, playername, playerlen)) {
1039 p - plain_text + playerlen,
1041
1042 fc_assert(ptag != NULL);
1043
1044 if (ptag != NULL) {
1045 /* Appends to be sure it will be applied at last. */
1047 }
1048 }
1049 }
1050 }
1051
1052 /* Popup */
1053 if (BOOL_VAL(where & MW_POPUP)) {
1054 /* Popups are usually not shown if player is under AI control.
1055 * Server operator messages are shown always. */
1056 if (NULL == client.conn.playing
1058 || event == E_MESSAGE_WALL) {
1059 popup_notify_goto_dialog(_("Popup Request"), plain_text, tags, ptile);
1060 shown = TRUE;
1061 } else {
1062 /* Force to chatline so it will be visible somewhere at least.
1063 * Messages window may still handle this so chatline is not needed
1064 * after all. */
1066 }
1067 }
1068
1069 /* Message window */
1070 if (BOOL_VAL(where & MW_MESSAGES)) {
1071 /* When the game isn't running, the messages dialog isn't present. */
1072 if (C_S_RUNNING <= client_state()) {
1073 meswin_add(plain_text, tags, ptile, event, turn, phase);
1074 shown = TRUE;
1075 } else {
1076 /* Force to chatline instead. */
1078 }
1079 }
1080
1081 /* Chatline */
1082 if (BOOL_VAL(where & MW_OUTPUT) || (fallback_needed && !shown)) {
1083 output_window_event(plain_text, tags, conn_id);
1084 }
1085
1086 if (turn == game.info.turn) {
1088 }
1089
1090 /* Free tags */
1092}
1093
1094/**********************************************************************/
1098void create_event(struct tile *ptile, enum event_type event,
1099 const struct ft_color color, const char *format, ...)
1100{
1101 va_list ap;
1102 char message[MAX_LEN_MSG];
1103
1104 va_start(ap, format);
1105 fc_vsnprintf(message, sizeof(message), format, ap);
1106 va_end(ap);
1107
1110
1114 } else {
1116 }
1117}
1118
1119/**********************************************************************/
1124struct city *get_nearest_city(const struct unit *punit, int *sq_dist)
1125{
1126 struct city *pcity_near;
1127 int pcity_near_dist;
1128
1129 if ((pcity_near = tile_city(unit_tile(punit)))) {
1130 pcity_near_dist = 0;
1131 } else {
1132 pcity_near = NULL;
1133 pcity_near_dist = -1;
1134 players_iterate(pplayer) {
1135 city_list_iterate(pplayer->cities, pcity_current) {
1136 int dist = sq_map_distance(pcity_current->tile, unit_tile(punit));
1137
1138 if (pcity_near_dist == -1 || dist < pcity_near_dist
1139 || (dist == pcity_near_dist
1142 pcity_near_dist = dist;
1143 }
1146 }
1147
1148 if (sq_dist) {
1150 }
1151
1152 return pcity_near;
1153}
1154
1155/**********************************************************************/
1161{
1162 int value;
1163
1166 _("You can't buy %s in %s!"),
1167 improvement_name_translation(pcity->production.value.building),
1168 city_link(pcity));
1169 return;
1170 }
1171 value = pcity->client.buy_cost;
1172
1173 if (city_owner(pcity)->economic.gold >= value) {
1175 } else {
1176 /* Split into two to allow localization of two pluralisations. */
1177 char buf[MAX_LEN_MSG];
1178
1179 /* TRANS: %s is a production type; this whole string is a sentence
1180 * fragment that is only ever included in one other string
1181 * (search comments for this string to find it) */
1182 fc_snprintf(buf, ARRAY_SIZE(buf), PL_("%s costs %d gold",
1183 "%s costs %d gold", value),
1185 value);
1187 /* TRANS: %s is a pre-pluralised sentence fragment:
1188 * "%s costs %d gold" */
1189 PL_("%s and you only have %d gold.",
1190 "%s and you only have %d gold.",
1191 city_owner(pcity)->economic.gold),
1192 buf, city_owner(pcity)->economic.gold);
1193 }
1194}
1195
1196/**********************************************************************/
1200{
1201 int lux_end, sci_end, tax, lux, sci;
1202 int delta = 10;
1203
1204 if (!can_client_issue_orders()) {
1205 return;
1206 }
1207
1210
1214
1215 idx *= 10;
1216
1217 if (reverse) {
1218 if (idx < lux_end) {
1219 lux -= delta;
1220 tax += delta;
1221 } else if (idx < sci_end) {
1222 sci -= delta;
1223 lux += delta;
1224 } else {
1225 tax -= delta;
1226 sci += delta;
1227 }
1228 } else {
1229 if (idx < lux_end) {
1230 lux -= delta;
1231 sci += delta;
1232 } else if (idx < sci_end) {
1233 sci -= delta;
1234 tax += delta;
1235 } else {
1236 tax -= delta;
1237 lux += delta;
1238 }
1239 }
1240
1242}
1243
1244/**********************************************************************/
1247bool can_units_do_connect(struct unit_list *punits,
1248 enum unit_activity activity,
1249 struct extra_type *tgt)
1250{
1252 if (can_unit_do_connect(punit, activity, tgt)) {
1253 return TRUE;
1254 }
1256
1257 return FALSE;
1258}
1259
1260/**********************************************************************/
1265{
1266 /* A double init would cause a leak. */
1268
1271}
1272
1273/**********************************************************************/
1281{
1283
1284 if (pclass->hp_loss_pct > 0) {
1285 return UNIT_BG_HP_LOSS;
1286 }
1287
1288 if (pclass->move_type == UMT_LAND) {
1289 return UNIT_BG_LAND;
1290 }
1291 if (pclass->move_type == UMT_SEA) {
1292 return UNIT_BG_SEA;
1293 }
1294
1295 fc_assert(pclass->move_type == UMT_BOTH);
1296
1298 /* Unit moves on both sea and land by speed determined by terrain */
1299 return UNIT_BG_AMPHIBIOUS;
1300 }
1301
1302 return UNIT_BG_FLYING;
1303}
1304
1305/**********************************************************************/
1308static int city_buy_cost_compare(const void *a, const void *b)
1309{
1310 const struct city *ca, *cb;
1311
1312 ca = *((const struct city **) a);
1313 cb = *((const struct city **) b);
1314
1315 return ca->client.buy_cost - cb->client.buy_cost;
1316}
1317
1318/**********************************************************************/
1323{
1324 const struct player *pplayer = client_player();
1325 struct connection *pconn;
1326
1327 if (!pplayer || !pplayer->cities
1328 || city_list_size(pplayer->cities) < 1) {
1329 return;
1330 }
1331
1332 int gold = pplayer->economic.gold;
1333 if (gold < 1) {
1334 return;
1335 }
1336
1337 const int n = city_list_size(pplayer->cities);
1338 struct city *cities[n];
1339 int i, count = 0;
1340
1341 city_list_iterate(pplayer->cities, pcity) {
1343 continue;
1344 }
1345 cities[count++] = pcity;
1347
1348 if (count < 1) {
1349 return;
1350 }
1351
1352 qsort(cities, count, sizeof(*cities), city_buy_cost_compare);
1353
1354 pconn = &client.conn;
1356
1357 for (i = 0; i < count && gold > 0; i++) {
1358 gold -= cities[i]->client.buy_cost;
1360 }
1361
1363}
1364
1365/**********************************************************************/
1368void unit_focus_set_status(struct player *pplayer)
1369{
1370 unit_list_iterate(pplayer->units, punit) {
1373}
1374
1375/**********************************************************************/
1378void client_player_init(struct player *pplayer)
1379{
1381 pplayer->client.tile_vision[v].vec = NULL;
1382 pplayer->client.tile_vision[v].bits = 0;
1384}
1385
1386/**********************************************************************/
1390{
1391 players_iterate(pplayer) {
1392 int new_size;
1393
1394 if (pplayer == client.conn.playing) {
1396 } else {
1397 /* We don't need (or have) information about players other
1398 * than user of the client. Allocate just one bit as that's
1399 * the minimum bitvector size (cannot allocate 0 bits)*/
1400 new_size = 1;
1401 }
1402
1404 dbv_resize(&pplayer->client.tile_vision[v], new_size);
1406
1407 dbv_resize(&pplayer->tile_known, new_size);
1409}
1410
1411/**********************************************************************/
1415{
1416 char str[MAX_LEN_MAPDEF];
1417 char mi_map[MAPIMG_LAYER_COUNT + 1];
1418 enum mapimg_layer layer;
1419 int map_pos = 0;
1420
1421 /* Only one definition allowed. */
1422 while (mapimg_count() != 0) {
1423 mapimg_delete(0);
1424 }
1425
1426 /* Map image definition: zoom, turns */
1427 fc_snprintf(str, sizeof(str), "zoom=%d:turns=0:format=%s",
1429
1430 /* Map image definition: show */
1432 cat_snprintf(str, sizeof(str), ":show=all");
1433 /* use all available knowledge */
1435 } else {
1436 cat_snprintf(str, sizeof(str), ":show=plrid:plrid=%d",
1438 /* use only player knowledge */
1440 }
1441
1442 /* Map image definition: map */
1443 for (layer = mapimg_layer_begin(); layer != mapimg_layer_end();
1444 layer = mapimg_layer_next(layer)) {
1445 if (gui_options.mapimg_layer[layer]) {
1446 mi_map[map_pos++] = mapimg_layer_name(layer)[0];
1447 }
1448 }
1449 mi_map[map_pos] = '\0';
1450
1451 if (map_pos == 0) {
1452 /* no value set - use dummy setting */
1453 sz_strlcpy(mi_map, "-");
1454 }
1455 cat_snprintf(str, sizeof(str), ":map=%s", mi_map);
1456
1457 log_debug("client map image definition: %s", str);
1458
1459 if (!mapimg_define(str, FALSE) || !mapimg_isvalid(0)) {
1460 /* An error in the definition string or an error validation the string.
1461 * The error message is available via mapimg_error(). */
1462 return FALSE;
1463 }
1464
1465 return TRUE;
1466}
1467
1468/**********************************************************************/
1471bool mapimg_client_createmap(const char *filename)
1472{
1473 struct mapdef *pmapdef;
1474 char mapimgfile[512];
1475
1476 if (NULL == filename || '\0' == filename[0]) {
1478 } else {
1479 sz_strlcpy(mapimgfile, filename);
1480 }
1481
1482 if (!mapimg_client_define()) {
1483 return FALSE;
1484 }
1485
1487 if (!pmapdef) {
1488 return FALSE;
1489 }
1490
1492}
1493
1494/**********************************************************************/
1498{
1499 struct option *poption = optset_option_by_name(server_optset, "nationset");
1500 const char *setting_str;
1501
1502 if (poption == NULL
1505 setting_str = "";
1506 }
1507
1509}
1510
1511/**********************************************************************/
1515{
1517}
1518
1519/**********************************************************************/
1524enum ai_level server_ai_level(void)
1525{
1526 enum ai_level lvl = game.info.skill_level;
1527
1528 players_iterate(pplayer) {
1529 if (is_ai(pplayer) && pplayer->ai_common.skill_level != lvl) {
1530 return ai_level_invalid();
1531 }
1533
1534 if (!is_settable_ai_level(lvl)) {
1535 return ai_level_invalid();
1536 }
1537
1538 return lvl;
1539}
#define NUM_ACTIONS
Definition actions.h:63
#define str
Definition astring.c:76
#define n
Definition astring.c:77
void dbv_resize(struct dbv *pdbv, int bits)
Definition bitvector.c:71
void output_window_event(const char *plain_text, const struct text_tag_list *tags, int conn_id)
const char * city_improvement_name_translation(const struct city *pcity, const struct impr_type *pimprove)
Definition city.c:666
bool city_has_building(const struct city *pcity, const struct impr_type *pimprove)
Definition city.c:1294
const char * city_name_get(const struct city *pcity)
Definition city.c:1155
void city_remove_improvement(struct city *pcity, const struct impr_type *pimprove)
Definition city.c:3467
bool can_city_build_improvement_now(const struct city *pcity, const struct impr_type *pimprove, const enum req_problem_type prob_type)
Definition city.c:860
bool can_city_build_unit_now(const struct civ_map *nmap, const struct city *pcity, const struct unit_type *punittype, const enum req_problem_type prob_type)
Definition city.c:957
bool can_city_build_now(const struct civ_map *nmap, const struct city *pcity, const struct universal *target)
Definition city.c:1027
bool city_production_is_genus(const struct city *pcity, enum impr_genus_id genus)
Definition city.c:720
bool can_city_build_improvement_later(const struct city *pcity, const struct impr_type *pimprove)
Definition city.c:879
bool can_city_build_unit_later(const struct civ_map *nmap, const struct city *pcity, const struct unit_type *punittype)
Definition city.c:982
const char * city_production_name_translation(const struct city *pcity)
Definition city.c:703
#define cities_iterate_end
Definition city.h:517
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define city_tile(_pcity_)
Definition city.h:565
#define cities_iterate(pcity)
Definition city.h:512
@ CITIZEN_UNHAPPY
Definition city.h:268
#define city_owner(_pcity_)
Definition city.h:564
#define city_list_iterate_end
Definition city.h:510
#define city_built_iterate(_pcity, _p)
Definition city.h:840
#define city_built_iterate_end
Definition city.h:846
int city_buy_production(struct city *pcity)
int city_change_production(struct city *pcity, struct universal *target)
bool city_can_buy(const struct city *pcity)
void refresh_city_dialog(struct city *pcity)
void city_report_dialog_update(void)
bool client_is_global_observer(void)
bool client_is_observer(void)
struct civclient client
enum client_states client_state(void)
bool can_client_issue_orders(void)
bool client_has_player(void)
bool can_client_change_view(void)
#define client_player()
@ C_S_RUNNING
Definition client_main.h:47
enum known_type client_tile_get_known(const struct tile *ptile)
Definition climap.c:36
static int target_get_section(struct universal target)
Definition climisc.c:602
int collect_eventually_buildable_targets(struct universal *targets, struct city *pcity, bool advanced_tech)
Definition climisc.c:821
bool city_unit_supported(const struct city *pcity, const struct universal *target)
Definition climisc.c:545
enum ai_level server_ai_level(void)
Definition climisc.c:1524
void client_change_all(struct universal *from, struct universal *to)
Definition climisc.c:165
cid cid_encode_building(const struct impr_type *pimprove)
Definition climisc.c:505
void create_event(struct tile *ptile, enum event_type event, const struct ft_color color, const char *format,...)
Definition climisc.c:1098
int collect_buildable_targets(struct universal *targets)
Definition climisc.c:788
void client_player_init(struct player *pplayer)
Definition climisc.c:1378
bool mapimg_client_createmap(const char *filename)
Definition climisc.c:1471
void client_remove_city(struct city *pcity)
Definition climisc.c:134
void client_unit_init_act_prob_cache(struct unit *punit)
Definition climisc.c:1264
void nuclear_winter_scaled(int *chance, int *rate, int max)
Definition climisc.c:344
const char * get_embassy_status(const struct player *me, const struct player *them)
Definition climisc.c:194
void buy_production_in_selected_cities(void)
Definition climisc.c:1322
void common_taxrates_callback(int idx, bool reverse)
Definition climisc.c:1199
static int city_buy_cost_compare(const void *a, const void *b)
Definition climisc.c:1308
bool mapimg_client_define(void)
Definition climisc.c:1414
int collect_currently_building_targets(struct universal *targets)
Definition climisc.c:756
enum unit_bg_color_type unit_color_type(const struct unit_type *punittype)
Definition climisc.c:1280
struct sprite * client_warming_sprite(void)
Definition climisc.c:377
bool can_units_do_connect(struct unit_list *punits, enum unit_activity activity, struct extra_type *tgt)
Definition climisc.c:1247
void cityrep_buy(struct city *pcity)
Definition climisc.c:1160
void global_warming_scaled(int *chance, int *rate, int max)
Definition climisc.c:334
void client_player_maps_reset(void)
Definition climisc.c:1389
bool client_nation_is_in_current_set(const struct nation_type *pnation)
Definition climisc.c:1514
cid cid_encode_from_city(const struct city *pcity)
Definition climisc.c:518
void name_and_sort_items(struct universal *targets, int num_targets, struct item *items, bool show_cost, struct city *pcity)
Definition climisc.c:650
static int fc_cmp(const void *p1, const void *p2)
Definition climisc.c:626
struct sprite * client_cooling_sprite(void)
Definition climisc.c:394
struct sprite * client_research_sprite(void)
Definition climisc.c:354
int num_present_units_in_city(struct city *pcity)
Definition climisc.c:956
cid cid_encode(struct universal target)
Definition climisc.c:483
void client_remove_unit(struct unit *punit)
Definition climisc.c:72
bool city_building_present(const struct city *pcity, const struct universal *target)
Definition climisc.c:583
struct nation_set * client_current_nation_set(void)
Definition climisc.c:1497
int num_supported_units_in_city(struct city *pcity)
Definition climisc.c:938
int collect_already_built_targets(struct universal *targets, struct city *pcity)
Definition climisc.c:918
struct city * get_nearest_city(const struct unit *punit, int *sq_dist)
Definition climisc.c:1124
struct universal cid_decode(cid id)
Definition climisc.c:526
void unit_focus_set_status(struct player *pplayer)
Definition climisc.c:1368
void handle_event(const char *featured_text, struct tile *ptile, enum event_type event, int turn, int phase, int conn_id)
Definition climisc.c:973
void center_on_something(void)
Definition climisc.c:430
cid cid_encode_unit(const struct unit_type *punittype)
Definition climisc.c:493
void client_diplomacy_clause_string(char *buf, int bufsiz, struct Clause *pclause)
Definition climisc.c:241
const char * get_vision_status(const struct player *me, const struct player *them)
Definition climisc.c:222
bool can_city_build_now_client(const struct city *pcity, const struct universal *target)
Definition climisc.c:593
struct sprite * client_government_sprite(void)
Definition climisc.c:412
static void catastrophe_scaled(int *chance, int *rate, int max, int current, int accum, int level)
Definition climisc.c:314
bool city_unit_present(const struct city *pcity, const struct universal *target)
Definition climisc.c:564
int collect_production_targets(struct universal *targets, struct city **selected_cities, int num_selected_cities, bool append_units, bool append_wonders, bool change_prod, TestCityFunc test_func)
Definition climisc.c:700
#define MAX_NUM_PRODUCTION_TARGETS
Definition climisc.h:89
int cid
Definition climisc.h:31
bool(* TestCityFunc)(const struct city *, const struct universal *)
Definition climisc.h:87
unit_bg_color_type
Definition climisc.h:127
@ UNIT_BG_AMPHIBIOUS
Definition climisc.h:130
@ UNIT_BG_SEA
Definition climisc.h:129
@ UNIT_BG_FLYING
Definition climisc.h:131
@ UNIT_BG_LAND
Definition climisc.h:128
@ UNIT_BG_HP_LOSS
Definition climisc.h:127
char * incite_cost
Definition comments.c:77
#define MAX_LEN_MSG
Definition conn_types.h:37
void connection_do_buffer(struct connection *pc)
Definition connection.c:325
void connection_do_unbuffer(struct connection *pc)
Definition connection.c:337
struct unit * get_focus_unit_on_tile(const struct tile *ptile)
Definition control.c:396
struct unit_list * get_units_in_focus(void)
Definition control.c:177
bool can_unit_do_connect(struct unit *punit, enum unit_activity activity, struct extra_type *tgt)
Definition control.c:1427
void update_unit_pix_label(struct unit_list *punitlist)
Definition control.c:997
struct unit * head_of_units_in_focus(void)
Definition control.c:410
int get_num_units_in_focus(void)
Definition control.c:185
void unit_focus_advance(bool accept_current)
Definition control.c:700
void control_unit_killed(struct unit *punit)
Definition control.c:226
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 * punit
Definition dialogs_g.h:74
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
int int id
Definition editgui_g.h:28
enum event_type event
Definition events.c:81
@ RPT_CERTAIN
Definition fc_types.h:516
#define Q_(String)
Definition fcintl.h:70
#define PL_(String1, String2, n)
Definition fcintl.h:71
#define _(String)
Definition fcintl.h:67
size_t featured_text_apply_tag(const char *text_source, char *featured_text, size_t featured_text_len, enum text_tag_type tag_type, ft_offset_t start_offset, ft_offset_t stop_offset,...)
enum text_link_type text_tag_link_type(const struct text_tag *ptag)
size_t featured_text_to_plain_text(const char *featured_text, char *plain_text, size_t plain_text_len, struct text_tag_list **tags, bool replace_link_text)
const struct ft_color ftc_client
const char * city_link(const struct city *pcity)
int text_tag_link_id(const struct text_tag *ptag)
struct text_tag * text_tag_new(enum text_tag_type tag_type, ft_offset_t start_offset, ft_offset_t stop_offset,...)
#define text_tag_list_iterate_end
#define text_tag_list_iterate(tags, ptag)
#define FT_OFFSET_UNSET
static bool ft_color_requested(const struct ft_color color)
text_tag_type
@ TTT_LINK
@ TTT_COLOR
struct civ_game game
Definition game.c:62
struct world wld
Definition game.c:63
void game_remove_unit(struct world *gworld, struct unit *punit)
Definition game.c:123
void game_remove_city(struct world *gworld, struct city *pcity)
Definition game.c:184
struct city * game_city_by_number(int id)
Definition game.c:106
Government_type_id government_count(void)
Definition government.c:73
struct government * government_of_player(const struct player *pplayer)
Definition government.c:119
void popdown_city_dialog(struct city *pcity)
Definition citydlg.c:595
void popup_notify_goto_dialog(const char *headline, const char *lines, const struct text_tag_list *tags, struct tile *ptile)
Definition dialogs.c:196
void update_unit_info_label(struct unit_list *punits)
Definition mapview.c:275
struct impr_type * improvement_by_number(const Impr_type_id id)
bool can_player_build_improvement_later(const struct player *p, const struct impr_type *pimprove)
Impr_type_id improvement_number(const struct impr_type *pimprove)
int impr_build_shield_cost(const struct city *pcity, const struct impr_type *pimprove)
bool is_wonder(const struct impr_type *pimprove)
bool is_great_wonder(const struct impr_type *pimprove)
bool can_player_build_improvement_now(const struct player *p, struct impr_type *pimprove, const enum req_problem_type prob_type)
bool is_convert_improvement(const struct impr_type *pimprove)
const char * improvement_name_translation(const struct impr_type *pimprove)
Impr_type_id improvement_count(void)
bool is_small_wonder(const struct impr_type *pimprove)
#define improvement_iterate_end
#define improvement_iterate(_p)
#define B_LAST
Definition improvement.h:42
const char * name
Definition inputfile.c:127
#define fc_assert_ret(condition)
Definition log.h:192
#define log_verbose(message,...)
Definition log.h:110
#define fc_assert(condition)
Definition log.h:177
#define fc_assert_ret_val(condition, val)
Definition log.h:195
#define log_debug(message,...)
Definition log.h:116
int dsend_packet_player_rates(struct connection *pc, int tax, int luxury, int science)
int sq_map_distance(const struct tile *tile0, const struct tile *tile1)
Definition map.c:686
int map_num_tiles(void)
Definition map.c:1161
struct tile * native_pos_to_tile(const struct civ_map *nmap, int nat_x, int nat_y)
Definition map.c:458
#define iterate_outward(nmap, start_tile, max_dist, itr_tile)
Definition map.h:373
#define iterate_outward_end
Definition map.h:377
bool is_city_hilited(struct city *pcity)
struct mapdef * mapimg_isvalid(int id)
Definition mapimg.c:1124
bool mapimg_define(const char *maparg, bool check)
Definition mapimg.c:769
bool mapimg_delete(int id)
Definition mapimg.c:1205
int mapimg_count(void)
Definition mapimg.c:573
bool mapimg_create(struct mapdef *pmapdef, bool force, const char *savename, const char *path)
Definition mapimg.c:1333
#define MAX_LEN_MAPDEF
Definition mapimg.h:65
void refresh_city_mapcanvas(struct city *pcity, struct tile *ptile, bool full_refresh, bool write_to_screen)
void center_tile_mapcanvas(const struct tile *ptile)
void link_mark_add_new(enum text_link_type type, int id)
bool can_slide
void refresh_unit_mapcanvas(struct unit *punit, struct tile *ptile, bool full_refresh, bool write_to_screen)
#define fc_malloc(sz)
Definition mem.h:34
void meswin_add(const char *message, const struct text_tag_list *tags, struct tile *ptile, enum event_type event, int turn, int phase)
const char * nation_rule_name(const struct nation_type *pnation)
Definition nation.c:138
struct nation_type * nation_of_unit(const struct unit *punit)
Definition nation.c:461
struct nation_type * nation_of_city(const struct city *pcity)
Definition nation.c:453
bool nation_is_in_set(const struct nation_type *pnation, const struct nation_set *pset)
Definition nation.c:832
struct nation_set * nation_set_by_setting_value(const char *setting)
Definition nation.c:853
const char * nation_plural_for_player(const struct player *pplayer)
Definition nation.c:178
const struct option_set * server_optset
Definition options.c:4369
const char * option_str_get(const struct option *poption)
Definition options.c:944
enum option_type option_type(const struct option *poption)
Definition options.c:709
int messages_where[E_COUNT]
Definition options.c:5400
struct client_options gui_options
Definition options.c:71
struct option * optset_option_by_name(const struct option_set *poptset, const char *name)
Definition options.c:482
#define MW_POPUP
Definition options.h:631
#define MW_OUTPUT
Definition options.h:629
#define MW_MESSAGES
Definition options.h:630
void play_sound_for_event(enum event_type type)
Definition packhand.c:1534
struct city_list * cities
Definition packhand.c:120
bool is_settable_ai_level(enum ai_level level)
Definition player.c:1908
const char * player_name(const struct player *pplayer)
Definition player.c:885
struct city * player_primary_capital(const struct player *pplayer)
Definition player.c:1325
int player_index(const struct player *pplayer)
Definition player.c:818
struct player_diplstate * player_diplstate_get(const struct player *plr1, const struct player *plr2)
Definition player.c:325
bool can_player_see_units_in_city(const struct player *pplayer, const struct city *pcity)
Definition player.c:1124
bool can_player_see_city_internals(const struct player *pplayer, const struct city *pcity)
Definition player.c:1140
bool player_has_embassy(const struct player *pplayer, const struct player *pplayer2)
Definition player.c:213
bool gives_shared_vision(const struct player *me, const struct player *them)
Definition player.c:1477
#define players_iterate_end
Definition player.h:552
#define players_iterate(_pplayer)
Definition player.h:547
#define is_ai(plr)
Definition player.h:232
#define is_human(plr)
Definition player.h:231
bool are_universals_equal(const struct universal *psource1, const struct universal *psource2)
struct research * research_get(const struct player *pplayer)
Definition research.c:130
struct setting_list * level[OLEVELS_NUM]
Definition settings.c:190
#define CLIP(lower, current, upper)
Definition shared.h:57
#define DIVIDE(n, d)
Definition shared.h:78
#define ARRAY_SIZE(x)
Definition shared.h:85
#define BOOL_VAL(x)
Definition shared.h:70
#define MAX(x, y)
Definition shared.h:54
Definition city.h:318
int buy_cost
Definition city.h:466
struct city::@18::@21 client
struct packet_game_info info
Definition game.h:89
struct connection conn
Definition client_main.h:96
bool mapimg_layer[MAPIMG_LAYER_COUNT]
Definition options.h:228
struct ft_color highlight_our_names
Definition options.h:177
char mapimg_format[64]
Definition options.h:226
char mapimg_filename[512]
Definition options.h:229
Definition colors.h:21
struct player * playing
Definition connection.h:151
char username[MAX_LEN_NAME]
Definition connection.h:164
int bits
Definition bitvector.h:33
unsigned char * vec
Definition bitvector.h:34
int build_cost
Definition improvement.h:60
Definition climisc.h:82
struct universal item
Definition climisc.h:83
enum ai_level skill_level
struct city_list * cities
Definition player.h:281
struct dbv tile_vision[V_COUNT]
Definition player.h:359
struct unit_list * units
Definition player.h:282
struct player_economic economic
Definition player.h:284
struct player::@73::@76 client
Definition tile.h:50
struct unit_list * units
Definition tile.h:58
Definition unit.h:140
bool occupied
Definition unit.h:222
int id
Definition unit.h:147
struct tile * tile
Definition unit.h:142
struct unit::@84::@86 client
struct act_prob * act_prob_cache
Definition unit.h:231
int homecity
Definition unit.h:148
enum unit_focus_status focus_status
Definition unit.h:217
enum universals_n kind
Definition fc_types.h:595
universals_u value
Definition fc_types.h:594
struct civ_map map
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
size_t fc_strlcpy(char *dest, const char *src, size_t n)
Definition support.c:777
int fc_strcasecmp(const char *str0, const char *str1)
Definition support.c:186
int cat_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:986
int fc_vsnprintf(char *str, size_t n, const char *format, va_list ap)
Definition support.c:886
int fc_strncasecmp(const char *str0, const char *str1, size_t n)
Definition support.c:235
#define sz_strlcpy(dest, src)
Definition support.h:195
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
struct advance * advance_by_number(const Tech_type_id atype)
Definition tech.c:110
const char * advance_name_translation(const struct advance *padvance)
Definition tech.c:305
#define A_UNSET
Definition tech.h:48
struct city * tile_city(const struct tile *ptile)
Definition tile.c:83
@ TILE_UNKNOWN
Definition tile.h:36
#define TILE_XY(ptile)
Definition tile.h:43
struct sprite * get_government_sprite(const struct tileset *t, const struct government *gov)
Definition tilespec.c:7043
struct sprite * get_indicator_sprite(const struct tileset *t, enum indicator_type indicator, int idx)
Definition tilespec.c:7257
struct sprite * get_citizen_sprite(const struct tileset *t, enum citizen_category type, int citizen_index, const struct city *pcity)
Definition tilespec.c:6972
@ INDICATOR_COOLING
Definition tilespec.h:311
@ INDICATOR_WARMING
Definition tilespec.h:310
@ INDICATOR_BULB
Definition tilespec.h:309
#define NUM_TILES_PROGRESS
Definition tilespec.h:198
const struct unit_type * utype
Definition fc_types.h:536
const struct impr_type * building
Definition fc_types.h:529
int get_transporter_occupancy(const struct unit *ptrans)
Definition unit.c:1840
bool unit_transport_unload(struct unit *pcargo)
Definition unit.c:2478
struct unit_list * unit_transport_cargo(const struct unit *ptrans)
Definition unit.c:2533
#define unit_tile(_pu)
Definition unit.h:408
@ FOCUS_AVAIL
Definition unit.h:54
#define unit_owner(_pu)
Definition unit.h:407
#define unit_list_iterate(unitlist, punit)
Definition unitlist.h:31
#define unit_list_iterate_end
Definition unitlist.h:33
const struct unit_type * unit_type_get(const struct unit *punit)
Definition unittype.c:126
const char * unit_rule_name(const struct unit *punit)
Definition unittype.c:1613
Unit_type_id utype_count(void)
Definition unittype.c:82
struct unit_type * utype_by_number(const Unit_type_id id)
Definition unittype.c:114
Unit_type_id utype_number(const struct unit_type *punittype)
Definition unittype.c:102
bool can_player_build_unit_now(const struct player *p, const struct unit_type *punittype, const enum req_problem_type prob_type)
Definition unittype.c:2108
bool can_player_build_unit_later(const struct player *p, const struct unit_type *punittype)
Definition unittype.c:2130
int utype_build_shield_cost(const struct city *pcity, const struct player *pplayer, const struct unit_type *punittype)
Definition unittype.c:1463
const char * utype_name_translation(const struct unit_type *punittype)
Definition unittype.c:1586
const char * utype_values_translation(const struct unit_type *punittype)
Definition unittype.c:1643
static bool uclass_has_flag(const struct unit_class *punitclass, enum unit_class_flag_id flag)
Definition unittype.h:773
#define utype_class(_t_)
Definition unittype.h:756
static bool utype_has_flag(const struct unit_type *punittype, int flag)
Definition unittype.h:624
#define unit_type_iterate(_p)
Definition unittype.h:865
#define unit_type_iterate_end
Definition unittype.h:872
#define vision_layer_iterate(v)
Definition vision.h:76
#define vision_layer_iterate_end
Definition vision.h:79
#define MAP_NATIVE_WIDTH
#define MAP_INDEX_SIZE
#define MAP_NATIVE_HEIGHT