From 7c1f86ef4f3660ea8284c99e510aed8cec079c86 Mon Sep 17 00:00:00 2001 From: gyboth Date: Mon, 30 May 2005 15:54:20 +0000 Subject: [PATCH] "Yet another transfer improvement." --- bygfoot_misc2.glade | 189 +++++++++++++++++++++++++++++++++++ src/Makefile.am | 4 +- src/bygfoot.h | 3 +- src/callback_func.c | 26 +++-- src/callbacks.c | 33 ++++-- src/enums.h | 1 + src/game_gui.c | 27 +++-- src/misc2_callback_func.c | 2 + src/misc2_callbacks.c | 58 +++++++++-- src/misc2_callbacks.h | 19 +++- src/misc2_interface.c | 113 +++++++++++++++++++++ src/misc2_interface.h | 1 + src/transfer.c | 146 +++++++++++++-------------- src/transfer.h | 5 +- src/transfer_struct.h | 5 +- src/treeview_helper.c | 13 ++- src/user.c | 14 +++ src/user.h | 3 + src/user_struct.h | 1 + src/window.c | 26 ++++- src/window.h | 9 +- src/xml_loadsave_transfers.c | 11 +- src/xml_loadsave_users.c | 40 +++++++- support_files/bygfoot_app | 18 ++-- 24 files changed, 630 insertions(+), 137 deletions(-) diff --git a/bygfoot_misc2.glade b/bygfoot_misc2.glade index 019ba3ae..03f707d0 100644 --- a/bygfoot_misc2.glade +++ b/bygfoot_misc2.glade @@ -2114,4 +2114,193 @@ + + 5 + True + + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_CENTER + True + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + + + + + True + False + 5 + + + + True + gtk-dialog-question + 6 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + True + + + + + + True + + False + False + GTK_JUSTIFY_LEFT + True + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + False + 3 + + + + True + Return + True + gtk-yes + True + GTK_RELIEF_NORMAL + True + + + + + 0 + True + True + + + + + + True + True + gtk-no + True + GTK_RELIEF_NORMAL + True + + + + 0 + True + True + + + + + + True + Esc + True + GTK_RELIEF_NORMAL + True + + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-go-forward + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Decide later + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + diff --git a/src/Makefile.am b/src/Makefile.am index f392761e..db199b7f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -31,7 +31,7 @@ bygfoot_SOURCES = \ misc_callbacks.c callbacks.h callback_func.h game.h game_gui.h live_game.h load_save.h main.h misc_callback_func.h misc_callbacks.h option.h user.h variables.h window.h xml_country.h \ misc_callback_func.c callbacks.h finance.h game.h game_gui.h gui.h load_save.h maths.h misc_callback_func.h option.h start_end.h support.h treeview.h user.h variables.h window.h xml_country.h xml_name.h \ misc_interface.c misc_interface.h misc_callbacks.h support.h \ - misc2_callbacks.c callback_func.h debug.h finance.h game_gui.h load_save.h main.h misc2_callbacks.h misc2_callback_func.h misc2_interface.h player.h support.h transfer.h treeview.h user.h window.h \ + misc2_callbacks.c callbacks.h callback_func.h debug.h finance.h game_gui.h load_save.h main.h misc2_callbacks.h misc2_callback_func.h misc2_interface.h player.h support.h transfer.h treeview.h user.h window.h \ misc2_callback_func.c callbacks.h file.h finance.h game_gui.h maths.h misc2_callback_func.h option.h player.h support.h team.h treeview.h transfer.h user.h window.h \ misc2_interface.c misc2_interface.h misc2_callbacks.h support.h \ option.c option.h variables.h \ @@ -44,7 +44,7 @@ bygfoot_SOURCES = \ support.c support.h \ table.c cup.h league.h table.h variables.h \ team.c cup.h fixture.h game.h game_gui.h league.h maths.h misc.h option.h player.h team.h transfer.h user.h \ - transfer.c cup.h finance.h free.h game_gui.h maths.h option.h player.h support.h team.h transfer.h treeview.h user.h \ + transfer.c cup.h finance.h free.h game_gui.h maths.h misc.h option.h player.h support.h team.h transfer.h treeview.h user.h \ treeview.c cup.h finance.h fixture.h free.h game.h league.h live_game.h maths.h misc.h player.h option.h support.h team.h transfer.h treeview.h treeview_helper.h user.h \ treeview_helper.c cup.h file.h fixture.h free.h league.h misc.h option.h player.h support.h team.h transfer.h treeview.h treeview_helper.h user.h variables.h \ user.c cup.h fixture.h free.h game_gui.h league.h live_game.h maths.h misc.h option.h player.h team.h transfer.h treeview.h user.h window.h \ diff --git a/src/bygfoot.h b/src/bygfoot.h index a90cecf7..8571b470 100644 --- a/src/bygfoot.h +++ b/src/bygfoot.h @@ -120,6 +120,7 @@ typedef struct *menu_player, *user_management, *wdebug, - *help; + *help, + *transfer_dialog; } Windows; #endif diff --git a/src/callback_func.c b/src/callback_func.c index eafdeb33..3aee0d4e 100644 --- a/src/callback_func.c +++ b/src/callback_func.c @@ -24,6 +24,9 @@ callback_show_next_live_game(void) { gint i, j; + for(i=0;ilen;i++) + usr(i).counters[COUNT_USER_TOOK_TURN] = 0; + for(i=0;ilen;i++) for(j=0;jlen;j++) if(g_array_index(lig(i).fixtures, Fixture, j).week_number == week && @@ -293,7 +296,10 @@ callback_transfer_list_user(gint button, gint idx) else if(button == 1) { if(trans(idx).offers->len == 0) - game_gui_print_message("There are no offers for the player."); + game_gui_print_message(_("There are no offers for the player.")); + else if(trans(idx).offers->len > 0 && + !transoff(idx, 0).accepted) + game_gui_print_message(_("There are some offers for the player which you will see next week.")); else { misc_print_grouped_int(transoff(idx, 0).fee, buf2, FALSE); @@ -311,7 +317,7 @@ callback_transfer_list_user(gint button, gint idx) buf2, buf3); stat1 = STATUS_TRANSFER_OFFER_USER; stat2 = idx; - window_show_yesno(buf); + window_show_transfer_dialog(buf); } } } @@ -329,8 +335,11 @@ callback_transfer_list_cpu(gint button, gint idx) if(button == 3) { g_array_remove_index(trans(idx).offers, 0); - trans(idx).locked = FALSE; + if(trans(idx).offers->len > 0) + transfer_offers_notify(&trans(idx), FALSE); + game_gui_print_message(_("Your offer has been removed.")); + on_button_transfers_clicked(NULL, NULL); return; } @@ -347,7 +356,7 @@ callback_transfer_list_cpu(gint button, gint idx) buf2, buf3, player_of_id_team(trans(idx).tm, trans(idx).id)->name->str); stat1 = STATUS_TRANSFER_OFFER_CPU; stat2 = idx; - window_show_yesno(buf); + window_show_transfer_dialog(buf); } /** Handle a click on the transfer list. @@ -364,12 +373,17 @@ callback_transfer_list_clicked(gint button, gint idx) callback_transfer_list_user(button, idx); return; } - else if(tr->locked) + else if(tr->offers->len > 0 && + transoff(idx, 0).accepted) { if(transoff(idx, 0).tm == current_user.tm) { if(team_is_user(tr->tm) != -1) - game_gui_print_message(_("The team owners are considering your offer currently.")); + { + sprintf(buf, _("User %s didn't consider your offer yet."), + user_from_team(tr->tm)->name->str); + game_gui_print_message(buf); + } else callback_transfer_list_cpu(button, idx); } diff --git a/src/callbacks.c b/src/callbacks.c index fc9de20e..a0a3cb8e 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -166,17 +166,24 @@ void on_button_new_week_clicked (GtkButton *button, gpointer user_data) { - if(!opt_int("int_opt_confirm_unfit") || - !query_user_teams_have_unfit()) + if(transfer_offers_pending()) + game_gui_show_warning(_("You still have some transfer business to manage.")); + else if(query_user_no_turn()) { - load_save_autosave(); - callback_show_next_live_game(); + stat1 = STATUS_QUERY_USER_NO_TURN; + window_show_yesno(_("At least one user didn't take his turn this week. Continue?")); } - else + else if(opt_int("int_opt_confirm_unfit") && + query_user_teams_have_unfit()) { stat1 = STATUS_QUERY_UNFIT; window_show_yesno(_("There are injured or banned players in one of the user teams. Continue?")); } + else + { + load_save_autosave(); + callback_show_next_live_game(); + } } @@ -519,7 +526,7 @@ on_treeview_right_button_press_event (GtkWidget *widget, { case STATUS_SHOW_TRANSFER_LIST: if(trans(idx - 1).tm == current_user.tm || - trans(idx - 1).locked || + (trans(idx - 1).offers->len > 0 && transoff(idx - 1, 0).accepted) || event->button == 1) callback_transfer_list_clicked(event->button, idx - 1); else if(event->button == 3) @@ -551,8 +558,13 @@ void on_menu_next_user_activate (GtkMenuItem *menuitem, gpointer user_data) { - cur_user = (cur_user + 1) % users->len; + if(transfer_offers_pending()) + { + game_gui_show_warning(_("You still have some transfer business to manage.")); + return; + } + cur_user = (cur_user + 1) % users->len; user_event_show_next(); on_button_back_to_main_clicked(NULL, NULL); @@ -563,8 +575,13 @@ void on_menu_previous_user_activate (GtkMenuItem *menuitem, gpointer user_data) { - cur_user = (cur_user == 0) ? users->len - 1 : cur_user - 1; + if(transfer_offers_pending()) + { + game_gui_show_warning(_("You still have some transfer business to manage.")); + return; + } + cur_user = (cur_user == 0) ? users->len - 1 : cur_user - 1; user_event_show_next(); on_button_back_to_main_clicked(NULL, NULL); diff --git a/src/enums.h b/src/enums.h index 3075880a..44594ed8 100644 --- a/src/enums.h +++ b/src/enums.h @@ -98,6 +98,7 @@ enum Status0Value STATUS_LOAD_GAME_TEAM_SELECTION, STATUS_QUERY_UNFIT, STATUS_QUERY_QUIT, + STATUS_QUERY_USER_NO_TURN, STATUS_END }; diff --git a/src/game_gui.c b/src/game_gui.c index dbd45310..a35f9b70 100644 --- a/src/game_gui.c +++ b/src/game_gui.c @@ -182,15 +182,18 @@ game_gui_get_radio_items(GtkWidget **style, GtkWidget **scout, void game_gui_set_main_window_header(void) { + gint i; gchar buf[SMALL]; - GtkLabel *label_user= GTK_LABEL(lookup_widget(window.main, "label_user")); - GtkLabel *label_season= GTK_LABEL(lookup_widget(window.main, "label_season")); - GtkLabel *label_week= GTK_LABEL(lookup_widget(window.main, "label_week")); - GtkLabel *label_round= GTK_LABEL(lookup_widget(window.main, "label_round")); - GtkLabel *label_team= GTK_LABEL(lookup_widget(window.main, "label_team")); - GtkLabel *label_league= GTK_LABEL(lookup_widget(window.main, "label_league")); - GtkLabel *label_rank= GTK_LABEL(lookup_widget(window.main, "label_rank")); - GtkLabel *label_money= GTK_LABEL(lookup_widget(window.main, "label_money")); + GtkLabel *label_user= GTK_LABEL(lookup_widget(window.main, "label_user")), + *label_season= GTK_LABEL(lookup_widget(window.main, "label_season")), + *label_week= GTK_LABEL(lookup_widget(window.main, "label_week")), + *label_round= GTK_LABEL(lookup_widget(window.main, "label_round")), + *label_team= GTK_LABEL(lookup_widget(window.main, "label_team")), + *label_league= GTK_LABEL(lookup_widget(window.main, "label_league")), + *label_rank= GTK_LABEL(lookup_widget(window.main, "label_rank")), + *label_money= GTK_LABEL(lookup_widget(window.main, "label_money")); + GtkWidget *menu_users[2] = {lookup_widget(window.main, "menu_next_user"), + lookup_widget(window.main, "menu_previous_user")}; gtk_label_set_text(label_user, current_user.name->str); gui_label_set_text_from_int(label_season, season, FALSE); @@ -207,6 +210,9 @@ game_gui_set_main_window_header(void) gtk_label_set_text(label_team, current_user.tm->name->str); gtk_label_set_text(label_league, league_from_clid(current_user.tm->clid)->name->str); + for(i=0;i<2;i++) + gtk_widget_set_sensitive(menu_users[i], (users->len > 1)); + game_gui_write_av_skills(); game_gui_write_radio_items(); @@ -322,6 +328,8 @@ game_gui_show_main(void) game_gui_set_main_window_header(); treeview_show_user_player_list(); + current_user.counters[COUNT_USER_TOOK_TURN] = 1; + if(current_user.counters[COUNT_USER_SHOW_RES] && stat0 != STATUS_LIVE_GAME_PAUSE) { on_menu_user_show_last_stats_activate(NULL, NULL); @@ -363,7 +371,6 @@ game_gui_clear_entry_message(gpointer data) enum MainWindowInensitiveItems { INSENSITIVE_ITEM_TOOLBAR = 0, -/* INSENSITIVE_ITEM_PLAYER_LIST2, */ INSENSITIVE_ITEM_MENU_FILE, INSENSITIVE_ITEM_MENU_OPTIONS, INSENSITIVE_ITEM_MENU_FIGURES, @@ -403,8 +410,6 @@ game_gui_set_main_window_sensitivity(gboolean value) insensitive_items[INSENSITIVE_ITEM_TOOLBAR] = lookup_widget(window.main, "hbox1"); -/* insensitive_items[INSENSITIVE_ITEM_PLAYER_LIST2] = */ -/* lookup_widget(window.main, "vbox8"); */ insensitive_items[INSENSITIVE_ITEM_MENU_FILE] = lookup_widget(window.main, "menu_file"); insensitive_items[INSENSITIVE_ITEM_MENU_OPTIONS] = diff --git a/src/misc2_callback_func.c b/src/misc2_callback_func.c index d6fca73e..5868f186 100644 --- a/src/misc2_callback_func.c +++ b/src/misc2_callback_func.c @@ -50,6 +50,8 @@ misc2_callback_transfer_user_player(void) player_of_id_team(trans(stat2).tm, trans(stat2).id)->name->str); user_event_add(user_from_team(new_team), EVENT_TYPE_WARNING, -1, -1, NULL, buf); g_array_remove_index(trans(stat2).offers, 0); + if(trans(stat2).offers->len > 0) + transoff(stat2, 0).accepted = TRUE; } } else diff --git a/src/misc2_callbacks.c b/src/misc2_callbacks.c index c49a3419..cf7072d2 100644 --- a/src/misc2_callbacks.c +++ b/src/misc2_callbacks.c @@ -1,3 +1,4 @@ +#include "callbacks.h" #include "callback_func.h" #include "debug.h" #include "finance.h" @@ -160,12 +161,6 @@ on_button_yesno_yes_clicked (GtkButton *button, default: g_warning("on_button_yesno_yes_clicked: unknown status %d\n", stat1); break; - case STATUS_TRANSFER_OFFER_USER: - misc2_callback_transfer_user_player(); - break; - case STATUS_TRANSFER_OFFER_CPU: - misc2_callback_transfer_cpu_player(); - break; case STATUS_FIRE_PLAYER: player_remove_from_team(current_user.tm, stat2); current_user.money -= stat3; @@ -188,6 +183,10 @@ on_button_yesno_yes_clicked (GtkButton *button, case STATUS_QUERY_QUIT: main_exit_program(EXIT_OK, NULL); break; + case STATUS_QUERY_USER_NO_TURN: + load_save_autosave(); + callback_show_next_live_game(); + break; } if(stat4 == STATUS_SHOW_EVENT) @@ -395,3 +394,50 @@ on_spinbutton2_activate (GtkEntry *entry, on_button_digits_ok_clicked(NULL, NULL); } + +gboolean +on_window_transfer_dialog_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + on_button_transfer_later_clicked(NULL, NULL); + return FALSE; +} + + +void +on_button_transfer_yes_clicked (GtkButton *button, + gpointer user_data) +{ + if(stat1 == STATUS_TRANSFER_OFFER_USER) + misc2_callback_transfer_user_player(); + else if(STATUS_TRANSFER_OFFER_CPU) + misc2_callback_transfer_cpu_player(); + + window_destroy(&window.transfer_dialog, FALSE); +} + + +void +on_button_transfer_no_clicked (GtkButton *button, + gpointer user_data) +{ + g_array_remove_index(trans(stat2).offers, 0); + if(trans(stat2).offers->len > 0) + transfer_offers_notify(&trans(stat2), FALSE); + + treeview_show_user_player_list(); + game_gui_set_main_window_header(); + on_button_transfers_clicked(NULL, NULL); + + window_destroy(&window.transfer_dialog, FALSE); +} + + +void +on_button_transfer_later_clicked (GtkButton *button, + gpointer user_data) +{ + window_destroy(&window.transfer_dialog, FALSE); +} + diff --git a/src/misc2_callbacks.h b/src/misc2_callbacks.h index 5cdd6ec3..1fa0adb8 100644 --- a/src/misc2_callbacks.h +++ b/src/misc2_callbacks.h @@ -124,7 +124,6 @@ on_window_help_delete_event (GtkWidget *widget, void on_button_help_close_clicked (GtkButton *button, gpointer user_data); -#endif void on_spinbutton1_activate (GtkEntry *entry, @@ -133,3 +132,21 @@ on_spinbutton1_activate (GtkEntry *entry, void on_spinbutton2_activate (GtkEntry *entry, gpointer user_data); + +gboolean +on_window_transfer_dialog_delete_event (GtkWidget *widget, + GdkEvent *event, + gpointer user_data); + +void +on_button_transfer_yes_clicked (GtkButton *button, + gpointer user_data); + +void +on_button_transfer_no_clicked (GtkButton *button, + gpointer user_data); + +void +on_button_transfer_later_clicked (GtkButton *button, + gpointer user_data); +#endif diff --git a/src/misc2_interface.c b/src/misc2_interface.c index fe47cb13..f9635d67 100644 --- a/src/misc2_interface.c +++ b/src/misc2_interface.c @@ -1094,3 +1094,116 @@ create_window_help (void) return window_help; } +GtkWidget* +create_window_transfer_dialog (void) +{ + GtkWidget *window_transfer_dialog; + GtkWidget *vbox26; + GtkWidget *image14; + GtkWidget *label_transfer_dialog; + GtkWidget *hbox25; + GtkWidget *button_transfer_yes; + GtkWidget *button_transfer_no; + GtkWidget *button_transfer_later; + GtkWidget *alignment8; + GtkWidget *hbox26; + GtkWidget *image15; + GtkWidget *label53; + GtkAccelGroup *accel_group; + GtkTooltips *tooltips; + + tooltips = gtk_tooltips_new (); + + accel_group = gtk_accel_group_new (); + + window_transfer_dialog = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_container_set_border_width (GTK_CONTAINER (window_transfer_dialog), 5); + gtk_window_set_position (GTK_WINDOW (window_transfer_dialog), GTK_WIN_POS_CENTER); + gtk_window_set_modal (GTK_WINDOW (window_transfer_dialog), TRUE); + + vbox26 = gtk_vbox_new (FALSE, 5); + gtk_widget_show (vbox26); + gtk_container_add (GTK_CONTAINER (window_transfer_dialog), vbox26); + + image14 = gtk_image_new_from_stock ("gtk-dialog-question", GTK_ICON_SIZE_DIALOG); + gtk_widget_show (image14); + gtk_box_pack_start (GTK_BOX (vbox26), image14, FALSE, TRUE, 0); + + label_transfer_dialog = gtk_label_new (""); + gtk_widget_show (label_transfer_dialog); + gtk_box_pack_start (GTK_BOX (vbox26), label_transfer_dialog, FALSE, FALSE, 0); + gtk_label_set_line_wrap (GTK_LABEL (label_transfer_dialog), TRUE); + + hbox25 = gtk_hbox_new (FALSE, 3); + gtk_widget_show (hbox25); + gtk_box_pack_start (GTK_BOX (vbox26), hbox25, FALSE, FALSE, 0); + + button_transfer_yes = gtk_button_new_from_stock ("gtk-yes"); + gtk_widget_show (button_transfer_yes); + gtk_box_pack_start (GTK_BOX (hbox25), button_transfer_yes, TRUE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, button_transfer_yes, _("Return"), NULL); + gtk_widget_add_accelerator (button_transfer_yes, "clicked", accel_group, + GDK_Return, 0, + GTK_ACCEL_VISIBLE); + + button_transfer_no = gtk_button_new_from_stock ("gtk-no"); + gtk_widget_show (button_transfer_no); + gtk_box_pack_start (GTK_BOX (hbox25), button_transfer_no, TRUE, TRUE, 0); + + button_transfer_later = gtk_button_new (); + gtk_widget_show (button_transfer_later); + gtk_box_pack_start (GTK_BOX (hbox25), button_transfer_later, TRUE, TRUE, 0); + gtk_tooltips_set_tip (tooltips, button_transfer_later, _("Esc"), NULL); + gtk_widget_add_accelerator (button_transfer_later, "clicked", accel_group, + GDK_Escape, 0, + GTK_ACCEL_VISIBLE); + + alignment8 = gtk_alignment_new (0.5, 0.5, 0, 0); + gtk_widget_show (alignment8); + gtk_container_add (GTK_CONTAINER (button_transfer_later), alignment8); + + hbox26 = gtk_hbox_new (FALSE, 2); + gtk_widget_show (hbox26); + gtk_container_add (GTK_CONTAINER (alignment8), hbox26); + + image15 = gtk_image_new_from_stock ("gtk-go-forward", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (image15); + gtk_box_pack_start (GTK_BOX (hbox26), image15, FALSE, FALSE, 0); + + label53 = gtk_label_new_with_mnemonic (_("Decide later")); + gtk_widget_show (label53); + gtk_box_pack_start (GTK_BOX (hbox26), label53, FALSE, FALSE, 0); + + g_signal_connect ((gpointer) window_transfer_dialog, "delete_event", + G_CALLBACK (on_window_transfer_dialog_delete_event), + NULL); + g_signal_connect ((gpointer) button_transfer_yes, "clicked", + G_CALLBACK (on_button_transfer_yes_clicked), + NULL); + g_signal_connect ((gpointer) button_transfer_no, "clicked", + G_CALLBACK (on_button_transfer_no_clicked), + NULL); + g_signal_connect ((gpointer) button_transfer_later, "clicked", + G_CALLBACK (on_button_transfer_later_clicked), + NULL); + + /* Store pointers to all widgets, for use by lookup_widget(). */ + GLADE_HOOKUP_OBJECT_NO_REF (window_transfer_dialog, window_transfer_dialog, "window_transfer_dialog"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, vbox26, "vbox26"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, image14, "image14"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, label_transfer_dialog, "label_transfer_dialog"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, hbox25, "hbox25"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, button_transfer_yes, "button_transfer_yes"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, button_transfer_no, "button_transfer_no"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, button_transfer_later, "button_transfer_later"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, alignment8, "alignment8"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, hbox26, "hbox26"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, image15, "image15"); + GLADE_HOOKUP_OBJECT (window_transfer_dialog, label53, "label53"); + GLADE_HOOKUP_OBJECT_NO_REF (window_transfer_dialog, tooltips, "tooltips"); + + gtk_window_add_accel_group (GTK_WINDOW (window_transfer_dialog), accel_group); + + return window_transfer_dialog; +} + diff --git a/src/misc2_interface.h b/src/misc2_interface.h index 61f31247..134fa9bc 100644 --- a/src/misc2_interface.h +++ b/src/misc2_interface.h @@ -11,3 +11,4 @@ GtkWidget* create_window_contract (void); GtkWidget* create_window_user_management (void); GtkWidget* create_window_debug (void); GtkWidget* create_window_help (void); +GtkWidget* create_window_transfer_dialog (void); diff --git a/src/transfer.c b/src/transfer.c index d9b26c4d..66752fdb 100644 --- a/src/transfer.c +++ b/src/transfer.c @@ -3,6 +3,7 @@ #include "free.h" #include "game_gui.h" #include "maths.h" +#include "misc.h" #include "option.h" #include "player.h" #include "support.h" @@ -28,14 +29,10 @@ transfer_update(void) } for(i=transfer_list->len - 1;i>=0;i--) - { for(j=trans(i).offers->len - 1;j>=0;j--) - if(trans(i).locked || team_is_user(transoff(i, j).tm) == -1) + if(transoff(i, j).accepted || team_is_user(transoff(i, j).tm) == -1) g_array_remove_index(trans(i).offers, j); - trans(i).locked = FALSE; - } - transfer_add_new_players(); transfer_add_cpu_offers(); transfer_evaluate_offers(); @@ -110,82 +107,37 @@ transfer_offer_compare_func(gconstpointer a, gconstpointer b) *tr2 = (const TransferOffer*)b; gint return_value; - if(tr1->fee > tr2->fee) - return_value = -1; - else if(tr2->fee > tr1->fee) - return_value = 1; - else if(tr1->wage > tr2->wage) - return_value = -1; - else if(tr2->wage > tr1->wage) - return_value = 1; - else - return_value = 0; + return_value = (tr1->fee != tr2->fee) ? + misc_int_compare(tr1->fee, tr2->fee) : + misc_int_compare(tr1->wage, tr2->wage); return return_value; } -/** Send notification events about rejected transfer offers for +/** Send notification events about accepted transfer offers for user players. */ void -transfer_offers_notify(Transfer *tr) +transfer_offers_notify(Transfer *tr, gboolean sort) { - gint i; - gboolean valid_offer = FALSE; TransferOffer *off = NULL; - g_array_sort(tr->offers, transfer_offer_compare_func); + if(sort) + g_array_sort(tr->offers, transfer_offer_compare_func); off = &g_array_index(tr->offers, TransferOffer, 0); - for(i=tr->offers->len - 1; i >= 1; i--) - { - if(team_is_user(g_array_index(tr->offers, TransferOffer, i).tm) != -1) - user_event_add(user_from_team(g_array_index(tr->offers, TransferOffer, i).tm), - EVENT_TYPE_TRANSFER_OFFER_REJECTED_BETTER_OFFER, - g_array_index(tr->offers, TransferOffer, i).fee, - g_array_index(tr->offers, TransferOffer, i).wage, - tr->tm, player_of_id_team(tr->tm, tr->id)->name->str); - - g_array_remove_index(tr->offers, i); - } + off->accepted = TRUE; if(team_is_user(tr->tm) != -1) - { user_event_add(user_from_team(tr->tm), EVENT_TYPE_TRANSFER_OFFER_USER, -1, -1, NULL, player_of_id_team(tr->tm, tr->id)->name->str); - valid_offer = TRUE; - tr->locked = TRUE; - } - else if(player_of_id_team(tr->tm, tr->id)->value > off->fee && - player_of_id_team(tr->tm, tr->id)->wage > off->wage) - user_event_add(user_from_team(off->tm), - EVENT_TYPE_TRANSFER_OFFER_REJECTED_FEE_WAGE, - off->fee, off->wage, - tr->tm, player_of_id_team(tr->tm, tr->id)->name->str); - else if(player_of_id_team(tr->tm, tr->id)->value > off->fee) - user_event_add(user_from_team(off->tm), - EVENT_TYPE_TRANSFER_OFFER_REJECTED_FEE, - off->fee, off->wage, - tr->tm, player_of_id_team(tr->tm, tr->id)->name->str); - else if(player_of_id_team(tr->tm, tr->id)->wage > off->wage) - user_event_add(user_from_team(off->tm), - EVENT_TYPE_TRANSFER_OFFER_REJECTED_WAGE, - off->fee, off->wage, - tr->tm, player_of_id_team(tr->tm, tr->id)->name->str); - else if(off->tm->players->len >= const_int("int_team_max_players")) - user_event_add(user_from_team(off->tm), - EVENT_TYPE_TRANSFER_OFFER_ROSTER, -1, -1, - tr->tm, player_of_id_team(tr->tm, tr->id)->name->str); + else - { user_event_add(user_from_team(off->tm), EVENT_TYPE_TRANSFER_OFFER_CPU, -1, -1, NULL, player_of_id_team(tr->tm, tr->id)->name->str); - valid_offer = TRUE; - tr->locked = TRUE; - } - if(!valid_offer) - g_array_remove_index(tr->offers, 0); + if(!sort) + user_event_show_next(); } /** Move players to the users' teams if their offer @@ -198,18 +150,40 @@ transfer_evaluate_offers(void) for(i=transfer_list->len - 1;i>=0;i--) if(trans(i).offers->len > 0) { - for(j=trans(i).offers->len - 1;j >= 0; j--) - if(team_is_user(transoff(i, j).tm) != -1 && - transoff(i, j).fee > BUDGET(team_is_user(transoff(i, j).tm))) + if(team_is_user(trans(i).tm) == -1) + { + for(j=trans(i).offers->len - 1; j >= 0; j--) { - user_event_add(user_from_team(transoff(i, j).tm), - EVENT_TYPE_TRANSFER_OFFER_MONEY, -1, -1, - trans(i).tm, player_of_id_team(trans(i).tm, trans(i).id)->name->str); - g_array_remove_index(trans(i).offers, j); + if(player_of_id_team(trans(i).tm, trans(i).id)->value > transoff(i, j).fee && + player_of_id_team(trans(i).tm, trans(i).id)->wage > transoff(i, j).wage) + { + user_event_add(user_from_team(transoff(i, j).tm), + EVENT_TYPE_TRANSFER_OFFER_REJECTED_FEE_WAGE, + transoff(i, j).fee, transoff(i, j).wage, + trans(i).tm, player_of_id_team(trans(i).tm, trans(i).id)->name->str); + g_array_remove_index(trans(i).offers, j); + } + else if(player_of_id_team(trans(i).tm, trans(i).id)->value > transoff(i, j).fee) + { + user_event_add(user_from_team(transoff(i, j).tm), + EVENT_TYPE_TRANSFER_OFFER_REJECTED_FEE, + transoff(i, j).fee, transoff(i, j).wage, + trans(i).tm, player_of_id_team(trans(i).tm, trans(i).id)->name->str); + g_array_remove_index(trans(i).offers, j); + } + else if(player_of_id_team(trans(i).tm, trans(i).id)->wage > transoff(i, j).wage) + { + user_event_add(user_from_team(transoff(i, j).tm), + EVENT_TYPE_TRANSFER_OFFER_REJECTED_WAGE, + transoff(i, j).fee, transoff(i, j).wage, + trans(i).tm, player_of_id_team(trans(i).tm, trans(i).id)->name->str); + g_array_remove_index(trans(i).offers, j); + } } + } if(trans(i).offers->len > 0) - transfer_offers_notify(&trans(i)); + transfer_offers_notify(&trans(i), TRUE); } } @@ -267,7 +241,6 @@ transfer_add_player(Player *pl, gint time) new.id = pl->id; new.time = time; new.offers = g_array_new(FALSE, FALSE, sizeof(TransferOffer)); - new.locked = FALSE; for(i=0;i<4;i++) { @@ -360,7 +333,8 @@ transfer_player_has_offer(const Player *pl) for(i=0;ilen;i++) if(trans(i).tm == pl->team && trans(i).id == pl->id && - trans(i).locked) + trans(i).offers->len > 0 && + transoff(i, 0).accepted) return &transoff(i, 0); return NULL; @@ -374,10 +348,6 @@ transfer_add_offer(gint idx, Team *tm, gint fee, gint wage) gint i; TransferOffer new; - new.tm = tm; - new.fee = fee; - new.wage = wage; - for(i=0;ilen;i++) if(transoff(idx, i).tm == tm) { @@ -386,6 +356,11 @@ transfer_add_offer(gint idx, Team *tm, gint fee, gint wage) return TRUE; } + new.tm = tm; + new.fee = fee; + new.wage = wage; + new.accepted = FALSE; + g_array_append_val(trans(idx).offers, new); return FALSE; @@ -445,3 +420,24 @@ transfer_add_remove_user_player(Player *pl) treeview_show_transfer_list(GTK_TREE_VIEW(lookup_widget(window.main, "treeview_right"))); } + +/** Find out whether the current user has to do + some transfer business before a user change or + a new week. */ +gboolean +transfer_offers_pending(void) +{ + gint i; + + for(i=0;ilen;i++) + if((trans(i).tm == current_user.tm && + trans(i).offers->len > 0 && + transoff(i, 0).accepted) || + (team_is_user(trans(i).tm) == -1 && + trans(i).offers->len > 0 && + transoff(i, 0).tm == current_user.tm && + transoff(i, 0).accepted)) + return TRUE; + + return FALSE; +} diff --git a/src/transfer.h b/src/transfer.h index f7d12a0f..b37959b4 100644 --- a/src/transfer.h +++ b/src/transfer.h @@ -60,7 +60,7 @@ void transfer_add_remove_user_player(Player *pl); void -transfer_offers_notify(Transfer *trans); +transfer_offers_notify(Transfer *trans, gboolean sort); const TransferOffer* transfer_player_has_offer(const Player *pl); @@ -68,4 +68,7 @@ transfer_player_has_offer(const Player *pl); gboolean query_transfer_current_team_offer(const Player *pl); +gboolean +transfer_offers_pending(void); + #endif diff --git a/src/transfer_struct.h b/src/transfer_struct.h index 0b01f9e7..ed808535 100644 --- a/src/transfer_struct.h +++ b/src/transfer_struct.h @@ -18,8 +18,6 @@ typedef struct gint fee[QUALITY_END], wage[QUALITY_END]; /** Offers for the player. */ GArray *offers; - /** This is true if an accepted offer is pending. */ - gboolean locked; } Transfer; typedef struct @@ -28,7 +26,8 @@ typedef struct Team *tm; /** Transfer fee and wage offer. */ gint fee, wage; - + /** Whether the offer got accepted. */ + gboolean accepted; } TransferOffer; #endif diff --git a/src/treeview_helper.c b/src/treeview_helper.c index 9428104a..ed16f4fc 100644 --- a/src/treeview_helper.c +++ b/src/treeview_helper.c @@ -963,14 +963,19 @@ treeview_helper_player_name_to_cell(GtkCellRenderer *renderer, gchar *buf, const } else if(off->tm == current_user.tm) { - colour_bg = const_app("string_treeview_helper_color_transfer_offer_locked_cpu_bg"); - colour_fg = const_app("string_treeview_helper_color_transfer_offer_locked_cpu_fg"); + colour_bg = const_app("string_treeview_helper_color_transfer_offer_accepted_current_bg"); + colour_fg = const_app("string_treeview_helper_color_transfer_offer_accepted_current_fg"); + } + else + { + colour_bg = const_app("string_treeview_helper_color_transfer_offer_accepted_other_bg"); + colour_fg = const_app("string_treeview_helper_color_transfer_offer_accepted_other_fg"); } } else if(query_transfer_current_team_offer(pl)) { - colour_bg = const_app("string_treeview_helper_color_transfer_offer_cpu_bg"); - colour_fg = const_app("string_treeview_helper_color_transfer_offer_cpu_fg"); + colour_bg = const_app("string_treeview_helper_color_transfer_offer_bg"); + colour_fg = const_app("string_treeview_helper_color_transfer_offer_fg"); } g_object_set(renderer, "background", colour_bg, NULL); diff --git a/src/user.c b/src/user.c index 23310a15..8cc7e5e0 100644 --- a/src/user.c +++ b/src/user.c @@ -765,3 +765,17 @@ user_history_to_string(const UserHistory *history, gchar *buf) break; } } + +/** Find out whether there's a user who + didn't have his turn before a new week round begins. */ +gboolean +query_user_no_turn(void) +{ + gint i; + + for(i=0;ilen;i++) + if(!usr(i).counters[COUNT_USER_TOOK_TURN]) + return TRUE; + + return FALSE; +} diff --git a/src/user.h b/src/user.h index b2aca5d6..1a4b9088 100644 --- a/src/user.h +++ b/src/user.h @@ -82,4 +82,7 @@ user_history_compare(gconstpointer a, gconstpointer b); void user_job_offer(User *user); +gboolean +query_user_no_turn(void); + #endif diff --git a/src/user_struct.h b/src/user_struct.h index 13ebbd24..7cf594f9 100644 --- a/src/user_struct.h +++ b/src/user_struct.h @@ -45,6 +45,7 @@ enum CounterValue COUNT_USER_STADIUM_CAPACITY, /**< Counter for building stadium seats. */ COUNT_USER_STADIUM_SAFETY, /**< Counter for increasing stadium safety. */ COUNT_USER_SHOW_RES, /**< Whether the latest result is shown when the main window gets refreshed. */ + COUNT_USER_TOOK_TURN, /**< Whether the user took his turn in a week round. */ COUNT_USER_END }; diff --git a/src/window.c b/src/window.c index d941b9d5..adde177a 100644 --- a/src/window.c +++ b/src/window.c @@ -134,7 +134,8 @@ window_show_menu_player(GdkEvent *event) /** Show the digits window with the labels and values set according to the arguments. */ void -window_show_digits(gchar *text_main, gchar* text1, gint value1, gchar* text2, gint value2) +window_show_digits(const gchar *text_main, const gchar* text1, gint value1, + const gchar* text2, gint value2) { GtkLabel *label_main, *label_1, *label_2; GtkSpinButton *spinbutton1, *spinbutton2; @@ -232,16 +233,23 @@ window_show(gpointer window) } /** Show the window where the user can select between yes and no. - @param text The text shown in the window. - @param checkbutton Whether to show the checkbutton. */ + @param text The text shown in the window. */ void -window_show_yesno(gchar *text) +window_show_yesno(const gchar *text) { window_create(WINDOW_YESNO); - gtk_label_set_text(GTK_LABEL(lookup_widget(window.yesno, "label_yesno")), text); } +/** Show the transfer dialog (yes/no/later). + @param text The text to put into the label. */ +void +window_show_transfer_dialog(const gchar *text) +{ + window_create(WINDOW_TRANSFER_DIALOG); + gtk_label_set_text(GTK_LABEL(lookup_widget(window.transfer_dialog, "label_transfer_dialog")), text); +} + /** Set the spinbuttons in the live window to the correct values. */ void @@ -428,6 +436,14 @@ window_create(gint window_type) window.help = create_window_help(); wind = window.help; break; + case WINDOW_TRANSFER_DIALOG: + if(window.transfer_dialog != NULL) + g_warning("window_create: called on already existing window\n"); + else + window.transfer_dialog = create_window_transfer_dialog(); + wind = window.transfer_dialog; + strcpy(buf, "Transfer offer"); + break; } gtk_window_set_title(GTK_WINDOW(wind), buf); diff --git a/src/window.h b/src/window.h index 740cd0ef..879b3ef2 100644 --- a/src/window.h +++ b/src/window.h @@ -23,6 +23,7 @@ enum Windows WINDOW_USER_MANAGEMENT, WINDOW_DEBUG, WINDOW_HELP, + WINDOW_TRANSFER_DIALOG, WINDOW_END }; @@ -39,7 +40,8 @@ void window_destroy(GtkWidget **wind, gboolean count_popups); void -window_show_digits(gchar *text_main, gchar* text1, gint value1, gchar* text2, gint value2); +window_show_digits(const gchar *text_main, const gchar* text1, + gint value1, const gchar* text2, gint value2); void window_show_file_sel(void); @@ -48,7 +50,7 @@ void window_show_stadium(void); void -window_show_yesno(gchar *text); +window_show_yesno(const gchar *text); void window_show_options(void); @@ -59,4 +61,7 @@ window_show_menu_player(GdkEvent *event); void window_live_set_spinbuttons(void); +void +window_show_transfer_dialog(const gchar *text); + #endif diff --git a/src/xml_loadsave_transfers.c b/src/xml_loadsave_transfers.c index 330dca58..05072c0b 100644 --- a/src/xml_loadsave_transfers.c +++ b/src/xml_loadsave_transfers.c @@ -10,7 +10,6 @@ enum TAG_TRANSFERS = TAG_START_TRANSFERS, TAG_TRANSFER, TAG_TRANSFER_PLAYER_ID, - TAG_TRANSFER_LOCKED, TAG_TRANSFER_TIME, TAG_TRANSFER_FEE, TAG_TRANSFER_WAGE, @@ -18,6 +17,7 @@ enum TAG_TRANSFER_OFFER_TEAM_ID, TAG_TRANSFER_OFFER_FEE, TAG_TRANSFER_OFFER_WAGE, + TAG_TRANSFER_OFFER_ACCEPTED, TAG_END }; @@ -77,7 +77,6 @@ xml_loadsave_transfers_end_element (GMarkupParseContext *context, } else if(tag == TAG_TEAM_ID || tag == TAG_TRANSFER_PLAYER_ID || - tag == TAG_TRANSFER_LOCKED || tag == TAG_TRANSFER_TIME || tag == TAG_TRANSFER_FEE || tag == TAG_TRANSFER_OFFER || @@ -93,6 +92,7 @@ xml_loadsave_transfers_end_element (GMarkupParseContext *context, } else if(tag == TAG_TRANSFER_OFFER_WAGE || tag == TAG_TRANSFER_OFFER_FEE || + tag == TAG_TRANSFER_OFFER_ACCEPTED || tag == TAG_TRANSFER_OFFER_TEAM_ID) state = TAG_TRANSFER_OFFER; else if(tag != TAG_TRANSFERS) @@ -119,8 +119,6 @@ xml_loadsave_transfers_text (GMarkupParseContext *context, new_transfer.tm = team_of_id(int_value); else if(state == TAG_TRANSFER_PLAYER_ID) new_transfer.id = int_value; - else if(state == TAG_TRANSFER_LOCKED) - new_transfer.locked = int_value; else if(state == TAG_TRANSFER_TIME) new_transfer.time = int_value; else if(state == TAG_TRANSFER_FEE) @@ -131,6 +129,8 @@ xml_loadsave_transfers_text (GMarkupParseContext *context, new_offer.tm = team_of_id(int_value); else if(state == TAG_TRANSFER_OFFER_WAGE) new_offer.wage = int_value; + else if(state == TAG_TRANSFER_OFFER_ACCEPTED) + new_offer.accepted = int_value; else if(state == TAG_TRANSFER_OFFER_FEE) new_offer.fee = int_value; } @@ -187,7 +187,6 @@ xml_loadsave_transfers_write(const gchar *prefix) xml_write_int(fil, trans(i).tm->id, TAG_TEAM_ID, I1); xml_write_int(fil, trans(i).id, TAG_TRANSFER_PLAYER_ID, I1); - xml_write_int(fil, trans(i).locked, TAG_TRANSFER_LOCKED, I1); xml_write_int(fil, trans(i).time, TAG_TRANSFER_TIME, I1); for(j=0;j\n", I1, TAG_USER_HISTORY); } + for(j=0;jlen;j++) + { + fprintf(fil, "%s<_%d>\n", I1, TAG_USER_EVENT); + + xml_write_int(fil, g_array_index(usr(i).events, Event, j).type, + TAG_USER_EVENT_TYPE, I2); + xml_write_int(fil, g_array_index(usr(i).events, Event, j).value1, + TAG_USER_EVENT_VALUE1, I2); + xml_write_int(fil, g_array_index(usr(i).events, Event, j).value2, + TAG_USER_EVENT_VALUE2, I2); + xml_write_g_string(fil, g_array_index(usr(i).events, Event, j).value_string, + TAG_USER_EVENT_VALUE_STRING, I2); + + fprintf(fil, "%s\n", I1, TAG_USER_EVENT); + } + fprintf(fil, "\n", TAG_USER); } diff --git a/support_files/bygfoot_app b/support_files/bygfoot_app index bc95176e..2e947ae0 100644 --- a/support_files/bygfoot_app +++ b/support_files/bygfoot_app @@ -28,16 +28,22 @@ string_treeview_helper_color_default_foreground black string_treeview_helper_color_transfer_offer_user_fg white string_treeview_helper_color_transfer_offer_user_bg darkgreen -# colours for cpu players on the list that have -# a valid (locked) offer -string_treeview_helper_color_transfer_offer_locked_cpu_fg white -string_treeview_helper_color_transfer_offer_locked_cpu_bg darkorange +# colours for players on the list that have +# an accepted offer by the current user +string_treeview_helper_color_transfer_offer_accepted_current_fg white +string_treeview_helper_color_transfer_offer_accepted_current_bg darkorange + +# colours for players on the list that have +# an accepted offer by another user +string_treeview_helper_color_transfer_offer_accepted_other_fg white +string_treeview_helper_color_transfer_offer_accepted_other_bg darkred # colours for cpu players for which the user just # placed an offer -string_treeview_helper_color_transfer_offer_cpu_fg black -string_treeview_helper_color_transfer_offer_cpu_bg lightblue +string_treeview_helper_color_transfer_offer_fg black +string_treeview_helper_color_transfer_offer_bg lightblue +# player attribute colours string_treeview_helper_color_player_pos_goalie_bg black string_treeview_helper_color_player_pos_goalie_fg white string_treeview_helper_color_player_pos_defender_bg darkgreen