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