Freeciv-3.3: /fast/freeciv/nightly/main/client/packhand.c Source File

Freeciv-3.3

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 "traderoutes.h"
55#include "unit.h"
56#include "unitlist.h"
57#include "worklist.h"
58
59/* client/include */
60#include "chatline_g.h"
61#include "citydlg_g.h"
62#include "cityrep_g.h"
63#include "connectdlg_g.h"
64#include "dialogs_g.h"
65#include "editgui_g.h"
66#include "gui_main_g.h"
67#include "inteldlg_g.h"
68#include "mapctrl_g.h" /* popup_newcity_dialog() */
69#include "mapview_g.h"
70#include "menu_g.h"
71#include "messagewin_g.h"
72#include "pages_g.h"
73#include "plrdlg_g.h"
74#include "ratesdlg_g.h"
75#include "repodlgs_g.h"
76#include "spaceshipdlg_g.h"
77#include "voteinfo_bar_g.h"
78#include "wldlg_g.h"
79
80/* client */
81#include "agents.h"
82#include "attribute.h"
83#include "audio.h"
84#include "client_main.h"
85#include "climap.h"
86#include "climisc.h"
87#include "clitreaty.h"
88#include "connectdlg_common.h"
89#include "control.h"
90#include "editor.h"
91#include "goto.h" /* client_goto_init() */
92#include "helpdata.h" /* boot_help_texts() */
93#include "mapview_common.h"
94#include "music.h"
95#include "options.h"
96#include "overview_common.h"
97#include "tilespec.h"
98#include "update_queue.h"
99#include "voteinfo.h"
100
101/* client/luascript */
102#include "script_client.h"
103
104#include "packhand.h"
105
106/* Define this macro to get additional debug output about the transport
107 * status of the units. */
108#undef DEBUG_TRANSPORT
109
110static void city_packet_common(struct city *pcity, struct tile *pcenter,
111 struct player *powner,
112 struct tile_list *worked_tiles,
113 bool is_new, bool popup, bool investigate);
114static bool handle_unit_packet_common(struct unit *packet_unit);
115
116
117/* The dumbest of cities, placeholders for unknown and unseen cities. */
118static struct {
119 struct city_list *cities;
120 struct player *placeholder;
121} invisible = {
122 .cities = NULL,
123 .placeholder = NULL
124};
125
126static struct {
127 int len;
128 enum event_type event;
129 char *caption;
130 char *headline;
131 char *lines;
132 int parts;
133} page_msg_report = { .parts = 0 };
134
135extern const char forced_tileset_name[];
136
137 static int last_turn = 0;
138
139/* Refresh the action selection dialog */
140#define REQEST_BACKGROUND_REFRESH (1)
141/* Get possible actions for fast auto attack. */
142#define REQEST_BACKGROUND_FAST_AUTO_ATTACK (2)
143
144/* A unit will auto attack with the following actions. */
145 const action_id auto_attack_actions[] = {
146 ACTION_CAPTURE_UNITS,
147 ACTION_BOMBARD, ACTION_BOMBARD2, ACTION_BOMBARD3,
148 ACTION_BOMBARD_LETHAL,
149 ACTION_NUKE, ACTION_NUKE_CITY, ACTION_NUKE_UNITS,
150 ACTION_ATTACK, ACTION_SUICIDE_ATTACK,
151 ACTION_WIPE_UNITS,
152 ACTION_CONQUER_CITY, ACTION_CONQUER_CITY2,
153 ACTION_CONQUER_CITY3, ACTION_CONQUER_CITY4,
154 ACTION_STRIKE_PRODUCTION,
155 ACTION_CONQUER_EXTRAS, ACTION_CONQUER_EXTRAS2,
156 ACTION_CONQUER_EXTRAS3, ACTION_CONQUER_EXTRAS4,
157 /* End the action list. */
158 ACTION_NONE
159};
160
161/* A unit will not auto attack if any of these actions are legal. */
162 const action_id auto_attack_blockers[] = {
163 ACTION_ESTABLISH_EMBASSY, ACTION_ESTABLISH_EMBASSY_STAY,
164 ACTION_SPY_INVESTIGATE_CITY, ACTION_INV_CITY_SPEND,
165 ACTION_SPY_POISON, ACTION_SPY_POISON_ESC,
166 ACTION_SPY_STEAL_GOLD, ACTION_SPY_STEAL_GOLD_ESC,
167 ACTION_SPY_SPREAD_PLAGUE,
168 ACTION_SPY_SABOTAGE_CITY, ACTION_SPY_SABOTAGE_CITY_ESC,
169 ACTION_SPY_TARGETED_SABOTAGE_CITY,
170 ACTION_SPY_TARGETED_SABOTAGE_CITY_ESC,
171 ACTION_SPY_SABOTAGE_CITY_PRODUCTION,
172 ACTION_SPY_SABOTAGE_CITY_PRODUCTION_ESC,
173 ACTION_SPY_STEAL_TECH, ACTION_SPY_STEAL_TECH_ESC,
174 ACTION_SPY_TARGETED_STEAL_TECH,
175 ACTION_SPY_TARGETED_STEAL_TECH_ESC,
176 ACTION_SPY_INCITE_CITY, ACTION_SPY_INCITE_CITY_ESC,
177 ACTION_TRADE_ROUTE, ACTION_MARKETPLACE,
178 ACTION_HELP_WONDER,
179 ACTION_SPY_BRIBE_UNIT,
180 ACTION_SPY_SABOTAGE_UNIT, ACTION_SPY_SABOTAGE_UNIT_ESC,
181 ACTION_SPY_ATTACK,
182 ACTION_FOUND_CITY,
183 ACTION_JOIN_CITY,
184 ACTION_STEAL_MAPS, ACTION_STEAL_MAPS_ESC,
185 ACTION_SPY_NUKE, ACTION_SPY_NUKE_ESC,
186 ACTION_DESTROY_CITY,
187 ACTION_EXPEL_UNIT,
188 ACTION_DISBAND_UNIT_RECOVER,
189 ACTION_HOME_CITY,
190 ACTION_HOMELESS,
191 ACTION_UPGRADE_UNIT,
192 ACTION_PARADROP, ACTION_PARADROP_CONQUER, ACTION_PARADROP_FRIGHTEN,
193 ACTION_PARADROP_FRIGHTEN_CONQUER, ACTION_PARADROP_ENTER,
194 ACTION_PARADROP_ENTER_CONQUER,
195 ACTION_AIRLIFT,
196 ACTION_HEAL_UNIT, ACTION_HEAL_UNIT2,
197 ACTION_TRANSFORM_TERRAIN,
198 ACTION_CULTIVATE,
199 ACTION_PLANT,
200 ACTION_PILLAGE,
201 ACTION_CLEAN,
202 ACTION_ROAD,
203 ACTION_BASE,
204 ACTION_MINE,
205 ACTION_IRRIGATE,
206 ACTION_HUT_ENTER, ACTION_HUT_ENTER2, ACTION_HUT_ENTER3, ACTION_HUT_ENTER4,
207 ACTION_HUT_FRIGHTEN, ACTION_HUT_FRIGHTEN2,
208 ACTION_HUT_FRIGHTEN3, ACTION_HUT_FRIGHTEN4,
209 /* Actually an attack but it needs a target to be specified. */
210 ACTION_STRIKE_BUILDING,
211 /* End the action list. */
212 ACTION_NONE
213};
214
215/************************************************************************/
218 void packhand_free(void)
219{
220 if (NULL != invisible.cities) {
221 city_list_iterate(invisible.cities, pcity) {
222 idex_unregister_city(&wld, pcity);
223 destroy_city_virtual(pcity);
224 } city_list_iterate_end;
225
226 city_list_destroy(invisible.cities);
227 invisible.cities = NULL;
228 }
229
230 if (NULL != invisible.placeholder) {
231 free(invisible.placeholder);
232 invisible.placeholder = NULL;
233 }
234}
235
236/************************************************************************/
239 static void packhand_init(void)
240{
241 packhand_free();
242
243 invisible.cities = city_list_new();
244
245 /* Can't use player_new() here, as it will register the player. */
246 invisible.placeholder = fc_calloc(1, sizeof(*invisible.placeholder));
247 memset(invisible.placeholder, 0, sizeof(*invisible.placeholder));
248 /* Set some values to prevent bugs ... */
249 sz_strlcpy(invisible.placeholder->name, ANON_PLAYER_NAME);
250 sz_strlcpy(invisible.placeholder->username, _(ANON_USER_NAME));
251 invisible.placeholder->unassigned_user = TRUE;
252 sz_strlcpy(invisible.placeholder->ranked_username, ANON_USER_NAME);
253 invisible.placeholder->unassigned_ranked = TRUE;
254}
255
256/************************************************************************/
264 static struct unit *unpackage_unit(const struct packet_unit_info *packet)
265{
266 struct unit *punit = unit_virtual_create(player_by_number(packet->owner),
267 nullptr,
268 utype_by_number(packet->type),
269 packet->veteran);
270
271 /* Owner, veteran, and type fields are already filled in by
272 * unit_virtual_create() */
273 punit->nationality = player_by_number(packet->nationality);
274 punit->id = packet->id;
275 unit_tile_set(punit, index_to_tile(&(wld.map), packet->tile));
276 punit->facing = packet->facing;
277 punit->homecity = packet->homecity;
278 output_type_iterate(o) {
279 punit->upkeep[o] = packet->upkeep[o];
280 } output_type_iterate_end;
281 punit->moves_left = packet->movesleft;
282 punit->hp = packet->hp;
283 punit->activity = packet->activity;
284 punit->activity_count = packet->activity_count;
285
286 if (packet->activity_tgt == EXTRA_NONE) {
287 punit->activity_target = nullptr;
288 } else {
289 punit->activity_target = extra_by_number(packet->activity_tgt);
290 }
291
292 punit->changed_from = packet->changed_from;
293 punit->changed_from_count = packet->changed_from_count;
294
295 if (packet->changed_from_tgt == EXTRA_NONE) {
296 punit->changed_from_target = nullptr;
297 } else {
298 punit->changed_from_target = extra_by_number(packet->changed_from_tgt);
299 }
300
301 punit->ssa_controller = packet->ssa_controller;
302 punit->fuel = packet->fuel;
303 punit->goto_tile = index_to_tile(&(wld.map), packet->goto_tile);
304 punit->paradropped = packet->paradropped;
305 punit->done_moving = packet->done_moving;
306 punit->stay = packet->stay;
307 punit->birth_turn = packet->birth_turn;
308 punit->current_form_turn = packet->current_form_turn;
309
310 /* Transporter / transporting information. */
311 punit->client.occupied = packet->occupied;
312 if (packet->transported) {
313 punit->client.transported_by = packet->transported_by;
314 } else {
315 punit->client.transported_by = -1;
316 }
317 if (packet->carrying >= 0) {
318 punit->carrying = goods_by_number(packet->carrying);
319 } else {
320 punit->carrying = nullptr;
321 }
322
323 punit->battlegroup = packet->battlegroup;
324 punit->has_orders = packet->has_orders;
325 punit->orders.length = packet->orders_length;
326 punit->orders.index = packet->orders_index;
327 punit->orders.repeat = packet->orders_repeat;
328 punit->orders.vigilant = packet->orders_vigilant;
329 if (punit->has_orders) {
330 int i;
331
332 for (i = 0; i < packet->orders_length; i++) {
333 /* Just an assert. The client doesn't use the action data. */
334 fc_assert(packet->orders[i].order != ORDER_PERFORM_ACTION
335 || action_id_exists(packet->orders[i].action));
336 }
337 punit->orders.list
338 = fc_malloc(punit->orders.length * sizeof(*punit->orders.list));
339 memcpy(punit->orders.list, packet->orders,
340 punit->orders.length * sizeof(*punit->orders.list));
341 }
342
343 punit->action_decision_want = packet->action_decision_want;
344 punit->action_decision_tile
345 = index_to_tile(&(wld.map), packet->action_decision_tile);
346
347 punit->client.asking_city_name = FALSE;
348
349 return punit;
350}
351
352/************************************************************************/
362static struct unit *
363unpackage_short_unit(const struct packet_unit_short_info *packet)
364{
365 struct unit *punit;
366 struct player *owner;
367
368 if (packet->owner == OWNER_NONE) {
369 owner = nullptr;
370 } else {
371 owner = player_by_number(packet->owner);
372 }
373
374 punit = unit_virtual_create(owner, nullptr,
375 utype_by_number(packet->type),
376 0);
377
378 /* Owner and type fields are already filled in by unit_virtual_create() */
379 punit->id = packet->id;
380 unit_tile_set(punit, index_to_tile(&(wld.map), packet->tile));
381 punit->facing = packet->facing;
382 punit->nationality = nullptr;
383 punit->veteran = packet->veteran;
384 punit->hp = packet->hp;
385 punit->activity = packet->activity;
386
387 if (packet->activity_tgt == EXTRA_NONE) {
388 punit->activity_target = nullptr;
389 } else {
390 punit->activity_target = extra_by_number(packet->activity_tgt);
391 }
392
393 /* Transporter / transporting information. */
394 punit->client.occupied = packet->occupied;
395 if (packet->transported) {
396 punit->client.transported_by = packet->transported_by;
397 } else {
398 punit->client.transported_by = -1;
399 }
400
401 return punit;
402}
403
404/************************************************************************/
408 void handle_server_join_reply(bool you_can_join, const char *message,
409 const char *capability,
410 const char *challenge_file, int conn_id)
411{
412 const char *s_capability = client.conn.capability;
413
414 conn_set_capability(&client.conn, capability);
415 close_connection_dialog();
416
417 if (you_can_join) {
418 struct packet_client_info client_info;
419
420 log_verbose("join game accept:%s", message);
421 client.conn.established = TRUE;
422 client.conn.id = conn_id;
423
424 agents_game_joined();
425 set_server_busy(FALSE);
426
427 if (get_client_page() == PAGE_MAIN
428 || get_client_page() == PAGE_NETWORK) {
429 set_client_page(PAGE_START);
430 }
431
432 client_info.gui = get_gui_type();
433#ifdef EMERGENCY_VERSION
434 client_info.emerg_version = EMERGENCY_VERSION;
435#else
436 client_info.emerg_version = 0;
437#endif
438 strncpy(client_info.distribution, FREECIV_DISTRIBUTOR,
439 sizeof(client_info.distribution));
440 send_packet_client_info(&client.conn, &client_info);
441
442 /* We could always use hack, verify we're local */
443#ifdef FREECIV_DEBUG
444 if (!hackless)
445#endif /* FREECIV_DEBUG */
446 {
447 send_client_wants_hack(challenge_file);
448 }
449
450 set_client_state(C_S_PREPARING);
451 } else {
452 output_window_printf(ftc_client,
453 _("You were rejected from the game: %s"), message);
454 client.conn.id = -1; /* not in range of conn_info id */
455
456 if (auto_connect) {
457 log_normal(_("You were rejected from the game: %s"), message);
458 }
459 server_connect();
460
461 set_client_page(PAGE_MAIN);
462 }
463 if (strcmp(s_capability, our_capability) == 0) {
464 return;
465 }
466 output_window_printf(ftc_client, _("Client capability string: %s"),
467 our_capability);
468 output_window_printf(ftc_client, _("Server capability string: %s"),
469 s_capability);
470}
471
472/************************************************************************/
476 void handle_city_remove(int city_id)
477{
478 struct city *pcity = game_city_by_number(city_id);
479 bool need_menus_update;
480
481 fc_assert_ret_msg(NULL != pcity, "Bad city %d.", city_id);
482
483 need_menus_update = (NULL != get_focus_unit_on_tile(city_tile(pcity)));
484
485 agents_city_remove(pcity);
486 editgui_notify_object_changed(OBJTYPE_CITY, pcity->id, TRUE);
487 client_remove_city(pcity);
488
489 /* Update menus if the focus unit is on the tile. */
490 if (need_menus_update) {
491 menus_update();
492 }
493}
494
495/************************************************************************/
499 void handle_unit_remove(int unit_id)
500{
501 struct unit *punit = game_unit_by_number(unit_id);
502 struct unit_list *cargos;
503 struct player *powner;
504 bool need_economy_report_update;
505
506 if (!punit) {
507 log_error("Server wants us to remove unit id %d, "
508 "but we don't know about this unit!",
509 unit_id);
510 return;
511 }
512
513 /* Close the action selection dialog if the actor unit is lost. */
514 if (action_selection_actor_unit() == punit->id) {
515 action_selection_close();
516 /* Open another action selection dialog if there are other actors in the
517 * current selection that want a decision. */
518 action_selection_next_in_focus(unit_id);
519 }
520
521 need_economy_report_update = (0 < punit->upkeep[O_GOLD]);
522 powner = unit_owner(punit);
523
524 /* Unload cargo if this is a transporter. */
525 cargos = unit_transport_cargo(punit);
526 if (unit_list_size(cargos) > 0) {
527 unit_list_iterate(cargos, pcargo) {
528 unit_transport_unload(pcargo);
529 } unit_list_iterate_end;
530 }
531
532 /* Unload unit if it is transported. */
533 if (unit_transport_get(punit)) {
534 unit_transport_unload(punit);
535 }
536 punit->client.transported_by = -1;
537
538 agents_unit_remove(punit);
539 editgui_notify_object_changed(OBJTYPE_UNIT, punit->id, TRUE);
540 client_remove_unit(punit);
541
542 if (!client_has_player() || powner == client_player()) {
543 if (need_economy_report_update) {
544 economy_report_dialog_update();
545 }
546 units_report_dialog_update();
547 }
548}
549
550/************************************************************************/
553 void handle_nuke_tile_info(int tile)
554{
555 put_nuke_mushroom_pixmaps(index_to_tile(&(wld.map), tile));
556}
557
558/************************************************************************/
561 void handle_team_name_info(int team_id, const char *team_name)
562{
563 struct team_slot *tslot = team_slot_by_number(team_id);
564
565 fc_assert_ret(NULL != tslot);
566 team_slot_set_defined_name(tslot, team_name);
567 conn_list_dialog_update();
568}
569
570/************************************************************************/
576 void handle_unit_combat_info(const struct packet_unit_combat_info *packet)
577{
578 bool show_combat = FALSE;
579 struct unit *punit0 = game_unit_by_number(packet->attacker_unit_id);
580 struct unit *punit1 = game_unit_by_number(packet->defender_unit_id);
581
582 if (punit0 && punit1) {
583 popup_combat_info(packet->attacker_unit_id, packet->defender_unit_id,
584 packet->attacker_hp, packet->defender_hp,
585 packet->make_att_veteran, packet->make_def_veteran);
586 if (tile_visible_mapcanvas(unit_tile(punit0))
587 && tile_visible_mapcanvas(unit_tile(punit1))) {
588 show_combat = TRUE;
589 } else if (gui_options.auto_center_on_combat) {
590 if (unit_owner(punit0) == client.conn.playing) {
591 center_tile_mapcanvas(unit_tile(punit0));
592 } else {
593 center_tile_mapcanvas(unit_tile(punit1));
594 }
595 show_combat = TRUE;
596 }
597
598 if (show_combat) {
599 int hp0 = packet->attacker_hp, hp1 = packet->defender_hp;
600
601 audio_play_sound(unit_type_get(punit0)->sound_fight,
602 unit_type_get(punit0)->sound_fight_alt,
603 NULL);
604 audio_play_sound(unit_type_get(punit1)->sound_fight,
605 unit_type_get(punit1)->sound_fight_alt,
606 NULL);
607
608 if (gui_options.smooth_combat_step_msec > 0) {
609 decrease_unit_hp_smooth(punit0, hp0, punit1, hp1);
610 } else {
611 punit0->hp = hp0;
612 punit1->hp = hp1;
613
614 set_units_in_combat(NULL, NULL);
615 refresh_unit_mapcanvas(punit0, unit_tile(punit0), TRUE, FALSE);
616 refresh_unit_mapcanvas(punit1, unit_tile(punit1), TRUE, FALSE);
617 }
618 }
619 if (packet->make_att_veteran && punit0) {
620 punit0->veteran++;
621 refresh_unit_mapcanvas(punit0, unit_tile(punit0), TRUE, FALSE);
622 }
623 if (packet->make_def_veteran && punit1) {
624 punit1->veteran++;
625 refresh_unit_mapcanvas(punit1, unit_tile(punit1), TRUE, FALSE);
626 }
627 }
628}
629
630/************************************************************************/
636 static bool update_improvement_from_packet(struct city *pcity,
637 struct impr_type *pimprove,
638 bool have_impr)
639{
640 if (have_impr) {
641 if (pcity->built[improvement_index(pimprove)].turn <= I_NEVER) {
642 city_add_improvement(pcity, pimprove);
643 return TRUE;
644 }
645 } else {
646 if (pcity->built[improvement_index(pimprove)].turn > I_NEVER) {
647 city_remove_improvement(pcity, pimprove);
648 return TRUE;
649 }
650 }
651 return FALSE;
652}
653
654/************************************************************************/
658 void handle_city_info(const struct packet_city_info *packet)
659{
660 struct universal product;
661 int i;
662 bool popup;
663 bool city_is_new = FALSE;
664 bool city_has_changed_owner = FALSE;
665 bool need_science_dialog_update = FALSE;
666 bool need_units_dialog_update = FALSE;
667 bool need_economy_dialog_update = FALSE;
668 bool name_changed = FALSE;
669 bool update_descriptions = FALSE;
670 bool shield_stock_changed = FALSE;
671 bool production_changed = FALSE;
672 bool trade_routes_changed = FALSE;
673 struct unit_list *pfocus_units = get_units_in_focus();
674 struct city *pcity = game_city_by_number(packet->id);
675 struct tile_list *worked_tiles = NULL;
676 struct tile *pcenter = index_to_tile(&(wld.map), packet->tile);
677 struct tile *ptile = NULL;
678 struct player *powner = player_by_number(packet->owner);
679
680 fc_assert_ret_msg(NULL != powner, "Bad player number %d.", packet->owner);
681 fc_assert_ret_msg(NULL != pcenter, "Invalid tile index %d.", packet->tile);
682
683 if (!universals_n_is_valid(packet->production_kind)) {
684 log_error("handle_city_info() bad production_kind %d.",
685 packet->production_kind);
686 product.kind = VUT_NONE;
687 } else {
688 product = universal_by_number(packet->production_kind,
689 packet->production_value);
690 if (!universals_n_is_valid(product.kind)) {
691 log_error("handle_city_info() "
692 "production_kind %d with bad production_value %d.",
693 packet->production_kind, packet->production_value);
694 product.kind = VUT_NONE;
695 }
696 }
697
698 if (NULL != pcity) {
699 ptile = city_tile(pcity);
700
701 if (NULL == ptile) {
702 /* Invisible worked city */
703 city_list_remove(invisible.cities, pcity);
704 city_is_new = TRUE;
705
706 pcity->tile = pcenter;
707 ptile = pcenter;
708 pcity->owner = powner;
709 pcity->original = player_by_number(packet->original);
710 } else if (city_owner(pcity) != powner) {
711 /* Remember what were the worked tiles. The server won't
712 * send them to us again. */
713 city_tile_iterate_skip_free_worked(&(wld.map), city_map_radius_sq_get(pcity),
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 }
721 } city_tile_iterate_skip_free_worked_end;
722 client_remove_city(pcity);
723 pcity = NULL;
724 city_has_changed_owner = TRUE;
725 }
726 }
727
728 if (NULL == pcity) {
729 city_is_new = TRUE;
730 pcity = create_city_virtual(powner, pcenter, packet->name);
731 pcity->id = packet->id;
732 idex_register_city(&wld, pcity);
733 update_descriptions = TRUE;
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 {
743 name_changed = (fc_strncmp(packet->name, pcity->name, MAX_LEN_CITYNAME));
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
748 trade_route_list_remove(pcity->routes, proute);
749 FC_FREE(proute);
750 trade_routes_changed = TRUE;
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. */
758 update_descriptions = (gui_options.draw_city_names && name_changed)
759 || (gui_options.draw_city_productions
760 && (!are_universals_equal(&pcity->production, &product)
761 || pcity->surplus[O_SHIELD] != packet->surplus[O_SHIELD]
762 || pcity->shield_stock != packet->shield_stock))
763 || (gui_options.draw_city_growth
764 && (pcity->food_stock != packet->food_stock
765 || pcity->surplus[O_FOOD] != packet->surplus[O_FOOD]))
766 || (gui_options.draw_city_trade_routes && trade_routes_changed);
767
768 city_name_set(pcity, packet->name);
769 }
770
771 /* Check data */
772 city_size_set(pcity, 0);
773 for (i = 0; i < FEELING_LAST; i++) {
774 pcity->feel[CITIZEN_HAPPY][i] = packet->ppl_happy[i];
775 pcity->feel[CITIZEN_CONTENT][i] = packet->ppl_content[i];
776 pcity->feel[CITIZEN_UNHAPPY][i] = packet->ppl_unhappy[i];
777 pcity->feel[CITIZEN_ANGRY][i] = packet->ppl_angry[i];
778 }
779 for (i = 0; i < CITIZEN_LAST; i++) {
780 city_size_add(pcity, pcity->feel[i][FEELING_FINAL]);
781 }
782 specialist_type_iterate(sp) {
783 pcity->specialists[sp] = packet->specialists[sp];
784 city_size_add(pcity, pcity->specialists[sp]);
785 } specialist_type_iterate_end;
786
787 if (city_size_get(pcity) != packet->size) {
788 log_error("handle_city_info() "
789 "%d citizens not equal %d city size in \"%s\".",
790 city_size_get(pcity), packet->size, city_name_get(pcity));
791 city_size_set(pcity, packet->size);
792 }
793
794 pcity->history = packet->history;
795 pcity->client.culture = packet->culture;
796 pcity->client.buy_cost = packet->buy_cost;
797
798 pcity->city_radius_sq = packet->city_radius_sq;
799
800 pcity->city_options = packet->city_options;
801
802 if (pcity->surplus[O_SCIENCE] != packet->surplus[O_SCIENCE]
803 || pcity->surplus[O_SCIENCE] != packet->surplus[O_SCIENCE]
804 || pcity->waste[O_SCIENCE] != packet->waste[O_SCIENCE]
805 || (pcity->unhappy_penalty[O_SCIENCE]
806 != packet->unhappy_penalty[O_SCIENCE])
807 || pcity->prod[O_SCIENCE] != packet->prod[O_SCIENCE]
808 || pcity->citizen_base[O_SCIENCE] != packet->citizen_base[O_SCIENCE]
809 || pcity->usage[O_SCIENCE] != packet->usage[O_SCIENCE]) {
810 need_science_dialog_update = TRUE;
811 }
812
813 pcity->food_stock = packet->food_stock;
814 if (pcity->shield_stock != packet->shield_stock) {
815 shield_stock_changed = TRUE;
816 pcity->shield_stock = packet->shield_stock;
817 }
818 pcity->pollution = packet->pollution;
819 pcity->illness_trade = packet->illness_trade;
820
821 if (!are_universals_equal(&pcity->production, &product)) {
822 production_changed = TRUE;
823 }
824 /* Need to consider shield stock/surplus for unit dialog as used build
825 * slots may change, affecting number of "in-progress" units. */
826 if ((city_is_new && VUT_UTYPE == product.kind)
827 || (production_changed && (VUT_UTYPE == pcity->production.kind
828 || VUT_UTYPE == product.kind))
829 || pcity->surplus[O_SHIELD] != packet->surplus[O_SHIELD]
830 || shield_stock_changed) {
831 need_units_dialog_update = TRUE;
832 }
833 pcity->production = product;
834
835 output_type_iterate(o) {
836 pcity->surplus[o] = packet->surplus[o];
837 pcity->waste[o] = packet->waste[o];
838 pcity->unhappy_penalty[o] = packet->unhappy_penalty[o];
839 pcity->prod[o] = packet->prod[o];
840 pcity->citizen_base[o] = packet->citizen_base[o];
841 pcity->usage[o] = packet->usage[o];
842 } output_type_iterate_end;
843
844#ifdef DONE_BY_create_city_virtual
845 if (city_is_new) {
846 worklist_init(&pcity->worklist);
847
848 for (i = 0; i < ARRAY_SIZE(pcity->built); i++) {
849 pcity->built[i].turn = I_NEVER;
850 }
851 }
852#endif /* DONE_BY_create_city_virtual */
853
854 worklist_copy(&pcity->worklist, &packet->worklist);
855
856 pcity->airlift = packet->airlift;
857 pcity->did_buy = packet->did_buy;
858 pcity->did_sell = packet->did_sell;
859 pcity->was_happy = packet->was_happy;
860 pcity->had_famine = packet->had_famine;
861
862 pcity->turn_founded = packet->turn_founded;
863 pcity->turn_last_built = packet->turn_last_built;
864
865 if (!universals_n_is_valid(packet->changed_from_kind)) {
866 log_error("handle_city_info() bad changed_from_kind %d.",
867 packet->changed_from_kind);
868 product.kind = VUT_NONE;
869 } else {
870 product = universal_by_number(packet->changed_from_kind,
871 packet->changed_from_value);
872 if (!universals_n_is_valid(product.kind)) {
873 log_error("handle_city_info() bad changed_from_value %d.",
874 packet->changed_from_value);
875 product.kind = VUT_NONE;
876 }
877 }
878 pcity->changed_from = product;
879
880 pcity->before_change_shields = packet->before_change_shields;
881 pcity->disbanded_shields = packet->disbanded_shields;
882 pcity->caravan_shields = packet->caravan_shields;
883 pcity->last_turns_shield_surplus = packet->last_turns_shield_surplus;
884
885 improvement_iterate(pimprove) {
886 bool have = BV_ISSET(packet->improvements, improvement_index(pimprove));
887
888 if (have && !city_is_new
889 && pcity->built[improvement_index(pimprove)].turn <= I_NEVER) {
890 audio_play_sound(pimprove->soundtag, pimprove->soundtag_alt,
891 pimprove->soundtag_alt2);
892 }
893 need_economy_dialog_update |=
894 update_improvement_from_packet(pcity, pimprove, have);
895 } improvement_iterate_end;
896
897 /* We should be able to see units in the city. But for a diplomat
898 * investigating an enemy city we can't. In that case we don't update
899 * the occupied flag at all: it's already been set earlier and we'll
900 * get an update if it changes. */
901 if (can_player_see_units_in_city(client.conn.playing, pcity)) {
902 pcity->client.occupied
903 = (unit_list_size(pcity->tile->units) > 0);
904 }
905
906 pcity->client.walls = packet->walls;
907 if (pcity->client.walls > NUM_WALL_TYPES) {
908 pcity->client.walls = NUM_WALL_TYPES;
909 }
910 pcity->style = packet->style;
911 pcity->capital = packet->capital;
912 if (packet->capital == CAPITAL_PRIMARY) {
913 powner->primary_capital_id = pcity->id;
914 } else if (powner->primary_capital_id == pcity->id) {
915 powner->primary_capital_id = 0;
916 }
917 pcity->client.city_image = packet->city_image;
918 pcity->steal = packet->steal;
919
920 pcity->client.happy = city_happy(pcity);
921 pcity->client.unhappy = city_unhappy(pcity);
922
923 popup = (city_is_new && can_client_change_view()
924 && powner == client.conn.playing
925 && gui_options.popup_new_cities)
926 || packet->diplomat_investigate;
927
928 city_packet_common(pcity, pcenter, powner, worked_tiles,
929 city_is_new, popup, packet->diplomat_investigate);
930
931 if (city_is_new && !city_has_changed_owner) {
932 agents_city_new(pcity);
933 } else {
934 agents_city_changed(pcity);
935 }
936
937 /* Update the description if necessary. */
938 if (update_descriptions) {
939 update_city_description(pcity);
940 }
941
942 /* Update focus unit info label if necessary. */
943 if (name_changed) {
944 unit_list_iterate(pfocus_units, pfocus_unit) {
945 if (pfocus_unit->homecity == pcity->id) {
946 update_unit_info_label(pfocus_units);
947 break;
948 }
949 } unit_list_iterate_end;
950 }
951
952 /* Update the science dialog if necessary. */
953 if (need_science_dialog_update) {
954 science_report_dialog_update();
955 }
956
957 /* Update the units dialog if necessary. */
958 if (need_units_dialog_update) {
959 units_report_dialog_update();
960 }
961
962 /* Update the economy dialog if necessary. */
963 if (need_economy_dialog_update) {
964 economy_report_dialog_update();
965 }
966
967 /* Update the panel text (including civ population). */
968 update_info_label();
969
970 /* Update caravan dialog */
971 if ((production_changed || shield_stock_changed)
972 && action_selection_target_city() == pcity->id) {
973 dsend_packet_unit_get_actions(&client.conn,
974 action_selection_actor_unit(),
975 action_selection_target_unit(),
976 city_tile(pcity)->index,
977 action_selection_target_extra(),
978 REQEST_BACKGROUND_REFRESH);
979 }
980
981 if (gui_options.draw_city_trade_routes
982 && (trade_routes_changed
983 || (city_is_new && 0 < city_num_trade_routes(pcity)))) {
984 update_map_canvas_visible();
985 }
986}
987
988/************************************************************************/
991 void handle_city_nationalities(const struct packet_city_nationalities *packet)
992{
993 struct city *pcity = game_city_by_number(packet->id);
994
995 /* The nationality of the citizens. */
996 if (pcity != NULL && game.info.citizen_nationality) {
997 int i;
998
999 citizens_init(pcity);
1000 for (i = 0; i < packet->nationalities_count; i++) {
1001 citizens_nation_set(pcity, player_slot_by_number(packet->nation_id[i]),
1002 packet->nation_citizens[i]);
1003 }
1004 fc_assert(citizens_count(pcity) == city_size_get(pcity));
1005 }
1006}
1007
1008/************************************************************************/
1011 void handle_city_rally_point(const struct packet_city_rally_point *packet)
1012{
1013 struct city *pcity = game_city_by_number(packet->id);
1014
1015 if (pcity != NULL) {
1016 city_rally_point_receive(packet, pcity);
1017 }
1018}
1019
1020/************************************************************************/
1025 static void city_packet_common(struct city *pcity, struct tile *pcenter,
1026 struct player *powner,
1027 struct tile_list *worked_tiles,
1028 bool is_new, bool popup, bool investigate)
1029{
1030 if (NULL != worked_tiles) {
1031 /* We need to transfer the worked infos because the server will assume
1032 * those infos are kept in our side and won't send to us again. */
1033 tile_list_iterate(worked_tiles, pwork) {
1034 tile_set_worked(pwork, pcity);
1035 } tile_list_iterate_end;
1036 tile_list_destroy(worked_tiles);
1037 }
1038
1039 if (is_new) {
1040 tile_set_worked(pcenter, pcity); /* is_free_worked() */
1041 city_list_prepend(powner->cities, pcity);
1042
1043 if (client_is_global_observer() || powner == client_player()) {
1044 city_report_dialog_update();
1045 }
1046
1047 players_iterate(pp) {
1048 unit_list_iterate(pp->units, punit) {
1049 if (punit->homecity == pcity->id) {
1050 unit_list_prepend(pcity->units_supported, punit);
1051 }
1052 } unit_list_iterate_end;
1053 } players_iterate_end;
1054
1055 pcity->client.first_citizen_index = fc_rand(MAX_NUM_CITIZEN_SPRITES);
1056 } else {
1057 if (client_is_global_observer() || powner == client_player()) {
1058 city_report_dialog_update_city(pcity);
1059 }
1060 }
1061
1062 if (can_client_change_view()) {
1063 refresh_city_mapcanvas(pcity, pcenter, FALSE, FALSE);
1064 }
1065
1066 if (city_workers_display == pcity) {
1067 city_workers_display = NULL;
1068 }
1069
1070 if (investigate) {
1071 /* Commit the collected supported and present units. */
1072 if (pcity->client.collecting_info_units_supported != NULL) {
1073 /* We got units, let's move the unit lists. */
1074 fc_assert(pcity->client.collecting_info_units_present != NULL);
1075
1076 unit_list_destroy(pcity->client.info_units_present);
1077 pcity->client.info_units_present =
1078 pcity->client.collecting_info_units_present;
1079 pcity->client.collecting_info_units_present = NULL;
1080
1081 unit_list_destroy(pcity->client.info_units_supported);
1082 pcity->client.info_units_supported =
1083 pcity->client.collecting_info_units_supported;
1084 pcity->client.collecting_info_units_supported = NULL;
1085 } else {
1086 /* We didn't get any unit, let's clear the unit lists. */
1087 fc_assert(pcity->client.collecting_info_units_present == NULL);
1088
1089 unit_list_clear(pcity->client.info_units_supported);
1090 unit_list_clear(pcity->client.info_units_present);
1091 }
1092 }
1093
1094 if (popup
1095 && NULL != client.conn.playing
1096 && is_human(client.conn.playing)
1097 && can_client_issue_orders()) {
1098 menus_update();
1099 if (!city_dialog_is_open(pcity)) {
1100 popup_city_dialog(pcity);
1101 }
1102 }
1103
1104 if (!is_new
1105 && (popup || can_player_see_city_internals(client.conn.playing, pcity))) {
1106 refresh_city_dialog(pcity);
1107 }
1108
1109 /* update menus if the focus unit is on the tile. */
1110 if (get_focus_unit_on_tile(pcenter)) {
1111 menus_update();
1112 }
1113
1114 if (is_new) {
1115 log_debug("(%d,%d) creating city %d, %s %s", TILE_XY(pcenter),
1116 pcity->id, nation_rule_name(nation_of_city(pcity)),
1117 city_name_get(pcity));
1118 }
1119
1120 editgui_notify_object_changed(OBJTYPE_CITY, pcity->id, FALSE);
1121}
1122
1123/************************************************************************/
1127 void handle_trade_route_info(const struct packet_trade_route_info *packet)
1128{
1129 struct city *pcity = game_city_by_number(packet->city);
1130 struct trade_route *proute;
1131 bool city_changed = FALSE;
1132
1133 if (pcity == NULL) {
1134 return;
1135 }
1136
1137 proute = trade_route_list_get(pcity->routes, packet->index);
1138 if (proute == NULL) {
1139 fc_assert(trade_route_list_size(pcity->routes) == packet->index);
1140
1141 proute = fc_malloc(sizeof(struct trade_route));
1142 trade_route_list_append(pcity->routes, proute);
1143 city_changed = TRUE;
1144 }
1145
1146 proute->partner = packet->partner;
1147 proute->value = packet->value;
1148 proute->dir = packet->direction;
1149 proute->goods = goods_by_number(packet->goods);
1150
1151 if (gui_options.draw_city_trade_routes && city_changed) {
1152 update_city_description(pcity);
1153 update_map_canvas_visible();
1154 }
1155}
1156
1157/************************************************************************/
1162 void handle_city_short_info(const struct packet_city_short_info *packet)
1163{
1164 bool city_has_changed_owner = FALSE;
1165 bool city_is_new = FALSE;
1166 bool name_changed = FALSE;
1167 bool update_descriptions = FALSE;
1168 struct city *pcity = game_city_by_number(packet->id);
1169 struct tile *pcenter = index_to_tile(&(wld.map), packet->tile);
1170 struct tile *ptile = NULL;
1171 struct tile_list *worked_tiles = NULL;
1172 struct player *powner = player_by_number(packet->owner);
1173 int radius_sq = game.info.init_city_radius_sq;
1174
1175 fc_assert_ret_msg(NULL != powner, "Bad player number %d.", packet->owner);
1176 fc_assert_ret_msg(NULL != pcenter, "Invalid tile index %d.", packet->tile);
1177
1178 if (NULL != pcity) {
1179 ptile = city_tile(pcity);
1180
1181 if (NULL == ptile) {
1182 /* Invisible worked city */
1183 city_list_remove(invisible.cities, pcity);
1184 city_is_new = TRUE;
1185
1186 pcity->tile = pcenter;
1187 pcity->owner = powner;
1188 pcity->original = NULL;
1189
1190 whole_map_iterate(&(wld.map), wtile) {
1191 if (wtile->worked == pcity) {
1192 int dist_sq = sq_map_distance(pcenter, wtile);
1193
1194 if (dist_sq > city_map_radius_sq_get(pcity)) {
1195 city_map_radius_sq_set(pcity, dist_sq);
1196 }
1197 }
1198 } whole_map_iterate_end;
1199 } else if (city_owner(pcity) != powner) {
1200 /* Remember what were the worked tiles. The server won't
1201 * send to us again. */
1202 city_tile_iterate_skip_free_worked(&(wld.map), city_map_radius_sq_get(pcity), ptile,
1203 pworked, _index, _x, _y) {
1204 if (pcity == tile_worked(pworked)) {
1205 if (NULL == worked_tiles) {
1206 worked_tiles = tile_list_new();
1207 }
1208 tile_list_append(worked_tiles, pworked);
1209 }
1210 } city_tile_iterate_skip_free_worked_end;
1211 radius_sq = city_map_radius_sq_get(pcity);
1212 client_remove_city(pcity);
1213 pcity = NULL;
1214 city_has_changed_owner = TRUE;
1215 }
1216 }
1217
1218 if (NULL == pcity) {
1219 city_is_new = TRUE;
1220 pcity = create_city_virtual(powner, pcenter, packet->name);
1221 pcity->id = packet->id;
1222 city_map_radius_sq_set(pcity, radius_sq);
1223 idex_register_city(&wld, pcity);
1224 } else if (pcity->id != packet->id) {
1225 log_error("handle_city_short_info() city id %d != id %d.",
1226 pcity->id, packet->id);
1227 return;
1228 } else if (city_tile(pcity) != pcenter) {
1229 log_error("handle_city_short_info() city tile (%d, %d) != (%d, %d).",
1230 TILE_XY(city_tile(pcity)), TILE_XY(pcenter));
1231 return;
1232 } else {
1233 name_changed = (fc_strncmp(packet->name, pcity->name, MAX_LEN_CITYNAME));
1234
1235 /* Check if city descriptions should be updated */
1236 if (gui_options.draw_city_names && name_changed) {
1237 update_descriptions = TRUE;
1238 }
1239
1240 city_name_set(pcity, packet->name);
1241
1242 memset(pcity->feel, 0, sizeof(pcity->feel));
1243 memset(pcity->specialists, 0, sizeof(pcity->specialists));
1244 }
1245
1246 pcity->specialists[DEFAULT_SPECIALIST] = packet->size;
1247 city_size_set(pcity, packet->size);
1248
1249 /* We can't actually see the internals of the city, but the server tells
1250 * us this much. */
1251 if (pcity->client.occupied != packet->occupied) {
1252 pcity->client.occupied = packet->occupied;
1253 if (gui_options.draw_full_citybar) {
1254 update_descriptions = TRUE;
1255 }
1256 }
1257 pcity->client.walls = packet->walls;
1258 if (pcity->client.walls > NUM_WALL_TYPES) {
1259 pcity->client.walls = NUM_WALL_TYPES;
1260 }
1261 pcity->style = packet->style;
1262 pcity->capital = packet->capital;
1263 if (packet->capital == CAPITAL_PRIMARY) {
1264 powner->primary_capital_id = pcity->id;
1265 } else if (powner->primary_capital_id == pcity->id) {
1266 powner->primary_capital_id = 0;
1267 }
1268 pcity->client.city_image = packet->city_image;
1269
1270 pcity->client.happy = packet->happy;
1271 pcity->client.unhappy = packet->unhappy;
1272
1273 improvement_iterate(pimprove) {
1274 /* Don't update the non-visible improvements, they could hide the
1275 * previously seen informations about the city (diplomat investigation).
1276 */
1277 if (is_improvement_visible(pimprove)) {
1278 bool have = BV_ISSET(packet->improvements,
1279 improvement_index(pimprove));
1280 update_improvement_from_packet(pcity, pimprove, have);
1281 }
1282 } improvement_iterate_end;
1283
1284 city_packet_common(pcity, pcenter, powner, worked_tiles,
1285 city_is_new, FALSE, FALSE);
1286
1287 if (city_is_new && !city_has_changed_owner) {
1288 agents_city_new(pcity);
1289 } else {
1290 agents_city_changed(pcity);
1291 }
1292
1293 /* Update the description if necessary. */
1294 if (update_descriptions) {
1295 update_city_description(pcity);
1296 }
1297}
1298
1299/************************************************************************/
1302 void handle_worker_task(const struct packet_worker_task *packet)
1303{
1304 struct city *pcity = game_city_by_number(packet->city_id);
1305 struct worker_task *ptask = NULL;
1306
1307 if (pcity == NULL
1308 || (pcity->owner != client.conn.playing && !client_is_global_observer())) {
1309 return;
1310 }
1311
1312 worker_task_list_iterate(pcity->task_reqs, ptask_old) {
1313 if (tile_index(ptask_old->ptile) == packet->tile_id) {
1314 ptask = ptask_old;
1315 break;
1316 }
1317 } worker_task_list_iterate_end;
1318
1319 if (ptask == NULL) {
1320 if (packet->activity == ACTIVITY_LAST) {
1321 return;
1322 } else {
1323 ptask = fc_malloc(sizeof(struct worker_task));
1324 worker_task_list_append(pcity->task_reqs, ptask);
1325 }
1326 } else {
1327 if (packet->activity == ACTIVITY_LAST) {
1328 worker_task_list_remove(pcity->task_reqs, ptask);
1329 free(ptask);
1330 ptask = NULL;
1331 }
1332 }
1333
1334 if (ptask != NULL) {
1335 ptask->ptile = index_to_tile(&(wld.map), packet->tile_id);
1336 ptask->act = packet->activity;
1337 if (packet->tgt >= 0) {
1338 ptask->tgt = extra_by_number(packet->tgt);
1339 } else {
1340 ptask->tgt = NULL;
1341 }
1342 ptask->want = packet->want;
1343 }
1344
1345 if (ptask && !worker_task_is_sane(ptask)) {
1346 log_debug("Bad worker task");
1347 worker_task_list_remove(pcity->task_reqs, ptask);
1348 free(ptask);
1349 ptask = NULL;
1350 return;
1351 }
1352
1353 refresh_city_dialog(pcity);
1354}
1355
1356/************************************************************************/
1359 void handle_new_year(int year, int fragments, int turn)
1360{
1361 game.info.year = year;
1362 game.info.fragment_count = fragments;
1363 /*
1364 * The turn was increased in handle_end_turn()
1365 */
1366 fc_assert(game.info.turn == turn);
1367 update_info_label();
1368
1369 unit_focus_update();
1370 auto_center_on_focus_unit();
1371
1372 update_unit_info_label(get_units_in_focus());
1373 menus_update();
1374
1375 set_seconds_to_turndone(current_turn_timeout());
1376
1377#if 0
1378 /* This information shouldn't be needed, but if it is this is the only
1379 * way we can get it. */
1380 if (NULL != client.conn.playing) {
1381 turn_gold_difference =
1382 client.conn.playing->economic.gold - last_turn_gold_amount;
1383 last_turn_gold_amount = client.conn.playing->economic.gold;
1384 }
1385#endif
1386
1387 update_city_descriptions();
1388 link_marks_decrease_turn_counters();
1389
1390 if (gui_options.sound_bell_at_new_turn) {
1391 create_event(NULL, E_TURN_BELL, ftc_client,
1392 _("Start of turn %d"), game.info.turn);
1393 }
1394
1395 agents_new_turn();
1396
1397 if (last_turn != turn) {
1398 start_turn();
1399 last_turn = turn;
1400 }
1401}
1402
1403/************************************************************************/
1408 void handle_end_phase(void)
1409{
1410 /* Messagewindow will contain events happened since our own phase ended,
1411 * so player of the first phase and last phase are in equal situation. */
1412 meswin_clear_older(game.info.turn, game.info.phase);
1413}
1414
1415/************************************************************************/
1419 void handle_start_phase(int phase)
1420{
1421 if (!client_has_player() && !client_is_observer()) {
1422 /* We are on detached state, let ignore this packet. */
1423 return;
1424 }
1425
1426 if (phase < 0
1427 || (game.info.phase_mode == PMT_PLAYERS_ALTERNATE
1428 && phase >= player_count())
1429 || (game.info.phase_mode == PMT_TEAMS_ALTERNATE
1430 && phase >= team_count())) {
1431 log_error("handle_start_phase() illegal phase %d.", phase);
1432 return;
1433 }
1434
1435 set_client_state(C_S_RUNNING);
1436
1437 game.info.phase = phase;
1438
1439 /* Possibly replace wait cursor with something else */
1440 if (phase == 0) {
1441 /* TODO: Have server set as busy also if switching phase
1442 * is taking long in a alternating phases mode. */
1443 set_server_busy(FALSE);
1444 }
1445
1446 if (NULL != client.conn.playing
1447 && is_player_phase(client.conn.playing, phase)) {
1448 agents_start_turn();
1449 non_ai_unit_focus = FALSE;
1450
1451 update_turn_done_button_state();
1452
1453 if (is_ai(client.conn.playing)
1454 && !gui_options.ai_manual_turn_done) {
1455 user_ended_turn();
1456 }
1457
1458 unit_focus_set_status(client.conn.playing);
1459
1460 city_list_iterate(client.conn.playing->cities, pcity) {
1461 pcity->client.colored = FALSE;
1462 } city_list_iterate_end;
1463
1464 unit_list_iterate(client.conn.playing->units, punit) {
1465 punit->client.colored = FALSE;
1466 } unit_list_iterate_end;
1467
1468 update_map_canvas_visible();
1469 }
1470
1471 update_info_label();
1472}
1473
1474/************************************************************************/
1478 void handle_begin_turn(void)
1479{
1480 log_debug("handle_begin_turn()");
1481
1482 /* Server is still considered busy until it handles also the beginning
1483 * of the first phase. */
1484
1485 stop_turn_change_wait();
1486}
1487
1488/************************************************************************/
1492 void handle_end_turn(void)
1493{
1494 log_debug("handle_end_turn()");
1495
1496 /* Make sure wait cursor is in use */
1497 set_server_busy(TRUE);
1498
1499 start_turn_change_wait();
1500
1501 /*
1502 * The local idea of the game.info.turn is increased here since the
1503 * client will get unit updates (reset of move points for example)
1504 * between handle_end_turn() and handle_new_year(). These
1505 * unit updates will look like they did take place in the old turn
1506 * which is incorrect. If we get the authoritative information about
1507 * the game.info.turn in handle_new_year() we will check it.
1508 */
1509 game.info.turn++;
1510
1511 log_verbose(_("Beginning turn %d"), game.info.turn);
1512
1513 agents_before_new_turn();
1514}
1515
1516/************************************************************************/
1519 void play_sound_for_event(enum event_type type)
1520{
1521 const char *sound_tag = get_event_tag(type);
1522
1523 if (sound_tag) {
1524 audio_play_sound(sound_tag, NULL, NULL);
1525 }
1526}
1527
1528/************************************************************************/
1532 void handle_chat_msg(const struct packet_chat_msg *packet)
1533{
1534 handle_event(packet->message,
1535 index_to_tile(&(wld.map), packet->tile),
1536 packet->event,
1537 packet->turn,
1538 packet->phase,
1539 packet->conn_id);
1540}
1541
1542/************************************************************************/
1552 void handle_early_chat_msg(const struct packet_early_chat_msg *packet)
1553{
1554 handle_event(packet->message,
1555 index_to_tile(&(wld.map), packet->tile),
1556 packet->event,
1557 packet->turn,
1558 packet->phase,
1559 packet->conn_id);
1560}
1561
1562/************************************************************************/
1566 void handle_connect_msg(const char *message)
1567{
1568 popup_connect_msg(_("Welcome"), message);
1569}
1570
1571/************************************************************************/
1575 void handle_server_info(const char *version_label, int major_version,
1576 int minor_version, int patch_version, int emerg_version)
1577{
1578 if (emerg_version > 0) {
1579 log_verbose("Server has version %d.%d.%d.%d%s",
1580 major_version, minor_version, patch_version, emerg_version,
1581 version_label);
1582 } else {
1583 log_verbose("Server has version %d.%d.%d%s",
1584 major_version, minor_version, patch_version, version_label);
1585 }
1586}
1587
1588/************************************************************************/
1591 void handle_page_msg(const char *caption, const char *headline,
1592 enum event_type event, int len, int parts)
1593{
1594 if (!client_has_player()
1595 || is_human(client_player())
1596 || event != E_BROADCAST_REPORT) {
1597 if (page_msg_report.parts > 0) {
1598 /* Previous one was never finished */
1599 free(page_msg_report.caption);
1600 free(page_msg_report.headline);
1601 free(page_msg_report.lines);
1602 }
1603 page_msg_report.len = len;
1604 page_msg_report.event = event;
1605 page_msg_report.caption = fc_strdup(caption);
1606 page_msg_report.headline = fc_strdup(headline);
1607 page_msg_report.parts = parts;
1608 page_msg_report.lines = fc_malloc(len + 1);
1609 page_msg_report.lines[0] = '\0';
1610
1611 if (parts == 0) {
1612 /* Empty report - handle as if last part was just received. */
1613 page_msg_report.parts = 1;
1614 handle_page_msg_part("");
1615 }
1616 }
1617}
1618
1619/************************************************************************/
1622 void handle_page_msg_part(const char *lines)
1623{
1624 if (page_msg_report.lines != NULL) {
1625 /* We have already decided to show the message at the time we got
1626 * the header packet. */
1627 fc_strlcat(page_msg_report.lines, lines, page_msg_report.len + 1);
1628 page_msg_report.parts--;
1629
1630 if (page_msg_report.parts == 0) {
1631 /* This is the final part */
1632 popup_notify_dialog(page_msg_report.caption,
1633 page_msg_report.headline,
1634 page_msg_report.lines);
1635 play_sound_for_event(page_msg_report.event);
1636
1637 free(page_msg_report.caption);
1638 free(page_msg_report.headline);
1639 free(page_msg_report.lines);
1640 page_msg_report.lines = NULL;
1641 }
1642 }
1643}
1644
1645/************************************************************************/
1648 void handle_unit_info(const struct packet_unit_info *packet)
1649{
1650 struct unit *punit;
1651
1652 punit = unpackage_unit(packet);
1653 if (handle_unit_packet_common(punit)) {
1654 punit->client.transported_by = -1;
1655 unit_virtual_destroy(punit);
1656 }
1657}
1658
1659/**********************************************************************/
1664 static void action_decision_handle(struct unit *punit)
1665{
1666 if (!gui_options.popup_attack_actions) {
1667 action_array_iterate(auto_attack_actions, act_id) {
1668 if (utype_can_do_action(unit_type_get(punit), act_id)) {
1669 /* An auto action like auto attack could be legal. Check for those
1670 * at once so they won't have to wait for player focus. */
1671 dsend_packet_unit_get_actions(&client.conn,
1672 punit->id,
1673 IDENTITY_NUMBER_ZERO,
1674 tile_index(punit->action_decision_tile),
1675 EXTRA_NONE,
1676 REQEST_BACKGROUND_FAST_AUTO_ATTACK);
1677 return;
1678 }
1679 } action_array_iterate_end;
1680 }
1681
1682 /* This should be done in the foreground */
1683 action_decision_request(punit);
1684}
1685
1686/************************************************************************/
1702 static bool handle_unit_packet_common(struct unit *packet_unit)
1703{
1704 struct city *pcity;
1705 struct unit *punit;
1706 bool need_menus_update = FALSE;
1707 bool need_economy_report_update = FALSE;
1708 bool need_units_report_update = FALSE;
1709 bool repaint_unit = FALSE;
1710 bool repaint_city = FALSE; /* regards unit's homecity */
1711 struct tile *old_tile = nullptr;
1712 bool check_focus = FALSE; /* conservative focus change */
1713 bool moved = FALSE;
1714 bool ret = FALSE;
1715 struct player *owner = unit_owner(packet_unit);
1716 struct player *plr = client_player();
1717
1718 if (owner == nullptr) {
1719 punit = nullptr;
1720 } else {
1721 punit = player_unit_by_number(owner, packet_unit->id);
1722 }
1723
1724 if (punit == nullptr && game_unit_by_number(packet_unit->id)) {
1725 /* This means unit has changed owner. We deal with this here
1726 * by simply deleting the old one and creating a new one. */
1727 handle_unit_remove(packet_unit->id);
1728 }
1729
1730 if (punit != nullptr) {
1731 /* In some situations, the size of repaint units require can change;
1732 * in particular, city-builder units sometimes get a potential-city
1733 * outline, but to speed up redraws we don't repaint this whole area
1734 * unnecessarily. We need to ensure that when the footprint shrinks,
1735 * old bits aren't left behind on the canvas.
1736 * If the current (old) status of the unit is such that it gets a large
1737 * repaint, as a special case, queue a large repaint immediately, to
1738 * schedule the correct amount/location to be redrawn; but rely on the
1739 * repaint being deferred until the unit is updated, so that what's
1740 * drawn reflects the new status (e.g., no city outline). */
1741 if (unit_drawn_with_city_outline(punit, TRUE)) {
1742 refresh_unit_mapcanvas(punit, unit_tile(punit), TRUE, FALSE);
1743 }
1744
1745 ret = TRUE;
1746 punit->activity_count = packet_unit->activity_count;
1747 unit_change_battlegroup(punit, packet_unit->battlegroup);
1748 if (punit->ssa_controller != packet_unit->ssa_controller) {
1749 punit->ssa_controller = packet_unit->ssa_controller;
1750 repaint_unit = TRUE;
1751 /* AI is set: May change focus */
1752 /* AI is cleared: Keep focus */
1753 if (packet_unit->ssa_controller != SSA_NONE
1754 && unit_is_in_focus(punit)) {
1755 check_focus = TRUE;
1756 }
1757 }
1758
1759 if (punit->facing != packet_unit->facing) {
1760 punit->facing = packet_unit->facing;
1761 repaint_unit = TRUE;
1762 }
1763
1764 if (punit->activity != packet_unit->activity
1765 || punit->activity_target == packet_unit->activity_target
1766 || punit->client.transported_by != packet_unit->client.transported_by
1767 || punit->client.occupied != packet_unit->client.occupied
1768 || punit->has_orders != packet_unit->has_orders
1769 || punit->orders.repeat != packet_unit->orders.repeat
1770 || punit->orders.vigilant != packet_unit->orders.vigilant
1771 || punit->orders.index != packet_unit->orders.index) {
1772
1773 /*** Change in activity or activity's target. ***/
1774
1775 /* May change focus if focus unit gets a new activity.
1776 * But if new activity is Idle, it means user specifically selected
1777 * the unit */
1778 if (unit_is_in_focus(punit)
1779 && (packet_unit->activity != ACTIVITY_IDLE
1780 || packet_unit->has_orders)) {
1781 check_focus = TRUE;
1782 }
1783
1784 repaint_unit = TRUE;
1785
1786 /* Wakeup Focus */
1787 if (gui_options.wakeup_focus
1788 && plr != nullptr
1789 && is_human(plr)
1790 && owner == plr
1791 && punit->activity == ACTIVITY_SENTRY
1792 && packet_unit->activity == ACTIVITY_IDLE
1793 && !unit_is_in_focus(punit)
1794 && is_player_phase(plr, game.info.phase)) {
1795 /* Many wakeup units per tile are handled */
1796 unit_focus_urgent(punit);
1797 check_focus = FALSE; /* and keep it */
1798 }
1799
1800 punit->activity = packet_unit->activity;
1801 punit->activity_target = packet_unit->activity_target;
1802
1803 if (punit->client.transported_by
1804 != packet_unit->client.transported_by) {
1805 if (packet_unit->client.transported_by == -1) {
1806 /* The unit was unloaded from its transport. The check for a new
1807 * transport is done below. */
1808 unit_transport_unload(punit);
1809 }
1810
1811 punit->client.transported_by = packet_unit->client.transported_by;
1812 }
1813
1814 if (punit->client.occupied != packet_unit->client.occupied) {
1815 if (get_focus_unit_on_tile(unit_tile(packet_unit))) {
1816 /* Special case: (un)loading a unit in a transporter on the same
1817 * tile as the focus unit may (dis)allow the focus unit to be
1818 * loaded. Thus the orders->(un)load menu item needs updating. */
1819 need_menus_update = TRUE;
1820 }
1821 punit->client.occupied = packet_unit->client.occupied;
1822 }
1823
1824 punit->has_orders = packet_unit->has_orders;
1825 punit->orders.length = packet_unit->orders.length;
1826 punit->orders.index = packet_unit->orders.index;
1827 punit->orders.repeat = packet_unit->orders.repeat;
1828 punit->orders.vigilant = packet_unit->orders.vigilant;
1829
1830 /* We cheat by just stealing the packet unit's list. */
1831 if (punit->orders.list) {
1832 free(punit->orders.list);
1833 }
1834 punit->orders.list = packet_unit->orders.list;
1835 packet_unit->orders.list = nullptr;
1836
1837 if (plr == nullptr || owner == plr) {
1838 refresh_unit_city_dialogs(punit);
1839 }
1840 } /*** End of Change in activity or activity's target. ***/
1841
1842 /* These two lines force the menus to be updated as appropriate when
1843 * the focus unit changes. */
1844 if (unit_is_in_focus(punit)) {
1845 need_menus_update = TRUE;
1846 }
1847
1848 if (punit->homecity != packet_unit->homecity) {
1849 /* change homecity */
1850 struct city *hcity;
1851
1852 if ((hcity = game_city_by_number(punit->homecity))) {
1853 unit_list_remove(hcity->units_supported, punit);
1854 refresh_city_dialog(hcity);
1855 }
1856
1857 punit->homecity = packet_unit->homecity;
1858 if ((hcity = game_city_by_number(punit->homecity))) {
1859 unit_list_prepend(hcity->units_supported, punit);
1860 repaint_city = TRUE;
1861 }
1862
1863 /* This can change total upkeep figures */
1864 need_units_report_update = TRUE;
1865 }
1866
1867 if (punit->hp != packet_unit->hp) {
1868 /* hp changed */
1869 punit->hp = packet_unit->hp;
1870 repaint_unit = TRUE;
1871 }
1872
1873 if (punit->utype != unit_type_get(packet_unit)) {
1874 /* Unit type has changed (been upgraded) */
1875 struct city *ccity = tile_city(unit_tile(punit));
1876
1877 punit->utype = unit_type_get(packet_unit);
1878 repaint_unit = TRUE;
1879 repaint_city = TRUE;
1880 if (ccity != NULL && (ccity->id != punit->homecity)) {
1881 refresh_city_dialog(ccity);
1882 }
1883 if (unit_is_in_focus(punit)) {
1884 /* Update the orders menu -- the unit might have new abilities */
1885 need_menus_update = TRUE;
1886 }
1887 need_units_report_update = TRUE;
1888 }
1889
1890 /* May change focus if an attempted move or attack exhausted unit */
1891 if (punit->moves_left != packet_unit->moves_left
1892 && unit_is_in_focus(punit)) {
1893 check_focus = TRUE;
1894 }
1895
1896 if (!same_pos(unit_tile(punit), unit_tile(packet_unit))) {
1897 /*** Change position ***/
1898 struct city *ccity = tile_city(unit_tile(punit));
1899
1900 old_tile = unit_tile(punit);
1901 moved = TRUE;
1902
1903 /* Show where the unit is going. */
1904 do_move_unit(punit, packet_unit);
1905
1906 if (ccity != nullptr) {
1907 if (can_player_see_units_in_city(plr, ccity)) {
1908 /* Unit moved out of a city - update the occupied status. */
1909 bool new_occupied =
1910 (unit_list_size(ccity->tile->units) > 0);
1911
1912 if (ccity->client.occupied != new_occupied) {
1913 ccity->client.occupied = new_occupied;
1914 refresh_city_mapcanvas(ccity, ccity->tile, FALSE, FALSE);
1915 if (gui_options.draw_full_citybar) {
1916 update_city_description(ccity);
1917 }
1918 }
1919 }
1920
1921 if (ccity->id == punit->homecity) {
1922 repaint_city = TRUE;
1923 } else {
1924 refresh_city_dialog(ccity);
1925 }
1926 }
1927
1928 if ((ccity = tile_city(unit_tile(punit)))) {
1929 if (can_player_see_units_in_city(plr, ccity)) {
1930 /* Unit moved into a city - obviously it's occupied. */
1931 if (!ccity->client.occupied) {
1932 ccity->client.occupied = TRUE;
1933 refresh_city_mapcanvas(ccity, ccity->tile, FALSE, FALSE);
1934 if (gui_options.draw_full_citybar) {
1935 update_city_description(ccity);
1936 }
1937 }
1938 }
1939
1940 if (ccity->id == punit->homecity) {
1941 repaint_city = TRUE;
1942 } else {
1943 refresh_city_dialog(ccity);
1944 }
1945 }
1946
1947 } /*** End of Change position. ***/
1948
1949 if (repaint_city || repaint_unit) {
1950 /* We repaint the city if the unit itself needs repainting or if
1951 * there is a special city-only redrawing to be done. */
1952 if ((pcity = game_city_by_number(punit->homecity))) {
1953 refresh_city_dialog(pcity);
1954 }
1955 if (repaint_unit && tile_city(unit_tile(punit))
1956 && tile_city(unit_tile(punit)) != pcity) {
1957 /* Refresh the city we're occupying too. */
1958 refresh_city_dialog(tile_city(unit_tile(punit)));
1959 }
1960 }
1961
1962 need_economy_report_update = (punit->upkeep[O_GOLD]
1963 != packet_unit->upkeep[O_GOLD]);
1964 /* unit upkeep information */
1965 output_type_iterate(o) {
1966 punit->upkeep[o] = packet_unit->upkeep[o];
1967 } output_type_iterate_end;
1968
1969 punit->nationality = packet_unit->nationality;
1970 punit->veteran = packet_unit->veteran;
1971 punit->moves_left = packet_unit->moves_left;
1972 punit->fuel = packet_unit->fuel;
1973 punit->goto_tile = packet_unit->goto_tile;
1974 punit->paradropped = packet_unit->paradropped;
1975 punit->stay = packet_unit->stay;
1976 if (punit->done_moving != packet_unit->done_moving) {
1977 punit->done_moving = packet_unit->done_moving;
1978 check_focus = TRUE;
1979 }
1980
1981 /* This won't change punit; it enqueues the call for later handling. */
1982 agents_unit_changed(punit);
1983 editgui_notify_object_changed(OBJTYPE_UNIT, punit->id, FALSE);
1984
1985 if ((punit->action_decision_want != packet_unit->action_decision_want
1986 || (punit->action_decision_tile
1987 != packet_unit->action_decision_tile))
1988 && should_ask_server_for_actions(packet_unit)) {
1989 /* The unit wants the player to decide. */
1990 if (action_selection_actor_unit() != punit->id) {
1991 /* Pop up an action selection dialog if the unit has focus or give
1992 * the unit higher priority in the focus queue if not. */
1993 punit->action_decision_tile = packet_unit->action_decision_tile;
1994 action_decision_handle(punit);
1995 check_focus = TRUE;
1996 } else {
1997 /* Refresh already open action selection dialog. */
1998 dsend_packet_unit_get_actions(&client.conn,
1999 action_selection_actor_unit(),
2000 action_selection_target_unit(),
2001 tile_index(
2002 packet_unit->action_decision_tile),
2003 action_selection_target_extra(),
2004 REQEST_BACKGROUND_REFRESH);
2005 }
2006 }
2007 punit->action_decision_want = packet_unit->action_decision_want;
2008 punit->action_decision_tile = packet_unit->action_decision_tile;
2009 } else {
2010 /*** Create new unit ***/
2011 punit = packet_unit;
2012 idex_register_unit(&wld, punit);
2013
2014 if (owner != nullptr) {
2015 unit_list_prepend(owner->units, punit);
2016 }
2017 unit_list_prepend(unit_tile(punit)->units, punit);
2018
2019 unit_register_battlegroup(punit);
2020
2021 if ((pcity = game_city_by_number(punit->homecity))) {
2022 unit_list_prepend(pcity->units_supported, punit);
2023 }
2024
2025 log_debug("New %s %s id %d (%d %d) hc %d %s",
2026 nation_rule_name(nation_of_unit(punit)),
2027 unit_rule_name(punit), TILE_XY(unit_tile(punit)),
2028 punit->id, punit->homecity,
2029 (pcity ? city_name_get(pcity) : "(unknown)"));
2030
2031 repaint_unit = !unit_transported(punit);
2032 agents_unit_new(punit);
2033
2034 /* Check if we should link cargo units.
2035 * (This might be necessary if the cargo info was sent to us before
2036 * this transporter.) */
2037 if (punit->client.occupied) {
2038 unit_list_iterate(unit_tile(punit)->units, aunit) {
2039 if (aunit->client.transported_by == punit->id) {
2040 fc_assert(aunit->transporter == NULL);
2041 unit_transport_load(aunit, punit, TRUE);
2042 }
2043 } unit_list_iterate_end;
2044 }
2045
2046 if ((pcity = tile_city(unit_tile(punit)))) {
2047 /* The unit is in a city - obviously it's occupied. */
2048 pcity->client.occupied = TRUE;
2049 }
2050
2051 if (should_ask_server_for_actions(punit)) {
2052 /* The unit wants the player to decide. */
2053 action_decision_handle(punit);
2054 check_focus = TRUE;
2055 }
2056
2057 need_units_report_update = TRUE;
2058 } /*** End of Create new unit ***/
2059
2060 fc_assert_ret_val(punit != NULL, ret);
2061
2062 /* Check if we have to load the unit on a transporter. */
2063 if (punit->client.transported_by != -1) {
2064 struct unit *ptrans
2065 = game_unit_by_number(packet_unit->client.transported_by);
2066
2067 /* Load unit only if transporter is known by the client.
2068 * (If not, cargo will be loaded later when the transporter info is
2069 * sent to the client.) */
2070 if (ptrans && ptrans != unit_transport_get(punit)) {
2071 /* First, we have to unload the unit from its old transporter. */
2072 unit_transport_unload(punit);
2073 unit_transport_load(punit, ptrans, TRUE);
2074
2075#ifdef DEBUG_TRANSPORT
2076 log_debug("load %s (ID: %d) onto %s (ID: %d)",
2077 unit_name_translation(punit), punit->id,
2078 unit_name_translation(ptrans), ptrans->id);
2079 } else if (ptrans && ptrans == unit_transport_get(punit)) {
2080 log_debug("%s (ID: %d) is loaded onto %s (ID: %d)",
2081 unit_name_translation(punit), punit->id,
2082 unit_name_translation(ptrans), ptrans->id);
2083 } else {
2084 log_debug("%s (ID: %d) is not loaded", unit_name_translation(punit),
2085 punit->id);
2086#endif /* DEBUG_TRANSPORT */
2087
2088 }
2089 }
2090
2091 if (unit_is_in_focus(punit)
2092 || get_focus_unit_on_tile(unit_tile(punit))
2093 || (moved && get_focus_unit_on_tile(old_tile))) {
2094 update_unit_info_label(get_units_in_focus());
2095 /* Update (an possible active) unit select dialog. */
2096 unit_select_dialog_update();
2097 }
2098
2099 if (repaint_unit) {
2100 refresh_unit_mapcanvas(punit, unit_tile(punit), TRUE, FALSE);
2101 }
2102
2103 if ((check_focus || get_num_units_in_focus() == 0)
2104 && plr != nullptr
2105 && is_human(plr)
2106 && is_player_phase(plr, game.info.phase)) {
2107 unit_focus_update();
2108 }
2109
2110 if (need_menus_update) {
2111 menus_update();
2112 }
2113
2114 if (!client_has_player() || owner == plr) {
2115 if (need_economy_report_update) {
2116 economy_report_dialog_update();
2117 }
2118 if (need_units_report_update) {
2119 units_report_dialog_update();
2120 }
2121 }
2122
2123 return ret;
2124}
2125
2126/************************************************************************/
2132 void handle_investigate_started(const struct packet_investigate_started *packet)
2133{
2134 struct city *pcity = game_city_by_number(packet->city_id);
2135
2136 if (!pcity) {
2137 log_error("Investigate city: unknown city id %d!",
2138 packet->city_id);
2139 return;
2140 }
2141
2142 /* Start collecting supported and present units. */
2143
2144 /* Ensure we are not already in an investigate cycle. */
2145 fc_assert(pcity->client.collecting_info_units_supported == NULL);
2146 fc_assert(pcity->client.collecting_info_units_present == NULL);
2147 pcity->client.collecting_info_units_supported =
2148 unit_list_new_full(unit_virtual_destroy);
2149 pcity->client.collecting_info_units_present =
2150 unit_list_new_full(unit_virtual_destroy);
2151}
2152
2153/************************************************************************/
2156 void handle_investigate_finished(const struct packet_investigate_finished *packet)
2157{
2158}
2159
2160/************************************************************************/
2163 void handle_unit_short_info(const struct packet_unit_short_info *packet)
2164{
2165 struct city *pcity;
2166 struct unit *punit;
2167
2168 /* Special case for a diplomat/spy investigating a city: The investigator
2169 * needs to know the supported and present units of a city, whether or not
2170 * they are fogged. So, we send a list of them all before sending the city
2171 * info. */
2172 if (packet->packet_use == UNIT_INFO_CITY_SUPPORTED
2173 || packet->packet_use == UNIT_INFO_CITY_PRESENT) {
2174
2175 pcity = game_city_by_number(packet->info_city_id);
2176 if (!pcity) {
2177 log_error("Investigate city: unknown city id %d!",
2178 packet->info_city_id);
2179 return;
2180 }
2181
2182 /* Append a unit struct to the proper list. */
2183 punit = unpackage_short_unit(packet);
2184 if (punit != nullptr) {
2185 if (packet->packet_use == UNIT_INFO_CITY_SUPPORTED) {
2186 fc_assert(pcity->client.collecting_info_units_supported != NULL);
2187 unit_list_append(pcity->client.collecting_info_units_supported, punit);
2188 } else {
2189 fc_assert(packet->packet_use == UNIT_INFO_CITY_PRESENT);
2190 fc_assert(pcity->client.collecting_info_units_present != NULL);
2191 unit_list_append(pcity->client.collecting_info_units_present, punit);
2192 }
2193 }
2194
2195 /* Done with special case. */
2196 return;
2197 }
2198
2199 if (player_by_number(packet->owner) == client.conn.playing) {
2200 log_error("handle_unit_short_info() for own unit.");
2201 }
2202
2203 punit = unpackage_short_unit(packet);
2204 if (punit != nullptr && handle_unit_packet_common(punit)) {
2205 punit->client.transported_by = -1;
2206 unit_virtual_destroy(punit);
2207 }
2208}
2209
2210/************************************************************************/
2213 void handle_set_topology(int topology_id, int wrap_id)
2214{
2215 wld.map.topology_id = topology_id;
2216 wld.map.wrap_id = wrap_id;
2217
2218 if (forced_tileset_name[0] == '\0'
2219 && (tileset_map_topo_compatible(topology_id, tileset, NULL)
2220 == TOPO_INCOMP_HARD
2221 || strcmp(tileset_basename(tileset), game.control.preferred_tileset))) {
2222 const char *ts_to_load;
2223
2224 ts_to_load = tileset_name_for_topology(topology_id);
2225
2226 if (ts_to_load != NULL && ts_to_load[0] != '\0') {
2227 tilespec_reread_frozen_refresh(ts_to_load);
2228 }
2229 }
2230}
2231
2232/************************************************************************/
2236 void handle_map_info(const struct packet_map_info *packet)
2237{
2238 int ts_topo;
2239
2240 if (!map_is_empty()) {
2241 map_free(&(wld.map));
2242 free_city_map_index();
2243 }
2244
2245 wld.map.xsize = packet->xsize;
2246 wld.map.ysize = packet->ysize;
2247
2248 wld.map.north_latitude = packet->north_latitude;
2249 wld.map.south_latitude = packet->south_latitude;
2250 wld.map.altitude_info = packet->altitude_info;
2251
2252 if (tileset_map_topo_compatible(packet->topology_id,
2253 tileset, &ts_topo) == TOPO_INCOMP_HARD) {
2254 tileset_error(LOG_NORMAL, tileset_name_get(tileset),
2255 _("Map topology (%s) and tileset (%s) incompatible."),
2256 describe_topology(packet->topology_id), describe_topology(ts_topo));
2257 }
2258
2259 wld.map.topology_id = packet->topology_id;
2260 wld.map.wrap_id = packet->wrap_id;
2261
2262 map_init_topology();
2263 main_map_allocate();
2264 client_player_maps_reset();
2265 init_client_goto();
2266 mapdeco_init();
2267
2268 generate_citydlg_dimensions();
2269
2270 calculate_overview_dimensions();
2271
2272 packhand_init();
2273}
2274
2275/************************************************************************/
2278 void handle_game_info(const struct packet_game_info *pinfo)
2279{
2280 bool boot_help;
2281 bool update_aifill_button = FALSE, update_ai_skill_level = FALSE;
2282 bool toggle_edit_ui = FALSE;
2283
2284 if (game.info.aifill != pinfo->aifill) {
2285 update_aifill_button = TRUE;
2286 }
2287 if (game.info.skill_level != pinfo->skill_level) {
2288 update_ai_skill_level = TRUE;
2289 }
2290
2291 if (game.info.is_edit_mode != pinfo->is_edit_mode) {
2292 toggle_edit_ui = TRUE;
2293
2294 popdown_all_city_dialogs();
2295 /* Clears the current goto command. */
2296 clear_hover_state();
2297
2298 if (pinfo->is_edit_mode) {
2299 if (game.scenario.handmade && !handmade_scenario_warning()) {
2300 /* Gui didn't handle this */
2301 output_window_append(ftc_client,
2302 _("This scenario may have manually set properties the editor "
2303 "cannot handle."));
2304 output_window_append(ftc_client,
2305 _("They won't be saved when scenario is saved from the editor."));
2306 }
2307 }
2308 }
2309
2310 game.info = *pinfo;
2311
2312 /* check the values! */
2313#define VALIDATE(_count, _maximum, _string) \
2314 if (game.info._count > _maximum) { \
2315 log_error("handle_game_info(): Too many " _string "; using %d of %d", \
2316 _maximum, game.info._count); \
2317 game.info._count = _maximum; \
2318 }
2319
2320 VALIDATE(granary_num_inis, MAX_GRANARY_INIS, "granary entries");
2321#undef VALIDATE
2322
2323 game.default_government =
2324 government_by_number(game.info.default_government_id);
2325 game.government_during_revolution =
2326 government_by_number(game.info.government_during_revolution_id);
2327
2328 boot_help = (can_client_change_view()
2329 && game.info.victory_conditions != pinfo->victory_conditions);
2330 if (boot_help) {
2331 boot_help_texts(); /* reboot, after setting game.spacerace */
2332 }
2333 unit_focus_update();
2334 menus_update();
2335 players_dialog_update();
2336 if (update_aifill_button || update_ai_skill_level) {
2337 update_start_page();
2338 }
2339
2340 if (can_client_change_view()) {
2341 update_info_label();
2342 }
2343
2344 if (toggle_edit_ui) {
2345 editgui_refresh();
2346 }
2347
2348 editgui_notify_object_changed(OBJTYPE_GAME, 1, FALSE);
2349}
2350
2351/************************************************************************/
2354 void handle_calendar_info(const struct packet_calendar_info *pcalendar)
2355{
2356 game.calendar = *pcalendar;
2357}
2358
2359/************************************************************************/
2362 void handle_timeout_info(float seconds_to_phasedone, float last_turn_change_time)
2363{
2364 if (current_turn_timeout() != 0 && seconds_to_phasedone >= 0) {
2365 /* If this packet is received in the middle of a turn, this value
2366 * represents the number of seconds from now to the end of the turn
2367 * (not from the start of the turn). So we need to restart our
2368 * timer. */
2369 set_seconds_to_turndone(seconds_to_phasedone);
2370 }
2371
2372 game.tinfo.last_turn_change_time = last_turn_change_time;
2373}
2374
2375/************************************************************************/
2379 void set_government_choice(struct government *government)
2380{
2381 if (NULL != client.conn.playing
2382 && can_client_issue_orders()
2383 && government != government_of_player(client.conn.playing)) {
2384 dsend_packet_player_change_government(&client.conn, government_number(government));
2385 }
2386}
2387
2388/************************************************************************/
2392 void start_revolution(void)
2393{
2394 dsend_packet_player_change_government(&client.conn,
2395 game.info.government_during_revolution_id);
2396}
2397
2398/************************************************************************/
2403 void handle_player_remove(int playerno)
2404{
2405 struct player_slot *pslot;
2406 struct player *pplayer;
2407 int plr_nbr;
2408
2409 pslot = player_slot_by_number(playerno);
2410
2411 if (NULL == pslot || !player_slot_is_used(pslot)) {
2412 /* Ok, just ignore. */
2413 return;
2414 }
2415
2416 pplayer = player_slot_get_player(pslot);
2417
2418 if (can_client_change_view()) {
2419 close_intel_dialog(pplayer);
2420 }
2421
2422 /* Update the connection informations. */
2423 if (client_player() == pplayer) {
2424 client.conn.playing = NULL;
2425 }
2426 conn_list_iterate(pplayer->connections, pconn) {
2427 pconn->playing = NULL;
2428 } conn_list_iterate_end;
2429 conn_list_clear(pplayer->connections);
2430
2431 /* Save player number before player is freed */
2432 plr_nbr = player_number(pplayer);
2433
2434 player_destroy(pplayer);
2435
2436 players_dialog_update();
2437 conn_list_dialog_update();
2438
2439 editgui_refresh();
2440 editgui_notify_object_changed(OBJTYPE_PLAYER, plr_nbr, TRUE);
2441}
2442
2443/************************************************************************/
2448 void handle_player_info(const struct packet_player_info *pinfo)
2449{
2450 bool is_new_nation = FALSE;
2451 bool turn_done_changed = FALSE;
2452 bool new_player = FALSE;
2453 int i;
2454 struct player *pplayer, *my_player;
2455 struct nation_type *pnation;
2456 struct government *pgov, *ptarget_gov;
2457 struct player_slot *pslot;
2458 struct team_slot *tslot;
2459
2460 /* Player. */
2461 pslot = player_slot_by_number(pinfo->playerno);
2462 fc_assert(NULL != pslot);
2463 new_player = !player_slot_is_used(pslot);
2464 pplayer = player_new(pslot);
2465
2466 if ((pplayer->rgb == NULL) != !pinfo->color_valid
2467 || (pinfo->color_valid
2468 && (pplayer->rgb->r != pinfo->color_red
2469 || pplayer->rgb->g != pinfo->color_green
2470 || pplayer->rgb->b != pinfo->color_blue))) {
2471 struct rgbcolor *prgbcolor;
2472
2473 if (pinfo->color_valid) {
2474 prgbcolor = rgbcolor_new(pinfo->color_red,
2475 pinfo->color_green,
2476 pinfo->color_blue);
2477 fc_assert_ret(prgbcolor != NULL);
2478 } else {
2479 prgbcolor = NULL;
2480 }
2481
2482 player_set_color(pplayer, prgbcolor);
2483 tileset_player_init(tileset, pplayer);
2484
2485 rgbcolor_destroy(prgbcolor);
2486
2487 /* Queue a map update -- may need to redraw borders, etc. */
2488 update_map_canvas_visible();
2489 }
2490 pplayer->client.color_changeable = pinfo->color_changeable;
2491
2492 if (new_player) {
2493 /* Initialise client side player data (tile vision). At the moment
2494 * redundant as the values are initialised with 0 due to fc_calloc(). */
2495 client_player_init(pplayer);
2496 }
2497
2498 /* Team. */
2499 tslot = team_slot_by_number(pinfo->team);
2500 fc_assert(NULL != tslot);
2501
2502 /* Should never fail when slot given is not nullptr */
2503 team_add_player(pplayer, team_new(tslot));
2504
2505 pnation = nation_by_number(pinfo->nation);
2506 pgov = government_by_number(pinfo->government);
2507 ptarget_gov = government_by_number(pinfo->target_government);
2508
2509 /* Now update the player information. */
2510 sz_strlcpy(pplayer->name, pinfo->name);
2511 sz_strlcpy(pplayer->username, pinfo->username);
2512 pplayer->unassigned_user = pinfo->unassigned_user;
2513
2514 is_new_nation = player_set_nation(pplayer, pnation);
2515 pplayer->is_male = pinfo->is_male;
2516 pplayer->score.game = pinfo->score;
2517 pplayer->was_created = pinfo->was_created;
2518
2519 pplayer->autoselect_weight = pinfo->autoselect_weight;
2520 pplayer->economic.gold = pinfo->gold;
2521 pplayer->economic.tax = pinfo->tax;
2522 pplayer->economic.science = pinfo->science;
2523 pplayer->economic.luxury = pinfo->luxury;
2524 pplayer->client.tech_upkeep = pinfo->tech_upkeep;
2525 pplayer->government = pgov;
2526 pplayer->target_government = ptarget_gov;
2527 pplayer->real_embassy = pinfo->real_embassy;
2528 pplayer->gives_shared_vision = pinfo->gives_shared_vision;
2529 pplayer->gives_shared_tiles = pinfo->gives_shared_tiles;
2530 pplayer->style = style_by_number(pinfo->style);
2531
2532 if (pplayer == client.conn.playing) {
2533 bool music_change = FALSE;
2534
2535 if (pplayer->music_style != pinfo->music_style) {
2536 pplayer->music_style = pinfo->music_style;
2537 music_change = TRUE;
2538 }
2539 if (pplayer->client.mood != pinfo->mood) {
2540 pplayer->client.mood = pinfo->mood;
2541 music_change = TRUE;
2542 }
2543
2544 if (music_change) {
2545 start_style_music();
2546 }
2547 }
2548
2549 pplayer->history = pinfo->history;
2550 pplayer->client.culture = pinfo->culture;
2551
2552 if (pplayer->economic.infra_points != pinfo->infrapoints) {
2553 pplayer->economic.infra_points = pinfo->infrapoints;
2554 update_infra_dialog();
2555 }
2556
2557 /* Don't use player_iterate or player_slot_count here, because we ignore
2558 * the real number of players and we want to read all the datas. */
2559 fc_assert(ARRAY_SIZE(pplayer->ai_common.love) >= ARRAY_SIZE(pinfo->love));
2560 for (i = 0; i < ARRAY_SIZE(pinfo->love); i++) {
2561 pplayer->ai_common.love[i] = pinfo->love[i];
2562 }
2563
2564 my_player = client_player();
2565
2566 pplayer->is_connected = pinfo->is_connected;
2567
2568 for (i = 0; i < B_LAST; i++) {
2569 pplayer->wonders[i] = pinfo->wonders[i];
2570 }
2571
2572 /* Set AI.control. */
2573 if (is_ai(pplayer) != BV_ISSET(pinfo->flags, PLRF_AI)) {
2574 BV_SET_VAL(pplayer->flags, PLRF_AI, BV_ISSET(pinfo->flags, PLRF_AI));
2575 if (pplayer == my_player) {
2576 if (is_ai(my_player)) {
2577 output_window_append(ftc_client, _("AI mode is now ON."));
2578 if (!gui_options.ai_manual_turn_done && !pplayer->phase_done) {
2579 /* End turn immediately */
2580 user_ended_turn();
2581 }
2582 } else {
2583 output_window_append(ftc_client, _("AI mode is now OFF."));
2584 }
2585 }
2586 }
2587
2588 pplayer->flags = pinfo->flags;
2589
2590 pplayer->ai_common.science_cost = pinfo->science_cost;
2591
2592 turn_done_changed = (pplayer->phase_done != pinfo->phase_done
2593 || (BV_ISSET(pplayer->flags, PLRF_AI) !=
2594 BV_ISSET(pinfo->flags, PLRF_AI)));
2595 pplayer->phase_done = pinfo->phase_done;
2596
2597 pplayer->is_ready = pinfo->is_ready;
2598 pplayer->nturns_idle = pinfo->nturns_idle;
2599 pplayer->is_alive = pinfo->is_alive;
2600 pplayer->turns_alive = pinfo->turns_alive;
2601 pplayer->ai_common.barbarian_type = pinfo->barbarian_type;
2602 pplayer->revolution_finishes = pinfo->revolution_finishes;
2603 pplayer->ai_common.skill_level = pinfo->ai_skill_level;
2604
2605 fc_assert(pinfo->multip_count == multiplier_count());
2606 game.control.num_multipliers = pinfo->multip_count;
2607 multipliers_iterate(pmul) {
2608 int idx = multiplier_index(pmul);
2609
2610 pplayer->multipliers[idx].value = pinfo->multiplier[idx];
2611 pplayer->multipliers[idx].target = pinfo->multiplier_target[idx];
2612 pplayer->multipliers[idx].changed = pinfo->multiplier_changed[idx];
2613 } multipliers_iterate_end;
2614
2615 /* if the server requests that the client reset, then information about
2616 * connections to this player are lost. If this is the case, insert the
2617 * correct conn back into the player->connections list */
2618 if (conn_list_size(pplayer->connections) == 0) {
2619 conn_list_iterate(game.est_connections, pconn) {
2620 if (pplayer == pconn->playing) {
2621 /* insert the controller into first position */
2622 if (pconn->observer) {
2623 conn_list_append(pplayer->connections, pconn);
2624 } else {
2625 conn_list_prepend(pplayer->connections, pconn);
2626 }
2627 }
2628 } conn_list_iterate_end;
2629 }
2630
2631
2632 /* The player information is now fully set. Update the GUI. */
2633
2634 if (pplayer == my_player && can_client_change_view()) {
2635 if (turn_done_changed) {
2636 update_turn_done_button_state();
2637 }
2638 science_report_dialog_update();
2639 economy_report_dialog_update();
2640 units_report_dialog_update();
2641 city_report_dialog_update();
2642 multipliers_dialog_update();
2643 update_info_label();
2644 menus_update();
2645 }
2646
2647 upgrade_canvas_clipboard();
2648
2649 players_dialog_update();
2650 update_start_page();
2651
2652 if (is_new_nation) {
2653 races_toggles_set_sensitive();
2654
2655 /* When changing nation during a running game, some refreshing is needed.
2656 * This may not be the only one! */
2657 update_map_canvas_visible();
2658 }
2659
2660 if (can_client_change_view()) {
2661 /* Just about any changes above require an update to the intelligence
2662 * dialog. */
2663 update_intel_dialog(pplayer);
2664 }
2665
2666 editgui_refresh();
2667 editgui_notify_object_changed(OBJTYPE_PLAYER, player_number(pplayer),
2668 FALSE);
2669}
2670
2671/************************************************************************/
2674 void handle_research_info(const struct packet_research_info *packet)
2675{
2676 struct research *presearch;
2677 bool tech_changed = FALSE;
2678 bool poptechup = FALSE;
2679 Tech_type_id gained_techs[advance_count()];
2680 int gained_techs_num = 0, i;
2681 enum tech_state newstate, oldstate;
2682
2683#ifdef FREECIV_DEBUG
2684 log_verbose("Research nb %d inventions: %s",
2685 packet->id,
2686 packet->inventions);
2687#endif
2688 presearch = research_by_number(packet->id);
2689 fc_assert_ret(NULL != presearch);
2690
2691 poptechup = (presearch->researching != packet->researching
2692 || presearch->tech_goal != packet->tech_goal);
2693 presearch->techs_researched = packet->techs_researched;
2694 if (presearch->future_tech == 0 && packet->future_tech > 0) {
2695 gained_techs[gained_techs_num++] = A_FUTURE;
2696 }
2697 presearch->future_tech = packet->future_tech;
2698 presearch->researching = packet->researching;
2699 presearch->client.researching_cost = packet->researching_cost;
2700 presearch->bulbs_researched = packet->bulbs_researched;
2701 presearch->tech_goal = packet->tech_goal;
2702 presearch->client.total_bulbs_prod = packet->total_bulbs_prod;
2703
2704 advance_index_iterate(A_NONE, advi) {
2705 newstate = packet->inventions[advi] - '0';
2706 oldstate = research_invention_set(presearch, advi, newstate);
2707
2708 if (newstate != oldstate) {
2709 if (TECH_KNOWN == newstate) {
2710 tech_changed = TRUE;
2711 if (A_NONE != advi) {
2712 gained_techs[gained_techs_num++] = advi;
2713 }
2714 } else if (TECH_KNOWN == oldstate) {
2715 tech_changed = TRUE;
2716 }
2717 }
2718 } advance_index_iterate_end;
2719
2720 research_update(presearch);
2721
2722 if (C_S_RUNNING == client_state()) {
2723 if (presearch == research_get(client_player())) {
2724 if (poptechup && is_human(client_player())) {
2725 science_report_dialog_popup(FALSE);
2726 }
2727 science_report_dialog_update();
2728 if (tech_changed) {
2729 /* Some ways a new or lost tech can affect menus:
2730 * - If tech is needed for certain governments, the government
2731 * switching menus need updating.
2732 * - If we just learned/lost bridge building and focus is on a
2733 * worker on a river, the road menu item needs updating. */
2734 menus_update();
2735
2736 script_client_signal_emit("new_tech");
2737
2738 /* If we got a new tech the tech tree news an update. */
2739 science_report_dialog_redraw();
2740 }
2741 for (i = 0; i < gained_techs_num; i++) {
2742 show_tech_gained_dialog(gained_techs[i]);
2743 }
2744 }
2745 if (editor_is_active()) {
2746 editgui_refresh();
2747 research_players_iterate(presearch, pplayer) {
2748 editgui_notify_object_changed(OBJTYPE_PLAYER, player_number(pplayer),
2749 FALSE);
2750 } research_players_iterate_end;
2751 }
2752 }
2753}
2754
2755/************************************************************************/
2758 void handle_unknown_research(int id)
2759{
2760 struct research *presearch = research_by_number(id);
2761
2762 if (presearch == NULL) {
2763 log_error("Received unknown research for clearing: %d.", id);
2764 return;
2765 }
2766
2767 /* Do we need to set other fields? */
2768 presearch->researching = A_UNKNOWN;
2769 presearch->future_tech = 0;
2770 presearch->tech_goal = A_UNKNOWN;
2771
2772 advance_index_iterate(A_NONE, advi) {
2773 research_invention_set(presearch, advi, TECH_UNKNOWN);
2774 } advance_index_iterate_end;
2775
2776 if (editor_is_active()) {
2777 editgui_refresh();
2778 research_players_iterate(presearch, pplayer) {
2779 editgui_notify_object_changed(OBJTYPE_PLAYER, player_number(pplayer),
2780 FALSE);
2781 } research_players_iterate_end;
2782 }
2783}
2784
2785/************************************************************************/
2788 void handle_player_diplstate(const struct packet_player_diplstate *packet)
2789{
2790 struct player *plr1 = player_by_number(packet->plr1);
2791 struct player *plr2 = player_by_number(packet->plr2);
2792 struct player *my_player = client_player();
2793 struct player_diplstate *ds = player_diplstate_get(plr1, plr2);
2794 bool need_players_dialog_update = FALSE;
2795
2796 fc_assert_ret(ds != NULL);
2797
2798 if (client_has_player() && my_player == plr2) {
2799 if (ds->type != packet->type) {
2800 need_players_dialog_update = TRUE;
2801 }
2802
2803 /* Check if we detect change to armistice with us. If so,
2804 * ready all units for movement out of the territory in
2805 * question; otherwise they will be disbanded. */
2806 if (DS_ARMISTICE != player_diplstate_get(plr1, my_player)->type
2807 && DS_ARMISTICE == packet->type) {
2808 unit_list_iterate(my_player->units, punit) {
2809 if (!tile_owner(unit_tile(punit))
2810 || tile_owner(unit_tile(punit)) != plr1) {
2811 continue;
2812 }
2813 if (punit->client.focus_status == FOCUS_WAIT) {
2814 punit->client.focus_status = FOCUS_AVAIL;
2815 }
2816 if (punit->activity != ACTIVITY_IDLE) {
2817 request_new_unit_activity(punit, ACTIVITY_IDLE);
2818 }
2819 } unit_list_iterate_end;
2820 }
2821 }
2822
2823 ds->type = packet->type;
2824 ds->turns_left = packet->turns_left;
2825 ds->has_reason_to_cancel = packet->has_reason_to_cancel;
2826 ds->contact_turns_left = packet->contact_turns_left;
2827
2828 if (need_players_dialog_update) {
2829 players_dialog_update();
2830 }
2831
2832 if (need_players_dialog_update
2833 && action_selection_actor_unit() != IDENTITY_NUMBER_ZERO) {
2834 /* An action selection dialog is open and our diplomatic state just
2835 * changed. Find out if the relationship that changed was to a
2836 * potential target. */
2837 struct tile *tgt_tile = NULL;
2838
2839 /* Is a refresh needed because of a unit target? */
2840 if (action_selection_target_unit() != IDENTITY_NUMBER_ZERO) {
2841 struct unit *tgt_unit;
2842
2843 tgt_unit = game_unit_by_number(action_selection_target_unit());
2844
2845 if (tgt_unit != NULL && tgt_unit->owner == plr1) {
2846 /* An update is needed because of this unit target. */
2847 tgt_tile = unit_tile(tgt_unit);
2848 fc_assert(tgt_tile != NULL);
2849 }
2850 }
2851
2852 /* Is a refresh needed because of a city target? */
2853 if (action_selection_target_city() != IDENTITY_NUMBER_ZERO) {
2854 struct city *tgt_city;
2855
2856 tgt_city = game_city_by_number(action_selection_target_city());
2857
2858 if (tgt_city != NULL && tgt_city->owner == plr1) {
2859 /* An update is needed because of this city target.
2860 * Overwrites any target tile from a unit. */
2861 tgt_tile = city_tile(tgt_city);
2862 fc_assert(tgt_tile != NULL);
2863 }
2864 }
2865
2866 if (tgt_tile
2867 || ((tgt_tile = index_to_tile(&(wld.map),
2868 action_selection_target_tile()))
2869 && tile_owner(tgt_tile) == plr1)) {
2870 /* The diplomatic relationship to the target in an open action
2871 * selection dialog have changed. This probably changes
2872 * the set of available actions. */
2873 dsend_packet_unit_get_actions(&client.conn,
2874 action_selection_actor_unit(),
2875 action_selection_target_unit(),
2876 tgt_tile->index,
2877 action_selection_target_extra(),
2878 REQEST_BACKGROUND_REFRESH);
2879 }
2880 }
2881}
2882
2883/************************************************************************/
2889 void handle_conn_info(const struct packet_conn_info *pinfo)
2890{
2891 struct connection *pconn = conn_by_number(pinfo->id);
2892 bool preparing_client_state = FALSE;
2893
2894 log_debug("conn_info id%d used%d est%d plr%d obs%d acc%d",
2895 pinfo->id, pinfo->used, pinfo->established, pinfo->player_num,
2896 pinfo->observer, (int) pinfo->access_level);
2897 log_debug("conn_info \"%s\" \"%s\" \"%s\"",
2898 pinfo->username, pinfo->addr, pinfo->capability);
2899
2900 if (!pinfo->used) {
2901 /* Forget the connection */
2902 if (!pconn) {
2903 log_verbose("Server removed unknown connection %d", pinfo->id);
2904 return;
2905 }
2906 client_remove_cli_conn(pconn);
2907 pconn = NULL;
2908 } else {
2909 struct player_slot *pslot = player_slot_by_number(pinfo->player_num);
2910 struct player *pplayer = NULL;
2911
2912 if (NULL != pslot) {
2913 pplayer = player_slot_get_player(pslot);
2914 }
2915
2916 if (!pconn) {
2917 log_verbose("Server reports new connection %d %s",
2918 pinfo->id, pinfo->username);
2919
2920 pconn = fc_calloc(1, sizeof(struct connection));
2921 pconn->buffer = NULL;
2922 pconn->send_buffer = NULL;
2923 pconn->ping_time = -1.0;
2924 if (pplayer) {
2925 conn_list_append(pplayer->connections, pconn);
2926 }
2927 conn_list_append(game.all_connections, pconn);
2928 conn_list_append(game.est_connections, pconn);
2929 } else {
2930 log_packet("Server reports updated connection %d %s",
2931 pinfo->id, pinfo->username);
2932 if (pplayer != pconn->playing) {
2933 if (NULL != pconn->playing) {
2934 conn_list_remove(pconn->playing->connections, pconn);
2935 }
2936 if (pplayer) {
2937 conn_list_append(pplayer->connections, pconn);
2938 }
2939 }
2940 }
2941
2942 pconn->id = pinfo->id;
2943 pconn->established = pinfo->established;
2944 pconn->observer = pinfo->observer;
2945 pconn->access_level = pinfo->access_level;
2946 pconn->playing = pplayer;
2947
2948 sz_strlcpy(pconn->username, pinfo->username);
2949 sz_strlcpy(pconn->addr, pinfo->addr);
2950 sz_strlcpy(pconn->capability, pinfo->capability);
2951
2952 if (pinfo->id == client.conn.id) {
2953 /* NB: In this case, pconn is not a duplication of client.conn.
2954 *
2955 * pconn->addr is our address that the server knows whereas
2956 * client.conn.addr is the address to the server. Also,
2957 * pconn->capability stores our capabilites known at server side
2958 * whereas client.conn.capability represents the capabilities of the
2959 * server. */
2960 if (client.conn.playing != pplayer
2961 || client.conn.observer != pinfo->observer) {
2962 /* Our connection state changed, let prepare the changes and reset
2963 * the game. */
2964 preparing_client_state = TRUE;
2965 }
2966
2967 /* Copy our current state into the static structure (our connection
2968 * to the server). */
2969 client.conn.established = pinfo->established;
2970 client.conn.observer = pinfo->observer;
2971 client.conn.access_level = pinfo->access_level;
2972 client.conn.playing = pplayer;
2973 sz_strlcpy(client.conn.username, pinfo->username);
2974 }
2975 }
2976
2977 players_dialog_update();
2978 conn_list_dialog_update();
2979
2980 if (pinfo->used && pinfo->id == client.conn.id) {
2981 /* For updating the sensitivity of the "Edit Mode" menu item,
2982 * among other things. */
2983 menus_update();
2984 }
2985
2986 if (preparing_client_state) {
2987 set_client_state(C_S_PREPARING);
2988 }
2989}
2990
2991/************************************************************************/
2995 void handle_conn_ping_info(int connections, const int *conn_id,
2996 const float *ping_time)
2997{
2998 int i;
2999
3000 for (i = 0; i < connections; i++) {
3001 struct connection *pconn = conn_by_number(conn_id[i]);
3002
3003 if (!pconn) {
3004 continue;
3005 }
3006
3007 pconn->ping_time = ping_time[i];
3008 log_debug("conn-id=%d, ping=%fs", pconn->id, pconn->ping_time);
3009 }
3010 /* The old_ping_time data is ignored. */
3011
3012 players_dialog_update();
3013}
3014
3015/************************************************************************/
3018 void handle_achievement_info(int id, bool gained, bool first)
3019{
3020 struct achievement *pach;
3021
3022 if (id < 0 || id >= game.control.num_achievement_types) {
3023 log_error("Received illegal achievement info %d", id);
3024 return;
3025 }
3026
3027 pach = achievement_by_number(id);
3028
3029 if (gained) {
3030 BV_SET(pach->achievers, player_index(client_player()));
3031 } else {
3032 BV_CLR(pach->achievers, player_index(client_player()));
3033 }
3034
3035 if (first) {
3036 pach->first = client_player();
3037 }
3038}
3039
3040/************************************************************************/
3055 static bool spaceship_autoplace(struct player *pplayer,
3056 struct player_spaceship *ship)
3057{
3058 if (can_client_issue_orders()) {
3059 struct spaceship_component place;
3060
3061 if (next_spaceship_component(pplayer, ship, &place)) {
3062 dsend_packet_spaceship_place(&client.conn, place.type, place.num);
3063
3064 return TRUE;
3065 }
3066 }
3067
3068 return FALSE;
3069}
3070
3071/************************************************************************/
3074 void handle_spaceship_info(const struct packet_spaceship_info *p)
3075{
3076 struct player_spaceship *ship;
3077 struct player *pplayer = player_by_number(p->player_num);
3078
3079 fc_assert_ret_msg(NULL != pplayer, "Invalid player number %d.",
3080 p->player_num);
3081
3082 ship = &pplayer->spaceship;
3083 ship->state = p->sship_state;
3084 ship->structurals = p->structurals;
3085 ship->components = p->components;
3086 ship->modules = p->modules;
3087 ship->fuel = p->fuel;
3088 ship->propulsion = p->propulsion;
3089 ship->habitation = p->habitation;
3090 ship->life_support = p->life_support;
3091 ship->solar_panels = p->solar_panels;
3092 ship->launch_year = p->launch_year;
3093 ship->population = p->population;
3094 ship->mass = p->mass;
3095 ship->support_rate = p->support_rate;
3096 ship->energy_rate = p->energy_rate;
3097 ship->success_rate = p->success_rate;
3098 ship->travel_time = p->travel_time;
3099 ship->structure = p->structure;
3100
3101 if (pplayer != client_player()) {
3102 refresh_spaceship_dialog(pplayer);
3103 menus_update();
3104 return;
3105 }
3106
3107 if (!spaceship_autoplace(pplayer, ship)) {
3108 /* We refresh the dialog when the packet did *not* cause placing
3109 * of new part. That's because those cases where part is placed, are
3110 * followed by exactly one case where there's no more parts to place -
3111 * we want to refresh the dialog only when that last packet comes. */
3112 refresh_spaceship_dialog(pplayer);
3113 }
3114}
3115
3116/************************************************************************/
3119 void handle_tile_info(const struct packet_tile_info *packet)
3120{
3121 enum known_type new_known;
3122 enum known_type old_known;
3123 bool known_changed = FALSE;
3124 bool tile_changed = FALSE;
3125 struct player *powner = player_by_number(packet->owner);
3126 struct player *eowner = player_by_number(packet->extras_owner);
3127 struct extra_type *presource = NULL;
3128 struct terrain *pterrain = terrain_by_number(packet->terrain);
3129 struct tile *ptile = index_to_tile(&(wld.map), packet->tile);
3130
3131 fc_assert_ret_msg(NULL != ptile, "Invalid tile index %d.", packet->tile);
3132 old_known = client_tile_get_known(ptile);
3133
3134 if (packet->resource != MAX_EXTRA_TYPES) {
3135 presource = extra_by_number(packet->resource);
3136 }
3137
3138 if (NULL == tile_terrain(ptile) || pterrain != tile_terrain(ptile)) {
3139 tile_changed = TRUE;
3140 switch (old_known) {
3141 case TILE_UNKNOWN:
3142 tile_set_terrain(ptile, pterrain);
3143 break;
3144 case TILE_KNOWN_UNSEEN:
3145 case TILE_KNOWN_SEEN:
3146 if (NULL != pterrain || TILE_UNKNOWN == packet->known) {
3147 tile_set_terrain(ptile, pterrain);
3148 } else {
3149 tile_changed = FALSE;
3150 log_error("handle_tile_info() unknown terrain (%d, %d).",
3151 TILE_XY(ptile));
3152 }
3153 break;
3154 };
3155 }
3156
3157 if (!BV_ARE_EQUAL(ptile->extras, packet->extras)) {
3158 ptile->extras = packet->extras;
3159 tile_changed = TRUE;
3160 }
3161
3162 tile_changed = tile_changed || (tile_resource(ptile) != presource);
3163
3164 /* Always called after setting terrain */
3165 tile_set_resource(ptile, presource);
3166
3167 if (tile_owner(ptile) != powner) {
3168 tile_set_owner(ptile, powner, NULL);
3169 tile_changed = TRUE;
3170 }
3171 if (extra_owner(ptile) != eowner) {
3172 ptile->extras_owner = eowner;
3173 tile_changed = TRUE;
3174 }
3175
3176 ptile->altitude = packet->altitude;
3177
3178 if (packet->placing < 0) {
3179 if (ptile->placing != NULL) {
3180 tile_changed = TRUE;
3181 ptile->placing = NULL;
3182 ptile->infra_turns = 0;
3183 }
3184 } else {
3185 struct extra_type *old = ptile->placing;
3186
3187 ptile->placing = extra_by_number(packet->placing);
3188 if (ptile->placing != old
3189 || ptile->infra_turns != packet->place_turn - game.info.turn) {
3190 tile_changed = TRUE;
3191 }
3192 ptile->infra_turns = packet->place_turn - game.info.turn;
3193 }
3194
3195 if (NULL == tile_worked(ptile)
3196 || tile_worked(ptile)->id != packet->worked) {
3197 if (IDENTITY_NUMBER_ZERO != packet->worked) {
3198 struct city *pwork = game_city_by_number(packet->worked);
3199
3200 if (NULL == pwork) {
3201 char named[MAX_LEN_CITYNAME];
3202
3203 /* New unseen ("invisible") city, or before city_info */
3204 fc_snprintf(named, sizeof(named), "%06u", packet->worked);
3205
3206 pwork = create_city_virtual(invisible.placeholder, NULL, named);
3207 pwork->id = packet->worked;
3208 idex_register_city(&wld, pwork);
3209
3210 city_list_prepend(invisible.cities, pwork);
3211
3212 log_debug("(%d,%d) invisible city %d, %s",
3213 TILE_XY(ptile), pwork->id, city_name_get(pwork));
3214 } else if (NULL == city_tile(pwork)) {
3215 /* Old unseen ("invisible") city, or before city_info */
3216 if (NULL != powner && city_owner(pwork) != powner) {
3217 /* Update placeholder with current owner */
3218 pwork->owner = powner;
3219 pwork->original = NULL;
3220 }
3221 } else {
3222 /* We have a real (not invisible) city record for this ID, but
3223 * perhaps our info about that city is out of date. */
3224 int dist_sq = sq_map_distance(city_tile(pwork), ptile);
3225
3226 if (dist_sq > city_map_radius_sq_get(pwork)) {
3227 /* This is probably enemy city which has grown in diameter since we
3228 * last saw it. We need city_radius_sq to be at least big enough so
3229 * that all workers fit in, so set it so. */
3230 city_map_radius_sq_set(pwork, dist_sq);
3231 }
3232 /* This might be a known city that is open in a dialog.
3233 * (And this might be our only prompt to refresh the worked tiles
3234 * display in its city map, if a worker rearrangement does not
3235 * change anything else about the city such as output.) */
3236 {
3237 struct city *oldwork = tile_worked(ptile);
3238 if (oldwork && NULL != city_tile(oldwork)) {
3239 /* Refresh previous city too if it's real and different */
3240 refresh_city_dialog(oldwork);
3241 }
3242 /* Refresh new city working tile (which we already know is real) */
3243 refresh_city_dialog(pwork);
3244 }
3245 }
3246
3247 /* This marks tile worked by (possibly invisible) city. Other
3248 * parts of the code have to handle invisible cities correctly
3249 * (ptile->worked->tile == NULL) */
3250 tile_set_worked(ptile, pwork);
3251 } else {
3252 /* Tile is no longer being worked by a city.
3253 * (Again, this might be our only prompt to refresh the worked tiles
3254 * display for the previous working city.) */
3255 if (tile_worked(ptile) && NULL != city_tile(tile_worked(ptile))) {
3256 refresh_city_dialog(tile_worked(ptile));
3257 }
3258 tile_set_worked(ptile, NULL);
3259 }
3260
3261 tile_changed = TRUE;
3262 }
3263
3264 if (old_known != packet->known) {
3265 known_changed = TRUE;
3266 }
3267
3268 if (NULL != client.conn.playing) {
3269 dbv_clr(&client.conn.playing->tile_known, tile_index(ptile));
3270 vision_layer_iterate(v) {
3271 dbv_clr(&client.conn.playing->client.tile_vision[v], tile_index(ptile));
3272 } vision_layer_iterate_end;
3273
3274 switch (packet->known) {
3275 case TILE_KNOWN_SEEN:
3276 dbv_set(&client.conn.playing->tile_known, tile_index(ptile));
3277 vision_layer_iterate(v) {
3278 dbv_set(&client.conn.playing->client.tile_vision[v], tile_index(ptile));
3279 } vision_layer_iterate_end;
3280 break;
3281 case TILE_KNOWN_UNSEEN:
3282 dbv_set(&client.conn.playing->tile_known, tile_index(ptile));
3283 break;
3284 case TILE_UNKNOWN:
3285 break;
3286 default:
3287 log_error("handle_tile_info() invalid known (%d).", packet->known);
3288 break;
3289 };
3290 }
3291 new_known = client_tile_get_known(ptile);
3292
3293 if (packet->spec_sprite[0] != '\0') {
3294 if (!ptile->spec_sprite
3295 || strcmp(ptile->spec_sprite, packet->spec_sprite) != 0) {
3296 if (ptile->spec_sprite) {
3297 free(ptile->spec_sprite);
3298 }
3299 ptile->spec_sprite = fc_strdup(packet->spec_sprite);
3300 tile_changed = TRUE;
3301 }
3302 } else {
3303 if (ptile->spec_sprite) {
3304 free(ptile->spec_sprite);
3305 ptile->spec_sprite = NULL;
3306 tile_changed = TRUE;
3307 }
3308 }
3309
3310 if (TILE_KNOWN_SEEN == old_known && TILE_KNOWN_SEEN != new_known) {
3311 /* This is an error. So first we log the error,
3312 * then make an assertion. */
3313 unit_list_iterate(ptile->units, punit) {
3314 log_error("%p %d %s at (%d,%d) %s", punit, punit->id,
3315 unit_rule_name(punit), TILE_XY(unit_tile(punit)),
3316 player_name(unit_owner(punit)));
3317 } unit_list_iterate_end;
3318 fc_assert_msg(0 == unit_list_size(ptile->units), "Ghost units seen");
3319 /* Repairing... */
3320 unit_list_clear(ptile->units);
3321 }
3322
3323 ptile->continent = packet->continent;
3324 wld.map.num_continents = MAX(ptile->continent, wld.map.num_continents);
3325
3326 if (packet->label[0] == '\0') {
3327 if (ptile->label != NULL) {
3328 FC_FREE(ptile->label);
3329 ptile->label = NULL;
3330 tile_changed = TRUE;
3331 }
3332 } else if (ptile->label == NULL || strcmp(packet->label, ptile->label)) {
3333 tile_set_label(ptile, packet->label);
3334 tile_changed = TRUE;
3335 }
3336
3337 if (known_changed || tile_changed) {
3338 /*
3339 * A tile can only change if it was known before and is still
3340 * known. In the other cases the tile is new or removed.
3341 */
3342 if (known_changed && TILE_KNOWN_SEEN == new_known) {
3343 agents_tile_new(ptile);
3344 } else if (known_changed && TILE_KNOWN_UNSEEN == new_known) {
3345 agents_tile_remove(ptile);
3346 } else {
3347 agents_tile_changed(ptile);
3348 }
3349 editgui_notify_object_changed(OBJTYPE_TILE, tile_index(ptile), FALSE);
3350 }
3351
3352 /* refresh tiles */
3353 if (can_client_change_view()) {
3354 /* the tile itself (including the necessary parts of adjacent tiles) */
3355 if (tile_changed || old_known != new_known) {
3356 refresh_tile_mapcanvas(ptile, TRUE, FALSE);
3357 }
3358 }
3359
3360 /* update menus if the focus unit is on the tile. */
3361 if (tile_changed) {
3362 if (get_focus_unit_on_tile(ptile)) {
3363 menus_update();
3364 }
3365 }
3366
3367 /* FIXME: we really ought to call refresh_city_dialog() for any city
3368 * whose radii include this tile, to update the city map display.
3369 * But that would be expensive. We deal with the (common) special
3370 * case of changes in worked tiles above. */
3371}
3372
3373/************************************************************************/
3376 void handle_scenario_info(const struct packet_scenario_info *packet)
3377{
3378 game.scenario.is_scenario = packet->is_scenario;
3379 sz_strlcpy(game.scenario.name, packet->name);
3380 sz_strlcpy(game.scenario.authors, packet->authors);
3381 game.scenario.players = packet->players;
3382 game.scenario.startpos_nations = packet->startpos_nations;
3383 game.scenario.prevent_new_cities = packet->prevent_new_cities;
3384 game.scenario.lake_flooding = packet->lake_flooding;
3385 game.scenario.have_resources = packet->have_resources;
3386 game.scenario.ruleset_locked = packet->ruleset_locked;
3387 game.scenario.save_random = packet->save_random;
3388 game.scenario.handmade = packet->handmade;
3389 game.scenario.allow_ai_type_fallback = packet->allow_ai_type_fallback;
3390
3391 editgui_notify_object_changed(OBJTYPE_GAME, 1, FALSE);
3392}
3393
3394/************************************************************************/
3397 void handle_scenario_description(const char *description)
3398{
3399 sz_strlcpy(game.scenario_desc.description, description);
3400
3401 editgui_notify_object_changed(OBJTYPE_GAME, 1, FALSE);
3402}
3403
3404/************************************************************************/
3409 void handle_ruleset_control(const struct packet_ruleset_control *packet)
3410{
3411 /* The ruleset is going to load new nations. So close
3412 * the nation selection dialog if it is open. */
3413 popdown_races_dialog();
3414
3415 game.client.ruleset_init = FALSE;
3416 game.client.ruleset_ready = FALSE;
3417 game_ruleset_free();
3418 game_ruleset_init();
3419 game.client.ruleset_init = TRUE;
3420 game.control = *packet;
3421
3422 /* check the values! */
3423#define VALIDATE(_count, _maximum, _string) \
3424 if (game.control._count > _maximum) { \
3425 log_error("handle_ruleset_control(): Too many " _string \
3426 "; using %d of %d", _maximum, game.control._count); \
3427 game.control._count = _maximum; \
3428 }
3429
3430 VALIDATE(num_unit_classes, UCL_LAST, "unit classes");
3431 VALIDATE(num_unit_types, U_LAST, "unit types");
3432 VALIDATE(num_impr_types, B_LAST, "improvements");
3433 VALIDATE(num_tech_types, A_LAST, "advances");
3434 VALIDATE(num_base_types, MAX_EXTRA_TYPES, "bases");
3435 VALIDATE(num_road_types, MAX_EXTRA_TYPES, "roads");
3436 VALIDATE(num_resource_types, MAX_EXTRA_TYPES, "resources");
3437 VALIDATE(num_disaster_types, MAX_DISASTER_TYPES, "disasters");
3438 VALIDATE(num_achievement_types, MAX_ACHIEVEMENT_TYPES, "achievements");
3439 VALIDATE(num_counters, MAX_COUNTERS, "counters");
3440
3441 /* game.control.government_count, game.control.nation_count and
3442 * game.control.num_city_styles are allocated dynamically, and do
3443 * not need a size check. See the allocation below. */
3444
3445 VALIDATE(terrain_count, MAX_NUM_TERRAINS, "terrains");
3446
3447 VALIDATE(num_specialist_types, SP_MAX, "specialists");
3448#undef VALIDATE
3449
3450 governments_alloc(game.control.government_count);
3451 nations_alloc(game.control.nation_count);
3452 styles_alloc(game.control.num_styles);
3453 city_styles_alloc(game.control.num_city_styles);
3454 music_styles_alloc(game.control.num_music_styles);
3455
3456 if (game.control.desc_length > 0) {
3457 game.ruleset_description = fc_malloc(game.control.desc_length + 1);
3458 game.ruleset_description[0] = '\0';
3459 }
3460
3461 if (packet->preferred_tileset[0] != '\0') {
3462 /* There is tileset suggestion */
3463 if (strcmp(packet->preferred_tileset, tileset_basename(tileset))) {
3464 /* It's not currently in use */
3465 if (gui_options.autoaccept_tileset_suggestion) {
3466 tilespec_reread(game.control.preferred_tileset, TRUE, 1.0f);
3467 } else {
3468 popup_tileset_suggestion_dialog();
3469 }
3470 }
3471 }
3472
3473 if (packet->preferred_soundset[0] != '\0') {
3474 /* There is soundset suggestion */
3475 if (strcmp(packet->preferred_soundset, sound_set_name)) {
3476 /* It's not currently in use */
3477 if (gui_options.autoaccept_soundset_suggestion) {
3478 audio_restart(game.control.preferred_soundset, music_set_name);
3479 } else {
3480 popup_soundset_suggestion_dialog();
3481 }
3482 }
3483 }
3484
3485 if (packet->preferred_musicset[0] != '\0') {
3486 /* There is musicset suggestion */
3487 if (strcmp(packet->preferred_musicset, music_set_name)) {
3488 /* It's not currently in use */
3489 if (gui_options.autoaccept_musicset_suggestion) {
3490 audio_restart(sound_set_name, game.control.preferred_musicset);
3491 } else {
3492 popup_musicset_suggestion_dialog();
3493 }
3494 }
3495 }
3496
3497 tileset_ruleset_reset(tileset);
3498
3499 resend_desired_settable_options();
3500}
3501
3502/************************************************************************/
3505 void handle_ruleset_summary(const struct packet_ruleset_summary *packet)
3506{
3507 int len;
3508
3509 if (game.ruleset_summary != NULL) {
3510 free(game.ruleset_summary);
3511 }
3512
3513 len = strlen(packet->text);
3514
3515 game.ruleset_summary = fc_malloc(len + 1);
3516
3517 fc_strlcpy(game.ruleset_summary, packet->text, len + 1);
3518}
3519
3520/************************************************************************/
3523 void handle_ruleset_description_part(
3524 const struct packet_ruleset_description_part *packet)
3525{
3526 fc_strlcat(game.ruleset_description, packet->text,
3527 game.control.desc_length + 1);
3528}
3529
3530/************************************************************************/
3533 void handle_rulesets_ready(void)
3534{
3535 /* Setup extra hiders caches */
3536 extra_type_iterate(pextra) {
3537 pextra->hiders = extra_type_list_new();
3538 extra_type_iterate(phider) {
3539 if (BV_ISSET(pextra->hidden_by, extra_index(phider))) {
3540 extra_type_list_append(pextra->hiders, phider);
3541 }
3542 } extra_type_iterate_end;
3543 pextra->bridged = extra_type_list_new();
3544 extra_type_iterate(pbridged) {
3545 if (BV_ISSET(pextra->bridged_over, extra_index(pbridged))) {
3546 extra_type_list_append(pextra->bridged, pbridged);
3547 }
3548 } extra_type_iterate_end;
3549 } extra_type_iterate_end;
3550
3551 unit_class_iterate(pclass) {
3552 set_unit_class_caches(pclass);
3553 set_unit_move_type(pclass);
3554 } unit_class_iterate_end;
3555
3556 /* Setup improvement feature caches */
3557 improvement_feature_cache_init();
3558
3559 /* Setup road integrators caches */
3560 road_integrators_cache_init();
3561
3562 /* Pre calculate action related data. */
3563 actions_rs_pre_san_gen();
3564
3565 /* Setup unit unknown move cost caches */
3566 unit_type_iterate(ptype) {
3567 ptype->unknown_move_cost = utype_unknown_move_cost(ptype);
3568 set_unit_type_caches(ptype);
3569 unit_type_action_cache_set(ptype);
3570 } unit_type_iterate_end;
3571
3572 /* Cache what city production can receive help from caravans. */
3573 city_production_caravan_shields_init();
3574
3575 /* Adjust editor for changed ruleset. */
3576 editor_ruleset_changed();
3577
3578 /* We are not going to crop any more sprites from big sprites, free them. */
3579 finish_loading_sprites(tileset);
3580
3581 game.client.ruleset_ready = TRUE;
3582}
3583
3584/************************************************************************/
3587 void handle_ruleset_unit_class(const struct packet_ruleset_unit_class *p)
3588{
3589 struct unit_class *c = uclass_by_number(p->id);
3590
3591 fc_assert_ret_msg(NULL != c, "Bad unit_class %d.", p->id);
3592
3593 names_set(&c->name, NULL, p->name, p->rule_name);
3594 c->min_speed = p->min_speed;
3595 c->hp_loss_pct = p->hp_loss_pct;
3596 c->non_native_def_pct = p->non_native_def_pct;
3597 c->flags = p->flags;
3598
3599 PACKET_STRVEC_EXTRACT(c->helptext, p->helptext);
3600}
3601
3602/************************************************************************/
3605 void handle_ruleset_unit(const struct packet_ruleset_unit *p)
3606{
3607 int i;
3608 struct unit_type *u = utype_by_number(p->id);
3609
3610 fc_assert_ret_msg(NULL != u, "Bad unit_type %d.", p->id);
3611
3612 names_set(&u->name, NULL, p->name, p->rule_name);
3613 sz_strlcpy(u->graphic_str, p->graphic_str);
3614 sz_strlcpy(u->graphic_alt, p->graphic_alt);
3615 sz_strlcpy(u->graphic_alt2, p->graphic_alt2);
3616 sz_strlcpy(u->sound_move, p->sound_move);
3617 sz_strlcpy(u->sound_move_alt, p->sound_move_alt);
3618 sz_strlcpy(u->sound_fight, p->sound_fight);
3619 sz_strlcpy(u->sound_fight_alt, p->sound_fight_alt);
3620
3621 u->uclass = uclass_by_number(p->unit_class_id);
3622 u->build_cost = p->build_cost;
3623 u->pop_cost = p->pop_cost;
3624 u->attack_strength = p->attack_strength;
3625 u->defense_strength = p->defense_strength;
3626 u->move_rate = p->move_rate;
3627 for (i = 0; i < p->build_reqs_count; i++) {
3628 requirement_vector_append(&u->build_reqs, p->build_reqs[i]);
3629 }
3630 u->vision_radius_sq = p->vision_radius_sq;
3631 u->transport_capacity = p->transport_capacity;
3632 u->hp = p->hp;
3633 u->firepower = p->firepower;
3634 u->obsoleted_by = utype_by_number(p->obsoleted_by);
3635 u->converted_to = utype_by_number(p->converted_to);
3636 u->convert_time = p->convert_time;
3637 u->fuel = p->fuel;
3638 u->flags = p->flags;
3639 u->roles = p->roles;
3640 u->happy_cost = p->happy_cost;
3641 output_type_iterate(o) {
3642 u->upkeep[o] = p->upkeep[o];
3643 } output_type_iterate_end;
3644 u->paratroopers_range = p->paratroopers_range;
3645 u->bombard_rate = p->bombard_rate;
3646 u->city_size = p->city_size;
3647 u->city_slots = p->city_slots;
3648 u->tp_defense = p->tp_defense;
3649 u->cargo = p->cargo;
3650 u->targets = p->targets;
3651 u->embarks = p->embarks;
3652 u->disembarks = p->disembarks;
3653 u->vlayer = p->vlayer;
3654
3655 if (p->veteran_levels == 0) {
3656 u->veteran = NULL;
3657 } else {
3658 u->veteran = veteran_system_new(p->veteran_levels);
3659
3660 for (i = 0; i < p->veteran_levels; i++) {
3661 veteran_system_definition(u->veteran, i, p->veteran_name[i],
3662 p->power_fact[i], p->move_bonus[i],
3663 p->base_raise_chance[i],
3664 p->work_raise_chance[i]);
3665 }
3666 }
3667
3668 PACKET_STRVEC_EXTRACT(u->helptext, p->helptext);
3669
3670 u->adv.worker = p->worker;
3671
3672 tileset_setup_unit_type(tileset, u);
3673}
3674
3675/************************************************************************/
3678 void handle_ruleset_unit_bonus(const struct packet_ruleset_unit_bonus *p)
3679{
3680 struct unit_type *u = utype_by_number(p->unit);
3681 struct combat_bonus *bonus;
3682
3683 fc_assert_ret_msg(NULL != u, "Bad unit_type %d.", p->unit);
3684
3685 bonus = malloc(sizeof(*bonus));
3686
3687 bonus->flag = p->flag;
3688 bonus->type = p->type;
3689 bonus->value = p->value;
3690 bonus->quiet = p->quiet;
3691
3692 combat_bonus_list_append(u->bonuses, bonus);
3693}
3694
3695/************************************************************************/
3698 void handle_ruleset_unit_flag(const struct packet_ruleset_unit_flag *p)
3699{
3700 const char *flagname;
3701 const char *helptxt;
3702
3703 fc_assert_ret_msg(p->id >= UTYF_USER_FLAG_1 && p->id <= UTYF_LAST_USER_FLAG, "Bad user flag %d.", p->id);
3704
3705 if (p->name[0] == '\0') {
3706 flagname = NULL;
3707 } else {
3708 flagname = p->name;
3709 }
3710
3711 if (p->helptxt[0] == '\0') {
3712 helptxt = NULL;
3713 } else {
3714 helptxt = p->helptxt;
3715 }
3716
3717 set_user_unit_type_flag_name(p->id, flagname, helptxt);
3718}
3719
3720/************************************************************************/
3723 void handle_ruleset_unit_class_flag(
3724 const struct packet_ruleset_unit_class_flag *p)
3725{
3726 const char *flagname;
3727 const char *helptxt;
3728
3729 fc_assert_ret_msg(p->id >= UCF_USER_FLAG_1 && p->id <= UCF_LAST_USER_FLAG,
3730 "Bad user flag %d.", p->id);
3731
3732 if (p->name[0] == '\0') {
3733 flagname = NULL;
3734 } else {
3735 flagname = p->name;
3736 }
3737
3738 if (p->helptxt[0] == '\0') {
3739 helptxt = NULL;
3740 } else {
3741 helptxt = p->helptxt;
3742 }
3743
3744 set_user_unit_class_flag_name(p->id, flagname, helptxt);
3745}
3746
3747/************************************************************************/
3755 static int unpack_tech_req(const enum tech_req r_num,
3756 const int reqs_size,
3757 const struct requirement *reqs,
3758 struct advance *a,
3759 int i)
3760{
3761 if (i < reqs_size
3762 && reqs[i].source.kind == VUT_ADVANCE) {
3763 /* Extract the tech req so the old code can reason about it. */
3764
3765 /* This IS a traditional tech req... right? */
3766 fc_assert(reqs[i].present);
3767 fc_assert(reqs[i].range == REQ_RANGE_PLAYER);
3768
3769 /* Put it in the advance structure. */
3770 a->require[r_num] = reqs[i].source.value.advance;
3771
3772 /* Move on in the requirement vector. */
3773 i++;
3774 } else {
3775 /* No tech req. */
3776 a->require[r_num] = advance_by_number(A_NONE);
3777 }
3778
3779 return i;
3780}
3781
3782/************************************************************************/
3785 void handle_ruleset_tech(const struct packet_ruleset_tech *p)
3786{
3787 int i;
3788 struct advance *a = advance_by_number(p->id);
3789
3790 fc_assert_ret_msg(NULL != a, "Bad advance %d.", p->id);
3791
3792 names_set(&a->name, NULL, p->name, p->rule_name);
3793 sz_strlcpy(a->graphic_str, p->graphic_str);
3794 sz_strlcpy(a->graphic_alt, p->graphic_alt);
3795
3796 i = 0;
3797
3798 fc_assert(game.control.num_tech_classes == 0 || p->tclass < game.control.num_tech_classes);
3799 if (p->tclass >= 0) {
3800 a->tclass = tech_class_by_number(p->tclass);
3801 } else {
3802 a->tclass = NULL;
3803 }
3804
3805 /* The tech requirements req1 and req2 are send inside research_reqs
3806 * since they too are required to be fulfilled before the tech can be
3807 * researched. */
3808
3809 if (p->removed) {
3810 /* The Freeciv data structures currently records that a tech is removed
3811 * by setting req1 and req2 to "Never". */
3812 a->require[AR_ONE] = A_NEVER;
3813 a->require[AR_TWO] = A_NEVER;
3814 } else {
3815 /* Unpack req1 and req2 from the research_reqs requirement vector. */
3816 i = unpack_tech_req(AR_ONE, p->research_reqs_count, p->research_reqs, a, i);
3817 i = unpack_tech_req(AR_TWO, p->research_reqs_count, p->research_reqs, a, i);
3818 }
3819
3820 /* Any remaining requirements are a part of the research_reqs requirement
3821 * vector. */
3822 for (; i < p->research_reqs_count; i++) {
3823 requirement_vector_append(&a->research_reqs, p->research_reqs[i]);
3824 }
3825
3826 /* The packet's research_reqs should contain req1, req2 and the
3827 * requirements of the tech's research_reqs. */
3828 fc_assert((a->research_reqs.size
3829 + ((a->require[AR_ONE]
3830 && (advance_number(a->require[AR_ONE]) != A_NONE)) ?
3831 1 : 0)
3832 + ((a->require[AR_TWO]
3833 && (advance_number(a->require[AR_TWO]) != A_NONE)) ?
3834 1 : 0))
3835 == p->research_reqs_count);
3836
3837 a->require[AR_ROOT] = advance_by_number(p->root_req);
3838
3839 a->flags = p->flags;
3840 a->cost = p->cost;
3841 a->num_reqs = p->num_reqs;
3842 PACKET_STRVEC_EXTRACT(a->helptext, p->helptext);
3843
3844 tileset_setup_tech_type(tileset, a);
3845}
3846
3847/************************************************************************/
3850 void handle_ruleset_tech_class(const struct packet_ruleset_tech_class *p)
3851{
3852 struct tech_class *ptclass = tech_class_by_number(p->id);
3853
3854 fc_assert_ret_msg(NULL != ptclass, "Bad tech_class %d.", p->id);
3855
3856 names_set(&ptclass->name, NULL, p->name, p->rule_name);
3857 ptclass->cost_pct = p->cost_pct;
3858}
3859
3860/************************************************************************/
3863 void handle_ruleset_tech_flag(const struct packet_ruleset_tech_flag *p)
3864{
3865 const char *flagname;
3866 const char *helptxt;
3867
3868 fc_assert_ret_msg(p->id >= TECH_USER_1 && p->id <= TECH_USER_LAST, "Bad user flag %d.", p->id);
3869
3870 if (p->name[0] == '\0') {
3871 flagname = NULL;
3872 } else {
3873 flagname = p->name;
3874 }
3875
3876 if (p->helptxt[0] == '\0') {
3877 helptxt = NULL;
3878 } else {
3879 helptxt = p->helptxt;
3880 }
3881
3882 set_user_tech_flag_name(p->id, flagname, helptxt);
3883}
3884
3885/************************************************************************/
3888 void handle_ruleset_building(const struct packet_ruleset_building *p)
3889{
3890 int i;
3891 struct impr_type *b = improvement_by_number(p->id);
3892
3893 fc_assert_ret_msg(NULL != b, "Bad improvement %d.", p->id);
3894
3895 b->genus = p->genus;
3896 names_set(&b->name, NULL, p->name, p->rule_name);
3897 sz_strlcpy(b->graphic_str, p->graphic_str);
3898 sz_strlcpy(b->graphic_alt, p->graphic_alt);
3899 sz_strlcpy(b->graphic_alt2, p->graphic_alt2);
3900 for (i = 0; i < p->reqs_count; i++) {
3901 requirement_vector_append(&b->reqs, p->reqs[i]);
3902 }
3903 fc_assert(b->reqs.size == p->reqs_count);
3904 for (i = 0; i < p->obs_count; i++) {
3905 requirement_vector_append(&b->obsolete_by, p->obs_reqs[i]);
3906 }
3907 fc_assert(b->obsolete_by.size == p->obs_count);
3908 b->build_cost = p->build_cost;
3909 b->upkeep = p->upkeep;
3910 b->sabotage = p->sabotage;
3911 b->flags = p->flags;
3912 PACKET_STRVEC_EXTRACT(b->helptext, p->helptext);
3913 sz_strlcpy(b->soundtag, p->soundtag);
3914 sz_strlcpy(b->soundtag_alt, p->soundtag_alt);
3915 sz_strlcpy(b->soundtag_alt2, p->soundtag_alt2);
3916
3917#ifdef FREECIV_DEBUG
3918 if (p->id == improvement_count() - 1) {
3919 improvement_iterate(bdbg) {
3920 log_debug("Improvement: %s...", improvement_rule_name(bdbg));
3921 log_debug(" build_cost %3d", bdbg->build_cost);
3922 log_debug(" upkeep %2d", bdbg->upkeep);
3923 log_debug(" sabotage %3d", bdbg->sabotage);
3924 if (NULL != bdbg->helptext) {
3925 strvec_iterate(bdbg->helptext, text) {
3926 log_debug(" helptext %s", text);
3927 } strvec_iterate_end;
3928 }
3929 } improvement_iterate_end;
3930 }
3931#endif /* FREECIV_DEBUG */
3932
3933 tileset_setup_impr_type(tileset, b);
3934}
3935
3936/************************************************************************/
3939 void handle_ruleset_impr_flag(const struct packet_ruleset_impr_flag *p)
3940{
3941 const char *flagname;
3942 const char *helptxt;
3943
3944 fc_assert_ret_msg(p->id >= IF_USER_FLAG_1 && p->id <= IF_LAST_USER_FLAG,
3945 "Bad user flag %d.", p->id);
3946
3947 if (p->name[0] == '\0') {
3948 flagname = NULL;
3949 } else {
3950 flagname = p->name;
3951 }
3952
3953 if (p->helptxt[0] == '\0') {
3954 helptxt = NULL;
3955 } else {
3956 helptxt = p->helptxt;
3957 }
3958
3959 set_user_impr_flag_name(p->id, flagname, helptxt);
3960}
3961
3962/************************************************************************/
3965 void handle_ruleset_multiplier(const struct packet_ruleset_multiplier *p)
3966{
3967 struct multiplier *pmul = multiplier_by_number(p->id);
3968 int j;
3969
3970 fc_assert_ret_msg(NULL != pmul, "Bad multiplier %d.", p->id);
3971
3972 pmul->start = p->start;
3973 pmul->stop = p->stop;
3974 pmul->step = p->step;
3975 pmul->def = p->def;
3976 pmul->offset = p->offset;
3977 pmul->factor = p->factor;
3978 pmul->minimum_turns = p->minimum_turns;
3979
3980 names_set(&pmul->name, NULL, p->name, p->rule_name);
3981
3982 for (j = 0; j < p->reqs_count; j++) {
3983 requirement_vector_append(&pmul->reqs, p->reqs[j]);
3984 }
3985 fc_assert(pmul->reqs.size == p->reqs_count);
3986
3987 PACKET_STRVEC_EXTRACT(pmul->helptext, p->helptext);
3988}
3989
3990/************************************************************************/
3993 void handle_ruleset_government(const struct packet_ruleset_government *p)
3994{
3995 int j;
3996 struct government *gov = government_by_number(p->id);
3997
3998 fc_assert_ret_msg(NULL != gov, "Bad government %d.", p->id);
3999
4000 gov->item_number = p->id;
4001
4002 for (j = 0; j < p->reqs_count; j++) {
4003 requirement_vector_append(&gov->reqs, p->reqs[j]);
4004 }
4005 fc_assert(gov->reqs.size == p->reqs_count);
4006
4007 names_set(&gov->name, NULL, p->name, p->rule_name);
4008 sz_strlcpy(gov->graphic_str, p->graphic_str);
4009 sz_strlcpy(gov->graphic_alt, p->graphic_alt);
4010
4011 PACKET_STRVEC_EXTRACT(gov->helptext, p->helptext);
4012
4013 tileset_setup_government(tileset, gov);
4014}
4015
4016/************************************************************************/
4019 void handle_ruleset_government_ruler_title
4020 (const struct packet_ruleset_government_ruler_title *packet)
4021{
4022 struct government *gov = government_by_number(packet->gov);
4023
4024 fc_assert_ret_msg(NULL != gov, "Bad government %d.", packet->gov);
4025
4026 (void) government_ruler_title_new(gov, nation_by_number(packet->nation),
4027 packet->male_title,
4028 packet->female_title);
4029}
4030
4031/************************************************************************/
4034 void handle_ruleset_terrain(const struct packet_ruleset_terrain *p)
4035{
4036 int j;
4037 struct terrain *pterrain = terrain_by_number(p->id);
4038
4039 fc_assert_ret_msg(NULL != pterrain, "Bad terrain %d.", p->id);
4040
4041 pterrain->tclass = p->tclass;
4042 pterrain->native_to = p->native_to;
4043 names_set(&pterrain->name, NULL, p->name, p->rule_name);
4044 sz_strlcpy(pterrain->graphic_str, p->graphic_str);
4045 sz_strlcpy(pterrain->graphic_alt, p->graphic_alt);
4046 sz_strlcpy(pterrain->graphic_alt2, p->graphic_alt2);
4047 pterrain->movement_cost = p->movement_cost;
4048 pterrain->defense_bonus = p->defense_bonus;
4049
4050 output_type_iterate(o) {
4051 pterrain->output[o] = p->output[o];
4052 } output_type_iterate_end;
4053
4054 if (pterrain->resources != NULL) {
4055 free(pterrain->resources);
4056 }
4057 pterrain->resources = fc_calloc(p->num_resources + 1,
4058 sizeof(*pterrain->resources));
4059 if (pterrain->resource_freq != NULL) {
4060 free(pterrain->resource_freq);
4061 }
4062 pterrain->resource_freq = fc_calloc(p->num_resources + 1,
4063 sizeof(*pterrain->resource_freq));
4064 for (j = 0; j < p->num_resources; j++) {
4065 pterrain->resources[j] = extra_by_number(p->resources[j]);
4066 if (!pterrain->resources[j]) {
4067 log_error("handle_ruleset_terrain() "
4068 "Mismatched resource %d for terrain \"%s\".",
4069 p->resources[j], terrain_rule_name(pterrain));
4070 }
4071 pterrain->resource_freq[j] = p->resource_freq[j];
4072 }
4073 pterrain->resources[p->num_resources] = NULL;
4074 pterrain->resource_freq[p->num_resources] = 0;
4075
4076 output_type_iterate(o) {
4077 pterrain->road_output_incr_pct[o] = p->road_output_incr_pct[o];
4078 } output_type_iterate_end;
4079
4080 pterrain->base_time = p->base_time;
4081 pterrain->road_time = p->road_time;
4082 pterrain->cultivate_result = terrain_by_number(p->cultivate_result);
4083 pterrain->cultivate_time = p->cultivate_time;
4084 pterrain->plant_result = terrain_by_number(p->plant_result);
4085 pterrain->plant_time = p->plant_time;
4086 pterrain->irrigation_food_incr = p->irrigation_food_incr;
4087 pterrain->irrigation_time = p->irrigation_time;
4088 pterrain->mining_shield_incr = p->mining_shield_incr;
4089 pterrain->mining_time = p->mining_time;
4090 if (p->animal < 0) {
4091 pterrain->animal = NULL;
4092 } else {
4093 pterrain->animal = utype_by_number(p->animal);
4094 }
4095 pterrain->transform_result = terrain_by_number(p->transform_result);
4096 pterrain->transform_time = p->transform_time;
4097 pterrain->placing_time = p->placing_time;
4098 pterrain->pillage_time = p->pillage_time;
4099
4100 for (j = 0; j < p->extra_count; j++) {
4101 pterrain->extra_removal_times[j] = p->extra_removal_times[j];
4102 }
4103
4104 pterrain->flags = p->flags;
4105
4106 fc_assert_ret(pterrain->rgb == NULL);
4107 pterrain->rgb = rgbcolor_new(p->color_red, p->color_green, p->color_blue);
4108
4109 PACKET_STRVEC_EXTRACT(pterrain->helptext, p->helptext);
4110
4111 tileset_setup_tile_type(tileset, pterrain);
4112}
4113
4114/************************************************************************/
4117 void handle_ruleset_terrain_flag(const struct packet_ruleset_terrain_flag *p)
4118{
4119 const char *flagname;
4120 const char *helptxt;
4121
4122 fc_assert_ret_msg(p->id >= TER_USER_1 && p->id <= TER_USER_LAST, "Bad user flag %d.", p->id);
4123
4124 if (p->name[0] == '\0') {
4125 flagname = NULL;
4126 } else {
4127 flagname = p->name;
4128 }
4129
4130 if (p->helptxt[0] == '\0') {
4131 helptxt = NULL;
4132 } else {
4133 helptxt = p->helptxt;
4134 }
4135
4136 set_user_terrain_flag_name(p->id, flagname, helptxt);
4137}
4138
4139/************************************************************************/
4142 void handle_ruleset_resource(const struct packet_ruleset_resource *p)
4143{
4144 struct resource_type *presource;
4145
4146 if (p->id < 0 || p->id > MAX_EXTRA_TYPES) {
4147 log_error("Bad resource %d.", p->id);
4148 return;
4149 }
4150
4151 presource = resource_type_init(extra_by_number(p->id));
4152
4153 output_type_iterate(o) {
4154 presource->output[o] = p->output[o];
4155 } output_type_iterate_end;
4156}
4157
4158/************************************************************************/
4161 void handle_ruleset_extra(const struct packet_ruleset_extra *p)
4162{
4163 struct extra_type *pextra = extra_by_number(p->id);
4164 int i;
4165 bool cbase;
4166 bool croad;
4167 bool cres;
4168
4169 fc_assert_ret_msg(NULL != pextra, "Bad extra %d.", p->id);
4170
4171 names_set(&pextra->name, NULL, p->name, p->rule_name);
4172
4173 pextra->category = p->category;
4174
4175 pextra->causes = 0;
4176 for (i = 0; i < EC_COUNT; i++) {
4177 if (BV_ISSET(p->causes, i)) {
4178 pextra->causes |= (1 << i);
4179 }
4180 }
4181
4182 pextra->rmcauses = 0;
4183 for (i = 0; i < ERM_COUNT; i++) {
4184 if (BV_ISSET(p->rmcauses, i)) {
4185 pextra->rmcauses |= (1 << i);
4186 }
4187 }
4188
4189 if (pextra->causes == 0) {
4190 extra_to_caused_by_list(pextra, EC_NONE);
4191 } else {
4192 for (i = 0; i < EC_COUNT; i++) {
4193 if (is_extra_caused_by(pextra, i)) {
4194 extra_to_caused_by_list(pextra, i);
4195 }
4196 }
4197 }
4198
4199 cbase = is_extra_caused_by(pextra, EC_BASE);
4200 croad = is_extra_caused_by(pextra, EC_ROAD);
4201 cres = is_extra_caused_by(pextra, EC_RESOURCE);
4202 if (cbase) {
4203 /* Index is one less than size of list when this base is already added. */
4204 base_type_init(pextra, extra_type_list_size(extra_type_list_by_cause(EC_BASE)) - 1);
4205 }
4206 if (croad) {
4207 /* Index is one less than size of list when this road is already added. */
4208 road_type_init(pextra, extra_type_list_size(extra_type_list_by_cause(EC_ROAD)) - 1);
4209 }
4210 if (!cbase && !croad && !cres) {
4211 pextra->data.special_idx = extra_type_list_size(extra_type_list_by_cause(EC_SPECIAL));
4212 extra_to_caused_by_list(pextra, EC_SPECIAL);
4213 }
4214
4215 for (i = 0; i < ERM_COUNT; i++) {
4216 if (is_extra_removed_by(pextra, i)) {
4217 extra_to_removed_by_list(pextra, i);
4218 }
4219 }
4220
4221 sz_strlcpy(pextra->activity_gfx, p->activity_gfx);
4222 sz_strlcpy(pextra->act_gfx_alt, p->act_gfx_alt);
4223 sz_strlcpy(pextra->act_gfx_alt2, p->act_gfx_alt2);
4224 sz_strlcpy(pextra->rmact_gfx, p->rmact_gfx);
4225 sz_strlcpy(pextra->rmact_gfx_alt, p->rmact_gfx_alt);
4226 sz_strlcpy(pextra->rmact_gfx_alt2, p->rmact_gfx_alt2);
4227 sz_strlcpy(pextra->graphic_str, p->graphic_str);
4228 sz_strlcpy(pextra->graphic_alt, p->graphic_alt);
4229
4230 for (i = 0; i < p->reqs_count; i++) {
4231 requirement_vector_append(&pextra->reqs, p->reqs[i]);
4232 }
4233 fc_assert(pextra->reqs.size == p->reqs_count);
4234
4235 for (i = 0; i < p->rmreqs_count; i++) {
4236 requirement_vector_append(&pextra->rmreqs, p->rmreqs[i]);
4237 }
4238 fc_assert(pextra->rmreqs.size == p->rmreqs_count);
4239
4240 pextra->appearance_chance = p->appearance_chance;
4241 for (i = 0; i < p->appearance_reqs_count; i++) {
4242 requirement_vector_append(&pextra->appearance_reqs, p->appearance_reqs[i]);
4243 }
4244 fc_assert(pextra->appearance_reqs.size == p->appearance_reqs_count);
4245
4246 pextra->disappearance_chance = p->disappearance_chance;
4247 for (i = 0; i < p->disappearance_reqs_count; i++) {
4248 requirement_vector_append(&pextra->disappearance_reqs, p->disappearance_reqs[i]);
4249 }
4250 fc_assert(pextra->disappearance_reqs.size == p->disappearance_reqs_count);
4251
4252 pextra->visibility_req = p->visibility_req;
4253 pextra->buildable = p->buildable;
4254 pextra->generated = p->generated;
4255 pextra->build_time = p->build_time;
4256 pextra->build_time_factor = p->build_time_factor;
4257 pextra->removal_time = p->removal_time;
4258 pextra->removal_time_factor = p->removal_time_factor;
4259 pextra->infracost = p->infracost;
4260 pextra->defense_bonus = p->defense_bonus;
4261
4262 if (pextra->defense_bonus != 0) {
4263 if (extra_has_flag(pextra, EF_NATURAL_DEFENSE)) {
4264 extra_to_caused_by_list(pextra, EC_NATURAL_DEFENSIVE);
4265 } else {
4266 extra_to_caused_by_list(pextra, EC_DEFENSIVE);
4267 }
4268 }
4269
4270 pextra->no_aggr_near_city = p->no_aggr_near_city;
4271
4272 pextra->eus = p->eus;
4273 if (pextra->eus == EUS_HIDDEN) {
4274 extra_type_list_append(extra_type_list_of_unit_hiders(), pextra);
4275 }
4276
4277 pextra->native_to = p->native_to;
4278
4279 pextra->flags = p->flags;
4280 if (pextra->no_aggr_near_city >= 0) {
4281 extra_to_caused_by_list(pextra, EC_NOT_AGGRESSIVE);
4282 }
4283 if (extra_has_flag(pextra, EF_CAUSE_ZOC)) {
4284 extra_type_list_append(extra_type_list_of_zoccers(), pextra);
4285 }
4286
4287 pextra->hidden_by = p->hidden_by;
4288 pextra->bridged_over = p->bridged_over;
4289 pextra->conflicts = p->conflicts;
4290
4291 PACKET_STRVEC_EXTRACT(pextra->helptext, p->helptext);
4292
4293 tileset_setup_extra(tileset, pextra);
4294}
4295
4296/************************************************************************/
4299 void handle_ruleset_extra_flag(const struct packet_ruleset_extra_flag *p)
4300{
4301 const char *flagname;
4302 const char *helptxt;
4303
4304 fc_assert_ret_msg(p->id >= EF_USER_FLAG_1 && p->id <= EF_LAST_USER_FLAG,
4305 "Bad user flag %d.", p->id);
4306
4307 if (p->name[0] == '\0') {
4308 flagname = NULL;
4309 } else {
4310 flagname = p->name;
4311 }
4312
4313 if (p->helptxt[0] == '\0') {
4314 helptxt = NULL;
4315 } else {
4316 helptxt = p->helptxt;
4317 }
4318
4319 set_user_extra_flag_name(p->id, flagname, helptxt);
4320}
4321
4322/************************************************************************/
4325 void handle_ruleset_base(const struct packet_ruleset_base *p)
4326{
4327 struct base_type *pbase = base_by_number(p->id);
4328
4329 fc_assert_ret_msg(NULL != pbase, "Bad base %d.", p->id);
4330
4331 pbase->gui_type = p->gui_type;
4332 pbase->border_sq = p->border_sq;
4333 pbase->vision_main_sq = p->vision_main_sq;
4334 pbase->vision_invis_sq = p->vision_invis_sq;
4335 pbase->vision_subs_sq = p->vision_subs_sq;
4336
4337 if (territory_claiming_base(pbase)) {
4338 extra_type_list_append(extra_type_list_of_terr_claimers(),
4339 base_extra_get(pbase));
4340 }
4341}
4342
4343/************************************************************************/
4346 void handle_ruleset_road(const struct packet_ruleset_road *p)
4347{
4348 int i;
4349 struct road_type *proad = road_by_number(p->id);
4350
4351 fc_assert_ret_msg(NULL != proad, "Bad road %d.", p->id);
4352
4353 proad->gui_type = p->gui_type;
4354
4355 for (i = 0; i < p->first_reqs_count; i++) {
4356 requirement_vector_append(&proad->first_reqs, p->first_reqs[i]);
4357 }
4358 fc_assert(proad->first_reqs.size == p->first_reqs_count);
4359
4360 proad->move_cost = p->move_cost;
4361 proad->move_mode = p->move_mode;
4362
4363 output_type_iterate(o) {
4364 proad->tile_incr_const[o] = p->tile_incr_const[o];
4365 proad->tile_incr[o] = p->tile_incr[o];
4366 proad->tile_bonus[o] = p->tile_bonus[o];
4367 } output_type_iterate_end;
4368
4369 proad->compat = p->compat;
4370 proad->integrates = p->integrates;
4371 proad->flags = p->flags;
4372}
4373
4374/************************************************************************/
4377 void handle_ruleset_goods(const struct packet_ruleset_goods *p)
4378{
4379 struct goods_type *pgood = goods_by_number(p->id);
4380 int i;
4381
4382 fc_assert_ret_msg(NULL != pgood, "Bad goods %d.", p->id);
4383
4384 names_set(&pgood->name, NULL, p->name, p->rule_name);
4385
4386 for (i = 0; i < p->reqs_count; i++) {
4387 requirement_vector_append(&pgood->reqs, p->reqs[i]);
4388 }
4389 fc_assert(pgood->reqs.size == p->reqs_count);
4390
4391 pgood->from_pct = p->from_pct;
4392 pgood->to_pct = p->to_pct;
4393 pgood->onetime_pct = p->onetime_pct;
4394 pgood->flags = p->flags;
4395
4396 PACKET_STRVEC_EXTRACT(pgood->helptext, p->helptext);
4397}
4398
4399/************************************************************************/
4402 void handle_ruleset_action(const struct packet_ruleset_action *p)
4403{
4404 struct action *act;
4405
4406 if (!action_id_exists(p->id)) {
4407 /* Action id out of range */
4408 log_error("handle_ruleset_action() the action id %d is out of range.",
4409 p->id);
4410
4411 return;
4412 }
4413
4414 act = action_by_number(p->id);
4415
4416 sz_strlcpy(act->ui_name, p->ui_name);
4417 act->quiet = p->quiet;
4418
4419 act->result = p->result;
4420 act->sub_results = p->sub_results;
4421 act->actor_consuming_always = p->actor_consuming_always;
4422
4423 act->actor_kind = p->act_kind;
4424 act->target_kind = p->tgt_kind;
4425 act->sub_target_kind = p->sub_tgt_kind;
4426
4427 act->min_distance = p->min_distance;
4428 act->max_distance = p->max_distance;
4429 act->blocked_by = p->blocked_by;
4430}
4431
4432/************************************************************************/
4435void
4436handle_ruleset_action_enabler(const struct packet_ruleset_action_enabler *p)
4437{
4438 struct action_enabler *enabler;
4439 int i;
4440
4441 if (!action_id_exists(p->enabled_action)) {
4442 /* Non existing action */
4443 log_error("handle_ruleset_action_enabler() the action %d "
4444 "doesn't exist.",
4445 p->enabled_action);
4446
4447 return;
4448 }
4449
4450 enabler = action_enabler_new();
4451
4452 enabler->action = p->enabled_action;
4453
4454 for (i = 0; i < p->actor_reqs_count; i++) {
4455 requirement_vector_append(&enabler->actor_reqs, p->actor_reqs[i]);
4456 }
4457 fc_assert(enabler->actor_reqs.size == p->actor_reqs_count);
4458
4459 for (i = 0; i < p->target_reqs_count; i++) {
4460 requirement_vector_append(&enabler->target_reqs, p->target_reqs[i]);
4461 }
4462 fc_assert(enabler->target_reqs.size == p->target_reqs_count);
4463
4464 action_enabler_add(enabler);
4465}
4466
4467/************************************************************************/
4470 void handle_ruleset_action_auto(const struct packet_ruleset_action_auto *p)
4471{
4472 struct action_auto_perf *auto_perf;
4473 int i;
4474
4475 auto_perf = action_auto_perf_slot_number(p->id);
4476
4477 auto_perf->cause = p->cause;
4478
4479 for (i = 0; i < p->reqs_count; i++) {
4480 requirement_vector_append(&auto_perf->reqs, p->reqs[i]);
4481 }
4482 fc_assert(auto_perf->reqs.size == p->reqs_count);
4483
4484 for (i = 0; i < p->alternatives_count; i++) {
4485 auto_perf->alternatives[i] = p->alternatives[i];
4486 }
4487}
4488
4489/************************************************************************/
4492 void handle_ruleset_disaster(const struct packet_ruleset_disaster *p)
4493{
4494 struct disaster_type *pdis = disaster_by_number(p->id);
4495 int i;
4496
4497 fc_assert_ret_msg(NULL != pdis, "Bad disaster %d.", p->id);
4498
4499 names_set(&pdis->name, NULL, p->name, p->rule_name);
4500
4501 for (i = 0; i < p->reqs_count; i++) {
4502 requirement_vector_append(&pdis->reqs, p->reqs[i]);
4503 }
4504 fc_assert(pdis->reqs.size == p->reqs_count);
4505
4506 pdis->frequency = p->frequency;
4507
4508 pdis->effects = p->effects;
4509}
4510
4511/************************************************************************/
4514 void handle_ruleset_achievement(const struct packet_ruleset_achievement *p)
4515{
4516 struct achievement *pach = achievement_by_number(p->id);
4517
4518 fc_assert_ret_msg(NULL != pach, "Bad achievement %d.", p->id);
4519
4520 names_set(&pach->name, NULL, p->name, p->rule_name);
4521
4522 pach->type = p->type;
4523 pach->unique = p->unique;
4524 pach->value = p->value;
4525}
4526
4527/************************************************************************/
4530 void handle_ruleset_trade(const struct packet_ruleset_trade *p)
4531{
4532 struct trade_route_settings *pset = trade_route_settings_by_type(p->id);
4533
4534 if (pset != NULL) {
4535 pset->trade_pct = p->trade_pct;
4536 pset->cancelling = p->cancelling;
4537 pset->bonus_type = p->bonus_type;
4538 }
4539}
4540
4541/************************************************************************/
4544 void handle_ruleset_terrain_control
4545 (const struct packet_ruleset_terrain_control *p)
4546{
4547 /* Since terrain_control is the same as packet_ruleset_terrain_control
4548 * we can just copy the data directly. */
4549 terrain_control = *p;
4550 /* terrain_control.move_fragments likely changed */
4551 init_move_fragments();
4552}
4553
4554/************************************************************************/
4557 void handle_ruleset_nation_sets
4558 (const struct packet_ruleset_nation_sets *packet)
4559{
4560 int i;
4561
4562 for (i = 0; i < packet->nsets; i++) {
4563 struct nation_set *pset =
4564 nation_set_new(packet->names[i], packet->rule_names[i],
4565 packet->descriptions[i]);
4566
4567 if (pset == NULL) {
4568 break;
4569 } else {
4570 fc_assert(i == nation_set_index(pset));
4571 }
4572 }
4573}
4574
4575/************************************************************************/
4578 void handle_ruleset_nation_groups
4579 (const struct packet_ruleset_nation_groups *packet)
4580{
4581 int i;
4582
4583 for (i = 0; i < packet->ngroups; i++) {
4584 struct nation_group *pgroup;
4585
4586 pgroup = nation_group_new(packet->groups[i]);
4587
4588 if (pgroup != NULL) {
4589 fc_assert(i == nation_group_index(pgroup));
4590 pgroup->hidden = packet->hidden[i];
4591 } else {
4592 break;
4593 }
4594 }
4595}
4596
4597/************************************************************************/
4600 void handle_ruleset_nation(const struct packet_ruleset_nation *packet)
4601{
4602 struct nation_type *pnation = nation_by_number(packet->id);
4603 int i;
4604
4605 fc_assert_ret_msg(NULL != pnation, "Bad nation %d.", packet->id);
4606
4607 if (packet->translation_domain[0] != '\0') {
4608 size_t len = strlen(packet->translation_domain) + 1;
4609 pnation->translation_domain = fc_malloc(len);
4610 fc_strlcpy(pnation->translation_domain, packet->translation_domain, len);
4611 } else {
4612 pnation->translation_domain = NULL;
4613 }
4614 names_set(&pnation->adjective, pnation->translation_domain,
4615 packet->adjective, packet->rule_name);
4616 name_set(&pnation->noun_plural, pnation->translation_domain, packet->noun_plural);
4617 sz_strlcpy(pnation->flag_graphic_str, packet->graphic_str);
4618 sz_strlcpy(pnation->flag_graphic_alt, packet->graphic_alt);
4619 pnation->style = style_by_number(packet->style);
4620 for (i = 0; i < packet->leader_count; i++) {
4621 (void) nation_leader_new(pnation, packet->leader_name[i],
4622 packet->leader_is_male[i]);
4623 }
4624
4625 /* set later by PACKET_NATION_AVAILABILITY */
4626 pnation->client.is_pickable = FALSE;
4627 pnation->is_playable = packet->is_playable;
4628 pnation->barb_type = packet->barbarian_type;
4629
4630 if ('\0' != packet->legend[0]) {
4631 pnation->legend = fc_strdup(nation_legend_translation(pnation, packet->legend));
4632 } else {
4633 pnation->legend = fc_strdup("");
4634 }
4635
4636 for (i = 0; i < packet->nsets; i++) {
4637 struct nation_set *pset = nation_set_by_number(packet->sets[i]);
4638
4639 if (NULL != pset) {
4640 nation_set_list_append(pnation->sets, pset);
4641 } else {
4642 log_error("handle_ruleset_nation() \"%s\" have unknown set %d.",
4643 nation_rule_name(pnation), packet->sets[i]);
4644 }
4645 }
4646
4647 for (i = 0; i < packet->ngroups; i++) {
4648 struct nation_group *pgroup = nation_group_by_number(packet->groups[i]);
4649
4650 if (NULL != pgroup) {
4651 nation_group_list_append(pnation->groups, pgroup);
4652 } else {
4653 log_error("handle_ruleset_nation() \"%s\" have unknown group %d.",
4654 nation_rule_name(pnation), packet->groups[i]);
4655 }
4656 }
4657
4658 /* init_government may be NULL */
4659 pnation->init_government = government_by_number(packet->init_government_id);
4660 for (i = 0; i < MAX_NUM_TECH_LIST; i++) {
4661 if (i < packet->init_techs_count) {
4662 pnation->init_techs[i] = packet->init_techs[i];
4663 } else {
4664 pnation->init_techs[i] = A_LAST;
4665 }
4666 }
4667 for (i = 0; i < MAX_NUM_UNIT_LIST; i++) {
4668 if (i < packet->init_units_count) {
4669 pnation->init_units[i] = utype_by_number(packet->init_units[i]);
4670 } else {
4671 /* TODO: should init_units be initialized in common/nation.c? */
4672 pnation->init_units[i] = utype_by_number(U_LAST);
4673 }
4674 }
4675 for (i = 0; i < MAX_NUM_BUILDING_LIST; i++) {
4676 if (i < packet->init_buildings_count) {
4677 pnation->init_buildings[i] = packet->init_buildings[i];
4678 } else {
4679 pnation->init_buildings[i] = B_LAST;
4680 }
4681 }
4682
4683 tileset_setup_nation_flag(tileset, pnation);
4684}
4685
4686/************************************************************************/
4690 void handle_nation_availability(int ncount, const bool *is_pickable,
4691 bool nationset_change)
4692{
4693 int i;
4694
4695 fc_assert_action(ncount == nation_count(),
4696 ncount = MIN(ncount, nation_count()));
4697
4698 for (i = 0; i < ncount; i++) {
4699 nation_by_number(i)->client.is_pickable = is_pickable[i];
4700 }
4701
4702 races_update_pickable(nationset_change);
4703}
4704
4705/************************************************************************/
4708 void handle_ruleset_style(const struct packet_ruleset_style *p)
4709{
4710 struct nation_style *pstyle = style_by_number(p->id);
4711
4712 fc_assert_ret_msg(NULL != pstyle, "Bad style %d.", p->id);
4713
4714 names_set(&pstyle->name, NULL, p->name, p->rule_name);
4715}
4716
4717/************************************************************************/
4720 void handle_ruleset_clause(const struct packet_ruleset_clause *p)
4721{
4722 struct clause_info *info = clause_info_get(p->type);
4723 int i;
4724
4725 fc_assert_ret_msg(NULL != info, "Bad clause %d.", p->type);
4726
4727 info->enabled = p->enabled;
4728
4729 for (i = 0; i < p->giver_reqs_count; i++) {
4730 requirement_vector_append(&info->giver_reqs, p->giver_reqs[i]);
4731 }
4732 fc_assert(info->giver_reqs.size == p->giver_reqs_count);
4733
4734 for (i = 0; i < p->receiver_reqs_count; i++) {
4735 requirement_vector_append(&info->receiver_reqs, p->receiver_reqs[i]);
4736 }
4737 fc_assert(info->receiver_reqs.size == p->receiver_reqs_count);
4738
4739 for (i = 0; i < p->either_reqs_count; i++) {
4740 requirement_vector_append(&info->either_reqs, p->either_reqs[i]);
4741 }
4742 fc_assert(info->either_reqs.size == p->either_reqs_count);
4743}
4744
4745/************************************************************************/
4748 void handle_ruleset_city(const struct packet_ruleset_city *packet)
4749{
4750 int id, j;
4751 struct citystyle *cs;
4752
4753 id = packet->style_id;
4754 fc_assert_ret_msg(0 <= id && game.control.num_city_styles > id,
4755 "Bad citystyle %d.", id);
4756 cs = &city_styles[id];
4757
4758 for (j = 0; j < packet->reqs_count; j++) {
4759 requirement_vector_append(&cs->reqs, packet->reqs[j]);
4760 }
4761 fc_assert(cs->reqs.size == packet->reqs_count);
4762
4763 names_set(&cs->name, NULL, packet->name, packet->rule_name);
4764 sz_strlcpy(cs->graphic, packet->graphic);
4765 sz_strlcpy(cs->graphic_alt, packet->graphic_alt);
4766 sz_strlcpy(cs->citizens_graphic, packet->citizens_graphic);
4767
4768 tileset_setup_city_tiles(tileset, id);
4769}
4770
4771/************************************************************************/
4774 void handle_ruleset_music(const struct packet_ruleset_music *packet)
4775{
4776 int id, j;
4777 struct music_style *pmus;
4778
4779 id = packet->id;
4780 fc_assert_ret_msg(0 <= id && game.control.num_music_styles > id,
4781 "Bad music_style %d.", id);
4782
4783 pmus = music_style_by_number(id);
4784
4785 for (j = 0; j < packet->reqs_count; j++) {
4786 requirement_vector_append(&pmus->reqs, packet->reqs[j]);
4787 }
4788 fc_assert(pmus->reqs.size == packet->reqs_count);
4789
4790 sz_strlcpy(pmus->music_peaceful, packet->music_peaceful);
4791 sz_strlcpy(pmus->music_combat, packet->music_combat);
4792}
4793
4794/************************************************************************/
4797 void handle_ruleset_game(const struct packet_ruleset_game *packet)
4798{
4799 int i;
4800
4801 /* Must set num_specialist_types before iterating over them. */
4802 DEFAULT_SPECIALIST = packet->default_specialist;
4803
4804 fc_assert_ret(packet->veteran_levels > 0);
4805
4806 game.veteran = veteran_system_new(packet->veteran_levels);
4807 game.veteran->levels = packet->veteran_levels;
4808
4809 for (i = 0; i < MAX_NUM_TECH_LIST; i++) {
4810 if (i < packet->global_init_techs_count) {
4811 game.rgame.global_init_techs[i] = packet->global_init_techs[i];
4812 } else {
4813 game.rgame.global_init_techs[i] = A_LAST;
4814 }
4815 }
4816 for (i = 0; i < MAX_NUM_BUILDING_LIST; i++) {
4817 if (i < packet->global_init_buildings_count) {
4818 game.rgame.global_init_buildings[i] = packet->global_init_buildings[i];
4819 } else {
4820 game.rgame.global_init_buildings[i] = B_LAST;
4821 }
4822 }
4823
4824 for (i = 0; i < packet->veteran_levels; i++) {
4825 veteran_system_definition(game.veteran, i, packet->veteran_name[i],
4826 packet->power_fact[i], packet->move_bonus[i],
4827 packet->base_raise_chance[i],
4828 packet->work_raise_chance[i]);
4829 }
4830
4831 fc_assert(game.plr_bg_color == NULL);
4832 game.plr_bg_color = rgbcolor_new(packet->background_red,
4833 packet->background_green,
4834 packet->background_blue);
4835
4836 tileset_background_init(tileset);
4837}
4838
4839/************************************************************************/
4842 void handle_ruleset_specialist(const struct packet_ruleset_specialist *p)
4843{
4844 int j;
4845 struct specialist *s = specialist_by_number(p->id);
4846
4847 fc_assert_ret_msg(NULL != s, "Bad specialist %d.", p->id);
4848
4849 names_set(&s->name, NULL, p->plural_name, p->rule_name);
4850 name_set(&s->abbreviation, NULL, p->short_name);
4851
4852 sz_strlcpy(s->graphic_str, p->graphic_str);
4853 sz_strlcpy(s->graphic_alt, p->graphic_alt);
4854
4855 for (j = 0; j < p->reqs_count; j++) {
4856 requirement_vector_append(&s->reqs, p->reqs[j]);
4857 }
4858 fc_assert(s->reqs.size == p->reqs_count);
4859
4860 PACKET_STRVEC_EXTRACT(s->helptext, p->helptext);
4861
4862 tileset_setup_specialist_type_default_set(tileset, p->id);
4863}
4864
4865/************************************************************************/
4868 void handle_city_name_suggestion_info(int unit_id, const char *name)
4869{
4870 struct unit *punit = player_unit_by_number(client_player(), unit_id);
4871
4872 if (!can_client_issue_orders()) {
4873 return;
4874 }
4875
4876 if (punit) {
4877 if (gui_options.ask_city_name) {
4878 bool other_asking = FALSE;
4879
4880 unit_list_iterate(unit_tile(punit)->units, other) {
4881 if (other->client.asking_city_name) {
4882 other_asking = TRUE;
4883 }
4884 } unit_list_iterate_end;
4885 punit->client.asking_city_name = TRUE;
4886
4887 if (!other_asking) {
4888 popup_newcity_dialog(punit, name);
4889 }
4890 } else {
4891 request_do_action(ACTION_FOUND_CITY,
4892 unit_id, tile_index(unit_tile(punit)),
4893 0, name);
4894 }
4895 }
4896}
4897
4898/************************************************************************/
4904 void handle_unit_action_answer(int actor_id, int target_id, int cost,
4905 action_id action_type,
4906 int request_kind)
4907{
4908 struct city *pcity = game_city_by_number(target_id);
4909 struct unit *punit = game_unit_by_number(target_id);
4910 struct unit *pactor = player_unit_by_number(client_player(), actor_id);
4911 struct action *paction = action_by_number(action_type);
4912
4913 if (ACTION_NONE != action_type
4914 && !action_id_exists(action_type)) {
4915 /* Non existing action */
4916 log_error("handle_unit_action_answer() the action %d doesn't exist.",
4917 action_type);
4918
4919 if (request_kind == REQEST_PLAYER_INITIATED) {
4920 action_selection_no_longer_in_progress(actor_id);
4921 action_decision_clear_want(actor_id);
4922 action_selection_next_in_focus(actor_id);
4923 }
4924
4925 return;
4926 }
4927
4928 if (!pactor) {
4929 log_debug("Bad actor %d.", actor_id);
4930
4931 if (request_kind == REQEST_PLAYER_INITIATED) {
4932 action_selection_no_longer_in_progress(actor_id);
4933 action_selection_next_in_focus(actor_id);
4934 }
4935
4936 return;
4937 }
4938
4939 switch ((enum gen_action)action_type) {
4940 case ACTION_SPY_BRIBE_UNIT:
4941 if (punit && client.conn.playing
4942 && is_human(client.conn.playing)) {
4943 if (request_kind == REQEST_PLAYER_INITIATED) {
4944 /* Focus on the unit so the player knows where it is */
4945 unit_focus_set(pactor);
4946
4947 popup_bribe_dialog(pactor, punit, cost, paction);
4948 } else {
4949 /* Not in use (yet). */
4950 log_error("Unimplemented: received background unit bribe cost.");
4951 }
4952 } else {
4953 log_debug("Bad target %d.", target_id);
4954 if (request_kind == REQEST_PLAYER_INITIATED) {
4955 action_selection_no_longer_in_progress(actor_id);
4956 action_decision_clear_want(actor_id);
4957 action_selection_next_in_focus(actor_id);
4958 }
4959 }
4960 break;
4961 case ACTION_SPY_INCITE_CITY:
4962 case ACTION_SPY_INCITE_CITY_ESC:
4963 if (pcity && client.conn.playing
4964 && is_human(client.conn.playing)) {
4965 if (request_kind == REQEST_PLAYER_INITIATED) {
4966 /* Focus on the unit so the player knows where it is */
4967 unit_focus_set(pactor);
4968
4969 popup_incite_dialog(pactor, pcity, cost, paction);
4970 } else {
4971 /* Not in use (yet). */
4972 log_error("Unimplemented: received background city incite cost.");
4973 }
4974 } else {
4975 log_debug("Bad target %d.", target_id);
4976 if (request_kind == REQEST_PLAYER_INITIATED) {
4977 action_selection_no_longer_in_progress(actor_id);
4978 action_decision_clear_want(actor_id);
4979 action_selection_next_in_focus(actor_id);
4980 }
4981 }
4982 break;
4983 case ACTION_UPGRADE_UNIT:
4984 if (pcity && client.conn.playing
4985 && is_human(client.conn.playing)) {
4986 /* TODO: The bundled clients will have to start showing the upgrade
4987 * price sent from the server before it can be allowed to rely on
4988 * things the player can't see. (Example: it becomes legal to upgrade
4989 * a unit in a foreign city.) */
4990
4991 /* Getting unit upgrade cost from the server is currently only used by
4992 * Freeciv-web. */
4993 log_error("Received upgrade unit price but can't forward it.");
4994 }
4995 break;
4996 case ACTION_NONE:
4997 log_debug("Server didn't respond to query.");
4998 if (request_kind == REQEST_PLAYER_INITIATED) {
4999 action_selection_no_longer_in_progress(actor_id);
5000 action_decision_clear_want(actor_id);
5001 action_selection_next_in_focus(actor_id);
5002 }
5003 break;
5004 default:
5005 log_error("handle_unit_action_answer() invalid action_type (%d).",
5006 action_type);
5007 if (request_kind == REQEST_PLAYER_INITIATED) {
5008 action_selection_no_longer_in_progress(actor_id);
5009 action_decision_clear_want(actor_id);
5010 action_selection_next_in_focus(actor_id);
5011 }
5012 break;
5013 };
5014}
5015
5016/************************************************************************/
5020 static action_id auto_attack_act(const struct act_prob *act_probs)
5021{
5022 action_id attack_action = ACTION_NONE;
5023
5024 action_array_iterate(auto_attack_actions, act_id) {
5025 if (action_prob_possible(act_probs[act_id])) {
5026 /* An attack. */
5027 if (attack_action == ACTION_NONE) {
5028 /* No previous attack action found. */
5029 attack_action = act_id;
5030 } else {
5031 /* More than one legal attack action found. */
5032 return ACTION_NONE;
5033 }
5034 }
5035 } action_array_iterate_end;
5036 action_array_iterate(auto_attack_blockers, act_id) {
5037 if (action_prob_possible(act_probs[act_id])) {
5038 /* An interesting non attack action has been found. */
5039 return ACTION_NONE;
5040 }
5041 } action_array_iterate_end;
5042
5043 return attack_action;
5044}
5045
5046/**********************************************************************/
5050 static void action_decision_maybe_auto(struct unit *actor_unit,
5051 const struct act_prob *act_probs,
5052 struct unit *target_unit,
5053 struct city *target_city,
5054 struct tile *target_tile)
5055{
5056 action_id auto_action;
5057
5058 fc_assert_ret(actor_unit != NULL);
5059
5060 auto_action = auto_attack_act(act_probs);
5061
5062 if (auto_action != ACTION_NONE) {
5063 /* No interesting actions except a single attack action has been
5064 * found. The player wants it performed without questions. */
5065
5066 /* The order requests below doesn't send additional details. */
5067 fc_assert(!action_id_requires_details(auto_action));
5068
5069 /* Give the order. */
5070 switch (action_id_get_target_kind(auto_action)) {
5071 case ATK_TILE:
5072 case ATK_UNITS:
5073 case ATK_EXTRAS:
5074 if (target_tile != NULL) {
5075 request_do_action(auto_action,
5076 actor_unit->id, tile_index(target_tile),
5077 0, "");
5078 }
5079 break;
5080 case ATK_CITY:
5081 if (target_city != NULL) {
5082 request_do_action(auto_action,
5083 actor_unit->id, target_city->id,
5084 0, "");
5085 }
5086 break;
5087 case ATK_UNIT:
5088 if (target_unit != NULL) {
5089 request_do_action(auto_action,
5090 actor_unit->id, target_unit->id,
5091 0, "");
5092 }
5093 break;
5094 case ATK_SELF:
5095 request_do_action(auto_action,
5096 actor_unit->id, actor_unit->id,
5097 0, "");
5098 break;
5099 case ATK_COUNT:
5100 fc_assert(action_id_get_target_kind(auto_action) != ATK_COUNT);
5101 break;
5102 }
5103
5104 /* Clean up. */
5105 action_decision_clear_want(actor_unit->id);
5106 } else {
5107 /* This should be done in the foreground */
5108 action_decision_request(actor_unit);
5109 }
5110}
5111
5112/************************************************************************/
5118 void handle_unit_actions(const struct packet_unit_actions *packet)
5119{
5120 struct unit *actor_unit = game_unit_by_number(packet->actor_unit_id);
5121
5122 struct tile *target_tile = index_to_tile(&(wld.map), packet->target_tile_id);
5123 struct extra_type *target_extra = packet->target_extra_id == EXTRA_NONE ?
5124 NULL : extra_by_number(packet->target_extra_id);
5125 struct city *target_city = game_city_by_number(packet->target_city_id);
5126 struct unit *target_unit = game_unit_by_number(packet->target_unit_id);
5127
5128 const struct act_prob *act_probs = packet->action_probabilities;
5129
5130 int request_kind = packet->request_kind;
5131 bool valid = FALSE;
5132
5133 /* The dead can't act */
5134 if (actor_unit && (target_tile || target_city || target_unit)) {
5135 /* At least one action must be possible */
5136 action_iterate(act) {
5137 if (action_prob_possible(act_probs[act])) {
5138 valid = TRUE;
5139 break;
5140 }
5141 } action_iterate_end;
5142 }
5143
5144 switch (request_kind) {
5145 case REQEST_PLAYER_INITIATED:
5146 if (valid) {
5147 /* The player can select an action and should be informed. */
5148
5149 /* Show the client specific action dialog */
5150 popup_action_selection(actor_unit,
5151 target_city, target_unit,
5152 target_tile, target_extra,
5153 act_probs);
5154 } else {
5155 /* Nothing to do. */
5156 action_selection_no_longer_in_progress(packet->actor_unit_id);
5157 action_decision_clear_want(packet->actor_unit_id);
5158 action_selection_next_in_focus(packet->actor_unit_id);
5159 }
5160 break;
5161 case REQEST_BACKGROUND_REFRESH:
5162 /* This was a background action selection dialog refresh. */
5163
5164 if (actor_unit != NULL
5165 && action_selection_actor_unit() == actor_unit->id) {
5166 /* The situation may have changed. */
5167 action_selection_refresh(actor_unit,
5168 target_city, target_unit,
5169 target_tile, target_extra,
5170 act_probs);
5171 }
5172 break;
5173 case REQEST_BACKGROUND_FAST_AUTO_ATTACK:
5174 if (actor_unit != NULL) {
5175 action_decision_maybe_auto(actor_unit, act_probs,
5176 target_unit, target_city, target_tile);
5177 }
5178 break;
5179 default:
5180 log_warn("Unknown request_kind %d in reply", request_kind);
5181 break;
5182 }
5183}
5184
5185/************************************************************************/
5188 void handle_city_sabotage_list(int actor_id, int city_id,
5189 bv_imprs improvements,
5190 action_id act_id,
5191 int request_kind)
5192{
5193 struct city *pcity = game_city_by_number(city_id);
5194 struct unit *pactor = player_unit_by_number(client_player(), actor_id);
5195 struct action *paction = action_by_number(act_id);
5196
5197 if (!pactor) {
5198 log_debug("Bad diplomat %d.", actor_id);
5199
5200 if (request_kind == REQEST_PLAYER_INITIATED) {
5201 action_selection_no_longer_in_progress(actor_id);
5202 action_selection_next_in_focus(actor_id);
5203 }
5204
5205 return;
5206 }
5207
5208 if (!pcity) {
5209 log_debug("Bad city %d.", city_id);
5210
5211 if (request_kind == REQEST_PLAYER_INITIATED) {
5212 action_selection_no_longer_in_progress(actor_id);
5213 action_decision_clear_want(actor_id);
5214 action_selection_next_in_focus(actor_id);
5215 }
5216
5217 return;
5218 }
5219
5220 if (can_client_issue_orders()) {
5221 improvement_iterate(pimprove) {
5222 update_improvement_from_packet(pcity, pimprove,
5223 BV_ISSET(improvements,
5224 improvement_index(pimprove)));
5225 } improvement_iterate_end;
5226
5227 if (request_kind == REQEST_PLAYER_INITIATED) {
5228 /* Focus on the unit so the player knows where it is */
5229 unit_focus_set(pactor);
5230
5231 popup_sabotage_dialog(pactor, pcity, paction);
5232 } else {
5233 /* Not in use (yet). */
5234 log_error("Unimplemented: received background city building list.");
5235 }
5236 } else {
5237 log_debug("Can't issue orders");
5238 if (request_kind == REQEST_PLAYER_INITIATED) {
5239 action_selection_no_longer_in_progress(actor_id);
5240 action_decision_clear_want(actor_id);
5241 }
5242 }
5243}
5244
5245/************************************************************************/
5249 void handle_endgame_report(const struct packet_endgame_report *packet)
5250{
5251 set_client_state(C_S_OVER);
5252 endgame_report_dialog_start(packet);
5253}
5254
5255/************************************************************************/
5258 void handle_endgame_player(const struct packet_endgame_player *packet)
5259{
5260 if (client_has_player()
5261 && packet->player_id == player_number(client_player())) {
5262 if (packet->winner) {
5263 start_menu_music("music_victory", NULL);
5264 } else {
5265 start_menu_music("music_defeat", NULL);
5266 }
5267 }
5268 endgame_report_dialog_player(packet);
5269}
5270
5271/************************************************************************/
5274 void handle_player_attribute_chunk
5275 (const struct packet_player_attribute_chunk *packet)
5276{
5277 if (!client_has_player()) {
5278 return;
5279 }
5280
5281 generic_handle_player_attribute_chunk(client_player(), packet);
5282
5283 if (packet->offset + packet->chunk_length == packet->total_length) {
5284 /* We successful received the last chunk. The attribute block is
5285 now complete. */
5286 attribute_restore();
5287 }
5288}
5289
5290/************************************************************************/
5293 void handle_processing_started(void)
5294{
5295 agents_processing_started();
5296
5297 fc_assert(client.conn.client.request_id_of_currently_handled_packet == 0);
5298 client.conn.client.request_id_of_currently_handled_packet =
5299 get_next_request_id(client.conn.
5300 client.last_processed_request_id_seen);
5301 update_queue_processing_started(client.conn.client.
5302 request_id_of_currently_handled_packet);
5303
5304 log_debug("start processing packet %d",
5305 client.conn.client.request_id_of_currently_handled_packet);
5306}
5307
5308/************************************************************************/
5311 void handle_processing_finished(void)
5312{
5313 log_debug("finish processing packet %d",
5314 client.conn.client.request_id_of_currently_handled_packet);
5315
5316 fc_assert(client.conn.client.request_id_of_currently_handled_packet != 0);
5317
5318 client.conn.client.last_processed_request_id_seen =
5319 client.conn.client.request_id_of_currently_handled_packet;
5320 update_queue_processing_finished(client.conn.client.
5321 last_processed_request_id_seen);
5322
5323 client.conn.client.request_id_of_currently_handled_packet = 0;
5324
5325 agents_processing_finished();
5326}
5327
5328/************************************************************************/
5331 void notify_about_incoming_packet(struct connection *pc,
5332 int packet_type, int size)
5333{
5334 fc_assert(pc == &client.conn);
5335 log_debug("incoming packet={type=%d, size=%d}", packet_type, size);
5336}
5337
5338/************************************************************************/
5341 void notify_about_outgoing_packet(struct connection *pc,
5342 int packet_type, int size,
5343 int request_id)
5344{
5345 fc_assert(pc == &client.conn);
5346 log_debug("outgoing packet={type=%d, size=%d, request_id=%d}",
5347 packet_type, size, request_id);
5348
5349 fc_assert(request_id);
5350}
5351
5352/************************************************************************/
5355 void handle_freeze_client(void)
5356{
5357 log_debug("handle_freeze_client");
5358
5359 agents_freeze_hint();
5360}
5361
5362/************************************************************************/
5365 void handle_thaw_client(void)
5366{
5367 log_debug("handle_thaw_client");
5368
5369 agents_thaw_hint();
5370 update_turn_done_button_state();
5371}
5372
5373/************************************************************************/
5376 void handle_conn_ping(void)
5377{
5378 send_packet_conn_pong(&client.conn);
5379}
5380
5381/************************************************************************/
5384 void handle_server_shutdown(void)
5385{
5386 log_verbose("server shutdown");
5387}
5388
5389/************************************************************************/
5392 void handle_ruleset_effect(const struct packet_ruleset_effect *packet)
5393{
5394 recv_ruleset_effect(packet);
5395}
5396
5397/************************************************************************/
5403 void handle_edit_object_created(int tag, int id)
5404{
5405 editgui_notify_object_created(tag, id);
5406}
5407
5408/************************************************************************/
5411 void handle_edit_startpos(const struct packet_edit_startpos *packet)
5412{
5413 struct tile *ptile = index_to_tile(&(wld.map), packet->id);
5414 bool changed = FALSE;
5415
5416 /* Check. */
5417 if (NULL == ptile) {
5418 log_error("%s(): invalid tile index %d.", __FUNCTION__, packet->id);
5419 return;
5420 }
5421
5422 /* Handle. */
5423 if (packet->removal) {
5424 changed = map_startpos_remove(ptile);
5425 } else {
5426 if (NULL != map_startpos_get(ptile)) {
5427 changed = FALSE;
5428 } else {
5429 map_startpos_new(ptile);
5430 changed = TRUE;
5431 }
5432 }
5433
5434 /* Notify. */
5435 if (changed && can_client_change_view()) {
5436 refresh_tile_mapcanvas(ptile, TRUE, FALSE);
5437 if (packet->removal) {
5438 editgui_notify_object_changed(OBJTYPE_STARTPOS,
5439 packet->id, TRUE);
5440 } else {
5441 editgui_notify_object_created(packet->tag, packet->id);
5442 }
5443 }
5444}
5445
5446/************************************************************************/
5449 void handle_edit_startpos_full(const struct packet_edit_startpos_full *
5450 packet)
5451{
5452 struct tile *ptile = index_to_tile(&(wld.map), packet->id);
5453 struct startpos *psp;
5454
5455 /* Check. */
5456 if (NULL == ptile) {
5457 log_error("%s(): invalid tile index %d.", __FUNCTION__, packet->id);
5458 return;
5459 }
5460
5461 psp = map_startpos_get(ptile);
5462 if (NULL == psp) {
5463 log_error("%s(): no start position at (%d, %d)",
5464 __FUNCTION__, TILE_XY(ptile));
5465 return;
5466 }
5467
5468 /* Handle. */
5469 if (startpos_unpack(psp, packet) && can_client_change_view()) {
5470 /* Notify. */
5471 refresh_tile_mapcanvas(ptile, TRUE, FALSE);
5472 editgui_notify_object_changed(OBJTYPE_STARTPOS, startpos_number(psp),
5473 FALSE);
5474 }
5475}
5476
5477/************************************************************************/
5480 void handle_vote_remove(int vote_no)
5481{
5482 voteinfo_queue_delayed_remove(vote_no);
5483 voteinfo_gui_update();
5484}
5485
5486/************************************************************************/
5489 void handle_vote_update(int vote_no, int yes, int no, int abstain,
5490 int num_voters)
5491{
5492 struct voteinfo *vi;
5493
5494 vi = voteinfo_queue_find(vote_no);
5495 fc_assert_ret_msg(NULL != vi,
5496 "Got packet_vote_update for non-existant vote %d!",
5497 vote_no);
5498
5499 vi->yes = yes;
5500 vi->no = no;
5501 vi->abstain = abstain;
5502 vi->num_voters = num_voters;
5503
5504 voteinfo_gui_update();
5505}
5506
5507/************************************************************************/
5510 void handle_vote_new(const struct packet_vote_new *packet)
5511{
5512 fc_assert_ret_msg(NULL == voteinfo_queue_find(packet->vote_no),
5513 "Got a packet_vote_new for already existing "
5514 "vote %d!", packet->vote_no);
5515
5516 voteinfo_queue_add(packet->vote_no,
5517 packet->user,
5518 packet->desc,
5519 packet->percent_required,
5520 packet->flags);
5521 voteinfo_gui_update();
5522}
5523
5524/************************************************************************/
5527 void handle_vote_resolve(int vote_no, bool passed)
5528{
5529 struct voteinfo *vi;
5530
5531 vi = voteinfo_queue_find(vote_no);
5532 fc_assert_ret_msg(NULL != vi,
5533 "Got packet_vote_resolve for non-existant vote %d!",
5534 vote_no);
5535
5536 vi->resolved = TRUE;
5537 vi->passed = passed;
5538
5539 voteinfo_gui_update();
5540}
5541
5542/************************************************************************/
5545 void handle_play_music(const char *tag)
5546{
5547 play_single_track(tag);
5548}
5549
5550/************************************************************************/
5553 void handle_diplomacy_init_meeting(int counterpart, int initiated_from)
5554{
5555 client_init_meeting(counterpart, initiated_from);
5556}
5557
5558/************************************************************************/
5561 void handle_diplomacy_accept_treaty(int counterpart, bool I_accepted,
5562 bool other_accepted)
5563{
5564 client_recv_accept_treaty(counterpart, I_accepted, other_accepted);
5565}
5566
5567/************************************************************************/
5570 void handle_diplomacy_cancel_meeting(int counterpart, int initiated_from)
5571{
5572 client_recv_cancel_meeting(counterpart, initiated_from);
5573}
5574
5575/************************************************************************/
5578 void handle_diplomacy_create_clause(int counterpart, int giver,
5579 enum clause_type type, int value)
5580{
5581 client_recv_create_clause(counterpart, giver, type, value);
5582}
5583
5584/************************************************************************/
5587 void handle_diplomacy_remove_clause(int counterpart, int giver,
5588 enum clause_type type, int value)
5589{
5590 client_recv_remove_clause(counterpart, giver, type, value);
5591}
5592
5593/**********************************************************************/
5597 void handle_ruleset_counter(const struct packet_ruleset_counter *packet)
5598{
5599 int counter_count = counters_get_city_counters_count();
5600 struct counter *curr = counter_by_id(counter_count);
5601
5602 names_set(&curr->name, NULL, packet->name, packet->rule_name);
5603 curr->checkpoint = packet->checkpoint;
5604 curr->type = packet->behaviour;
5605 curr->target = packet->type;
5606 curr->def = packet->def;
5607
5608 if (!counter_behaviour_is_valid(curr->type)
5609 || curr->target != CTGT_CITY) {
5610 return;
5611 }
5612
5613 PACKET_STRVEC_EXTRACT(curr->helptext, packet->helptext);
5614 attach_city_counter(curr);
5615}
5616
5617/**********************************************************************/
5620 void handle_city_update_counters(const struct packet_city_update_counters *packet)
5621{
5622 int i;
5623 int counters_count;
5624 struct city *pcity = game_city_by_number(packet->city);
5625
5626 if (NULL == pcity) {
5627 return;
5628 }
5629
5630 counters_count = counters_get_city_counters_count();
5631 if (counters_count != packet->count) {
5632 return;
5633 }
5634
5635 for (i = 0; i < counters_count; i++) {
5636 pcity->counter_values[i] = packet->counters[i];
5637 }
5638
5639 if (pcity->tile != NULL) {
5640 /* City's location known */
5641 update_city_description(pcity);
5642 }
5643
5644 city_report_dialog_update_city(pcity);
5645}
achievement_by_number
struct achievement * achievement_by_number(int id)
Definition achievements.c:96
achievements.h
action_auto_perf_slot_number
struct action_auto_perf * action_auto_perf_slot_number(const int num)
Definition actions.c:5658
action_prob_possible
bool action_prob_possible(const struct act_prob probability)
Definition actions.c:5034
actions_rs_pre_san_gen
void actions_rs_pre_san_gen(void)
Definition actions.c:869
action_enabler_add
void action_enabler_add(struct action_enabler *enabler)
Definition actions.c:1486
action_enabler_new
struct action_enabler * action_enabler_new(void)
Definition actions.c:1440
action_id_exists
bool action_id_exists(const action_id act_id)
Definition actions.c:1033
actions.h
action_by_number
static struct action * action_by_number(action_id act_id)
Definition actions.h:390
action_array_iterate
#define action_array_iterate(_act_array_, _act_id_)
Definition actions.h:252
action_id_requires_details
#define action_id_requires_details(act_id)
Definition actions.h:428
action_array_iterate_end
#define action_array_iterate_end
Definition actions.h:264
action_iterate_end
#define action_iterate_end
Definition actions.h:209
action_iterate
#define action_iterate(_act_)
Definition actions.h:205
action_id_get_target_kind
#define action_id_get_target_kind(act_id)
Definition actions.h:407
ACTION_NONE
#define ACTION_NONE
Definition actions.h:55
agents_unit_changed
void agents_unit_changed(struct unit *punit)
Definition agents.c:512
agents_city_remove
void agents_city_remove(struct city *pcity)
Definition agents.c:641
agents_thaw_hint
void agents_thaw_hint(void)
Definition agents.c:441
agents_tile_remove
void agents_tile_remove(struct tile *ptile)
Definition agents.c:668
agents_city_new
void agents_city_new(struct city *pcity)
Definition agents.c:615
agents_start_turn
void agents_start_turn(void)
Definition agents.c:475
agents_tile_changed
void agents_tile_changed(struct tile *ptile)
Definition agents.c:692
agents_unit_new
void agents_unit_new(struct unit *punit)
Definition agents.c:537
agents_unit_remove
void agents_unit_remove(struct unit *punit)
Definition agents.c:563
agents_processing_started
void agents_processing_started(void)
Definition agents.c:414
agents_tile_new
void agents_tile_new(struct tile *ptile)
Definition agents.c:716
agents_processing_finished
void agents_processing_finished(void)
Definition agents.c:423
agents_new_turn
void agents_new_turn(void)
Definition agents.c:484
agents_city_changed
void agents_city_changed(struct city *pcity)
Definition agents.c:589
agents_game_joined
void agents_game_joined(void)
Definition agents.c:450
agents_freeze_hint
void agents_freeze_hint(void)
Definition agents.c:432
agents_before_new_turn
void agents_before_new_turn(void)
Definition agents.c:467
agents.h
attribute_restore
void attribute_restore(void)
Definition attribute.c:355
attribute.h
audio_restart
void audio_restart(const char *soundset_name, const char *musicset_name)
Definition audio.c:376
audio_play_sound
void audio_play_sound(const char *const tag, const char *const alt_tag, const char *const alt_tag2)
Definition audio.c:528
audio.h
base_type_init
void base_type_init(struct extra_type *pextra, int idx)
Definition base.c:117
base_extra_get
struct extra_type * base_extra_get(const struct base_type *pbase)
Definition base.c:101
base_by_number
struct base_type * base_by_number(const Base_type_id id)
Definition base.c:76
territory_claiming_base
bool territory_claiming_base(const struct base_type *pbase)
Definition base.c:158
dbv_set
void dbv_set(struct dbv *pdbv, int bit)
Definition bitvector.c:144
dbv_clr
void dbv_clr(struct dbv *pdbv, int bit)
Definition bitvector.c:167
bitvector.h
BV_SET_VAL
#define BV_SET_VAL(bv, bit, val)
Definition bitvector.h:91
BV_SET
#define BV_SET(bv, bit)
Definition bitvector.h:81
BV_ARE_EQUAL
#define BV_ARE_EQUAL(vec1, vec2)
Definition bitvector.h:113
BV_ISSET
#define BV_ISSET(bv, bit)
Definition bitvector.h:78
BV_CLR
#define BV_CLR(bv, bit)
Definition bitvector.h:86
capability.h
our_capability
const char *const our_capability
Definition capstr.c:32
capstr.h
output_window_append
void output_window_append(const struct ft_color color, const char *featured_text)
Definition chatline_common.c:104
output_window_printf
void output_window_printf(const struct ft_color color, const char *format,...)
Definition chatline_common.c:153
chatline_g.h
citizens_nation_set
void citizens_nation_set(struct city *pcity, const struct player_slot *pslot, citizens count)
Definition citizens.c:145
citizens_count
citizens citizens_count(const struct city *pcity)
Definition citizens.c:162
citizens_init
void citizens_init(struct city *pcity)
Definition citizens.c:32
citizens.h
city_map_radius_sq_set
void city_map_radius_sq_set(struct city *pcity, int radius_sq)
Definition city.c:147
city_name_set
void city_name_set(struct city *pcity, const char *new_name)
Definition city.c:1136
city_styles_alloc
void city_styles_alloc(int num)
Definition city.c:3384
city_name_get
const char * city_name_get(const struct city *pcity)
Definition city.c:1128
city_production_caravan_shields_init
void city_production_caravan_shields_init(void)
Definition city.c:1770
city_remove_improvement
void city_remove_improvement(struct city *pcity, const struct impr_type *pimprove)
Definition city.c:3359
city_size_add
void city_size_add(struct city *pcity, int add)
Definition city.c:1155
free_city_map_index
void free_city_map_index(void)
Definition city.c:608
city_unhappy
bool city_unhappy(const struct city *pcity)
Definition city.c:1618
create_city_virtual
struct city * create_city_virtual(struct player *pplayer, struct tile *ptile, const char *name)
Definition city.c:3418
city_happy
bool city_happy(const struct city *pcity)
Definition city.c:1606
city_size_set
void city_size_set(struct city *pcity, citizens size)
Definition city.c:1171
city_add_improvement
void city_add_improvement(struct city *pcity, const struct impr_type *pimprove)
Definition city.c:3345
city_map_radius_sq_get
int city_map_radius_sq_get(const struct city *pcity)
Definition city.c:136
destroy_city_virtual
void destroy_city_virtual(struct city *pcity)
Definition city.c:3504
city_rally_point_receive
void city_rally_point_receive(const struct packet_city_rally_point *packet, struct city *pcity)
Definition city.c:3629
city_styles
static const struct city struct citystyle * city_styles
Definition city.c:83
city_list_iterate
#define city_list_iterate(citylist, pcity)
Definition city.h:508
city_tile
#define city_tile(_pcity_)
Definition city.h:564
city_size_get
static citizens city_size_get(const struct city *pcity)
Definition city.h:569
city_tile_iterate_skip_free_worked
#define city_tile_iterate_skip_free_worked(_nmap, _radius_sq, _city_tile, _tile, _index, _x, _y)
Definition city.h:214
CITIZEN_LAST
@ CITIZEN_LAST
Definition city.h:272
CITIZEN_ANGRY
@ CITIZEN_ANGRY
Definition city.h:271
CITIZEN_HAPPY
@ CITIZEN_HAPPY
Definition city.h:268
CITIZEN_CONTENT
@ CITIZEN_CONTENT
Definition city.h:269
CITIZEN_UNHAPPY
@ CITIZEN_UNHAPPY
Definition city.h:270
output_type_iterate
#define output_type_iterate(output)
Definition city.h:833
city_owner
#define city_owner(_pcity_)
Definition city.h:563
city_tile_iterate_skip_free_worked_end
#define city_tile_iterate_skip_free_worked_end
Definition city.h:222
city_list_iterate_end
#define city_list_iterate_end
Definition city.h:510
I_NEVER
#define I_NEVER
Definition city.h:247
FEELING_FINAL
@ FEELING_FINAL
Definition city.h:284
FEELING_LAST
@ FEELING_LAST
Definition city.h:285
output_type_iterate_end
#define output_type_iterate_end
Definition city.h:839
generate_citydlg_dimensions
void generate_citydlg_dimensions(void)
Definition citydlg_common.c:67
citydlg_g.h
popup_city_dialog
void popup_city_dialog(struct city *pcity)
Definition update_queue.c:623
refresh_city_dialog
void refresh_city_dialog(struct city *pcity)
Definition update_queue.c:632
cityrep_g.h
city_report_dialog_update_city
void city_report_dialog_update_city(struct city *pcity)
Definition update_queue.c:641
city_report_dialog_update
void city_report_dialog_update(void)
Definition update_queue.c:666
music_set_name
char music_set_name[512]
Definition client_main.c:140
start_turn_change_wait
void start_turn_change_wait(void)
Definition client_main.c:1135
client_is_global_observer
bool client_is_global_observer(void)
Definition client_main.c:1345
client_remove_cli_conn
void client_remove_cli_conn(struct connection *pconn)
Definition client_main.c:1034
client_is_observer
bool client_is_observer(void)
Definition client_main.c:1083
stop_turn_change_wait
void stop_turn_change_wait(void)
Definition client_main.c:1148
set_server_busy
void set_server_busy(bool busy)
Definition client_main.c:1323
user_ended_turn
void user_ended_turn(void)
Definition client_main.c:798
client
struct civclient client
Definition client_main.c:150
auto_connect
bool auto_connect
Definition client_main.c:146
client_state
enum client_states client_state(void)
Definition client_main.c:1026
set_seconds_to_turndone
void set_seconds_to_turndone(double seconds)
Definition client_main.c:1110
sound_set_name
char sound_set_name[512]
Definition client_main.c:139
can_client_issue_orders
bool can_client_issue_orders(void)
Definition client_main.c:1264
client_has_player
bool client_has_player(void)
Definition client_main.c:1364
set_client_state
void set_client_state(enum client_states newstate)
Definition client_main.c:844
can_client_change_view
bool can_client_change_view(void)
Definition client_main.c:1312
client_main.h
client_player
#define client_player()
Definition client_main.h:106
C_S_PREPARING
@ C_S_PREPARING
Definition client_main.h:46
C_S_RUNNING
@ C_S_RUNNING
Definition client_main.h:47
C_S_OVER
@ C_S_OVER
Definition client_main.h:48
client_tile_get_known
enum known_type client_tile_get_known(const struct tile *ptile)
Definition climap.c:36
climap.h
create_event
void create_event(struct tile *ptile, enum event_type event, const struct ft_color color, const char *format,...)
Definition climisc.c:1082
client_player_init
void client_player_init(struct player *pplayer)
Definition climisc.c:1362
client_remove_city
void client_remove_city(struct city *pcity)
Definition climisc.c:134
client_player_maps_reset
void client_player_maps_reset(void)
Definition climisc.c:1373
client_remove_unit
void client_remove_unit(struct unit *punit)
Definition climisc.c:72
unit_focus_set_status
void unit_focus_set_status(struct player *pplayer)
Definition climisc.c:1352
handle_event
void handle_event(const char *featured_text, struct tile *ptile, enum event_type event, int turn, int phase, int conn_id)
Definition climisc.c:957
climisc.h
client_recv_remove_clause
void client_recv_remove_clause(int counterpart, int giver, enum clause_type type, int value)
Definition clitreaty.c:131
client_recv_create_clause
void client_recv_create_clause(int counterpart, int giver, enum clause_type type, int value)
Definition clitreaty.c:105
client_recv_accept_treaty
void client_recv_accept_treaty(int counterpart, bool I_accepted, bool other_accepted)
Definition clitreaty.c:59
client_recv_cancel_meeting
void client_recv_cancel_meeting(int counterpart, int initiated_from)
Definition clitreaty.c:83
client_init_meeting
void client_init_meeting(int counterpart, int initiated_from)
Definition clitreaty.c:33
clitreaty.h
city_changed
static void city_changed(int city_id)
Definition cma_core.c:447
incite_cost
char * incite_cost
Definition comments.c:74
send_client_wants_hack
void send_client_wants_hack(const char *filename)
Definition connectdlg_common.c:671
connectdlg_common.h
connectdlg_g.h
get_next_request_id
int get_next_request_id(int old_request_id)
Definition connection.c:530
conn_set_capability
void conn_set_capability(struct connection *pconn, const char *capability)
Definition connection.c:661
conn_by_number
struct connection * conn_by_number(int id)
Definition connection.c:421
conn_list_iterate
#define conn_list_iterate(connlist, pconn)
Definition connection.h:108
conn_list_iterate_end
#define conn_list_iterate_end
Definition connection.h:110
do_move_unit
void do_move_unit(struct unit *punit, struct unit *target_unit)
Definition control.c:2773
unit_is_in_focus
bool unit_is_in_focus(const struct unit *punit)
Definition control.c:383
action_selection_no_longer_in_progress
void action_selection_no_longer_in_progress(const int old_actor_id)
Definition control.c:1033
get_focus_unit_on_tile
struct unit * get_focus_unit_on_tile(const struct tile *ptile)
Definition control.c:391
action_decision_request
void action_decision_request(struct unit *actor_unit)
Definition control.c:1084
set_units_in_combat
void set_units_in_combat(struct unit *pattacker, struct unit *pdefender)
Definition control.c:1014
clear_hover_state
void clear_hover_state(void)
Definition control.c:323
unit_focus_set
void unit_focus_set(struct unit *punit)
Definition control.c:501
should_ask_server_for_actions
bool should_ask_server_for_actions(const struct unit *punit)
Definition control.c:334
get_units_in_focus
struct unit_list * get_units_in_focus(void)
Definition control.c:177
request_do_action
void request_do_action(action_id action, int actor_id, int target_id, int sub_tgt, const char *name)
Definition control.c:1704
unit_focus_urgent
void unit_focus_urgent(struct unit *punit)
Definition control.c:207
unit_change_battlegroup
void unit_change_battlegroup(struct unit *punit, int battlegroup)
Definition control.c:250
non_ai_unit_focus
bool non_ai_unit_focus
Definition control.c:125
action_decision_clear_want
void action_decision_clear_want(const int old_actor_id)
Definition control.c:1054
get_num_units_in_focus
int get_num_units_in_focus(void)
Definition control.c:185
unit_register_battlegroup
void unit_register_battlegroup(struct unit *punit)
Definition control.c:270
unit_focus_update
void unit_focus_update(void)
Definition control.c:771
auto_center_on_focus_unit
void auto_center_on_focus_unit(void)
Definition control.c:429
request_new_unit_activity
void request_new_unit_activity(struct unit *punit, enum unit_activity act)
Definition control.c:1903
action_selection_next_in_focus
void action_selection_next_in_focus(const int old_actor_id)
Definition control.c:1066
control.h
counters_get_city_counters_count
int counters_get_city_counters_count(void)
Definition counters.c:74
counter_by_id
struct counter * counter_by_id(int id)
Definition counters.c:82
attach_city_counter
void attach_city_counter(struct counter *counter)
Definition counters.c:94
counters.h
dialogs_g.h
target_unit
struct unit struct city struct unit * target_unit
Definition dialogs_g.h:56
popup_action_selection
popup_action_selection
Definition dialogs_g.h:55
actor_unit
struct unit * actor_unit
Definition dialogs_g.h:55
popup_bribe_dialog
struct unit struct city struct unit struct tile struct extra_type const struct act_prob *act_probs int actor_unit_id popup_bribe_dialog
Definition dialogs_g.h:73
caption
const char * caption
Definition dialogs_g.h:37
headline
const char const char * headline
Definition dialogs_g.h:38
popup_notify_dialog
popup_notify_dialog
Definition dialogs_g.h:37
target_tile
struct unit struct city struct unit struct tile * target_tile
Definition dialogs_g.h:57
punit
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
target_city
struct unit struct city * target_city
Definition dialogs_g.h:56
cost
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
target_extra
struct unit struct city struct unit struct tile struct extra_type * target_extra
Definition dialogs_g.h:57
clause_info_get
struct clause_info * clause_info_get(enum clause_type type)
Definition diptreaty.c:288
disaster_by_number
struct disaster_type * disaster_by_number(Disaster_type_id id)
Definition disaster.c:87
editgui_g.h
editgui_notify_object_changed
editgui_notify_object_changed
Definition editgui_g.h:27
id
int int id
Definition editgui_g.h:28
editor_is_active
bool editor_is_active(void)
Definition editor.c:346
editor_ruleset_changed
void editor_ruleset_changed(void)
Definition editor.c:180
editor.h
OBJTYPE_PLAYER
@ OBJTYPE_PLAYER
Definition editor.h:30
OBJTYPE_UNIT
@ OBJTYPE_UNIT
Definition editor.h:28
OBJTYPE_STARTPOS
@ OBJTYPE_STARTPOS
Definition editor.h:27
OBJTYPE_GAME
@ OBJTYPE_GAME
Definition editor.h:31
OBJTYPE_CITY
@ OBJTYPE_CITY
Definition editor.h:29
OBJTYPE_TILE
@ OBJTYPE_TILE
Definition editor.h:26
recv_ruleset_effect
void recv_ruleset_effect(const struct packet_ruleset_effect *packet)
Definition effects.c:591
reqs
struct @21::@22 reqs
event
enum event_type event
Definition events.c:81
get_event_tag
const char * get_event_tag(enum event_type event)
Definition events.c:276
events.h
extra_owner
struct player * extra_owner(const struct tile *ptile)
Definition extras.c:1114
set_user_extra_flag_name
void set_user_extra_flag_name(enum extra_flag_id id, const char *name, const char *helptxt)
Definition extras.c:933
extra_type_list_of_zoccers
struct extra_type_list * extra_type_list_of_zoccers(void)
Definition extras.c:267
extra_has_flag
bool extra_has_flag(const struct extra_type *pextra, enum extra_flag_id flag)
Definition extras.c:861
extra_type_list_by_cause
struct extra_type_list * extra_type_list_by_cause(enum extra_cause cause)
Definition extras.c:249
extra_to_caused_by_list
void extra_to_caused_by_list(struct extra_type *pextra, enum extra_cause cause)
Definition extras.c:312
extra_by_number
struct extra_type * extra_by_number(int id)
Definition extras.c:183
extra_type_list_of_terr_claimers
struct extra_type_list * extra_type_list_of_terr_claimers(void)
Definition extras.c:275
is_extra_removed_by
bool is_extra_removed_by(const struct extra_type *pextra, enum extra_rmcause rmcause)
Definition extras.c:353
extra_type_list_of_unit_hiders
struct extra_type_list * extra_type_list_of_unit_hiders(void)
Definition extras.c:259
extras.h
extra_type_iterate
#define extra_type_iterate(_p)
Definition extras.h:315
extra_to_removed_by_list
static void extra_to_removed_by_list(struct extra_type *pextra, enum extra_rmcause rmcause)
Definition extras.h:214
extra_type_iterate_end
#define extra_type_iterate_end
Definition extras.h:321
is_extra_caused_by
#define is_extra_caused_by(e, c)
Definition extras.h:203
extra_index
#define extra_index(_e_)
Definition extras.h:183
EXTRA_NONE
#define EXTRA_NONE
Definition extras.h:85
EF_LAST_USER_FLAG
#define EF_LAST_USER_FLAG
Definition extras.h:82
MAX_DISASTER_TYPES
#define MAX_DISASTER_TYPES
Definition fc_types.h:52
MAX_GRANARY_INIS
#define MAX_GRANARY_INIS
Definition fc_types.h:72
MAX_NUM_BUILDING_LIST
#define MAX_NUM_BUILDING_LIST
Definition fc_types.h:46
Tech_type_id
int Tech_type_id
Definition fc_types.h:381
EC_NATURAL_DEFENSIVE
#define EC_NATURAL_DEFENSIVE
Definition fc_types.h:1126
EC_SPECIAL
#define EC_SPECIAL
Definition fc_types.h:1124
action_id
int action_id
Definition fc_types.h:393
SP_MAX
#define SP_MAX
Definition fc_types.h:413
EC_NONE
#define EC_NONE
Definition fc_types.h:1123
EC_NOT_AGGRESSIVE
#define EC_NOT_AGGRESSIVE
Definition fc_types.h:1127
EC_DEFENSIVE
#define EC_DEFENSIVE
Definition fc_types.h:1125
IF_LAST_USER_FLAG
#define IF_LAST_USER_FLAG
Definition fc_types.h:684
MAX_NUM_UNIT_LIST
#define MAX_NUM_UNIT_LIST
Definition fc_types.h:45
MAX_EXTRA_TYPES
#define MAX_EXTRA_TYPES
Definition fc_types.h:50
CTGT_CITY
@ CTGT_CITY
Definition fc_types.h:126
MAX_ACHIEVEMENT_TYPES
#define MAX_ACHIEVEMENT_TYPES
Definition fc_types.h:53
MAX_NUM_TECH_LIST
#define MAX_NUM_TECH_LIST
Definition fc_types.h:44
O_SHIELD
@ O_SHIELD
Definition fc_types.h:101
O_FOOD
@ O_FOOD
Definition fc_types.h:101
O_SCIENCE
@ O_SCIENCE
Definition fc_types.h:101
O_GOLD
@ O_GOLD
Definition fc_types.h:101
MAX_LEN_CITYNAME
#define MAX_LEN_CITYNAME
Definition fc_types.h:67
MAX_COUNTERS
#define MAX_COUNTERS
Definition fc_types.h:106
UCL_LAST
#define UCL_LAST
Definition fc_types.h:421
IDENTITY_NUMBER_ZERO
#define IDENTITY_NUMBER_ZERO
Definition fc_types.h:92
fcintl.h
_
#define _(String)
Definition fcintl.h:67
ftc_client
const struct ft_color ftc_client
Definition featured_text.c:78
game
struct civ_game game
Definition game.c:62
game_ruleset_init
void game_ruleset_init(void)
Definition game.c:518
is_player_phase
bool is_player_phase(const struct player *pplayer, int phase)
Definition game.c:713
current_turn_timeout
int current_turn_timeout(void)
Definition game.c:854
game_ruleset_free
void game_ruleset_free(void)
Definition game.c:567
wld
struct world wld
Definition game.c:63
game_unit_by_number
struct unit * game_unit_by_number(int id)
Definition game.c:116
game_city_by_number
struct city * game_city_by_number(int id)
Definition game.c:107
game.h
init_client_goto
void init_client_goto(void)
Definition goto.c:153
goto.h
government_ruler_title_new
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:325
government_by_number
struct government * government_by_number(const Government_type_id gov)
Definition government.c:103
government_of_player
struct government * government_of_player(const struct player *pplayer)
Definition government.c:114
governments_alloc
void governments_alloc(int num)
Definition government.c:528
government_number
Government_type_id government_number(const struct government *pgovern)
Definition government.c:91
government.h
action_selection_target_extra
int action_selection_target_extra(void)
Definition action_dialog.c:1641
action_selection_target_tile
int action_selection_target_tile(void)
Definition action_dialog.c:1626
action_selection_actor_unit
int action_selection_actor_unit(void)
Definition action_dialog.c:1583
action_selection_close
void action_selection_close(void)
Definition action_dialog.c:1732
action_selection_target_city
int action_selection_target_city(void)
Definition action_dialog.c:1597
action_selection_refresh
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)
Definition action_dialog.c:1653
popup_sabotage_dialog
void popup_sabotage_dialog(struct unit *actor, struct city *pcity, const struct action *paction)
Definition action_dialog.c:931
action_selection_target_unit
int action_selection_target_unit(void)
Definition action_dialog.c:1611
popup_incite_dialog
void popup_incite_dialog(struct unit *actor, struct city *pcity, int cost, const struct action *paction)
Definition action_dialog.c:966
city_dialog_is_open
bool city_dialog_is_open(struct city *pcity)
Definition citydlg.c:579
popdown_all_city_dialogs
void popdown_all_city_dialogs(void)
Definition citydlg.c:599
refresh_unit_city_dialogs
void refresh_unit_city_dialogs(struct unit *punit)
Definition citydlg.c:538
owner
struct city * owner
Definition citydlg.c:220
server_connect
void server_connect(void)
Definition connectdlg.c:60
close_connection_dialog
void close_connection_dialog(void)
Definition connectdlg.c:52
races_update_pickable
void races_update_pickable(bool nationset_change)
Definition dialogs.c:731
show_tech_gained_dialog
void show_tech_gained_dialog(Tech_type_id tech)
Definition dialogs.c:1524
popdown_races_dialog
void popdown_races_dialog(void)
Definition dialogs.c:1230
popup_connect_msg
void popup_connect_msg(const char *headline, const char *message)
Definition dialogs.c:239
handmade_scenario_warning
bool handmade_scenario_warning(void)
Definition dialogs.c:1573
races_toggles_set_sensitive
void races_toggles_set_sensitive(void)
Definition dialogs.c:1245
popup_combat_info
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
editgui_notify_object_created
void editgui_notify_object_created(int tag, int id)
Definition editgui.c:1922
editgui_refresh
void editgui_refresh(void)
Definition editgui.c:1796
source
static GtkWidget * source
Definition gotodlg.c:58
get_gui_type
enum gui_type get_gui_type(void)
Definition gui_main.c:2099
update_infra_dialog
void update_infra_dialog(void)
Definition infradlg.c:138
close_intel_dialog
void close_intel_dialog(struct player *p)
Definition inteldlg.c:223
update_intel_dialog
void update_intel_dialog(struct player *p)
Definition inteldlg.c:462
popup_newcity_dialog
void popup_newcity_dialog(struct unit *punit, const char *suggestname)
Definition mapctrl.c:197
update_info_label
void update_info_label(void)
Definition mapview.c:138
start_turn
void start_turn(void)
Definition mapview.c:805
update_unit_info_label
void update_unit_info_label(struct unit_list *punits)
Definition mapview.c:275
update_city_descriptions
void update_city_descriptions(void)
Definition mapview.c:488
update_start_page
void update_start_page(void)
Definition pages.c:1659
science_report_dialog_popup
void science_report_dialog_popup(bool raise)
Definition repodlgs.c:716
endgame_report_dialog_start
void endgame_report_dialog_start(const struct packet_endgame_report *packet)
Definition repodlgs.c:1983
type
GType type
Definition repodlgs.c:1313
science_report_dialog_redraw
void science_report_dialog_redraw(void)
Definition repodlgs.c:761
popup_musicset_suggestion_dialog
void popup_musicset_suggestion_dialog(void)
Definition soundset_dlg.c:109
popup_soundset_suggestion_dialog
void popup_soundset_suggestion_dialog(void)
Definition soundset_dlg.c:55
refresh_spaceship_dialog
void refresh_spaceship_dialog(struct player *pplayer)
Definition spaceshipdlg.c:117
popup_tileset_suggestion_dialog
void popup_tileset_suggestion_dialog(void)
Definition tileset_dlg.c:58
voteinfo_gui_update
void voteinfo_gui_update(void)
Definition voteinfo_bar.c:214
gui_main_g.h
conn_list_dialog_update
void conn_list_dialog_update(void)
Definition update_queue.c:650
boot_help_texts
void boot_help_texts(void)
Definition helpdata.c:710
helpdata.h
idex_register_unit
void idex_register_unit(struct world *iworld, struct unit *punit)
Definition idex.c:82
idex_unregister_city
void idex_unregister_city(struct world *iworld, struct city *pcity)
Definition idex.c:97
idex_register_city
void idex_register_city(struct world *iworld, struct city *pcity)
Definition idex.c:67
idex.h
improvement_by_number
struct impr_type * improvement_by_number(const Impr_type_id id)
Definition improvement.c:194
improvement_rule_name
const char * improvement_rule_name(const struct impr_type *pimprove)
Definition improvement.c:252
is_improvement_visible
bool is_improvement_visible(const struct impr_type *pimprove)
Definition improvement.c:393
improvement_index
Impr_type_id improvement_index(const struct impr_type *pimprove)
Definition improvement.c:175
improvement_feature_cache_init
void improvement_feature_cache_init(void)
Definition improvement.c:92
set_user_impr_flag_name
void set_user_impr_flag_name(enum impr_flag_id id, const char *name, const char *helptxt)
Definition improvement.c:1184
improvement_count
Impr_type_id improvement_count(void)
Definition improvement.c:164
improvement_iterate_end
#define improvement_iterate_end
Definition improvement.h:205
improvement_iterate
#define improvement_iterate(_p)
Definition improvement.h:199
B_LAST
#define B_LAST
Definition improvement.h:42
name
const char * name
Definition inputfile.c:127
inteldlg_g.h
log.h
fc_assert_msg
#define fc_assert_msg(condition, message,...)
Definition log.h:181
fc_assert_ret
#define fc_assert_ret(condition)
Definition log.h:191
log_packet
#define log_packet
Definition log.h:137
log_warn
#define log_warn(message,...)
Definition log.h:105
log_verbose
#define log_verbose(message,...)
Definition log.h:109
fc_assert
#define fc_assert(condition)
Definition log.h:176
fc_assert_ret_msg
#define fc_assert_ret_msg(condition, message,...)
Definition log.h:205
fc_assert_ret_val
#define fc_assert_ret_val(condition, val)
Definition log.h:194
fc_assert_action
#define fc_assert_action(condition, action)
Definition log.h:187
log_debug
#define log_debug(message,...)
Definition log.h:115
log_normal
#define log_normal(message,...)
Definition log.h:107
LOG_NORMAL
@ LOG_NORMAL
Definition log.h:32
log_error
#define log_error(message,...)
Definition log.h:103
map_startpos_get
struct startpos * map_startpos_get(const struct tile *ptile)
Definition map.c:1912
startpos_number
int startpos_number(const struct startpos *psp)
Definition map.c:1650
map_free
void map_free(struct civ_map *fmap)
Definition map.c:536
sq_map_distance
int sq_map_distance(const struct tile *tile0, const struct tile *tile1)
Definition map.c:647
map_startpos_new
struct startpos * map_startpos_new(struct tile *ptile)
Definition map.c:1895
main_map_allocate
void main_map_allocate(void)
Definition map.c:525
index_to_tile
struct tile * index_to_tile(const struct civ_map *imap, int mindex)
Definition map.c:462
map_startpos_remove
bool map_startpos_remove(struct tile *ptile)
Definition map.c:1928
same_pos
bool same_pos(const struct tile *tile1, const struct tile *tile2)
Definition map.c:950
startpos_unpack
bool startpos_unpack(struct startpos *psp, const struct packet_edit_startpos_full *packet)
Definition map.c:1749
terrain_control
struct terrain_misc terrain_control
Definition map.c:68
map_is_empty
bool map_is_empty(void)
Definition map.c:148
map_init_topology
void map_init_topology(void)
Definition map.c:306
map.h
whole_map_iterate
#define whole_map_iterate(_map, _tile)
Definition map.h:531
whole_map_iterate_end
#define whole_map_iterate_end
Definition map.h:540
upgrade_canvas_clipboard
void upgrade_canvas_clipboard(void)
Definition mapctrl_common.c:469
update_turn_done_button_state
void update_turn_done_button_state(void)
Definition mapctrl_common.c:647
city_workers_display
struct city * city_workers_display
Definition mapctrl_common.c:74
mapctrl_g.h
put_nuke_mushroom_pixmaps
void put_nuke_mushroom_pixmaps(struct tile *ptile)
Definition mapview_common.c:1525
update_map_canvas_visible
void update_map_canvas_visible(void)
Definition mapview_common.c:1860
tile_visible_mapcanvas
bool tile_visible_mapcanvas(struct tile *ptile)
Definition mapview_common.c:1264
tileset_map_topo_compatible
enum topo_comp_lvl tileset_map_topo_compatible(int topology_id, struct tileset *tset, int *tset_topo)
Definition mapview_common.c:3998
refresh_city_mapcanvas
void refresh_city_mapcanvas(struct city *pcity, struct tile *ptile, bool full_refresh, bool write_to_screen)
Definition mapview_common.c:541
mapdeco_init
void mapdeco_init(void)
Definition mapview_common.c:3277
center_tile_mapcanvas
void center_tile_mapcanvas(const struct tile *ptile)
Definition mapview_common.c:1237
link_marks_decrease_turn_counters
void link_marks_decrease_turn_counters(void)
Definition mapview_common.c:3942
update_city_description
void update_city_description(struct city *pcity)
Definition mapview_common.c:1880
describe_topology
const char * describe_topology(int topo)
Definition mapview_common.c:4044
refresh_tile_mapcanvas
void refresh_tile_mapcanvas(struct tile *ptile, bool full_refresh, bool write_to_screen)
Definition mapview_common.c:504
refresh_unit_mapcanvas
void refresh_unit_mapcanvas(struct unit *punit, struct tile *ptile, bool full_refresh, bool write_to_screen)
Definition mapview_common.c:520
decrease_unit_hp_smooth
void decrease_unit_hp_smooth(struct unit *punit0, int hp0, struct unit *punit1, int hp1)
Definition mapview_common.c:2519
mapview_common.h
TOPO_INCOMP_HARD
@ TOPO_INCOMP_HARD
Definition mapview_common.h:364
mapview_g.h
mem.h
fc_calloc
#define fc_calloc(n, esz)
Definition mem.h:38
FC_FREE
#define FC_FREE(ptr)
Definition mem.h:41
fc_strdup
#define fc_strdup(str)
Definition mem.h:43
fc_malloc
#define fc_malloc(sz)
Definition mem.h:34
menu_g.h
menus_update
void menus_update(void)
Definition update_queue.c:562
meswin_clear_older
void meswin_clear_older(int turn, int phase)
Definition messagewin_common.c:65
messagewin_g.h
utype_unknown_move_cost
int utype_unknown_move_cost(const struct unit_type *utype)
Definition movement.c:104
init_move_fragments
void init_move_fragments(void)
Definition movement.c:928
movement.h
multiplier_count
Multiplier_type_id multiplier_count(void)
Definition multipliers.c:88
multiplier_by_number
struct multiplier * multiplier_by_number(Multiplier_type_id id)
Definition multipliers.c:57
multiplier_index
Multiplier_type_id multiplier_index(const struct multiplier *pmul)
Definition multipliers.c:80
multipliers.h
multipliers_iterate
#define multipliers_iterate(_mul_)
Definition multipliers.h:61
multipliers_iterate_end
#define multipliers_iterate_end
Definition multipliers.h:67
play_single_track
void play_single_track(const char *const tag)
Definition music.c:116
start_menu_music
void start_menu_music(const char *const tag, char *const alt_tag)
Definition music.c:98
start_style_music
void start_style_music(void)
Definition music.c:44
music.h
name_translation.h
name_set
static void name_set(struct name_translation *ptrans, const char *domain, const char *vernacular_name)
Definition name_translation.h:88
names_set
static void names_set(struct name_translation *ptrans, const char *domain, const char *vernacular_name, const char *rule_name)
Definition name_translation.h:60
nation_rule_name
const char * nation_rule_name(const struct nation_type *pnation)
Definition nation.c:138
nation_group_index
int nation_group_index(const struct nation_group *pgroup)
Definition nation.c:943
nation_count
Nation_type_id nation_count(void)
Definition nation.c:507
nation_group_new
struct nation_group * nation_group_new(const char *name)
Definition nation.c:960
nation_of_unit
struct nation_type * nation_of_unit(const struct unit *punit)
Definition nation.c:463
nation_set_new
struct nation_set * nation_set_new(const char *set_name, const char *set_rule_name, const char *set_description)
Definition nation.c:716
nation_by_number
struct nation_type * nation_by_number(const Nation_type_id nation)
Definition nation.c:475
nation_set_index
int nation_set_index(const struct nation_set *pset)
Definition nation.c:699
nation_of_city
struct nation_type * nation_of_city(const struct city *pcity)
Definition nation.c:454
nation_set_by_number
struct nation_set * nation_set_by_number(int id)
Definition nation.c:762
nation_group_by_number
struct nation_group * nation_group_by_number(int id)
Definition nation.c:1004
nation_leader_new
struct nation_leader * nation_leader_new(struct nation_type *pnation, const char *name, bool is_male)
Definition nation.c:239
nations_alloc
void nations_alloc(int num)
Definition nation.c:622
nation_legend_translation
const char * nation_legend_translation(const struct nation_type *pnation, const char *legend)
Definition nation.c:299
nation.h
resend_desired_settable_options
void resend_desired_settable_options(void)
Definition options.c:6004
tileset_name_for_topology
const char * tileset_name_for_topology(int topology_id)
Definition options.c:6777
gui_options
struct client_options gui_options
Definition options.c:71
options.h
calculate_overview_dimensions
void calculate_overview_dimensions(void)
Definition overview_common.c:450
overview_common.h
generic_handle_player_attribute_chunk
void generic_handle_player_attribute_chunk(struct player *pplayer, const struct packet_player_attribute_chunk *chunk)
Definition packets.c:690
packets.h
PACKET_STRVEC_EXTRACT
#define PACKET_STRVEC_EXTRACT(dest, src)
Definition packets.h:187
REQEST_PLAYER_INITIATED
#define REQEST_PLAYER_INITIATED
Definition packets.h:63
UNIT_INFO_CITY_PRESENT
@ UNIT_INFO_CITY_PRESENT
Definition packets.h:69
UNIT_INFO_CITY_SUPPORTED
@ UNIT_INFO_CITY_SUPPORTED
Definition packets.h:68
dsend_packet_spaceship_place
int dsend_packet_spaceship_place(struct connection *pc, enum spaceship_place_type type, int num)
Definition packets_gen.c:40407
send_packet_conn_pong
int send_packet_conn_pong(struct connection *pc)
Definition packets_gen.c:39121
dsend_packet_unit_get_actions
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)
Definition packets_gen.c:33720
dsend_packet_player_change_government
int dsend_packet_player_change_government(struct connection *pc, Government_type_id government)
Definition packets_gen.c:25646
send_packet_client_info
int send_packet_client_info(struct connection *pc, const struct packet_client_info *packet)
Definition packets_gen.c:39427
packet_type
packet_type
Definition packets_gen.h:1902
handle_ruleset_game
void handle_ruleset_game(const struct packet_ruleset_game *packet)
Definition packhand.c:4797
handle_player_diplstate
void handle_player_diplstate(const struct packet_player_diplstate *packet)
Definition packhand.c:2788
auto_attack_act
static action_id auto_attack_act(const struct act_prob *act_probs)
Definition packhand.c:5020
handle_ruleset_nation_sets
void handle_ruleset_nation_sets(const struct packet_ruleset_nation_sets *packet)
Definition packhand.c:4558
handle_ruleset_nation
void handle_ruleset_nation(const struct packet_ruleset_nation *packet)
Definition packhand.c:4600
handle_city_name_suggestion_info
void handle_city_name_suggestion_info(int unit_id, const char *name)
Definition packhand.c:4868
unpackage_short_unit
static struct unit * unpackage_short_unit(const struct packet_unit_short_info *packet)
Definition packhand.c:363
handle_nuke_tile_info
void handle_nuke_tile_info(int tile)
Definition packhand.c:553
handle_unknown_research
void handle_unknown_research(int id)
Definition packhand.c:2758
auto_attack_blockers
const action_id auto_attack_blockers[]
Definition packhand.c:162
handle_ruleset_government_ruler_title
void handle_ruleset_government_ruler_title(const struct packet_ruleset_government_ruler_title *packet)
Definition packhand.c:4020
handle_city_info
void handle_city_info(const struct packet_city_info *packet)
Definition packhand.c:658
handle_end_turn
void handle_end_turn(void)
Definition packhand.c:1492
unpackage_unit
static struct unit * unpackage_unit(const struct packet_unit_info *packet)
Definition packhand.c:264
caption
char * caption
Definition packhand.c:129
event
enum event_type event
Definition packhand.c:128
handle_conn_info
void handle_conn_info(const struct packet_conn_info *pinfo)
Definition packhand.c:2889
handle_vote_remove
void handle_vote_remove(int vote_no)
Definition packhand.c:5480
handle_investigate_finished
void handle_investigate_finished(const struct packet_investigate_finished *packet)
Definition packhand.c:2156
handle_page_msg_part
void handle_page_msg_part(const char *lines)
Definition packhand.c:1622
handle_unit_combat_info
void handle_unit_combat_info(const struct packet_unit_combat_info *packet)
Definition packhand.c:576
handle_ruleset_style
void handle_ruleset_style(const struct packet_ruleset_style *p)
Definition packhand.c:4708
handle_unit_remove
void handle_unit_remove(int unit_id)
Definition packhand.c:499
handle_vote_update
void handle_vote_update(int vote_no, int yes, int no, int abstain, int num_voters)
Definition packhand.c:5489
last_turn
static int last_turn
Definition packhand.c:137
handle_ruleset_multiplier
void handle_ruleset_multiplier(const struct packet_ruleset_multiplier *p)
Definition packhand.c:3965
handle_player_info
void handle_player_info(const struct packet_player_info *pinfo)
Definition packhand.c:2448
handle_ruleset_extra
void handle_ruleset_extra(const struct packet_ruleset_extra *p)
Definition packhand.c:4161
handle_ruleset_action_auto
void handle_ruleset_action_auto(const struct packet_ruleset_action_auto *p)
Definition packhand.c:4470
handle_map_info
void handle_map_info(const struct packet_map_info *packet)
Definition packhand.c:2236
handle_ruleset_unit_bonus
void handle_ruleset_unit_bonus(const struct packet_ruleset_unit_bonus *p)
Definition packhand.c:3678
handle_start_phase
void handle_start_phase(int phase)
Definition packhand.c:1419
start_revolution
void start_revolution(void)
Definition packhand.c:2392
handle_timeout_info
void handle_timeout_info(float seconds_to_phasedone, float last_turn_change_time)
Definition packhand.c:2362
handle_ruleset_terrain_control
void handle_ruleset_terrain_control(const struct packet_ruleset_terrain_control *p)
Definition packhand.c:4545
auto_attack_actions
const action_id auto_attack_actions[]
Definition packhand.c:145
handle_play_music
void handle_play_music(const char *tag)
Definition packhand.c:5545
handle_investigate_started
void handle_investigate_started(const struct packet_investigate_started *packet)
Definition packhand.c:2132
handle_edit_object_created
void handle_edit_object_created(int tag, int id)
Definition packhand.c:5403
parts
int parts
Definition packhand.c:132
handle_conn_ping
void handle_conn_ping(void)
Definition packhand.c:5376
handle_ruleset_tech_class
void handle_ruleset_tech_class(const struct packet_ruleset_tech_class *p)
Definition packhand.c:3850
handle_diplomacy_init_meeting
void handle_diplomacy_init_meeting(int counterpart, int initiated_from)
Definition packhand.c:5553
handle_ruleset_control
void handle_ruleset_control(const struct packet_ruleset_control *packet)
Definition packhand.c:3409
handle_end_phase
void handle_end_phase(void)
Definition packhand.c:1408
handle_ruleset_counter
void handle_ruleset_counter(const struct packet_ruleset_counter *packet)
Definition packhand.c:5597
handle_server_info
void handle_server_info(const char *version_label, int major_version, int minor_version, int patch_version, int emerg_version)
Definition packhand.c:1575
handle_ruleset_nation_groups
void handle_ruleset_nation_groups(const struct packet_ruleset_nation_groups *packet)
Definition packhand.c:4579
handle_ruleset_effect
void handle_ruleset_effect(const struct packet_ruleset_effect *packet)
Definition packhand.c:5392
handle_new_year
void handle_new_year(int year, int fragments, int turn)
Definition packhand.c:1359
headline
char * headline
Definition packhand.c:130
handle_research_info
void handle_research_info(const struct packet_research_info *packet)
Definition packhand.c:2674
handle_ruleset_goods
void handle_ruleset_goods(const struct packet_ruleset_goods *p)
Definition packhand.c:4377
handle_unit_info
void handle_unit_info(const struct packet_unit_info *packet)
Definition packhand.c:1648
handle_ruleset_city
void handle_ruleset_city(const struct packet_ruleset_city *packet)
Definition packhand.c:4748
handle_ruleset_unit_class
void handle_ruleset_unit_class(const struct packet_ruleset_unit_class *p)
Definition packhand.c:3587
handle_ruleset_government
void handle_ruleset_government(const struct packet_ruleset_government *p)
Definition packhand.c:3993
handle_ruleset_terrain_flag
void handle_ruleset_terrain_flag(const struct packet_ruleset_terrain_flag *p)
Definition packhand.c:4117
handle_connect_msg
void handle_connect_msg(const char *message)
Definition packhand.c:1566
REQEST_BACKGROUND_REFRESH
#define REQEST_BACKGROUND_REFRESH
Definition packhand.c:140
handle_rulesets_ready
void handle_rulesets_ready(void)
Definition packhand.c:3533
handle_tile_info
void handle_tile_info(const struct packet_tile_info *packet)
Definition packhand.c:3119
handle_ruleset_action
void handle_ruleset_action(const struct packet_ruleset_action *p)
Definition packhand.c:4402
action_decision_handle
static void action_decision_handle(struct unit *punit)
Definition packhand.c:1664
handle_achievement_info
void handle_achievement_info(int id, bool gained, bool first)
Definition packhand.c:3018
handle_scenario_description
void handle_scenario_description(const char *description)
Definition packhand.c:3397
play_sound_for_event
void play_sound_for_event(enum event_type type)
Definition packhand.c:1519
handle_edit_startpos
void handle_edit_startpos(const struct packet_edit_startpos *packet)
Definition packhand.c:5411
handle_processing_finished
void handle_processing_finished(void)
Definition packhand.c:5311
unpack_tech_req
static int unpack_tech_req(const enum tech_req r_num, const int reqs_size, const struct requirement *reqs, struct advance *a, int i)
Definition packhand.c:3755
handle_diplomacy_cancel_meeting
void handle_diplomacy_cancel_meeting(int counterpart, int initiated_from)
Definition packhand.c:5570
handle_city_short_info
void handle_city_short_info(const struct packet_city_short_info *packet)
Definition packhand.c:1162
handle_diplomacy_create_clause
void handle_diplomacy_create_clause(int counterpart, int giver, enum clause_type type, int value)
Definition packhand.c:5578
handle_endgame_player
void handle_endgame_player(const struct packet_endgame_player *packet)
Definition packhand.c:5258
handle_ruleset_resource
void handle_ruleset_resource(const struct packet_ruleset_resource *p)
Definition packhand.c:4142
handle_unit_action_answer
void handle_unit_action_answer(int actor_id, int target_id, int cost, action_id action_type, int request_kind)
Definition packhand.c:4904
handle_ruleset_tech
void handle_ruleset_tech(const struct packet_ruleset_tech *p)
Definition packhand.c:3785
handle_team_name_info
void handle_team_name_info(int team_id, const char *team_name)
Definition packhand.c:561
page_msg_report
static struct @251 page_msg_report
handle_thaw_client
void handle_thaw_client(void)
Definition packhand.c:5365
handle_calendar_info
void handle_calendar_info(const struct packet_calendar_info *pcalendar)
Definition packhand.c:2354
packhand_free
void packhand_free(void)
Definition packhand.c:218
set_government_choice
void set_government_choice(struct government *government)
Definition packhand.c:2379
handle_city_rally_point
void handle_city_rally_point(const struct packet_city_rally_point *packet)
Definition packhand.c:1011
handle_ruleset_disaster
void handle_ruleset_disaster(const struct packet_ruleset_disaster *p)
Definition packhand.c:4492
handle_unit_packet_common
static bool handle_unit_packet_common(struct unit *packet_unit)
Definition packhand.c:1702
handle_ruleset_unit_class_flag
void handle_ruleset_unit_class_flag(const struct packet_ruleset_unit_class_flag *p)
Definition packhand.c:3723
handle_server_join_reply
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:408
handle_ruleset_summary
void handle_ruleset_summary(const struct packet_ruleset_summary *packet)
Definition packhand.c:3505
handle_set_topology
void handle_set_topology(int topology_id, int wrap_id)
Definition packhand.c:2213
handle_ruleset_impr_flag
void handle_ruleset_impr_flag(const struct packet_ruleset_impr_flag *p)
Definition packhand.c:3939
handle_page_msg
void handle_page_msg(const char *caption, const char *headline, enum event_type event, int len, int parts)
Definition packhand.c:1591
handle_city_update_counters
void handle_city_update_counters(const struct packet_city_update_counters *packet)
Definition packhand.c:5620
handle_edit_startpos_full
void handle_edit_startpos_full(const struct packet_edit_startpos_full *packet)
Definition packhand.c:5449
handle_conn_ping_info
void handle_conn_ping_info(int connections, const int *conn_id, const float *ping_time)
Definition packhand.c:2995
handle_diplomacy_remove_clause
void handle_diplomacy_remove_clause(int counterpart, int giver, enum clause_type type, int value)
Definition packhand.c:5587
spaceship_autoplace
static bool spaceship_autoplace(struct player *pplayer, struct player_spaceship *ship)
Definition packhand.c:3055
handle_player_remove
void handle_player_remove(int playerno)
Definition packhand.c:2403
handle_processing_started
void handle_processing_started(void)
Definition packhand.c:5293
handle_begin_turn
void handle_begin_turn(void)
Definition packhand.c:1478
handle_endgame_report
void handle_endgame_report(const struct packet_endgame_report *packet)
Definition packhand.c:5249
handle_early_chat_msg
void handle_early_chat_msg(const struct packet_early_chat_msg *packet)
Definition packhand.c:1552
handle_ruleset_clause
void handle_ruleset_clause(const struct packet_ruleset_clause *p)
Definition packhand.c:4720
handle_ruleset_road
void handle_ruleset_road(const struct packet_ruleset_road *p)
Definition packhand.c:4346
handle_unit_actions
void handle_unit_actions(const struct packet_unit_actions *packet)
Definition packhand.c:5118
handle_ruleset_music
void handle_ruleset_music(const struct packet_ruleset_music *packet)
Definition packhand.c:4774
handle_ruleset_base
void handle_ruleset_base(const struct packet_ruleset_base *p)
Definition packhand.c:4325
notify_about_incoming_packet
void notify_about_incoming_packet(struct connection *pc, int packet_type, int size)
Definition packhand.c:5331
handle_freeze_client
void handle_freeze_client(void)
Definition packhand.c:5355
handle_city_remove
void handle_city_remove(int city_id)
Definition packhand.c:476
handle_chat_msg
void handle_chat_msg(const struct packet_chat_msg *packet)
Definition packhand.c:1532
city_packet_common
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:1025
handle_trade_route_info
void handle_trade_route_info(const struct packet_trade_route_info *packet)
Definition packhand.c:1127
handle_player_attribute_chunk
void handle_player_attribute_chunk(const struct packet_player_attribute_chunk *packet)
Definition packhand.c:5275
handle_vote_new
void handle_vote_new(const struct packet_vote_new *packet)
Definition packhand.c:5510
packhand_init
static void packhand_init(void)
Definition packhand.c:239
handle_scenario_info
void handle_scenario_info(const struct packet_scenario_info *packet)
Definition packhand.c:3376
handle_ruleset_extra_flag
void handle_ruleset_extra_flag(const struct packet_ruleset_extra_flag *p)
Definition packhand.c:4299
lines
char * lines
Definition packhand.c:131
notify_about_outgoing_packet
void notify_about_outgoing_packet(struct connection *pc, int packet_type, int size, int request_id)
Definition packhand.c:5341
VALIDATE
#define VALIDATE(_count, _maximum, _string)
forced_tileset_name
const char forced_tileset_name[]
Definition client_main.c:137
cities
struct city_list * cities
Definition packhand.c:119
handle_ruleset_tech_flag
void handle_ruleset_tech_flag(const struct packet_ruleset_tech_flag *p)
Definition packhand.c:3863
handle_nation_availability
void handle_nation_availability(int ncount, const bool *is_pickable, bool nationset_change)
Definition packhand.c:4690
handle_spaceship_info
void handle_spaceship_info(const struct packet_spaceship_info *p)
Definition packhand.c:3074
handle_ruleset_specialist
void handle_ruleset_specialist(const struct packet_ruleset_specialist *p)
Definition packhand.c:4842
handle_unit_short_info
void handle_unit_short_info(const struct packet_unit_short_info *packet)
Definition packhand.c:2163
handle_diplomacy_accept_treaty
void handle_diplomacy_accept_treaty(int counterpart, bool I_accepted, bool other_accepted)
Definition packhand.c:5561
handle_ruleset_unit_flag
void handle_ruleset_unit_flag(const struct packet_ruleset_unit_flag *p)
Definition packhand.c:3698
handle_city_nationalities
void handle_city_nationalities(const struct packet_city_nationalities *packet)
Definition packhand.c:991
handle_server_shutdown
void handle_server_shutdown(void)
Definition packhand.c:5384
handle_ruleset_building
void handle_ruleset_building(const struct packet_ruleset_building *p)
Definition packhand.c:3888
update_improvement_from_packet
static bool update_improvement_from_packet(struct city *pcity, struct impr_type *pimprove, bool have_impr)
Definition packhand.c:636
handle_ruleset_unit
void handle_ruleset_unit(const struct packet_ruleset_unit *p)
Definition packhand.c:3605
handle_ruleset_terrain
void handle_ruleset_terrain(const struct packet_ruleset_terrain *p)
Definition packhand.c:4034
action_decision_maybe_auto
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:5050
REQEST_BACKGROUND_FAST_AUTO_ATTACK
#define REQEST_BACKGROUND_FAST_AUTO_ATTACK
Definition packhand.c:142
handle_city_sabotage_list
void handle_city_sabotage_list(int actor_id, int city_id, bv_imprs improvements, action_id act_id, int request_kind)
Definition packhand.c:5188
handle_ruleset_action_enabler
void handle_ruleset_action_enabler(const struct packet_ruleset_action_enabler *p)
Definition packhand.c:4436
handle_ruleset_achievement
void handle_ruleset_achievement(const struct packet_ruleset_achievement *p)
Definition packhand.c:4514
handle_game_info
void handle_game_info(const struct packet_game_info *pinfo)
Definition packhand.c:2278
placeholder
struct player * placeholder
Definition packhand.c:120
handle_vote_resolve
void handle_vote_resolve(int vote_no, bool passed)
Definition packhand.c:5527
handle_worker_task
void handle_worker_task(const struct packet_worker_task *packet)
Definition packhand.c:1302
handle_ruleset_description_part
void handle_ruleset_description_part(const struct packet_ruleset_description_part *packet)
Definition packhand.c:3523
handle_ruleset_trade
void handle_ruleset_trade(const struct packet_ruleset_trade *p)
Definition packhand.c:4530
len
int len
Definition packhand.c:127
invisible
static struct @250 invisible
packhand.h
pages_g.h
player_slot_is_used
bool player_slot_is_used(const struct player_slot *pslot)
Definition player.c:448
player_unit_by_number
struct unit * player_unit_by_number(const struct player *pplayer, int unit_id)
Definition player.c:1229
player_new
struct player * player_new(struct player_slot *pslot)
Definition player.c:493
player_by_number
struct player * player_by_number(const int player_id)
Definition player.c:849
player_count
int player_count(void)
Definition player.c:817
player_slot_by_number
struct player_slot * player_slot_by_number(int player_id)
Definition player.c:463
player_number
int player_number(const struct player *pplayer)
Definition player.c:837
player_name
const char * player_name(const struct player *pplayer)
Definition player.c:895
player_set_color
void player_set_color(struct player *pplayer, const struct rgbcolor *prgbcolor)
Definition player.c:648
player_index
int player_index(const struct player *pplayer)
Definition player.c:829
player_set_nation
bool player_set_nation(struct player *pplayer, struct nation_type *pnation)
Definition player.c:861
player_diplstate_get
struct player_diplstate * player_diplstate_get(const struct player *plr1, const struct player *plr2)
Definition player.c:324
can_player_see_units_in_city
bool can_player_see_units_in_city(const struct player *pplayer, const struct city *pcity)
Definition player.c:1133
player_slot_get_player
struct player * player_slot_get_player(const struct player_slot *pslot)
Definition player.c:437
can_player_see_city_internals
bool can_player_see_city_internals(const struct player *pplayer, const struct city *pcity)
Definition player.c:1149
player_destroy
void player_destroy(struct player *pplayer)
Definition player.c:756
player.h
players_iterate_end
#define players_iterate_end
Definition player.h:539
players_iterate
#define players_iterate(_pplayer)
Definition player.h:534
OWNER_NONE
#define OWNER_NONE
Definition player.h:50
ANON_USER_NAME
#define ANON_USER_NAME
Definition player.h:48
is_ai
#define is_ai(plr)
Definition player.h:232
ANON_PLAYER_NAME
#define ANON_PLAYER_NAME
Definition player.h:43
is_human
#define is_human(plr)
Definition player.h:231
plrdlg_g.h
players_dialog_update
void players_dialog_update(void)
Definition update_queue.c:658
rand.h
fc_rand
#define fc_rand(_size)
Definition rand.h:56
ratesdlg_g.h
multipliers_dialog_update
void multipliers_dialog_update(void)
Definition update_queue.c:572
repodlgs_g.h
endgame_report_dialog_player
endgame_report_dialog_player
Definition repodlgs_g.h:33
universal_by_number
struct universal universal_by_number(const enum universals_n kind, const int value)
Definition requirements.c:627
are_universals_equal
bool are_universals_equal(const struct universal *psource1, const struct universal *psource2)
Definition requirements.c:6667
research_invention_set
enum tech_state research_invention_set(struct research *presearch, Tech_type_id tech, enum tech_state value)
Definition research.c:637
research_by_number
struct research * research_by_number(int number)
Definition research.c:118
research_get
struct research * research_get(const struct player *pplayer)
Definition research.c:128
research_update
void research_update(struct research *presearch)
Definition research.c:501
research.h
research_players_iterate
#define research_players_iterate(_presearch, _pplayer)
Definition research.h:166
research_players_iterate_end
#define research_players_iterate_end
Definition research.h:170
rgbcolor_destroy
void rgbcolor_destroy(struct rgbcolor *prgbcolor)
Definition rgbcolor.c:74
rgbcolor_new
struct rgbcolor * rgbcolor_new(int r, int g, int b)
Definition rgbcolor.c:34
rgbcolor.h
road_integrators_cache_init
void road_integrators_cache_init(void)
Definition road.c:111
road_by_number
struct road_type * road_by_number(Road_type_id id)
Definition road.c:58
road_type_init
void road_type_init(struct extra_type *pextra, int idx)
Definition road.c:93
road.h
script_client_signal_emit
void script_client_signal_emit(const char *signal_name,...)
Definition script_client.c:320
script_client.h
connections
static struct connection connections[MAX_NUM_CONNECTIONS]
Definition sernet.c:94
ARRAY_SIZE
#define ARRAY_SIZE(x)
Definition shared.h:85
MIN
#define MIN(x, y)
Definition shared.h:55
MAX
#define MAX(x, y)
Definition shared.h:54
next_spaceship_component
bool next_spaceship_component(struct player *pplayer, struct player_spaceship *ship, struct spaceship_component *fill)
Definition spaceship.c:130
spaceship.h
spaceshipdlg_g.h
specialist_by_number
struct specialist * specialist_by_number(const Specialist_type_id id)
Definition specialist.c:100
specialist.h
specialist_type_iterate_end
#define specialist_type_iterate_end
Definition specialist.h:79
specialist_type_iterate
#define specialist_type_iterate(sp)
Definition specialist.h:73
DEFAULT_SPECIALIST
#define DEFAULT_SPECIALIST
Definition specialist.h:43
size
size_t size
Definition specvec.h:72
string_vector.h
strvec_iterate
#define strvec_iterate(psv, str)
Definition string_vector.h:61
strvec_iterate_end
#define strvec_iterate_end
Definition string_vector.h:68
achievement
Definition achievements.h:26
achievement::first
struct player * first
Definition achievements.h:34
act_prob
Definition fc_types.h:1250
action_auto_perf
Definition actions.h:316
action_enabler
Definition actions.h:165
action
Definition actions.h:106
action::actor_consuming_always
bool actor_consuming_always
Definition actions.h:139
action::max_distance
int max_distance
Definition actions.h:122
action::quiet
bool quiet
Definition actions.h:129
action::sub_target_kind
enum action_sub_target_kind sub_target_kind
Definition actions.h:114
action::result
enum action_result result
Definition actions.h:109
action::ui_name
char ui_name[MAX_LEN_NAME]
Definition actions.h:125
action::sub_results
bv_action_sub_results sub_results
Definition actions.h:110
action::actor_kind
enum action_actor_kind actor_kind
Definition actions.h:112
action::blocked_by
bv_actions blocked_by
Definition actions.h:133
action::target_kind
enum action_target_kind target_kind
Definition actions.h:113
action::min_distance
int min_distance
Definition actions.h:122
advance
Definition tech.h:124
advance::research_reqs
struct requirement_vector research_reqs
Definition tech.h:137
advance::tclass
struct tech_class * tclass
Definition tech.h:130
advance::cost
double cost
Definition tech.h:150
advance::require
struct advance * require[AR_SIZE]
Definition tech.h:132
advance::name
struct name_translation name
Definition tech.h:126
advance::helptext
struct strvec * helptext
Definition tech.h:140
advance::flags
bv_tech_flags flags
Definition tech.h:139
advance::num_reqs
int num_reqs
Definition tech.h:156
advance::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition tech.h:128
advance::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition tech.h:129
base_type
Definition base.h:41
built_status::turn
int turn
Definition city.h:246
city
Definition city.h:320
city::task_reqs
struct worker_task_list * task_reqs
Definition city.h:412
city::turn_last_built
int turn_last_built
Definition city.h:387
city::surplus
int surplus[O_LAST]
Definition city.h:355
city::food_stock
int food_stock
Definition city.h:367
city::built
struct built_status built[B_LAST]
Definition city.h:394
city::original
struct player * original
Definition city.h:324
city::history
int history
Definition city.h:410
city::counter_values
int * counter_values
Definition city.h:408
city::pollution
int pollution
Definition city.h:369
city::did_sell
bool did_sell
Definition city.h:380
city::id
int id
Definition city.h:326
city::last_turns_shield_surplus
int last_turns_shield_surplus
Definition city.h:392
city::capital
enum capital_type capital
Definition city.h:328
city::disbanded_shields
int disbanded_shields
Definition city.h:391
city::waste
int waste[O_LAST]
Definition city.h:356
city::info_units_present
struct unit_list * info_units_present
Definition city.h:474
city::city_options
bv_city_options city_options
Definition city.h:403
city::city_radius_sq
int city_radius_sq
Definition city.h:375
city::was_happy
bool was_happy
Definition city.h:381
city::owner
struct player * owner
Definition city.h:323
city::turn_founded
int turn_founded
Definition city.h:386
city::airlift
int airlift
Definition city.h:378
city::citizen_base
int citizen_base[O_LAST]
Definition city.h:359
city::caravan_shields
int caravan_shields
Definition city.h:390
city::did_buy
bool did_buy
Definition city.h:379
city::info_units_supported
struct unit_list * info_units_supported
Definition city.h:473
city::name
char * name
Definition city.h:321
city::routes
struct trade_route_list * routes
Definition city.h:344
city::occupied
bool occupied
Definition city.h:460
city::usage
int usage[O_LAST]
Definition city.h:360
city::worklist
struct worklist worklist
Definition city.h:401
city::production
struct universal production
Definition city.h:396
city::walls
int walls
Definition city.h:461
city::happy
bool happy
Definition city.h:462
city::collecting_info_units_supported
struct unit_list * collecting_info_units_supported
Definition city.h:477
city::steal
int steal
Definition city.h:414
city::unhappy_penalty
int unhappy_penalty[O_LAST]
Definition city.h:357
city::first_citizen_index
unsigned char first_citizen_index
Definition city.h:483
city::before_change_shields
int before_change_shields
Definition city.h:389
city::culture
int culture
Definition city.h:465
city::style
int style
Definition city.h:327
city::had_famine
bool had_famine
Definition city.h:382
city::collecting_info_units_present
struct unit_list * collecting_info_units_present
Definition city.h:478
city::buy_cost
int buy_cost
Definition city.h:466
city::feel
citizens feel[CITIZEN_LAST][FEELING_LAST]
Definition city.h:333
city::specialists
citizens specialists[SP_MAX]
Definition city.h:336
city::tile
struct tile * tile
Definition city.h:322
city::shield_stock
int shield_stock
Definition city.h:368
city::prod
int prod[O_LAST]
Definition city.h:358
city::city_image
int city_image
Definition city.h:464
city::changed_from
struct universal changed_from
Definition city.h:399
city::unhappy
bool unhappy
Definition city.h:463
city::units_supported
struct unit_list * units_supported
Definition city.h:406
city::illness_trade
int illness_trade
Definition city.h:370
city::client
struct city::@17::@20 client
citystyle
Definition city.h:491
civ_game::plr_bg_color
struct rgbcolor * plr_bg_color
Definition game.h:103
civ_game::scenario_desc
struct packet_scenario_description scenario_desc
Definition game.h:88
civ_game::control
struct packet_ruleset_control control
Definition game.h:83
civ_game::ruleset_summary
char * ruleset_summary
Definition game.h:84
civ_game::est_connections
struct conn_list * est_connections
Definition game.h:97
civ_game::global_init_techs
int global_init_techs[MAX_NUM_TECH_LIST]
Definition game.h:108
civ_game::info
struct packet_game_info info
Definition game.h:89
civ_game::ruleset_ready
bool ruleset_ready
Definition game.h:117
civ_game::global_init_buildings
int global_init_buildings[MAX_NUM_BUILDING_LIST]
Definition game.h:109
civ_game::scenario
struct packet_scenario_info scenario
Definition game.h:87
civ_game::ruleset_description
char * ruleset_description
Definition game.h:85
civ_game::all_connections
struct conn_list * all_connections
Definition game.h:96
civ_game::ruleset_init
bool ruleset_init
Definition game.h:116
civ_game::rgame
struct civ_game::@30 rgame
civ_game::tinfo
struct packet_timeout_info tinfo
Definition game.h:91
civ_game::veteran
struct veteran_system * veteran
Definition game.h:101
civ_game::calendar
struct packet_calendar_info calendar
Definition game.h:90
civ_game::default_government
struct government * default_government
Definition game.h:93
civ_game::client
struct civ_game::@31::@34 client
civ_game::government_during_revolution
struct government * government_during_revolution
Definition game.h:94
civ_map::xsize
int xsize
Definition map_types.h:79
civ_map::ysize
int ysize
Definition map_types.h:79
civ_map::num_continents
int num_continents
Definition map_types.h:82
civ_map::north_latitude
int north_latitude
Definition map_types.h:80
civ_map::south_latitude
int south_latitude
Definition map_types.h:81
civ_map::altitude_info
bool altitude_info
Definition map_types.h:74
civ_map::topology_id
int topology_id
Definition map_types.h:72
civ_map::wrap_id
int wrap_id
Definition map_types.h:73
civclient::conn
struct connection conn
Definition client_main.h:96
clause_info
Definition diptreaty.h:55
clause_info::receiver_reqs
struct requirement_vector receiver_reqs
Definition diptreaty.h:59
clause_info::giver_reqs
struct requirement_vector giver_reqs
Definition diptreaty.h:58
clause_info::either_reqs
struct requirement_vector either_reqs
Definition diptreaty.h:60
clause_info::enabled
bool enabled
Definition diptreaty.h:57
client_options::sound_bell_at_new_turn
bool sound_bell_at_new_turn
Definition options.h:151
client_options::autoaccept_tileset_suggestion
bool autoaccept_tileset_suggestion
Definition options.h:184
client_options::autoaccept_musicset_suggestion
bool autoaccept_musicset_suggestion
Definition options.h:186
client_options::draw_city_names
bool draw_city_names
Definition options.h:197
client_options::draw_city_productions
bool draw_city_productions
Definition options.h:199
client_options::popup_new_cities
bool popup_new_cities
Definition options.h:168
client_options::draw_city_trade_routes
bool draw_city_trade_routes
Definition options.h:201
client_options::wakeup_focus
bool wakeup_focus
Definition options.h:160
client_options::autoaccept_soundset_suggestion
bool autoaccept_soundset_suggestion
Definition options.h:185
client_options::ask_city_name
bool ask_city_name
Definition options.h:167
client_options::draw_city_growth
bool draw_city_growth
Definition options.h:198
client_options::ai_manual_turn_done
bool ai_manual_turn_done
Definition options.h:155
client_options::smooth_combat_step_msec
int smooth_combat_step_msec
Definition options.h:154
client_options::draw_full_citybar
bool draw_full_citybar
Definition options.h:217
client_options::auto_center_on_combat
bool auto_center_on_combat
Definition options.h:158
client_options::popup_attack_actions
bool popup_attack_actions
Definition options.h:170
combat_bonus
Definition unittype.h:473
combat_bonus::value
int value
Definition unittype.h:476
combat_bonus::flag
enum unit_type_flag_id flag
Definition unittype.h:474
combat_bonus::quiet
bool quiet
Definition unittype.h:479
combat_bonus::type
enum combat_bonus_type type
Definition unittype.h:475
connection
Definition connection.h:136
connection::established
bool established
Definition connection.h:140
connection::playing
struct player * playing
Definition connection.h:151
connection::request_id_of_currently_handled_packet
int request_id_of_currently_handled_packet
Definition connection.h:193
connection::client
struct connection::@58::@63 client
connection::access_level
enum cmdlevel access_level
Definition connection.h:177
connection::observer
bool observer
Definition connection.h:147
connection::username
char username[MAX_LEN_NAME]
Definition connection.h:164
connection::capability
char capability[MAX_LEN_CAPSTR]
Definition connection.h:171
connection::last_processed_request_id_seen
int last_processed_request_id_seen
Definition connection.h:190
connection::ping_time
double ping_time
Definition connection.h:161
connection::id
int id
Definition connection.h:137
counter
Definition counters.h:27
disaster_type
Definition disaster.h:48
extra_type
Definition extras.h:88
extra_type::native_to
bv_unit_classes native_to
Definition extras.h:130
extra_type::rmact_gfx
char rmact_gfx[MAX_LEN_NAME]
Definition extras.h:102
extra_type::conflicts
bv_extras conflicts
Definition extras.h:133
extra_type::rmcauses
uint8_t rmcauses
Definition extras.h:95
extra_type::act_gfx_alt
char act_gfx_alt[MAX_LEN_NAME]
Definition extras.h:100
extra_type::appearance_reqs
struct requirement_vector appearance_reqs
Definition extras.h:108
extra_type::helptext
struct strvec * helptext
Definition extras.h:149
extra_type::flags
bv_extra_flags flags
Definition extras.h:132
extra_type::rmact_gfx_alt
char rmact_gfx_alt[MAX_LEN_NAME]
Definition extras.h:103
extra_type::causes
uint16_t causes
Definition extras.h:94
extra_type::bridged_over
bv_extras bridged_over
Definition extras.h:135
extra_type::data
struct extra_type::@25 data
extra_type::removal_time
int removal_time
Definition extras.h:120
extra_type::rmact_gfx_alt2
char rmact_gfx_alt2[MAX_LEN_NAME]
Definition extras.h:104
extra_type::build_time_factor
int build_time_factor
Definition extras.h:119
extra_type::disappearance_reqs
struct requirement_vector disappearance_reqs
Definition extras.h:109
extra_type::generated
bool generated
Definition extras.h:117
extra_type::special_idx
int special_idx
Definition extras.h:153
extra_type::rmreqs
struct requirement_vector rmreqs
Definition extras.h:107
extra_type::visibility_req
Tech_type_id visibility_req
Definition extras.h:139
extra_type::category
enum extra_category category
Definition extras.h:93
extra_type::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition extras.h:98
extra_type::activity_gfx
char activity_gfx[MAX_LEN_NAME]
Definition extras.h:99
extra_type::disappearance_chance
int disappearance_chance
Definition extras.h:126
extra_type::removal_time_factor
int removal_time_factor
Definition extras.h:121
extra_type::act_gfx_alt2
char act_gfx_alt2[MAX_LEN_NAME]
Definition extras.h:101
extra_type::reqs
struct requirement_vector reqs
Definition extras.h:106
extra_type::buildable
bool buildable
Definition extras.h:116
extra_type::eus
enum extra_unit_seen_type eus
Definition extras.h:128
extra_type::defense_bonus
int defense_bonus
Definition extras.h:124
extra_type::appearance_chance
int appearance_chance
Definition extras.h:125
extra_type::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition extras.h:97
extra_type::build_time
int build_time
Definition extras.h:118
extra_type::infracost
int infracost
Definition extras.h:122
extra_type::no_aggr_near_city
int no_aggr_near_city
Definition extras.h:137
extra_type::hidden_by
bv_extras hidden_by
Definition extras.h:134
extra_type::name
struct name_translation name
Definition extras.h:90
goods_type
Definition traderoutes.h:187
government
Definition government.h:52
government::helptext
struct strvec * helptext
Definition government.h:61
government::reqs
struct requirement_vector reqs
Definition government.h:58
government::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition government.h:57
government::item_number
Government_type_id item_number
Definition government.h:53
government::name
struct name_translation name
Definition government.h:54
government::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition government.h:56
impr_type
Definition improvement.h:50
impr_type::build_cost
int build_cost
Definition improvement.h:60
impr_type::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition improvement.h:55
impr_type::upkeep
int upkeep
Definition improvement.h:61
impr_type::graphic_alt2
char graphic_alt2[MAX_LEN_NAME]
Definition improvement.h:57
impr_type::genus
enum impr_genus_id genus
Definition improvement.h:63
impr_type::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition improvement.h:56
impr_type::obsolete_by
struct requirement_vector obsolete_by
Definition improvement.h:59
impr_type::sabotage
int sabotage
Definition improvement.h:62
impr_type::soundtag_alt
char soundtag_alt[MAX_LEN_NAME]
Definition improvement.h:67
impr_type::soundtag_alt2
char soundtag_alt2[MAX_LEN_NAME]
Definition improvement.h:68
impr_type::reqs
struct requirement_vector reqs
Definition improvement.h:58
impr_type::helptext
struct strvec * helptext
Definition improvement.h:65
impr_type::name
struct name_translation name
Definition improvement.h:52
impr_type::flags
bv_impr_flags flags
Definition improvement.h:64
impr_type::soundtag
char soundtag[MAX_LEN_NAME]
Definition improvement.h:66
message
Definition messagewin_common.h:29
multiplier_value::value
int value
Definition player.h:241
multiplier_value::target
int target
Definition player.h:243
multiplier_value::changed
int changed
Definition player.h:245
multiplier
Definition multipliers.h:31
multiplier::start
int start
Definition multipliers.h:35
multiplier::reqs
struct requirement_vector reqs
Definition multipliers.h:42
multiplier::step
int step
Definition multipliers.h:37
multiplier::def
int def
Definition multipliers.h:38
multiplier::helptext
struct strvec * helptext
Definition multipliers.h:43
multiplier::offset
int offset
Definition multipliers.h:39
multiplier::minimum_turns
int minimum_turns
Definition multipliers.h:41
multiplier::factor
int factor
Definition multipliers.h:40
multiplier::stop
int stop
Definition multipliers.h:36
multiplier::name
struct name_translation name
Definition multipliers.h:33
music_style
Definition style.h:29
nation_group
Definition nation.h:167
nation_set
Definition nation.c:41
nation_style
Definition style.h:22
nation_type
Definition nation.h:98
nation_type::init_buildings
int init_buildings[MAX_NUM_BUILDING_LIST]
Definition nation.h:123
nation_type::groups
struct nation_group_list * groups
Definition nation.h:116
nation_type::noun_plural
struct name_translation noun_plural
Definition nation.h:102
nation_type::sets
struct nation_set_list * sets
Definition nation.h:113
nation_type::flag_graphic_str
char flag_graphic_str[MAX_LEN_NAME]
Definition nation.h:103
nation_type::adjective
struct name_translation adjective
Definition nation.h:101
nation_type::flag_graphic_alt
char flag_graphic_alt[MAX_LEN_NAME]
Definition nation.h:104
nation_type::init_government
struct government * init_government
Definition nation.h:124
nation_type::is_pickable
bool is_pickable
Definition nation.h:161
nation_type::init_units
struct unit_type * init_units[MAX_NUM_UNIT_LIST]
Definition nation.h:125
nation_type::legend
char * legend
Definition nation.h:107
nation_type::barb_type
enum barbarian_type barb_type
Definition nation.h:110
nation_type::client
struct nation_type::@51::@54 client
nation_type::translation_domain
char * translation_domain
Definition nation.h:100
nation_type::style
struct nation_style * style
Definition nation.h:106
nation_type::init_techs
int init_techs[MAX_NUM_TECH_LIST]
Definition nation.h:122
nation_type::is_playable
bool is_playable
Definition nation.h:109
packet_calendar_info
Definition packets_gen.h:260
packet_chat_msg
Definition packets_gen.h:298
packet_chat_msg::phase
int phase
Definition packets_gen.h:303
packet_chat_msg::message
char message[MAX_LEN_MSG]
Definition packets_gen.h:299
packet_chat_msg::conn_id
int conn_id
Definition packets_gen.h:304
packet_chat_msg::event
enum event_type event
Definition packets_gen.h:301
packet_chat_msg::turn
int turn
Definition packets_gen.h:302
packet_chat_msg::tile
int tile
Definition packets_gen.h:300
packet_city_info
Definition packets_gen.h:336
packet_city_info::style
int style
Definition packets_gen.h:343
packet_city_info::last_turns_shield_surplus
int last_turns_shield_surplus
Definition packets_gen.h:374
packet_city_info::usage
int usage[O_LAST]
Definition packets_gen.h:359
packet_city_info::before_change_shields
int before_change_shields
Definition packets_gen.h:371
packet_city_info::ppl_content
int ppl_content[FEELING_LAST]
Definition packets_gen.h:346
packet_city_info::city_options
bv_city_options city_options
Definition packets_gen.h:386
packet_city_info::capital
enum capital_type capital
Definition packets_gen.h:344
packet_city_info::surplus
int surplus[O_LAST]
Definition packets_gen.h:354
packet_city_info::had_famine
bool had_famine
Definition packets_gen.h:379
packet_city_info::ppl_unhappy
int ppl_unhappy[FEELING_LAST]
Definition packets_gen.h:347
packet_city_info::original
int original
Definition packets_gen.h:340
packet_city_info::citizen_base
int citizen_base[O_LAST]
Definition packets_gen.h:358
packet_city_info::changed_from_kind
int changed_from_kind
Definition packets_gen.h:369
packet_city_info::specialists
int specialists[SP_MAX]
Definition packets_gen.h:350
packet_city_info::changed_from_value
int changed_from_value
Definition packets_gen.h:370
packet_city_info::ppl_angry
int ppl_angry[FEELING_LAST]
Definition packets_gen.h:348
packet_city_info::food_stock
int food_stock
Definition packets_gen.h:360
packet_city_info::id
int id
Definition packets_gen.h:337
packet_city_info::owner
int owner
Definition packets_gen.h:339
packet_city_info::walls
int walls
Definition packets_gen.h:381
packet_city_info::improvements
bv_imprs improvements
Definition packets_gen.h:385
packet_city_info::shield_stock
int shield_stock
Definition packets_gen.h:361
packet_city_info::was_happy
bool was_happy
Definition packets_gen.h:378
packet_city_info::worklist
struct worklist worklist
Definition packets_gen.h:384
packet_city_info::steal
int steal
Definition packets_gen.h:383
packet_city_info::airlift
int airlift
Definition packets_gen.h:375
packet_city_info::did_buy
bool did_buy
Definition packets_gen.h:376
packet_city_info::turn_founded
int turn_founded
Definition packets_gen.h:367
packet_city_info::buy_cost
int buy_cost
Definition packets_gen.h:353
packet_city_info::name
char name[MAX_LEN_CITYNAME]
Definition packets_gen.h:387
packet_city_info::pollution
int pollution
Definition packets_gen.h:363
packet_city_info::trade_route_count
int trade_route_count
Definition packets_gen.h:362
packet_city_info::ppl_happy
int ppl_happy[FEELING_LAST]
Definition packets_gen.h:345
packet_city_info::did_sell
bool did_sell
Definition packets_gen.h:377
packet_city_info::production_value
int production_value
Definition packets_gen.h:366
packet_city_info::prod
int prod[O_LAST]
Definition packets_gen.h:357
packet_city_info::caravan_shields
int caravan_shields
Definition packets_gen.h:373
packet_city_info::illness_trade
int illness_trade
Definition packets_gen.h:364
packet_city_info::culture
int culture
Definition packets_gen.h:352
packet_city_info::diplomat_investigate
bool diplomat_investigate
Definition packets_gen.h:380
packet_city_info::unhappy_penalty
int unhappy_penalty[O_LAST]
Definition packets_gen.h:356
packet_city_info::history
int history
Definition packets_gen.h:351
packet_city_info::turn_last_built
int turn_last_built
Definition packets_gen.h:368
packet_city_info::city_image
int city_image
Definition packets_gen.h:382
packet_city_info::disbanded_shields
int disbanded_shields
Definition packets_gen.h:372
packet_city_info::production_kind
int production_kind
Definition packets_gen.h:365
packet_city_info::tile
int tile
Definition packets_gen.h:338
packet_city_info::size
int size
Definition packets_gen.h:341
packet_city_info::city_radius_sq
int city_radius_sq
Definition packets_gen.h:342
packet_city_info::waste
int waste[O_LAST]
Definition packets_gen.h:355
packet_city_nationalities
Definition packets_gen.h:390
packet_city_nationalities::nation_id
int nation_id[MAX_CITY_NATIONALITIES]
Definition packets_gen.h:393
packet_city_nationalities::id
int id
Definition packets_gen.h:391
packet_city_nationalities::nation_citizens
int nation_citizens[MAX_CITY_NATIONALITIES]
Definition packets_gen.h:394
packet_city_nationalities::nationalities_count
int nationalities_count
Definition packets_gen.h:392
packet_city_rally_point
Definition packets_gen.h:495
packet_city_rally_point::id
int id
Definition packets_gen.h:496
packet_city_short_info
Definition packets_gen.h:403
packet_city_short_info::walls
int walls
Definition packets_gen.h:411
packet_city_short_info::style
int style
Definition packets_gen.h:408
packet_city_short_info::size
int size
Definition packets_gen.h:407
packet_city_short_info::improvements
bv_imprs improvements
Definition packets_gen.h:415
packet_city_short_info::capital
enum capital_type capital
Definition packets_gen.h:409
packet_city_short_info::owner
int owner
Definition packets_gen.h:406
packet_city_short_info::id
int id
Definition packets_gen.h:404
packet_city_short_info::city_image
int city_image
Definition packets_gen.h:414
packet_city_short_info::happy
bool happy
Definition packets_gen.h:412
packet_city_short_info::unhappy
bool unhappy
Definition packets_gen.h:413
packet_city_short_info::tile
int tile
Definition packets_gen.h:405
packet_city_short_info::occupied
bool occupied
Definition packets_gen.h:410
packet_city_short_info::name
char name[MAX_LEN_CITYNAME]
Definition packets_gen.h:416
packet_city_update_counters
Definition packets_gen.h:397
packet_city_update_counters::count
int count
Definition packets_gen.h:399
packet_city_update_counters::counters
int counters[MAX_COUNTERS]
Definition packets_gen.h:400
packet_city_update_counters::city
int city
Definition packets_gen.h:398
packet_client_info
Definition packets_gen.h:885
packet_conn_info
Definition packets_gen.h:855
packet_early_chat_msg
Definition packets_gen.h:307
packet_early_chat_msg::event
enum event_type event
Definition packets_gen.h:310
packet_early_chat_msg::message
char message[MAX_LEN_MSG]
Definition packets_gen.h:308
packet_early_chat_msg::phase
int phase
Definition packets_gen.h:312
packet_early_chat_msg::conn_id
int conn_id
Definition packets_gen.h:313
packet_early_chat_msg::turn
int turn
Definition packets_gen.h:311
packet_early_chat_msg::tile
int tile
Definition packets_gen.h:309
packet_edit_startpos_full
Definition packets_gen.h:1703
packet_edit_startpos_full::id
int id
Definition packets_gen.h:1704
packet_edit_startpos
Definition packets_gen.h:1697
packet_edit_startpos::removal
bool removal
Definition packets_gen.h:1699
packet_edit_startpos::tag
int tag
Definition packets_gen.h:1700
packet_edit_startpos::id
int id
Definition packets_gen.h:1698
packet_endgame_player
Definition packets_gen.h:95
packet_endgame_player::winner
bool winner
Definition packets_gen.h:100
packet_endgame_player::player_id
int player_id
Definition packets_gen.h:97
packet_endgame_report
Definition packets_gen.h:89
packet_game_info
Definition packets_gen.h:120
packet_game_info::aifill
int aifill
Definition packets_gen.h:122
packet_game_info::government_during_revolution_id
Government_type_id government_during_revolution_id
Definition packets_gen.h:177
packet_game_info::citizen_nationality
bool citizen_nationality
Definition packets_gen.h:146
packet_game_info::init_city_radius_sq
int init_city_radius_sq
Definition packets_gen.h:190
packet_game_info::is_edit_mode
bool is_edit_mode
Definition packets_gen.h:191
packet_game_info::fragment_count
int fragment_count
Definition packets_gen.h:252
packet_game_info::skill_level
enum ai_level skill_level
Definition packets_gen.h:228
packet_game_info::phase_mode
enum phase_mode_type phase_mode
Definition packets_gen.h:213
packet_game_info::turn
int turn
Definition packets_gen.h:247
packet_game_info::year
int year
Definition packets_gen.h:249
packet_game_info::phase
int phase
Definition packets_gen.h:212
packet_game_info::victory_conditions
enum victory_condition_type victory_conditions
Definition packets_gen.h:229
packet_game_info::default_government_id
Government_type_id default_government_id
Definition packets_gen.h:176
packet_investigate_finished
Definition packets_gen.h:41
packet_investigate_started
Definition packets_gen.h:36
packet_investigate_started::city_id
int city_id
Definition packets_gen.h:38
packet_map_info
Definition packets_gen.h:273
packet_map_info::wrap_id
int wrap_id
Definition packets_gen.h:277
packet_map_info::south_latitude
int south_latitude
Definition packets_gen.h:279
packet_map_info::ysize
int ysize
Definition packets_gen.h:275
packet_map_info::topology_id
int topology_id
Definition packets_gen.h:276
packet_map_info::xsize
int xsize
Definition packets_gen.h:274
packet_map_info::north_latitude
int north_latitude
Definition packets_gen.h:278
packet_map_info::altitude_info
bool altitude_info
Definition packets_gen.h:280
packet_player_attribute_chunk
Definition packets_gen.h:589
packet_player_attribute_chunk::chunk_length
int chunk_length
Definition packets_gen.h:592
packet_player_attribute_chunk::total_length
int total_length
Definition packets_gen.h:591
packet_player_attribute_chunk::offset
int offset
Definition packets_gen.h:590
packet_player_diplstate
Definition packets_gen.h:596
packet_player_diplstate::plr1
int plr1
Definition packets_gen.h:598
packet_player_diplstate::type
enum diplstate_type type
Definition packets_gen.h:600
packet_player_diplstate::has_reason_to_cancel
int has_reason_to_cancel
Definition packets_gen.h:602
packet_player_diplstate::turns_left
int turns_left
Definition packets_gen.h:601
packet_player_diplstate::plr2
int plr2
Definition packets_gen.h:599
packet_player_diplstate::contact_turns_left
int contact_turns_left
Definition packets_gen.h:603
packet_player_info
Definition packets_gen.h:515
packet_research_info
Definition packets_gen.h:611
packet_research_info::tech_goal
int tech_goal
Definition packets_gen.h:618
packet_research_info::researching
int researching
Definition packets_gen.h:615
packet_research_info::inventions
char inventions[A_LAST+1]
Definition packets_gen.h:620
packet_research_info::techs_researched
int techs_researched
Definition packets_gen.h:613
packet_research_info::id
int id
Definition packets_gen.h:612
packet_research_info::future_tech
int future_tech
Definition packets_gen.h:614
packet_research_info::bulbs_researched
int bulbs_researched
Definition packets_gen.h:617
packet_research_info::researching_cost
int researching_cost
Definition packets_gen.h:616
packet_research_info::total_bulbs_prod
int total_bulbs_prod
Definition packets_gen.h:619
packet_ruleset_achievement
Definition packets_gen.h:1364
packet_ruleset_achievement::id
int id
Definition packets_gen.h:1365
packet_ruleset_achievement::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1367
packet_ruleset_achievement::unique
bool unique
Definition packets_gen.h:1369
packet_ruleset_achievement::value
int value
Definition packets_gen.h:1370
packet_ruleset_achievement::type
enum achievement_type type
Definition packets_gen.h:1368
packet_ruleset_achievement::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1366
packet_ruleset_action_auto
Definition packets_gen.h:1403
packet_ruleset_action_auto::id
int id
Definition packets_gen.h:1404
packet_ruleset_action_auto::alternatives
action_id alternatives[MAX_NUM_ACTIONS]
Definition packets_gen.h:1409
packet_ruleset_action_auto::reqs_count
int reqs_count
Definition packets_gen.h:1406
packet_ruleset_action_auto::reqs
struct requirement reqs[MAX_NUM_REQS]
Definition packets_gen.h:1407
packet_ruleset_action_auto::alternatives_count
int alternatives_count
Definition packets_gen.h:1408
packet_ruleset_action_auto::cause
enum action_auto_perf_cause cause
Definition packets_gen.h:1405
packet_ruleset_action_enabler
Definition packets_gen.h:1395
packet_ruleset_action_enabler::enabled_action
action_id enabled_action
Definition packets_gen.h:1396
packet_ruleset_action_enabler::actor_reqs_count
int actor_reqs_count
Definition packets_gen.h:1397
packet_ruleset_action_enabler::actor_reqs
struct requirement actor_reqs[MAX_NUM_REQS]
Definition packets_gen.h:1398
packet_ruleset_action_enabler::target_reqs
struct requirement target_reqs[MAX_NUM_REQS]
Definition packets_gen.h:1400
packet_ruleset_action_enabler::target_reqs_count
int target_reqs_count
Definition packets_gen.h:1399
packet_ruleset_action
Definition packets_gen.h:1380
packet_ruleset_action::quiet
bool quiet
Definition packets_gen.h:1383
packet_ruleset_action::sub_tgt_kind
enum action_sub_target_kind sub_tgt_kind
Definition packets_gen.h:1389
packet_ruleset_action::act_kind
enum action_actor_kind act_kind
Definition packets_gen.h:1387
packet_ruleset_action::actor_consuming_always
bool actor_consuming_always
Definition packets_gen.h:1386
packet_ruleset_action::blocked_by
bv_actions blocked_by
Definition packets_gen.h:1392
packet_ruleset_action::max_distance
int max_distance
Definition packets_gen.h:1391
packet_ruleset_action::id
action_id id
Definition packets_gen.h:1381
packet_ruleset_action::min_distance
int min_distance
Definition packets_gen.h:1390
packet_ruleset_action::sub_results
bv_action_sub_results sub_results
Definition packets_gen.h:1385
packet_ruleset_action::ui_name
char ui_name[MAX_LEN_NAME]
Definition packets_gen.h:1382
packet_ruleset_action::tgt_kind
enum action_target_kind tgt_kind
Definition packets_gen.h:1388
packet_ruleset_action::result
enum action_result result
Definition packets_gen.h:1384
packet_ruleset_base
Definition packets_gen.h:1317
packet_ruleset_base::vision_subs_sq
int vision_subs_sq
Definition packets_gen.h:1323
packet_ruleset_base::vision_invis_sq
int vision_invis_sq
Definition packets_gen.h:1322
packet_ruleset_base::border_sq
int border_sq
Definition packets_gen.h:1320
packet_ruleset_base::vision_main_sq
int vision_main_sq
Definition packets_gen.h:1321
packet_ruleset_base::gui_type
enum base_gui_type gui_type
Definition packets_gen.h:1319
packet_ruleset_base::id
int id
Definition packets_gen.h:1318
packet_ruleset_building
Definition packets_gen.h:1182
packet_ruleset_building::flags
bv_impr_flags flags
Definition packets_gen.h:1197
packet_ruleset_building::id
Impr_type_id id
Definition packets_gen.h:1183
packet_ruleset_building::helptext
struct strvec * helptext
Definition packets_gen.h:1201
packet_ruleset_building::build_cost
int build_cost
Definition packets_gen.h:1194
packet_ruleset_building::obs_reqs
struct requirement obs_reqs[MAX_NUM_REQS]
Definition packets_gen.h:1193
packet_ruleset_building::upkeep
int upkeep
Definition packets_gen.h:1195
packet_ruleset_building::soundtag_alt
char soundtag_alt[MAX_LEN_NAME]
Definition packets_gen.h:1199
packet_ruleset_building::reqs_count
int reqs_count
Definition packets_gen.h:1190
packet_ruleset_building::reqs
struct requirement reqs[MAX_NUM_REQS]
Definition packets_gen.h:1191
packet_ruleset_building::genus
enum impr_genus_id genus
Definition packets_gen.h:1184
packet_ruleset_building::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1185
packet_ruleset_building::soundtag
char soundtag[MAX_LEN_NAME]
Definition packets_gen.h:1198
packet_ruleset_building::sabotage
int sabotage
Definition packets_gen.h:1196
packet_ruleset_building::soundtag_alt2
char soundtag_alt2[MAX_LEN_NAME]
Definition packets_gen.h:1200
packet_ruleset_building::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1186
packet_ruleset_building::obs_count
int obs_count
Definition packets_gen.h:1192
packet_ruleset_building::graphic_alt2
char graphic_alt2[MAX_LEN_NAME]
Definition packets_gen.h:1189
packet_ruleset_building::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition packets_gen.h:1187
packet_ruleset_building::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition packets_gen.h:1188
packet_ruleset_city
Definition packets_gen.h:1171
packet_ruleset_city::citizens_graphic
char citizens_graphic[MAX_LEN_NAME]
Definition packets_gen.h:1175
packet_ruleset_city::style_id
int style_id
Definition packets_gen.h:1172
packet_ruleset_city::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1173
packet_ruleset_city::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1174
packet_ruleset_city::reqs_count
int reqs_count
Definition packets_gen.h:1176
packet_ruleset_city::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition packets_gen.h:1179
packet_ruleset_city::graphic
char graphic[MAX_LEN_NAME]
Definition packets_gen.h:1178
packet_ruleset_city::reqs
struct requirement reqs[MAX_NUM_REQS]
Definition packets_gen.h:1177
packet_ruleset_clause
Definition packets_gen.h:1446
packet_ruleset_clause::type
enum clause_type type
Definition packets_gen.h:1447
packet_ruleset_clause::either_reqs_count
int either_reqs_count
Definition packets_gen.h:1453
packet_ruleset_clause::either_reqs
struct requirement either_reqs[MAX_NUM_REQS]
Definition packets_gen.h:1454
packet_ruleset_clause::receiver_reqs
struct requirement receiver_reqs[MAX_NUM_REQS]
Definition packets_gen.h:1452
packet_ruleset_clause::receiver_reqs_count
int receiver_reqs_count
Definition packets_gen.h:1451
packet_ruleset_clause::giver_reqs_count
int giver_reqs_count
Definition packets_gen.h:1449
packet_ruleset_clause::enabled
bool enabled
Definition packets_gen.h:1448
packet_ruleset_clause::giver_reqs
struct requirement giver_reqs[MAX_NUM_REQS]
Definition packets_gen.h:1450
packet_ruleset_control
Definition packets_gen.h:1457
packet_ruleset_control::preferred_soundset
char preferred_soundset[MAX_LEN_NAME]
Definition packets_gen.h:1481
packet_ruleset_control::num_styles
int num_styles
Definition packets_gen.h:1471
packet_ruleset_control::nation_count
int nation_count
Definition packets_gen.h:1474
packet_ruleset_control::preferred_tileset
char preferred_tileset[MAX_LEN_NAME]
Definition packets_gen.h:1480
packet_ruleset_control::num_music_styles
int num_music_styles
Definition packets_gen.h:1472
packet_ruleset_control::government_count
int government_count
Definition packets_gen.h:1473
packet_ruleset_control::num_achievement_types
int num_achievement_types
Definition packets_gen.h:1469
packet_ruleset_control::preferred_musicset
char preferred_musicset[MAX_LEN_NAME]
Definition packets_gen.h:1482
packet_ruleset_control::num_tech_classes
int num_tech_classes
Definition packets_gen.h:1461
packet_ruleset_control::num_city_styles
int num_city_styles
Definition packets_gen.h:1475
packet_ruleset_control::num_multipliers
int num_multipliers
Definition packets_gen.h:1470
packet_ruleset_control::desc_length
int desc_length
Definition packets_gen.h:1487
packet_ruleset_counter
Definition packets_gen.h:1412
packet_ruleset_counter::checkpoint
int checkpoint
Definition packets_gen.h:1417
packet_ruleset_counter::behaviour
enum counter_behaviour behaviour
Definition packets_gen.h:1419
packet_ruleset_counter::type
enum counter_target type
Definition packets_gen.h:1418
packet_ruleset_counter::helptext
struct strvec * helptext
Definition packets_gen.h:1415
packet_ruleset_counter::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1413
packet_ruleset_counter::def
int def
Definition packets_gen.h:1416
packet_ruleset_counter::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1414
packet_ruleset_description_part
Definition packets_gen.h:1495
packet_ruleset_description_part::text
char text[MAX_LEN_CONTENT]
Definition packets_gen.h:1496
packet_ruleset_disaster
Definition packets_gen.h:1354
packet_ruleset_disaster::frequency
int frequency
Definition packets_gen.h:1360
packet_ruleset_disaster::id
int id
Definition packets_gen.h:1355
packet_ruleset_disaster::reqs_count
int reqs_count
Definition packets_gen.h:1358
packet_ruleset_disaster::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1357
packet_ruleset_disaster::reqs
struct requirement reqs[MAX_NUM_REQS]
Definition packets_gen.h:1359
packet_ruleset_disaster::effects
bv_disaster_effects effects
Definition packets_gen.h:1361
packet_ruleset_disaster::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1356
packet_ruleset_effect
Definition packets_gen.h:1598
packet_ruleset_extra_flag
Definition packets_gen.h:1311
packet_ruleset_extra_flag::helptxt
char helptxt[MAX_LEN_PACKET]
Definition packets_gen.h:1314
packet_ruleset_extra_flag::id
int id
Definition packets_gen.h:1312
packet_ruleset_extra_flag::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1313
packet_ruleset_extra
Definition packets_gen.h:1267
packet_ruleset_extra::id
int id
Definition packets_gen.h:1268
packet_ruleset_extra::removal_time
int removal_time
Definition packets_gen.h:1297
packet_ruleset_extra::defense_bonus
int defense_bonus
Definition packets_gen.h:1300
packet_ruleset_extra::infracost
int infracost
Definition packets_gen.h:1299
packet_ruleset_extra::native_to
bv_unit_classes native_to
Definition packets_gen.h:1302
packet_ruleset_extra::appearance_reqs_count
int appearance_reqs_count
Definition packets_gen.h:1287
packet_ruleset_extra::build_time_factor
int build_time_factor
Definition packets_gen.h:1296
packet_ruleset_extra::rmact_gfx_alt2
char rmact_gfx_alt2[MAX_LEN_NAME]
Definition packets_gen.h:1279
packet_ruleset_extra::reqs
struct requirement reqs[MAX_NUM_REQS]
Definition packets_gen.h:1283
packet_ruleset_extra::generated
bool generated
Definition packets_gen.h:1294
packet_ruleset_extra::disappearance_reqs_count
int disappearance_reqs_count
Definition packets_gen.h:1290
packet_ruleset_extra::appearance_chance
int appearance_chance
Definition packets_gen.h:1286
packet_ruleset_extra::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition packets_gen.h:1281
packet_ruleset_extra::rmcauses
bv_rmcauses rmcauses
Definition packets_gen.h:1273
packet_ruleset_extra::act_gfx_alt2
char act_gfx_alt2[MAX_LEN_NAME]
Definition packets_gen.h:1276
packet_ruleset_extra::removal_time_factor
int removal_time_factor
Definition packets_gen.h:1298
packet_ruleset_extra::reqs_count
int reqs_count
Definition packets_gen.h:1282
packet_ruleset_extra::buildable
bool buildable
Definition packets_gen.h:1293
packet_ruleset_extra::disappearance_reqs
struct requirement disappearance_reqs[MAX_NUM_REQS]
Definition packets_gen.h:1291
packet_ruleset_extra::flags
bv_extra_flags flags
Definition packets_gen.h:1303
packet_ruleset_extra::act_gfx_alt
char act_gfx_alt[MAX_LEN_NAME]
Definition packets_gen.h:1275
packet_ruleset_extra::hidden_by
bv_extras hidden_by
Definition packets_gen.h:1304
packet_ruleset_extra::activity_gfx
char activity_gfx[MAX_LEN_NAME]
Definition packets_gen.h:1274
packet_ruleset_extra::build_time
int build_time
Definition packets_gen.h:1295
packet_ruleset_extra::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1270
packet_ruleset_extra::eus
enum extra_unit_seen_type eus
Definition packets_gen.h:1301
packet_ruleset_extra::appearance_reqs
struct requirement appearance_reqs[MAX_NUM_REQS]
Definition packets_gen.h:1288
packet_ruleset_extra::category
int category
Definition packets_gen.h:1271
packet_ruleset_extra::disappearance_chance
int disappearance_chance
Definition packets_gen.h:1289
packet_ruleset_extra::rmreqs_count
int rmreqs_count
Definition packets_gen.h:1284
packet_ruleset_extra::bridged_over
bv_extras bridged_over
Definition packets_gen.h:1305
packet_ruleset_extra::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1269
packet_ruleset_extra::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition packets_gen.h:1280
packet_ruleset_extra::no_aggr_near_city
int no_aggr_near_city
Definition packets_gen.h:1307
packet_ruleset_extra::rmact_gfx_alt
char rmact_gfx_alt[MAX_LEN_NAME]
Definition packets_gen.h:1278
packet_ruleset_extra::rmact_gfx
char rmact_gfx[MAX_LEN_NAME]
Definition packets_gen.h:1277
packet_ruleset_extra::helptext
struct strvec * helptext
Definition packets_gen.h:1308
packet_ruleset_extra::conflicts
bv_extras conflicts
Definition packets_gen.h:1306
packet_ruleset_extra::rmreqs
struct requirement rmreqs[MAX_NUM_REQS]
Definition packets_gen.h:1285
packet_ruleset_extra::visibility_req
int visibility_req
Definition packets_gen.h:1292
packet_ruleset_extra::causes
bv_causes causes
Definition packets_gen.h:1272
packet_ruleset_game
Definition packets_gen.h:1022
packet_ruleset_game::work_raise_chance
int work_raise_chance[MAX_VET_LEVELS]
Definition packets_gen.h:1033
packet_ruleset_game::base_raise_chance
int base_raise_chance[MAX_VET_LEVELS]
Definition packets_gen.h:1032
packet_ruleset_game::global_init_techs
int global_init_techs[MAX_NUM_TECH_LIST]
Definition packets_gen.h:1025
packet_ruleset_game::veteran_levels
int veteran_levels
Definition packets_gen.h:1028
packet_ruleset_game::move_bonus
int move_bonus[MAX_VET_LEVELS]
Definition packets_gen.h:1031
packet_ruleset_game::background_red
int background_red
Definition packets_gen.h:1034
packet_ruleset_game::veteran_name
char veteran_name[MAX_VET_LEVELS][MAX_LEN_NAME]
Definition packets_gen.h:1029
packet_ruleset_game::global_init_buildings
Impr_type_id global_init_buildings[MAX_NUM_BUILDING_LIST]
Definition packets_gen.h:1027
packet_ruleset_game::default_specialist
int default_specialist
Definition packets_gen.h:1023
packet_ruleset_game::background_green
int background_green
Definition packets_gen.h:1035
packet_ruleset_game::power_fact
int power_fact[MAX_VET_LEVELS]
Definition packets_gen.h:1030
packet_ruleset_game::background_blue
int background_blue
Definition packets_gen.h:1036
packet_ruleset_goods
Definition packets_gen.h:1341
packet_ruleset_goods::helptext
struct strvec * helptext
Definition packets_gen.h:1351
packet_ruleset_goods::flags
bv_goods_flags flags
Definition packets_gen.h:1350
packet_ruleset_goods::from_pct
int from_pct
Definition packets_gen.h:1347
packet_ruleset_goods::onetime_pct
int onetime_pct
Definition packets_gen.h:1349
packet_ruleset_goods::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1343
packet_ruleset_goods::reqs_count
int reqs_count
Definition packets_gen.h:1345
packet_ruleset_goods::to_pct
int to_pct
Definition packets_gen.h:1348
packet_ruleset_goods::id
int id
Definition packets_gen.h:1342
packet_ruleset_goods::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1344
packet_ruleset_goods::reqs
struct requirement reqs[MAX_NUM_REQS]
Definition packets_gen.h:1346
packet_ruleset_government_ruler_title
Definition packets_gen.h:1051
packet_ruleset_government_ruler_title::nation
Nation_type_id nation
Definition packets_gen.h:1053
packet_ruleset_government_ruler_title::female_title
char female_title[MAX_LEN_NAME]
Definition packets_gen.h:1055
packet_ruleset_government_ruler_title::gov
Government_type_id gov
Definition packets_gen.h:1052
packet_ruleset_government_ruler_title::male_title
char male_title[MAX_LEN_NAME]
Definition packets_gen.h:1054
packet_ruleset_government
Definition packets_gen.h:1088
packet_ruleset_government::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition packets_gen.h:1095
packet_ruleset_government::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1093
packet_ruleset_government::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1092
packet_ruleset_government::id
Government_type_id id
Definition packets_gen.h:1089
packet_ruleset_government::helptext
struct strvec * helptext
Definition packets_gen.h:1096
packet_ruleset_government::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition packets_gen.h:1094
packet_ruleset_government::reqs_count
int reqs_count
Definition packets_gen.h:1090
packet_ruleset_government::reqs
struct requirement reqs[MAX_NUM_REQS]
Definition packets_gen.h:1091
packet_ruleset_impr_flag
Definition packets_gen.h:1204
packet_ruleset_impr_flag::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1206
packet_ruleset_impr_flag::helptxt
char helptxt[MAX_LEN_PACKET]
Definition packets_gen.h:1207
packet_ruleset_impr_flag::id
int id
Definition packets_gen.h:1205
packet_ruleset_multiplier
Definition packets_gen.h:1430
packet_ruleset_multiplier::stop
int stop
Definition packets_gen.h:1433
packet_ruleset_multiplier::step
int step
Definition packets_gen.h:1434
packet_ruleset_multiplier::helptext
struct strvec * helptext
Definition packets_gen.h:1443
packet_ruleset_multiplier::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1439
packet_ruleset_multiplier::id
Multiplier_type_id id
Definition packets_gen.h:1431
packet_ruleset_multiplier::offset
int offset
Definition packets_gen.h:1436
packet_ruleset_multiplier::reqs
struct requirement reqs[MAX_NUM_REQS]
Definition packets_gen.h:1442
packet_ruleset_multiplier::def
int def
Definition packets_gen.h:1435
packet_ruleset_multiplier::start
int start
Definition packets_gen.h:1432
packet_ruleset_multiplier::minimum_turns
int minimum_turns
Definition packets_gen.h:1438
packet_ruleset_multiplier::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1440
packet_ruleset_multiplier::factor
int factor
Definition packets_gen.h:1437
packet_ruleset_multiplier::reqs_count
int reqs_count
Definition packets_gen.h:1441
packet_ruleset_music
Definition packets_gen.h:1422
packet_ruleset_music::music_combat
char music_combat[MAX_LEN_NAME]
Definition packets_gen.h:1425
packet_ruleset_music::id
int id
Definition packets_gen.h:1423
packet_ruleset_music::reqs
struct requirement reqs[MAX_NUM_REQS]
Definition packets_gen.h:1427
packet_ruleset_music::reqs_count
int reqs_count
Definition packets_gen.h:1426
packet_ruleset_music::music_peaceful
char music_peaceful[MAX_LEN_NAME]
Definition packets_gen.h:1424
packet_ruleset_nation_groups
Definition packets_gen.h:1125
packet_ruleset_nation_groups::ngroups
int ngroups
Definition packets_gen.h:1126
packet_ruleset_nation_groups::groups
char groups[MAX_NUM_NATION_GROUPS][MAX_LEN_NAME]
Definition packets_gen.h:1127
packet_ruleset_nation_groups::hidden
bool hidden[MAX_NUM_NATION_GROUPS]
Definition packets_gen.h:1128
packet_ruleset_nation_sets
Definition packets_gen.h:1118
packet_ruleset_nation_sets::rule_names
char rule_names[MAX_NUM_NATION_SETS][MAX_LEN_NAME]
Definition packets_gen.h:1121
packet_ruleset_nation_sets::names
char names[MAX_NUM_NATION_SETS][MAX_LEN_NAME]
Definition packets_gen.h:1120
packet_ruleset_nation_sets::nsets
int nsets
Definition packets_gen.h:1119
packet_ruleset_nation_sets::descriptions
char descriptions[MAX_NUM_NATION_SETS][MAX_LEN_MSG]
Definition packets_gen.h:1122
packet_ruleset_nation
Definition packets_gen.h:1131
packet_ruleset_nation::ngroups
int ngroups
Definition packets_gen.h:1148
packet_ruleset_nation::init_techs
int init_techs[MAX_NUM_TECH_LIST]
Definition packets_gen.h:1152
packet_ruleset_nation::leader_name
char leader_name[MAX_NUM_LEADERS][MAX_LEN_NAME]
Definition packets_gen.h:1142
packet_ruleset_nation::style
int style
Definition packets_gen.h:1140
packet_ruleset_nation::is_playable
bool is_playable
Definition packets_gen.h:1144
packet_ruleset_nation::id
Nation_type_id id
Definition packets_gen.h:1132
packet_ruleset_nation::noun_plural
char noun_plural[MAX_LEN_NAME]
Definition packets_gen.h:1136
packet_ruleset_nation::adjective
char adjective[MAX_LEN_NAME]
Definition packets_gen.h:1134
packet_ruleset_nation::init_buildings
Impr_type_id init_buildings[MAX_NUM_BUILDING_LIST]
Definition packets_gen.h:1156
packet_ruleset_nation::init_units
Unit_type_id init_units[MAX_NUM_UNIT_LIST]
Definition packets_gen.h:1154
packet_ruleset_nation::leader_is_male
bool leader_is_male[MAX_NUM_LEADERS]
Definition packets_gen.h:1143
packet_ruleset_nation::translation_domain
char translation_domain[MAX_LEN_NAME]
Definition packets_gen.h:1133
packet_ruleset_nation::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition packets_gen.h:1137
packet_ruleset_nation::init_government_id
Government_type_id init_government_id
Definition packets_gen.h:1150
packet_ruleset_nation::leader_count
int leader_count
Definition packets_gen.h:1141
packet_ruleset_nation::groups
int groups[MAX_NUM_NATION_GROUPS]
Definition packets_gen.h:1149
packet_ruleset_nation::barbarian_type
enum barbarian_type barbarian_type
Definition packets_gen.h:1145
packet_ruleset_nation::sets
int sets[MAX_NUM_NATION_SETS]
Definition packets_gen.h:1147
packet_ruleset_nation::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition packets_gen.h:1138
packet_ruleset_nation::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1135
packet_ruleset_nation::legend
char legend[MAX_LEN_MSG]
Definition packets_gen.h:1139
packet_ruleset_nation::nsets
int nsets
Definition packets_gen.h:1146
packet_ruleset_resource
Definition packets_gen.h:1607
packet_ruleset_resource::id
int id
Definition packets_gen.h:1608
packet_ruleset_resource::output
int output[O_LAST]
Definition packets_gen.h:1609
packet_ruleset_road
Definition packets_gen.h:1326
packet_ruleset_road::flags
bv_road_flags flags
Definition packets_gen.h:1338
packet_ruleset_road::tile_incr_const
int tile_incr_const[O_LAST]
Definition packets_gen.h:1333
packet_ruleset_road::gui_type
enum road_gui_type gui_type
Definition packets_gen.h:1328
packet_ruleset_road::integrates
bv_max_extras integrates
Definition packets_gen.h:1337
packet_ruleset_road::move_cost
int move_cost
Definition packets_gen.h:1331
packet_ruleset_road::compat
enum road_compat compat
Definition packets_gen.h:1336
packet_ruleset_road::move_mode
enum road_move_mode move_mode
Definition packets_gen.h:1332
packet_ruleset_road::first_reqs_count
int first_reqs_count
Definition packets_gen.h:1329
packet_ruleset_road::tile_bonus
int tile_bonus[O_LAST]
Definition packets_gen.h:1335
packet_ruleset_road::tile_incr
int tile_incr[O_LAST]
Definition packets_gen.h:1334
packet_ruleset_road::id
int id
Definition packets_gen.h:1327
packet_ruleset_road::first_reqs
struct requirement first_reqs[MAX_NUM_REQS]
Definition packets_gen.h:1330
packet_ruleset_specialist
Definition packets_gen.h:1039
packet_ruleset_specialist::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1042
packet_ruleset_specialist::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition packets_gen.h:1045
packet_ruleset_specialist::reqs
struct requirement reqs[MAX_NUM_REQS]
Definition packets_gen.h:1047
packet_ruleset_specialist::id
Specialist_type_id id
Definition packets_gen.h:1040
packet_ruleset_specialist::reqs_count
int reqs_count
Definition packets_gen.h:1046
packet_ruleset_specialist::short_name
char short_name[MAX_LEN_NAME]
Definition packets_gen.h:1043
packet_ruleset_specialist::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition packets_gen.h:1044
packet_ruleset_specialist::plural_name
char plural_name[MAX_LEN_NAME]
Definition packets_gen.h:1041
packet_ruleset_specialist::helptext
struct strvec * helptext
Definition packets_gen.h:1048
packet_ruleset_style
Definition packets_gen.h:1165
packet_ruleset_style::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1167
packet_ruleset_style::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1168
packet_ruleset_style::id
int id
Definition packets_gen.h:1166
packet_ruleset_summary
Definition packets_gen.h:1491
packet_ruleset_summary::text
char text[MAX_LEN_CONTENT]
Definition packets_gen.h:1492
packet_ruleset_tech_class
Definition packets_gen.h:1075
packet_ruleset_tech_class::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1077
packet_ruleset_tech_class::id
int id
Definition packets_gen.h:1076
packet_ruleset_tech_class::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1078
packet_ruleset_tech_class::cost_pct
int cost_pct
Definition packets_gen.h:1079
packet_ruleset_tech_flag
Definition packets_gen.h:1082
packet_ruleset_tech_flag::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1084
packet_ruleset_tech_flag::id
int id
Definition packets_gen.h:1083
packet_ruleset_tech_flag::helptxt
char helptxt[MAX_LEN_PACKET]
Definition packets_gen.h:1085
packet_ruleset_tech
Definition packets_gen.h:1058
packet_ruleset_tech::research_reqs_count
int research_reqs_count
Definition packets_gen.h:1061
packet_ruleset_tech::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1068
packet_ruleset_tech::removed
bool removed
Definition packets_gen.h:1064
packet_ruleset_tech::research_reqs
struct requirement research_reqs[MAX_NUM_REQS]
Definition packets_gen.h:1062
packet_ruleset_tech::id
int id
Definition packets_gen.h:1059
packet_ruleset_tech::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition packets_gen.h:1071
packet_ruleset_tech::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1069
packet_ruleset_tech::num_reqs
int num_reqs
Definition packets_gen.h:1067
packet_ruleset_tech::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition packets_gen.h:1072
packet_ruleset_tech::flags
bv_tech_flags flags
Definition packets_gen.h:1065
packet_ruleset_tech::helptext
struct strvec * helptext
Definition packets_gen.h:1070
packet_ruleset_tech::tclass
int tclass
Definition packets_gen.h:1063
packet_ruleset_tech::root_req
int root_req
Definition packets_gen.h:1060
packet_ruleset_tech::cost
float cost
Definition packets_gen.h:1066
packet_ruleset_terrain_control
Definition packets_gen.h:1099
packet_ruleset_terrain_flag
Definition packets_gen.h:1250
packet_ruleset_terrain_flag::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1252
packet_ruleset_terrain_flag::id
int id
Definition packets_gen.h:1251
packet_ruleset_terrain_flag::helptxt
char helptxt[MAX_LEN_PACKET]
Definition packets_gen.h:1253
packet_ruleset_terrain
Definition packets_gen.h:1210
packet_ruleset_terrain::extra_removal_times
int extra_removal_times[MAX_EXTRA_TYPES]
Definition packets_gen.h:1243
packet_ruleset_terrain::cultivate_time
int cultivate_time
Definition packets_gen.h:1230
packet_ruleset_terrain::irrigation_food_incr
int irrigation_food_incr
Definition packets_gen.h:1233
packet_ruleset_terrain::base_time
int base_time
Definition packets_gen.h:1227
packet_ruleset_terrain::transform_result
Terrain_type_id transform_result
Definition packets_gen.h:1238
packet_ruleset_terrain::tclass
int tclass
Definition packets_gen.h:1212
packet_ruleset_terrain::extra_count
int extra_count
Definition packets_gen.h:1242
packet_ruleset_terrain::mining_shield_incr
int mining_shield_incr
Definition packets_gen.h:1235
packet_ruleset_terrain::resource_freq
int resource_freq[MAX_EXTRA_TYPES]
Definition packets_gen.h:1225
packet_ruleset_terrain::resources
Resource_type_id resources[MAX_EXTRA_TYPES]
Definition packets_gen.h:1224
packet_ruleset_terrain::irrigation_time
int irrigation_time
Definition packets_gen.h:1234
packet_ruleset_terrain::placing_time
int placing_time
Definition packets_gen.h:1240
packet_ruleset_terrain::flags
bv_terrain_flags flags
Definition packets_gen.h:1213
packet_ruleset_terrain::transform_time
int transform_time
Definition packets_gen.h:1239
packet_ruleset_terrain::defense_bonus
int defense_bonus
Definition packets_gen.h:1221
packet_ruleset_terrain::plant_time
int plant_time
Definition packets_gen.h:1232
packet_ruleset_terrain::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition packets_gen.h:1217
packet_ruleset_terrain::num_resources
int num_resources
Definition packets_gen.h:1223
packet_ruleset_terrain::output
int output[O_LAST]
Definition packets_gen.h:1222
packet_ruleset_terrain::animal
int animal
Definition packets_gen.h:1237
packet_ruleset_terrain::color_red
int color_red
Definition packets_gen.h:1244
packet_ruleset_terrain::helptext
struct strvec * helptext
Definition packets_gen.h:1247
packet_ruleset_terrain::native_to
bv_unit_classes native_to
Definition packets_gen.h:1214
packet_ruleset_terrain::pillage_time
int pillage_time
Definition packets_gen.h:1241
packet_ruleset_terrain::cultivate_result
Terrain_type_id cultivate_result
Definition packets_gen.h:1229
packet_ruleset_terrain::color_green
int color_green
Definition packets_gen.h:1245
packet_ruleset_terrain::road_time
int road_time
Definition packets_gen.h:1228
packet_ruleset_terrain::plant_result
Terrain_type_id plant_result
Definition packets_gen.h:1231
packet_ruleset_terrain::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1215
packet_ruleset_terrain::road_output_incr_pct
int road_output_incr_pct[O_LAST]
Definition packets_gen.h:1226
packet_ruleset_terrain::movement_cost
int movement_cost
Definition packets_gen.h:1220
packet_ruleset_terrain::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition packets_gen.h:1218
packet_ruleset_terrain::graphic_alt2
char graphic_alt2[MAX_LEN_NAME]
Definition packets_gen.h:1219
packet_ruleset_terrain::mining_time
int mining_time
Definition packets_gen.h:1236
packet_ruleset_terrain::id
Terrain_type_id id
Definition packets_gen.h:1211
packet_ruleset_terrain::color_blue
int color_blue
Definition packets_gen.h:1246
packet_ruleset_terrain::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1216
packet_ruleset_trade
Definition packets_gen.h:1373
packet_ruleset_trade::cancelling
enum trade_route_illegal_cancelling cancelling
Definition packets_gen.h:1376
packet_ruleset_trade::trade_pct
int trade_pct
Definition packets_gen.h:1375
packet_ruleset_trade::id
int id
Definition packets_gen.h:1374
packet_ruleset_trade::bonus_type
enum trade_route_bonus_type bonus_type
Definition packets_gen.h:1377
packet_ruleset_unit_bonus
Definition packets_gen.h:1002
packet_ruleset_unit_bonus::type
enum combat_bonus_type type
Definition packets_gen.h:1005
packet_ruleset_unit_bonus::unit
Unit_type_id unit
Definition packets_gen.h:1003
packet_ruleset_unit_bonus::quiet
bool quiet
Definition packets_gen.h:1007
packet_ruleset_unit_bonus::value
int value
Definition packets_gen.h:1006
packet_ruleset_unit_bonus::flag
enum unit_type_flag_id flag
Definition packets_gen.h:1004
packet_ruleset_unit_class_flag
Definition packets_gen.h:1016
packet_ruleset_unit_class_flag::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1018
packet_ruleset_unit_class_flag::helptxt
char helptxt[MAX_LEN_PACKET]
Definition packets_gen.h:1019
packet_ruleset_unit_class_flag::id
int id
Definition packets_gen.h:1017
packet_ruleset_unit_class
Definition packets_gen.h:1256
packet_ruleset_unit_class::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:1259
packet_ruleset_unit_class::helptext
struct strvec * helptext
Definition packets_gen.h:1264
packet_ruleset_unit_class::flags
bv_unit_class_flags flags
Definition packets_gen.h:1263
packet_ruleset_unit_class::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1258
packet_ruleset_unit_class::non_native_def_pct
int non_native_def_pct
Definition packets_gen.h:1262
packet_ruleset_unit_class::hp_loss_pct
int hp_loss_pct
Definition packets_gen.h:1261
packet_ruleset_unit_class::id
int id
Definition packets_gen.h:1257
packet_ruleset_unit_class::min_speed
int min_speed
Definition packets_gen.h:1260
packet_ruleset_unit_flag
Definition packets_gen.h:1010
packet_ruleset_unit_flag::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:1012
packet_ruleset_unit_flag::id
int id
Definition packets_gen.h:1011
packet_ruleset_unit_flag::helptxt
char helptxt[MAX_LEN_PACKET]
Definition packets_gen.h:1013
packet_ruleset_unit
Definition packets_gen.h:951
packet_ruleset_unit::paratroopers_range
int paratroopers_range
Definition packets_gen.h:980
packet_ruleset_unit::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition packets_gen.h:956
packet_ruleset_unit::vlayer
enum vision_layer vlayer
Definition packets_gen.h:995
packet_ruleset_unit::tp_defense
enum transp_def_type tp_defense
Definition packets_gen.h:990
packet_ruleset_unit::unit_class_id
int unit_class_id
Definition packets_gen.h:962
packet_ruleset_unit::rule_name
char rule_name[MAX_LEN_NAME]
Definition packets_gen.h:954
packet_ruleset_unit::vision_radius_sq
int vision_radius_sq
Definition packets_gen.h:970
packet_ruleset_unit::obsoleted_by
int obsoleted_by
Definition packets_gen.h:974
packet_ruleset_unit::upkeep
int upkeep[O_LAST]
Definition packets_gen.h:979
packet_ruleset_unit::power_fact
int power_fact[MAX_VET_LEVELS]
Definition packets_gen.h:983
packet_ruleset_unit::name
char name[MAX_LEN_NAME]
Definition packets_gen.h:953
packet_ruleset_unit::hp
int hp
Definition packets_gen.h:972
packet_ruleset_unit::pop_cost
int pop_cost
Definition packets_gen.h:964
packet_ruleset_unit::city_slots
int city_slots
Definition packets_gen.h:989
packet_ruleset_unit::graphic_alt2
char graphic_alt2[MAX_LEN_NAME]
Definition packets_gen.h:957
packet_ruleset_unit::firepower
int firepower
Definition packets_gen.h:973
packet_ruleset_unit::fuel
int fuel
Definition packets_gen.h:977
packet_ruleset_unit::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition packets_gen.h:955
packet_ruleset_unit::convert_time
int convert_time
Definition packets_gen.h:976
packet_ruleset_unit::helptext
struct strvec * helptext
Definition packets_gen.h:996
packet_ruleset_unit::sound_fight_alt
char sound_fight_alt[MAX_LEN_NAME]
Definition packets_gen.h:961
packet_ruleset_unit::disembarks
bv_unit_classes disembarks
Definition packets_gen.h:994
packet_ruleset_unit::veteran_levels
int veteran_levels
Definition packets_gen.h:981
packet_ruleset_unit::move_rate
int move_rate
Definition packets_gen.h:967
packet_ruleset_unit::attack_strength
int attack_strength
Definition packets_gen.h:965
packet_ruleset_unit::cargo
bv_unit_classes cargo
Definition packets_gen.h:991
packet_ruleset_unit::build_cost
int build_cost
Definition packets_gen.h:963
packet_ruleset_unit::transport_capacity
int transport_capacity
Definition packets_gen.h:971
packet_ruleset_unit::flags
bv_unit_type_flags flags
Definition packets_gen.h:997
packet_ruleset_unit::sound_move_alt
char sound_move_alt[MAX_LEN_NAME]
Definition packets_gen.h:959
packet_ruleset_unit::happy_cost
int happy_cost
Definition packets_gen.h:978
packet_ruleset_unit::worker
bool worker
Definition packets_gen.h:999
packet_ruleset_unit::targets
bv_unit_classes targets
Definition packets_gen.h:992
packet_ruleset_unit::defense_strength
int defense_strength
Definition packets_gen.h:966
packet_ruleset_unit::build_reqs
struct requirement build_reqs[MAX_NUM_REQS]
Definition packets_gen.h:969
packet_ruleset_unit::base_raise_chance
int base_raise_chance[MAX_VET_LEVELS]
Definition packets_gen.h:985
packet_ruleset_unit::work_raise_chance
int work_raise_chance[MAX_VET_LEVELS]
Definition packets_gen.h:986
packet_ruleset_unit::sound_fight
char sound_fight[MAX_LEN_NAME]
Definition packets_gen.h:960
packet_ruleset_unit::embarks
bv_unit_classes embarks
Definition packets_gen.h:993
packet_ruleset_unit::build_reqs_count
int build_reqs_count
Definition packets_gen.h:968
packet_ruleset_unit::city_size
int city_size
Definition packets_gen.h:988
packet_ruleset_unit::bombard_rate
int bombard_rate
Definition packets_gen.h:987
packet_ruleset_unit::veteran_name
char veteran_name[MAX_VET_LEVELS][MAX_LEN_NAME]
Definition packets_gen.h:982
packet_ruleset_unit::converted_to
int converted_to
Definition packets_gen.h:975
packet_ruleset_unit::sound_move
char sound_move[MAX_LEN_NAME]
Definition packets_gen.h:958
packet_ruleset_unit::roles
bv_unit_type_roles roles
Definition packets_gen.h:998
packet_ruleset_unit::id
Unit_type_id id
Definition packets_gen.h:952
packet_ruleset_unit::move_bonus
int move_bonus[MAX_VET_LEVELS]
Definition packets_gen.h:984
packet_scenario_description::description
char description[MAX_LEN_CONTENT]
Definition packets_gen.h:1630
packet_scenario_info
Definition packets_gen.h:1612
packet_scenario_info::lake_flooding
bool lake_flooding
Definition packets_gen.h:1620
packet_scenario_info::have_resources
bool have_resources
Definition packets_gen.h:1625
packet_scenario_info::is_scenario
bool is_scenario
Definition packets_gen.h:1613
packet_scenario_info::ruleset_locked
bool ruleset_locked
Definition packets_gen.h:1623
packet_scenario_info::allow_ai_type_fallback
bool allow_ai_type_fallback
Definition packets_gen.h:1622
packet_scenario_info::players
bool players
Definition packets_gen.h:1616
packet_scenario_info::authors
char authors[MAX_LEN_PACKET/3]
Definition packets_gen.h:1615
packet_scenario_info::name
char name[256]
Definition packets_gen.h:1614
packet_scenario_info::prevent_new_cities
bool prevent_new_cities
Definition packets_gen.h:1619
packet_scenario_info::handmade
bool handmade
Definition packets_gen.h:1621
packet_scenario_info::startpos_nations
bool startpos_nations
Definition packets_gen.h:1617
packet_scenario_info::save_random
bool save_random
Definition packets_gen.h:1618
packet_spaceship_info
Definition packets_gen.h:930
packet_spaceship_info::sship_state
int sship_state
Definition packets_gen.h:932
packet_spaceship_info::propulsion
int propulsion
Definition packets_gen.h:937
packet_spaceship_info::habitation
int habitation
Definition packets_gen.h:938
packet_spaceship_info::mass
int mass
Definition packets_gen.h:943
packet_spaceship_info::life_support
int life_support
Definition packets_gen.h:939
packet_spaceship_info::structure
bv_spaceship_structure structure
Definition packets_gen.h:944
packet_spaceship_info::structurals
int structurals
Definition packets_gen.h:933
packet_spaceship_info::fuel
int fuel
Definition packets_gen.h:936
packet_spaceship_info::population
int population
Definition packets_gen.h:942
packet_spaceship_info::success_rate
float success_rate
Definition packets_gen.h:947
packet_spaceship_info::player_num
int player_num
Definition packets_gen.h:931
packet_spaceship_info::launch_year
int launch_year
Definition packets_gen.h:941
packet_spaceship_info::travel_time
float travel_time
Definition packets_gen.h:948
packet_spaceship_info::energy_rate
float energy_rate
Definition packets_gen.h:946
packet_spaceship_info::solar_panels
int solar_panels
Definition packets_gen.h:940
packet_spaceship_info::support_rate
float support_rate
Definition packets_gen.h:945
packet_spaceship_info::modules
int modules
Definition packets_gen.h:935
packet_spaceship_info::components
int components
Definition packets_gen.h:934
packet_tile_info
Definition packets_gen.h:103
packet_tile_info::resource
Resource_type_id resource
Definition packets_gen.h:111
packet_tile_info::extras
bv_extras extras
Definition packets_gen.h:112
packet_tile_info::place_turn
int place_turn
Definition packets_gen.h:114
packet_tile_info::placing
int placing
Definition packets_gen.h:113
packet_tile_info::owner
int owner
Definition packets_gen.h:107
packet_tile_info::known
enum known_type known
Definition packets_gen.h:106
packet_tile_info::label
char label[MAX_LEN_MAP_LABEL]
Definition packets_gen.h:117
packet_tile_info::extras_owner
int extras_owner
Definition packets_gen.h:108
packet_tile_info::tile
int tile
Definition packets_gen.h:104
packet_tile_info::continent
Continent_id continent
Definition packets_gen.h:105
packet_tile_info::terrain
Terrain_type_id terrain
Definition packets_gen.h:110
packet_tile_info::worked
int worked
Definition packets_gen.h:109
packet_tile_info::altitude
int altitude
Definition packets_gen.h:115
packet_tile_info::spec_sprite
char spec_sprite[MAX_LEN_NAME]
Definition packets_gen.h:116
packet_timeout_info::last_turn_change_time
float last_turn_change_time
Definition packets_gen.h:270
packet_trade_route_info
Definition packets_gen.h:419
packet_trade_route_info::city
int city
Definition packets_gen.h:420
packet_trade_route_info::value
int value
Definition packets_gen.h:423
packet_trade_route_info::partner
int partner
Definition packets_gen.h:422
packet_trade_route_info::goods
Goods_type_id goods
Definition packets_gen.h:425
packet_trade_route_info::direction
enum route_direction direction
Definition packets_gen.h:424
packet_trade_route_info::index
int index
Definition packets_gen.h:421
packet_unit_actions
Definition packets_gen.h:762
packet_unit_actions::target_unit_id
int target_unit_id
Definition packets_gen.h:764
packet_unit_actions::target_city_id
int target_city_id
Definition packets_gen.h:765
packet_unit_actions::action_probabilities
struct act_prob action_probabilities[MAX_NUM_ACTIONS]
Definition packets_gen.h:769
packet_unit_actions::target_extra_id
int target_extra_id
Definition packets_gen.h:767
packet_unit_actions::request_kind
int request_kind
Definition packets_gen.h:768
packet_unit_actions::actor_unit_id
int actor_unit_id
Definition packets_gen.h:763
packet_unit_actions::target_tile_id
int target_tile_id
Definition packets_gen.h:766
packet_unit_combat_info
Definition packets_gen.h:697
packet_unit_combat_info::defender_hp
int defender_hp
Definition packets_gen.h:701
packet_unit_combat_info::attacker_hp
int attacker_hp
Definition packets_gen.h:700
packet_unit_combat_info::make_att_veteran
bool make_att_veteran
Definition packets_gen.h:702
packet_unit_combat_info::make_def_veteran
bool make_def_veteran
Definition packets_gen.h:703
packet_unit_combat_info::attacker_unit_id
int attacker_unit_id
Definition packets_gen.h:698
packet_unit_combat_info::defender_unit_id
int defender_unit_id
Definition packets_gen.h:699
packet_unit_info
Definition packets_gen.h:639
packet_unit_info::movesleft
int movesleft
Definition packets_gen.h:659
packet_unit_info::upkeep
int upkeep[O_LAST]
Definition packets_gen.h:646
packet_unit_info::carrying
int carrying
Definition packets_gen.h:658
packet_unit_info::action_decision_want
enum action_decision action_decision_want
Definition packets_gen.h:676
packet_unit_info::owner
int owner
Definition packets_gen.h:641
packet_unit_info::has_orders
bool has_orders
Definition packets_gen.h:670
packet_unit_info::orders
struct unit_order orders[MAX_LEN_ROUTE]
Definition packets_gen.h:675
packet_unit_info::fuel
int fuel
Definition packets_gen.h:661
packet_unit_info::activity
enum unit_activity activity
Definition packets_gen.h:665
packet_unit_info::activity_tgt
int activity_tgt
Definition packets_gen.h:666
packet_unit_info::current_form_turn
int current_form_turn
Definition packets_gen.h:655
packet_unit_info::nationality
int nationality
Definition packets_gen.h:642
packet_unit_info::transported
bool transported
Definition packets_gen.h:651
packet_unit_info::goto_tile
int goto_tile
Definition packets_gen.h:664
packet_unit_info::orders_index
int orders_index
Definition packets_gen.h:672
packet_unit_info::type
Unit_type_id type
Definition packets_gen.h:656
packet_unit_info::changed_from
enum unit_activity changed_from
Definition packets_gen.h:667
packet_unit_info::homecity
int homecity
Definition packets_gen.h:645
packet_unit_info::orders_length
int orders_length
Definition packets_gen.h:671
packet_unit_info::transported_by
int transported_by
Definition packets_gen.h:657
packet_unit_info::veteran
int veteran
Definition packets_gen.h:647
packet_unit_info::orders_repeat
bool orders_repeat
Definition packets_gen.h:673
packet_unit_info::activity_count
int activity_count
Definition packets_gen.h:662
packet_unit_info::id
int id
Definition packets_gen.h:640
packet_unit_info::occupied
bool occupied
Definition packets_gen.h:650
packet_unit_info::action_decision_tile
int action_decision_tile
Definition packets_gen.h:677
packet_unit_info::battlegroup
int battlegroup
Definition packets_gen.h:669
packet_unit_info::facing
enum direction8 facing
Definition packets_gen.h:644
packet_unit_info::orders_vigilant
bool orders_vigilant
Definition packets_gen.h:674
packet_unit_info::hp
int hp
Definition packets_gen.h:660
packet_unit_info::changed_from_count
int changed_from_count
Definition packets_gen.h:663
packet_unit_info::stay
bool stay
Definition packets_gen.h:653
packet_unit_info::tile
int tile
Definition packets_gen.h:643
packet_unit_info::birth_turn
int birth_turn
Definition packets_gen.h:654
packet_unit_info::ssa_controller
enum server_side_agent ssa_controller
Definition packets_gen.h:648
packet_unit_info::done_moving
bool done_moving
Definition packets_gen.h:652
packet_unit_info::paradropped
bool paradropped
Definition packets_gen.h:649
packet_unit_info::changed_from_tgt
int changed_from_tgt
Definition packets_gen.h:668
packet_unit_short_info
Definition packets_gen.h:680
packet_unit_short_info::activity
int activity
Definition packets_gen.h:690
packet_unit_short_info::packet_use
int packet_use
Definition packets_gen.h:693
packet_unit_short_info::tile
int tile
Definition packets_gen.h:683
packet_unit_short_info::transported
bool transported
Definition packets_gen.h:688
packet_unit_short_info::hp
int hp
Definition packets_gen.h:689
packet_unit_short_info::id
int id
Definition packets_gen.h:681
packet_unit_short_info::veteran
int veteran
Definition packets_gen.h:686
packet_unit_short_info::info_city_id
int info_city_id
Definition packets_gen.h:694
packet_unit_short_info::type
Unit_type_id type
Definition packets_gen.h:685
packet_unit_short_info::owner
int owner
Definition packets_gen.h:682
packet_unit_short_info::occupied
bool occupied
Definition packets_gen.h:687
packet_unit_short_info::transported_by
int transported_by
Definition packets_gen.h:692
packet_unit_short_info::facing
enum direction8 facing
Definition packets_gen.h:684
packet_unit_short_info::activity_tgt
int activity_tgt
Definition packets_gen.h:691
packet_vote_new
Definition packets_gen.h:1637
packet_vote_new::flags
int flags
Definition packets_gen.h:1642
packet_vote_new::vote_no
int vote_no
Definition packets_gen.h:1638
packet_vote_new::desc
char desc[512]
Definition packets_gen.h:1640
packet_vote_new::percent_required
int percent_required
Definition packets_gen.h:1641
packet_vote_new::user
char user[MAX_LEN_NAME]
Definition packets_gen.h:1639
packet_worker_task
Definition packets_gen.h:503
packet_worker_task::city_id
int city_id
Definition packets_gen.h:504
packet_worker_task::tile_id
int tile_id
Definition packets_gen.h:505
packet_worker_task::activity
enum unit_activity activity
Definition packets_gen.h:506
packet_worker_task::want
int want
Definition packets_gen.h:508
packet_worker_task::tgt
int tgt
Definition packets_gen.h:507
player_ai::skill_level
enum ai_level skill_level
Definition player.h:116
player_ai::barbarian_type
enum barbarian_type barbarian_type
Definition player.h:122
player_ai::science_cost
int science_cost
Definition player.h:119
player_ai::love
int love[MAX_NUM_PLAYER_SLOTS]
Definition player.h:124
player_diplstate
Definition player.h:198
player_economic::luxury
int luxury
Definition player.h:66
player_economic::science
int science
Definition player.h:65
player_economic::tax
int tax
Definition player.h:64
player_economic::infra_points
int infra_points
Definition player.h:67
player_economic::gold
int gold
Definition player.h:63
player_score::game
int game
Definition player.h:110
player_slot
Definition player.c:46
player_spaceship
Definition spaceship.h:94
player_spaceship::state
enum spaceship_state state
Definition spaceship.h:108
player
Definition player.h:249
player::cities
struct city_list * cities
Definition player.h:281
player::ai_common
struct player_ai ai_common
Definition player.h:288
player::flags
bv_plr_flags flags
Definition player.h:292
player::tile_vision
struct dbv tile_vision[V_COUNT]
Definition player.h:359
player::primary_capital_id
int primary_capital_id
Definition player.h:275
player::is_male
bool is_male
Definition player.h:257
player::wonders
int wonders[B_LAST]
Definition player.h:305
player::target_government
struct government * target_government
Definition player.h:259
player::autoselect_weight
int autoselect_weight
Definition player.h:299
player::username
char username[MAX_LEN_NAME]
Definition player.h:252
player::is_connected
bool is_connected
Definition player.h:296
player::revolution_finishes
int revolution_finishes
Definition player.h:273
player::nturns_idle
int nturns_idle
Definition player.h:265
player::government
struct government * government
Definition player.h:258
player::tile_known
struct dbv tile_known
Definition player.h:310
player::turns_alive
int turns_alive
Definition player.h:266
player::was_created
bool was_created
Definition player.h:294
player::tech_upkeep
int tech_upkeep
Definition player.h:363
player::units
struct unit_list * units
Definition player.h:282
player::connections
struct conn_list * connections
Definition player.h:298
player::is_alive
bool is_alive
Definition player.h:268
player::real_embassy
bv_player real_embassy
Definition player.h:277
player::client
struct player::@70::@73 client
player::economic
struct player_economic economic
Definition player.h:284
player::culture
int culture
Definition player.h:367
player::spaceship
struct player_spaceship spaceship
Definition player.h:286
player::name
char name[MAX_LEN_NAME]
Definition player.h:251
player::gives_shared_vision
bv_player gives_shared_vision
Definition player.h:302
player::mood
enum mood_type mood
Definition player.h:361
player::score
struct player_score score
Definition player.h:283
player::multipliers
struct multiplier_value multipliers[MAX_NUM_MULTIPLIERS]
Definition player.h:314
player::color_changeable
bool color_changeable
Definition player.h:365
player::music_style
int music_style
Definition player.h:280
player::style
struct nation_style * style
Definition player.h:279
player::phase_done
bool phase_done
Definition player.h:263
player::gives_shared_tiles
bv_player gives_shared_tiles
Definition player.h:304
player::is_ready
bool is_ready
Definition player.h:262
player::history
int history
Definition player.h:316
player::rgb
struct rgbcolor * rgb
Definition player.h:312
player::unassigned_user
bool unassigned_user
Definition player.h:253
range
Definition unittype.c:879
requirement
Definition requirements.h:81
research
Definition research.h:39
resource_type
Definition terrain.h:48
resource_type::output
int output[O_LAST]
Definition terrain.h:54
rgbcolor
Definition rgbcolor.h:33
rgbcolor::g
int g
Definition rgbcolor.h:34
rgbcolor::b
int b
Definition rgbcolor.h:34
rgbcolor::r
int r
Definition rgbcolor.h:34
road_type
Definition road.h:71
spaceship_component
Definition spaceship.h:132
specialist
Definition specialist.h:29
specialist::reqs
struct requirement_vector reqs
Definition specialist.h:38
specialist::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition specialist.h:36
specialist::helptext
struct strvec * helptext
Definition specialist.h:40
specialist::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition specialist.h:35
specialist::name
struct name_translation name
Definition specialist.h:31
specialist::abbreviation
struct name_translation abbreviation
Definition specialist.h:32
startpos
Definition map.c:40
team_slot
Definition team.c:31
tech_class
Definition tech.h:117
terrain
Definition terrain.h:75
terrain::cultivate_result
struct terrain * cultivate_result
Definition terrain.h:108
terrain::placing_time
int placing_time
Definition terrain.h:120
terrain::resources
struct extra_type ** resources
Definition terrain.h:97
terrain::helptext
struct strvec * helptext
Definition terrain.h:156
terrain::graphic_alt2
char graphic_alt2[MAX_LEN_NAME]
Definition terrain.h:82
terrain::flags
bv_terrain_flags flags
Definition terrain.h:152
terrain::resource_freq
int * resource_freq
Definition terrain.h:98
terrain::native_to
bv_unit_classes native_to
Definition terrain.h:150
terrain::road_time
int road_time
Definition terrain.h:106
terrain::name
struct name_translation name
Definition terrain.h:77
terrain::plant_time
int plant_time
Definition terrain.h:112
terrain::plant_result
struct terrain * plant_result
Definition terrain.h:111
terrain::irrigation_food_incr
int irrigation_food_incr
Definition terrain.h:114
terrain::defense_bonus
int defense_bonus
Definition terrain.h:93
terrain::cultivate_time
int cultivate_time
Definition terrain.h:109
terrain::movement_cost
int movement_cost
Definition terrain.h:92
terrain::animal
const struct unit_type * animal
Definition terrain.h:130
terrain::pillage_time
int pillage_time
Definition terrain.h:125
terrain::output
int output[O_LAST]
Definition terrain.h:95
terrain::transform_time
int transform_time
Definition terrain.h:124
terrain::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition terrain.h:81
terrain::mining_time
int mining_time
Definition terrain.h:118
terrain::rgb
struct rgbcolor * rgb
Definition terrain.h:154
terrain::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition terrain.h:80
terrain::tclass
enum terrain_class tclass
Definition terrain.h:90
terrain::road_output_incr_pct
int road_output_incr_pct[O_LAST]
Definition terrain.h:104
terrain::extra_removal_times
int extra_removal_times[MAX_EXTRA_TYPES]
Definition terrain.h:128
terrain::transform_result
struct terrain * transform_result
Definition terrain.h:122
terrain::irrigation_time
int irrigation_time
Definition terrain.h:115
terrain::base_time
int base_time
Definition terrain.h:105
terrain::mining_shield_incr
int mining_shield_incr
Definition terrain.h:117
tile
Definition tile.h:50
tile::spec_sprite
char * spec_sprite
Definition tile.h:67
tile::label
char * label
Definition tile.h:66
tile::altitude
int altitude
Definition tile.h:65
tile::extras
bv_extras extras
Definition tile.h:55
tile::units
struct unit_list * units
Definition tile.h:58
tile::extras_owner
struct player * extras_owner
Definition tile.h:63
tile::infra_turns
int infra_turns
Definition tile.h:62
tile::placing
struct extra_type * placing
Definition tile.h:61
tile::continent
Continent_id continent
Definition tile.h:54
tileset
Definition tilespec.c:481
trade_route_settings
Definition traderoutes.h:75
trade_route
Definition traderoutes.h:83
unit_class
Definition unittype.h:149
unit_class::hp_loss_pct
int hp_loss_pct
Definition unittype.h:155
unit_class::non_native_def_pct
int non_native_def_pct
Definition unittype.h:156
unit_class::min_speed
int min_speed
Definition unittype.h:154
unit_class::name
struct name_translation name
Definition unittype.h:151
unit_class::helptext
struct strvec * helptext
Definition unittype.h:159
unit_class::flags
bv_unit_class_flags flags
Definition unittype.h:157
unit_order::order
enum unit_orders order
Definition unit.h:94
unit_order::action
int action
Definition unit.h:102
unit_type
Definition unittype.h:507
unit_type::transport_capacity
int transport_capacity
Definition unittype.h:530
unit_type::adv
struct unit_type::@87 adv
unit_type::uclass
struct unit_class * uclass
Definition unittype.h:563
unit_type::pop_cost
int pop_cost
Definition unittype.h:520
unit_type::build_reqs
struct requirement_vector build_reqs
Definition unittype.h:527
unit_type::defense_strength
int defense_strength
Definition unittype.h:523
unit_type::cargo
bv_unit_classes cargo
Definition unittype.h:565
unit_type::firepower
int firepower
Definition unittype.h:532
unit_type::paratroopers_range
int paratroopers_range
Definition unittype.h:548
unit_type::graphic_alt
char graphic_alt[MAX_LEN_NAME]
Definition unittype.h:513
unit_type::worker
bool worker
Definition unittype.h:582
unit_type::sound_move_alt
char sound_move_alt[MAX_LEN_NAME]
Definition unittype.h:516
unit_type::build_cost
int build_cost
Definition unittype.h:519
unit_type::convert_time
int convert_time
Definition unittype.h:538
unit_type::city_size
int city_size
Definition unittype.h:557
unit_type::veteran
struct veteran_system * veteran
Definition unittype.h:551
unit_type::obsoleted_by
const struct unit_type * obsoleted_by
Definition unittype.h:536
unit_type::vision_radius_sq
int vision_radius_sq
Definition unittype.h:529
unit_type::move_rate
int move_rate
Definition unittype.h:524
unit_type::targets
bv_unit_classes targets
Definition unittype.h:568
unit_type::vlayer
enum vision_layer vlayer
Definition unittype.h:576
unit_type::helptext
struct strvec * helptext
Definition unittype.h:578
unit_type::bombard_rate
int bombard_rate
Definition unittype.h:554
unit_type::graphic_str
char graphic_str[MAX_LEN_NAME]
Definition unittype.h:512
unit_type::city_slots
int city_slots
Definition unittype.h:559
unit_type::sound_move
char sound_move[MAX_LEN_NAME]
Definition unittype.h:515
unit_type::hp
int hp
Definition unittype.h:531
unit_type::sound_fight_alt
char sound_fight_alt[MAX_LEN_NAME]
Definition unittype.h:518
unit_type::name
struct name_translation name
Definition unittype.h:509
unit_type::fuel
int fuel
Definition unittype.h:539
unit_type::roles
bv_unit_type_roles roles
Definition unittype.h:542
unit_type::tp_defense
enum transp_def_type tp_defense
Definition unittype.h:561
unit_type::upkeep
int upkeep[O_LAST]
Definition unittype.h:545
unit_type::graphic_alt2
char graphic_alt2[MAX_LEN_NAME]
Definition unittype.h:514
unit_type::disembarks
bv_unit_classes disembarks
Definition unittype.h:574
unit_type::converted_to
const struct unit_type * converted_to
Definition unittype.h:537
unit_type::flags
bv_unit_type_flags flags
Definition unittype.h:541
unit_type::sound_fight
char sound_fight[MAX_LEN_NAME]
Definition unittype.h:517
unit_type::embarks
bv_unit_classes embarks
Definition unittype.h:571
unit_type::attack_strength
int attack_strength
Definition unittype.h:522
unit_type::happy_cost
int happy_cost
Definition unittype.h:544
unit_type::bonuses
struct combat_bonus_list * bonuses
Definition unittype.h:533
unit
Definition unit.h:140
unit::length
int length
Definition unit.h:198
unit::upkeep
int upkeep[O_LAST]
Definition unit.h:150
unit::has_orders
bool has_orders
Definition unit.h:196
unit::orders
struct unit::@80 orders
unit::occupied
bool occupied
Definition unit.h:222
unit::action_decision_want
enum action_decision action_decision_want
Definition unit.h:205
unit::battlegroup
int battlegroup
Definition unit.h:194
unit::activity
enum unit_activity activity
Definition unit.h:159
unit::moves_left
int moves_left
Definition unit.h:152
unit::client
struct unit::@81::@83 client
unit::id
int id
Definition unit.h:147
unit::moved
bool moved
Definition unit.h:176
unit::index
int index
Definition unit.h:198
unit::vigilant
bool vigilant
Definition unit.h:200
unit::hp
int hp
Definition unit.h:153
unit::fuel
int fuel
Definition unit.h:155
unit::changed_from_target
struct extra_type * changed_from_target
Definition unit.h:173
unit::current_form_turn
int current_form_turn
Definition unit.h:211
unit::stay
bool stay
Definition unit.h:208
unit::colored
bool colored
Definition unit.h:225
unit::facing
enum direction8 facing
Definition unit.h:144
unit::asking_city_name
bool asking_city_name
Definition unit.h:228
unit::activity_target
struct extra_type * activity_target
Definition unit.h:167
unit::activity_count
int activity_count
Definition unit.h:165
unit::list
struct unit_order * list
Definition unit.h:201
unit::changed_from
enum unit_activity changed_from
Definition unit.h:171
unit::nationality
struct player * nationality
Definition unit.h:146
unit::transported_by
int transported_by
Definition unit.h:219
unit::repeat
bool repeat
Definition unit.h:199
unit::homecity
int homecity
Definition unit.h:148
unit::paradropped
bool paradropped
Definition unit.h:177
unit::done_moving
bool done_moving
Definition unit.h:184
unit::birth_turn
int birth_turn
Definition unit.h:210
unit::carrying
struct goods_type * carrying
Definition unit.h:189
unit::goto_tile
struct tile * goto_tile
Definition unit.h:157
unit::action_decision_tile
struct tile * action_decision_tile
Definition unit.h:206
unit::utype
const struct unit_type * utype
Definition unit.h:141
unit::veteran
int veteran
Definition unit.h:154
unit::changed_from_count
int changed_from_count
Definition unit.h:172
unit::focus_status
enum unit_focus_status focus_status
Definition unit.h:217
unit::ssa_controller
enum server_side_agent ssa_controller
Definition unit.h:175
universal
Definition fc_types.h:908
universal::kind
enum universals_n kind
Definition fc_types.h:910
veteran_system::levels
int levels
Definition unittype.h:502
voteinfo
Definition voteinfo.h:29
voteinfo::yes
int yes
Definition voteinfo.h:36
voteinfo::num_voters
int num_voters
Definition voteinfo.h:39
voteinfo::passed
bool passed
Definition voteinfo.h:41
voteinfo::abstain
int abstain
Definition voteinfo.h:38
voteinfo::vote_no
int vote_no
Definition voteinfo.h:31
voteinfo::no
int no
Definition voteinfo.h:37
worker_task
Definition workertask.h:21
world::map
struct civ_map map
Definition world_object.h:38
style_by_number
struct nation_style * style_by_number(int id)
Definition style.c:88
styles_alloc
void styles_alloc(int count)
Definition style.c:36
music_style_by_number
struct music_style * music_style_by_number(int id)
Definition style.c:171
music_styles_alloc
void music_styles_alloc(int count)
Definition style.c:133
style.h
fc_snprintf
int fc_snprintf(char *str, size_t n, const char *format,...)
Definition support.c:960
fc_strlcpy
size_t fc_strlcpy(char *dest, const char *src, size_t n)
Definition support.c:777
fc_strlcat
size_t fc_strlcat(char *dest, const char *src, size_t n)
Definition support.c:822
support.h
sz_strlcpy
#define sz_strlcpy(dest, src)
Definition support.h:189
TRUE
#define TRUE
Definition support.h:46
FALSE
#define FALSE
Definition support.h:47
fc_strncmp
#define fc_strncmp(_s1_, _s2_, _len_)
Definition support.h:154
team_count
int team_count(void)
Definition team.c:375
team_slot_by_number
struct team_slot * team_slot_by_number(int team_id)
Definition team.c:175
team_add_player
bool team_add_player(struct player *pplayer, struct team *pteam)
Definition team.c:467
team_new
struct team * team_new(struct team_slot *tslot)
Definition team.c:317
team_slot_set_defined_name
void team_slot_set_defined_name(struct team_slot *tslot, const char *team_name)
Definition team.c:288
advance_by_number
struct advance * advance_by_number(const Tech_type_id atype)
Definition tech.c:107
set_user_tech_flag_name
void set_user_tech_flag_name(enum tech_flag_id id, const char *name, const char *helptxt)
Definition tech.c:404
tech_class_by_number
struct tech_class * tech_class_by_number(const int idx)
Definition tech.c:330
advance_number
Tech_type_id advance_number(const struct advance *padvance)
Definition tech.c:98
A_FUTURE
#define A_FUTURE
Definition tech.h:46
A_NEVER
#define A_NEVER
Definition tech.h:51
advance_index_iterate_end
#define advance_index_iterate_end
Definition tech.h:249
tech_req
tech_req
Definition tech.h:110
AR_TWO
@ AR_TWO
Definition tech.h:112
AR_ROOT
@ AR_ROOT
Definition tech.h:113
AR_ONE
@ AR_ONE
Definition tech.h:111
advance_count
static Tech_type_id advance_count(void)
Definition tech.h:170
A_NONE
#define A_NONE
Definition tech.h:43
A_UNKNOWN
#define A_UNKNOWN
Definition tech.h:49
A_LAST
#define A_LAST
Definition tech.h:45
advance_index_iterate
#define advance_index_iterate(_start, _index)
Definition tech.h:245
terrain_count
Terrain_type_id terrain_count(void)
Definition terrain.c:118
terrain_by_number
struct terrain * terrain_by_number(const Terrain_type_id type)
Definition terrain.c:156
terrain_rule_name
const char * terrain_rule_name(const struct terrain *pterrain)
Definition terrain.c:247
resource_type_init
struct resource_type * resource_type_init(struct extra_type *pextra)
Definition terrain.c:272
set_user_terrain_flag_name
void set_user_terrain_flag_name(enum terrain_flag_id id, const char *name, const char *helptxt)
Definition terrain.c:788
MAX_NUM_TERRAINS
#define MAX_NUM_TERRAINS
Definition terrain.h:69
tile_set_terrain
void tile_set_terrain(struct tile *ptile, struct terrain *pterrain)
Definition tile.c:124
tile_set_owner
void tile_set_owner(struct tile *ptile, struct player *pplayer, struct tile *claimer)
Definition tile.c:69
tile_set_label
bool tile_set_label(struct tile *ptile, const char *label)
Definition tile.c:1097
tile_set_resource
void tile_set_resource(struct tile *ptile, struct extra_type *presource)
Definition tile.c:349
tile_city
struct city * tile_city(const struct tile *ptile)
Definition tile.c:83
tile_set_worked
void tile_set_worked(struct tile *ptile, struct city *pcity)
Definition tile.c:106
tile_index
#define tile_index(_pt_)
Definition tile.h:89
tile_worked
#define tile_worked(_tile)
Definition tile.h:115
tile_resource
#define tile_resource(_tile)
Definition tile.h:103
known_type
known_type
Definition tile.h:35
TILE_KNOWN_UNSEEN
@ TILE_KNOWN_UNSEEN
Definition tile.h:37
TILE_UNKNOWN
@ TILE_UNKNOWN
Definition tile.h:36
TILE_KNOWN_SEEN
@ TILE_KNOWN_SEEN
Definition tile.h:38
tile_list_iterate
#define tile_list_iterate(tile_list, ptile)
Definition tile.h:74
tile_terrain
#define tile_terrain(_tile)
Definition tile.h:111
TILE_XY
#define TILE_XY(ptile)
Definition tile.h:43
tile_list_iterate_end
#define tile_list_iterate_end
Definition tile.h:76
tile_owner
#define tile_owner(_tile)
Definition tile.h:97
tileset_setup_unit_type
void tileset_setup_unit_type(struct tileset *t, struct unit_type *ut)
Definition tilespec.c:3819
tileset_setup_government
void tileset_setup_government(struct tileset *t, struct government *gov)
Definition tilespec.c:4432
tileset_setup_specialist_type_default_set
void tileset_setup_specialist_type_default_set(struct tileset *t, Specialist_type_id id)
Definition tilespec.c:2903
tileset_setup_tile_type
void tileset_setup_tile_type(struct tileset *t, const struct terrain *pterrain)
Definition tilespec.c:4166
tileset_player_init
void tileset_player_init(struct tileset *t, struct player *pplayer)
Definition tilespec.c:7393
unit_drawn_with_city_outline
bool unit_drawn_with_city_outline(const struct unit *punit, bool check_focus)
Definition tilespec.c:5526
tileset_setup_impr_type
void tileset_setup_impr_type(struct tileset *t, struct impr_type *pimprove)
Definition tilespec.c:3853
tileset_background_init
void tileset_background_init(struct tileset *t)
Definition tilespec.c:7473
tileset_setup_tech_type
void tileset_setup_tech_type(struct tileset *t, struct advance *padvance)
Definition tilespec.c:3869
tileset_setup_city_tiles
void tileset_setup_city_tiles(struct tileset *t, int style)
Definition tilespec.c:6472
tilespec_reread_frozen_refresh
void tilespec_reread_frozen_refresh(const char *tname)
Definition tilespec.c:1545
tileset_setup_extra
void tileset_setup_extra(struct tileset *t, struct extra_type *pextra)
Definition tilespec.c:3888
tileset_basename
const char * tileset_basename(const struct tileset *t)
Definition tilespec.c:704
finish_loading_sprites
void finish_loading_sprites(struct tileset *t)
Definition tilespec.c:3625
tileset_name_get
const char * tileset_name_get(struct tileset *t)
Definition tilespec.c:7544
tileset_error
void tileset_error(enum log_level level, const char *tset_name, const char *format,...)
Definition tilespec.c:624
tilespec_reread
bool tilespec_reread(const char *new_tileset_name, bool game_fully_initialized, float scale)
Definition tilespec.c:1355
tileset_setup_nation_flag
void tileset_setup_nation_flag(struct tileset *t, struct nation_type *nation)
Definition tilespec.c:4447
tileset_ruleset_reset
void tileset_ruleset_reset(struct tileset *t)
Definition tilespec.c:7508
tilespec.h
MAX_NUM_CITIZEN_SPRITES
#define MAX_NUM_CITIZEN_SPRITES
Definition tilespec.h:199
NUM_WALL_TYPES
#define NUM_WALL_TYPES
Definition tilespec.h:361
city_num_trade_routes
int city_num_trade_routes(const struct city *pcity)
Definition traderoutes.c:392
trade_route_settings_by_type
struct trade_route_settings * trade_route_settings_by_type(enum trade_route_type type)
Definition traderoutes.c:201
goods_by_number
struct goods_type * goods_by_number(Goods_type_id id)
Definition traderoutes.c:615
traderoutes.h
unit_transport_load
bool unit_transport_load(struct unit *pcargo, struct unit *ptrans, bool force)
Definition unit.c:2414
unit_transport_get
struct unit * unit_transport_get(const struct unit *pcargo)
Definition unit.c:2485
unit_transport_unload
bool unit_transport_unload(struct unit *pcargo)
Definition unit.c:2434
unit_virtual_create
struct unit * unit_virtual_create(struct player *pplayer, struct city *pcity, const struct unit_type *punittype, int veteran_level)
Definition unit.c:1657
unit_virtual_destroy
void unit_virtual_destroy(struct unit *punit)
Definition unit.c:1762
unit_tile_set
void unit_tile_set(struct unit *punit, struct tile *ptile)
Definition unit.c:1281
unit_transported
bool unit_transported(const struct unit *pcargo)
Definition unit.c:2469
unit_transport_cargo
struct unit_list * unit_transport_cargo(const struct unit *ptrans)
Definition unit.c:2495
unit.h
unit_tile
#define unit_tile(_pu)
Definition unit.h:397
FOCUS_AVAIL
@ FOCUS_AVAIL
Definition unit.h:54
FOCUS_WAIT
@ FOCUS_WAIT
Definition unit.h:54
ORDER_PERFORM_ACTION
@ ORDER_PERFORM_ACTION
Definition unit.h:48
unit_owner
#define unit_owner(_pu)
Definition unit.h:396
unitlist.h
unit_list_iterate
#define unit_list_iterate(unitlist, punit)
Definition unitlist.h:31
unit_list_iterate_end
#define unit_list_iterate_end
Definition unitlist.h:33
set_unit_class_caches
void set_unit_class_caches(struct unit_class *pclass)
Definition unittype.c:2742
unit_type_get
const struct unit_type * unit_type_get(const struct unit *punit)
Definition unittype.c:123
unit_name_translation
const char * unit_name_translation(const struct unit *punit)
Definition unittype.c:1569
unit_rule_name
const char * unit_rule_name(const struct unit *punit)
Definition unittype.c:1587
set_unit_move_type
void set_unit_move_type(struct unit_class *puclass)
Definition unittype.c:2910
set_unit_type_caches
void set_unit_type_caches(struct unit_type *ptype)
Definition unittype.c:2801
uclass_by_number
struct unit_class * uclass_by_number(const Unit_Class_id id)
Definition unittype.c:2476
veteran_system_definition
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:2671
utype_by_number
struct unit_type * utype_by_number(const Unit_type_id id)
Definition unittype.c:112
unit_type_action_cache_set
void unit_type_action_cache_set(struct unit_type *ptype)
Definition unittype.c:915
set_user_unit_class_flag_name
void set_user_unit_class_flag_name(enum unit_class_flag_id id, const char *name, const char *helptxt)
Definition unittype.c:1812
veteran_system_new
struct veteran_system * veteran_system_new(int count)
Definition unittype.c:2640
utype_can_do_action
bool utype_can_do_action(const struct unit_type *putype, const action_id act_id)
Definition unittype.c:371
set_user_unit_type_flag_name
void set_user_unit_type_flag_name(enum unit_type_flag_id id, const char *name, const char *helptxt)
Definition unittype.c:1876
UCF_LAST_USER_FLAG
#define UCF_LAST_USER_FLAG
Definition unittype.h:127
unit_class_iterate
#define unit_class_iterate(_p)
Definition unittype.h:912
UTYF_LAST_USER_FLAG
#define UTYF_LAST_USER_FLAG
Definition unittype.h:337
unit_type_iterate
#define unit_type_iterate(_p)
Definition unittype.h:859
U_LAST
#define U_LAST
Definition unittype.h:40
unit_class_iterate_end
#define unit_class_iterate_end
Definition unittype.h:919
unit_type_iterate_end
#define unit_type_iterate_end
Definition unittype.h:866
economy_report_dialog_update
void economy_report_dialog_update(void)
Definition update_queue.c:682
set_client_page
void set_client_page(enum client_pages page)
Definition update_queue.c:496
science_report_dialog_update
void science_report_dialog_update(void)
Definition update_queue.c:674
update_queue_processing_finished
void update_queue_processing_finished(int request_id)
Definition update_queue.c:288
units_report_dialog_update
void units_report_dialog_update(void)
Definition update_queue.c:690
update_queue_processing_started
void update_queue_processing_started(int request_id)
Definition update_queue.c:279
get_client_page
enum client_pages get_client_page(void)
Definition update_queue.c:520
unit_select_dialog_update
void unit_select_dialog_update(void)
Definition update_queue.c:698
update_queue.h
vision_layer_iterate
#define vision_layer_iterate(v)
Definition vision.h:77
vision_layer_iterate_end
#define vision_layer_iterate_end
Definition vision.h:80
voteinfo_queue_delayed_remove
void voteinfo_queue_delayed_remove(int vote_no)
Definition voteinfo.c:53
voteinfo_queue_find
struct voteinfo * voteinfo_queue_find(int vote_no)
Definition voteinfo.c:150
voteinfo_queue_add
void voteinfo_queue_add(int vote_no, const char *user, const char *desc, int percent_required, int flags)
Definition voteinfo.c:123
voteinfo.h
voteinfo_bar_g.h
wldlg_g.h
worker_task_is_sane
bool worker_task_is_sane(struct worker_task *ptask)
Definition workertask.c:40
worker_task_list_iterate
#define worker_task_list_iterate(tasklist, ptask)
Definition workertask.h:33
worker_task_list_iterate_end
#define worker_task_list_iterate_end
Definition workertask.h:35
worklist_copy
void worklist_copy(struct worklist *dst, const struct worklist *src)
Definition worklist.c:112
worklist_init
void worklist_init(struct worklist *pwl)
Definition worklist.c:38
worklist.h