bygfoot/src/misc2_callback_func.c

378 lines
12 KiB
C

/*
misc2_callback_func.c
Bygfoot Football Manager -- a small and simple GTK2-based
football management game.
http://bygfoot.sourceforge.net
Copyright (C) 2005 Gyözö Both (gyboth@bygfoot.com)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "callbacks.h"
#include "callback_func.h"
#include "file.h"
#include "finance.h"
#include "free.h"
#include "game_gui.h"
#include "job.h"
#include "league.h"
#include "maths.h"
#include "misc.h"
#include "misc2_callback_func.h"
#include "option.h"
#include "player.h"
#include "support.h"
#include "team.h"
#include "treeview.h"
#include "treeview2.h"
#include "treeview_helper.h"
#include "transfer.h"
#include "user.h"
#include "window.h"
/** Transfer a user player. */
void
misc2_callback_transfer_user_player(void)
{
#ifdef DEBUG
printf("misc2_callback_transfer_user_player\n");
#endif
Team *new_team = transoff(stat2, 0).tm;
if (current_user.tm->players->len - 1 < const_int("int_team_min_players"))
{
game_gui_show_warning(_("Your team can't have less than 11 players."));
}
else
{
if(team_is_user(new_team) != -1)
{
if((new_team->players->len < const_int("int_team_max_players")) &&
(BUDGET(team_is_user(new_team)) >= transoff(stat2, 0).fee))
{
current_user.money += transoff(stat2, 0).fee;
current_user.money_in[1][MON_IN_TRANSFERS] += transoff(stat2, 0).fee;
user_from_team(new_team)->money -= transoff(stat2, 0).fee;
user_from_team(new_team)->money_out[1][MON_OUT_TRANSFERS] -=
transoff(stat2, 0).fee;
if(player_of_id_team(trans(stat2).tm, trans(stat2).id)->id ==
opt_user_int("int_opt_user_penalty_shooter"))
opt_user_set_int("int_opt_user_penalty_shooter", -1);
player_copy(player_of_id_team(trans(stat2).tm, trans(stat2).id),
new_team, new_team->players->len);
player_of_idx_team(new_team, new_team->players->len - 1)->contract =
(gfloat)math_rndi(const_int("int_transfer_contract_lower"),
const_int("int_transfer_contract_upper"));
player_of_idx_team(new_team, new_team->players->len - 1)->wage =
transoff(stat2, 0).wage;
g_array_remove_index(current_user.tm->players,
player_id_index(current_user.tm, trans(stat2).id, TRUE));
transfer_remove_player(stat2);
}
else
{
game_gui_show_warning(_("%s couldn't afford to buy %s or his roster was full."),
user_from_team(new_team)->name,
player_of_id_team(trans(stat2).tm, trans(stat2).id)->name);
user_event_add(user_from_team(new_team), EVENT_TYPE_WARNING, -1, -1, NULL,
_("You didn't have enough money to buy %s or your roster was full."),
player_of_id_team(trans(stat2).tm, trans(stat2).id)->name);
g_array_remove_index(trans(stat2).offers, 0);
if(trans(stat2).offers->len > 0 && transoff(stat2, 0).status == TRANSFER_OFFER_NOT_CONSIDERED)
transoff(stat2, 0).status = TRANSFER_OFFER_ACCEPTED;
}
}
else
{
current_user.money += transoff(stat2, 0).fee;
current_user.money_in[1][MON_IN_TRANSFERS] += transoff(stat2, 0).fee;
player_remove_from_team(current_user.tm, player_id_index(current_user.tm, trans(stat2).id, TRUE));
}
}
treeview_show_user_player_list();
game_gui_set_main_window_header();
on_button_transfers_clicked(NULL, NULL);
}
/** Transfer a cpu player to a user team. */
void
misc2_callback_transfer_cpu_player(void)
{
#ifdef DEBUG
printf("misc2_callback_transfer_cpu_player\n");
#endif
if(current_user.tm->players->len > const_int("int_team_max_players") ||
BUDGET(cur_user) < transoff(stat2, 0).fee)
{
game_gui_show_warning(_("Your player roster is full or you don't enough money."));
return;
}
player_copy(player_of_id_team(trans(stat2).tm, trans(stat2).id),
current_user.tm, current_user.tm->players->len);
player_of_idx_team(current_user.tm, current_user.tm->players->len - 1)->contract =
(gfloat)math_rndi(const_int("int_transfer_contract_lower"),
const_int("int_transfer_contract_upper"));
player_of_idx_team(current_user.tm, current_user.tm->players->len - 1)->wage =
transoff(stat2, 0).wage;
user_from_team(current_user.tm)->money -= transoff(stat2, 0).fee;
user_from_team(current_user.tm)->money_out[1][MON_OUT_TRANSFERS] -=
transoff(stat2, 0).fee;
player_replace_by_new(player_of_id_team(trans(stat2).tm, trans(stat2).id), FALSE);
transfer_remove_player(stat2);
treeview_show_user_player_list();
game_gui_set_main_window_header();
if(week < transfer_get_deadline() || transfer_list->len > 0 )
on_button_transfers_clicked(NULL, NULL);
else
on_button_back_to_main_clicked(NULL, NULL);
}
/** Change the user team's structure to a value he's specified. */
gboolean
misc2_callback_change_structure(gint structure)
{
#ifdef DEBUG
printf("misc2_callback_change_structure\n");
#endif
gint poss_struct = team_find_appropriate_structure(current_user.tm);
if(math_get_place(structure, 1) + math_get_place(structure, 2) +
math_get_place(structure, 3) !=
math_get_place(poss_struct, 1) + math_get_place(poss_struct, 2) +
math_get_place(poss_struct, 3))
{
game_gui_show_warning(_("The structure value %d is invalid."), structure);
return FALSE;
}
team_change_structure(current_user.tm, structure);
treeview_show_user_player_list();
setsav0;
return TRUE;
}
/** Handle a click on the contract offer button. */
void
misc2_callback_contract_offer(void)
{
#ifdef DEBUG
printf("misc2_callback_contract_offer\n");
#endif
gint i;
gchar buf[SMALL];
GtkSpinButton *spinbutton;
gint value = 0;
Player *pl = (Player*)statp;
gtk_widget_set_sensitive(lookup_widget(window.contract, "button_contract_cancel"), FALSE);
for(i=0;i<4;i++)
{
sprintf(buf, "radiobutton_contract%d", i + 1);
if(gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(lookup_widget(window.contract, buf))))
{
sprintf(buf, "spinbutton_contract%d", i + 1);
spinbutton = GTK_SPIN_BUTTON(lookup_widget(window.contract, buf));
value = gtk_spin_button_get_value_as_int(spinbutton);
if(value >= (gint)rint((gfloat)stat1 *
(1 + (i * const_float("float_contract_scale_factor") *
powf(-1, (pl->age > pl->peak_age))))))
{
pl->contract += (i + 1);
pl->offers = 0;
pl->wage = value;
game_gui_show_warning(_("%s accepts your offer."), pl->name);
window_destroy(&window.contract);
}
else
{
pl->offers++;
if(pl->offers < const_int("int_contract_max_offers"))
game_gui_show_warning(_("%s rejects your offer. You may still make %d offers."),
pl->name,
const_int("int_contract_max_offers") - pl->offers);
else
{
game_gui_show_warning(_("%s rejects your offer and won't negotiate with you anymore. You should sell him before his contract expires (he'll simply leave your team otherwise)."),
pl->name);
window_destroy(&window.contract);
}
}
break;
}
}
}
/** Add a user to the users array. */
void
misc2_callback_add_user(void)
{
#ifdef DEBUG
printf("misc2_callback_add_user\n");
#endif
GtkTreeView *treeview_user_management_teams =
GTK_TREE_VIEW(lookup_widget(window.user_management,
"treeview_user_management_teams"));
GtkEntry *entry_user_management =
GTK_ENTRY(lookup_widget(window.user_management, "entry_user_management"));
const gchar *user_name = gtk_entry_get_text(entry_user_management);
User new_user = user_new();
Team *tm = (Team*)treeview_helper_get_pointer(treeview_user_management_teams, 2);
if(strlen(user_name) > 0)
{
misc_string_assign(&new_user.name, user_name);
gtk_entry_set_text(entry_user_management, "");
}
new_user.tm = tm;
new_user.team_id = tm->id;
user_history_add(&new_user, USER_HISTORY_START_GAME,
tm->name, league_cup_get_name_string(tm->clid),
NULL, NULL);
g_array_append_val(users, new_user);
file_load_user_conf_file(&usr(users->len - 1));
user_set_up_team(&usr(users->len - 1), TRUE);
treeview_show_users(
GTK_TREE_VIEW(lookup_widget(window.user_management,
"treeview_user_management_users")));
treeview_show_team_list(treeview_user_management_teams, FALSE, FALSE);
setsav0;
}
/** Handle a click in the MM window treeview.
@param widget The treeview widget.
@param row_num The row that's been clicked on.
@param col_num The column number. */
void
misc2_callback_mmatches_button_press(GtkWidget *widget, gint row_num, gint col_num, Bygfoot *bygfoot)
{
#ifdef DEBUG
printf("misc2_callback_mmatches_button_press\n");
#endif
if(row_num < current_user.mmatches->len)
{
if(col_num == TREEVIEW_MMATCH_COL_REPLAY)
{
stat1 = STATUS_SHOW_LAST_MATCH;
stat3 = 0;
callback_show_last_match(
TRUE,
&g_array_index(current_user.mmatches, MemMatch, row_num).lg,
bygfoot);
}
else if(col_num == TREEVIEW_MMATCH_COL_REMOVE)
{
gtk_widget_hide(widget);
free_g_string(&g_array_index(current_user.mmatches, MemMatch, row_num).
competition_name);
free_gchar_ptr(g_array_index(current_user.mmatches, MemMatch, row_num).
country_name);
free_live_game(&g_array_index(current_user.mmatches, MemMatch, row_num).lg);
g_array_remove_index(current_user.mmatches, row_num);
treeview2_show_mmatches();
gtk_widget_show(widget);
}
else if(col_num == TREEVIEW_MMATCH_COL_EXPORT)
{
stat5 = STATUS_SELECT_MM_FILE_EXPORT;
stat4 = row_num;
window_show_file_sel(bygfoot);
}
}
else if(row_num == current_user.mmatches->len && col_num == 1)
{
if(current_user.live_game.units->len == 0)
{
game_gui_show_warning(_("No match stored."));
return;
}
user_mm_add_last_match(FALSE, FALSE);
treeview2_show_mmatches();
}
}
/** Find out whether the user's application for the job
is accepted and show the appropriate popups.
@return TRUE if accepted, FALSE otherwise. */
gboolean
misc2_callback_evaluate_job_application(Job *job, User *user)
{
#ifdef DEBUG
printf("misc2_callback_evaluate_job_application\n");
#endif
if(!query_job_application_successful(job, user))
{
game_gui_show_warning(
_("The owners of %s politely reject your application. You're not successful enough in their eyes."),
job_get_team(job)->name);
return FALSE;
}
if(job->type != JOB_TYPE_NATIONAL)
{
game_gui_show_warning(
/* A lame duck is someone who will quit his job soon and thus doesn't have
a lot of influence/impact anymore, e.g. an American president during
the last 2 years of his second presidency. */
_("The owners of %s accept your application. Since %s don't want to get stuck with a lame duck, you get fired instantly and spend the rest of the current season tending your garden."),
job_get_team(job)->name, user->tm->name);
job_change_country(job);
}
else
game_gui_show_warning(
_("The owners of %s accept your application."),
job_get_team(job)->name);
user_change_team(user, team_of_id(job->team_id));
if(job->type == JOB_TYPE_NATIONAL)
job_remove(job, TRUE);
else
free_jobs(TRUE);
return TRUE;
}