diff --git a/src/Makefile.am b/src/Makefile.am index a3ad7e16..540727f8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -52,6 +52,7 @@ bygfoot_SOURCES = \ xml_loadsave_cup.c cup.h file.h misc.h table.h team.h xml.h xml_loadsave_cup.h xml_loadsave_fixtures.h xml_loadsave_table.h xml_loadsave_teams.h \ xml_loadsave_fixtures.c file.h fixture.h misc.h team.h xml.h xml_loadsave_fixtures.h \ xml_loadsave_league.c file.h league.h misc.h xml.h xml_loadsave_fixtures.h xml_loadsave_league.h xml_loadsave_table.h xml_loadsave_teams.h \ + xml_loadsave_league_stat.c file.h misc.h stat.h team.h xml_loadsave_league_stat.h xml.h \ xml_loadsave_live_game.c cup.h file.h fixture.h league.h live_game.h misc.h variables.h xml.h xml_loadsave_live_game.h \ xml_loadsave_table.c file.h misc.h team.h xml.h xml_loadsave_table.h \ xml_loadsave_teams.c file.h misc.h player.h team.h xml.h xml_loadsave_teams.h \ diff --git a/src/league.c b/src/league.c index 5c0dc828..10d04af8 100644 --- a/src/league.c +++ b/src/league.c @@ -45,11 +45,7 @@ league_new(gboolean new_id) new.first_week = new.week_gap = 1; new.yellow_red = 1000; - new.stats.clid = new.id; - new.stats.teams_off = g_array_new(FALSE, FALSE, sizeof(Stat)); - new.stats.teams_def = g_array_new(FALSE, FALSE, sizeof(Stat)); - new.stats.player_scorers = g_array_new(FALSE, FALSE, sizeof(Stat)); - new.stats.player_goalies = g_array_new(FALSE, FALSE, sizeof(Stat)); + new.stats = stat_league_new(new.id); return new; } diff --git a/src/live_game.c b/src/live_game.c index fc7825c0..74610852 100644 --- a/src/live_game.c +++ b/src/live_game.c @@ -937,10 +937,7 @@ live_game_event_duel(void) const_float("float_live_game_score_team_exponent")); if(new.time != LIVE_GAME_UNIT_TIME_PENALTIES) - { player_games_goals_set(attacker, match->fix->clid, PLAYER_VALUE_SHOTS, 1, TRUE); - player_games_goals_set(goalie, match->fix->clid, PLAYER_VALUE_SHOTS, 1, TRUE); - } if(rndom < scoring_prob) { @@ -957,6 +954,11 @@ live_game_event_duel(void) else new.event.type = math_gauss_disti(LIVE_GAME_EVENT_POST, LIVE_GAME_EVENT_CROSS_BAR); + if(new.time != LIVE_GAME_UNIT_TIME_PENALTIES && + (new.event.type == LIVE_GAME_EVENT_SAVE || + new.event.type == LIVE_GAME_EVENT_GOAL)) + player_games_goals_set(goalie, match->fix->clid, PLAYER_VALUE_SHOTS, 1, TRUE); + g_array_append_val(unis, new); live_game_finish_unit(); diff --git a/src/stat.c b/src/stat.c index 53574d94..3125968a 100644 --- a/src/stat.c +++ b/src/stat.c @@ -6,6 +6,21 @@ #include "team.h" #include "variables.h" +/** Return a newly allocated league stat with given clid. */ +LeagueStat +stat_league_new(gint clid) +{ + LeagueStat new; + + new.clid = clid; + new.teams_off = g_array_new(FALSE, FALSE, sizeof(Stat)); + new.teams_def = g_array_new(FALSE, FALSE, sizeof(Stat)); + new.player_scorers = g_array_new(FALSE, FALSE, sizeof(Stat)); + new.player_goalies = g_array_new(FALSE, FALSE, sizeof(Stat)); + + return new; +} + /** Update the league stats. */ void stat_update_leagues(void) diff --git a/src/stat.h b/src/stat.h index 94bf91ba..4021c5da 100644 --- a/src/stat.h +++ b/src/stat.h @@ -2,8 +2,12 @@ #define STAT_H #include "bygfoot.h" +#include "league_struct.h" #include "stat_struct.h" +LeagueStat +stat_league_new(gint clid); + GArray* stat_update_league_teams(const GArray *teams, gint compare_type); diff --git a/src/xml.c b/src/xml.c index 172a6694..ca36d595 100644 --- a/src/xml.c +++ b/src/xml.c @@ -13,6 +13,7 @@ #include "xml_loadsave_cup.h" #include "xml_loadsave_fixtures.h" #include "xml_loadsave_league.h" +#include "xml_loadsave_league_stat.h" #include "xml_loadsave_live_game.h" #include "xml_loadsave_table.h" #include "xml_loadsave_teams.h" @@ -65,6 +66,7 @@ xml_load_leagues(const gchar *dirname, const gchar *basename) if(!g_str_has_suffix(((GString*)g_ptr_array_index(dir_contents, i))->str, "_table.xml") && !g_str_has_suffix(((GString*)g_ptr_array_index(dir_contents, i))->str, "_fixtures.xml") && !g_str_has_suffix(((GString*)g_ptr_array_index(dir_contents, i))->str, "_teams.xml") && + !g_str_has_suffix(((GString*)g_ptr_array_index(dir_contents, i))->str, "_stat.xml") && !query_misc_string_contains(((GString*)g_ptr_array_index(dir_contents, i))->str, "_promcup")) xml_load_league(dirname, ((GString*)g_ptr_array_index(dir_contents, i))->str, dir_contents); @@ -100,6 +102,9 @@ xml_load_league(const gchar *dirname, const gchar *basename, const GPtrArray *di sprintf(buf, "%s/%s_table.xml", dirname, prefix); xml_loadsave_table_read(buf, &lig(ligs->len - 1).table); + sprintf(buf, "%s/%s_stat.xml", dirname, prefix); + xml_loadsave_league_stat_read(buf, &lig(ligs->len - 1).stats); + if(league_has_prom_games((&lig(ligs->len - 1)))) { lig(ligs->len - 1).prom_rel.prom_games_cup = cup_new(FALSE); diff --git a/src/xml.h b/src/xml.h index e9de48af..f573ae4f 100644 --- a/src/xml.h +++ b/src/xml.h @@ -39,6 +39,7 @@ enum XmlTags #define TAG_START_USERS 7000 #define TAG_START_LIVE_GAME 8000 #define TAG_START_TRANSFERS 9000 +#define TAG_START_LEAGUE_STAT 10000 #define xml_write_string(fil, string, tag, indent) fprintf(fil, "%s<_%d>%s\n", indent, tag, string, tag) #define xml_write_g_string(fil, gstring, tag, indent) xml_write_string(fil, (gstring)->str, tag, indent) diff --git a/src/xml_loadsave_league.c b/src/xml_loadsave_league.c index 2d55b21b..fe4544ff 100644 --- a/src/xml_loadsave_league.c +++ b/src/xml_loadsave_league.c @@ -5,6 +5,7 @@ #include "xml_loadsave_cup.h" #include "xml_loadsave_fixtures.h" #include "xml_loadsave_league.h" +#include "xml_loadsave_league_stat.h" #include "xml_loadsave_table.h" #include "xml_loadsave_teams.h" @@ -208,6 +209,9 @@ xml_loadsave_league_write(const gchar *prefix, const League *league) sprintf(buf, "%s___league_%d_fixtures.xml", prefix, league->id); xml_loadsave_fixtures_write(buf, league->fixtures); + sprintf(buf, "%s___league_%d_stat.xml", prefix, league->id); + xml_loadsave_league_stat_write(buf, &league->stats); + sprintf(buf, "%s___league_%d.xml", prefix, league->id); file_my_fopen(buf, "w", &fil, TRUE); diff --git a/src/xml_loadsave_league_stat.c b/src/xml_loadsave_league_stat.c new file mode 100644 index 00000000..0dd66aa8 --- /dev/null +++ b/src/xml_loadsave_league_stat.c @@ -0,0 +1,232 @@ +#include "file.h" +#include "stat.h" +#include "misc.h" +#include "team.h" +#include "xml.h" +#include "xml_loadsave_league_stat.h" + +enum +{ + TAG_LEAGUE_STAT = TAG_START_LEAGUE_STAT, + TAG_STAT_TEAMS_OFF, + TAG_STAT_TEAMS_DEF, + TAG_STAT_PLAYER_SCORERS, + TAG_STAT_PLAYER_GOALIES, + TAG_STAT, + TAG_STAT_VALUE, + TAG_STAT_VALUE_STRING, + TAG_END +}; + +gint state, in_state, valueidx; +Stat new_stat; +LeagueStat *lstat; + +void +xml_loadsave_league_stat_start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + gint i; + gint tag = xml_get_tag_from_name(element_name); + gboolean valid_tag = FALSE; + + for(i=TAG_LEAGUE_STAT;iteams_off; + else if(in_state == TAG_STAT_TEAMS_DEF) + stat_array = lstat->teams_def; + else if(in_state == TAG_STAT_PLAYER_SCORERS) + stat_array = lstat->player_scorers; + else if(in_state == TAG_STAT_PLAYER_GOALIES) + stat_array = lstat->player_goalies; + else + g_warning("xml_loadsave_league_stat_end_element: unknown in_state %d \n", + in_state); + g_array_append_val(stat_array, new_stat); + } + else if(tag == TAG_STAT_VALUE_STRING || + tag == TAG_STAT_VALUE || + tag == TAG_STAT_VALUE_STRING || + tag == TAG_TEAM_ID) + { + state = TAG_STAT; + if(tag == TAG_STAT_VALUE) + valueidx++; + } + else if(tag != TAG_LEAGUE_STAT) + g_warning("xml_loadsave_league_stat_end_element: unknown tag: %s; I'm in state %d\n", + element_name, state); +} + +void +xml_loadsave_league_stat_text (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + gchar buf[SMALL]; + gint int_value = -1; + + strncpy(buf, text, text_len); + buf[text_len] = '\0'; + + int_value = (gint)g_ascii_strtod(buf, NULL); + + if(state == TAG_ID) + lstat->clid = int_value; + else if(state == TAG_TEAM_ID) + { + new_stat.team_id = int_value; + new_stat.tm = team_of_id(int_value); + } + else if(state == TAG_STAT_VALUE) + { + if(valueidx == 0) + new_stat.value1 = int_value; + else if(valueidx == 1) + new_stat.value2 = int_value; + else + new_stat.value3 = int_value; + } + else if(state == TAG_STAT_VALUE_STRING) + new_stat.value_string = g_string_new(buf); +} + +void +xml_loadsave_league_stat_read(const gchar *filename, LeagueStat *league_stat) +{ + GMarkupParser parser = {xml_loadsave_league_stat_start_element, + xml_loadsave_league_stat_end_element, + xml_loadsave_league_stat_text, NULL, NULL}; + GMarkupParseContext *context; + gchar *file_contents; + guint length; + GError *error = NULL; + + context = + g_markup_parse_context_new(&parser, 0, NULL, NULL); + + if(!g_file_get_contents(filename, &file_contents, &length, &error)) + { + g_warning("xml_loadsave_league_stat_read: error reading file %s\n", filename); + misc_print_error(&error, TRUE); + } + + lstat = league_stat; + + if(g_markup_parse_context_parse(context, file_contents, length, &error)) + { + g_markup_parse_context_end_parse(context, NULL); + g_markup_parse_context_free(context); + g_free(file_contents); + } + else + { + g_warning("xml_loadsave_league_stat_read: error parsing file %s\n", filename); + misc_print_error(&error, TRUE); + } +} + +void +xml_loadsave_league_stat_write(const gchar *filename, const LeagueStat *league_stat) +{ + gint i; + FILE *fil = NULL; + + file_my_fopen(filename, "w", &fil, TRUE); + + fprintf(fil, "<_%d>\n", TAG_LEAGUE_STAT); + + xml_write_int(fil, league_stat->clid, TAG_ID, I0); + + fprintf(fil, "<_%d>\n", TAG_STAT_TEAMS_OFF); + for(i=0;iteams_off->len;i++) + xml_loadsave_league_stat_write_stat( + fil, &g_array_index(league_stat->teams_off, Stat, i)); + fprintf(fil, "\n", TAG_STAT_TEAMS_OFF); + + fprintf(fil, "<_%d>\n", TAG_STAT_TEAMS_DEF); + for(i=0;iteams_def->len;i++) + xml_loadsave_league_stat_write_stat( + fil, &g_array_index(league_stat->teams_def, Stat, i)); + fprintf(fil, "\n", TAG_STAT_TEAMS_DEF); + + fprintf(fil, "<_%d>\n", TAG_STAT_PLAYER_SCORERS); + for(i=0;iplayer_scorers->len;i++) + xml_loadsave_league_stat_write_stat( + fil, &g_array_index(league_stat->player_scorers, Stat, i)); + fprintf(fil, "\n", TAG_STAT_PLAYER_SCORERS); + + fprintf(fil, "<_%d>\n", TAG_STAT_PLAYER_GOALIES); + for(i=0;iplayer_goalies->len;i++) + xml_loadsave_league_stat_write_stat( + fil, &g_array_index(league_stat->player_goalies, Stat, i)); + fprintf(fil, "\n", TAG_STAT_PLAYER_GOALIES); + + fprintf(fil, "\n", TAG_LEAGUE_STAT); + + fclose(fil); +} + +void +xml_loadsave_league_stat_write_stat(FILE *fil, const Stat *stat) +{ + fprintf(fil, "%s<_%d>\n", I1, TAG_STAT); + + xml_write_int(fil, stat->team_id, TAG_TEAM_ID, I1); + xml_write_int(fil, stat->value1, TAG_STAT_VALUE, I1); + xml_write_int(fil, stat->value2, TAG_STAT_VALUE, I1); + xml_write_int(fil, stat->value3, TAG_STAT_VALUE, I1); + xml_write_g_string(fil, stat->value_string, TAG_STAT_VALUE_STRING, I1); + + fprintf(fil, "%s\n", I1, TAG_STAT); +} diff --git a/src/xml_loadsave_league_stat.h b/src/xml_loadsave_league_stat.h new file mode 100644 index 00000000..cad83ad5 --- /dev/null +++ b/src/xml_loadsave_league_stat.h @@ -0,0 +1,34 @@ +#ifndef XML_LOADSAVE_LEAGUE_STAT_H +#define XML_LOADSAVE_LEAGUE_STAT_H + +#include "bygfoot.h" +#include "stat_struct.h" + +void +xml_loadsave_league_stat_write(const gchar *filename, const LeagueStat *league_stat); + +void +xml_loadsave_league_stat_write_stat(FILE *fil, const Stat *stat); + +void +xml_loadsave_league_stat_start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error); +void +xml_loadsave_league_stat_end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error); +void +xml_loadsave_league_stat_text (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error); +void +xml_loadsave_league_stat_read(const gchar *filename, LeagueStat *league_stat); + +#endif