Freeciv-3.4
Loading...
Searching...
No Matches
packhand.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#include <string.h>
19
20/* utility */
21#include "bitvector.h"
22#include "capability.h"
23#include "fcintl.h"
24#include "log.h"
25#include "mem.h"
26#include "rand.h"
27#include "string_vector.h"
28#include "support.h"
29
30/* common */
31#include "achievements.h"
32#include "actions.h"
33#include "capstr.h"
34#include "citizens.h"
35#include "counters.h"
36#include "events.h"
37#include "extras.h"
38#include "game.h"
39#include "government.h"
40#include "idex.h"
41#include "map.h"
42#include "name_translation.h"
43#include "movement.h"
44#include "multipliers.h"
45#include "nation.h"
46#include "packets.h"
47#include "player.h"
48#include "research.h"
49#include "rgbcolor.h"
50#include "road.h"
51#include "spaceship.h"
52#include "specialist.h"
53#include "style.h"
54#include "tiledef.h"
55#include "traderoutes.h"
56#include "unit.h"
57#include "unitlist.h"
58#include "worklist.h"
59
60/* client/include */
61#include "chatline_g.h"
62#include "citydlg_g.h"
63#include "cityrep_g.h"
64#include "connectdlg_g.h"
65#include "dialogs_g.h"
66#include "editgui_g.h"
67#include "gui_main_g.h"
68#include "inteldlg_g.h"
69#include "mapctrl_g.h" /* popup_newcity_dialog() */
70#include "mapview_g.h"
71#include "menu_g.h"
72#include "messagewin_g.h"
73#include "pages_g.h"
74#include "plrdlg_g.h"
75#include "ratesdlg_g.h"
76#include "repodlgs_g.h"
77#include "spaceshipdlg_g.h"
78#include "voteinfo_bar_g.h"
79#include "wldlg_g.h"
80
81/* client */
82#include "agents.h"
83#include "attribute.h"
84#include "audio.h"
85#include "client_main.h"
86#include "climap.h"
87#include "climisc.h"
88#include "clitreaty.h"
89#include "connectdlg_common.h"
90#include "control.h"
91#include "editor.h"
92#include "goto.h" /* client_goto_init() */
93#include "helpdata.h" /* boot_help_texts() */
94#include "mapview_common.h"
95#include "music.h"
96#include "options.h"
97#include "overview_common.h"
98#include "tilespec.h"
99#include "update_queue.h"
100#include "voteinfo.h"
101
102/* client/luascript */
103#include "script_client.h"
104
105#include "packhand.h"
106
107/* Define this macro to get additional debug output about the transport
108 * status of the units. */
109#undef DEBUG_TRANSPORT
110
111static void city_packet_common(struct city *pcity, struct tile *pcenter,
112 struct player *powner,
113 struct tile_list *worked_tiles,
114 bool is_new, bool popup, bool investigate);
115static bool handle_unit_packet_common(struct unit *packet_unit);
116
117
118/* The dumbest of cities, placeholders for unknown and unseen cities. */
119static struct {
120 struct city_list *cities;
122} invisible = {
123 .cities = NULL,
124 .placeholder = NULL
126
127static struct {
128 int len;
130 char *caption;
131 char *headline;
132 char *lines;
133 int parts;
134} page_msg_report = { .parts = 0 };
135
136extern const char forced_tileset_name[];
137
138static int last_turn = 0;
139
140/* Refresh the action selection dialog */
141#define REQEST_BACKGROUND_REFRESH (1)
142/* Get possible actions for fast auto attack. */
143#define REQEST_BACKGROUND_FAST_AUTO_ATTACK (2)
144
145/* A unit will auto attack with the following actions. */
161
162/* A unit will not auto attack if any of these actions are legal. */
210 /* Actually an attack but it needs a target to be specified. */
212 /* End the action list. */
214};
215
216/************************************************************************/
220{
221 if (NULL != invisible.cities) {
226
228 invisible.cities = NULL;
229 }
230
231 if (NULL != invisible.placeholder) {
232 free(invisible.placeholder);
233 invisible.placeholder = NULL;
234 }
235}
236
237/************************************************************************/
240static void packhand_init(void)
241{
243
244 invisible.cities = city_list_new();
245
246 /* Can't use player_new() here, as it will register the player. */
247 invisible.placeholder = fc_calloc(1, sizeof(*invisible.placeholder));
248 memset(invisible.placeholder, 0, sizeof(*invisible.placeholder));
249 /* Set some values to prevent bugs ... */
250 sz_strlcpy(invisible.placeholder->name, ANON_PLAYER_NAME);
251 sz_strlcpy(invisible.placeholder->username, _(ANON_USER_NAME));
252 invisible.placeholder->unassigned_user = TRUE;
253 sz_strlcpy(invisible.placeholder->ranked_username, ANON_USER_NAME);
254 invisible.placeholder->unassigned_ranked = TRUE;
255}
256
257/************************************************************************/
265static struct unit *unpackage_unit(const struct packet_unit_info *packet)
266{
268 nullptr,
269 utype_by_number(packet->type),
270 packet->veteran);
271
272 /* Owner, veteran, and type fields are already filled in by
273 * unit_virtual_create() */
275 punit->id = packet->id;
277 punit->facing = packet->facing;
278 punit->homecity = packet->homecity;
280 punit->upkeep[o] = packet->upkeep[o];
282 punit->moves_left = packet->movesleft;
283 punit->hp = packet->hp;
284 punit->activity = packet->activity;
286
287 if (packet->activity_tgt == EXTRA_NONE) {
288 punit->activity_target = nullptr;
289 } else {
291 }
292
295
296 if (packet->changed_from_tgt == EXTRA_NONE) {
297 punit->changed_from_target = nullptr;
298 } else {
300 }
301
303 punit->fuel = packet->fuel;
305 punit->paradropped = packet->paradropped;
306 punit->done_moving = packet->done_moving;
307 punit->stay = packet->stay;
308 punit->birth_turn = packet->birth_turn;
310
311 /* Transporter / transporting information. */
312 punit->client.occupied = packet->occupied;
313 if (packet->transported) {
315 } else {
317 }
318 if (packet->carrying >= 0) {
320 } else {
321 punit->carrying = nullptr;
322 }
323
324 punit->battlegroup = packet->battlegroup;
325 punit->has_orders = packet->has_orders;
326 punit->orders.length = packet->orders_length;
327 punit->orders.index = packet->orders_index;
328 punit->orders.repeat = packet->orders_repeat;
330 if (punit->has_orders) {
331 int i;
332
333 for (i = 0; i < packet->orders_length; i++) {
334 /* Just an assert. The client doesn't use the action data. */
336 || action_id_exists(packet->orders[i].action));
337 }
339 = fc_malloc(punit->orders.length * sizeof(*punit->orders.list));
340 memcpy(punit->orders.list, packet->orders,
341 punit->orders.length * sizeof(*punit->orders.list));
342 }
343
347
349
350 return punit;
351}
352
353/************************************************************************/
363static struct unit *
365{
366 struct unit *punit;
367 struct player *owner;
368
369 if (packet->owner == OWNER_NONE) {
370 owner = nullptr;
371 } else {
372 owner = player_by_number(packet->owner);
373 }
374
376 utype_by_number(packet->type),
377 0);
378
379 /* Owner and type fields are already filled in by unit_virtual_create() */
380 punit->id = packet->id;
382 punit->facing = packet->facing;
383 punit->nationality = nullptr;
384 punit->veteran = packet->veteran;
385 punit->hp = packet->hp;
386 punit->activity = packet->activity;
387
388 if (packet->activity_tgt == EXTRA_NONE) {
389 punit->activity_target = nullptr;
390 } else {
392 }
393
394 /* Transporter / transporting information. */
395 punit->client.occupied = packet->occupied;
396 if (packet->transported) {
398 } else {
400 }
401
402 return punit;
403}
404
405/************************************************************************/
409void handle_server_join_reply(bool you_can_join, const char *message,
410 const char *capability,
411 const char *challenge_file, int conn_id)
412{
413 const char *s_capability = client.conn.capability;
414
415 conn_set_capability(&client.conn, capability);
417
418 if (you_can_join) {
420
421 log_verbose("join game accept:%s", message);
423 client.conn.id = conn_id;
424
427
431 }
432
434#ifdef EMERGENCY_VERSION
435 client_info.emerg_version = EMERGENCY_VERSION;
436#else
437 client_info.emerg_version = 0;
438#endif
440 sizeof(client_info.distribution));
442
443 /* We could always use hack, verify we're local */
444#ifdef FREECIV_DEBUG
445 if (!hackless)
446#endif /* FREECIV_DEBUG */
447 {
448 send_client_wants_hack(challenge_file);
449 }
450
452 } else {
454 _("You were rejected from the game: %s"), message);
455 client.conn.id = -1; /* not in range of conn_info id */
456
457 if (auto_connect) {
458 log_normal(_("You were rejected from the game: %s"), message);
459 }
461
463 }
465 return;
466 }
467 output_window_printf(ftc_client, _("Client capability string: %s"),
469 output_window_printf(ftc_client, _("Server capability string: %s"),
471}
472
473/************************************************************************/
477void handle_city_remove(int city_id)
478{
479 struct city *pcity = game_city_by_number(city_id);
481
482 fc_assert_ret_msg(NULL != pcity, "Bad city %d.", city_id);
483
485
489
490 /* Update menus if the focus unit is on the tile. */
491 if (need_menus_update) {
492 menus_update();
493 }
494}
495
496/************************************************************************/
500void handle_unit_remove(int unit_id)
501{
502 struct unit *punit = game_unit_by_number(unit_id);
503 struct unit_list *cargos;
504 struct player *powner;
506
507 if (!punit) {
508 log_error("Server wants us to remove unit id %d, "
509 "but we don't know about this unit!",
510 unit_id);
511 return;
512 }
513
514 /* Close the action selection dialog if the actor unit is lost. */
517 /* Open another action selection dialog if there are other actors in the
518 * current selection that want a decision. */
520 }
521
523 powner = unit_owner(punit);
524
525 /* Unload cargo if this is a transporter. */
527 if (unit_list_size(cargos) > 0) {
531 }
532
533 /* Unload unit if it is transported. */
536 }
538
542
543 if (!client_has_player() || powner == client_player()) {
546 }
548 }
549}
550
551/************************************************************************/
558
559/************************************************************************/
562void handle_team_name_info(int team_id, const char *team_name)
563{
564 struct team_slot *tslot = team_slot_by_number(team_id);
565
569}
570
571/************************************************************************/
578{
579 bool show_combat = FALSE;
582
583 if (punit0 && punit1) {
585 packet->attacker_hp, packet->defender_hp,
586 packet->make_att_veteran, packet->make_def_veteran);
593 } else {
595 }
597 }
598
599 if (show_combat) {
600 int hp0 = packet->attacker_hp, hp1 = packet->defender_hp;
601
603 unit_type_get(punit0)->sound_fight_alt,
604 NULL);
606 unit_type_get(punit1)->sound_fight_alt,
607 NULL);
608
611 } else {
612 punit0->hp = hp0;
613 punit1->hp = hp1;
614
618 }
619 }
620 if (packet->make_att_veteran && punit0) {
621 punit0->veteran++;
623 }
624 if (packet->make_def_veteran && punit1) {
625 punit1->veteran++;
627 }
628 }
629}
630
631/************************************************************************/
638 struct impr_type *pimprove,
639 bool have_impr)
640{
641 if (have_impr) {
642 if (pcity->built[improvement_index(pimprove)].turn <= I_NEVER) {
643 city_add_improvement(pcity, pimprove);
644 return TRUE;
645 }
646 } else {
647 if (pcity->built[improvement_index(pimprove)].turn > I_NEVER) {
649 return TRUE;
650 }
651 }
652 return FALSE;
653}
654
655/************************************************************************/
659void handle_city_info(const struct packet_city_info *packet)
660{
661 struct universal product;
662 int i;
663 bool popup;
664 bool city_is_new = FALSE;
669 bool name_changed = FALSE;
672 bool production_changed = FALSE;
674 struct unit_list *pfocus_units = get_units_in_focus();
675 struct city *pcity = game_city_by_number(packet->id);
676 struct tile_list *worked_tiles = NULL;
677 struct tile *pcenter = index_to_tile(&(wld.map), packet->tile);
678 struct tile *ptile = NULL;
679 struct player *powner = player_by_number(packet->owner);
680
681 fc_assert_ret_msg(NULL != powner, "Bad player number %d.", packet->owner);
682 fc_assert_ret_msg(NULL != pcenter, "Invalid tile index %d.", packet->tile);
683
685 log_error("handle_city_info() bad production_kind %d.",
686 packet->production_kind);
687 product.kind = VUT_NONE;
688 } else {
690 packet->production_value);
691 if (!universals_n_is_valid(product.kind)) {
692 log_error("handle_city_info() "
693 "production_kind %d with bad production_value %d.",
694 packet->production_kind, packet->production_value);
695 product.kind = VUT_NONE;
696 }
697 }
698
699 if (NULL != pcity) {
700 ptile = city_tile(pcity);
701
702 if (NULL == ptile) {
703 /* Invisible worked city */
706
707 pcity->tile = pcenter;
708 ptile = pcenter;
709 pcity->owner = powner;
710 } else if (city_owner(pcity) != powner) {
711 /* Remember what were the worked tiles. The server won't
712 * send them to us again. */
714 ptile, pworked, _index, _x, _y) {
715 if (pcity == tile_worked(pworked)) {
716 if (NULL == worked_tiles) {
717 worked_tiles = tile_list_new();
718 }
719 tile_list_append(worked_tiles, pworked);
720 }
723 pcity = NULL;
725 }
726 }
727
728 if (NULL == pcity) {
730 pcity = create_city_virtual(powner, pcenter, packet->name);
731 pcity->id = packet->id;
734 } else if (pcity->id != packet->id) {
735 log_error("handle_city_info() city id %d != id %d.",
736 pcity->id, packet->id);
737 return;
738 } else if (ptile != pcenter) {
739 log_error("handle_city_info() city tile (%d, %d) != (%d, %d).",
740 TILE_XY(ptile), TILE_XY(pcenter));
741 return;
742 } else {
744
745 while (trade_route_list_size(pcity->routes) > packet->trade_route_count) {
746 struct trade_route *proute = trade_route_list_get(pcity->routes, -1);
747
751 }
752
753 /* Descriptions should probably be updated if the
754 * city name, production or time-to-grow changes.
755 * Note that if either the food stock or surplus
756 * have changed, the time-to-grow is likely to
757 * have changed as well. */
760 && (!are_universals_equal(&pcity->production, &product)
761 || pcity->surplus[O_SHIELD] != packet->surplus[O_SHIELD]
762 || pcity->shield_stock != packet->shield_stock))
764 && (pcity->food_stock != packet->food_stock
765 || pcity->surplus[O_FOOD] != packet->surplus[O_FOOD]))
767
768 city_name_set(pcity, packet->name);
769 }
770
771 pcity->original = player_by_number(packet->original);
772
773 /* Check data */
775 for (i = 0; i < FEELING_LAST; i++) {
776 pcity->feel[CITIZEN_HAPPY][i] = packet->ppl_happy[i];
777 pcity->feel[CITIZEN_CONTENT][i] = packet->ppl_content[i];
778 pcity->feel[CITIZEN_UNHAPPY][i] = packet->ppl_unhappy[i];
779 pcity->feel[CITIZEN_ANGRY][i] = packet->ppl_angry[i];
780 }
781 for (i = 0; i < CITIZEN_LAST; i++) {
783 }
785 pcity->specialists[sp] = packet->specialists[sp];
787 city_size_add(pcity, pcity->specialists[sp]);
788 }
790
791 if (city_size_get(pcity) != packet->size) {
792 log_error("handle_city_info() "
793 "%d citizens not equal %d city size in \"%s\".",
795 city_size_set(pcity, packet->size);
796 }
797
798 pcity->history = packet->history;
799 pcity->client.culture = packet->culture;
800 pcity->client.buy_cost = packet->buy_cost;
801
802 pcity->city_radius_sq = packet->city_radius_sq;
803
804 pcity->city_options = packet->city_options;
805 pcity->wlcb = packet->wl_cb;
806
807 pcity->acquire_t = packet->acquire_type;
808
809 if (pcity->surplus[O_SCIENCE] != packet->surplus[O_SCIENCE]
810 || pcity->surplus[O_SCIENCE] != packet->surplus[O_SCIENCE]
811 || pcity->waste[O_SCIENCE] != packet->waste[O_SCIENCE]
812 || (pcity->unhappy_penalty[O_SCIENCE]
813 != packet->unhappy_penalty[O_SCIENCE])
814 || pcity->prod[O_SCIENCE] != packet->prod[O_SCIENCE]
815 || pcity->citizen_base[O_SCIENCE] != packet->citizen_base[O_SCIENCE]
816 || pcity->usage[O_SCIENCE] != packet->usage[O_SCIENCE]) {
818 }
819
820 pcity->food_stock = packet->food_stock;
821 if (pcity->shield_stock != packet->shield_stock) {
823 pcity->shield_stock = packet->shield_stock;
824 }
825 pcity->pollution = packet->pollution;
826 pcity->illness_trade = packet->illness_trade;
827
828 if (!are_universals_equal(&pcity->production, &product)) {
829 production_changed = TRUE;
830 }
831 /* Need to consider shield stock/surplus for unit dialog as used build
832 * slots may change, affecting number of "in-progress" units. */
833 if ((city_is_new && VUT_UTYPE == product.kind)
834 || (production_changed && (VUT_UTYPE == pcity->production.kind
835 || VUT_UTYPE == product.kind))
836 || pcity->surplus[O_SHIELD] != packet->surplus[O_SHIELD]
839 }
840 pcity->production = product;
841
843 pcity->surplus[o] = packet->surplus[o];
844 pcity->waste[o] = packet->waste[o];
845 pcity->unhappy_penalty[o] = packet->unhappy_penalty[o];
846 pcity->prod[o] = packet->prod[o];
847 pcity->citizen_base[o] = packet->citizen_base[o];
848 pcity->usage[o] = packet->usage[o];
850
851#ifdef DONE_BY_create_city_virtual
852 if (city_is_new) {
853 worklist_init(&pcity->worklist);
854
855 for (i = 0; i < ARRAY_SIZE(pcity->built); i++) {
856 pcity->built[i].turn = I_NEVER;
857 }
858 }
859#endif /* DONE_BY_create_city_virtual */
860
861 worklist_copy(&pcity->worklist, &packet->worklist);
862
863 pcity->airlift = packet->airlift;
864 pcity->did_buy = packet->did_buy;
865 pcity->did_sell = packet->did_sell;
866 pcity->was_happy = packet->was_happy;
867 pcity->had_famine = packet->had_famine;
868
869 pcity->anarchy = packet->anarchy;
870 pcity->rapture = packet->rapture;
871
872 pcity->turn_founded = packet->turn_founded;
873 pcity->turn_last_built = packet->turn_last_built;
874
876 log_error("handle_city_info() bad changed_from_kind %d.",
877 packet->changed_from_kind);
878 product.kind = VUT_NONE;
879 } else {
881 packet->changed_from_value);
882 if (!universals_n_is_valid(product.kind)) {
883 log_error("handle_city_info() bad changed_from_value %d.",
884 packet->changed_from_value);
885 product.kind = VUT_NONE;
886 }
887 }
889
890 pcity->before_change_shields = packet->before_change_shields;
891 pcity->disbanded_shields = packet->disbanded_shields;
892 pcity->caravan_shields = packet->caravan_shields;
893 pcity->last_turns_shield_surplus = packet->last_turns_shield_surplus;
894
895 improvement_iterate(pimprove) {
896 bool have = BV_ISSET(packet->improvements, improvement_index(pimprove));
897
898 if (have && !city_is_new
899 && pcity->built[improvement_index(pimprove)].turn <= I_NEVER) {
900 audio_play_sound(pimprove->soundtag, pimprove->soundtag_alt,
901 pimprove->soundtag_alt2);
902 }
906
907 /* We should be able to see units in the city. But for a diplomat
908 * investigating an enemy city we can't. In that case we don't update
909 * the occupied flag at all: it's already been set earlier and we'll
910 * get an update if it changes. */
913 = (unit_list_size(pcity->tile->units) > 0);
914 }
915
916 pcity->client.walls = packet->walls;
917 if (pcity->client.walls > NUM_WALL_TYPES) {
918 pcity->client.walls = NUM_WALL_TYPES;
919 }
920 pcity->style = packet->style;
921 pcity->capital = packet->capital;
922 if (packet->capital == CAPITAL_PRIMARY) {
923 powner->primary_capital_id = pcity->id;
924 } else if (powner->primary_capital_id == pcity->id) {
925 powner->primary_capital_id = 0;
926 }
927 pcity->client.city_image = packet->city_image;
928 pcity->steal = packet->steal;
929
930 pcity->client.happy = city_happy(pcity);
931 pcity->client.unhappy = city_unhappy(pcity);
932
934 && powner == client.conn.playing
936 || packet->diplomat_investigate;
937
938 city_packet_common(pcity, pcenter, powner, worked_tiles,
940
943 } else {
945 }
946
947 /* Update the description if necessary. */
950 }
951
952 /* Update focus unit info label if necessary. */
953 if (name_changed) {
955 if (pfocus_unit->homecity == pcity->id) {
957 break;
958 }
960 }
961
962 /* Update the science dialog if necessary. */
965 }
966
967 /* Update the units dialog if necessary. */
970 }
971
972 /* Update the economy dialog if necessary. */
975 }
976
977 /* Update the panel text (including civ population). */
979
980 /* Update caravan dialog */
981 if ((production_changed || shield_stock_changed)
986 city_tile(pcity)->index,
989 }
990
995 }
996}
997
998/************************************************************************/
1002{
1003 struct city *pcity = game_city_by_number(packet->id);
1004
1005 /* The nationality of the citizens. */
1007 int i;
1008
1010 for (i = 0; i < packet->nationalities_count; i++) {
1012 packet->nation_citizens[i]);
1013 }
1015 }
1016}
1017
1018/************************************************************************/
1022{
1023 struct city *pcity = game_city_by_number(packet->id);
1024
1025 if (pcity != NULL) {
1027 }
1028}
1029
1030/************************************************************************/
1035static void city_packet_common(struct city *pcity, struct tile *pcenter,
1036 struct player *powner,
1037 struct tile_list *worked_tiles,
1038 bool is_new, bool popup, bool investigate)
1039{
1040 if (NULL != worked_tiles) {
1041 /* We need to transfer the worked infos because the server will assume
1042 * those infos are kept in our side and won't send to us again. */
1043 tile_list_iterate(worked_tiles, pwork) {
1046 tile_list_destroy(worked_tiles);
1047 }
1048
1049 if (is_new) {
1050 tile_set_worked(pcenter, pcity); /* is_free_worked() */
1051 city_list_prepend(powner->cities, pcity);
1052
1053 if (client_is_global_observer() || powner == client_player()) {
1055 }
1056
1058 unit_list_iterate(pp->units, punit) {
1059 if (punit->homecity == pcity->id) {
1060 unit_list_prepend(pcity->units_supported, punit);
1061 }
1064
1065 pcity->client.first_citizen_index = fc_rand(MAX_NUM_CITIZEN_SPRITES);
1066 } else {
1067 if (client_is_global_observer() || powner == client_player()) {
1069 }
1070 }
1071
1072 if (can_client_change_view()) {
1074 }
1075
1076 if (city_workers_display == pcity) {
1078 }
1079
1080 if (investigate) {
1081 /* Commit the collected supported and present units. */
1082 if (pcity->client.collecting_info_units_supported != NULL) {
1083 /* We got units, let's move the unit lists. */
1084 fc_assert(pcity->client.collecting_info_units_present != NULL);
1085
1086 unit_list_destroy(pcity->client.info_units_present);
1087 pcity->client.info_units_present =
1088 pcity->client.collecting_info_units_present;
1089 pcity->client.collecting_info_units_present = NULL;
1090
1091 unit_list_destroy(pcity->client.info_units_supported);
1092 pcity->client.info_units_supported =
1093 pcity->client.collecting_info_units_supported;
1094 pcity->client.collecting_info_units_supported = NULL;
1095 } else {
1096 /* We didn't get any unit, let's clear the unit lists. */
1097 fc_assert(pcity->client.collecting_info_units_present == NULL);
1098
1099 unit_list_clear(pcity->client.info_units_supported);
1100 unit_list_clear(pcity->client.info_units_present);
1101 }
1102 }
1103
1104 if (popup
1105 && NULL != client.conn.playing
1108 menus_update();
1109 if (!city_dialog_is_open(pcity)) {
1111 }
1112 }
1113
1114 if (!is_new
1117 }
1118
1119 /* update menus if the focus unit is on the tile. */
1121 menus_update();
1122 }
1123
1124 if (is_new) {
1125 log_debug("(%d,%d) creating city %d, %s %s", TILE_XY(pcenter),
1128 }
1129
1131}
1132
1133/************************************************************************/
1138{
1139 struct city *pcity = game_city_by_number(packet->city);
1140 struct trade_route *proute;
1141 bool city_changed = FALSE;
1142
1143 if (pcity == NULL) {
1144 return;
1145 }
1146
1147 proute = trade_route_list_get(pcity->routes, packet->index);
1148 if (proute == NULL) {
1149 fc_assert(trade_route_list_size(pcity->routes) == packet->index);
1150
1151 proute = fc_malloc(sizeof(struct trade_route));
1154 }
1155
1156 proute->partner = packet->partner;
1157 proute->value = packet->value;
1158 proute->dir = packet->direction;
1159 proute->goods = goods_by_number(packet->goods);
1160
1164 }
1165}
1166
1167/************************************************************************/
1173{
1175 bool city_is_new = FALSE;
1176 bool name_changed = FALSE;
1178 struct city *pcity = game_city_by_number(packet->id);
1179 struct tile *pcenter = index_to_tile(&(wld.map), packet->tile);
1180 struct tile *ptile = NULL;
1181 struct tile_list *worked_tiles = NULL;
1182 struct player *powner = player_by_number(packet->owner);
1183 struct player *original = player_by_number(packet->original);
1184 int radius_sq = game.info.init_city_radius_sq;
1185
1186 fc_assert_ret_msg(NULL != powner, "Bad player number %d.", packet->owner);
1187 fc_assert_ret_msg(NULL != pcenter, "Invalid tile index %d.", packet->tile);
1188
1189 if (NULL != pcity) {
1190 ptile = city_tile(pcity);
1191
1192 if (NULL == ptile) {
1193 /* Invisible worked city */
1195 city_is_new = TRUE;
1196
1197 pcity->tile = pcenter;
1198 pcity->owner = powner;
1199 pcity->original = original;
1200
1202 if (wtile->worked == pcity) {
1204
1207 }
1208 }
1210 } else if (city_owner(pcity) != powner) {
1211 /* Remember what were the worked tiles. The server won't
1212 * send to us again. */
1214 pworked, _index, _x, _y) {
1215 if (pcity == tile_worked(pworked)) {
1216 if (NULL == worked_tiles) {
1217 worked_tiles = tile_list_new();
1218 }
1219 tile_list_append(worked_tiles, pworked);
1220 }
1222 radius_sq = city_map_radius_sq_get(pcity);
1224 pcity = NULL;
1226 }
1227 }
1228
1229 if (NULL == pcity) {
1230 city_is_new = TRUE;
1231 pcity = create_city_virtual(powner, pcenter, packet->name);
1232 pcity->id = packet->id;
1233 pcity->original = original;
1234 city_map_radius_sq_set(pcity, radius_sq);
1236 } else if (pcity->id != packet->id) {
1237 log_error("handle_city_short_info() city id %d != id %d.",
1238 pcity->id, packet->id);
1239 return;
1240 } else if (city_tile(pcity) != pcenter) {
1241 log_error("handle_city_short_info() city tile (%d, %d) != (%d, %d).",
1243 return;
1244 } else {
1245 name_changed = (fc_strncmp(packet->name, pcity->name, MAX_LEN_CITYNAME));
1246
1247 /* Check if city descriptions should be updated */
1250 }
1251
1252 city_name_set(pcity, packet->name);
1253
1254 memset(pcity->feel, 0, sizeof(pcity->feel));
1255 memset(pcity->specialists, 0, sizeof(pcity->specialists));
1256 }
1257
1258 pcity->specialists[DEFAULT_SPECIALIST] = packet->size;
1259 city_size_set(pcity, packet->size);
1260
1261 /* We can't actually see the internals of the city, but the server tells
1262 * us this much. */
1263 if (pcity->client.occupied != packet->occupied) {
1264 pcity->client.occupied = packet->occupied;
1267 }
1268 }
1269 pcity->client.walls = packet->walls;
1270 if (pcity->client.walls > NUM_WALL_TYPES) {
1271 pcity->client.walls = NUM_WALL_TYPES;
1272 }
1273 pcity->style = packet->style;
1274 pcity->capital = packet->capital;
1275 if (packet->capital == CAPITAL_PRIMARY) {
1276 powner->primary_capital_id = pcity->id;
1277 } else if (powner->primary_capital_id == pcity->id) {
1278 powner->primary_capital_id = 0;
1279 }
1280 pcity->client.city_image = packet->city_image;
1281
1282 pcity->client.happy = packet->happy;
1283 pcity->client.unhappy = packet->unhappy;
1284
1285 pcity->rapture = 0;
1286 pcity->anarchy = 0;
1287
1288 improvement_iterate(pimprove) {
1289 /* Don't update the non-visible improvements, they could hide the
1290 * previously seen information about the city (diplomat investigation).
1291 */
1292 if (is_improvement_visible(pimprove)) {
1293 bool have = BV_ISSET(packet->improvements,
1294 improvement_index(pimprove));
1296 }
1298
1299 city_packet_common(pcity, pcenter, powner, worked_tiles,
1301
1304 } else {
1306 }
1307
1308 /* Update the description if necessary. */
1309 if (update_descriptions) {
1311 }
1312}
1313
1314/************************************************************************/
1317void handle_worker_task(const struct packet_worker_task *packet)
1318{
1319 struct city *pcity = game_city_by_number(packet->city_id);
1320 struct worker_task *ptask = NULL;
1321
1322 if (pcity == NULL
1324 return;
1325 }
1326
1328 if (tile_index(ptask_old->ptile) == packet->tile_id) {
1329 ptask = ptask_old;
1330 break;
1331 }
1333
1334 if (ptask == NULL) {
1335 if (packet->activity == ACTIVITY_LAST) {
1336 return;
1337 } else {
1338 ptask = fc_malloc(sizeof(struct worker_task));
1339 worker_task_list_append(pcity->task_reqs, ptask);
1340 }
1341 } else {
1342 if (packet->activity == ACTIVITY_LAST) {
1343 worker_task_list_remove(pcity->task_reqs, ptask);
1344 free(ptask);
1345 ptask = NULL;
1346 }
1347 }
1348
1349 if (ptask != NULL) {
1350 ptask->ptile = index_to_tile(&(wld.map), packet->tile_id);
1351 ptask->act = packet->activity;
1352 if (packet->tgt >= 0) {
1353 ptask->tgt = extra_by_number(packet->tgt);
1354 } else {
1355 ptask->tgt = NULL;
1356 }
1357 ptask->want = packet->want;
1358 }
1359
1360 if (ptask && !worker_task_is_sane(ptask)) {
1361 log_debug("Bad worker task");
1362 worker_task_list_remove(pcity->task_reqs, ptask);
1363 free(ptask);
1364 ptask = NULL;
1365 return;
1366 }
1367
1369}
1370
1371/************************************************************************/
1374void handle_new_year(int year, int fragments, int turn)
1375{
1376 game.info.year = year;
1377 game.info.fragment_count = fragments;
1378 /*
1379 * The turn was increased in handle_end_turn()
1380 */
1381 fc_assert(game.info.turn == turn);
1383
1386
1388 menus_update();
1389
1391
1392#if 0
1393 /* This information shouldn't be needed, but if it is this is the only
1394 * way we can get it. */
1395 if (NULL != client.conn.playing) {
1399 }
1400#endif
1401
1404
1407 _("Start of turn %d"), game.info.turn);
1408 }
1409
1411
1412 if (last_turn != turn) {
1413 start_turn();
1414 last_turn = turn;
1415 }
1416}
1417
1418/************************************************************************/
1424{
1425 /* Messagewindow will contain events happened since our own phase ended,
1426 * so player of the first phase and last phase are in equal situation. */
1428}
1429
1430/************************************************************************/
1434void handle_start_phase(int phase)
1435{
1437 /* We are on detached state, let ignore this packet. */
1438 return;
1439 }
1440
1441 if (phase < 0
1443 && phase >= player_count())
1445 && phase >= team_count())) {
1446 log_error("handle_start_phase() illegal phase %d.", phase);
1447 return;
1448 }
1449
1451
1452 game.info.phase = phase;
1453
1454 /* Possibly replace wait cursor with something else */
1455 if (phase == 0) {
1456 /* TODO: Have server set as busy also if switching phase
1457 * is taking long in a alternating phases mode. */
1459 }
1460
1461 if (NULL != client.conn.playing
1462 && is_player_phase(client.conn.playing, phase)) {
1465
1467
1471 }
1472
1474
1478
1482
1484 }
1485
1487}
1488
1489/************************************************************************/
1494{
1495 log_debug("handle_begin_turn()");
1496
1497 /* Server is still considered busy until it handles also the beginning
1498 * of the first phase. */
1499
1501}
1502
1503/************************************************************************/
1508{
1509 log_debug("handle_end_turn()");
1510
1511 /* Make sure wait cursor is in use */
1513
1515
1516 /*
1517 * The local idea of the game.info.turn is increased here since the
1518 * client will get unit updates (reset of move points for example)
1519 * between handle_end_turn() and handle_new_year(). These
1520 * unit updates will look like they did take place in the old turn
1521 * which is incorrect. If we get the authoritative information about
1522 * the game.info.turn in handle_new_year() we will check it.
1523 */
1524 game.info.turn++;
1525
1526 log_verbose(_("Beginning turn %d"), game.info.turn);
1527
1529}
1530
1531/************************************************************************/
1535{
1536 const char *sound_tag = get_event_tag(type);
1537
1538 if (sound_tag) {
1539 audio_play_sound(sound_tag, NULL, NULL);
1540 }
1541}
1542
1543/************************************************************************/
1547void handle_chat_msg(const struct packet_chat_msg *packet)
1548{
1549 handle_event(packet->message,
1550 index_to_tile(&(wld.map), packet->tile),
1551 packet->event,
1552 packet->turn,
1553 packet->phase,
1554 packet->conn_id);
1555}
1556
1557/************************************************************************/
1568{
1569 handle_event(packet->message,
1570 index_to_tile(&(wld.map), packet->tile),
1571 packet->event,
1572 packet->turn,
1573 packet->phase,
1574 packet->conn_id);
1575}
1576
1577/************************************************************************/
1582{
1583 popup_connect_msg(_("Welcome"), message);
1584}
1585
1586/************************************************************************/
1590void handle_server_info(const char *version_label, int major_version,
1591 int minor_version, int patch_version, int emerg_version)
1592{
1593 if (emerg_version > 0) {
1594 log_verbose("Server has version %d.%d.%d.%d%s",
1595 major_version, minor_version, patch_version, emerg_version,
1596 version_label);
1597 } else {
1598 log_verbose("Server has version %d.%d.%d%s",
1599 major_version, minor_version, patch_version, version_label);
1600 }
1601}
1602
1603/************************************************************************/
1606void handle_page_msg(const char *caption, const char *headline,
1607 enum event_type event, int len, int parts)
1608{
1609 if (!client_has_player()
1611 || event != E_BROADCAST_REPORT) {
1612 if (page_msg_report.parts > 0) {
1613 /* Previous one was never finished */
1614 free(page_msg_report.caption);
1615 free(page_msg_report.headline);
1616 free(page_msg_report.lines);
1617 }
1618 page_msg_report.len = len;
1619 page_msg_report.event = event;
1622 page_msg_report.parts = parts;
1623 page_msg_report.lines = fc_malloc(len + 1);
1624 page_msg_report.lines[0] = '\0';
1625
1626 if (parts == 0) {
1627 /* Empty report - handle as if last part was just received. */
1628 page_msg_report.parts = 1;
1630 }
1631 }
1632}
1633
1634/************************************************************************/
1638{
1639 if (page_msg_report.lines != NULL) {
1640 /* We have already decided to show the message at the time we got
1641 * the header packet. */
1643 page_msg_report.parts--;
1644
1645 if (page_msg_report.parts == 0) {
1646 /* This is the final part */
1648 page_msg_report.headline,
1649 page_msg_report.lines);
1651
1652 free(page_msg_report.caption);
1653 free(page_msg_report.headline);
1654 free(page_msg_report.lines);
1655 page_msg_report.lines = NULL;
1656 }
1657 }
1658}
1659
1660/************************************************************************/
1663void handle_unit_info(const struct packet_unit_info *packet)
1664{
1665 struct unit *punit;
1666
1667 punit = unpackage_unit(packet);
1671 }
1672}
1673
1674/**********************************************************************/
1680{
1683 if (utype_can_do_action(unit_type_get(punit), act_id)) {
1684 /* An auto action like auto attack could be legal. Check for those
1685 * at once so they won't have to wait for player focus. */
1687 punit->id,
1690 EXTRA_NONE,
1692 return;
1693 }
1695 }
1696
1697 /* This should be done in the foreground */
1699}
1700
1701/************************************************************************/
1718{
1719 struct city *pcity;
1720 struct unit *punit;
1721 bool need_menus_update = FALSE;
1724 bool repaint_unit = FALSE;
1725 bool repaint_city = FALSE; /* regards unit's homecity */
1726 struct tile *old_tile = nullptr;
1727 bool check_focus = FALSE; /* conservative focus change */
1728 bool moved = FALSE;
1729 bool ret = FALSE;
1731 struct player *plr = client_player();
1732
1733 if (owner == nullptr) {
1734 punit = nullptr;
1735 } else {
1737 }
1738
1739 if (punit == nullptr && game_unit_by_number(packet_unit->id)) {
1740 /* This means unit has changed owner. We deal with this here
1741 * by simply deleting the old one and creating a new one. */
1743 }
1744
1745 if (punit != nullptr) {
1746 /* In some situations, the size of repaint units require can change;
1747 * in particular, city-builder units sometimes get a potential-city
1748 * outline, but to speed up redraws we don't repaint this whole area
1749 * unnecessarily. We need to ensure that when the footprint shrinks,
1750 * old bits aren't left behind on the canvas.
1751 * If the current (old) status of the unit is such that it gets a large
1752 * repaint, as a special case, queue a large repaint immediately, to
1753 * schedule the correct amount/location to be redrawn; but rely on the
1754 * repaint being deferred until the unit is updated, so that what's
1755 * drawn reflects the new status (e.g., no city outline). */
1758 }
1759
1760 ret = TRUE;
1761 punit->activity_count = packet_unit->activity_count;
1763 if (punit->ssa_controller != packet_unit->ssa_controller) {
1764 punit->ssa_controller = packet_unit->ssa_controller;
1766 /* AI is set: May change focus */
1767 /* AI is cleared: Keep focus */
1768 if (packet_unit->ssa_controller != SSA_NONE
1769 && unit_is_in_focus(punit)) {
1770 check_focus = TRUE;
1771 }
1772 }
1773
1774 if (punit->facing != packet_unit->facing) {
1775 punit->facing = packet_unit->facing;
1777 }
1778
1779 if (punit->activity != packet_unit->activity
1780 || punit->activity_target == packet_unit->activity_target
1781 || punit->client.transported_by != packet_unit->client.transported_by
1782 || punit->client.occupied != packet_unit->client.occupied
1783 || punit->has_orders != packet_unit->has_orders
1784 || punit->orders.repeat != packet_unit->orders.repeat
1785 || punit->orders.vigilant != packet_unit->orders.vigilant
1786 || punit->orders.index != packet_unit->orders.index) {
1787
1788 /*** Change in activity or activity's target. ***/
1789
1790 /* May change focus if focus unit gets a new activity.
1791 * But if new activity is Idle, it means user specifically selected
1792 * the unit */
1794 && (packet_unit->activity != ACTIVITY_IDLE
1795 || packet_unit->has_orders)) {
1796 check_focus = TRUE;
1797 }
1798
1800
1801 /* Wakeup Focus */
1803 && plr != nullptr
1804 && is_human(plr)
1805 && owner == plr
1807 && packet_unit->activity == ACTIVITY_IDLE
1809 && is_player_phase(plr, game.info.phase)) {
1810 /* Many wakeup units per tile are handled */
1812 check_focus = FALSE; /* and keep it */
1813 }
1814
1815 punit->activity = packet_unit->activity;
1816 punit->activity_target = packet_unit->activity_target;
1817
1819 != packet_unit->client.transported_by) {
1820 if (packet_unit->client.transported_by == -1) {
1821 /* The unit was unloaded from its transport. The check for a new
1822 * transport is done below. */
1824 }
1825
1826 punit->client.transported_by = packet_unit->client.transported_by;
1827 }
1828
1829 if (punit->client.occupied != packet_unit->client.occupied) {
1831 /* Special case: (un)loading a unit in a transporter on the same
1832 * tile as the focus unit may (dis)allow the focus unit to be
1833 * loaded. Thus the orders->(un)load menu item needs updating. */
1835 }
1836 punit->client.occupied = packet_unit->client.occupied;
1837 }
1838
1839 punit->has_orders = packet_unit->has_orders;
1840 punit->orders.length = packet_unit->orders.length;
1841 punit->orders.index = packet_unit->orders.index;
1842 punit->orders.repeat = packet_unit->orders.repeat;
1843 punit->orders.vigilant = packet_unit->orders.vigilant;
1844
1845 /* We cheat by just stealing the packet unit's list. */
1846 if (punit->orders.list) {
1848 }
1849 punit->orders.list = packet_unit->orders.list;
1850 packet_unit->orders.list = nullptr;
1851
1852 if (plr == nullptr || owner == plr) {
1854 }
1855 } /*** End of Change in activity or activity's target. ***/
1856
1857 /* These two lines force the menus to be updated as appropriate when
1858 * the focus unit changes. */
1859 if (unit_is_in_focus(punit)) {
1861 }
1862
1863 if (punit->homecity != packet_unit->homecity) {
1864 /* change homecity */
1865 struct city *hcity;
1866
1868 unit_list_remove(hcity->units_supported, punit);
1870 }
1871
1872 punit->homecity = packet_unit->homecity;
1874 unit_list_prepend(hcity->units_supported, punit);
1876 }
1877
1878 /* This can change total upkeep figures */
1880 }
1881
1882 if (punit->hp != packet_unit->hp) {
1883 /* hp changed */
1884 punit->hp = packet_unit->hp;
1886 }
1887
1889 /* Unit type has changed (been upgraded) */
1890 struct city *ccity = tile_city(unit_tile(punit));
1891
1895 if (ccity != NULL && (ccity->id != punit->homecity)) {
1897 }
1898 if (unit_is_in_focus(punit)) {
1899 /* Update the orders menu -- the unit might have new abilities */
1901 }
1903 }
1904
1905 /* May change focus if an attempted move or attack exhausted unit */
1906 if (punit->moves_left != packet_unit->moves_left
1907 && unit_is_in_focus(punit)) {
1908 check_focus = TRUE;
1909 }
1910
1912 /*** Change position ***/
1913 struct city *ccity = tile_city(unit_tile(punit));
1914
1916 moved = TRUE;
1917
1918 /* Show where the unit is going. */
1920
1921 if (ccity != nullptr) {
1923 /* Unit moved out of a city - update the occupied status. */
1924 bool new_occupied =
1925 (unit_list_size(ccity->tile->units) > 0);
1926
1927 if (ccity->client.occupied != new_occupied) {
1928 ccity->client.occupied = new_occupied;
1932 }
1933 }
1934 }
1935
1936 if (ccity->id == punit->homecity) {
1938 } else {
1940 }
1941 }
1942
1943 if ((ccity = tile_city(unit_tile(punit)))) {
1945 /* Unit moved into a city - obviously it's occupied. */
1946 if (!ccity->client.occupied) {
1947 ccity->client.occupied = TRUE;
1951 }
1952 }
1953 }
1954
1955 if (ccity->id == punit->homecity) {
1957 } else {
1959 }
1960 }
1961
1962 } /*** End of Change position. ***/
1963
1964 if (repaint_city || repaint_unit) {
1965 /* We repaint the city if the unit itself needs repainting or if
1966 * there is a special city-only redrawing to be done. */
1969 }
1971 && tile_city(unit_tile(punit)) != pcity) {
1972 /* Refresh the city we're occupying too. */
1974 }
1975 }
1976
1978 != packet_unit->upkeep[O_GOLD]);
1979 /* unit upkeep information */
1981 punit->upkeep[o] = packet_unit->upkeep[o];
1983
1984 punit->nationality = packet_unit->nationality;
1985 punit->veteran = packet_unit->veteran;
1986 punit->moves_left = packet_unit->moves_left;
1987 punit->fuel = packet_unit->fuel;
1988 punit->goto_tile = packet_unit->goto_tile;
1989 punit->paradropped = packet_unit->paradropped;
1990 punit->stay = packet_unit->stay;
1991 if (punit->done_moving != packet_unit->done_moving) {
1992 punit->done_moving = packet_unit->done_moving;
1993 check_focus = TRUE;
1994 }
1995 punit->carrying = packet_unit->carrying;
1996
1997 /* This won't change punit; it enqueues the call for later handling. */
2000
2001 if ((punit->action_decision_want != packet_unit->action_decision_want
2003 != packet_unit->action_decision_tile))
2005 /* The unit wants the player to decide. */
2007 /* Pop up an action selection dialog if the unit has focus or give
2008 * the unit higher priority in the focus queue if not. */
2009 punit->action_decision_tile = packet_unit->action_decision_tile;
2011 check_focus = TRUE;
2012 } else {
2013 /* Refresh already open action selection dialog. */
2017 tile_index(
2018 packet_unit->action_decision_tile),
2021 }
2022 }
2023 punit->action_decision_want = packet_unit->action_decision_want;
2024 punit->action_decision_tile = packet_unit->action_decision_tile;
2025 } else {
2026 /*** Create new unit ***/
2029
2030 if (owner != nullptr) {
2031 unit_list_prepend(owner->units, punit);
2032 }
2034
2036
2038 unit_list_prepend(pcity->units_supported, punit);
2039 }
2040
2041 log_debug("New %s %s id %d (%d %d) hc %d %s",
2045 (pcity ? city_name_get(pcity) : "(unknown)"));
2046
2049
2050 /* Check if we should link cargo units.
2051 * (This might be necessary if the cargo info was sent to us before
2052 * this transporter.) */
2053 if (punit->client.occupied) {
2055 if (aunit->client.transported_by == punit->id) {
2056 fc_assert(aunit->transporter == NULL);
2058 }
2060 }
2061
2062 if ((pcity = tile_city(unit_tile(punit)))) {
2063 /* The unit is in a city - obviously it's occupied. */
2065 }
2066
2068 /* The unit wants the player to decide. */
2070 check_focus = TRUE;
2071 }
2072
2074 } /*** End of Create new unit ***/
2075
2077
2078 /* Check if we have to load the unit on a transporter. */
2079 if (punit->client.transported_by != -1) {
2080 struct unit *ptrans
2081 = game_unit_by_number(packet_unit->client.transported_by);
2082
2083 /* Load unit only if transporter is known by the client.
2084 * (If not, cargo will be loaded later when the transporter info is
2085 * sent to the client.) */
2087 /* First, we have to unload the unit from its old transporter. */
2090
2091#ifdef DEBUG_TRANSPORT
2092 log_debug("load %s (ID: %d) onto %s (ID: %d)",
2095 } else if (ptrans && ptrans == unit_transport_get(punit)) {
2096 log_debug("%s (ID: %d) is loaded onto %s (ID: %d)",
2099 } else {
2100 log_debug("%s (ID: %d) is not loaded", unit_name_translation(punit),
2101 punit->id);
2102#endif /* DEBUG_TRANSPORT */
2103
2104 }
2105 }
2106
2111 /* Update (an possible active) unit select dialog. */
2113 }
2114
2115 if (repaint_unit) {
2117 }
2118
2119 if ((check_focus || get_num_units_in_focus() == 0)
2120 && plr != nullptr
2121 && is_human(plr)
2122 && is_player_phase(plr, game.info.phase)) {
2124 }
2125
2126 if (need_menus_update) {
2127 menus_update();
2128 }
2129
2130 if (!client_has_player() || owner == plr) {
2133 }
2136 }
2137 }
2138
2139 return ret;
2140}
2141
2142/************************************************************************/
2149{
2150 struct city *pcity = game_city_by_number(packet->city_id);
2151
2152 if (!pcity) {
2153 log_error("Investigate city: unknown city id %d!",
2154 packet->city_id);
2155 return;
2156 }
2157
2158 /* Start collecting supported and present units. */
2159
2160 /* Ensure we are not already in an investigate cycle. */
2161 fc_assert(pcity->client.collecting_info_units_supported == NULL);
2162 fc_assert(pcity->client.collecting_info_units_present == NULL);
2163 pcity->client.collecting_info_units_supported =
2165 pcity->client.collecting_info_units_present =
2167}
2168
2169/************************************************************************/
2173{
2174}
2175
2176/************************************************************************/
2180{
2181 struct city *pcity;
2182 struct unit *punit;
2183
2184 /* Special case for a diplomat/spy investigating a city: The investigator
2185 * needs to know the supported and present units of a city, whether or not
2186 * they are fogged. So, we send a list of them all before sending the city
2187 * info. */
2189 || packet->packet_use == UNIT_INFO_CITY_PRESENT) {
2190
2192 if (!pcity) {
2193 log_error("Investigate city: unknown city id %d!",
2194 packet->info_city_id);
2195 return;
2196 }
2197
2198 /* Append a unit struct to the proper list. */
2199 punit = unpackage_short_unit(packet);
2200 if (punit != nullptr) {
2201 if (packet->packet_use == UNIT_INFO_CITY_SUPPORTED) {
2202 fc_assert(pcity->client.collecting_info_units_supported != NULL);
2203 unit_list_append(pcity->client.collecting_info_units_supported, punit);
2204 } else {
2206 fc_assert(pcity->client.collecting_info_units_present != NULL);
2207 unit_list_append(pcity->client.collecting_info_units_present, punit);
2208 }
2209 }
2210
2211 /* Done with special case. */
2212 return;
2213 }
2214
2215 if (player_by_number(packet->owner) == client.conn.playing) {
2216 log_error("handle_unit_short_info() for own unit.");
2217 }
2218
2219 punit = unpackage_short_unit(packet);
2220 if (punit != nullptr && handle_unit_packet_common(punit)) {
2223 }
2224}
2225
2226/************************************************************************/
2229void handle_set_topology(int topology_id, int wrap_id)
2230{
2231 wld.map.topology_id = topology_id;
2232 wld.map.wrap_id = wrap_id;
2233
2234 if (forced_tileset_name[0] == '\0'
2235 && (tileset_map_topo_compatible(topology_id, tileset, NULL)
2238 const char *ts_to_load;
2239
2241
2242 if (ts_to_load != NULL && ts_to_load[0] != '\0' && strcmp(tileset_basename(tileset), ts_to_load)) {
2244 }
2245 }
2246}
2247
2248/************************************************************************/
2252void handle_map_info(const struct packet_map_info *packet)
2253{
2254 int ts_topo;
2255
2256 if (!map_is_empty()) {
2257 map_free(&(wld.map), FALSE);
2259 }
2260
2261 wld.map.xsize = packet->xsize;
2262 wld.map.ysize = packet->ysize;
2263
2267
2271 _("Map topology (%s) and tileset (%s) incompatible."),
2273 }
2274
2275 wld.map.topology_id = packet->topology_id;
2276 wld.map.wrap_id = packet->wrap_id;
2277
2282 mapdeco_init();
2283
2285
2287
2288 packhand_init();
2289}
2290
2291/************************************************************************/
2295{
2296 bool boot_help;
2298 bool toggle_edit_ui = FALSE;
2299
2300 if (game.info.aifill != pinfo->aifill) {
2302 }
2303 if (game.info.skill_level != pinfo->skill_level) {
2305 }
2306
2307 if (game.info.is_edit_mode != pinfo->is_edit_mode) {
2309
2311 /* Clears the current goto command. */
2313
2314 if (pinfo->is_edit_mode) {
2316 /* Gui didn't handle this */
2318 _("This scenario may have manually set properties the editor "
2319 "cannot handle."));
2321 _("They won't be saved when scenario is saved from the editor."));
2322 }
2323 }
2324 }
2325
2326 game.info = *pinfo;
2327
2328 /* check the values! */
2329#define VALIDATE(_count, _maximum, _string) \
2330 if (game.info._count > _maximum) { \
2331 log_error("handle_game_info(): Too many " _string "; using %d of %d", \
2332 _maximum, game.info._count); \
2333 game.info._count = _maximum; \
2334 }
2335
2336 VALIDATE(granary_num_inis, MAX_GRANARY_INIS, "granary entries");
2337#undef VALIDATE
2338
2343
2345 && game.info.victory_conditions != pinfo->victory_conditions);
2346 if (boot_help) {
2347 boot_help_texts(); /* reboot, after setting game.spacerace */
2348 }
2350 menus_update();
2354 }
2355
2356 if (can_client_change_view()) {
2358 }
2359
2360 if (toggle_edit_ui) {
2362 }
2363
2365}
2366
2367/************************************************************************/
2374
2375/************************************************************************/
2378void handle_timeout_info(float seconds_to_phasedone, float last_turn_change_time)
2379{
2380 if (current_turn_timeout() != 0 && seconds_to_phasedone >= 0) {
2381 /* If this packet is received in the middle of a turn, this value
2382 * represents the number of seconds from now to the end of the turn
2383 * (not from the start of the turn). So we need to restart our
2384 * timer. */
2385 set_seconds_to_turndone(seconds_to_phasedone);
2386 }
2387
2388 game.tinfo.last_turn_change_time = last_turn_change_time;
2389}
2390
2391/************************************************************************/
2403
2404/************************************************************************/
2413
2414/************************************************************************/
2419void handle_player_remove(int playerno)
2420{
2421 struct player_slot *pslot;
2422 struct player *pplayer;
2423 int plr_nbr;
2424
2425 pslot = player_slot_by_number(playerno);
2426
2427 if (NULL == pslot || !player_slot_is_used(pslot)) {
2428 /* Ok, just ignore. */
2429 return;
2430 }
2431
2432 pplayer = player_slot_get_player(pslot);
2433
2434 if (can_client_change_view()) {
2435 close_intel_dialog(pplayer);
2436 }
2437
2438 /* Update the connection information. */
2439 if (client_player() == pplayer) {
2441 }
2443 pconn->playing = NULL;
2445 conn_list_clear(pplayer->connections);
2446
2447 /* Save player number before player is freed */
2448 plr_nbr = player_number(pplayer);
2449
2450 player_destroy(pplayer);
2451
2454
2457}
2458
2459/************************************************************************/
2465{
2466 bool is_new_nation = FALSE;
2467 bool turn_done_changed = FALSE;
2468 bool new_player = FALSE;
2469 int i;
2470 struct player *pplayer, *my_player;
2471 struct nation_type *pnation;
2472 struct government *pgov, *ptarget_gov;
2473 struct player_slot *pslot;
2474 struct team_slot *tslot;
2475 bool gov_change;
2476
2477 /* Player. */
2478 pslot = player_slot_by_number(pinfo->playerno);
2479 fc_assert(NULL != pslot);
2481 pplayer = player_new(pslot);
2482
2483 if ((pplayer->rgb == NULL) != !pinfo->color_valid
2484 || (pinfo->color_valid
2485 && (pplayer->rgb->r != pinfo->color_red
2486 || pplayer->rgb->g != pinfo->color_green
2487 || pplayer->rgb->b != pinfo->color_blue))) {
2488 struct rgbcolor *prgbcolor;
2489
2490 if (pinfo->color_valid) {
2491 prgbcolor = rgbcolor_new(pinfo->color_red,
2492 pinfo->color_green,
2493 pinfo->color_blue);
2495 } else {
2496 prgbcolor = NULL;
2497 }
2498
2499 player_set_color(pplayer, prgbcolor);
2500 tileset_player_init(tileset, pplayer);
2501
2503
2504 /* Queue a map update -- may need to redraw borders, etc. */
2506 }
2507 pplayer->client.color_changeable = pinfo->color_changeable;
2508
2509 if (new_player) {
2510 /* Initialise client side player data (tile vision). At the moment
2511 * redundant as the values are initialised with 0 due to fc_calloc(). */
2512 client_player_init(pplayer);
2513 }
2514
2515 /* Team. */
2517 fc_assert(NULL != tslot);
2518
2519 /* Should never fail when slot given is not nullptr */
2520 team_add_player(pplayer, team_new(tslot));
2521
2522 pnation = nation_by_number(pinfo->nation);
2523 pgov = government_by_number(pinfo->government);
2524 ptarget_gov = government_by_number(pinfo->target_government);
2525
2526 /* Now update the player information. */
2527 sz_strlcpy(pplayer->name, pinfo->name);
2528 sz_strlcpy(pplayer->username, pinfo->username);
2529 pplayer->unassigned_user = pinfo->unassigned_user;
2530
2531 is_new_nation = player_set_nation(pplayer, pnation);
2532 pplayer->is_male = pinfo->is_male;
2533 pplayer->score.game = pinfo->score;
2534 pplayer->was_created = pinfo->was_created;
2535
2536 pplayer->autoselect_weight = pinfo->autoselect_weight;
2537 pplayer->economic.gold = pinfo->gold;
2538 pplayer->economic.tax = pinfo->tax;
2539 pplayer->economic.science = pinfo->science;
2540 pplayer->economic.luxury = pinfo->luxury;
2541 pplayer->client.tech_upkeep = pinfo->tech_upkeep;
2542 gov_change = (!new_player && pgov != pplayer->government
2543 && pplayer->government != NULL);
2544 pplayer->government = pgov;
2545 pplayer->target_government = ptarget_gov;
2546 pplayer->real_embassy = pinfo->real_embassy;
2547 pplayer->gives_shared_vision = pinfo->gives_shared_vision;
2548 pplayer->gives_shared_tiles = pinfo->gives_shared_tiles;
2549 pplayer->style = style_by_number(pinfo->style);
2550
2551 if (pplayer == client.conn.playing) {
2552 bool music_change = FALSE;
2553
2554 if (pplayer->music_style != pinfo->music_style) {
2555 pplayer->music_style = pinfo->music_style;
2557 }
2558 if (pplayer->client.mood != pinfo->mood) {
2559 pplayer->client.mood = pinfo->mood;
2561 }
2562
2563 if (music_change) {
2565 }
2566
2567 if (gov_change) {
2568 audio_play_sound(pgov->sound_str, pgov->sound_alt, pgov->sound_alt2);
2569 }
2570 }
2571
2572 pplayer->history = pinfo->history;
2573 pplayer->client.culture = pinfo->culture;
2574
2575 if (pplayer->economic.infra_points != pinfo->infrapoints) {
2576 pplayer->economic.infra_points = pinfo->infrapoints;
2578 }
2579
2580 /* Don't use player_iterate or player_slot_count here, because we ignore
2581 * the real number of players and we want to read all the datas. */
2582 fc_assert(ARRAY_SIZE(pplayer->ai_common.love) >= ARRAY_SIZE(pinfo->love));
2583 for (i = 0; i < ARRAY_SIZE(pinfo->love); i++) {
2584 pplayer->ai_common.love[i] = pinfo->love[i];
2585 }
2586
2588
2589 pplayer->is_connected = pinfo->is_connected;
2590
2591 for (i = 0; i < B_LAST; i++) {
2592 pplayer->wonders[i] = pinfo->wonders[i];
2593 }
2594
2595 /* Set AI.control. */
2596 if (is_ai(pplayer) != BV_ISSET(pinfo->flags, PLRF_AI)) {
2597 BV_SET_VAL(pplayer->flags, PLRF_AI, BV_ISSET(pinfo->flags, PLRF_AI));
2598 if (pplayer == my_player) {
2599 if (is_ai(my_player)) {
2600 output_window_append(ftc_client, _("AI mode is now ON."));
2601 if (!gui_options.ai_manual_turn_done && !pplayer->phase_done) {
2602 /* End turn immediately */
2604 }
2605 } else {
2606 output_window_append(ftc_client, _("AI mode is now OFF."));
2607 }
2608 }
2609 }
2610
2611 pplayer->flags = pinfo->flags;
2612
2613 pplayer->ai_common.science_cost = pinfo->science_cost;
2614
2615 turn_done_changed = (pplayer->phase_done != pinfo->phase_done
2616 || (BV_ISSET(pplayer->flags, PLRF_AI) !=
2617 BV_ISSET(pinfo->flags, PLRF_AI)));
2618 pplayer->phase_done = pinfo->phase_done;
2619
2620 pplayer->is_ready = pinfo->is_ready;
2621 pplayer->nturns_idle = pinfo->nturns_idle;
2622 pplayer->is_alive = pinfo->is_alive;
2623 pplayer->turns_alive = pinfo->turns_alive;
2624 pplayer->ai_common.barbarian_type = pinfo->barbarian_type;
2625 pplayer->revolution_finishes = pinfo->revolution_finishes;
2626 pplayer->ai_common.skill_level = pinfo->ai_skill_level;
2627
2628 fc_assert(pinfo->multip_count == multiplier_count());
2629 game.control.num_multipliers = pinfo->multip_count;
2630 multipliers_iterate(pmul) {
2631 int idx = multiplier_index(pmul);
2632
2633 pplayer->multipliers[idx].value = pinfo->multiplier[idx];
2634 pplayer->multipliers[idx].target = pinfo->multiplier_target[idx];
2635 pplayer->multipliers[idx].changed = pinfo->multiplier_changed[idx];
2637
2638 /* if the server requests that the client reset, then information about
2639 * connections to this player are lost. If this is the case, insert the
2640 * correct conn back into the player->connections list */
2641 if (conn_list_size(pplayer->connections) == 0) {
2643 if (pplayer == pconn->playing) {
2644 /* insert the controller into first position */
2645 if (pconn->observer) {
2647 } else {
2649 }
2650 }
2652 }
2653
2654
2655 /* The player information is now fully set. Update the GUI. */
2656
2657 if (pplayer == my_player && can_client_change_view()) {
2658 if (turn_done_changed) {
2660 }
2667 menus_update();
2668 }
2669
2671
2674
2675 if (is_new_nation) {
2677
2678 /* When changing nation during a running game, some refreshing is needed.
2679 * This may not be the only one! */
2681 }
2682
2683 if (can_client_change_view()) {
2684 /* Just about any changes above require an update to the intelligence
2685 * dialog. */
2686 update_intel_dialog(pplayer);
2687 }
2688
2691 FALSE);
2692}
2693
2694/************************************************************************/
2698{
2699 struct research *presearch;
2700 bool tech_changed = FALSE;
2701 bool poptechup = FALSE;
2703 int gained_techs_num = 0, i;
2705
2706#ifdef FREECIV_DEBUG
2707 log_verbose("Research nb %d inventions: %s",
2708 packet->id,
2709 packet->inventions);
2710#endif
2711 presearch = research_by_number(packet->id);
2713
2714 poptechup = (presearch->researching != packet->researching
2715 || presearch->tech_goal != packet->tech_goal);
2716 presearch->techs_researched = packet->techs_researched;
2717 if (presearch->future_tech == 0 && packet->future_tech > 0) {
2719 }
2720 presearch->future_tech = packet->future_tech;
2721 presearch->researching = packet->researching;
2722 presearch->client.researching_cost = packet->researching_cost;
2723 presearch->bulbs_researched = packet->bulbs_researched;
2724 presearch->tech_goal = packet->tech_goal;
2725 presearch->client.total_bulbs_prod = packet->total_bulbs_prod;
2726
2728 newstate = packet->inventions[advi] - '0';
2730
2731 if (newstate != oldstate) {
2732 if (TECH_KNOWN == newstate) {
2734 if (A_NONE != advi) {
2736 }
2737 } else if (TECH_KNOWN == oldstate) {
2739 }
2740 }
2742
2744
2745 if (C_S_RUNNING == client_state()) {
2747 if (poptechup && is_human(client_player())) {
2749 }
2751 if (tech_changed) {
2752 /* Some ways a new or lost tech can affect menus:
2753 * - If tech is needed for certain governments, the government
2754 * switching menus need updating.
2755 * - If we just learned/lost bridge building and focus is on a
2756 * worker on a river, the road menu item needs updating. */
2757 menus_update();
2758
2759 script_client_signal_emit("new_tech");
2760
2761 /* If we got a new tech the tech tree news an update. */
2763 }
2764 for (i = 0; i < gained_techs_num; i++) {
2766 }
2767 }
2768 if (editor_is_active()) {
2772 FALSE);
2774 }
2775 }
2776}
2777
2778/************************************************************************/
2782{
2784
2785 if (presearch == NULL) {
2786 log_error("Received unknown research for clearing: %d.", id);
2787 return;
2788 }
2789
2790 /* Do we need to set other fields? */
2791 presearch->researching = A_UNKNOWN;
2792 presearch->future_tech = 0;
2793 presearch->tech_goal = A_UNKNOWN;
2794
2798
2799 if (editor_is_active()) {
2803 FALSE);
2805 }
2806}
2807
2808/************************************************************************/
2812{
2813 struct player *plr1 = player_by_number(packet->plr1);
2814 struct player *plr2 = player_by_number(packet->plr2);
2815 struct player *my_player = client_player();
2816 struct player_diplstate *ds = player_diplstate_get(plr1, plr2);
2818
2819 fc_assert_ret(ds != NULL);
2820
2821 if (client_has_player() && my_player == plr2) {
2822 if (ds->type != packet->type) {
2824 }
2825
2826 /* Check if we detect change to armistice with us. If so,
2827 * ready all units for movement out of the territory in
2828 * question; otherwise they will be disbanded. */
2830 && DS_ARMISTICE == packet->type) {
2833 || tile_owner(unit_tile(punit)) != plr1) {
2834 continue;
2835 }
2838 }
2839 if (punit->activity != ACTIVITY_IDLE) {
2841 }
2843 }
2844 }
2845
2846 ds->type = packet->type;
2847 ds->turns_left = packet->turns_left;
2848 ds->has_reason_to_cancel = packet->has_reason_to_cancel;
2849 ds->contact_turns_left = packet->contact_turns_left;
2850
2853 }
2854
2857 /* An action selection dialog is open and our diplomatic state just
2858 * changed. Find out if the relationship that changed was to a
2859 * potential target. */
2860 struct tile *tgt_tile = NULL;
2861
2862 /* Is a refresh needed because of a unit target? */
2864 struct unit *tgt_unit;
2865
2867
2868 if (tgt_unit != NULL && tgt_unit->owner == plr1) {
2869 /* An update is needed because of this unit target. */
2872 }
2873 }
2874
2875 /* Is a refresh needed because of a city target? */
2877 struct city *tgt_city;
2878
2880
2881 if (tgt_city != NULL && tgt_city->owner == plr1) {
2882 /* An update is needed because of this city target.
2883 * Overwrites any target tile from a unit. */
2886 }
2887 }
2888
2889 if (tgt_tile
2890 || ((tgt_tile = index_to_tile(&(wld.map),
2892 && tile_owner(tgt_tile) == plr1)) {
2893 /* The diplomatic relationship to the target in an open action
2894 * selection dialog have changed. This probably changes
2895 * the set of available actions. */
2899 tgt_tile->index,
2902 }
2903 }
2904}
2905
2906/************************************************************************/
2913{
2914 struct connection *pconn = conn_by_number(pinfo->id);
2916
2917 log_debug("conn_info id%d used%d est%d plr%d obs%d acc%d",
2918 pinfo->id, pinfo->used, pinfo->established, pinfo->player_num,
2919 pinfo->observer, (int) pinfo->access_level);
2920 log_debug("conn_info \"%s\" \"%s\" \"%s\"",
2921 pinfo->username, pinfo->addr, pinfo->capability);
2922
2923 if (!pinfo->used) {
2924 /* Forget the connection */
2925 if (!pconn) {
2926 log_verbose("Server removed unknown connection %d", pinfo->id);
2927 return;
2928 }
2930 pconn = NULL;
2931 } else {
2932 struct player_slot *pslot = player_slot_by_number(pinfo->player_num);
2933 struct player *pplayer = NULL;
2934
2935 if (NULL != pslot) {
2936 pplayer = player_slot_get_player(pslot);
2937 }
2938
2939 if (!pconn) {
2940 log_verbose("Server reports new connection %d %s",
2941 pinfo->id, pinfo->username);
2942
2943 pconn = fc_calloc(1, sizeof(struct connection));
2944 pconn->buffer = NULL;
2945 pconn->send_buffer = NULL;
2946 pconn->ping_time = -1.0;
2947 if (pplayer) {
2949 }
2952 } else {
2953 log_packet("Server reports updated connection %d %s",
2954 pinfo->id, pinfo->username);
2955 if (pplayer != pconn->playing) {
2956 if (NULL != pconn->playing) {
2957 conn_list_remove(pconn->playing->connections, pconn);
2958 }
2959 if (pplayer) {
2961 }
2962 }
2963 }
2964
2965 pconn->id = pinfo->id;
2966 pconn->established = pinfo->established;
2967 pconn->observer = pinfo->observer;
2968 pconn->access_level = pinfo->access_level;
2969 pconn->playing = pplayer;
2970
2971 sz_strlcpy(pconn->username, pinfo->username);
2972 sz_strlcpy(pconn->addr, pinfo->addr);
2973 sz_strlcpy(pconn->capability, pinfo->capability);
2974
2975 if (pinfo->id == client.conn.id) {
2976 /* NB: In this case, pconn is not a duplication of client.conn.
2977 *
2978 * pconn->addr is our address that the server knows whereas
2979 * client.conn.addr is the address to the server. Also,
2980 * pconn->capability stores our capabilites known at server side
2981 * whereas client.conn.capability represents the capabilities of the
2982 * server. */
2983 if (client.conn.playing != pplayer
2984 || client.conn.observer != pinfo->observer) {
2985 /* Our connection state changed, let prepare the changes and reset
2986 * the game. */
2988 }
2989
2990 /* Copy our current state into the static structure (our connection
2991 * to the server). */
2992 client.conn.established = pinfo->established;
2993 client.conn.observer = pinfo->observer;
2994 client.conn.access_level = pinfo->access_level;
2995 client.conn.playing = pplayer;
2996 sz_strlcpy(client.conn.username, pinfo->username);
2997 }
2998 }
2999
3002
3003 if (pinfo->used && pinfo->id == client.conn.id) {
3004 /* For updating the sensitivity of the "Edit Mode" menu item,
3005 * among other things. */
3006 menus_update();
3007 }
3008
3011 }
3012}
3013
3014/************************************************************************/
3018void handle_conn_ping_info(int connections, const int *conn_id,
3019 const float *ping_time)
3020{
3021 int i;
3022
3023 for (i = 0; i < connections; i++) {
3024 struct connection *pconn = conn_by_number(conn_id[i]);
3025
3026 if (!pconn) {
3027 continue;
3028 }
3029
3030 pconn->ping_time = ping_time[i];
3031 log_debug("conn-id=%d, ping=%fs", pconn->id, pconn->ping_time);
3032 }
3033 /* The old_ping_time data is ignored. */
3034
3036}
3037
3038/************************************************************************/
3041void handle_achievement_info(int id, bool gained, bool first)
3042{
3043 struct achievement *pach;
3044
3046 log_error("Received illegal achievement info %d", id);
3047 return;
3048 }
3049
3051
3052 if (gained) {
3053 BV_SET(pach->achievers, player_index(client_player()));
3054 } else {
3055 BV_CLR(pach->achievers, player_index(client_player()));
3056 }
3057
3058 if (first) {
3059 pach->first = client_player();
3060 }
3061}
3062
3063/************************************************************************/
3078static bool spaceship_autoplace(struct player *pplayer,
3079 struct player_spaceship *ship)
3080{
3083
3084 if (next_spaceship_component(pplayer, ship, &place)) {
3086
3087 return TRUE;
3088 }
3089 }
3090
3091 return FALSE;
3092}
3093
3094/************************************************************************/
3098{
3099 struct player_spaceship *ship;
3100 struct player *pplayer = player_by_number(p->player_num);
3101
3102 fc_assert_ret_msg(NULL != pplayer, "Invalid player number %d.",
3103 p->player_num);
3104
3105 ship = &pplayer->spaceship;
3106 ship->state = p->sship_state;
3107 ship->structurals = p->structurals;
3108 ship->components = p->components;
3109 ship->modules = p->modules;
3110 ship->fuel = p->fuel;
3111 ship->propulsion = p->propulsion;
3112 ship->habitation = p->habitation;
3113 ship->life_support = p->life_support;
3114 ship->solar_panels = p->solar_panels;
3115 ship->launch_year = p->launch_year;
3116 ship->population = p->population;
3117 ship->mass = p->mass;
3118 ship->support_rate = p->support_rate;
3119 ship->energy_rate = p->energy_rate;
3120 ship->success_rate = p->success_rate;
3121 ship->travel_time = p->travel_time;
3122 ship->structure = p->structure;
3123
3124 if (pplayer != client_player()) {
3125 refresh_spaceship_dialog(pplayer);
3126 menus_update();
3127 return;
3128 }
3129
3130 if (!spaceship_autoplace(pplayer, ship)) {
3131 /* We refresh the dialog when the packet did *not* cause placing
3132 * of new part. That's because those cases where part is placed, are
3133 * followed by exactly one case where there's no more parts to place -
3134 * we want to refresh the dialog only when that last packet comes. */
3135 refresh_spaceship_dialog(pplayer);
3136 }
3137}
3138
3139/**********************************************************************/
3145{
3146 if (cont1 == cont2) {
3147 return nullptr;
3148 } else if (cont1 >= 0 && cont2 <= 0) {
3149 return &wld.map.client.adj_matrix[cont1][-cont2];
3150 } else if (cont1 <= 0 && cont2 >= 0) {
3151 return &wld.map.client.adj_matrix[cont2][-cont1];
3152 }
3153 return nullptr;
3154}
3155
3156/**********************************************************************/
3163static inline void update_continent_cache(const struct tile *ptile,
3166{
3167 /* Update known continents */
3169 int cont;
3170
3171 /* Expand sizes array */
3173 (new_cont + 1) * sizeof(*wld.map.continent_sizes));
3174
3175 /* Expand adjacency matrix */
3177 (new_cont + 1) * sizeof(*wld.map.client.adj_matrix));
3178
3179 /* Initialize new spots */
3180 for (cont = wld.map.num_continents + 1; cont <= new_cont; cont++) {
3181 wld.map.continent_sizes[cont] = 0;
3183 sizeof(*wld.map.client.adj_matrix[cont]));
3184 }
3185
3187 } else if (new_cont < -wld.map.num_oceans) {
3188 int cont, ocean;
3189
3190 /* Expand sizes array */
3192 (-new_cont + 1) * sizeof(*wld.map.ocean_sizes));
3193
3194 /* Initialize new spots */
3195 for (ocean = wld.map.num_oceans + 1; ocean <= -new_cont; ocean++) {
3196 wld.map.ocean_sizes[ocean] = 0;
3197 }
3198
3199 /* Expand adjacency matrix */
3200 for (cont = 0; cont <= wld.map.num_continents; cont++) {
3202 wld.map.client.adj_matrix[cont],
3203 (-new_cont + 1) * sizeof(*wld.map.client.adj_matrix[cont])
3204 );
3205
3206 for (ocean = wld.map.num_oceans + 1; ocean <= -new_cont; ocean++) {
3207 wld.map.client.adj_matrix[cont][ocean] = 0;
3208 }
3209 }
3210
3212 }
3213
3214 /* Decrement old continent/ocean size */
3215 if (old_cont > 0) {
3217 } else if (old_cont < 0) {
3219 }
3220
3221 /* Increment new continent/ocean size */
3222 if (new_cont > 0) {
3224 } else if (new_cont < 0) {
3226 }
3227
3228 /* Update tile adjacency counts */
3229 adjc_iterate(&(wld.map), ptile, adj_tile) {
3231 int *padjc_count;
3232
3233 /* Decrement old adjacency */
3235 if (padjc_count) {
3236 fc_assert(*padjc_count > 0);
3237 (*padjc_count)--;
3238 }
3239
3240 /* Increment new adjacency */
3242 if (padjc_count) {
3243 (*padjc_count)++;
3244 }
3246}
3247
3248/************************************************************************/
3251void handle_tile_info(const struct packet_tile_info *packet)
3252{
3253 enum known_type new_known;
3254 enum known_type old_known;
3255 bool known_changed = FALSE;
3256 bool tile_changed = FALSE;
3257 struct player *powner = player_by_number(packet->owner);
3258 struct player *eowner = player_by_number(packet->extras_owner);
3259 struct extra_type *presource = NULL;
3260 struct terrain *pterrain = terrain_by_number(packet->terrain);
3261 struct tile *ptile = index_to_tile(&(wld.map), packet->tile);
3262
3263 fc_assert_ret_msg(NULL != ptile, "Invalid tile index %d.", packet->tile);
3265
3266 if (packet->resource != MAX_EXTRA_TYPES) {
3267 presource = extra_by_number(packet->resource);
3268 }
3269
3270 if (NULL == tile_terrain(ptile) || pterrain != tile_terrain(ptile)) {
3272 switch (old_known) {
3273 case TILE_UNKNOWN:
3274 tile_set_terrain(ptile, pterrain);
3275 break;
3276 case TILE_KNOWN_UNSEEN:
3277 case TILE_KNOWN_SEEN:
3278 if (NULL != pterrain || TILE_UNKNOWN == packet->known) {
3279 tile_set_terrain(ptile, pterrain);
3280 } else {
3282 log_error("handle_tile_info() unknown terrain (%d, %d).",
3283 TILE_XY(ptile));
3284 }
3285 break;
3286 };
3287 }
3288
3289 if (!BV_ARE_EQUAL(ptile->extras, packet->extras)) {
3290 ptile->extras = packet->extras;
3292 }
3293
3294 tile_changed = tile_changed || (tile_resource(ptile) != presource);
3295
3296 /* Always called after setting terrain */
3297 tile_set_resource(ptile, presource);
3298
3299 if (tile_owner(ptile) != powner) {
3300 tile_set_owner(ptile, powner, NULL);
3302 }
3303 if (extra_owner(ptile) != eowner) {
3304 ptile->extras_owner = eowner;
3306 }
3307
3308 ptile->altitude = packet->altitude;
3309
3310 if (packet->placing < 0) {
3311 if (ptile->placing != NULL) {
3313 ptile->placing = NULL;
3314 ptile->infra_turns = 0;
3315 }
3316 } else {
3317 struct extra_type *old = ptile->placing;
3318
3319 ptile->placing = extra_by_number(packet->placing);
3320 if (ptile->placing != old
3321 || ptile->infra_turns != packet->place_turn - game.info.turn) {
3323 }
3324 ptile->infra_turns = packet->place_turn - game.info.turn;
3325 }
3326
3327 if (NULL == tile_worked(ptile)
3328 || tile_worked(ptile)->id != packet->worked) {
3329 if (IDENTITY_NUMBER_ZERO != packet->worked) {
3330 struct city *pwork = game_city_by_number(packet->worked);
3331
3332 if (NULL == pwork) {
3333 char named[MAX_LEN_CITYNAME];
3334
3335 /* New unseen ("invisible") city, or before city_info */
3336 fc_snprintf(named, sizeof(named), "%06u", packet->worked);
3337
3338 pwork = create_city_virtual(invisible.placeholder, NULL, named);
3339 pwork->id = packet->worked;
3341
3343
3344 log_debug("(%d,%d) invisible city %d, %s",
3345 TILE_XY(ptile), pwork->id, city_name_get(pwork));
3346 } else if (NULL == city_tile(pwork)) {
3347 /* Old unseen ("invisible") city, or before city_info */
3348 if (NULL != powner && city_owner(pwork) != powner) {
3349 /* Update placeholder with current owner */
3350 pwork->owner = powner;
3351 pwork->original = NULL;
3352 }
3353 } else {
3354 /* We have a real (not invisible) city record for this ID, but
3355 * perhaps our info about that city is out of date. */
3356 int dist_sq = sq_map_distance(city_tile(pwork), ptile);
3357
3359 /* This is probably enemy city which has grown in diameter since we
3360 * last saw it. We need city_radius_sq to be at least big enough so
3361 * that all workers fit in, so set it so. */
3363 }
3364 /* This might be a known city that is open in a dialog.
3365 * (And this might be our only prompt to refresh the worked tiles
3366 * display in its city map, if a worker rearrangement does not
3367 * change anything else about the city such as output.) */
3368 {
3369 struct city *oldwork = tile_worked(ptile);
3370 if (oldwork && NULL != city_tile(oldwork)) {
3371 /* Refresh previous city too if it's real and different */
3373 }
3374 /* Refresh new city working tile (which we already know is real) */
3376 }
3377 }
3378
3379 /* This marks tile worked by (possibly invisible) city. Other
3380 * parts of the code have to handle invisible cities correctly
3381 * (ptile->worked->tile == NULL) */
3382 tile_set_worked(ptile, pwork);
3383 } else {
3384 /* Tile is no longer being worked by a city.
3385 * (Again, this might be our only prompt to refresh the worked tiles
3386 * display for the previous working city.) */
3387 if (tile_worked(ptile) && NULL != city_tile(tile_worked(ptile))) {
3389 }
3390 tile_set_worked(ptile, NULL);
3391 }
3392
3394 }
3395
3396 if (old_known != packet->known) {
3398 }
3399
3400 if (NULL != client.conn.playing) {
3405
3406 switch (packet->known) {
3407 case TILE_KNOWN_SEEN:
3412 break;
3413 case TILE_KNOWN_UNSEEN:
3415 break;
3416 case TILE_UNKNOWN:
3417 break;
3418 default:
3419 log_error("handle_tile_info() invalid known (%d).", packet->known);
3420 break;
3421 };
3422 }
3424
3425 if (packet->spec_sprite[0] != '\0') {
3426 if (!ptile->spec_sprite
3427 || strcmp(ptile->spec_sprite, packet->spec_sprite) != 0) {
3428 if (ptile->spec_sprite) {
3429 free(ptile->spec_sprite);
3430 }
3431 ptile->spec_sprite = fc_strdup(packet->spec_sprite);
3433 }
3434 } else {
3435 if (ptile->spec_sprite) {
3436 free(ptile->spec_sprite);
3437 ptile->spec_sprite = NULL;
3439 }
3440 }
3441
3443 /* This is an error. So first we log the error,
3444 * then make an assertion. */
3445 unit_list_iterate(ptile->units, punit) {
3446 log_error("%p %d %s at (%d,%d) %s", punit, punit->id,
3450 fc_assert_msg(0 == unit_list_size(ptile->units), "Ghost units seen");
3451 /* Repairing... */
3452 unit_list_clear(ptile->units);
3453 }
3454
3455 if (ptile->continent != packet->continent) {
3456 update_continent_cache(ptile, ptile->continent, packet->continent);
3457 }
3458 ptile->continent = packet->continent;
3459
3460 if (packet->label[0] == '\0') {
3461 if (ptile->label != NULL) {
3462 FC_FREE(ptile->label);
3463 ptile->label = NULL;
3465 }
3466 } else if (ptile->label == NULL || strcmp(packet->label, ptile->label)) {
3467 tile_set_label(ptile, packet->label);
3469 }
3470
3471 if (known_changed || tile_changed) {
3472 /*
3473 * A tile can only change if it was known before and is still
3474 * known. In the other cases the tile is new or removed.
3475 */
3477 agents_tile_new(ptile);
3478 } else if (known_changed && TILE_KNOWN_UNSEEN == new_known) {
3479 agents_tile_remove(ptile);
3480 } else {
3481 agents_tile_changed(ptile);
3482 }
3484 }
3485
3486 /* refresh tiles */
3487 if (can_client_change_view()) {
3488 /* the tile itself (including the necessary parts of adjacent tiles) */
3489 if (tile_changed || old_known != new_known) {
3491 }
3492 }
3493
3494 /* update menus if the focus unit is on the tile. */
3495 if (tile_changed) {
3496 if (get_focus_unit_on_tile(ptile)) {
3497 menus_update();
3498 }
3499 }
3500
3501 /* FIXME: we really ought to call refresh_city_dialog() for any city
3502 * whose radii include this tile, to update the city map display.
3503 * But that would be expensive. We deal with the (common) special
3504 * case of changes in worked tiles above. */
3505}
3506
3507/************************************************************************/
3527
3528/************************************************************************/
3531void handle_scenario_description(const char *description)
3532{
3534
3536}
3537
3538/************************************************************************/
3544{
3545 /* The ruleset is going to load new nations. So close
3546 * the nation selection dialog if it is open. */
3548
3554 game.control = *packet;
3555
3556 /* check the values! */
3557#define VALIDATE(_count, _maximum, _string) \
3558 if (game.control._count > _maximum) { \
3559 log_error("handle_ruleset_control(): Too many " _string \
3560 "; using %d of %d", _maximum, game.control._count); \
3561 game.control._count = _maximum; \
3562 }
3563
3564 VALIDATE(num_unit_classes, UCL_LAST, "unit classes");
3565 VALIDATE(num_unit_types, U_LAST, "unit types");
3566 VALIDATE(num_impr_types, B_LAST, "improvements");
3567 VALIDATE(num_tech_types, A_LAST, "advances");
3568 VALIDATE(num_base_types, MAX_EXTRA_TYPES, "bases");
3569 VALIDATE(num_road_types, MAX_EXTRA_TYPES, "roads");
3570 VALIDATE(num_resource_types, MAX_EXTRA_TYPES, "resources");
3571 VALIDATE(num_disaster_types, MAX_DISASTER_TYPES, "disasters");
3572 VALIDATE(num_achievement_types, MAX_ACHIEVEMENT_TYPES, "achievements");
3573 VALIDATE(num_counters, MAX_COUNTERS, "counters");
3574
3575 /* game.control.government_count, game.control.nation_count and
3576 * game.control.num_city_styles are allocated dynamically, and do
3577 * not need a size check. See the allocation below. */
3578
3580
3581 VALIDATE(num_specialist_types, SP_MAX, "specialists");
3582#undef VALIDATE
3583
3589
3590 if (game.control.desc_length > 0) {
3592 game.ruleset_description[0] = '\0';
3593 }
3594
3595 if (packet->preferred_tileset[0] != '\0') {
3596 /* There is tileset suggestion */
3598 /* It's not currently in use */
3601 } else {
3603 }
3604 }
3605 }
3606
3607 if (packet->preferred_soundset[0] != '\0') {
3608 /* There is soundset suggestion */
3610 /* It's not currently in use */
3613 } else {
3615 }
3616 }
3617 }
3618
3619 if (packet->preferred_musicset[0] != '\0') {
3620 /* There is musicset suggestion */
3622 /* It's not currently in use */
3625 } else {
3627 }
3628 }
3629 }
3630
3632
3634}
3635
3636/************************************************************************/
3640{
3641 int len;
3642
3643 if (game.ruleset_summary != NULL) {
3645 }
3646
3647 len = strlen(packet->text);
3648
3650
3651 fc_strlcpy(game.ruleset_summary, packet->text, len + 1);
3652}
3653
3654/************************************************************************/
3663
3664/************************************************************************/
3668{
3669 /* Setup extra hiders caches */
3670 extra_type_iterate(pextra) {
3671 pextra->hiders = extra_type_list_new();
3673 if (BV_ISSET(pextra->hidden_by, extra_index(phider))) {
3674 extra_type_list_append(pextra->hiders, phider);
3675 }
3677 pextra->bridged = extra_type_list_new();
3679 if (BV_ISSET(pextra->bridged_over, extra_index(pbridged))) {
3680 extra_type_list_append(pextra->bridged, pbridged);
3681 }
3684
3689
3690 /* Setup improvement feature caches */
3692
3693 /* Setup road integrators caches */
3695
3696 /* Pre calculate action related data. */
3698
3699 /* Setup unit unknown move cost caches */
3701 ptype->unknown_move_cost = utype_unknown_move_cost(ptype);
3705
3706 /* Cache what city production can receive help from caravans. */
3708
3709 /* Adjust editor for changed ruleset. */
3711
3712 /* We are not going to crop any more sprites from big sprites, free them. */
3714
3716}
3717
3718/************************************************************************/
3722{
3723 struct unit_class *c = uclass_by_number(p->id);
3724
3725 fc_assert_ret_msg(NULL != c, "Bad unit_class %d.", p->id);
3726
3727 names_set(&c->name, NULL, p->name, p->rule_name);
3728 c->min_speed = p->min_speed;
3729 c->hp_loss_pct = p->hp_loss_pct;
3731 c->flags = p->flags;
3732
3734}
3735
3736/************************************************************************/
3740{
3741 int i;
3742 struct unit_type *u = utype_by_number(p->id);
3743
3744 fc_assert_ret_msg(NULL != u, "Bad unit_type %d.", p->id);
3745
3746 names_set(&u->name, NULL, p->name, p->rule_name);
3754
3756 u->build_cost = p->build_cost;
3757 u->pop_cost = p->pop_cost;
3761 u->move_rate = p->move_rate;
3765 u->hp = p->hp;
3766 u->firepower = p->firepower;
3769 u->convert_time = p->convert_time;
3770 u->fuel = p->fuel;
3771 u->flags = p->flags;
3772 u->roles = p->roles;
3773 u->happy_cost = p->happy_cost;
3775 u->upkeep[o] = p->upkeep[o];
3778 u->bombard_rate = p->bombard_rate;
3779 u->city_size = p->city_size;
3780 u->city_slots = p->city_slots;
3781 u->tp_defense = p->tp_defense;
3782 u->cargo = p->cargo;
3783 u->targets = p->targets;
3784 u->embarks = p->embarks;
3785 u->disembarks = p->disembarks;
3786 u->vlayer = p->vlayer;
3787
3788 if (p->veteran_levels == 0) {
3789 u->veteran = NULL;
3790 } else {
3792
3793 for (i = 0; i < p->veteran_levels; i++) {
3795 p->power_fact[i], p->move_bonus[i],
3796 p->base_raise_chance[i],
3797 p->work_raise_chance[i]);
3798 }
3799 }
3800
3802
3803 u->adv.worker = p->worker;
3804
3806}
3807
3808/************************************************************************/
3812{
3813 struct unit_type *u = utype_by_number(p->unit);
3814 struct combat_bonus *bonus;
3815
3816 fc_assert_ret_msg(NULL != u, "Bad unit_type %d.", p->unit);
3817
3818 bonus = malloc(sizeof(*bonus));
3819
3820 bonus->flag = p->flag;
3821 bonus->type = p->type;
3822 bonus->value = p->value;
3823 bonus->quiet = p->quiet;
3824
3826}
3827
3828/************************************************************************/
3832{
3833 const char *flagname;
3834 const char *helptxt;
3835
3836 fc_assert_ret_msg(p->id >= UTYF_USER_FLAG_1 && p->id <= UTYF_LAST_USER_FLAG, "Bad user flag %d.", p->id);
3837
3838 if (p->name[0] == '\0') {
3839 flagname = NULL;
3840 } else {
3841 flagname = p->name;
3842 }
3843
3844 if (p->helptxt[0] == '\0') {
3845 helptxt = NULL;
3846 } else {
3847 helptxt = p->helptxt;
3848 }
3849
3851}
3852
3853/************************************************************************/
3857 const struct packet_ruleset_unit_class_flag *p)
3858{
3859 const char *flagname;
3860 const char *helptxt;
3861
3863 "Bad user flag %d.", p->id);
3864
3865 if (p->name[0] == '\0') {
3866 flagname = NULL;
3867 } else {
3868 flagname = p->name;
3869 }
3870
3871 if (p->helptxt[0] == '\0') {
3872 helptxt = NULL;
3873 } else {
3874 helptxt = p->helptxt;
3875 }
3876
3878}
3879
3880/************************************************************************/
3886static int unpack_tech_req(const enum tech_req r_num,
3887 const struct requirement_vector *reqs,
3888 struct advance *a,
3889 int i)
3890{
3893 /* Extract the tech req so the old code can reason about it. */
3894
3895 /* This IS a traditional tech req... right? */
3898
3899 /* Put it in the advance structure. */
3900 a->require[r_num] = requirement_vector_get(reqs, i)->source.value.advance;
3901
3902 /* Move on in the requirement vector. */
3903 i++;
3904 } else {
3905 /* No tech req. */
3907 }
3908
3909 return i;
3910}
3911
3912/************************************************************************/
3916{
3917 int i;
3918 struct advance *a = advance_by_number(p->id);
3919
3920 fc_assert_ret_msg(NULL != a, "Bad advance %d.", p->id);
3921
3922 names_set(&a->name, NULL, p->name, p->rule_name);
3925
3926 i = 0;
3927
3929 if (p->tclass >= 0) {
3931 } else {
3932 a->tclass = NULL;
3933 }
3934
3935 /* The tech requirements req1 and req2 are send inside research_reqs
3936 * since they too are required to be fulfilled before the tech can be
3937 * researched. */
3938
3939 if (p->removed) {
3940 /* The Freeciv data structures currently records that a tech is removed
3941 * by setting req1 and req2 to "Never". */
3942 a->require[AR_ONE] = A_NEVER;
3943 a->require[AR_TWO] = A_NEVER;
3944 } else {
3945 /* Unpack req1 and req2 from the research_reqs requirement vector. */
3948 }
3949
3950 /* Any remaining requirements are a part of the research_reqs requirement
3951 * vector. */
3953 /* slice of the vector starting at index i */
3954 &(const struct requirement_vector) {
3955 .p = p->research_reqs.p + i,
3956 .size = p->research_reqs.size - i,
3957 /* .size_alloc shouldn't matter */
3958 });
3959
3960 /* The packet's research_reqs should contain req1, req2 and the
3961 * requirements of the tech's research_reqs. */
3962 fc_assert((a->research_reqs.size
3963 + ((a->require[AR_ONE]
3964 && (advance_number(a->require[AR_ONE]) != A_NONE)) ?
3965 1 : 0)
3966 + ((a->require[AR_TWO]
3967 && (advance_number(a->require[AR_TWO]) != A_NONE)) ?
3968 1 : 0))
3970
3972
3973 a->flags = p->flags;
3974 a->cost = p->cost;
3975 a->num_reqs = p->num_reqs;
3977
3979}
3980
3981/************************************************************************/
3985{
3987
3988 fc_assert_ret_msg(NULL != ptclass, "Bad tech_class %d.", p->id);
3989
3990 names_set(&ptclass->name, NULL, p->name, p->rule_name);
3991 ptclass->cost_pct = p->cost_pct;
3992}
3993
3994/************************************************************************/
3998{
3999 const char *flagname;
4000 const char *helptxt;
4001
4002 fc_assert_ret_msg(p->id >= TECH_USER_1 && p->id <= TECH_USER_LAST, "Bad user flag %d.", p->id);
4003
4004 if (p->name[0] == '\0') {
4005 flagname = NULL;
4006 } else {
4007 flagname = p->name;
4008 }
4009
4010 if (p->helptxt[0] == '\0') {
4011 helptxt = NULL;
4012 } else {
4013 helptxt = p->helptxt;
4014 }
4015
4016 set_user_tech_flag_name(p->id, flagname, helptxt);
4017}
4018
4019/************************************************************************/
4023{
4024 struct impr_type *b = improvement_by_number(p->id);
4025
4026 fc_assert_ret_msg(NULL != b, "Bad improvement %d.", p->id);
4027
4028 b->genus = p->genus;
4029 names_set(&b->name, NULL, p->name, p->rule_name);
4035 b->build_cost = p->build_cost;
4036 b->upkeep = p->upkeep;
4037 b->sabotage = p->sabotage;
4038 b->flags = p->flags;
4043
4044#ifdef FREECIV_DEBUG
4045 if (p->id == improvement_count() - 1) {
4047 log_debug("Improvement: %s...", improvement_rule_name(bdbg));
4048 log_debug(" build_cost %3d", bdbg->build_cost);
4049 log_debug(" upkeep %2d", bdbg->upkeep);
4050 log_debug(" sabotage %3d", bdbg->sabotage);
4051 if (NULL != bdbg->helptext) {
4052 strvec_iterate(bdbg->helptext, text) {
4053 log_debug(" helptext %s", text);
4055 }
4057 }
4058#endif /* FREECIV_DEBUG */
4059
4061}
4062
4063/************************************************************************/
4067{
4068 const char *flagname;
4069 const char *helptxt;
4070
4072 "Bad user flag %d.", p->id);
4073
4074 if (p->name[0] == '\0') {
4075 flagname = NULL;
4076 } else {
4077 flagname = p->name;
4078 }
4079
4080 if (p->helptxt[0] == '\0') {
4081 helptxt = NULL;
4082 } else {
4083 helptxt = p->helptxt;
4084 }
4085
4086 set_user_impr_flag_name(p->id, flagname, helptxt);
4087}
4088
4089/************************************************************************/
4093{
4094 struct multiplier *pmul = multiplier_by_number(p->id);
4095
4096 fc_assert_ret_msg(NULL != pmul, "Bad multiplier %d.", p->id);
4097
4098 pmul->start = p->start;
4099 pmul->stop = p->stop;
4100 pmul->step = p->step;
4101 pmul->def = p->def;
4102 pmul->offset = p->offset;
4103 pmul->factor = p->factor;
4104 pmul->minimum_turns = p->minimum_turns;
4105
4106 names_set(&pmul->name, NULL, p->name, p->rule_name);
4107 requirement_vector_copy(&pmul->reqs, &p->reqs);
4109}
4110
4111/************************************************************************/
4115{
4116 struct government *gov = government_by_number(p->id);
4117
4118 fc_assert_ret_msg(NULL != gov, "Bad government %d.", p->id);
4119
4120 gov->item_number = p->id;
4121
4122 requirement_vector_copy(&gov->reqs, &p->reqs);
4123 names_set(&gov->name, NULL, p->name, p->rule_name);
4126 sz_strlcpy(gov->sound_str, p->sound_str);
4127 sz_strlcpy(gov->sound_alt, p->sound_alt);
4129 gov->flags = p->flags;
4130
4132
4134}
4135
4136/************************************************************************/
4140 (const struct packet_ruleset_government_ruler_title *packet)
4141{
4142 struct government *gov = government_by_number(packet->gov);
4143
4144 fc_assert_ret_msg(NULL != gov, "Bad government %d.", packet->gov);
4145
4147 packet->male_title,
4148 packet->female_title);
4149}
4150
4151/************************************************************************/
4155{
4156 const char *flagname;
4157 const char *helptxt;
4158
4160 "Bad user flag %d.", p->id);
4161
4162 if (p->name[0] == '\0') {
4163 flagname = nullptr;
4164 } else {
4165 flagname = p->name;
4166 }
4167
4168 if (p->helptxt[0] == '\0') {
4169 helptxt = nullptr;
4170 } else {
4171 helptxt = p->helptxt;
4172 }
4173
4174 set_user_gov_flag_name(p->id, flagname, helptxt);
4175}
4176
4177/************************************************************************/
4181{
4182 int j;
4183 struct terrain *pterrain = terrain_by_number(p->id);
4184
4185 fc_assert_ret_msg(NULL != pterrain, "Bad terrain %d.", p->id);
4186
4187 pterrain->tclass = p->tclass;
4188 pterrain->native_to = p->native_to;
4189 names_set(&pterrain->name, NULL, p->name, p->rule_name);
4190 sz_strlcpy(pterrain->graphic_str, p->graphic_str);
4191 sz_strlcpy(pterrain->graphic_alt, p->graphic_alt);
4192 sz_strlcpy(pterrain->graphic_alt2, p->graphic_alt2);
4193 pterrain->movement_cost = p->movement_cost;
4194 pterrain->defense_bonus = p->defense_bonus;
4195
4197 pterrain->output[o] = p->output[o];
4199
4200 if (pterrain->resources != NULL) {
4201 free(pterrain->resources);
4202 }
4203 pterrain->resources = fc_calloc(p->num_resources + 1,
4204 sizeof(*pterrain->resources));
4205 if (pterrain->resource_freq != NULL) {
4206 free(pterrain->resource_freq);
4207 }
4208 pterrain->resource_freq = fc_calloc(p->num_resources + 1,
4209 sizeof(*pterrain->resource_freq));
4210 for (j = 0; j < p->num_resources; j++) {
4211 pterrain->resources[j] = extra_by_number(p->resources[j]);
4212 if (!pterrain->resources[j]) {
4213 log_error("handle_ruleset_terrain() "
4214 "Mismatched resource %d for terrain \"%s\".",
4215 p->resources[j], terrain_rule_name(pterrain));
4216 }
4217 pterrain->resource_freq[j] = p->resource_freq[j];
4218 }
4219 pterrain->resources[p->num_resources] = NULL;
4220 pterrain->resource_freq[p->num_resources] = 0;
4221
4225
4226 pterrain->base_time = p->base_time;
4227 pterrain->road_time = p->road_time;
4229 pterrain->cultivate_time = p->cultivate_time;
4231 pterrain->plant_time = p->plant_time;
4233 pterrain->irrigation_time = p->irrigation_time;
4235 pterrain->mining_time = p->mining_time;
4236 if (p->animal < 0) {
4237 pterrain->animal = NULL;
4238 } else {
4239 pterrain->animal = utype_by_number(p->animal);
4240 }
4242 pterrain->transform_time = p->transform_time;
4243 pterrain->placing_time = p->placing_time;
4244 pterrain->pillage_time = p->pillage_time;
4245
4246 for (j = 0; j < p->extra_count; j++) {
4247 pterrain->extra_removal_times[j] = p->extra_removal_times[j];
4248 }
4249
4250 pterrain->flags = p->flags;
4251
4252 fc_assert_ret(pterrain->rgb == NULL);
4253 pterrain->rgb = rgbcolor_new(p->color_red, p->color_green, p->color_blue);
4254
4256
4258}
4259
4260/************************************************************************/
4264{
4265 const char *flagname;
4266 const char *helptxt;
4267
4268 fc_assert_ret_msg(p->id >= TER_USER_1 && p->id <= TER_USER_LAST, "Bad user flag %d.", p->id);
4269
4270 if (p->name[0] == '\0') {
4271 flagname = NULL;
4272 } else {
4273 flagname = p->name;
4274 }
4275
4276 if (p->helptxt[0] == '\0') {
4277 helptxt = NULL;
4278 } else {
4279 helptxt = p->helptxt;
4280 }
4281
4283}
4284
4285/************************************************************************/
4289{
4290 struct resource_type *presource;
4291
4292 if (p->id < 0 || p->id > MAX_EXTRA_TYPES) {
4293 log_error("Bad resource %d.", p->id);
4294 return;
4295 }
4296
4297 presource = resource_type_init(extra_by_number(p->id));
4298
4300 presource->output[o] = p->output[o];
4302}
4303
4304/************************************************************************/
4308{
4309 struct extra_type *pextra = extra_by_number(p->id);
4310 int i;
4311 bool cbase;
4312 bool croad;
4313 bool cres;
4314
4315 fc_assert_ret_msg(NULL != pextra, "Bad extra %d.", p->id);
4316
4317 names_set(&pextra->name, NULL, p->name, p->rule_name);
4318
4319 pextra->category = p->category;
4320
4321 pextra->causes = 0;
4322 for (i = 0; i < EC_COUNT; i++) {
4323 if (BV_ISSET(p->causes, i)) {
4324 pextra->causes |= (1 << i);
4325 }
4326 }
4327
4328 pextra->rmcauses = 0;
4329 for (i = 0; i < ERM_COUNT; i++) {
4330 if (BV_ISSET(p->rmcauses, i)) {
4331 pextra->rmcauses |= (1 << i);
4332 }
4333 }
4334
4335 if (pextra->causes == 0) {
4337 } else {
4338 for (i = 0; i < EC_COUNT; i++) {
4339 if (is_extra_caused_by(pextra, i)) {
4340 extra_to_caused_by_list(pextra, i);
4341 }
4342 }
4343 }
4344
4345 cbase = is_extra_caused_by(pextra, EC_BASE);
4346 croad = is_extra_caused_by(pextra, EC_ROAD);
4348 if (cbase) {
4349 /* Index is one less than size of list when this base is already added. */
4351 }
4352 if (croad) {
4353 /* Index is one less than size of list when this road is already added. */
4355 }
4356 if (!cbase && !croad && !cres) {
4359 }
4360
4361 for (i = 0; i < ERM_COUNT; i++) {
4362 if (is_extra_removed_by(pextra, i)) {
4363 extra_to_removed_by_list(pextra, i);
4364 }
4365 }
4366
4368 sz_strlcpy(pextra->act_gfx_alt, p->act_gfx_alt);
4370 sz_strlcpy(pextra->rmact_gfx, p->rmact_gfx);
4373 sz_strlcpy(pextra->graphic_str, p->graphic_str);
4374 sz_strlcpy(pextra->graphic_alt, p->graphic_alt);
4375
4376 requirement_vector_copy(&pextra->reqs, &p->reqs);
4377 requirement_vector_copy(&pextra->rmreqs, &p->rmreqs);
4378
4381
4384
4385 pextra->visibility_req = p->visibility_req;
4386 pextra->buildable = p->buildable;
4387 pextra->generated = p->generated;
4388 pextra->build_time = p->build_time;
4390 pextra->removal_time = p->removal_time;
4392 pextra->infracost = p->infracost;
4393 pextra->defense_bonus = p->defense_bonus;
4394
4395 if (pextra->defense_bonus != 0) {
4396 if (extra_has_flag(pextra, EF_NATURAL_DEFENSE)) {
4398 } else {
4400 }
4401 }
4402
4404
4405 pextra->eus = p->eus;
4406 if (pextra->eus == EUS_HIDDEN) {
4408 }
4409
4410 pextra->native_to = p->native_to;
4411
4412 pextra->flags = p->flags;
4413 if (pextra->no_aggr_near_city >= 0) {
4415 }
4416 if (extra_has_flag(pextra, EF_CAUSE_ZOC)) {
4418 }
4419
4420 pextra->hidden_by = p->hidden_by;
4421 pextra->bridged_over = p->bridged_over;
4422 pextra->conflicts = p->conflicts;
4423
4425
4427}
4428
4429/************************************************************************/
4433{
4434 const char *flagname;
4435 const char *helptxt;
4436
4438 "Bad user flag %d.", p->id);
4439
4440 if (p->name[0] == '\0') {
4441 flagname = NULL;
4442 } else {
4443 flagname = p->name;
4444 }
4445
4446 if (p->helptxt[0] == '\0') {
4447 helptxt = NULL;
4448 } else {
4449 helptxt = p->helptxt;
4450 }
4451
4452 set_user_extra_flag_name(p->id, flagname, helptxt);
4453}
4454
4455/************************************************************************/
4459{
4460 struct base_type *pbase = base_by_number(p->id);
4461
4462 fc_assert_ret_msg(NULL != pbase, "Bad base %d.", p->id);
4463
4464 pbase->gui_type = p->gui_type;
4465 pbase->border_sq = p->border_sq;
4466 pbase->vision_main_sq = p->vision_main_sq;
4467 pbase->vision_invis_sq = p->vision_invis_sq;
4468 pbase->vision_subs_sq = p->vision_subs_sq;
4469
4473 }
4474}
4475
4476/************************************************************************/
4480{
4481 struct road_type *proad = road_by_number(p->id);
4482
4483 fc_assert_ret_msg(NULL != proad, "Bad road %d.", p->id);
4484
4485 proad->gui_type = p->gui_type;
4486
4487 requirement_vector_copy(&proad->first_reqs, &p->first_reqs);
4488
4489 proad->move_cost = p->move_cost;
4490 proad->move_mode = p->move_mode;
4491
4493 proad->tile_incr_const[o] = p->tile_incr_const[o];
4494 proad->tile_incr[o] = p->tile_incr[o];
4495 proad->tile_bonus[o] = p->tile_bonus[o];
4497
4498 proad->compat = p->compat;
4499 proad->integrates = p->integrates;
4500 proad->flags = p->flags;
4501}
4502
4503/************************************************************************/
4507{
4508 struct tiledef *td = tiledef_by_number(p->id);
4509
4510 fc_assert_ret_msg(td != nullptr, "Bad tiledef %d.", p->id);
4511
4512 names_set(&td->name, nullptr, p->name, p->rule_name);
4513
4514 extra_type_iterate(pextra) {
4515 if (BV_ISSET(p->extras, extra_index(pextra))) {
4516 extra_type_list_append(td->extras, pextra);
4517 }
4519}
4520
4521/************************************************************************/
4525{
4526 struct goods_type *pgood = goods_by_number(p->id);
4527
4528 fc_assert_ret_msg(NULL != pgood, "Bad goods %d.", p->id);
4529
4530 names_set(&pgood->name, NULL, p->name, p->rule_name);
4531
4532 requirement_vector_copy(&pgood->reqs, &p->reqs);
4533
4534 pgood->from_pct = p->from_pct;
4535 pgood->to_pct = p->to_pct;
4536 pgood->onetime_pct = p->onetime_pct;
4537 pgood->select_priority = p->select_priority;
4538 pgood->replace_priority = p->replace_priority;
4539 pgood->flags = p->flags;
4540
4541 PACKET_STRVEC_EXTRACT(pgood->helptext, p->helptext);
4542}
4543
4544/************************************************************************/
4548{
4549 struct action *act;
4550
4551 if (!action_id_exists(p->id)) {
4552 /* Action id out of range */
4553 log_error("handle_ruleset_action() the action id %d is out of range.",
4554 p->id);
4555
4556 return;
4557 }
4558
4559 act = action_by_number(p->id);
4560
4561 sz_strlcpy(act->ui_name, p->ui_name);
4562 act->quiet = p->quiet;
4563
4564 act->result = p->result;
4565 act->sub_results = p->sub_results;
4567
4568 act->actor_kind = p->act_kind;
4569 act->target_kind = p->tgt_kind;
4570 act->sub_target_kind = p->sub_tgt_kind;
4571
4572 act->min_distance = p->min_distance;
4573 act->max_distance = p->max_distance;
4574 act->blocked_by = p->blocked_by;
4575}
4576
4577/************************************************************************/
4580void
4582{
4583 struct action_enabler *enabler;
4584
4586 /* Non existing action */
4587 log_error("handle_ruleset_action_enabler() the action %d "
4588 "doesn't exist.",
4589 p->enabled_action);
4590
4591 return;
4592 }
4593
4595
4596 enabler->action = p->enabled_action;
4597
4598 requirement_vector_copy(&enabler->actor_reqs, &p->actor_reqs);
4599 requirement_vector_copy(&enabler->target_reqs, &p->target_reqs);
4600
4602}
4603
4604/************************************************************************/
4608{
4610 int i;
4611
4613
4614 auto_perf->cause = p->cause;
4615
4617
4618 for (i = 0; i < p->alternatives_count; i++) {
4619 auto_perf->alternatives[i] = p->alternatives[i];
4620 }
4621}
4622
4623/************************************************************************/
4627{
4629
4630 fc_assert_ret_msg(NULL != pdis, "Bad disaster %d.", p->id);
4631
4632 names_set(&pdis->name, NULL, p->name, p->rule_name);
4633
4634 requirement_vector_copy(&pdis->reqs, &p->reqs);
4635
4636 pdis->frequency = p->frequency;
4637
4638 pdis->effects = p->effects;
4639}
4640
4641/************************************************************************/
4645{
4647
4648 fc_assert_ret_msg(NULL != pach, "Bad achievement %d.", p->id);
4649
4650 names_set(&pach->name, NULL, p->name, p->rule_name);
4651
4652 pach->type = p->type;
4653 pach->unique = p->unique;
4654 pach->value = p->value;
4655}
4656
4657/************************************************************************/
4661{
4663
4664 if (pset != NULL) {
4665 pset->trade_pct = p->trade_pct;
4666 pset->cancelling = p->cancelling;
4667 pset->bonus_type = p->bonus_type;
4668 }
4669}
4670
4671/************************************************************************/
4675 (const struct packet_ruleset_terrain_control *p)
4676{
4677 /* Since terrain_control is the same as packet_ruleset_terrain_control
4678 * we can just copy the data directly. */
4679 terrain_control = *p;
4680 /* terrain_control.move_fragments likely changed */
4682}
4683
4684/************************************************************************/
4688 (const struct packet_ruleset_nation_sets *packet)
4689{
4690 int i;
4691
4692 for (i = 0; i < packet->nsets; i++) {
4693 struct nation_set *pset =
4694 nation_set_new(packet->names[i], packet->rule_names[i],
4695 packet->descriptions[i]);
4696
4697 if (pset == NULL) {
4698 break;
4699 } else {
4701 }
4702 }
4703}
4704
4705/************************************************************************/
4709 (const struct packet_ruleset_nation_groups *packet)
4710{
4711 int i;
4712
4713 for (i = 0; i < packet->ngroups; i++) {
4714 struct nation_group *pgroup;
4715
4716 pgroup = nation_group_new(packet->groups[i]);
4717
4718 if (pgroup != NULL) {
4720 pgroup->hidden = packet->hidden[i];
4721 } else {
4722 break;
4723 }
4724 }
4725}
4726
4727/************************************************************************/
4731{
4732 struct nation_type *pnation = nation_by_number(packet->id);
4733 int i;
4734
4735 fc_assert_ret_msg(NULL != pnation, "Bad nation %d.", packet->id);
4736
4737 if (packet->translation_domain[0] != '\0') {
4738 size_t len = strlen(packet->translation_domain) + 1;
4739 pnation->translation_domain = fc_malloc(len);
4741 } else {
4742 pnation->translation_domain = NULL;
4743 }
4744 names_set(&pnation->adjective, pnation->translation_domain,
4745 packet->adjective, packet->rule_name);
4746 name_set(&pnation->noun_plural, pnation->translation_domain, packet->noun_plural);
4747 sz_strlcpy(pnation->flag_graphic_str, packet->graphic_str);
4748 sz_strlcpy(pnation->flag_graphic_alt, packet->graphic_alt);
4749 pnation->style = style_by_number(packet->style);
4750 for (i = 0; i < packet->leader_count; i++) {
4751 (void) nation_leader_new(pnation, packet->leader_name[i],
4752 packet->leader_is_male[i]);
4753 }
4754
4755 /* set later by PACKET_NATION_AVAILABILITY */
4756 pnation->client.is_pickable = FALSE;
4757 pnation->is_playable = packet->is_playable;
4758 pnation->barb_type = packet->barbarian_type;
4759
4760 if ('\0' != packet->legend[0]) {
4761 pnation->legend = fc_strdup(nation_legend_translation(pnation, packet->legend));
4762 } else {
4763 pnation->legend = fc_strdup("");
4764 }
4765
4766 for (i = 0; i < packet->nsets; i++) {
4767 struct nation_set *pset = nation_set_by_number(packet->sets[i]);
4768
4769 if (NULL != pset) {
4770 nation_set_list_append(pnation->sets, pset);
4771 } else {
4772 log_error("handle_ruleset_nation() \"%s\" have unknown set %d.",
4773 nation_rule_name(pnation), packet->sets[i]);
4774 }
4775 }
4776
4777 for (i = 0; i < packet->ngroups; i++) {
4779
4780 if (NULL != pgroup) {
4782 } else {
4783 log_error("handle_ruleset_nation() \"%s\" have unknown group %d.",
4784 nation_rule_name(pnation), packet->groups[i]);
4785 }
4786 }
4787
4788 /* init_government may be NULL */
4790 for (i = 0; i < MAX_NUM_TECH_LIST; i++) {
4791 if (i < packet->init_techs_count) {
4792 pnation->init_techs[i] = packet->init_techs[i];
4793 } else {
4794 pnation->init_techs[i] = A_LAST;
4795 }
4796 }
4797 for (i = 0; i < MAX_NUM_UNIT_LIST; i++) {
4798 if (i < packet->init_units_count) {
4799 pnation->init_units[i] = utype_by_number(packet->init_units[i]);
4800 } else {
4801 /* TODO: should init_units be initialized in common/nation.c? */
4802 pnation->init_units[i] = utype_by_number(U_LAST);
4803 }
4804 }
4805 for (i = 0; i < MAX_NUM_BUILDING_LIST; i++) {
4806 if (i < packet->init_buildings_count) {
4807 pnation->init_buildings[i] = packet->init_buildings[i];
4808 } else {
4809 pnation->init_buildings[i] = B_LAST;
4810 }
4811 }
4812
4814}
4815
4816/************************************************************************/
4820void handle_nation_availability(int ncount, const bool *is_pickable,
4821 bool nationset_change)
4822{
4823 int i;
4824
4825 fc_assert_action(ncount == nation_count(),
4826 ncount = MIN(ncount, nation_count()));
4827
4828 for (i = 0; i < ncount; i++) {
4829 nation_by_number(i)->client.is_pickable = is_pickable[i];
4830 }
4831
4832 races_update_pickable(nationset_change);
4833}
4834
4835/************************************************************************/
4839{
4840 struct nation_style *pstyle = style_by_number(p->id);
4841
4842 fc_assert_ret_msg(NULL != pstyle, "Bad style %d.", p->id);
4843
4844 names_set(&pstyle->name, NULL, p->name, p->rule_name);
4845}
4846
4847/************************************************************************/
4851{
4852 struct clause_info *info = clause_info_get(p->type);
4853
4854 fc_assert_ret_msg(NULL != info, "Bad clause %d.", p->type);
4855
4856 info->enabled = p->enabled;
4857
4861}
4862
4863/************************************************************************/
4867{
4868 int id;
4869 struct citystyle *cs;
4870
4871 id = packet->style_id;
4873 "Bad citystyle %d.", id);
4874 cs = &city_styles[id];
4875
4876 requirement_vector_copy(&cs->reqs, &packet->reqs);
4877 names_set(&cs->name, NULL, packet->name, packet->rule_name);
4878 sz_strlcpy(cs->graphic, packet->graphic);
4879 sz_strlcpy(cs->graphic_alt, packet->graphic_alt);
4880 sz_strlcpy(cs->citizens_graphic, packet->citizens_graphic);
4881
4883}
4884
4885/************************************************************************/
4889{
4890 int id;
4891 struct music_style *pmus;
4892
4893 id = packet->id;
4895 "Bad music_style %d.", id);
4896
4898
4899 requirement_vector_copy(&pmus->reqs, &packet->reqs);
4900 sz_strlcpy(pmus->music_peaceful, packet->music_peaceful);
4901 sz_strlcpy(pmus->music_combat, packet->music_combat);
4902}
4903
4904/************************************************************************/
4908{
4909 int i;
4910
4911 /* Must set num_specialist_types before iterating over them. */
4913
4914 fc_assert_ret(packet->veteran_levels > 0);
4915
4917 game.veteran->levels = packet->veteran_levels;
4918
4919 for (i = 0; i < MAX_NUM_TECH_LIST; i++) {
4920 if (i < packet->global_init_techs_count) {
4922 } else {
4924 }
4925 }
4926 for (i = 0; i < MAX_NUM_BUILDING_LIST; i++) {
4927 if (i < packet->global_init_buildings_count) {
4929 } else {
4931 }
4932 }
4933
4934 for (i = 0; i < packet->veteran_levels; i++) {
4936 packet->power_fact[i], packet->move_bonus[i],
4937 packet->base_raise_chance[i],
4938 packet->work_raise_chance[i]);
4939 }
4940
4943 packet->background_green,
4944 packet->background_blue);
4945
4947}
4948
4949/************************************************************************/
4953{
4954 struct specialist *s = specialist_by_number(p->id);
4955
4956 fc_assert_ret_msg(NULL != s, "Bad specialist %d.", p->id);
4957
4958 names_set(&s->name, NULL, p->plural_name, p->rule_name);
4960
4965
4967}
4968
4969/************************************************************************/
4972void handle_city_name_suggestion_info(int unit_id, const char *name)
4973{
4974 struct unit *punit = player_unit_by_number(client_player(), unit_id);
4975
4976 if (!can_client_issue_orders()) {
4977 return;
4978 }
4979
4980 if (punit) {
4982 bool other_asking = FALSE;
4983
4985 if (other->client.asking_city_name) {
4987 }
4990
4991 if (!other_asking) {
4993 }
4994 } else {
4996 unit_id, tile_index(unit_tile(punit)),
4997 0, name);
4998 }
4999 }
5000}
5001
5002/************************************************************************/
5008void handle_unit_action_answer(int actor_id, int target_id, int cost,
5009 action_id action_type,
5010 int request_kind)
5011{
5012 struct city *pcity = game_city_by_number(target_id);
5013 struct unit *punit = game_unit_by_number(target_id);
5014 struct tile *ptile = index_to_tile(&(wld.map), target_id);
5015 struct unit *pactor = player_unit_by_number(client_player(), actor_id);
5016 struct action *paction = action_by_number(action_type);
5017
5018 if (ACTION_NONE != action_type
5019 && !action_id_exists(action_type)) {
5020 /* Non existing action */
5021 log_error("handle_unit_action_answer() the action %d doesn't exist.",
5022 action_type);
5023
5024 if (request_kind == REQEST_PLAYER_INITIATED) {
5028 }
5029
5030 return;
5031 }
5032
5033 if (!pactor) {
5034 log_debug("Bad actor %d.", actor_id);
5035
5036 if (request_kind == REQEST_PLAYER_INITIATED) {
5039 }
5040
5041 return;
5042 }
5043
5044 switch ((enum gen_action)action_type) {
5046 if (punit != nullptr && client.conn.playing
5048 if (request_kind == REQEST_PLAYER_INITIATED) {
5049 /* Focus on the unit so the player knows where it is */
5051
5053 } else {
5054 /* Not in use (yet). */
5055 log_error("Unimplemented: received background unit bribe cost.");
5056 }
5057 } else {
5058 log_debug("Bad target %d.", target_id);
5059 if (request_kind == REQEST_PLAYER_INITIATED) {
5063 }
5064 }
5065 break;
5067 if (ptile != nullptr && client.conn.playing
5069 if (request_kind == REQEST_PLAYER_INITIATED) {
5070 /* Focus on the unit so the player knows where it is */
5072
5074 } else {
5075 /* Not in use (yet). */
5076 log_error("Unimplemented: received background stack bribe cost.");
5077 }
5078 } else {
5079 log_debug("Bad target %d.", target_id);
5080 if (request_kind == REQEST_PLAYER_INITIATED) {
5084 }
5085 }
5086 break;
5089 if (pcity && client.conn.playing
5091 if (request_kind == REQEST_PLAYER_INITIATED) {
5092 /* Focus on the unit so the player knows where it is */
5094
5096 } else {
5097 /* Not in use (yet). */
5098 log_error("Unimplemented: received background city incite cost.");
5099 }
5100 } else {
5101 log_debug("Bad target %d.", target_id);
5102 if (request_kind == REQEST_PLAYER_INITIATED) {
5106 }
5107 }
5108 break;
5110 if (pcity && client.conn.playing
5112 /* TODO: The bundled clients will have to start showing the upgrade
5113 * price sent from the server before it can be allowed to rely on
5114 * things the player can't see. (Example: it becomes legal to upgrade
5115 * a unit in a foreign city.) */
5116
5117 /* Getting unit upgrade cost from the server is currently only used by
5118 * Freeciv-web. */
5119 log_error("Received upgrade unit price but can't forward it.");
5120 }
5121 break;
5122 case ACTION_NONE:
5123 log_debug("Server didn't respond to query.");
5124 if (request_kind == REQEST_PLAYER_INITIATED) {
5128 }
5129 break;
5130 default:
5131 log_error("handle_unit_action_answer() invalid action_type (%d).",
5132 action_type);
5133 if (request_kind == REQEST_PLAYER_INITIATED) {
5137 }
5138 break;
5139 };
5140}
5141
5142/************************************************************************/
5147{
5149
5151 if (action_prob_possible(act_probs[act_id])) {
5152 /* An attack. */
5153 if (attack_action == ACTION_NONE) {
5154 /* No previous attack action found. */
5155 attack_action = act_id;
5156 } else {
5157 /* More than one legal attack action found. */
5158 return ACTION_NONE;
5159 }
5160 }
5163 if (action_prob_possible(act_probs[act_id])) {
5164 /* An interesting non attack action has been found. */
5165 return ACTION_NONE;
5166 }
5168
5169 return attack_action;
5170}
5171
5172/**********************************************************************/
5177 const struct act_prob *act_probs,
5178 struct unit *target_unit,
5179 struct city *target_city,
5180 struct tile *target_tile)
5181{
5183
5185
5187
5188 if (auto_action != ACTION_NONE) {
5189 /* No interesting actions except a single attack action has been
5190 * found. The player wants it performed without questions. */
5191
5192 /* The order requests below doesn't send additional details. */
5194
5195 /* Give the order. */
5197 case ATK_TILE:
5198 case ATK_STACK:
5199 case ATK_EXTRAS:
5200 if (target_tile != NULL) {
5203 0, "");
5204 }
5205 break;
5206 case ATK_CITY:
5207 if (target_city != NULL) {
5210 0, "");
5211 }
5212 break;
5213 case ATK_UNIT:
5214 if (target_unit != NULL) {
5217 0, "");
5218 }
5219 break;
5220 case ATK_SELF:
5223 0, "");
5224 break;
5225 case ATK_COUNT:
5227 break;
5228 }
5229
5230 /* Clean up. */
5232 } else {
5233 /* This should be done in the foreground */
5235 }
5236}
5237
5238/************************************************************************/
5245{
5247
5248 struct tile *target_tile = index_to_tile(&(wld.map), packet->target_tile_id);
5249 struct extra_type *target_extra = packet->target_extra_id == EXTRA_NONE ?
5253
5254 const struct act_prob *act_probs = packet->action_probabilities;
5255
5256 int request_kind = packet->request_kind;
5257 bool valid = FALSE;
5258
5259 /* The dead can't act */
5261 /* At least one action must be possible */
5262 action_iterate(act) {
5263 if (action_prob_possible(act_probs[act])) {
5264 valid = TRUE;
5265 break;
5266 }
5268 }
5269
5270 switch (request_kind) {
5272 if (valid) {
5273 /* The player can select an action and should be informed. */
5274
5275 /* Show the client specific action dialog */
5279 act_probs);
5280 } else {
5281 /* Nothing to do. */
5285 }
5286 break;
5288 /* This was a background action selection dialog refresh. */
5289
5290 if (actor_unit != NULL
5292 /* The situation may have changed. */
5296 act_probs);
5297 }
5298 break;
5300 if (actor_unit != NULL) {
5303 }
5304 break;
5305 default:
5306 log_warn("Unknown request_kind %d in reply", request_kind);
5307 break;
5308 }
5309}
5310
5311/************************************************************************/
5314void handle_city_sabotage_list(int actor_id, int city_id,
5315 bv_imprs improvements,
5316 action_id act_id,
5317 int request_kind)
5318{
5319 struct city *pcity = game_city_by_number(city_id);
5320 struct unit *pactor = player_unit_by_number(client_player(), actor_id);
5321 struct action *paction = action_by_number(act_id);
5322
5323 if (!pactor) {
5324 log_debug("Bad diplomat %d.", actor_id);
5325
5326 if (request_kind == REQEST_PLAYER_INITIATED) {
5329 }
5330
5331 return;
5332 }
5333
5334 if (!pcity) {
5335 log_debug("Bad city %d.", city_id);
5336
5337 if (request_kind == REQEST_PLAYER_INITIATED) {
5341 }
5342
5343 return;
5344 }
5345
5347 improvement_iterate(pimprove) {
5349 BV_ISSET(improvements,
5350 improvement_index(pimprove)));
5352
5353 if (request_kind == REQEST_PLAYER_INITIATED) {
5354 /* Focus on the unit so the player knows where it is */
5356
5358 } else {
5359 /* Not in use (yet). */
5360 log_error("Unimplemented: received background city building list.");
5361 }
5362 } else {
5363 log_debug("Can't issue orders");
5364 if (request_kind == REQEST_PLAYER_INITIATED) {
5367 }
5368 }
5369}
5370
5371/************************************************************************/
5380
5381/************************************************************************/
5385{
5386 if (client_has_player()
5387 && packet->player_id == player_number(client_player())) {
5388 if (packet->winner) {
5389 start_menu_music("music_victory", NULL);
5390 } else {
5391 start_menu_music("music_defeat", NULL);
5392 }
5393 }
5395}
5396
5397/************************************************************************/
5401 (const struct packet_player_attribute_chunk *packet)
5402{
5403 if (!client_has_player()) {
5404 return;
5405 }
5406
5408
5409 if (packet->offset + packet->chunk_length == packet->total_length) {
5410 /* We successful received the last chunk. The attribute block is
5411 now complete. */
5413 }
5414}
5415
5416/************************************************************************/
5420{
5422
5426 client.last_processed_request_id_seen);
5428 request_id_of_currently_handled_packet);
5429
5430 log_debug("start processing packet %d",
5432}
5433
5434/************************************************************************/
5453
5454/************************************************************************/
5458 int packet_type, int size)
5459{
5460 fc_assert(pc == &client.conn);
5461 log_debug("incoming packet={type=%d, size=%d}", packet_type, size);
5462}
5463
5464/************************************************************************/
5468 int packet_type, int size,
5469 int request_id)
5470{
5471 fc_assert(pc == &client.conn);
5472 log_debug("outgoing packet={type=%d, size=%d, request_id=%d}",
5474
5476}
5477
5478/************************************************************************/
5482{
5483 log_debug("handle_freeze_client");
5484
5486}
5487
5488/************************************************************************/
5492{
5493 log_debug("handle_thaw_client");
5494
5497}
5498
5499/************************************************************************/
5503{
5505}
5506
5507/************************************************************************/
5511{
5512 log_verbose("server shutdown");
5513}
5514
5515/************************************************************************/
5519{
5520 recv_ruleset_effect(packet);
5521}
5522
5523/************************************************************************/
5529void handle_edit_object_created(int tag, int id)
5530{
5532}
5533
5534/************************************************************************/
5538{
5539 struct tile *ptile = index_to_tile(&(wld.map), packet->id);
5540 bool changed = FALSE;
5541
5542 /* Check. */
5543 if (NULL == ptile) {
5544 log_error("%s(): invalid tile index %d.", __FUNCTION__, packet->id);
5545 return;
5546 }
5547
5548 /* Handle. */
5549 if (packet->removal) {
5550 changed = map_startpos_remove(ptile);
5551 } else {
5552 if (NULL != map_startpos_get(ptile)) {
5553 changed = FALSE;
5554 } else {
5555 map_startpos_new(ptile);
5556 changed = TRUE;
5557 }
5558 }
5559
5560 /* Notify. */
5561 if (changed && can_client_change_view()) {
5563 if (packet->removal) {
5565 packet->id, TRUE);
5566 } else {
5567 editgui_notify_object_created(packet->tag, packet->id);
5568 }
5569 }
5570}
5571
5572/************************************************************************/
5576 packet)
5577{
5578 struct tile *ptile = index_to_tile(&(wld.map), packet->id);
5579 struct startpos *psp;
5580
5581 /* Check. */
5582 if (NULL == ptile) {
5583 log_error("%s(): invalid tile index %d.", __FUNCTION__, packet->id);
5584 return;
5585 }
5586
5587 psp = map_startpos_get(ptile);
5588 if (NULL == psp) {
5589 log_error("%s(): no start position at (%d, %d)",
5590 __FUNCTION__, TILE_XY(ptile));
5591 return;
5592 }
5593
5594 /* Handle. */
5595 if (startpos_unpack(psp, packet) && can_client_change_view()) {
5596 /* Notify. */
5599 FALSE);
5600 }
5601}
5602
5603/************************************************************************/
5607{
5608 game.client.fog_of_war = enabled;
5609
5610 menus_update();
5611}
5612
5613/************************************************************************/
5616void handle_vote_remove(int vote_no)
5617{
5620}
5621
5622/************************************************************************/
5625void handle_vote_update(int vote_no, int yes, int no, int abstain,
5626 int num_voters)
5627{
5628 struct voteinfo *vi;
5629
5631
5633 "Got packet_vote_update for non-existent vote %d!",
5634 vote_no);
5635
5636 vi->yes = yes;
5637 vi->no = no;
5638 vi->abstain = abstain;
5639 vi->num_voters = num_voters;
5640
5642}
5643
5644/************************************************************************/
5647void handle_vote_new(const struct packet_vote_new *packet)
5648{
5650 "Got a packet_vote_new for already existing "
5651 "vote %d!", packet->vote_no);
5652
5654 packet->user,
5655 packet->desc,
5656 packet->percent_required,
5657 packet->flags);
5659}
5660
5661/************************************************************************/
5665{
5666 struct voteinfo *vi;
5667
5669
5671 "Got packet_vote_resolve for non-existent vote %d!",
5672 vote_no);
5673
5674 vi->resolved = TRUE;
5675 vi->passed = passed;
5676
5678}
5679
5680/************************************************************************/
5683void handle_play_music(const char *tag)
5684{
5685 play_single_track(tag);
5686}
5687
5688/************************************************************************/
5691void handle_popup_image(const char *tag)
5692{
5693 popup_image(tag);
5694}
5695
5696/************************************************************************/
5699void handle_diplomacy_init_meeting(int counterpart, int initiated_from)
5700{
5701 client_init_meeting(counterpart, initiated_from);
5702}
5703
5704/************************************************************************/
5707void handle_diplomacy_accept_treaty(int counterpart, bool I_accepted,
5708 bool other_accepted)
5709{
5710 client_recv_accept_treaty(counterpart, I_accepted, other_accepted);
5711}
5712
5713/************************************************************************/
5716void handle_diplomacy_cancel_meeting(int counterpart, int initiated_from)
5717{
5718 client_recv_cancel_meeting(counterpart, initiated_from);
5719}
5720
5721/************************************************************************/
5724void handle_diplomacy_create_clause(int counterpart, int giver,
5725 enum clause_type type, int value)
5726{
5727 client_recv_create_clause(counterpart, giver, type, value);
5728}
5729
5730/************************************************************************/
5733void handle_diplomacy_remove_clause(int counterpart, int giver,
5734 enum clause_type type, int value)
5735{
5736 client_recv_remove_clause(counterpart, giver, type, value);
5737}
5738
5739/**********************************************************************/
5744{
5747
5748 names_set(&curr->name, NULL, packet->name, packet->rule_name);
5749 curr->checkpoint = packet->checkpoint;
5750 curr->type = packet->behavior;
5751 curr->target = packet->type;
5752 curr->def = packet->def;
5753
5755 || curr->target != CTGT_CITY) {
5756 return;
5757 }
5758
5759 PACKET_STRVEC_EXTRACT(curr->helptext, packet->helptext);
5761}
5762
5763/**********************************************************************/
5767{
5768 int i;
5769 int counters_count;
5770 struct city *pcity = game_city_by_number(packet->city);
5771
5772 if (NULL == pcity) {
5773 return;
5774 }
5775
5777 if (counters_count != packet->count) {
5778 return;
5779 }
5780
5781 for (i = 0; i < counters_count; i++) {
5782 pcity->counter_values[i] = packet->counters[i];
5783 }
5784
5785 if (pcity->tile != NULL) {
5786 /* City's location known */
5788 }
5789
5791}
5792
5793/**********************************************************************/
5797{
5798 options_sync_reply(serial);
5799}
struct achievement * achievement_by_number(int id)
struct action_auto_perf * action_auto_perf_slot_number(const int num)
Definition actions.c:5945
bool action_prob_possible(const struct act_prob probability)
Definition actions.c:5306
void actions_rs_pre_san_gen(void)
Definition actions.c:899
void action_enabler_add(struct action_enabler *enabler)
Definition actions.c:1547
struct action_enabler * action_enabler_new(void)
Definition actions.c:1496
bool action_id_exists(const action_id act_id)
Definition actions.c:1089
static struct action * action_by_number(action_id act_id)
Definition actions.h:400
#define action_array_iterate(_act_array_, _act_id_)
Definition actions.h:261
#define action_id_requires_details(act_id)
Definition actions.h:438
#define action_array_iterate_end
Definition actions.h:273
#define action_iterate_end
Definition actions.h:218
#define action_iterate(_act_)
Definition actions.h:214
#define action_id_get_target_kind(act_id)
Definition actions.h:417
#define ACTION_NONE
Definition actions.h:59
void agents_unit_changed(struct unit *punit)
Definition agents.c:512
void agents_city_remove(struct city *pcity)
Definition agents.c:641
void agents_thaw_hint(void)
Definition agents.c:441
void agents_tile_remove(struct tile *ptile)
Definition agents.c:668
void agents_city_new(struct city *pcity)
Definition agents.c:615
void agents_start_turn(void)
Definition agents.c:475
void agents_tile_changed(struct tile *ptile)
Definition agents.c:692
void agents_unit_new(struct unit *punit)
Definition agents.c:537
void agents_unit_remove(struct unit *punit)
Definition agents.c:563
void agents_processing_started(void)
Definition agents.c:414
void agents_tile_new(struct tile *ptile)
Definition agents.c:716
void agents_processing_finished(void)
Definition agents.c:423
void agents_new_turn(void)
Definition agents.c:484
void agents_city_changed(struct city *pcity)
Definition agents.c:589
void agents_game_joined(void)
Definition agents.c:450
void agents_freeze_hint(void)
Definition agents.c:432
void agents_before_new_turn(void)
Definition agents.c:467
void attribute_restore(void)
Definition attribute.c:361
void audio_restart(const char *soundset_name, const char *musicset_name)
Definition audio.c:378
void audio_play_sound(const char *const tag, const char *const alt_tag, const char *const alt_tag2)
Definition audio.c:530
void base_type_init(struct extra_type *pextra, int idx)
Definition base.c:121
struct extra_type * base_extra_get(const struct base_type *pbase)
Definition base.c:105
struct base_type * base_by_number(const Base_type_id id)
Definition base.c:80
bool territory_claiming_base(const struct base_type *pbase)
Definition base.c:162
void dbv_set(struct dbv *pdbv, int bit)
Definition bitvector.c:142
void dbv_clr(struct dbv *pdbv, int bit)
Definition bitvector.c:163
#define BV_SET_VAL(bv, bit, val)
Definition bitvector.h:99
#define BV_SET(bv, bit)
Definition bitvector.h:89
#define BV_ARE_EQUAL(vec1, vec2)
Definition bitvector.h:121
#define BV_ISSET(bv, bit)
Definition bitvector.h:86
#define BV_CLR(bv, bit)
Definition bitvector.h:94
const char *const our_capability
Definition capstr.c:32
void output_window_append(const struct ft_color color, const char *featured_text)
void output_window_printf(const struct ft_color color, const char *format,...)
void citizens_nation_set(struct city *pcity, const struct player_slot *pslot, citizens count)
Definition citizens.c:145
citizens citizens_count(const struct city *pcity)
Definition citizens.c:162
void citizens_init(struct city *pcity)
Definition citizens.c:32
void city_map_radius_sq_set(struct city *pcity, int radius_sq)
Definition city.c:148
void city_name_set(struct city *pcity, const char *new_name)
Definition city.c:1145
void city_styles_alloc(int num)
Definition city.c:3436
const char * city_name_get(const struct city *pcity)
Definition city.c:1137
void city_production_caravan_shields_init(void)
Definition city.c:1778
void city_remove_improvement(struct city *pcity, const struct impr_type *pimprove)
Definition city.c:3411
void city_size_add(struct city *pcity, int add)
Definition city.c:1164
void free_city_map_index(void)
Definition city.c:609
bool city_unhappy(const struct city *pcity)
Definition city.c:1626
struct city * create_city_virtual(struct player *pplayer, struct tile *ptile, const char *name)
Definition city.c:3470
bool city_happy(const struct city *pcity)
Definition city.c:1614
void city_size_set(struct city *pcity, citizens size)
Definition city.c:1180
void city_add_improvement(struct city *pcity, const struct impr_type *pimprove)
Definition city.c:3397
int city_map_radius_sq_get(const struct city *pcity)
Definition city.c:137
void destroy_city_virtual(struct city *pcity)
Definition city.c:3556
void city_rally_point_receive(const struct packet_city_rally_point *packet, struct city *pcity)
Definition city.c:3681
static const struct city struct citystyle * city_styles
Definition city.c:84
#define city_list_iterate(citylist, pcity)
Definition city.h:508
#define city_tile(_pcity_)
Definition city.h:564
static citizens city_size_get(const struct city *pcity)
Definition city.h:569
#define city_tile_iterate_skip_free_worked(_nmap, _radius_sq, _city_tile, _tile, _index, _x, _y)
Definition city.h:212
@ CITIZEN_LAST
Definition city.h:270
@ CITIZEN_ANGRY
Definition city.h:269
@ CITIZEN_HAPPY
Definition city.h:266
@ CITIZEN_CONTENT
Definition city.h:267
@ CITIZEN_UNHAPPY
Definition city.h:268
#define output_type_iterate(output)
Definition city.h:846
#define city_owner(_pcity_)
Definition city.h:563
#define city_tile_iterate_skip_free_worked_end
Definition city.h:220
#define city_list_iterate_end
Definition city.h:510
#define I_NEVER
Definition city.h:245
@ FEELING_FINAL
Definition city.h:282
@ FEELING_LAST
Definition city.h:283
#define output_type_iterate_end
Definition city.h:852
void generate_citydlg_dimensions(void)
void popup_city_dialog(struct city *pcity)
void refresh_city_dialog(struct city *pcity)
void city_report_dialog_update_city(struct city *pcity)
void city_report_dialog_update(void)
char music_set_name[512]
void start_turn_change_wait(void)
bool client_is_global_observer(void)
void client_remove_cli_conn(struct connection *pconn)
bool client_is_observer(void)
void stop_turn_change_wait(void)
void set_server_busy(bool busy)
void user_ended_turn(void)
struct civclient client
bool auto_connect
enum client_states client_state(void)
void set_seconds_to_turndone(double seconds)
char sound_set_name[512]
bool can_client_issue_orders(void)
bool client_has_player(void)
void set_client_state(enum client_states newstate)
bool can_client_change_view(void)
#define client_player()
@ C_S_PREPARING
Definition client_main.h:46
@ C_S_RUNNING
Definition client_main.h:47
@ C_S_OVER
Definition client_main.h:48
enum known_type client_tile_get_known(const struct tile *ptile)
Definition climap.c:36
void create_event(struct tile *ptile, enum event_type event, const struct ft_color color, const char *format,...)
Definition climisc.c:1093
void client_player_init(struct player *pplayer)
Definition climisc.c:1373
void client_remove_city(struct city *pcity)
Definition climisc.c:134
void client_player_maps_reset(void)
Definition climisc.c:1384
void client_remove_unit(struct unit *punit)
Definition climisc.c:72
void unit_focus_set_status(struct player *pplayer)
Definition climisc.c:1363
void handle_event(const char *featured_text, struct tile *ptile, enum event_type event, int turn, int phase, int conn_id)
Definition climisc.c:968
void client_recv_remove_clause(int counterpart, int giver, enum clause_type type, int value)
Definition clitreaty.c:131
void client_recv_create_clause(int counterpart, int giver, enum clause_type type, int value)
Definition clitreaty.c:105
void client_recv_accept_treaty(int counterpart, bool I_accepted, bool other_accepted)
Definition clitreaty.c:59
void client_recv_cancel_meeting(int counterpart, int initiated_from)
Definition clitreaty.c:83
void client_init_meeting(int counterpart, int initiated_from)
Definition clitreaty.c:33
static void city_changed(int city_id)
Definition cma_core.c:448
char * incite_cost
Definition comments.c:76
void send_client_wants_hack(const char *filename)
int get_next_request_id(int old_request_id)
Definition connection.c:532
void conn_set_capability(struct connection *pconn, const char *capability)
Definition connection.c:663
struct connection * conn_by_number(int id)
Definition connection.c:423
#define conn_list_iterate(connlist, pconn)
Definition connection.h:108
#define conn_list_iterate_end
Definition connection.h:110
void do_move_unit(struct unit *punit, struct unit *target_unit)
Definition control.c:2802
bool unit_is_in_focus(const struct unit *punit)
Definition control.c:388
void action_selection_no_longer_in_progress(const int old_actor_id)
Definition control.c:1051
struct unit * get_focus_unit_on_tile(const struct tile *ptile)
Definition control.c:396
void action_decision_request(struct unit *actor_unit)
Definition control.c:1110
void set_units_in_combat(struct unit *pattacker, struct unit *pdefender)
Definition control.c:1032
void clear_hover_state(void)
Definition control.c:328
void unit_focus_set(struct unit *punit)
Definition control.c:506
bool should_ask_server_for_actions(const struct unit *punit)
Definition control.c:339
struct unit_list * get_units_in_focus(void)
Definition control.c:177
void request_do_action(action_id action, int actor_id, int target_id, int sub_tgt, const char *name)
Definition control.c:1730
void unit_focus_urgent(struct unit *punit)
Definition control.c:207
void unit_change_battlegroup(struct unit *punit, int battlegroup)
Definition control.c:255
bool non_ai_unit_focus
Definition control.c:125
void action_decision_clear_want(const int old_actor_id)
Definition control.c:1080
int get_num_units_in_focus(void)
Definition control.c:185
void unit_register_battlegroup(struct unit *punit)
Definition control.c:275
void unit_focus_update(void)
Definition control.c:789
void auto_center_on_focus_unit(void)
Definition control.c:434
void request_new_unit_activity(struct unit *punit, enum unit_activity act)
Definition control.c:1929
void action_selection_next_in_focus(const int old_actor_id)
Definition control.c:1092
int counters_get_city_counters_count(void)
Definition counters.c:74
struct counter * counter_by_id(int id)
Definition counters.c:82
void attach_city_counter(struct counter *counter)
Definition counters.c:94
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id popup_bribe_unit_dialog
Definition dialogs_g.h:73
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 popup_sabotage_dialog
Definition dialogs_g.h:77
struct unit struct city struct unit * target_unit
Definition dialogs_g.h:56
popup_action_selection
Definition dialogs_g.h:55
struct unit * actor_unit
Definition dialogs_g.h:55
const char * caption
Definition dialogs_g.h:37
const char const char * headline
Definition dialogs_g.h:38
popup_notify_dialog
Definition dialogs_g.h:37
struct unit struct city struct unit struct tile * target_tile
Definition dialogs_g.h:57
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 * target_city
Definition dialogs_g.h:56
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
struct unit struct city struct unit struct tile struct extra_type * target_extra
Definition dialogs_g.h:57
struct clause_info * clause_info_get(enum clause_type type)
Definition diptreaty.c:292
struct disaster_type * disaster_by_number(Disaster_type_id id)
Definition disaster.c:87
editgui_notify_object_changed
Definition editgui_g.h:27
int int id
Definition editgui_g.h:28
bool editor_is_active(void)
Definition editor.c:346
void editor_ruleset_changed(void)
Definition editor.c:180
@ OBJTYPE_PLAYER
Definition editor.h:30
@ OBJTYPE_UNIT
Definition editor.h:28
@ OBJTYPE_STARTPOS
Definition editor.h:27
@ OBJTYPE_GAME
Definition editor.h:31
@ OBJTYPE_CITY
Definition editor.h:29
@ OBJTYPE_TILE
Definition editor.h:26
void recv_ruleset_effect(const struct packet_ruleset_effect *packet)
Definition effects.c:591
struct @22::@23 reqs
enum event_type event
Definition events.c:81
const char * get_event_tag(enum event_type event)
Definition events.c:276
struct player * extra_owner(const struct tile *ptile)
Definition extras.c:1128
void set_user_extra_flag_name(enum extra_flag_id id, const char *name, const char *helptxt)
Definition extras.c:947
struct extra_type_list * extra_type_list_of_zoccers(void)
Definition extras.c:267
bool extra_has_flag(const struct extra_type *pextra, enum extra_flag_id flag)
Definition extras.c:875
struct extra_type_list * extra_type_list_by_cause(enum extra_cause cause)
Definition extras.c:249
void extra_to_caused_by_list(struct extra_type *pextra, enum extra_cause cause)
Definition extras.c:312
struct extra_type * extra_by_number(int id)
Definition extras.c:183
struct extra_type_list * extra_type_list_of_terr_claimers(void)
Definition extras.c:275
bool is_extra_removed_by(const struct extra_type *pextra, enum extra_rmcause rmcause)
Definition extras.c:353
struct extra_type_list * extra_type_list_of_unit_hiders(void)
Definition extras.c:259
#define extra_type_iterate(_p)
Definition extras.h:315
static void extra_to_removed_by_list(struct extra_type *pextra, enum extra_rmcause rmcause)
Definition extras.h:214
#define extra_type_iterate_end
Definition extras.h:321
#define is_extra_caused_by(e, c)
Definition extras.h:203
#define extra_index(_e_)
Definition extras.h:183
#define EXTRA_NONE
Definition extras.h:85
#define EF_LAST_USER_FLAG
Definition extras.h:82
#define MAX_DISASTER_TYPES
Definition fc_types.h:52
#define MAX_GRANARY_INIS
Definition fc_types.h:73
#define MAX_NUM_BUILDING_LIST
Definition fc_types.h:46
int Tech_type_id
Definition fc_types.h:237
#define EC_NATURAL_DEFENSIVE
Definition fc_types.h:809
#define EC_SPECIAL
Definition fc_types.h:807
int action_id
Definition fc_types.h:249
#define SP_MAX
Definition fc_types.h:268
#define EC_NONE
Definition fc_types.h:806
#define EC_NOT_AGGRESSIVE
Definition fc_types.h:810
#define EC_DEFENSIVE
Definition fc_types.h:808
#define IF_LAST_USER_FLAG
Definition fc_types.h:491
#define MAX_NUM_UNIT_LIST
Definition fc_types.h:45
#define MAX_EXTRA_TYPES
Definition fc_types.h:50
@ CTGT_CITY
Definition fc_types.h:127
#define MAX_ACHIEVEMENT_TYPES
Definition fc_types.h:53
#define MAX_NUM_TECH_LIST
Definition fc_types.h:44
@ O_SHIELD
Definition fc_types.h:102
@ O_FOOD
Definition fc_types.h:102
@ O_SCIENCE
Definition fc_types.h:102
@ O_GOLD
Definition fc_types.h:102
#define MAX_LEN_CITYNAME
Definition fc_types.h:68
signed short Continent_id
Definition fc_types.h:232
#define MAX_COUNTERS
Definition fc_types.h:107
#define UCL_LAST
Definition fc_types.h:275
#define IDENTITY_NUMBER_ZERO
Definition fc_types.h:93
#define _(String)
Definition fcintl.h:67
const struct ft_color ftc_client
struct civ_game game
Definition game.c:62
void game_ruleset_init(void)
Definition game.c:518
bool is_player_phase(const struct player *pplayer, int phase)
Definition game.c:715
int current_turn_timeout(void)
Definition game.c:856
void game_ruleset_free(void)
Definition game.c:568
struct world wld
Definition game.c:63
struct unit * game_unit_by_number(int id)
Definition game.c:116
struct city * game_city_by_number(int id)
Definition game.c:107
void init_client_goto(void)
Definition goto.c:153
struct ruler_title * government_ruler_title_new(struct government *pgovern, const struct nation_type *pnation, const char *ruler_male_title, const char *ruler_female_title)
Definition government.c:327
struct government * government_by_number(const Government_type_id gov)
Definition government.c:105
struct government * government_of_player(const struct player *pplayer)
Definition government.c:116
void governments_alloc(int num)
Definition government.c:531
Government_type_id government_number(const struct government *pgovern)
Definition government.c:93
void set_user_gov_flag_name(enum gov_flag_id id, const char *name, const char *helptxt)
Definition government.c:619
#define GOVF_LAST_USER_FLAG
Definition government.h:28
int action_selection_target_extra(void)
int action_selection_target_tile(void)
int action_selection_actor_unit(void)
void popup_bribe_stack_dialog(struct unit *actor, struct tile *ptile, int cost, const struct action *paction)
void action_selection_close(void)
int action_selection_target_city(void)
void action_selection_refresh(struct unit *actor_unit, struct city *target_city, struct unit *target_unit, struct tile *target_tile, struct extra_type *target_extra, const struct act_prob *act_probs)
int action_selection_target_unit(void)
void popup_incite_dialog(struct unit *actor, struct city *pcity, int cost, const struct action *paction)
bool city_dialog_is_open(struct city *pcity)
Definition citydlg.c:587
void popdown_all_city_dialogs(void)
Definition citydlg.c:607
void refresh_unit_city_dialogs(struct unit *punit)
Definition citydlg.c:546
struct city * owner
Definition citydlg.c:226
void server_connect(void)
Definition connectdlg.c:60
void close_connection_dialog(void)
Definition connectdlg.c:52
void races_update_pickable(bool nationset_change)
Definition dialogs.c:731
void show_tech_gained_dialog(Tech_type_id tech)
Definition dialogs.c:1524
void popdown_races_dialog(void)
Definition dialogs.c:1230
void popup_connect_msg(const char *headline, const char *message)
Definition dialogs.c:239
bool handmade_scenario_warning(void)
Definition dialogs.c:1573
void races_toggles_set_sensitive(void)
Definition dialogs.c:1245
void popup_combat_info(int attacker_unit_id, int defender_unit_id, int attacker_hp, int defender_hp, bool make_att_veteran, bool make_def_veteran)
Definition dialogs.c:1583
void popup_image(const char *tag)
Definition dialogs.c:1636
void editgui_notify_object_created(int tag, int id)
Definition editgui.c:1924
void editgui_refresh(void)
Definition editgui.c:1798
static GtkWidget * source
Definition gotodlg.c:58
enum gui_type get_gui_type(void)
Definition gui_main.c:2078
void update_infra_dialog(void)
Definition infradlg.c:138
void close_intel_dialog(struct player *p)
Definition inteldlg.c:223
void update_intel_dialog(struct player *p)
Definition inteldlg.c:462
void popup_newcity_dialog(struct unit *punit, const char *suggestname)
Definition mapctrl.c:197
void update_info_label(void)
Definition mapview.c:138
void start_turn(void)
Definition mapview.c:805
void update_unit_info_label(struct unit_list *punits)
Definition mapview.c:275
void update_city_descriptions(void)
Definition mapview.c:488
void update_start_page(void)
Definition pages.c:1675
void science_report_dialog_popup(bool raise)
Definition repodlgs.c:716
void endgame_report_dialog_start(const struct packet_endgame_report *packet)
Definition repodlgs.c:1983
GType type
Definition repodlgs.c:1313
void science_report_dialog_redraw(void)
Definition repodlgs.c:761
void popup_musicset_suggestion_dialog(void)
void popup_soundset_suggestion_dialog(void)
void refresh_spaceship_dialog(struct player *pplayer)
void popup_tileset_suggestion_dialog(void)
Definition tileset_dlg.c:58
void voteinfo_gui_update(void)
void conn_list_dialog_update(void)
void boot_help_texts(void)
Definition helpdata.c:768
void idex_register_unit(struct world *iworld, struct unit *punit)
Definition idex.c:82
void idex_unregister_city(struct world *iworld, struct city *pcity)
Definition idex.c:97
void idex_register_city(struct world *iworld, struct city *pcity)
Definition idex.c:67
struct impr_type * improvement_by_number(const Impr_type_id id)
const char * improvement_rule_name(const struct impr_type *pimprove)
bool is_improvement_visible(const struct impr_type *pimprove)
Impr_type_id improvement_index(const struct impr_type *pimprove)
void improvement_feature_cache_init(void)
Definition improvement.c:92
void set_user_impr_flag_name(enum impr_flag_id id, const char *name, const char *helptxt)
Impr_type_id improvement_count(void)
#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_msg(condition, message,...)
Definition log.h:182
#define fc_assert_ret(condition)
Definition log.h:192
#define log_packet
Definition log.h:138
#define log_warn(message,...)
Definition log.h:106
#define log_verbose(message,...)
Definition log.h:110
#define fc_assert(condition)
Definition log.h:177
#define fc_assert_ret_msg(condition, message,...)
Definition log.h:206
#define fc_assert_ret_val(condition, val)
Definition log.h:195
#define fc_assert_action(condition, action)
Definition log.h:188
#define log_debug(message,...)
Definition log.h:116
#define log_normal(message,...)
Definition log.h:108
@ LOG_NORMAL
Definition log.h:33
#define log_error(message,...)
Definition log.h:104
int dsend_packet_spaceship_place(struct connection *pc, enum spaceship_place_type type, int num)
int send_packet_conn_pong(struct connection *pc)
int dsend_packet_unit_get_actions(struct connection *pc, int actor_unit_id, int target_unit_id, int target_tile_id, int target_extra_id, int request_kind)
int dsend_packet_player_change_government(struct connection *pc, Government_type_id government)
int send_packet_client_info(struct connection *pc, const struct packet_client_info *packet)
packet_type
struct startpos * map_startpos_get(const struct tile *ptile)
Definition map.c:2038
int startpos_number(const struct startpos *psp)
Definition map.c:1776
int sq_map_distance(const struct tile *tile0, const struct tile *tile1)
Definition map.c:686
struct startpos * map_startpos_new(struct tile *ptile)
Definition map.c:2021
void map_init_topology(struct civ_map *nmap)
Definition map.c:315
void main_map_allocate(void)
Definition map.c:534
struct tile * index_to_tile(const struct civ_map *imap, int mindex)
Definition map.c:471
bool map_startpos_remove(struct tile *ptile)
Definition map.c:2054
bool same_pos(const struct tile *tile1, const struct tile *tile2)
Definition map.c:1076
bool startpos_unpack(struct startpos *psp, const struct packet_edit_startpos_full *packet)
Definition map.c:1875
void map_free(struct civ_map *fmap, bool server_side)
Definition map.c:545
struct terrain_misc terrain_control
Definition map.c:68
bool map_is_empty(void)
Definition map.c:148
#define adjc_iterate_end
Definition map.h:430
#define adjc_iterate(nmap, center_tile, itr_tile)
Definition map.h:425
#define whole_map_iterate(_map, _tile)
Definition map.h:573
#define whole_map_iterate_end
Definition map.h:582
void upgrade_canvas_clipboard(void)
void update_turn_done_button_state(void)
struct city * city_workers_display
void put_nuke_mushroom_pixmaps(struct tile *ptile)
void update_map_canvas_visible(void)
bool tile_visible_mapcanvas(struct tile *ptile)
enum topo_comp_lvl tileset_map_topo_compatible(int topology_id, struct tileset *tset, int *tset_topo)
void refresh_city_mapcanvas(struct city *pcity, struct tile *ptile, bool full_refresh, bool write_to_screen)
void mapdeco_init(void)
void center_tile_mapcanvas(const struct tile *ptile)
void link_marks_decrease_turn_counters(void)
void update_city_description(struct city *pcity)
const char * describe_topology(int topo)
void refresh_tile_mapcanvas(struct tile *ptile, bool full_refresh, bool write_to_screen)
void refresh_unit_mapcanvas(struct unit *punit, struct tile *ptile, bool full_refresh, bool write_to_screen)
void decrease_unit_hp_smooth(struct unit *punit0, int hp0, struct unit *punit1, int hp1)
@ TOPO_INCOMP_HARD
#define fc_calloc(n, esz)
Definition mem.h:38
#define FC_FREE(ptr)
Definition mem.h:41
#define fc_strdup(str)
Definition mem.h:43
#define fc_realloc(ptr, sz)
Definition mem.h:36
#define fc_malloc(sz)
Definition mem.h:34
void menus_update(void)
void meswin_clear_older(int turn, int phase)
int utype_unknown_move_cost(const struct unit_type *utype)
Definition movement.c:104
void init_move_fragments(void)
Definition movement.c:960
Multiplier_type_id multiplier_count(void)
Definition multipliers.c:88
struct multiplier * multiplier_by_number(Multiplier_type_id id)
Definition multipliers.c:57
Multiplier_type_id multiplier_index(const struct multiplier *pmul)
Definition multipliers.c:80
#define multipliers_iterate(_mul_)
Definition multipliers.h:61
#define multipliers_iterate_end
Definition multipliers.h:67
void play_single_track(const char *const tag)
Definition music.c:116
void start_menu_music(const char *const tag, char *const alt_tag)
Definition music.c:98
void start_style_music(void)
Definition music.c:44
static void name_set(struct name_translation *ptrans, const char *domain, const char *vernacular_name)
static void names_set(struct name_translation *ptrans, const char *domain, const char *vernacular_name, const char *rule_name)
const char * nation_rule_name(const struct nation_type *pnation)
Definition nation.c:138
int nation_group_index(const struct nation_group *pgroup)
Definition nation.c:974
Nation_type_id nation_count(void)
Definition nation.c:528
struct nation_group * nation_group_new(const char *name)
Definition nation.c:992
struct nation_type * nation_of_unit(const struct unit *punit)
Definition nation.c:480
struct nation_set * nation_set_new(const char *set_name, const char *set_rule_name, const char *set_description)
Definition nation.c:741
struct nation_type * nation_by_number(const Nation_type_id nation)
Definition nation.c:493
int nation_set_index(const struct nation_set *pset)
Definition nation.c:723
struct nation_type * nation_of_city(const struct city *pcity)
Definition nation.c:470
struct nation_set * nation_set_by_number(int id)
Definition nation.c:789
struct nation_group * nation_group_by_number(int id)
Definition nation.c:1038
struct nation_leader * nation_leader_new(struct nation_type *pnation, const char *name, bool is_male)
Definition nation.c:240
void nations_alloc(int num)
Definition nation.c:645
const char * nation_legend_translation(const struct nation_type *pnation, const char *legend)
Definition nation.c:306
void resend_desired_settable_options(void)
Definition options.c:6103
const char * tileset_name_for_topology(int topology_id)
Definition options.c:6910
void options_sync_reply(int serial)
Definition options.c:6458
struct client_options gui_options
Definition options.c:71
void calculate_overview_dimensions(void)
void generic_handle_player_attribute_chunk(struct player *pplayer, const struct packet_player_attribute_chunk *chunk)
Definition packets.c:690
#define PACKET_STRVEC_EXTRACT(dest, src)
Definition packets.h:190
#define REQEST_PLAYER_INITIATED
Definition packets.h:63
@ UNIT_INFO_CITY_PRESENT
Definition packets.h:69
@ UNIT_INFO_CITY_SUPPORTED
Definition packets.h:68
void handle_ruleset_game(const struct packet_ruleset_game *packet)
Definition packhand.c:4907
void handle_player_diplstate(const struct packet_player_diplstate *packet)
Definition packhand.c:2811
static action_id auto_attack_act(const struct act_prob *act_probs)
Definition packhand.c:5146
void handle_ruleset_nation_sets(const struct packet_ruleset_nation_sets *packet)
Definition packhand.c:4688
void handle_ruleset_nation(const struct packet_ruleset_nation *packet)
Definition packhand.c:4730
void handle_city_name_suggestion_info(int unit_id, const char *name)
Definition packhand.c:4972
void handle_sync_serial_reply(int serial)
Definition packhand.c:5796
static struct unit * unpackage_short_unit(const struct packet_unit_short_info *packet)
Definition packhand.c:364
void handle_nuke_tile_info(int tile)
Definition packhand.c:554
void handle_unknown_research(int id)
Definition packhand.c:2781
const action_id auto_attack_blockers[]
Definition packhand.c:163
void handle_ruleset_government_ruler_title(const struct packet_ruleset_government_ruler_title *packet)
Definition packhand.c:4140
void handle_city_info(const struct packet_city_info *packet)
Definition packhand.c:659
void handle_end_turn(void)
Definition packhand.c:1507
static struct unit * unpackage_unit(const struct packet_unit_info *packet)
Definition packhand.c:265
char * caption
Definition packhand.c:130
enum event_type event
Definition packhand.c:129
void handle_conn_info(const struct packet_conn_info *pinfo)
Definition packhand.c:2912
void handle_vote_remove(int vote_no)
Definition packhand.c:5616
void handle_investigate_finished(const struct packet_investigate_finished *packet)
Definition packhand.c:2172
void handle_page_msg_part(const char *lines)
Definition packhand.c:1637
void handle_unit_combat_info(const struct packet_unit_combat_info *packet)
Definition packhand.c:577
void handle_ruleset_style(const struct packet_ruleset_style *p)
Definition packhand.c:4838
void handle_unit_remove(int unit_id)
Definition packhand.c:500
void handle_vote_update(int vote_no, int yes, int no, int abstain, int num_voters)
Definition packhand.c:5625
static int last_turn
Definition packhand.c:138
void handle_ruleset_multiplier(const struct packet_ruleset_multiplier *p)
Definition packhand.c:4092
void handle_player_info(const struct packet_player_info *pinfo)
Definition packhand.c:2464
void handle_ruleset_extra(const struct packet_ruleset_extra *p)
Definition packhand.c:4307
void handle_ruleset_action_auto(const struct packet_ruleset_action_auto *p)
Definition packhand.c:4607
void handle_map_info(const struct packet_map_info *packet)
Definition packhand.c:2252
void handle_ruleset_unit_bonus(const struct packet_ruleset_unit_bonus *p)
Definition packhand.c:3811
void handle_start_phase(int phase)
Definition packhand.c:1434
void start_revolution(void)
Definition packhand.c:2408
void handle_timeout_info(float seconds_to_phasedone, float last_turn_change_time)
Definition packhand.c:2378
void handle_ruleset_terrain_control(const struct packet_ruleset_terrain_control *p)
Definition packhand.c:4675
const action_id auto_attack_actions[]
Definition packhand.c:146
void handle_play_music(const char *tag)
Definition packhand.c:5683
static void update_continent_cache(const struct tile *ptile, Continent_id old_cont, Continent_id new_cont)
Definition packhand.c:3163
void handle_investigate_started(const struct packet_investigate_started *packet)
Definition packhand.c:2148
void handle_edit_object_created(int tag, int id)
Definition packhand.c:5529
int parts
Definition packhand.c:133
void handle_conn_ping(void)
Definition packhand.c:5502
static int unpack_tech_req(const enum tech_req r_num, const struct requirement_vector *reqs, struct advance *a, int i)
Definition packhand.c:3886
void handle_ruleset_tech_class(const struct packet_ruleset_tech_class *p)
Definition packhand.c:3984
void handle_diplomacy_init_meeting(int counterpart, int initiated_from)
Definition packhand.c:5699
void handle_ruleset_control(const struct packet_ruleset_control *packet)
Definition packhand.c:3543
void handle_end_phase(void)
Definition packhand.c:1423
void handle_ruleset_gov_flag(const struct packet_ruleset_gov_flag *p)
Definition packhand.c:4154
void handle_ruleset_counter(const struct packet_ruleset_counter *packet)
Definition packhand.c:5743
void handle_server_info(const char *version_label, int major_version, int minor_version, int patch_version, int emerg_version)
Definition packhand.c:1590
void handle_ruleset_nation_groups(const struct packet_ruleset_nation_groups *packet)
Definition packhand.c:4709
void handle_ruleset_effect(const struct packet_ruleset_effect *packet)
Definition packhand.c:5518
void handle_new_year(int year, int fragments, int turn)
Definition packhand.c:1374
char * headline
Definition packhand.c:131
void handle_research_info(const struct packet_research_info *packet)
Definition packhand.c:2697
void handle_ruleset_goods(const struct packet_ruleset_goods *p)
Definition packhand.c:4524
void handle_unit_info(const struct packet_unit_info *packet)
Definition packhand.c:1663
void handle_ruleset_city(const struct packet_ruleset_city *packet)
Definition packhand.c:4866
void handle_ruleset_unit_class(const struct packet_ruleset_unit_class *p)
Definition packhand.c:3721
void handle_ruleset_government(const struct packet_ruleset_government *p)
Definition packhand.c:4114
void handle_ruleset_terrain_flag(const struct packet_ruleset_terrain_flag *p)
Definition packhand.c:4263
void handle_connect_msg(const char *message)
Definition packhand.c:1581
#define REQEST_BACKGROUND_REFRESH
Definition packhand.c:141
void handle_rulesets_ready(void)
Definition packhand.c:3667
void handle_tile_info(const struct packet_tile_info *packet)
Definition packhand.c:3251
void handle_ruleset_tiledef(const struct packet_ruleset_tiledef *p)
Definition packhand.c:4506
void handle_ruleset_action(const struct packet_ruleset_action *p)
Definition packhand.c:4547
static void action_decision_handle(struct unit *punit)
Definition packhand.c:1679
void handle_achievement_info(int id, bool gained, bool first)
Definition packhand.c:3041
void handle_scenario_description(const char *description)
Definition packhand.c:3531
void play_sound_for_event(enum event_type type)
Definition packhand.c:1534
void handle_edit_startpos(const struct packet_edit_startpos *packet)
Definition packhand.c:5537
void handle_processing_finished(void)
Definition packhand.c:5437
void handle_diplomacy_cancel_meeting(int counterpart, int initiated_from)
Definition packhand.c:5716
void handle_city_short_info(const struct packet_city_short_info *packet)
Definition packhand.c:1172
void handle_edit_fogofwar_state(bool enabled)
Definition packhand.c:5606
void handle_popup_image(const char *tag)
Definition packhand.c:5691
void handle_diplomacy_create_clause(int counterpart, int giver, enum clause_type type, int value)
Definition packhand.c:5724
void handle_endgame_player(const struct packet_endgame_player *packet)
Definition packhand.c:5384
void handle_ruleset_resource(const struct packet_ruleset_resource *p)
Definition packhand.c:4288
void handle_unit_action_answer(int actor_id, int target_id, int cost, action_id action_type, int request_kind)
Definition packhand.c:5008
void handle_ruleset_tech(const struct packet_ruleset_tech *p)
Definition packhand.c:3915
void handle_team_name_info(int team_id, const char *team_name)
Definition packhand.c:562
void handle_thaw_client(void)
Definition packhand.c:5491
void handle_calendar_info(const struct packet_calendar_info *pcalendar)
Definition packhand.c:2370
void packhand_free(void)
Definition packhand.c:219
void set_government_choice(struct government *government)
Definition packhand.c:2395
void handle_city_rally_point(const struct packet_city_rally_point *packet)
Definition packhand.c:1021
void handle_ruleset_disaster(const struct packet_ruleset_disaster *p)
Definition packhand.c:4626
static bool handle_unit_packet_common(struct unit *packet_unit)
Definition packhand.c:1717
void handle_ruleset_unit_class_flag(const struct packet_ruleset_unit_class_flag *p)
Definition packhand.c:3856
void handle_server_join_reply(bool you_can_join, const char *message, const char *capability, const char *challenge_file, int conn_id)
Definition packhand.c:409
void handle_ruleset_summary(const struct packet_ruleset_summary *packet)
Definition packhand.c:3639
void handle_set_topology(int topology_id, int wrap_id)
Definition packhand.c:2229
void handle_ruleset_impr_flag(const struct packet_ruleset_impr_flag *p)
Definition packhand.c:4066
void handle_page_msg(const char *caption, const char *headline, enum event_type event, int len, int parts)
Definition packhand.c:1606
void handle_city_update_counters(const struct packet_city_update_counters *packet)
Definition packhand.c:5766
void handle_edit_startpos_full(const struct packet_edit_startpos_full *packet)
Definition packhand.c:5575
void handle_conn_ping_info(int connections, const int *conn_id, const float *ping_time)
Definition packhand.c:3018
void handle_diplomacy_remove_clause(int counterpart, int giver, enum clause_type type, int value)
Definition packhand.c:5733
static bool spaceship_autoplace(struct player *pplayer, struct player_spaceship *ship)
Definition packhand.c:3078
void handle_player_remove(int playerno)
Definition packhand.c:2419
void handle_processing_started(void)
Definition packhand.c:5419
void handle_begin_turn(void)
Definition packhand.c:1493
void handle_endgame_report(const struct packet_endgame_report *packet)
Definition packhand.c:5375
void handle_early_chat_msg(const struct packet_early_chat_msg *packet)
Definition packhand.c:1567
void handle_ruleset_clause(const struct packet_ruleset_clause *p)
Definition packhand.c:4850
void handle_ruleset_road(const struct packet_ruleset_road *p)
Definition packhand.c:4479
void handle_unit_actions(const struct packet_unit_actions *packet)
Definition packhand.c:5244
void handle_ruleset_music(const struct packet_ruleset_music *packet)
Definition packhand.c:4888
void handle_ruleset_base(const struct packet_ruleset_base *p)
Definition packhand.c:4458
void notify_about_incoming_packet(struct connection *pc, int packet_type, int size)
Definition packhand.c:5457
void handle_freeze_client(void)
Definition packhand.c:5481
void handle_city_remove(int city_id)
Definition packhand.c:477
void handle_chat_msg(const struct packet_chat_msg *packet)
Definition packhand.c:1547
static void city_packet_common(struct city *pcity, struct tile *pcenter, struct player *powner, struct tile_list *worked_tiles, bool is_new, bool popup, bool investigate)
Definition packhand.c:1035
void handle_trade_route_info(const struct packet_trade_route_info *packet)
Definition packhand.c:1137
void handle_player_attribute_chunk(const struct packet_player_attribute_chunk *packet)
Definition packhand.c:5401
static struct @259 page_msg_report
void handle_vote_new(const struct packet_vote_new *packet)
Definition packhand.c:5647
static void packhand_init(void)
Definition packhand.c:240
void handle_scenario_info(const struct packet_scenario_info *packet)
Definition packhand.c:3510
void handle_ruleset_extra_flag(const struct packet_ruleset_extra_flag *p)
Definition packhand.c:4432
char * lines
Definition packhand.c:132
void notify_about_outgoing_packet(struct connection *pc, int packet_type, int size, int request_id)
Definition packhand.c:5467
#define VALIDATE(_count, _maximum, _string)
const char forced_tileset_name[]
struct city_list * cities
Definition packhand.c:120
void handle_ruleset_tech_flag(const struct packet_ruleset_tech_flag *p)
Definition packhand.c:3997
void handle_nation_availability(int ncount, const bool *is_pickable, bool nationset_change)
Definition packhand.c:4820
void handle_spaceship_info(const struct packet_spaceship_info *p)
Definition packhand.c:3097
void handle_ruleset_specialist(const struct packet_ruleset_specialist *p)
Definition packhand.c:4952
void handle_unit_short_info(const struct packet_unit_short_info *packet)
Definition packhand.c:2179
void handle_diplomacy_accept_treaty(int counterpart, bool I_accepted, bool other_accepted)
Definition packhand.c:5707
void handle_ruleset_unit_flag(const struct packet_ruleset_unit_flag *p)
Definition packhand.c:3831
void handle_city_nationalities(const struct packet_city_nationalities *packet)
Definition packhand.c:1001
void handle_server_shutdown(void)
Definition packhand.c:5510
void handle_ruleset_building(const struct packet_ruleset_building *p)
Definition packhand.c:4022
static int * continent_adjacency_count(Continent_id cont1, Continent_id cont2)
Definition packhand.c:3143
static bool update_improvement_from_packet(struct city *pcity, struct impr_type *pimprove, bool have_impr)
Definition packhand.c:637
static struct @258 invisible
void handle_ruleset_unit(const struct packet_ruleset_unit *p)
Definition packhand.c:3739
void handle_ruleset_terrain(const struct packet_ruleset_terrain *p)
Definition packhand.c:4180
static void action_decision_maybe_auto(struct unit *actor_unit, const struct act_prob *act_probs, struct unit *target_unit, struct city *target_city, struct tile *target_tile)
Definition packhand.c:5176
#define REQEST_BACKGROUND_FAST_AUTO_ATTACK
Definition packhand.c:143
void handle_city_sabotage_list(int actor_id, int city_id, bv_imprs improvements, action_id act_id, int request_kind)
Definition packhand.c:5314
void handle_ruleset_action_enabler(const struct packet_ruleset_action_enabler *p)
Definition packhand.c:4581
void handle_ruleset_achievement(const struct packet_ruleset_achievement *p)
Definition packhand.c:4644
void handle_game_info(const struct packet_game_info *pinfo)
Definition packhand.c:2294
struct player * placeholder
Definition packhand.c:121
void handle_vote_resolve(int vote_no, bool passed)
Definition packhand.c:5664
void handle_worker_task(const struct packet_worker_task *packet)
Definition packhand.c:1317
void handle_ruleset_description_part(const struct packet_ruleset_description_part *packet)
Definition packhand.c:3657
void handle_ruleset_trade(const struct packet_ruleset_trade *p)
Definition packhand.c:4660
int len
Definition packhand.c:128
bool player_slot_is_used(const struct player_slot *pslot)
Definition player.c:450
struct unit * player_unit_by_number(const struct player *pplayer, int unit_id)
Definition player.c:1237
struct player * player_new(struct player_slot *pslot)
Definition player.c:495
struct player * player_by_number(const int player_id)
Definition player.c:852
int player_count(void)
Definition player.c:819
struct player_slot * player_slot_by_number(int player_id)
Definition player.c:465
int player_number(const struct player *pplayer)
Definition player.c:839
const char * player_name(const struct player *pplayer)
Definition player.c:900
void player_set_color(struct player *pplayer, const struct rgbcolor *prgbcolor)
Definition player.c:650
int player_index(const struct player *pplayer)
Definition player.c:831
bool player_set_nation(struct player *pplayer, struct nation_type *pnation)
Definition player.c:864
struct player_diplstate * player_diplstate_get(const struct player *plr1, const struct player *plr2)
Definition player.c:324
bool can_player_see_units_in_city(const struct player *pplayer, const struct city *pcity)
Definition player.c:1141
struct player * player_slot_get_player(const struct player_slot *pslot)
Definition player.c:439
bool can_player_see_city_internals(const struct player *pplayer, const struct city *pcity)
Definition player.c:1157
void player_destroy(struct player *pplayer)
Definition player.c:758
#define players_iterate_end
Definition player.h:542
#define players_iterate(_pplayer)
Definition player.h:537
#define OWNER_NONE
Definition player.h:50
#define ANON_USER_NAME
Definition player.h:48
#define is_ai(plr)
Definition player.h:232
#define ANON_PLAYER_NAME
Definition player.h:43
#define is_human(plr)
Definition player.h:231
void players_dialog_update(void)
#define fc_rand(_size)
Definition rand.h:56
void multipliers_dialog_update(void)
endgame_report_dialog_player
Definition repodlgs_g.h:33
struct universal universal_by_number(const enum universals_n kind, const int value)
bool are_universals_equal(const struct universal *psource1, const struct universal *psource2)
enum tech_state research_invention_set(struct research *presearch, Tech_type_id tech, enum tech_state value)
Definition research.c:640
struct research * research_by_number(int number)
Definition research.c:119
struct research * research_get(const struct player *pplayer)
Definition research.c:130
void research_update(struct research *presearch)
Definition research.c:504
#define research_players_iterate(_presearch, _pplayer)
Definition research.h:166
#define research_players_iterate_end
Definition research.h:170
void rgbcolor_destroy(struct rgbcolor *prgbcolor)
Definition rgbcolor.c:74
struct rgbcolor * rgbcolor_new(int r, int g, int b)
Definition rgbcolor.c:34
void road_integrators_cache_init(void)
Definition road.c:111
struct road_type * road_by_number(Road_type_id id)
Definition road.c:58
void road_type_init(struct extra_type *pextra, int idx)
Definition road.c:93
void script_client_signal_emit(const char *signal_name,...)
static struct connection connections[MAX_NUM_CONNECTIONS]
Definition sernet.c:94
#define ARRAY_SIZE(x)
Definition shared.h:85
#define MIN(x, y)
Definition shared.h:55
bool next_spaceship_component(struct player *pplayer, struct player_spaceship *ship, struct spaceship_component *fill)
Definition spaceship.c:130
struct specialist * specialist_by_number(const Specialist_type_id id)
Definition specialist.c:110
bool is_normal_specialist_id(Specialist_type_id sp)
Definition specialist.c:196
#define specialist_type_iterate_end
Definition specialist.h:85
#define specialist_type_iterate(sp)
Definition specialist.h:79
#define DEFAULT_SPECIALIST
Definition specialist.h:43
size_t size
Definition specvec.h:72
#define strvec_iterate(psv, str)
#define strvec_iterate_end
struct player * first
bool actor_consuming_always
Definition actions.h:144
int max_distance
Definition actions.h:127
bool quiet
Definition actions.h:134
enum action_sub_target_kind sub_target_kind
Definition actions.h:119
enum action_result result
Definition actions.h:114
char ui_name[MAX_LEN_NAME]
Definition actions.h:130
bv_action_sub_results sub_results
Definition actions.h:115
enum action_actor_kind actor_kind
Definition actions.h:117
bv_actions blocked_by
Definition actions.h:138
enum action_target_kind target_kind
Definition actions.h:118
int min_distance
Definition actions.h:127
struct requirement_vector research_reqs
Definition tech.h:134
struct tech_class * tclass
Definition tech.h:127
double cost
Definition tech.h:147
struct advance * require[AR_SIZE]
Definition tech.h:129
struct name_translation name
Definition tech.h:123
struct strvec * helptext
Definition tech.h:137
bv_tech_flags flags
Definition tech.h:136
int num_reqs
Definition tech.h:153
char graphic_str[MAX_LEN_NAME]
Definition tech.h:125
char graphic_alt[MAX_LEN_NAME]
Definition tech.h:126
Definition city.h:318
int id
Definition city.h:324
struct civ_game::@32::@35 client
bool fog_of_war
Definition game.h:121
struct rgbcolor * plr_bg_color
Definition game.h:103
struct packet_scenario_description scenario_desc
Definition game.h:88
struct packet_ruleset_control control
Definition game.h:83
char * ruleset_summary
Definition game.h:84
struct conn_list * est_connections
Definition game.h:97
int global_init_techs[MAX_NUM_TECH_LIST]
Definition game.h:110
struct packet_game_info info
Definition game.h:89
bool ruleset_ready
Definition game.h:119
int global_init_buildings[MAX_NUM_BUILDING_LIST]
Definition game.h:111
struct packet_scenario_info scenario
Definition game.h:87
char * ruleset_description
Definition game.h:85
struct conn_list * all_connections
Definition game.h:96
struct civ_game::@31 rgame
bool ruleset_init
Definition game.h:118
struct packet_timeout_info tinfo
Definition game.h:91
struct veteran_system * veteran
Definition game.h:101
struct packet_calendar_info calendar
Definition game.h:90
struct government * default_government
Definition game.h:93
struct government * government_during_revolution
Definition game.h:94
int xsize
Definition map_types.h:79
int ysize
Definition map_types.h:79
int north_latitude
Definition map_types.h:80
Continent_id num_continents
Definition map_types.h:83
struct civ_map::@44::@47 client
int south_latitude
Definition map_types.h:81
bool altitude_info
Definition map_types.h:74
int topology_id
Definition map_types.h:72
int wrap_id
Definition map_types.h:73
int * continent_sizes
Definition map_types.h:92
int * ocean_sizes
Definition map_types.h:93
Continent_id num_oceans
Definition map_types.h:84
int ** adj_matrix
Definition map_types.h:153
struct connection conn
Definition client_main.h:96
struct requirement_vector receiver_reqs
Definition diptreaty.h:61
struct requirement_vector giver_reqs
Definition diptreaty.h:60
struct requirement_vector either_reqs
Definition diptreaty.h:62
bool enabled
Definition diptreaty.h:59
bool sound_bell_at_new_turn
Definition options.h:151
bool autoaccept_tileset_suggestion
Definition options.h:184
bool autoaccept_musicset_suggestion
Definition options.h:186
bool draw_city_names
Definition options.h:197
bool draw_city_productions
Definition options.h:199
bool popup_new_cities
Definition options.h:168
bool draw_city_trade_routes
Definition options.h:201
bool wakeup_focus
Definition options.h:160
bool autoaccept_soundset_suggestion
Definition options.h:185
bool ask_city_name
Definition options.h:167
bool draw_city_growth
Definition options.h:198
bool ai_manual_turn_done
Definition options.h:155
int smooth_combat_step_msec
Definition options.h:154
bool draw_full_citybar
Definition options.h:217
bool auto_center_on_combat
Definition options.h:158
bool popup_attack_actions
Definition options.h:170
enum unit_type_flag_id flag
Definition unittype.h:472
enum combat_bonus_type type
Definition unittype.h:473
bool established
Definition connection.h:140
struct player * playing
Definition connection.h:151
int request_id_of_currently_handled_packet
Definition connection.h:193
enum cmdlevel access_level
Definition connection.h:177
bool observer
Definition connection.h:147
char username[MAX_LEN_NAME]
Definition connection.h:164
struct connection::@61::@66 client
char capability[MAX_LEN_CAPSTR]
Definition connection.h:171
int last_processed_request_id_seen
Definition connection.h:190
double ping_time
Definition connection.h:161
bv_unit_classes native_to
Definition extras.h:130
char rmact_gfx[MAX_LEN_NAME]
Definition extras.h:102
bv_extras conflicts
Definition extras.h:133
uint8_t rmcauses
Definition extras.h:95
char act_gfx_alt[MAX_LEN_NAME]
Definition extras.h:100
struct requirement_vector appearance_reqs
Definition extras.h:108
struct strvec * helptext
Definition extras.h:149
bv_extra_flags flags
Definition extras.h:132
char rmact_gfx_alt[MAX_LEN_NAME]
Definition extras.h:103
uint16_t causes
Definition extras.h:94
bv_extras bridged_over
Definition extras.h:135
int removal_time
Definition extras.h:120
char rmact_gfx_alt2[MAX_LEN_NAME]
Definition extras.h:104
int build_time_factor
Definition extras.h:119
struct requirement_vector disappearance_reqs
Definition extras.h:109
bool generated
Definition extras.h:117
int special_idx
Definition extras.h:153
struct extra_type::@26 data
struct requirement_vector rmreqs
Definition extras.h:107
Tech_type_id visibility_req
Definition extras.h:139
enum extra_category category
Definition extras.h:93
char graphic_alt[MAX_LEN_NAME]
Definition extras.h:98
char activity_gfx[MAX_LEN_NAME]
Definition extras.h:99
int disappearance_chance
Definition extras.h:126
int removal_time_factor
Definition extras.h:121
char act_gfx_alt2[MAX_LEN_NAME]
Definition extras.h:101
struct requirement_vector reqs
Definition extras.h:106
bool buildable
Definition extras.h:116
enum extra_unit_seen_type eus
Definition extras.h:128
int defense_bonus
Definition extras.h:124
int appearance_chance
Definition extras.h:125
char graphic_str[MAX_LEN_NAME]
Definition extras.h:97
int build_time
Definition extras.h:118
int infracost
Definition extras.h:122
int no_aggr_near_city
Definition extras.h:137
bv_extras hidden_by
Definition extras.h:134
struct name_translation name
Definition extras.h:90
struct strvec * helptext
Definition government.h:68
struct requirement_vector reqs
Definition government.h:64
char graphic_alt[MAX_LEN_NAME]
Definition government.h:60
Government_type_id item_number
Definition government.h:55
char sound_alt2[MAX_LEN_NAME]
Definition government.h:63
struct name_translation name
Definition government.h:56
char sound_str[MAX_LEN_NAME]
Definition government.h:61
char graphic_str[MAX_LEN_NAME]
Definition government.h:59
bv_gov_flags flags
Definition government.h:67
char sound_alt[MAX_LEN_NAME]
Definition government.h:62
int build_cost
Definition improvement.h:60
char graphic_str[MAX_LEN_NAME]
Definition improvement.h:55
char graphic_alt2[MAX_LEN_NAME]
Definition improvement.h:57
enum impr_genus_id genus
Definition improvement.h:63
char graphic_alt[MAX_LEN_NAME]
Definition improvement.h:56
struct requirement_vector obsolete_by
Definition improvement.h:59
char soundtag_alt[MAX_LEN_NAME]
Definition improvement.h:67
char soundtag_alt2[MAX_LEN_NAME]
Definition improvement.h:68
struct requirement_vector reqs
Definition improvement.h:58
struct strvec * helptext
Definition improvement.h:65
struct name_translation name
Definition improvement.h:52
bv_impr_flags flags
Definition improvement.h:64
char soundtag[MAX_LEN_NAME]
Definition improvement.h:66
struct requirement_vector reqs
Definition multipliers.h:42
struct strvec * helptext
Definition multipliers.h:43
int minimum_turns
Definition multipliers.h:41
struct name_translation name
Definition multipliers.h:33
int init_buildings[MAX_NUM_BUILDING_LIST]
Definition nation.h:123
struct nation_group_list * groups
Definition nation.h:116
struct name_translation noun_plural
Definition nation.h:102
struct nation_set_list * sets
Definition nation.h:113
char flag_graphic_str[MAX_LEN_NAME]
Definition nation.h:103
struct name_translation adjective
Definition nation.h:101
struct nation_type::@54::@57 client
char flag_graphic_alt[MAX_LEN_NAME]
Definition nation.h:104
struct government * init_government
Definition nation.h:126
bool is_pickable
Definition nation.h:163
struct unit_type * init_units[MAX_NUM_UNIT_LIST]
Definition nation.h:127
char * legend
Definition nation.h:107
enum barbarian_type barb_type
Definition nation.h:110
char * translation_domain
Definition nation.h:100
struct nation_style * style
Definition nation.h:106
int init_techs[MAX_NUM_TECH_LIST]
Definition nation.h:122
bool is_playable
Definition nation.h:109
enum event_type event
char message[MAX_LEN_MSG]
int last_turns_shield_surplus
int prod[O_LAST]
int ppl_content[FEELING_LAST]
bv_city_options city_options
int waste[O_LAST]
enum capital_type capital
enum city_acquire_type acquire_type
int unhappy_penalty[O_LAST]
enum city_wl_cancel_behavior wl_cb
bv_imprs improvements
struct worklist worklist
int citizen_base[O_LAST]
int specialists[SP_MAX]
int ppl_unhappy[FEELING_LAST]
int usage[O_LAST]
int surplus[O_LAST]
char name[MAX_LEN_CITYNAME]
int ppl_angry[FEELING_LAST]
int ppl_happy[FEELING_LAST]
int nation_id[MAX_CITY_NATIONALITIES]
int nation_citizens[MAX_CITY_NATIONALITIES]
char name[MAX_LEN_CITYNAME]
enum capital_type capital
int counters[MAX_COUNTERS]
enum event_type event
char message[MAX_LEN_MSG]
Government_type_id government_during_revolution_id
enum ai_level skill_level
enum phase_mode_type phase_mode
enum victory_condition_type victory_conditions
Government_type_id default_government_id
enum diplstate_type type
char inventions[A_LAST+1]
char rule_name[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
enum achievement_type type
action_id alternatives[MAX_NUM_ACTIONS]
struct requirement_vector reqs
enum action_auto_perf_cause cause
struct requirement_vector actor_reqs
struct requirement_vector target_reqs
char ui_name[MAX_LEN_NAME]
enum action_sub_target_kind sub_tgt_kind
enum action_actor_kind act_kind
bv_action_sub_results sub_results
enum action_target_kind tgt_kind
enum action_result result
enum base_gui_type gui_type
char graphic_alt2[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
char rule_name[MAX_LEN_NAME]
char graphic_alt[MAX_LEN_NAME]
char graphic_str[MAX_LEN_NAME]
struct requirement_vector reqs
struct requirement_vector obs_reqs
char soundtag_alt2[MAX_LEN_NAME]
enum impr_genus_id genus
char soundtag[MAX_LEN_NAME]
char soundtag_alt[MAX_LEN_NAME]
struct strvec * helptext
char rule_name[MAX_LEN_NAME]
char graphic[MAX_LEN_NAME]
char citizens_graphic[MAX_LEN_NAME]
char graphic_alt[MAX_LEN_NAME]
struct requirement_vector reqs
char name[MAX_LEN_NAME]
struct requirement_vector giver_reqs
enum clause_type type
struct requirement_vector receiver_reqs
struct requirement_vector either_reqs
char preferred_musicset[MAX_LEN_NAME]
char preferred_tileset[MAX_LEN_NAME]
char preferred_soundset[MAX_LEN_NAME]
enum counter_target type
char name[MAX_LEN_NAME]
struct strvec * helptext
char rule_name[MAX_LEN_NAME]
enum counter_behavior behavior
char text[MAX_LEN_CONTENT]
char name[MAX_LEN_NAME]
char rule_name[MAX_LEN_NAME]
struct requirement_vector reqs
bv_disaster_effects effects
char helptxt[MAX_LEN_PACKET]
char name[MAX_LEN_NAME]
char graphic_str[MAX_LEN_NAME]
struct strvec * helptext
bv_unit_classes native_to
char graphic_alt[MAX_LEN_NAME]
char rmact_gfx[MAX_LEN_NAME]
struct requirement_vector appearance_reqs
char act_gfx_alt[MAX_LEN_NAME]
char act_gfx_alt2[MAX_LEN_NAME]
struct requirement_vector disappearance_reqs
bv_extra_flags flags
char rmact_gfx_alt[MAX_LEN_NAME]
struct requirement_vector rmreqs
enum extra_unit_seen_type eus
char activity_gfx[MAX_LEN_NAME]
char rule_name[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
struct requirement_vector reqs
char rmact_gfx_alt2[MAX_LEN_NAME]
int base_raise_chance[MAX_VET_LEVELS]
int work_raise_chance[MAX_VET_LEVELS]
int move_bonus[MAX_VET_LEVELS]
int power_fact[MAX_VET_LEVELS]
char veteran_name[MAX_VET_LEVELS][MAX_LEN_NAME]
int global_init_techs[MAX_NUM_TECH_LIST]
Impr_type_id global_init_buildings[MAX_NUM_BUILDING_LIST]
struct requirement_vector reqs
bv_goods_flags flags
char rule_name[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
struct strvec * helptext
char helptxt[MAX_LEN_PACKET]
char name[MAX_LEN_NAME]
char sound_alt2[MAX_LEN_NAME]
char sound_str[MAX_LEN_NAME]
struct requirement_vector reqs
char graphic_alt[MAX_LEN_NAME]
Government_type_id id
char graphic_str[MAX_LEN_NAME]
char rule_name[MAX_LEN_NAME]
char sound_alt[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
char helptxt[MAX_LEN_PACKET]
char name[MAX_LEN_NAME]
struct requirement_vector reqs
char name[MAX_LEN_NAME]
Multiplier_type_id id
char rule_name[MAX_LEN_NAME]
struct requirement_vector reqs
char music_peaceful[MAX_LEN_NAME]
char music_combat[MAX_LEN_NAME]
bool hidden[MAX_NUM_NATION_GROUPS]
char groups[MAX_NUM_NATION_GROUPS][MAX_LEN_NAME]
char names[MAX_NUM_NATION_SETS][MAX_LEN_NAME]
char rule_names[MAX_NUM_NATION_SETS][MAX_LEN_NAME]
char descriptions[MAX_NUM_NATION_SETS][MAX_LEN_MSG]
char graphic_alt[MAX_LEN_NAME]
char graphic_str[MAX_LEN_NAME]
bool leader_is_male[MAX_NUM_LEADERS]
int sets[MAX_NUM_NATION_SETS]
Impr_type_id init_buildings[MAX_NUM_BUILDING_LIST]
char adjective[MAX_LEN_NAME]
char translation_domain[MAX_LEN_NAME]
char leader_name[MAX_NUM_LEADERS][MAX_LEN_NAME]
int init_techs[MAX_NUM_TECH_LIST]
Unit_type_id init_units[MAX_NUM_UNIT_LIST]
char legend[MAX_LEN_MSG]
int groups[MAX_NUM_NATION_GROUPS]
Government_type_id init_government_id
enum barbarian_type barbarian_type
char noun_plural[MAX_LEN_NAME]
char rule_name[MAX_LEN_NAME]
bv_road_flags flags
enum road_gui_type gui_type
bv_max_extras integrates
int tile_incr_const[O_LAST]
enum road_compat compat
int tile_incr[O_LAST]
enum road_move_mode move_mode
int tile_bonus[O_LAST]
struct requirement_vector first_reqs
char plural_name[MAX_LEN_NAME]
struct requirement_vector reqs
Specialist_type_id id
char rule_name[MAX_LEN_NAME]
char short_name[MAX_LEN_NAME]
char graphic_alt[MAX_LEN_NAME]
char graphic_str[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
char rule_name[MAX_LEN_NAME]
char text[MAX_LEN_CONTENT]
char rule_name[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
char helptxt[MAX_LEN_PACKET]
struct strvec * helptext
char name[MAX_LEN_NAME]
char graphic_str[MAX_LEN_NAME]
char rule_name[MAX_LEN_NAME]
char graphic_alt[MAX_LEN_NAME]
bv_tech_flags flags
struct requirement_vector research_reqs
char name[MAX_LEN_NAME]
char helptxt[MAX_LEN_PACKET]
Terrain_type_id transform_result
char name[MAX_LEN_NAME]
int resource_freq[MAX_EXTRA_TYPES]
bv_terrain_flags flags
Resource_type_id resources[MAX_EXTRA_TYPES]
char graphic_alt[MAX_LEN_NAME]
bv_unit_classes native_to
int road_output_incr_pct[O_LAST]
char graphic_alt2[MAX_LEN_NAME]
Terrain_type_id cultivate_result
int extra_removal_times[MAX_EXTRA_TYPES]
Terrain_type_id plant_result
char rule_name[MAX_LEN_NAME]
char graphic_str[MAX_LEN_NAME]
struct strvec * helptext
char rule_name[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
enum trade_route_illegal_cancelling cancelling
enum trade_route_bonus_type bonus_type
enum combat_bonus_type type
enum unit_type_flag_id flag
char helptxt[MAX_LEN_PACKET]
bv_unit_class_flags flags
char rule_name[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
char helptxt[MAX_LEN_PACKET]
char name[MAX_LEN_NAME]
enum vision_layer vlayer
enum transp_def_type tp_defense
char rule_name[MAX_LEN_NAME]
int base_raise_chance[MAX_VET_LEVELS]
int move_bonus[MAX_VET_LEVELS]
int work_raise_chance[MAX_VET_LEVELS]
char sound_move[MAX_LEN_NAME]
bv_unit_classes disembarks
bv_unit_classes cargo
bv_unit_type_flags flags
char sound_fight_alt[MAX_LEN_NAME]
char graphic_str[MAX_LEN_NAME]
bv_unit_classes targets
struct requirement_vector build_reqs
int power_fact[MAX_VET_LEVELS]
char veteran_name[MAX_VET_LEVELS][MAX_LEN_NAME]
bv_unit_classes embarks
char sound_fight[MAX_LEN_NAME]
char sound_move_alt[MAX_LEN_NAME]
struct strvec * helptext
char graphic_alt2[MAX_LEN_NAME]
char graphic_alt[MAX_LEN_NAME]
char name[MAX_LEN_NAME]
bv_unit_type_roles roles
char description[MAX_LEN_CONTENT]
char authors[MAX_LEN_PACKET/3]
bv_spaceship_structure structure
Resource_type_id resource
enum known_type known
Continent_id continent
char spec_sprite[MAX_LEN_NAME]
Terrain_type_id terrain
char label[MAX_LEN_MAP_LABEL]
enum route_direction direction
struct act_prob action_probabilities[MAX_NUM_ACTIONS]
enum action_decision action_decision_want
enum unit_activity activity
struct unit_order orders[MAX_LEN_ROUTE]
Unit_type_id type
enum unit_activity changed_from
enum direction8 facing
int upkeep[O_LAST]
enum server_side_agent ssa_controller
enum direction8 facing
char user[MAX_LEN_NAME]
enum unit_activity activity
enum ai_level skill_level
Definition player.h:116
enum barbarian_type barbarian_type
Definition player.h:122
int science_cost
Definition player.h:119
int love[MAX_NUM_PLAYER_SLOTS]
Definition player.h:124
int infra_points
Definition player.h:67
enum spaceship_state state
Definition spaceship.h:108
struct city_list * cities
Definition player.h:281
struct player_ai ai_common
Definition player.h:288
bv_plr_flags flags
Definition player.h:292
struct dbv tile_vision[V_COUNT]
Definition player.h:359
int primary_capital_id
Definition player.h:275
bool is_male
Definition player.h:257
int wonders[B_LAST]
Definition player.h:305
struct government * target_government
Definition player.h:259
int autoselect_weight
Definition player.h:299
char username[MAX_LEN_NAME]
Definition player.h:252
bool is_connected
Definition player.h:296
int revolution_finishes
Definition player.h:273
int nturns_idle
Definition player.h:265
struct government * government
Definition player.h:258
struct dbv tile_known
Definition player.h:310
int turns_alive
Definition player.h:266
bool was_created
Definition player.h:294
int tech_upkeep
Definition player.h:363
struct unit_list * units
Definition player.h:282
struct conn_list * connections
Definition player.h:298
bool is_alive
Definition player.h:268
bv_player real_embassy
Definition player.h:277
struct player_economic economic
Definition player.h:284
int culture
Definition player.h:367
struct player_spaceship spaceship
Definition player.h:286
char name[MAX_LEN_NAME]
Definition player.h:251
bv_player gives_shared_vision
Definition player.h:302
enum mood_type mood
Definition player.h:361
struct player_score score
Definition player.h:283
struct multiplier_value multipliers[MAX_NUM_MULTIPLIERS]
Definition player.h:314
bool color_changeable
Definition player.h:365
int music_style
Definition player.h:280
struct nation_style * style
Definition player.h:279
bool phase_done
Definition player.h:263
bv_player gives_shared_tiles
Definition player.h:304
bool is_ready
Definition player.h:262
int history
Definition player.h:316
struct player::@73::@76 client
struct rgbcolor * rgb
Definition player.h:312
bool unassigned_user
Definition player.h:253
int output[O_LAST]
Definition terrain.h:54
int g
Definition rgbcolor.h:34
int b
Definition rgbcolor.h:34
int r
Definition rgbcolor.h:34
struct requirement_vector reqs
Definition specialist.h:38
char graphic_alt[MAX_LEN_NAME]
Definition specialist.h:36
struct strvec * helptext
Definition specialist.h:40
char graphic_str[MAX_LEN_NAME]
Definition specialist.h:35
struct name_translation name
Definition specialist.h:31
struct name_translation abbreviation
Definition specialist.h:32
Definition map.c:40
struct terrain * cultivate_result
Definition terrain.h:108
int placing_time
Definition terrain.h:120
struct extra_type ** resources
Definition terrain.h:97
struct strvec * helptext
Definition terrain.h:156
char graphic_alt2[MAX_LEN_NAME]
Definition terrain.h:82
bv_terrain_flags flags
Definition terrain.h:152
int * resource_freq
Definition terrain.h:98
bv_unit_classes native_to
Definition terrain.h:150
int road_time
Definition terrain.h:106
struct name_translation name
Definition terrain.h:77
int plant_time
Definition terrain.h:112
struct terrain * plant_result
Definition terrain.h:111
int irrigation_food_incr
Definition terrain.h:114
int defense_bonus
Definition terrain.h:93
int cultivate_time
Definition terrain.h:109
int movement_cost
Definition terrain.h:92
const struct unit_type * animal
Definition terrain.h:130
int pillage_time
Definition terrain.h:125
int output[O_LAST]
Definition terrain.h:95
int transform_time
Definition terrain.h:124
char graphic_alt[MAX_LEN_NAME]
Definition terrain.h:81
int mining_time
Definition terrain.h:118
struct rgbcolor * rgb
Definition terrain.h:154
char graphic_str[MAX_LEN_NAME]
Definition terrain.h:80
enum terrain_class tclass
Definition terrain.h:90
int road_output_incr_pct[O_LAST]
Definition terrain.h:104
int extra_removal_times[MAX_EXTRA_TYPES]
Definition terrain.h:128
struct terrain * transform_result
Definition terrain.h:122
int irrigation_time
Definition terrain.h:115
int base_time
Definition terrain.h:105
int mining_shield_incr
Definition terrain.h:117
Definition tile.h:50
char * spec_sprite
Definition tile.h:67
char * label
Definition tile.h:66
int altitude
Definition tile.h:65
bv_extras extras
Definition tile.h:55
struct unit_list * units
Definition tile.h:58
struct player * extras_owner
Definition tile.h:63
int infra_turns
Definition tile.h:62
struct extra_type * placing
Definition tile.h:61
Continent_id continent
Definition tile.h:54
int hp_loss_pct
Definition unittype.h:155
int non_native_def_pct
Definition unittype.h:156
int min_speed
Definition unittype.h:154
struct name_translation name
Definition unittype.h:151
struct strvec * helptext
Definition unittype.h:159
bv_unit_class_flags flags
Definition unittype.h:157
enum unit_orders order
Definition unit.h:94
int action
Definition unit.h:102
int transport_capacity
Definition unittype.h:530
struct unit_class * uclass
Definition unittype.h:563
int pop_cost
Definition unittype.h:518
struct requirement_vector build_reqs
Definition unittype.h:527
int defense_strength
Definition unittype.h:523
bv_unit_classes cargo
Definition unittype.h:565
int firepower
Definition unittype.h:532
int paratroopers_range
Definition unittype.h:548
char graphic_alt[MAX_LEN_NAME]
Definition unittype.h:511
bool worker
Definition unittype.h:582
char sound_move_alt[MAX_LEN_NAME]
Definition unittype.h:514
int build_cost
Definition unittype.h:517
int convert_time
Definition unittype.h:538
int city_size
Definition unittype.h:557
struct veteran_system * veteran
Definition unittype.h:551
const struct unit_type * obsoleted_by
Definition unittype.h:536
int vision_radius_sq
Definition unittype.h:529
int move_rate
Definition unittype.h:524
bv_unit_classes targets
Definition unittype.h:568
enum vision_layer vlayer
Definition unittype.h:576
struct strvec * helptext
Definition unittype.h:578
struct unit_type::@90 adv
int bombard_rate
Definition unittype.h:554
char graphic_str[MAX_LEN_NAME]
Definition unittype.h:510
int city_slots
Definition unittype.h:559
char sound_move[MAX_LEN_NAME]
Definition unittype.h:513
char sound_fight_alt[MAX_LEN_NAME]
Definition unittype.h:516
struct name_translation name
Definition unittype.h:507
bv_unit_type_roles roles
Definition unittype.h:542
enum transp_def_type tp_defense
Definition unittype.h:561
int upkeep[O_LAST]
Definition unittype.h:545
char graphic_alt2[MAX_LEN_NAME]
Definition unittype.h:512
bv_unit_classes disembarks
Definition unittype.h:574
const struct unit_type * converted_to
Definition unittype.h:537
bv_unit_type_flags flags
Definition unittype.h:541
char sound_fight[MAX_LEN_NAME]
Definition unittype.h:515
bv_unit_classes embarks
Definition unittype.h:571
int attack_strength
Definition unittype.h:522
int happy_cost
Definition unittype.h:544
struct combat_bonus_list * bonuses
Definition unittype.h:533
struct specialist * spec_type
Definition unittype.h:520
Definition unit.h:140
int length
Definition unit.h:198
int upkeep[O_LAST]
Definition unit.h:150
bool has_orders
Definition unit.h:196
bool occupied
Definition unit.h:222
enum action_decision action_decision_want
Definition unit.h:205
int battlegroup
Definition unit.h:194
enum unit_activity activity
Definition unit.h:159
int moves_left
Definition unit.h:152
int id
Definition unit.h:147
struct unit::@83 orders
bool moved
Definition unit.h:176
int index
Definition unit.h:198
bool vigilant
Definition unit.h:200
int hp
Definition unit.h:153
int fuel
Definition unit.h:155
struct extra_type * changed_from_target
Definition unit.h:173
int current_form_turn
Definition unit.h:211
bool stay
Definition unit.h:208
bool colored
Definition unit.h:225
enum direction8 facing
Definition unit.h:144
bool asking_city_name
Definition unit.h:228
struct tile * tile
Definition unit.h:142
struct unit::@84::@86 client
struct extra_type * activity_target
Definition unit.h:167
int activity_count
Definition unit.h:165
struct unit_order * list
Definition unit.h:201
enum unit_activity changed_from
Definition unit.h:171
struct player * nationality
Definition unit.h:146
int transported_by
Definition unit.h:219
bool repeat
Definition unit.h:199
int homecity
Definition unit.h:148
bool paradropped
Definition unit.h:177
bool done_moving
Definition unit.h:184
int birth_turn
Definition unit.h:210
struct goods_type * carrying
Definition unit.h:189
struct tile * goto_tile
Definition unit.h:157
struct tile * action_decision_tile
Definition unit.h:206
const struct unit_type * utype
Definition unit.h:141
int veteran
Definition unit.h:154
int changed_from_count
Definition unit.h:172
struct player * owner
Definition unit.h:145
enum unit_focus_status focus_status
Definition unit.h:217
enum server_side_agent ssa_controller
Definition unit.h:175
int yes
Definition voteinfo.h:36
int num_voters
Definition voteinfo.h:39
bool passed
Definition voteinfo.h:41
int abstain
Definition voteinfo.h:38
int vote_no
Definition voteinfo.h:31
int no
Definition voteinfo.h:37
struct civ_map map
struct nation_style * style_by_number(int id)
Definition style.c:88
void styles_alloc(int count)
Definition style.c:36
struct music_style * music_style_by_number(int id)
Definition style.c:171
void music_styles_alloc(int count)
Definition style.c:133
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
size_t fc_strlcat(char *dest, const char *src, size_t n)
Definition support.c:822
#define sz_strlcpy(dest, src)
Definition support.h:195
#define TRUE
Definition support.h:46
#define FALSE
Definition support.h:47
#define fc_strncmp(_s1_, _s2_, _len_)
Definition support.h:160
int team_count(void)
Definition team.c:375
struct team_slot * team_slot_by_number(int team_id)
Definition team.c:175
bool team_add_player(struct player *pplayer, struct team *pteam)
Definition team.c:467
struct team * team_new(struct team_slot *tslot)
Definition team.c:317
void team_slot_set_defined_name(struct team_slot *tslot, const char *team_name)
Definition team.c:288
struct advance * advance_by_number(const Tech_type_id atype)
Definition tech.c:107
void set_user_tech_flag_name(enum tech_flag_id id, const char *name, const char *helptxt)
Definition tech.c:404
struct tech_class * tech_class_by_number(const int idx)
Definition tech.c:330
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:98
#define A_FUTURE
Definition tech.h:46
#define A_NEVER
Definition tech.h:51
#define advance_index_iterate_end
Definition tech.h:246
tech_req
Definition tech.h:107
@ AR_TWO
Definition tech.h:109
@ AR_ROOT
Definition tech.h:110
@ AR_ONE
Definition tech.h:108
static Tech_type_id advance_count(void)
Definition tech.h:167
#define TECH_USER_LAST
Definition tech.h:103
#define A_NONE
Definition tech.h:43
#define A_UNKNOWN
Definition tech.h:49
#define A_LAST
Definition tech.h:45
#define advance_index_iterate(_start, _index)
Definition tech.h:242
Terrain_type_id terrain_count(void)
Definition terrain.c:120
struct terrain * terrain_by_number(const Terrain_type_id type)
Definition terrain.c:158
const char * terrain_rule_name(const struct terrain *pterrain)
Definition terrain.c:250
struct resource_type * resource_type_init(struct extra_type *pextra)
Definition terrain.c:276
void set_user_terrain_flag_name(enum terrain_flag_id id, const char *name, const char *helptxt)
Definition terrain.c:792
#define MAX_NUM_TERRAINS
Definition terrain.h:69
void tile_set_terrain(struct tile *ptile, struct terrain *pterrain)
Definition tile.c:125
void tile_set_owner(struct tile *ptile, struct player *pplayer, struct tile *claimer)
Definition tile.c:69
bool tile_set_label(struct tile *ptile, const char *label)
Definition tile.c:1098
void tile_set_resource(struct tile *ptile, struct extra_type *presource)
Definition tile.c:350
struct city * tile_city(const struct tile *ptile)
Definition tile.c:83
void tile_set_worked(struct tile *ptile, struct city *pcity)
Definition tile.c:107
#define tile_index(_pt_)
Definition tile.h:89
#define tile_worked(_tile)
Definition tile.h:119
#define tile_resource(_tile)
Definition tile.h:103
known_type
Definition tile.h:35
@ TILE_KNOWN_UNSEEN
Definition tile.h:37
@ TILE_UNKNOWN
Definition tile.h:36
@ TILE_KNOWN_SEEN
Definition tile.h:38
#define tile_list_iterate(tile_list, ptile)
Definition tile.h:74
#define tile_terrain(_tile)
Definition tile.h:115
#define TILE_XY(ptile)
Definition tile.h:43
#define tile_list_iterate_end
Definition tile.h:76
#define tile_continent(_tile)
Definition tile.h:93
#define tile_owner(_tile)
Definition tile.h:97
struct tiledef * tiledef_by_number(int id)
Definition tiledef.c:83
void tileset_setup_unit_type(struct tileset *t, struct unit_type *ut)
Definition tilespec.c:3999
void tileset_setup_government(struct tileset *t, struct government *gov)
Definition tilespec.c:4608
void tileset_setup_specialist_type_default_set(struct tileset *t, Specialist_type_id id)
Definition tilespec.c:3088
void tileset_setup_tile_type(struct tileset *t, const struct terrain *pterrain)
Definition tilespec.c:4342
void tileset_player_init(struct tileset *t, struct player *pplayer)
Definition tilespec.c:7624
bool unit_drawn_with_city_outline(const struct unit *punit, bool check_focus)
Definition tilespec.c:5714
void tileset_setup_impr_type(struct tileset *t, struct impr_type *pimprove)
Definition tilespec.c:4033
void tileset_background_init(struct tileset *t)
Definition tilespec.c:7704
void tileset_setup_tech_type(struct tileset *t, struct advance *padvance)
Definition tilespec.c:4049
void tileset_setup_city_tiles(struct tileset *t, int style)
Definition tilespec.c:6660
void tilespec_reread_frozen_refresh(const char *tname)
Definition tilespec.c:1591
void tileset_setup_extra(struct tileset *t, struct extra_type *pextra)
Definition tilespec.c:4068
const char * tileset_basename(const struct tileset *t)
Definition tilespec.c:730
void finish_loading_sprites(struct tileset *t)
Definition tilespec.c:3809
const char * tileset_name_get(struct tileset *t)
Definition tilespec.c:7775
void tileset_error(enum log_level level, const char *tset_name, const char *format,...)
Definition tilespec.c:650
bool tilespec_reread(const char *new_tileset_name, bool game_fully_initialized, float scale)
Definition tilespec.c:1401
void tileset_setup_nation_flag(struct tileset *t, struct nation_type *nation)
Definition tilespec.c:4623
void tileset_ruleset_reset(struct tileset *t)
Definition tilespec.c:7739
#define MAX_NUM_CITIZEN_SPRITES
Definition tilespec.h:199
#define NUM_WALL_TYPES
Definition tilespec.h:361
int city_num_trade_routes(const struct city *pcity)
struct trade_route_settings * trade_route_settings_by_type(enum trade_route_type type)
struct goods_type * goods_by_number(Goods_type_id id)
bool unit_transport_load(struct unit *pcargo, struct unit *ptrans, bool force)
Definition unit.c:2474
struct unit * unit_transport_get(const struct unit *pcargo)
Definition unit.c:2545
bool unit_transport_unload(struct unit *pcargo)
Definition unit.c:2494
struct unit * unit_virtual_create(struct player *pplayer, struct city *pcity, const struct unit_type *punittype, int veteran_level)
Definition unit.c:1688
void unit_virtual_destroy(struct unit *punit)
Definition unit.c:1793
void unit_tile_set(struct unit *punit, struct tile *ptile)
Definition unit.c:1311
bool unit_transported(const struct unit *pcargo)
Definition unit.c:2529
struct unit_list * unit_transport_cargo(const struct unit *ptrans)
Definition unit.c:2555
#define unit_tile(_pu)
Definition unit.h:407
@ FOCUS_AVAIL
Definition unit.h:54
@ FOCUS_WAIT
Definition unit.h:54
@ ORDER_PERFORM_ACTION
Definition unit.h:48
#define unit_owner(_pu)
Definition unit.h:406
#define unit_list_iterate(unitlist, punit)
Definition unitlist.h:31
#define unit_list_iterate_end
Definition unitlist.h:33
void set_unit_class_caches(struct unit_class *pclass)
Definition unittype.c:2788
const struct unit_type * unit_type_get(const struct unit *punit)
Definition unittype.c:126
const char * unit_name_translation(const struct unit *punit)
Definition unittype.c:1595
const char * unit_rule_name(const struct unit *punit)
Definition unittype.c:1613
void set_unit_move_type(struct unit_class *puclass)
Definition unittype.c:2956
void set_unit_type_caches(struct unit_type *ptype)
Definition unittype.c:2847
struct unit_class * uclass_by_number(const Unit_Class_id id)
Definition unittype.c:2506
void veteran_system_definition(struct veteran_system *vsystem, int level, const char *vlist_name, int vlist_power, int vlist_move, int vlist_raise, int vlist_wraise)
Definition unittype.c:2717
struct unit_type * utype_by_number(const Unit_type_id id)
Definition unittype.c:114
void unit_type_action_cache_set(struct unit_type *ptype)
Definition unittype.c:940
void set_user_unit_class_flag_name(enum unit_class_flag_id id, const char *name, const char *helptxt)
Definition unittype.c:1838
struct veteran_system * veteran_system_new(int count)
Definition unittype.c:2686
bool utype_can_do_action(const struct unit_type *putype, const action_id act_id)
Definition unittype.c:396
void set_user_unit_type_flag_name(enum unit_type_flag_id id, const char *name, const char *helptxt)
Definition unittype.c:1902
#define UCF_LAST_USER_FLAG
Definition unittype.h:127
#define unit_class_iterate(_p)
Definition unittype.h:916
#define UTYF_LAST_USER_FLAG
Definition unittype.h:335
#define unit_type_iterate(_p)
Definition unittype.h:863
#define U_LAST
Definition unittype.h:40
#define unit_class_iterate_end
Definition unittype.h:923
#define unit_type_iterate_end
Definition unittype.h:870
void economy_report_dialog_update(void)
void set_client_page(enum client_pages page)
void science_report_dialog_update(void)
void update_queue_processing_finished(int request_id)
void units_report_dialog_update(void)
void update_queue_processing_started(int request_id)
enum client_pages get_client_page(void)
void unit_select_dialog_update(void)
#define FREECIV_DISTRIBUTOR
Definition version_gen.h:26
#define EMERGENCY_VERSION
Definition version_gen.h:9
#define vision_layer_iterate(v)
Definition vision.h:77
#define vision_layer_iterate_end
Definition vision.h:80
void voteinfo_queue_delayed_remove(int vote_no)
Definition voteinfo.c:53
struct voteinfo * voteinfo_queue_find(int vote_no)
Definition voteinfo.c:150
void voteinfo_queue_add(int vote_no, const char *user, const char *desc, int percent_required, int flags)
Definition voteinfo.c:123
bool worker_task_is_sane(struct worker_task *ptask)
Definition workertask.c:40
#define worker_task_list_iterate(tasklist, ptask)
Definition workertask.h:33
#define worker_task_list_iterate_end
Definition workertask.h:35
void worklist_copy(struct worklist *dst, const struct worklist *src)
Definition worklist.c:112
void worklist_init(struct worklist *pwl)
Definition worklist.c:38