Crossfire Client, Trunk
main.c
Go to the documentation of this file.
1 /*
2  * Crossfire -- cooperative multi-player graphical RPG and adventure game
3  *
4  * Copyright (c) 1999-2013 Mark Wedel and the Crossfire Development Team
5  * Copyright (c) 1992 Frank Tore Johansen
6  *
7  * Crossfire is free software and comes with ABSOLUTELY NO WARRANTY. You are
8  * welcome to redistribute it under certain conditions. For details, please
9  * see COPYING and LICENSE.
10  *
11  * The authors can be reached via e-mail at <crossfire@metalforge.org>.
12  */
13 
19 #include "client.h"
20 
21 #include <errno.h>
22 #include <gtk/gtk.h>
23 #include <stdbool.h>
24 
25 #ifndef WIN32
26 #include <signal.h>
27 #endif
28 
29 #include "client-vala.h"
30 #include "image.h"
31 #include "main.h"
32 #include "mapdata.h"
33 #include "metaserver.h"
34 #include "script.h"
35 #include "sound.h"
36 #include "gtk2proto.h"
37 
38 /* Sets up the basic colors. */
39 static const char *const colorname[NUM_COLORS] = {
40  "Black", /* 0 */
41  "White", /* 1 */
42  "Navy", /* 2 */
43  "Red", /* 3 */
44  "Orange", /* 4 */
45  "DodgerBlue", /* 5 */
46  "DarkOrange2", /* 6 */
47  "SeaGreen", /* 7 */
48  "DarkSeaGreen", /* 8 *//* Used for window background color */
49  "Grey50", /* 9 */
50  "Sienna", /* 10 */
51  "Gold", /* 11 */
52  "Khaki" /* 12 */
53 };
54 
55 static gboolean updatekeycodes = FALSE;
56 
57 /* TODO: Move these declarations to actual header files. */
58 extern bool time_map_redraw;
59 extern bool profile_latency;
60 extern int MINLOG;
62 
63 static char *connect_server = NULL;
64 
65 static gboolean script_launch(const gchar *option_name, const gchar *value, gpointer data, GError **error);
66 
68 static GOptionEntry options[] = {
69  { "server", 's', 0, G_OPTION_ARG_STRING, &connect_server,
70  "Connect to the given server", "SERVER[:PORT]" },
71  { "cache", 0, 0, G_OPTION_ARG_NONE, &want_config[CONFIG_CACHE],
72  "Cache images", NULL },
73  { "prefetch", 0, 0, G_OPTION_ARG_NONE, &want_config[CONFIG_DOWNLOAD],
74  "Download images before playing", NULL },
75  { "faceset", 0, 0, G_OPTION_ARG_STRING, &face_info.want_faceset,
76  "Use the given faceset (if available)", "FACESET" },
77 
78  { "sound_server", 0, 0, G_OPTION_ARG_FILENAME, &sound_server,
79  "Path to the sound server", "PATH" },
80  { "updatekeycodes", 0, 0, G_OPTION_ARG_NONE, &updatekeycodes,
81  "Update the saved bindings for this keyboard", NULL },
82 
83  { "loginmethod", 0, 0, G_OPTION_ARG_INT, &wantloginmethod,
84  "Login method to request from server", NULL },
85  { "profile-latency", 0, 0, G_OPTION_ARG_NONE, &profile_latency,
86  "Log command acknowledgement latency to stdout", NULL },
87  { "profile-redraw", 0, 0, G_OPTION_ARG_NONE, &time_map_redraw,
88  "Print map redraw times to stdout", NULL },
89  { "verbose", 'v', 0, G_OPTION_ARG_INT, &MINLOG,
90  "Set verbosity (0 is the most verbose)", "LEVEL" },
91  { "debug-protocol", 0, 0, G_OPTION_ARG_NONE, &debug_protocol,
92  "Print commands to and from the server", NULL },
93  { "script", 0, 0, G_OPTION_ARG_CALLBACK, &script_launch,
94  "Launch client script at start (can be used multiple times)", "SCRIPT_NAME" },
95  { NULL }
96 };
97 
99 
101 
102 GtkBuilder *dialog_xml, *window_xml;
104 GtkNotebook *main_notebook;
105 
106 extern time_t last_command_sent;
107 extern bool is_afk;
108 
109 #ifdef WIN32 /* Win32 scripting support */
110 static int do_scriptout() {
111  script_process(NULL);
112  return (TRUE);
113 }
114 #endif /* WIN32 */
115 
116 static gboolean script_launch(const gchar *option_name, const gchar *value, gpointer data, GError **error)
117 {
118  (void)option_name; // always "--script"
119  (void)data; // Not used
120  (void)error; // Not used
121  script_init(value);
122  return TRUE;
123 }
124 
129 static gboolean redraw(gpointer data) {
130  // Add a check for client_is_connected so that forced socket termination
131  // does not erroneously attempt to redraw the map after it has been destroyed.
132  if (client_is_connected()) {
133  if (have_new_image) {
134  if (cpl.container) {
136  }
137  cpl.ob->inv_updated = 1;
138  have_new_image = 0;
139  }
140  draw_map();
141  draw_lists();
142  }
143  return FALSE;
144 }
145 
146 static void on_auto_afk_response(GtkDialog *self, gint response_id, gpointer user_data) {
147  // It is possible for is_afk to be false because dialog is non-modal.
148  switch (response_id) {
149  case 1:
150  gtk_widget_destroy(GTK_WIDGET(self));
151  break;
152  case 2:
153  if (is_afk) {
154  send_command("afk", 0, true);
155  }
157  config_check();
158  save_defaults();
159  gtk_widget_destroy(GTK_WIDGET(self));
160  break;
161  default:
162  // includes closing the pop-up
163  if (is_afk) {
164  send_command("afk", 0, true);
165  }
166  gtk_widget_destroy(GTK_WIDGET(self));
167  break;
168  }
169 }
170 
171 static void auto_afk() {
172  send_command("afk", 0, true);
173  GtkWidget *dialog = gtk_dialog_new_with_buttons("Auto-AFK", GTK_WINDOW(window_root), GTK_DIALOG_DESTROY_WITH_PARENT,
174  "Return to game", 0, "Return to game, but stay AFK", 1, "Return to game, disable auto-AFK", 2, NULL);
175  GtkWidget *label, *content_area;
176  content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
177  label = gtk_label_new("You have been automatically marked as being away.");
178  gtk_container_add(GTK_CONTAINER(content_area), label);
179  g_signal_connect_swapped(dialog, "response", G_CALLBACK(on_auto_afk_response), dialog);
180  gtk_widget_show_all(dialog);
181 }
182 
186 void client_tick(guint32 tick) {
187  if (cpl.showmagic) {
188  if (gtk_notebook_get_current_page(GTK_NOTEBOOK(map_notebook)) !=
189  MAGIC_MAP_PAGE) {
190  // Stop flashing when the user switches back to the map window.
191  cpl.showmagic = 0;
192  } else {
194  cpl.showmagic ^= 2;
195  }
196  }
197  if (cpl.spells_updated) {
199  }
200 
202  inventory_tick();
204  g_idle_add(redraw, NULL);
205 
206  if (!is_afk && use_config[CONFIG_AUTO_AFK] != 0 && time(NULL) > (last_command_sent + use_config[CONFIG_AUTO_AFK])) {
207  auto_afk();
208  }
209 }
213 void on_window_destroy_event(GtkWidget *object, gpointer user_data) {
214  script_killall();
215  LOG(LOG_DEBUG, "main.c::client_exit", "Exiting with return value 0.");
216  exit(0);
217 }
218 
222 static gboolean do_network(GObject *stream, gpointer data) {
223  struct timeval timeout = {0, 0};
224  fd_set tmp_read;
225  int pollret;
226 
227  if (!client_is_connected()) {
228  gtk_main_quit();
229  LOG(LOG_INFO, "main.c::do_network", "Trying to do network when not connected.");
230  return FALSE;
231  }
232 
233  client_run();
234 
235  FD_ZERO(&tmp_read);
236  int maxfd;
237  script_fdset(&maxfd, &tmp_read);
238  pollret = select(maxfd, &tmp_read, NULL, NULL, &timeout);
239  if (pollret < 0) {
240 #ifndef WIN32
241  // FIXME: For whatever reason, we get errors claiming "no error" here in Windows
242  LOG(LOG_ERROR, "do_network", "script select() failed: %s", strerror(errno));
243 #endif
244  } else if (pollret > 0) {
245  script_process(&tmp_read);
246  }
247 
248  return TRUE;
249 }
250 
254 static void event_loop() {
255 #ifdef WIN32
256  g_timeout_add(250, G_SOURCE_FUNC(do_scriptout), NULL);
257 #endif
258 
259  GSource *net_source = client_get_source();
260  if (net_source == NULL) {
261  error_dialog("Server unexpectedly disconnected",
262  "The server unexpectedly disconnected.");
264  return;
265  }
266  g_source_set_callback(net_source, (GSourceFunc)do_network, NULL, NULL);
267  g_source_attach(net_source, NULL);
268  gtk_main();
269 
270  LOG(LOG_DEBUG, "event_loop", "Disconnected");
271 }
272 
284 static void parse_args(int argc, char *argv[]) {
285  GOptionContext *context = g_option_context_new("- Crossfire GTKv2 Client");
286  GError *error = NULL;
287 
288  g_option_context_add_main_entries(context, options, NULL);
289  g_option_context_add_group(context, gtk_get_option_group(TRUE));
290 
291  if (!g_option_context_parse(context, &argc, &argv, &error)) {
292  g_print("%s\n", error->message);
293  g_error_free(error);
294  exit(EXIT_FAILURE);
295  }
296 
297  g_option_context_free(context);
298 
299  /*
300  * Move this after the parsing of command line options, since that can
301  * change the default log level.
302  */
303  LOG(LOG_DEBUG, "Client Version", VERSION_INFO);
304  if (MINLOG <= 0) {
305  g_setenv("CF_SOUND_DEBUG", "yes", false);
306  }
307 }
308 
314 void error_dialog(char *error, char *message) {
315  GtkWidget *dialog = gtk_message_dialog_new(
316  NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
317  GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", error);
318  gtk_window_set_title(GTK_WINDOW(dialog), "Crossfire Client");
319  gtk_message_dialog_format_secondary_markup(
320  GTK_MESSAGE_DIALOG(dialog), "%s", message);
321  gtk_dialog_run(GTK_DIALOG(dialog));
322  gtk_widget_destroy(dialog);
323 }
324 
337 void my_log_handler(const gchar *log_domain, GLogLevelFlags log_level,
338  const gchar *message, gpointer user_data) {
339  g_usleep(1 * 1e6);
340 }
341 
342 static void init_sockets() {
343 #ifndef WIN32
344  signal(SIGPIPE, SIG_IGN);
345 #endif
346 }
347 
351 static char *init_ui_layout(const char *name) {
352  guint retval = gtk_builder_add_from_file(window_xml, name, NULL);
353  if (retval > 0 && strlen(name) > 0) {
354  if (window_xml_file != name) { // FIXME: caught by Valgrind
355  strncpy(window_xml_file, name, sizeof(window_xml_file));
356  }
357  return window_xml_file;
358  } else {
359  return NULL;
360  }
361 }
362 
363 static void init_ui() {
364  GError *error = NULL;
365  GdkGeometry geometry;
366  int i;
367 
368  /* Load dialog windows using GtkBuilder. */
369  dialog_xml = gtk_builder_new();
370  if (!gtk_builder_add_from_file(dialog_xml, DIALOG_FILENAME, &error)) {
371  error_dialog("Couldn't load UI dialogs.", error->message);
372  g_warning("Couldn't load UI dialogs: %s", error->message);
373  g_error_free(error);
374  exit(EXIT_FAILURE);
375  }
376  LOG(LOG_DEBUG, "init_ui", "loaded dialog_xml '%s'", DIALOG_FILENAME);
377 
378  /* Load main window using GtkBuilder. */
379  window_xml = gtk_builder_new();
380  if (init_ui_layout(window_xml_file) == NULL) {
381  LOG(LOG_DEBUG, "init_ui_layout", "Could not initialize '%s', using default layout", window_xml_file);
382  if (init_ui_layout(DEFAULT_UI) == NULL) {
383  g_error("Could not load default layout!");
384  }
385  }
386  LOG(LOG_DEBUG, "init_ui", "loaded window_xml '%s'", window_xml_file);
387 
388  connect_window = GTK_WIDGET(gtk_builder_get_object(dialog_xml, "connect_window"));
389  gtk_window_set_transient_for(GTK_WINDOW(connect_window),
390  GTK_WINDOW(window_root));
391  g_signal_connect(connect_window, "destroy",
392  G_CALLBACK(on_window_destroy_event), NULL);
393  main_notebook =
394  GTK_NOTEBOOK(gtk_builder_get_object(dialog_xml, "main_notebook"));
395 
396  /* Begin connecting signals for the root window. */
397  window_root = GTK_WIDGET(gtk_builder_get_object(window_xml, "window_root"));
398  if (window_root == NULL) {
399  error_dialog("Could not load main window",
400  "Check that your layout files are not corrupt.");
401  exit(EXIT_FAILURE);
402  }
403 
404  /* Request the window to receive focus in and out events */
405  gtk_widget_add_events((gpointer) window_root, GDK_FOCUS_CHANGE_MASK);
406  g_signal_connect((gpointer) window_root, "focus-out-event",
407  G_CALLBACK(focusoutfunc), NULL);
408 
409  g_signal_connect_swapped((gpointer) window_root, "key_press_event",
410  G_CALLBACK(keyfunc), GTK_WIDGET(window_root));
411  g_signal_connect_swapped((gpointer) window_root, "key_release_event",
412  G_CALLBACK(keyrelfunc), GTK_WIDGET(window_root));
413  g_signal_connect((gpointer) window_root, "destroy",
414  G_CALLBACK(on_window_destroy_event), NULL);
415 
416  /* Purely arbitrary min window size */
417  geometry.min_width=640;
418  geometry.min_height=480;
419 
420  gtk_window_set_geometry_hints(GTK_WINDOW(window_root), window_root,
421  &geometry, GDK_HINT_MIN_SIZE);
422 
423  magic_map = GTK_WIDGET(gtk_builder_get_object(window_xml,
424  "drawingarea_magic_map"));
425 
426  g_signal_connect((gpointer) magic_map, "expose_event",
427  G_CALLBACK(on_drawingarea_magic_map_expose_event), NULL);
428 
429  /* Set up colors before doing the other initialization functions */
430  for (i = 0; i < NUM_COLORS; i++) {
431  if (!gdk_color_parse(colorname[i], &root_color[i])) {
432  fprintf(stderr, "gdk_color_parse failed (%s)\n", colorname[i]);
433  }
434  if (!gdk_colormap_alloc_color(gtk_widget_get_colormap(window_root),
435  &root_color[i], FALSE, FALSE)) {
436  fprintf(stderr, "gdk_color_alloc failed\n");
437  }
438  }
439 
440  LOG(LOG_DEBUG, "init_ui", "sub init");
450 
451  LOG(LOG_DEBUG, "init_ui", "window positions");
453 
454  LOG(LOG_DEBUG, "init_ui", "init themes");
455  init_theme();
456  LOG(LOG_DEBUG, "init_ui", "load themes");
457  load_theme(TRUE);
458  LOG(LOG_DEBUG, "init_ui", "menu items");
459  init_menu_items();
460 }
461 
468  gtk_widget_show(window_root);
471 }
472 
478  gtk_widget_hide(window_root);
480  /*
481  * We know the following is the private map structure in item.c. But
482  * we don't have direct access to it, so we still use locate.
483  */
485 
486  cf_play_music("NONE");
487  gtk_widget_show(connect_window);
488 }
489 
493 int main(int argc, char *argv[]) {
494  global_time = g_timer_new();
495 #ifdef ENABLE_NLS
496  bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
497  bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
498  textdomain(GETTEXT_PACKAGE);
499 #endif
500 
501  // Initialize GTK and client library.
502  gtk_init(&argc, &argv);
503  parse_args(argc, argv);
504  client_init();
505 
506  // Set defaults, load configuration, and parse arguments.
507  config_load();
508  config_check();
509  char *layout = g_path_get_basename(window_xml_file);
510  snprintf(VERSION_INFO, MAX_BUF,
511  "GTKv2 Client " FULL_VERSION " (%s)", layout);
512  g_free(layout);
513 
514  // Initialize UI, sockets, and sound server.
515  LOG(LOG_DEBUG, "main", "init UI");
516  init_ui();
517  LOG(LOG_DEBUG, "main", "init sockets");
518  init_sockets();
519 
520  LOG(LOG_DEBUG, "main", "init sound");
521  if (!want_config[CONFIG_SOUND] || !init_sounds()) {
522  use_config[CONFIG_SOUND] = FALSE;
523  } else {
524  use_config[CONFIG_SOUND] = TRUE;
525  }
526 
527  /* Load cached pixmaps. */
528  LOG(LOG_DEBUG, "main", "init image cache");
530 
531  LOG(LOG_DEBUG, "main", "init done");
532 
533  while (true) {
534  gtk_widget_show(connect_window);
535  if (connect_server == NULL) {
537  gtk_main();
538  } else {
540  if (csocket.fd == NULL) {
541  LOG(LOG_ERROR, "main", "Unable to connect to %s!", connect_server);
542  break;
543  }
545  }
546 
548  if (serverloginmethod) {
550  } else {
552  }
553 
554  /* The event_loop will block until connection to the server is lost. */
555  event_loop();
556 
558 
559  /*
560  * Need to reset the images so they match up properly and prevent
561  * memory leaks.
562  */
564  client_reset();
565  }
566 }
567 
579 void get_window_coord(GtkWidget *win, int *x, int *y, int *wx, int *wy,
580  int *w, int *h) {
581  /* Position of a window relative to its parent window. */
582  gdk_window_get_geometry(gtk_widget_get_window(win), x, y, w, h, NULL);
583  /* Position of the window in root window coordinates. */
584  gdk_window_get_origin(gtk_widget_get_window(win), wx, wy);
585  *wx -= *x;
586  *wy -= *y;
587 }
last_command_sent
time_t last_command_sent
Definition: player.c:49
LOG_INFO
@ LOG_INFO
Minor, non-harmful issues.
Definition: client.h:434
updatekeycodes
static gboolean updatekeycodes
Definition: main.c:55
redraw
static gboolean redraw(gpointer data)
Definition: main.c:129
init_menu_items
void init_menu_items()
Definition: menubar.c:89
init_theme
void init_theme()
Definition: config.c:92
Playing
@ Playing
Definition: client.h:145
script_killall
void script_killall(void)
Definition: script.c:541
keyfunc
void keyfunc(GtkWidget *widget, GdkEventKey *event, GtkWidget *window)
Definition: keys.c:1567
metaserver.h
DIALOG_FILENAME
#define DIALOG_FILENAME
Definition: main.h:37
load_window_positions
void load_window_positions(GtkWidget *window_root)
Definition: config.c:848
Player_Struct::input_state
Input_State input_state
Definition: client.h:339
client_disconnect
void client_disconnect()
Definition: client.c:175
ClientSocket::fd
GSocketConnection * fd
Definition: client.h:124
parse_args
static void parse_args(int argc, char *argv[])
Definition: main.c:284
client_reset
void client_reset()
Definition: init.c:242
CONFIG_DOWNLOAD
#define CONFIG_DOWNLOAD
Definition: client.h:183
show_main_client
void show_main_client()
Definition: main.c:466
DEFAULT_UI
#define DEFAULT_UI
Definition: main.h:36
FULL_VERSION
#define FULL_VERSION
Definition: version.h:1
main_notebook
GtkNotebook * main_notebook
Definition: main.c:104
remove_item_inventory
void remove_item_inventory(item *op)
Definition: item.c:344
client_tick
void client_tick(guint32 tick)
Definition: main.c:186
map_init
void map_init(GtkWidget *window_root)
Definition: map.c:86
hide_all_login_windows
void hide_all_login_windows(void)
Definition: account.c:96
face_info
Face_Information face_info
Definition: image.c:169
msgctrl_init
void msgctrl_init(GtkWidget *window_root)
Definition: info.c:1345
save_defaults
void save_defaults(void)
Definition: config.c:513
options
static GOptionEntry options[]
Definition: main.c:68
script_process
void script_process(fd_set *set)
Definition: script.c:573
map_notebook
GtkWidget * map_notebook
Definition: map.c:37
client_is_connected
bool client_is_connected()
Definition: client.c:320
have_new_image
int have_new_image
Definition: image.c:37
client_connect
void client_connect(const char hostname[static 1])
Definition: client.c:289
MAGIC_MAP_PAGE
#define MAGIC_MAP_PAGE
Definition: main.h:42
VERSION_INFO
char VERSION_INFO[MAX_BUF]
Definition: client.c:48
wantloginmethod
int wantloginmethod
Definition: client.c:61
event_loop
static void event_loop()
Definition: main.c:254
mapdata.h
on_auto_afk_response
static void on_auto_afk_response(GtkDialog *self, gint response_id, gpointer user_data)
Definition: main.c:146
client_get_source
GSource * client_get_source()
Definition: client.c:324
CONFIG_CACHE
#define CONFIG_CACHE
Definition: client.h:187
Player_Struct::container
item * container
Definition: client.h:337
pickup_init
void pickup_init(GtkWidget *window_root)
Definition: pickup.c:401
MAX_BUF
#define MAX_BUF
Definition: client.h:40
info_init
void info_init(GtkWidget *window_root)
Definition: info.c:632
reset_image_data
void reset_image_data(void)
Definition: image.c:276
init_ui_layout
static char * init_ui_layout(const char *name)
Definition: main.c:351
focusoutfunc
void focusoutfunc(GtkWidget *widget, GdkEventKey *event, GtkWidget *window)
Definition: keys.c:1526
MINLOG
int MINLOG
Definition: misc.c:34
Player_Struct::ob
item * ob
Definition: client.h:334
hide_main_client
void hide_main_client()
Definition: main.c:477
clear_stat_mapping
void clear_stat_mapping(void)
Definition: stats.c:771
init_image_cache_data
void init_image_cache_data(void)
Definition: image.c:380
gtk2proto.h
client_run
void client_run()
Definition: client.c:202
draw_lists
void draw_lists(void)
Definition: inventory.c:1165
Face_Information_struct::want_faceset
char * want_faceset
Definition: client.h:407
root_color
GdkColor root_color[NUM_COLORS]
Definition: main.c:100
LOG
void LOG(LogLevel level, const char *origin, const char *format,...)
Definition: misc.c:111
inventory_init
void inventory_init(GtkWidget *window_root)
Definition: inventory.c:528
load_theme
void load_theme(int reload)
Definition: config.c:154
window_xml_file
char window_xml_file[MAX_BUF]
Definition: main.c:98
want_config
gint16 want_config[CONFIG_NUMS]
Definition: init.c:41
csocket
ClientSocket csocket
Definition: client.c:70
metaserver_show_prompt
void metaserver_show_prompt(void)
Definition: metaserver.c:215
image.h
metaserver_ui_init
void metaserver_ui_init()
Definition: metaserver.c:75
init_sockets
static void init_sockets()
Definition: main.c:342
my_log_handler
void my_log_handler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
Definition: main.c:337
magic_map_flash_pos
void magic_map_flash_pos(void)
Definition: magicmap.c:77
init_ui
static void init_ui()
Definition: main.c:363
CONFIG_AUTO_AFK
#define CONFIG_AUTO_AFK
Definition: client.h:215
keys_init
void keys_init(GtkWidget *window_root)
Definition: keys.c:648
error_dialog
void error_dialog(char *error, char *message)
Definition: main.c:314
main
int main(int argc, char *argv[])
Definition: main.c:493
keyrelfunc
void keyrelfunc(GtkWidget *widget, GdkEventKey *event, GtkWidget *window)
Definition: keys.c:1552
dialog_xml
GtkBuilder * dialog_xml
Definition: main.c:102
Player_Struct::showmagic
guint8 showmagic
Definition: client.h:362
is_afk
bool is_afk
Definition: player.c:46
send_command
int send_command(const char *command, int repeat, int must_send)
Definition: player.c:235
init_create_character_window
void init_create_character_window()
Definition: create_char.c:791
on_drawingarea_magic_map_expose_event
gboolean on_drawingarea_magic_map_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
LOG_ERROR
@ LOG_ERROR
Warning that something definitely didn't work.
Definition: client.h:436
CONFIG_SOUND
#define CONFIG_SOUND
Definition: client.h:195
update_spell_information
void update_spell_information(void)
Definition: spells.c:190
locate_item
item * locate_item(gint32 tag)
Definition: item.c:278
main.h
cpl
Client_Player cpl
Definition: client.c:69
time_map_redraw
bool time_map_redraw
Definition: config.c:51
connect_server
static char * connect_server
Definition: main.c:63
inventory_tick
void inventory_tick(void)
Definition: inventory.c:1304
global_time
GTimer * global_time
Definition: misc.c:31
do_network
static gboolean do_network(GObject *stream, gpointer data)
Definition: main.c:222
config_init
void config_init(GtkWidget *window_root)
Definition: config.c:539
item_struct::inv_updated
guint16 inv_updated
Definition: item.h:77
magic_map
GtkWidget * magic_map
Definition: main.c:103
debug_protocol
bool debug_protocol
Definition: main.c:61
script.h
account_show_login
void account_show_login()
Definition: account.c:1302
use_config
gint16 use_config[CONFIG_NUMS]
Definition: client.h:242
colorname
static const char *const colorname[NUM_COLORS]
Definition: main.c:39
info_buffer_tick
void info_buffer_tick(void)
Definition: info.c:1069
sound_server
char * sound_server
Definition: client.c:51
client_init
void client_init()
Definition: init.c:187
script_fdset
void script_fdset(int *maxfd, fd_set *set)
Definition: script.c:558
window_root
GtkWidget * window_root
Definition: main.c:103
init_sounds
int init_sounds(void)
Definition: sound.c:26
get_window_coord
void get_window_coord(GtkWidget *win, int *x, int *y, int *wx, int *wy, int *w, int *h)
Definition: main.c:579
maxfd
int maxfd
Definition: client.c:58
auto_afk
static void auto_afk()
Definition: main.c:171
script_init
void script_init(const char *cparams)
Definition: script.c:205
on_window_destroy_event
void on_window_destroy_event(GtkWidget *object, gpointer user_data)
Definition: main.c:213
NUM_COLORS
#define NUM_COLORS
Definition: main.h:22
mapdata_animation
void mapdata_animation(void)
Definition: mapdata.c:1368
script_launch
static gboolean script_launch(const gchar *option_name, const gchar *value, gpointer data, GError **error)
Definition: main.c:116
serverloginmethod
int serverloginmethod
Definition: client.c:62
profile_latency
bool profile_latency
Definition: player.c:36
sound.h
draw_map
void draw_map(void)
Definition: map.c:477
Player_Struct::spells_updated
guint32 spells_updated
Definition: client.h:351
connect_window
GtkWidget * connect_window
Definition: main.c:103
LOG_DEBUG
@ LOG_DEBUG
Useful debugging information.
Definition: client.h:433
config_load
void config_load()
Definition: config.c:442
client.h
stats_init
void stats_init(GtkWidget *window_root)
Definition: stats.c:147
cf_play_music
void cf_play_music(const char *music_name)
Definition: cfsndserv.c:172
config_check
void config_check(void)
Definition: config.c:331
window_xml
GtkBuilder * window_xml
Definition: main.c:102
client_negotiate
void client_negotiate(int sound)
Definition: client.c:329