#include "cup.h" #include "file.h" #include "finance.h" #include "fixture.h" #include "free.h" #include "game_gui.h" #include "gui.h" #include "league.h" #include "live_game.h" #include "load_save.h" #include "main.h" #include "maths.h" #include "option.h" #include "start_end.h" #include "table.h" #include "team.h" #include "transfer.h" #include "user.h" #include "variables.h" #include "xml_name.h" /** Prototype of a function called at the start or end of a week round. */ typedef void(*WeekFunc)(void); /** Array of functions called when a week round is ended. */ WeekFunc end_week_round_funcs[] = {end_week_round_results, end_week_round_sort_tables, end_week_round_update_fixtures, NULL}; /** Array of functions called when a week round is started. */ WeekFunc start_week_round_funcs[] = {start_week_round_update_user_teams , NULL}; /** Array of functions called when a week is started. */ WeekFunc start_week_funcs[] = {start_week_update_users, start_week_update_user_teams, start_week_update_user_finances, transfer_update, NULL}; WeekFunc end_week_funcs[] = {NULL}; /** Generate the teams etc. */ void start_new_game(void) { xml_name_read(opt_str("string_opt_player_names_file"), -1); start_write_variables(); start_generate_league_teams(); start_new_season(); xml_name_read(opt_str("string_opt_player_names_file"), 1000); } /** Make new fixtures, nullify things etc. */ void start_new_season(void) { gint i; xml_name_read(opt_str("string_opt_player_names_file"), 1000); week = week_round = 1; /*todo: nullify, promotion/relegation*/ if(season > 1) start_new_season_team_movements(); start_load_cup_teams(); for(i=0;ilen;i++) { league_season_start(&lig(i)); fixture_write_league_fixtures(&lig(i)); } for(i=acps->len - 1;i >= 0;i--) { if(acp(i)->id >= ID_PROM_CUP_START) g_ptr_array_remove_index(acps, i); else fixture_write_cup_fixtures(&cp(i)); } for(i=0;ilen;i++) usr(i).tm = team_of_id(usr(i).team_id); } /** Fill some global variables with default values at the beginning of a new game. */ void start_write_variables(void) { gint i; season = 1; cur_user = 0; /*d*/ /* week=24; week_round = 2; */ for(i=0;ilen;i++) file_load_user_conf_file(&usr(i)); } /** Generate the teams in the leagues. */ void start_generate_league_teams(void) { gint i, j; if(ligs->len == 0) main_exit_program(EXIT_NO_LEAGUES, "start_generate_league_teams: no leagues found. there must be at least one league in the game.\n"); for(i=0;ilen;i++) for(j=0;jlen;j++) team_generate_players_stadium(&g_array_index(lig(i).teams, Team, j)); } /** Load the names from the xml files for the cups and generate the teams. */ void start_load_cup_teams(void) { gint i; for(i=0;ilen;i++) if(cp(i).type == CUP_TYPE_INTERNATIONAL) { cup_load_choose_teams(&cp(i)); cup_load_choose_team_user(&cp(i)); } } /** End a week round. */ void end_week_round(void) { gint i; gboolean new_week = TRUE; WeekFunc *end_func = end_week_round_funcs; while(*end_func != NULL) { (*end_func)(); end_func++; } week_round++; for(i=0;ilen;i++) if(query_fixture_in_week_round(lig(i).id, week, week_round)) { new_week = FALSE; break; } for(i=0;ilen;i++) if(query_fixture_in_week_round(acp(i)->id, week, week_round)) { new_week = FALSE; break; } if(new_week) { if(query_start_end_season_end()) { season++; week = 1; start_new_season(); } else week++; week_round = 1; start_week(); } start_week_round(); } /** Calculate the match results of a week round. */ void end_week_round_results(void) { gint i, j, done = 0; gchar buf[SMALL], buf2[SMALL]; gfloat num_matches = (gfloat)fixture_get_number_of_matches(week, week_round); for(i=0;ilen;i++) if(week_round == 1) { for(j=0;jlen;j++) if(g_array_index(lig(i).fixtures, Fixture, j).week_number == week && g_array_index(lig(i).fixtures, Fixture, j).week_round_number == week_round && g_array_index(lig(i).fixtures, Fixture, j).attendance == -1) { live_game_calculate_fixture(&g_array_index(lig(i).fixtures, Fixture, j)); done++; fixture_result_to_buf(&g_array_index(lig(i).fixtures, Fixture, j), buf); sprintf(buf2, "%s %s %s", g_array_index(lig(i).fixtures, Fixture, j).teams[0]->name->str, buf, g_array_index(lig(i).fixtures, Fixture, j).teams[1]->name->str); gui_show_progress((gfloat)done / num_matches, buf2); } } for(i=0;ilen;i++) if(week_round > 1 || query_cup_is_prom(acp(i)->id)) { for(j=0;jfixtures->len;j++) { if(g_array_index(acp(i)->fixtures, Fixture, j).week_number == week && g_array_index(acp(i)->fixtures, Fixture, j).week_round_number == week_round && g_array_index(acp(i)->fixtures, Fixture, j).attendance == -1) { live_game_calculate_fixture(&g_array_index(acp(i)->fixtures, Fixture, j)); done++; fixture_result_to_buf(&g_array_index(acp(i)->fixtures, Fixture, j), buf); sprintf(buf2, "%s %s %s", g_array_index(acp(i)->fixtures, Fixture, j).teams[0]->name->str, buf, g_array_index(acp(i)->fixtures, Fixture, j).teams[1]->name->str); gui_show_progress((gfloat)done / num_matches, buf2); } } } gui_show_progress(-1, ""); } /** Sort league and cup tables. */ void end_week_round_sort_tables(void) { gint i, j; for(i=0;ilen;i++) if(query_fixture_in_week_round(lig(i).id, week, week_round)) g_array_sort_with_data(lig(i).table.elements, (GCompareDataFunc)table_element_compare_func, GINT_TO_POINTER(lig(i).id)); for(i=0;ilen;i++) if(acp(i)->tables != NULL && acp(i)->tables->len != 0 && query_fixture_in_week_round(acp(i)->id, week, week_round) && g_array_index(acp(i)->fixtures, Fixture, acp(i)->fixtures->len - 1).round == g_array_index(acp(i)->tables, Table, 0).round) for(j=0;jtables->len;j++) g_array_sort_with_data(g_array_index(acp(i)->tables, Table, j).elements, (GCompareDataFunc)table_element_compare_func, GINT_TO_POINTER(acp(i)->id)); } /** Update cup fixtures. */ void end_week_round_update_fixtures(void) { gint i; for(i=0;ilen;i++) if(acp(i)->next_fixture_update_week == week && acp(i)->next_fixture_update_week_round == week_round) fixture_update(acp(i)); for(i=0;ilen;i++) if(league_has_prom_games((&lig(i))) && query_league_prom_games_begin(&lig(i))) { if(season == 1) lig(i).prom_rel.prom_games_cup.last_week = cup_get_last_week_from_first(&lig(i).prom_rel.prom_games_cup, week + 1); fixture_write_cup_fixtures(&lig(i).prom_rel.prom_games_cup); g_ptr_array_add(acps, &lig(i).prom_rel.prom_games_cup); } for(i=0;ilen;i++) { if(query_cup_supercup_begins(&scp(i))) { if(season == 1) scp(i).last_week = cup_get_last_week_from_first(&scp(i), week + 1); fixture_write_cup_fixtures(&scp(i)); g_ptr_array_add(acps, &scp(i)); } } } /** Start a new week round. */ void start_week_round(void) { WeekFunc *start_func = start_week_round_funcs; while(*start_func != NULL) { (*start_func)(); start_func++; } if(/*d*/FALSE && !query_user_games_this_week_round() && ((week_round == 1 && !query_user_games_in_week_round(week - 1, fixture_last_week_round(week - 1))) || (week_round > 1 && !query_user_games_in_week_round(week, week_round - 1)))) end_week_round(); else { cur_user = 0; game_gui_show_main(); /*d ??*/ /* if(week_round == 1) */ user_event_show_next(); } } /** Start a new week. */ void start_week(void) { WeekFunc *start_func = start_week_funcs; while(*start_func != NULL) { (*start_func)(); start_func++; } } /** Age increase etc. of players. CPU teams get updated at the end of their matches (to avoid cup teams getting updated too often). */ void start_week_update_user_teams(void) { gint i; for(i=0;ilen;i++) team_update_user_team_weekly(usr(i).tm); } /** Do some things at the beginning of each new round for the user teams. */ void start_week_round_update_user_teams(void) { gint i; for(i=0;ilen;i++) team_update_user_team_week_roundly(usr(i).tm); } /** Deduce wages etc. */ void start_week_update_user_finances(void) { gint i; for(i=0;ilen;i++) finance_update_user_weekly(&usr(i)); } /** Some general user update. */ void start_week_update_users(void) { gint i; for(i=0;ilen;i++) { if(usr(i).scout >= 100) usr(i).scout = math_get_place(usr(i).scout, 2); if(usr(i).physio >= 100) usr(i).physio = math_get_place(usr(i).physio, 2); user_weekly_update_counters(&usr(i)); } } /** Check whether the season has ended. */ gboolean query_start_end_season_end(void) { gint i, j; for(i=0;ilen;i++) for(j=0;jlen;j++) if(g_array_index(lig(i).fixtures, Fixture, j).week_number > week) return FALSE; for(i=0;ilen;i++) for(j=0;jfixtures->len;j++) if(g_array_index(acp(i)->fixtures, Fixture, j).week_number > week) return FALSE; return TRUE; } /** Manage promotions and relegations at the beginning of a new season. */ void start_new_season_team_movements(void) { gint i, j, k; GArray *team_movements = g_array_new(FALSE, FALSE, sizeof(TeamMove)); for(i=0;ilen;i++) league_get_team_movements(&lig(i), team_movements); for(i=0;ilen;i++) g_array_append_val(lig(g_array_index(team_movements, TeamMove, i).league_idx).teams, g_array_index(team_movements, TeamMove, i).tm); g_array_free(team_movements, TRUE); for(i=0;ilen;i++) { for(j=0;jlen;j++) { g_array_index(lig(i).teams, Team, j).clid = lig(i).id; for(k=0;klen;k++) g_array_index(g_array_index(lig(i).teams, Team, j).players, Player, k).team = &g_array_index(lig(i).teams, Team, j); } } }