From 6b4a11c8f120b9bed9a0a2c73e89291d14e16800 Mon Sep 17 00:00:00 2001 From: gyboth Date: Sun, 18 Sep 2005 10:02:10 +0000 Subject: [PATCH] "Player streaks first draft implemented." --- ChangeLog | 1 + Makefile.am | 2 +- bygfoot_options.glade | 2 +- locale/bg/LC_MESSAGES/bygfoot.mo | Bin 46347 -> 64783 bytes locale/de/LC_MESSAGES/bygfoot.mo | Bin 50694 -> 50825 bytes locale/fr/LC_MESSAGES/bygfoot.mo | Bin 43996 -> 51600 bytes locale/nl/LC_MESSAGES/bygfoot.mo | Bin 49904 -> 49304 bytes locale/pl/LC_MESSAGES/bygfoot.mo | Bin 47179 -> 49638 bytes locale/ro/LC_MESSAGES/bygfoot.mo | Bin 47651 -> 47443 bytes src/callback_func.c | 9 + src/file.h | 3 - src/fixture.c | 19 +- src/game.c | 80 +++++-- src/live_game.c | 102 ++++++--- src/live_game.h | 6 - src/main.c | 3 + src/misc.h | 3 - src/option_gui.c | 17 +- src/options_interface.c | 2 +- src/player.c | 197 +++++++++++++++--- src/player.h | 19 +- src/player_struct.h | 30 ++- src/team.c | 19 +- src/team.h | 5 +- src/transfer.c | 16 -- src/transfer.h | 3 - src/treeview.c | 63 ++++-- src/treeview.h | 2 +- src/treeview_helper.c | 122 +++++++++-- src/treeview_helper.h | 10 +- src/window.c | 121 +++++++++-- src/window.h | 6 + src/xml_loadsave_players.c | 18 +- src/xml_loadsave_teams.h | 3 - src/xml_team.c | 20 +- src/youth_academy.c | 47 +++-- support_files/bygfoot_app | 8 + support_files/bygfoot_constants | 71 ++++++- support_files/pixmaps/player_status_ban.png | Bin 0 -> 200 bytes support_files/pixmaps/player_status_cold.png | Bin 0 -> 667 bytes support_files/pixmaps/player_status_hot.png | Bin 0 -> 673 bytes .../pixmaps/player_status_injury.png | Bin 0 -> 307 bytes .../pixmaps/player_status_yellow.png | Bin 0 -> 188 bytes 43 files changed, 790 insertions(+), 239 deletions(-) create mode 100644 support_files/pixmaps/player_status_ban.png create mode 100644 support_files/pixmaps/player_status_cold.png create mode 100644 support_files/pixmaps/player_status_hot.png create mode 100644 support_files/pixmaps/player_status_injury.png create mode 100644 support_files/pixmaps/player_status_yellow.png diff --git a/ChangeLog b/ChangeLog index b0ce5604..236d1599 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ 10/10/2005: v1.9.2 - fixed some minor bugs - updated the Bulgarian translation + - updated the French translation - switched to Gnu zip in the Windows port 09/10/2005: v1.9.1 diff --git a/Makefile.am b/Makefile.am index ab1b409f..3ba801f3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -13,7 +13,7 @@ EXTRA_DIST = \ SUPPORT_DIRS = support_files support_files/names support_files/pixmaps support_files/pixmaps/history support_files/pixmaps/symbols support_files/pixmaps/live_game support_files/definitions support_files/definitions/argentina support_files/definitions/argentina/CVS support_files/definitions/australia support_files/definitions/australia/CVS support_files/definitions/aus_victoria support_files/definitions/aus_victoria/CVS support_files/definitions/belgium support_files/definitions/belgium/CVS support_files/definitions/brazil support_files/definitions/brazil/CVS support_files/definitions/brazil/CVS/CVS support_files/definitions/bulgaria support_files/definitions/bulgaria/CVS support_files/definitions/CVS support_files/definitions/england support_files/definitions/england/CVS support_files/definitions/europe support_files/definitions/europe/CVS support_files/definitions/france support_files/definitions/france/CVS support_files/definitions/germany support_files/definitions/germany/CVS support_files/definitions/ireland support_files/definitions/ireland/CVS support_files/definitions/italy support_files/definitions/italy/CVS support_files/definitions/italy/CVS/CVS support_files/definitions/misc support_files/definitions/misc/CVS support_files/definitions/poland support_files/definitions/poland/CVS support_files/definitions/romania support_files/definitions/romania/CVS support_files/definitions/scg support_files/definitions/scg/CVS support_files/definitions/scotland support_files/definitions/scotland/CVS support_files/definitions/short_leagues support_files/definitions/short_leagues/CVS support_files/definitions/short_leagues_south_america support_files/definitions/short_leagues_south_america/CVS support_files/definitions/spain support_files/definitions/spain/CVS support_files/definitions/usa support_files/definitions/usa/CVS support_files/definitions/usa/CVS/CVS support_files/definitions/wales support_files/definitions/wales/CVS support_files/lg_commentary -SUPPORT_FILES = support_files/names/player_names_brazil.xml support_files/names/player_names_england.xml support_files/names/player_names_belgium.xml support_files/names/player_names_usa.xml support_files/names/player_names_general.xml support_files/names/player_names_germany.xml support_files/names/player_names_romania.xml support_files/names/player_names_scotland.xml support_files/names/player_names_france.xml support_files/names/player_names_scg.xml support_files/names/player_names_italy.xml support_files/names/player_names_australia.xml support_files/names/player_names_poland.xml support_files/names/player_names_bulgaria.xml support_files/bygfoot.conf support_files/pixmaps/history/champion.png support_files/pixmaps/history/start_game.png support_files/pixmaps/history/fire_finance.png support_files/pixmaps/history/fire_failure.png support_files/pixmaps/history/job_offer.png support_files/pixmaps/history/end_season.png support_files/pixmaps/history/promoted.png support_files/pixmaps/history/relegated.png support_files/pixmaps/history/win_final.png support_files/pixmaps/history/lose_final.png support_files/pixmaps/history/reach_cup_round.png support_files/pixmaps/menu_history.png support_files/pixmaps/bygfoot_icon.png support_files/pixmaps/menu_league_stats.png support_files/pixmaps/new_week.png support_files/pixmaps/preview.png support_files/pixmaps/symbols/flag_germany.png support_files/pixmaps/symbols/flag_ch.png support_files/pixmaps/symbols/flag_cz.png support_files/pixmaps/symbols/flag_usa.png support_files/pixmaps/symbols/flag_dk.png support_files/pixmaps/symbols/flag_scg.png support_files/pixmaps/symbols/flag_es.png support_files/pixmaps/symbols/flag_eu.png support_files/pixmaps/symbols/flag_gr.png support_files/pixmaps/symbols/flag_hu.png support_files/pixmaps/symbols/flag_wales.png support_files/pixmaps/symbols/flag_nl.png support_files/pixmaps/symbols/flag_pt.png support_files/pixmaps/symbols/flag_ru.png support_files/pixmaps/symbols/flag_tr.png support_files/pixmaps/symbols/flag_uk.png support_files/pixmaps/symbols/flag_belgium.png support_files/pixmaps/symbols/flag_england.png support_files/pixmaps/symbols/flag_france.png support_files/pixmaps/symbols/flag_romania.png support_files/pixmaps/symbols/flag_brazil.png support_files/pixmaps/symbols/flag_scotland.png support_files/pixmaps/symbols/flag_ecuador.png support_files/pixmaps/symbols/flag_argentina.png support_files/pixmaps/symbols/flag_bolivia.png support_files/pixmaps/symbols/flag_chile.png support_files/pixmaps/symbols/flag_colombia.png support_files/pixmaps/symbols/flag_peru.png support_files/pixmaps/symbols/flag_paraguay.png support_files/pixmaps/symbols/flag_uruguay.png support_files/pixmaps/symbols/flag_venezuela.png support_files/pixmaps/symbols/flag_mexico.png support_files/pixmaps/symbols/flag_italy.png support_files/pixmaps/symbols/flag_ireland.png support_files/pixmaps/symbols/flag_n_ireland.png support_files/pixmaps/symbols/map_ireland.png support_files/pixmaps/symbols/flag_poland.png support_files/pixmaps/symbols/flag_australia.png support_files/pixmaps/symbols/flag_spain.png support_files/pixmaps/symbols/flag_aus_victoria.png support_files/pixmaps/symbols/flag_bulgaria.png support_files/pixmaps/symbols/flag_china.png support_files/pixmaps/transfers.png support_files/pixmaps/menu_league_results.png support_files/pixmaps/menu_table.png support_files/pixmaps/menu_fixtures_comp.png support_files/pixmaps/menu_fixtures.png support_files/pixmaps/menu_boost.png support_files/pixmaps/menu_browse_tms.png support_files/pixmaps/menu_finances.png support_files/pixmaps/menu_last_match.png support_files/pixmaps/live_game/sub.png support_files/pixmaps/live_game/red.png support_files/pixmaps/live_game/save.png support_files/pixmaps/live_game/goal.png support_files/pixmaps/live_game/yellow.png support_files/pixmaps/live_game/scoring_chance.png support_files/pixmaps/live_game/injury_temp.png support_files/pixmaps/live_game/injury.png support_files/pixmaps/live_game/structure_change.png support_files/pixmaps/live_game/whistle.png support_files/pixmaps/live_game/miss.png support_files/pixmaps/live_game/foul.png support_files/pixmaps/live_game/cross_bar.png support_files/pixmaps/live_game/post.png support_files/pixmaps/live_game/penalty.png support_files/pixmaps/live_game/stadium_brkn.png support_files/pixmaps/live_game/stadium_fire.png support_files/pixmaps/live_game/stadium_riot.png support_files/pixmaps/live_game/header.png support_files/pixmaps/live_game/goal_own.png support_files/pixmaps/live_game/lost_possession.png support_files/pixmaps/menu_match_stats.png support_files/pixmaps/menu_physio.png support_files/pixmaps/boost_anti.png support_files/pixmaps/boost_off.png support_files/pixmaps/boost_on.png support_files/pixmaps/menu_player_browse.png support_files/pixmaps/style_def.png support_files/pixmaps/style_atk.png support_files/pixmaps/style_bal.png support_files/pixmaps/style_all_atk.png support_files/pixmaps/style_all_def.png support_files/pixmaps/menu_player_contract.png support_files/pixmaps/menu_player_fire.png support_files/pixmaps/menu_player_info.png support_files/pixmaps/menu_player_put_transfer.png support_files/pixmaps/menu_player_remove_transfer.png support_files/pixmaps/table_up.png support_files/pixmaps/table_down.png support_files/pixmaps/table_stay.png support_files/pixmaps/menu_player_shoots.png support_files/pixmaps/menu_rearrange.png support_files/pixmaps/menu_scout.png support_files/pixmaps/menu_stadium.png support_files/pixmaps/menu_structure.png support_files/pixmaps/menu_style.png support_files/pixmaps/menu_youth_academy.png support_files/pixmaps/menu_mmatches.png support_files/definitions/argentina/league_argentina1.xml support_files/definitions/argentina/CVS/Root support_files/definitions/argentina/CVS/Repository support_files/definitions/argentina/CVS/Entries support_files/definitions/australia/league_australia1.xml support_files/definitions/australia/cup_australia_a_league.xml support_files/definitions/australia/country_australia.xml support_files/definitions/australia/CVS/Root support_files/definitions/australia/CVS/Repository support_files/definitions/australia/CVS/Entries support_files/definitions/australia/cup_australia_playoffs.xml support_files/definitions/aus_victoria/CVS/Root support_files/definitions/aus_victoria/CVS/Repository support_files/definitions/aus_victoria/CVS/Entries support_files/definitions/aus_victoria/country_aus_victoria.xml support_files/definitions/aus_victoria/cup_aus_vic_league.xml support_files/definitions/aus_victoria/cup_aus_vic_playoff1.xml support_files/definitions/aus_victoria/cup_aus_vic_playoff2.xml support_files/definitions/aus_victoria/league_aus_vic1.xml support_files/definitions/aus_victoria/league_aus_vic2nw.xml support_files/definitions/aus_victoria/league_aus_vic2se.xml support_files/definitions/aus_victoria/league_aus_vic3nw.xml support_files/definitions/aus_victoria/league_aus_vic3se.xml support_files/definitions/aus_victoria/league_aus_vic4nw.xml support_files/definitions/aus_victoria/league_aus_vic4se.xml support_files/definitions/aus_victoria/league_aus_vic5nw.xml support_files/definitions/aus_victoria/league_aus_vic5se.xml support_files/definitions/aus_victoria/league_aus_vic6nw.xml support_files/definitions/aus_victoria/league_aus_vic6se.xml support_files/definitions/aus_victoria/league_aus_vicprem.xml support_files/definitions/belgium/CVS/Root support_files/definitions/belgium/CVS/Repository support_files/definitions/belgium/CVS/Entries support_files/definitions/belgium/country_belgium.xml support_files/definitions/belgium/cup_belgium.xml support_files/definitions/belgium/cup_belgium_eindronde2.xml support_files/definitions/belgium/league_belgium1.xml support_files/definitions/belgium/league_belgium2.xml support_files/definitions/belgium/league_belgium3a.xml support_files/definitions/belgium/league_belgium3b.xml support_files/definitions/belgium/league_belgium4a.xml support_files/definitions/belgium/league_belgium4b.xml support_files/definitions/belgium/league_belgium4c.xml support_files/definitions/belgium/league_belgium4d.xml support_files/definitions/belgium/cup_belgium_eindronde3.xml support_files/definitions/belgium/cup_belgium_eindronde4.xml support_files/definitions/belgium/cup_belgium_beker.xml support_files/definitions/brazil/country_brazil.xml support_files/definitions/brazil/cup_brazil_copa_do_brasil.xml support_files/definitions/brazil/cup_brazil_prom_games2.xml support_files/definitions/brazil/cup_brazil_prom_games3.xml support_files/definitions/brazil/cup_brazil_prom_games4.xml support_files/definitions/brazil/cup_brazil_prom_games5.xml support_files/definitions/brazil/cup_brazil_prom_games6.xml support_files/definitions/brazil/league_brazil1.xml support_files/definitions/brazil/league_brazil2.xml support_files/definitions/brazil/league_brazil3.xml support_files/definitions/brazil/league_brazil4.xml support_files/definitions/brazil/league_brazil5.xml support_files/definitions/brazil/league_brazil6.xml support_files/definitions/brazil/CVS/Root support_files/definitions/brazil/CVS/Repository support_files/definitions/brazil/CVS/Entries support_files/definitions/brazil/CVS/CVS/Root support_files/definitions/brazil/CVS/CVS/Repository support_files/definitions/brazil/CVS/CVS/Entries support_files/definitions/brazil/cup_brazil_sul_am_ar.xml support_files/definitions/brazil/cup_brazil_sul_am_bo_ve.xml support_files/definitions/brazil/cup_brazil_sul_am_br1.xml support_files/definitions/brazil/cup_brazil_sul_am_br2.xml support_files/definitions/brazil/cup_brazil_sul_am_br3.xml support_files/definitions/brazil/cup_brazil_sul_am_br4.xml support_files/definitions/brazil/cup_brazil_sul_am_ch_pe.xml support_files/definitions/brazil/cup_brazil_sul_am_co_ec.xml support_files/definitions/brazil/cup_brazil_sul_am_knockout.xml support_files/definitions/brazil/cup_brazil_sul_am_pa_ur.xml support_files/definitions/brazil/cup_brazil_libertadores.xml support_files/definitions/brazil/cup_supercup_brazil_intercontinental.xml support_files/definitions/bulgaria/CVS/Root support_files/definitions/bulgaria/CVS/Repository support_files/definitions/bulgaria/CVS/Entries support_files/definitions/bulgaria/country_bulgaria.xml support_files/definitions/bulgaria/cup_bulgaria_national.xml support_files/definitions/bulgaria/cup_bulgaria_prom_games2.xml support_files/definitions/bulgaria/cup_supercup_bulgaria.xml support_files/definitions/bulgaria/league_bulgaria1.xml support_files/definitions/bulgaria/league_bulgaria2a.xml support_files/definitions/bulgaria/league_bulgaria2b.xml support_files/definitions/bulgaria/league_bulgaria3a.xml support_files/definitions/bulgaria/league_bulgaria3b.xml support_files/definitions/bulgaria/league_bulgaria3c.xml support_files/definitions/bulgaria/league_bulgaria3d.xml support_files/definitions/CVS/Root support_files/definitions/CVS/Repository support_files/definitions/CVS/Entries support_files/definitions/CVS/league*xml.tmp support_files/definitions/CVS/cup*xml.tmp support_files/definitions/england/CVS/Root support_files/definitions/england/CVS/Repository support_files/definitions/england/CVS/Entries support_files/definitions/england/country_england.xml support_files/definitions/england/cup_england_fa.xml support_files/definitions/england/cup_england_league.xml support_files/definitions/england/cup_england_prom_games2.xml support_files/definitions/england/cup_england_prom_games3.xml support_files/definitions/england/cup_england_prom_games4.xml support_files/definitions/england/league_england1.xml support_files/definitions/england/league_england2.xml support_files/definitions/england/league_england3.xml support_files/definitions/england/league_england4.xml support_files/definitions/england/league_england5.xml support_files/definitions/england/cup_england_prom_games5.xml support_files/definitions/europe/CVS/Root support_files/definitions/europe/CVS/Repository support_files/definitions/europe/CVS/Entries support_files/definitions/europe/cup_europe_champ_league.xml support_files/definitions/europe/cup_europe_cwc.xml support_files/definitions/europe/cup_europe_uefa.xml support_files/definitions/europe/cup_supercup_europe_uefa.xml support_files/definitions/europe/league_europe_div.xml support_files/definitions/europe/cup_supercup_europe_intercontinental.xml support_files/definitions/france/CVS/Root support_files/definitions/france/CVS/Repository support_files/definitions/france/CVS/Entries support_files/definitions/france/country_france.xml support_files/definitions/france/cup_france_coupe.xml support_files/definitions/france/league_france1.xml support_files/definitions/france/league_france2.xml support_files/definitions/france/league_france3.xml support_files/definitions/france/cup_france_ligue.xml support_files/definitions/france/league_france4a.xml support_files/definitions/france/league_france4b.xml support_files/definitions/france/league_france4c.xml support_files/definitions/france/league_france4d.xml support_files/definitions/germany/cup_germany_dfb.xml support_files/definitions/germany/league_germany1.xml support_files/definitions/germany/CVS/Root support_files/definitions/germany/CVS/Repository support_files/definitions/germany/CVS/Entries support_files/definitions/germany/league_germany2.xml support_files/definitions/germany/league_germany3a.xml support_files/definitions/germany/league_germany3b.xml support_files/definitions/germany/country_germany.xml support_files/definitions/ireland/country_ireland.xml support_files/definitions/ireland/cup_ireland_league.xml support_files/definitions/ireland/cup_ireland_senior.xml support_files/definitions/ireland/league_ireland1.xml support_files/definitions/ireland/league_n_ireland1.xml support_files/definitions/ireland/league_ireland2.xml support_files/definitions/ireland/cup_ireland_prom_games.xml support_files/definitions/ireland/cup_ireland_setanta.xml support_files/definitions/ireland/cup_ireland_cl.xml support_files/definitions/ireland/cup_ireland_cl_q.xml support_files/definitions/ireland/cup_ireland_uefa.xml support_files/definitions/ireland/cup_ireland_uefa_q.xml support_files/definitions/ireland/CVS/Root support_files/definitions/ireland/CVS/Repository support_files/definitions/ireland/CVS/Entries support_files/definitions/italy/country_italy.xml support_files/definitions/italy/cup_italy_coppa.xml support_files/definitions/italy/league_italy1.xml support_files/definitions/italy/league_italy2.xml support_files/definitions/italy/league_italy3a.xml support_files/definitions/italy/league_italy3b.xml support_files/definitions/italy/CVS/Root support_files/definitions/italy/CVS/Repository support_files/definitions/italy/CVS/Entries support_files/definitions/italy/CVS/CVS/Root support_files/definitions/italy/CVS/CVS/Repository support_files/definitions/italy/CVS/CVS/Entries support_files/definitions/misc/CVS/Root support_files/definitions/misc/CVS/Repository support_files/definitions/misc/CVS/Entries support_files/definitions/misc/cup_supercup_league_vs_cup.xml support_files/definitions/poland/league_poland1.xml support_files/definitions/poland/league_poland2.xml support_files/definitions/poland/league_poland3a.xml support_files/definitions/poland/league_poland3b.xml support_files/definitions/poland/league_poland3c.xml support_files/definitions/poland/league_poland3d.xml support_files/definitions/poland/country_poland.xml support_files/definitions/poland/cup_poland_prom_games1.xml support_files/definitions/poland/cup_poland_prom_games2.xml support_files/definitions/poland/cup_poland_puchar.xml support_files/definitions/poland/CVS/Root support_files/definitions/poland/CVS/Repository support_files/definitions/poland/CVS/Entries support_files/definitions/romania/CVS/Root support_files/definitions/romania/CVS/Repository support_files/definitions/romania/CVS/Entries support_files/definitions/romania/country_romania.xml support_files/definitions/romania/league_romania1.xml support_files/definitions/romania/league_romania2.xml support_files/definitions/romania/league_romania3.xml support_files/definitions/romania/cup_supercup_romania.xml support_files/definitions/romania/cup_romania_cupa.xml support_files/definitions/scg/country_scg.xml support_files/definitions/scg/cup_scg.xml support_files/definitions/scg/league_scg2a.xml support_files/definitions/scg/league_scg2b.xml support_files/definitions/scg/league_scg1.xml support_files/definitions/scg/CVS/Root support_files/definitions/scg/CVS/Repository support_files/definitions/scg/CVS/Entries support_files/definitions/scotland/league_scotland1.xml support_files/definitions/scotland/country_scotland.xml support_files/definitions/scotland/CVS/Root support_files/definitions/scotland/CVS/Repository support_files/definitions/scotland/CVS/Entries support_files/definitions/scotland/league_scotland2.xml support_files/definitions/scotland/cup_scotland_league.xml support_files/definitions/scotland/league_scotland3.xml support_files/definitions/scotland/league_scotland4.xml support_files/definitions/scotland/cup_scotland_fa.xml support_files/definitions/short_leagues/CVS/Root support_files/definitions/short_leagues/CVS/Repository support_files/definitions/short_leagues/CVS/Entries support_files/definitions/short_leagues/league_czech1_short.xml support_files/definitions/short_leagues/league_denmark1_short.xml support_files/definitions/short_leagues/league_greece1_short.xml support_files/definitions/short_leagues/league_netherlands1_short.xml support_files/definitions/short_leagues/league_portugal1_short.xml support_files/definitions/short_leagues/league_russia1_short.xml support_files/definitions/short_leagues/league_switzerland1_short.xml support_files/definitions/short_leagues/league_turkey1_short.xml support_files/definitions/short_leagues/league_ukraine1_short.xml support_files/definitions/short_leagues_south_america/league_bolivia1_short.xml support_files/definitions/short_leagues_south_america/league_chile1_short.xml support_files/definitions/short_leagues_south_america/league_colombia1_short.xml support_files/definitions/short_leagues_south_america/league_ecuador1_short.xml support_files/definitions/short_leagues_south_america/league_mexico1_short.xml support_files/definitions/short_leagues_south_america/league_paraguay1_short.xml support_files/definitions/short_leagues_south_america/league_peru1_short.xml support_files/definitions/short_leagues_south_america/league_uruguay1_short.xml support_files/definitions/short_leagues_south_america/league_venezuela1_short.xml support_files/definitions/short_leagues_south_america/CVS/Root support_files/definitions/short_leagues_south_america/CVS/Repository support_files/definitions/short_leagues_south_america/CVS/Entries support_files/definitions/spain/CVS/Root support_files/definitions/spain/CVS/Repository support_files/definitions/spain/CVS/Entries support_files/definitions/spain/country_spain.xml support_files/definitions/spain/cup_spain_cdr.xml support_files/definitions/spain/cup_spain_prom_games_1.xml support_files/definitions/spain/cup_spain_prom_games_2.xml support_files/definitions/spain/cup_spain_prom_games_3.xml support_files/definitions/spain/cup_spain_prom_games_4.xml support_files/definitions/spain/cup_spain_rfef.xml support_files/definitions/spain/league_spain1.xml support_files/definitions/spain/league_spain2.xml support_files/definitions/spain/league_spain3a.xml support_files/definitions/spain/league_spain3b.xml support_files/definitions/spain/league_spain3c.xml support_files/definitions/spain/league_spain3d.xml support_files/definitions/usa/league_usa_econf.xml support_files/definitions/usa/country_usa.xml support_files/definitions/usa/CVS/Root support_files/definitions/usa/CVS/Repository support_files/definitions/usa/CVS/Entries support_files/definitions/usa/CVS/CVS/Root support_files/definitions/usa/CVS/CVS/Repository support_files/definitions/usa/CVS/CVS/Entries support_files/definitions/usa/league_usa_wconf.xml support_files/definitions/usa/cup_usa_eplayoff.xml support_files/definitions/usa/cup_usa_wplayoff.xml support_files/definitions/usa/cup_usa_mls_cup.xml support_files/definitions/wales/league_wales1.xml support_files/definitions/wales/league_wales2a.xml support_files/definitions/wales/league_wales2b.xml support_files/definitions/wales/country_wales.xml support_files/definitions/wales/cup_wales_welsh.xml support_files/definitions/wales/cup_wales_challenge.xml support_files/definitions/wales/cup_wales_premier.xml support_files/definitions/wales/league_wales_english.xml support_files/definitions/wales/cup_wales_uefa_q.xml support_files/definitions/wales/cup_wales_uefa.xml support_files/definitions/wales/cup_wales_cl.xml support_files/definitions/wales/cup_wales_cl_q.xml support_files/definitions/wales/CVS/Root support_files/definitions/wales/CVS/Repository support_files/definitions/wales/CVS/Entries support_files/bygfoot_constants support_files/bygfoot_user.conf support_files/lg_commentary/lg_commentary_de.xml support_files/lg_commentary/lg_commentary_en.xml support_files/lg_commentary/lg_commentary_nl.xml support_files/lg_commentary/lg_commentary_pl.xml support_files/lg_commentary/lg_commentary_bg.xml support_files/bygfoot_app support_files/bygfoot_help support_files/bygfoot_lg_tokens +SUPPORT_FILES = support_files/names/player_names_brazil.xml support_files/names/player_names_england.xml support_files/names/player_names_belgium.xml support_files/names/player_names_usa.xml support_files/names/player_names_general.xml support_files/names/player_names_germany.xml support_files/names/player_names_romania.xml support_files/names/player_names_scotland.xml support_files/names/player_names_france.xml support_files/names/player_names_scg.xml support_files/names/player_names_italy.xml support_files/names/player_names_australia.xml support_files/names/player_names_poland.xml support_files/names/player_names_bulgaria.xml support_files/bygfoot.conf support_files/pixmaps/history/champion.png support_files/pixmaps/history/start_game.png support_files/pixmaps/history/fire_finance.png support_files/pixmaps/history/fire_failure.png support_files/pixmaps/history/job_offer.png support_files/pixmaps/history/end_season.png support_files/pixmaps/history/promoted.png support_files/pixmaps/history/relegated.png support_files/pixmaps/history/win_final.png support_files/pixmaps/history/lose_final.png support_files/pixmaps/history/reach_cup_round.png support_files/pixmaps/menu_history.png support_files/pixmaps/bygfoot_icon.png support_files/pixmaps/menu_league_stats.png support_files/pixmaps/new_week.png support_files/pixmaps/preview.png support_files/pixmaps/symbols/flag_germany.png support_files/pixmaps/symbols/flag_ch.png support_files/pixmaps/symbols/flag_cz.png support_files/pixmaps/symbols/flag_usa.png support_files/pixmaps/symbols/flag_dk.png support_files/pixmaps/symbols/flag_scg.png support_files/pixmaps/symbols/flag_es.png support_files/pixmaps/symbols/flag_eu.png support_files/pixmaps/symbols/flag_gr.png support_files/pixmaps/symbols/flag_hu.png support_files/pixmaps/symbols/flag_wales.png support_files/pixmaps/symbols/flag_nl.png support_files/pixmaps/symbols/flag_pt.png support_files/pixmaps/symbols/flag_ru.png support_files/pixmaps/symbols/flag_tr.png support_files/pixmaps/symbols/flag_uk.png support_files/pixmaps/symbols/flag_belgium.png support_files/pixmaps/symbols/flag_england.png support_files/pixmaps/symbols/flag_france.png support_files/pixmaps/symbols/flag_romania.png support_files/pixmaps/symbols/flag_brazil.png support_files/pixmaps/symbols/flag_scotland.png support_files/pixmaps/symbols/flag_ecuador.png support_files/pixmaps/symbols/flag_argentina.png support_files/pixmaps/symbols/flag_bolivia.png support_files/pixmaps/symbols/flag_chile.png support_files/pixmaps/symbols/flag_colombia.png support_files/pixmaps/symbols/flag_peru.png support_files/pixmaps/symbols/flag_paraguay.png support_files/pixmaps/symbols/flag_uruguay.png support_files/pixmaps/symbols/flag_venezuela.png support_files/pixmaps/symbols/flag_mexico.png support_files/pixmaps/symbols/flag_italy.png support_files/pixmaps/symbols/flag_ireland.png support_files/pixmaps/symbols/flag_n_ireland.png support_files/pixmaps/symbols/map_ireland.png support_files/pixmaps/symbols/flag_poland.png support_files/pixmaps/symbols/flag_australia.png support_files/pixmaps/symbols/flag_spain.png support_files/pixmaps/symbols/flag_aus_victoria.png support_files/pixmaps/symbols/flag_bulgaria.png support_files/pixmaps/symbols/flag_china.png support_files/pixmaps/transfers.png support_files/pixmaps/menu_league_results.png support_files/pixmaps/menu_table.png support_files/pixmaps/menu_fixtures_comp.png support_files/pixmaps/menu_fixtures.png support_files/pixmaps/menu_boost.png support_files/pixmaps/menu_browse_tms.png support_files/pixmaps/menu_finances.png support_files/pixmaps/menu_last_match.png support_files/pixmaps/live_game/sub.png support_files/pixmaps/live_game/red.png support_files/pixmaps/live_game/save.png support_files/pixmaps/live_game/goal.png support_files/pixmaps/live_game/yellow.png support_files/pixmaps/live_game/scoring_chance.png support_files/pixmaps/live_game/injury_temp.png support_files/pixmaps/live_game/injury.png support_files/pixmaps/live_game/structure_change.png support_files/pixmaps/live_game/whistle.png support_files/pixmaps/live_game/miss.png support_files/pixmaps/live_game/foul.png support_files/pixmaps/live_game/cross_bar.png support_files/pixmaps/live_game/post.png support_files/pixmaps/live_game/penalty.png support_files/pixmaps/live_game/stadium_brkn.png support_files/pixmaps/live_game/stadium_fire.png support_files/pixmaps/live_game/stadium_riot.png support_files/pixmaps/live_game/header.png support_files/pixmaps/live_game/goal_own.png support_files/pixmaps/live_game/lost_possession.png support_files/pixmaps/menu_match_stats.png support_files/pixmaps/menu_physio.png support_files/pixmaps/boost_anti.png support_files/pixmaps/boost_off.png support_files/pixmaps/boost_on.png support_files/pixmaps/menu_player_browse.png support_files/pixmaps/style_def.png support_files/pixmaps/style_atk.png support_files/pixmaps/style_bal.png support_files/pixmaps/style_all_atk.png support_files/pixmaps/style_all_def.png support_files/pixmaps/menu_player_contract.png support_files/pixmaps/menu_player_fire.png support_files/pixmaps/menu_player_info.png support_files/pixmaps/menu_player_put_transfer.png support_files/pixmaps/menu_player_remove_transfer.png support_files/pixmaps/table_up.png support_files/pixmaps/table_down.png support_files/pixmaps/table_stay.png support_files/pixmaps/menu_player_shoots.png support_files/pixmaps/menu_rearrange.png support_files/pixmaps/menu_scout.png support_files/pixmaps/menu_stadium.png support_files/pixmaps/menu_structure.png support_files/pixmaps/menu_style.png support_files/pixmaps/menu_youth_academy.png support_files/pixmaps/menu_mmatches.png support_files/pixmaps/hot_streak.png support_files/pixmaps/player_status_injury.png support_files/pixmaps/player_status_hot.png support_files/pixmaps/player_status_ban.png support_files/pixmaps/player_status_yellow.png support_files/pixmaps/player_status_cold.png support_files/definitions/argentina/league_argentina1.xml support_files/definitions/argentina/CVS/Root support_files/definitions/argentina/CVS/Repository support_files/definitions/argentina/CVS/Entries support_files/definitions/australia/league_australia1.xml support_files/definitions/australia/cup_australia_a_league.xml support_files/definitions/australia/country_australia.xml support_files/definitions/australia/CVS/Root support_files/definitions/australia/CVS/Repository support_files/definitions/australia/CVS/Entries support_files/definitions/australia/cup_australia_playoffs.xml support_files/definitions/aus_victoria/CVS/Root support_files/definitions/aus_victoria/CVS/Repository support_files/definitions/aus_victoria/CVS/Entries support_files/definitions/aus_victoria/country_aus_victoria.xml support_files/definitions/aus_victoria/cup_aus_vic_league.xml support_files/definitions/aus_victoria/cup_aus_vic_playoff1.xml support_files/definitions/aus_victoria/cup_aus_vic_playoff2.xml support_files/definitions/aus_victoria/league_aus_vic1.xml support_files/definitions/aus_victoria/league_aus_vic2nw.xml support_files/definitions/aus_victoria/league_aus_vic2se.xml support_files/definitions/aus_victoria/league_aus_vic3nw.xml support_files/definitions/aus_victoria/league_aus_vic3se.xml support_files/definitions/aus_victoria/league_aus_vic4nw.xml support_files/definitions/aus_victoria/league_aus_vic4se.xml support_files/definitions/aus_victoria/league_aus_vic5nw.xml support_files/definitions/aus_victoria/league_aus_vic5se.xml support_files/definitions/aus_victoria/league_aus_vic6nw.xml support_files/definitions/aus_victoria/league_aus_vic6se.xml support_files/definitions/aus_victoria/league_aus_vicprem.xml support_files/definitions/belgium/CVS/Root support_files/definitions/belgium/CVS/Repository support_files/definitions/belgium/CVS/Entries support_files/definitions/belgium/country_belgium.xml support_files/definitions/belgium/cup_belgium.xml support_files/definitions/belgium/cup_belgium_eindronde2.xml support_files/definitions/belgium/league_belgium1.xml support_files/definitions/belgium/league_belgium2.xml support_files/definitions/belgium/league_belgium3a.xml support_files/definitions/belgium/league_belgium3b.xml support_files/definitions/belgium/league_belgium4a.xml support_files/definitions/belgium/league_belgium4b.xml support_files/definitions/belgium/league_belgium4c.xml support_files/definitions/belgium/league_belgium4d.xml support_files/definitions/belgium/cup_belgium_eindronde3.xml support_files/definitions/belgium/cup_belgium_eindronde4.xml support_files/definitions/belgium/cup_belgium_beker.xml support_files/definitions/brazil/country_brazil.xml support_files/definitions/brazil/cup_brazil_copa_do_brasil.xml support_files/definitions/brazil/cup_brazil_prom_games2.xml support_files/definitions/brazil/cup_brazil_prom_games3.xml support_files/definitions/brazil/cup_brazil_prom_games4.xml support_files/definitions/brazil/cup_brazil_prom_games5.xml support_files/definitions/brazil/cup_brazil_prom_games6.xml support_files/definitions/brazil/league_brazil1.xml support_files/definitions/brazil/league_brazil2.xml support_files/definitions/brazil/league_brazil3.xml support_files/definitions/brazil/league_brazil4.xml support_files/definitions/brazil/league_brazil5.xml support_files/definitions/brazil/league_brazil6.xml support_files/definitions/brazil/CVS/Root support_files/definitions/brazil/CVS/Repository support_files/definitions/brazil/CVS/Entries support_files/definitions/brazil/CVS/CVS/Root support_files/definitions/brazil/CVS/CVS/Repository support_files/definitions/brazil/CVS/CVS/Entries support_files/definitions/brazil/cup_brazil_sul_am_ar.xml support_files/definitions/brazil/cup_brazil_sul_am_bo_ve.xml support_files/definitions/brazil/cup_brazil_sul_am_br1.xml support_files/definitions/brazil/cup_brazil_sul_am_br2.xml support_files/definitions/brazil/cup_brazil_sul_am_br3.xml support_files/definitions/brazil/cup_brazil_sul_am_br4.xml support_files/definitions/brazil/cup_brazil_sul_am_ch_pe.xml support_files/definitions/brazil/cup_brazil_sul_am_co_ec.xml support_files/definitions/brazil/cup_brazil_sul_am_knockout.xml support_files/definitions/brazil/cup_brazil_sul_am_pa_ur.xml support_files/definitions/brazil/cup_brazil_libertadores.xml support_files/definitions/brazil/cup_supercup_brazil_intercontinental.xml support_files/definitions/bulgaria/CVS/Root support_files/definitions/bulgaria/CVS/Repository support_files/definitions/bulgaria/CVS/Entries support_files/definitions/bulgaria/country_bulgaria.xml support_files/definitions/bulgaria/cup_bulgaria_national.xml support_files/definitions/bulgaria/cup_bulgaria_prom_games2.xml support_files/definitions/bulgaria/cup_supercup_bulgaria.xml support_files/definitions/bulgaria/league_bulgaria1.xml support_files/definitions/bulgaria/league_bulgaria2a.xml support_files/definitions/bulgaria/league_bulgaria2b.xml support_files/definitions/bulgaria/league_bulgaria3a.xml support_files/definitions/bulgaria/league_bulgaria3b.xml support_files/definitions/bulgaria/league_bulgaria3c.xml support_files/definitions/bulgaria/league_bulgaria3d.xml support_files/definitions/CVS/Root support_files/definitions/CVS/Repository support_files/definitions/CVS/Entries support_files/definitions/CVS/league*xml.tmp support_files/definitions/CVS/cup*xml.tmp support_files/definitions/england/CVS/Root support_files/definitions/england/CVS/Repository support_files/definitions/england/CVS/Entries support_files/definitions/england/country_england.xml support_files/definitions/england/cup_england_fa.xml support_files/definitions/england/cup_england_league.xml support_files/definitions/england/cup_england_prom_games2.xml support_files/definitions/england/cup_england_prom_games3.xml support_files/definitions/england/cup_england_prom_games4.xml support_files/definitions/england/league_england1.xml support_files/definitions/england/league_england2.xml support_files/definitions/england/league_england3.xml support_files/definitions/england/league_england4.xml support_files/definitions/england/league_england5.xml support_files/definitions/england/cup_england_prom_games5.xml support_files/definitions/europe/CVS/Root support_files/definitions/europe/CVS/Repository support_files/definitions/europe/CVS/Entries support_files/definitions/europe/cup_europe_champ_league.xml support_files/definitions/europe/cup_europe_cwc.xml support_files/definitions/europe/cup_europe_uefa.xml support_files/definitions/europe/cup_supercup_europe_uefa.xml support_files/definitions/europe/league_europe_div.xml support_files/definitions/europe/cup_supercup_europe_intercontinental.xml support_files/definitions/france/CVS/Root support_files/definitions/france/CVS/Repository support_files/definitions/france/CVS/Entries support_files/definitions/france/country_france.xml support_files/definitions/france/cup_france_coupe.xml support_files/definitions/france/league_france1.xml support_files/definitions/france/league_france2.xml support_files/definitions/france/league_france3.xml support_files/definitions/france/cup_france_ligue.xml support_files/definitions/france/league_france4a.xml support_files/definitions/france/league_france4b.xml support_files/definitions/france/league_france4c.xml support_files/definitions/france/league_france4d.xml support_files/definitions/germany/cup_germany_dfb.xml support_files/definitions/germany/league_germany1.xml support_files/definitions/germany/CVS/Root support_files/definitions/germany/CVS/Repository support_files/definitions/germany/CVS/Entries support_files/definitions/germany/league_germany2.xml support_files/definitions/germany/league_germany3a.xml support_files/definitions/germany/league_germany3b.xml support_files/definitions/germany/country_germany.xml support_files/definitions/ireland/country_ireland.xml support_files/definitions/ireland/cup_ireland_league.xml support_files/definitions/ireland/cup_ireland_senior.xml support_files/definitions/ireland/league_ireland1.xml support_files/definitions/ireland/league_n_ireland1.xml support_files/definitions/ireland/league_ireland2.xml support_files/definitions/ireland/cup_ireland_prom_games.xml support_files/definitions/ireland/cup_ireland_setanta.xml support_files/definitions/ireland/cup_ireland_cl.xml support_files/definitions/ireland/cup_ireland_cl_q.xml support_files/definitions/ireland/cup_ireland_uefa.xml support_files/definitions/ireland/cup_ireland_uefa_q.xml support_files/definitions/ireland/CVS/Root support_files/definitions/ireland/CVS/Repository support_files/definitions/ireland/CVS/Entries support_files/definitions/italy/country_italy.xml support_files/definitions/italy/cup_italy_coppa.xml support_files/definitions/italy/league_italy1.xml support_files/definitions/italy/league_italy2.xml support_files/definitions/italy/league_italy3a.xml support_files/definitions/italy/league_italy3b.xml support_files/definitions/italy/CVS/Root support_files/definitions/italy/CVS/Repository support_files/definitions/italy/CVS/Entries support_files/definitions/italy/CVS/CVS/Root support_files/definitions/italy/CVS/CVS/Repository support_files/definitions/italy/CVS/CVS/Entries support_files/definitions/misc/CVS/Root support_files/definitions/misc/CVS/Repository support_files/definitions/misc/CVS/Entries support_files/definitions/misc/cup_supercup_league_vs_cup.xml support_files/definitions/poland/league_poland1.xml support_files/definitions/poland/league_poland2.xml support_files/definitions/poland/league_poland3a.xml support_files/definitions/poland/league_poland3b.xml support_files/definitions/poland/league_poland3c.xml support_files/definitions/poland/league_poland3d.xml support_files/definitions/poland/country_poland.xml support_files/definitions/poland/cup_poland_prom_games1.xml support_files/definitions/poland/cup_poland_prom_games2.xml support_files/definitions/poland/cup_poland_puchar.xml support_files/definitions/poland/CVS/Root support_files/definitions/poland/CVS/Repository support_files/definitions/poland/CVS/Entries support_files/definitions/romania/CVS/Root support_files/definitions/romania/CVS/Repository support_files/definitions/romania/CVS/Entries support_files/definitions/romania/country_romania.xml support_files/definitions/romania/league_romania1.xml support_files/definitions/romania/league_romania2.xml support_files/definitions/romania/league_romania3.xml support_files/definitions/romania/cup_supercup_romania.xml support_files/definitions/romania/cup_romania_cupa.xml support_files/definitions/scg/country_scg.xml support_files/definitions/scg/cup_scg.xml support_files/definitions/scg/league_scg2a.xml support_files/definitions/scg/league_scg2b.xml support_files/definitions/scg/league_scg1.xml support_files/definitions/scg/CVS/Root support_files/definitions/scg/CVS/Repository support_files/definitions/scg/CVS/Entries support_files/definitions/scotland/league_scotland1.xml support_files/definitions/scotland/country_scotland.xml support_files/definitions/scotland/CVS/Root support_files/definitions/scotland/CVS/Repository support_files/definitions/scotland/CVS/Entries support_files/definitions/scotland/league_scotland2.xml support_files/definitions/scotland/cup_scotland_league.xml support_files/definitions/scotland/league_scotland3.xml support_files/definitions/scotland/league_scotland4.xml support_files/definitions/scotland/cup_scotland_fa.xml support_files/definitions/short_leagues/CVS/Root support_files/definitions/short_leagues/CVS/Repository support_files/definitions/short_leagues/CVS/Entries support_files/definitions/short_leagues/league_czech1_short.xml support_files/definitions/short_leagues/league_denmark1_short.xml support_files/definitions/short_leagues/league_greece1_short.xml support_files/definitions/short_leagues/league_netherlands1_short.xml support_files/definitions/short_leagues/league_portugal1_short.xml support_files/definitions/short_leagues/league_russia1_short.xml support_files/definitions/short_leagues/league_switzerland1_short.xml support_files/definitions/short_leagues/league_turkey1_short.xml support_files/definitions/short_leagues/league_ukraine1_short.xml support_files/definitions/short_leagues_south_america/league_bolivia1_short.xml support_files/definitions/short_leagues_south_america/league_chile1_short.xml support_files/definitions/short_leagues_south_america/league_colombia1_short.xml support_files/definitions/short_leagues_south_america/league_ecuador1_short.xml support_files/definitions/short_leagues_south_america/league_mexico1_short.xml support_files/definitions/short_leagues_south_america/league_paraguay1_short.xml support_files/definitions/short_leagues_south_america/league_peru1_short.xml support_files/definitions/short_leagues_south_america/league_uruguay1_short.xml support_files/definitions/short_leagues_south_america/league_venezuela1_short.xml support_files/definitions/short_leagues_south_america/CVS/Root support_files/definitions/short_leagues_south_america/CVS/Repository support_files/definitions/short_leagues_south_america/CVS/Entries support_files/definitions/spain/CVS/Root support_files/definitions/spain/CVS/Repository support_files/definitions/spain/CVS/Entries support_files/definitions/spain/country_spain.xml support_files/definitions/spain/cup_spain_cdr.xml support_files/definitions/spain/cup_spain_prom_games_1.xml support_files/definitions/spain/cup_spain_prom_games_2.xml support_files/definitions/spain/cup_spain_prom_games_3.xml support_files/definitions/spain/cup_spain_prom_games_4.xml support_files/definitions/spain/cup_spain_rfef.xml support_files/definitions/spain/league_spain1.xml support_files/definitions/spain/league_spain2.xml support_files/definitions/spain/league_spain3a.xml support_files/definitions/spain/league_spain3b.xml support_files/definitions/spain/league_spain3c.xml support_files/definitions/spain/league_spain3d.xml support_files/definitions/usa/league_usa_econf.xml support_files/definitions/usa/country_usa.xml support_files/definitions/usa/CVS/Root support_files/definitions/usa/CVS/Repository support_files/definitions/usa/CVS/Entries support_files/definitions/usa/CVS/CVS/Root support_files/definitions/usa/CVS/CVS/Repository support_files/definitions/usa/CVS/CVS/Entries support_files/definitions/usa/league_usa_wconf.xml support_files/definitions/usa/cup_usa_eplayoff.xml support_files/definitions/usa/cup_usa_wplayoff.xml support_files/definitions/usa/cup_usa_mls_cup.xml support_files/definitions/wales/league_wales1.xml support_files/definitions/wales/league_wales2a.xml support_files/definitions/wales/league_wales2b.xml support_files/definitions/wales/country_wales.xml support_files/definitions/wales/cup_wales_welsh.xml support_files/definitions/wales/cup_wales_challenge.xml support_files/definitions/wales/cup_wales_premier.xml support_files/definitions/wales/league_wales_english.xml support_files/definitions/wales/cup_wales_uefa_q.xml support_files/definitions/wales/cup_wales_uefa.xml support_files/definitions/wales/cup_wales_cl.xml support_files/definitions/wales/cup_wales_cl_q.xml support_files/definitions/wales/CVS/Root support_files/definitions/wales/CVS/Repository support_files/definitions/wales/CVS/Entries support_files/bygfoot_constants support_files/bygfoot_user.conf support_files/lg_commentary/lg_commentary_de.xml support_files/lg_commentary/lg_commentary_en.xml support_files/lg_commentary/lg_commentary_nl.xml support_files/lg_commentary/lg_commentary_pl.xml support_files/lg_commentary/lg_commentary_bg.xml support_files/bygfoot_app support_files/bygfoot_help support_files/bygfoot_lg_tokens install-data-local: @$(NORMAL_INSTALL) diff --git a/bygfoot_options.glade b/bygfoot_options.glade index da5b3958..1c704857 100644 --- a/bygfoot_options.glade +++ b/bygfoot_options.glade @@ -845,7 +845,7 @@ GTK_UPDATE_ALWAYS False False - 0 -10 20 1 10 10 + 0 0 40 1 10 10 1 diff --git a/locale/bg/LC_MESSAGES/bygfoot.mo b/locale/bg/LC_MESSAGES/bygfoot.mo index 5500f8e777afaa0624d0c79485e8de36167a939f..9a32faf12c5ae570ba6d3b6d0f2ba3387e3a4b7b 100644 GIT binary patch literal 64783 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 delta 13715 zcmZA833yFczsK<%8AReHF%!XwIfw*7j4{t7#+r$Uh!8|#=AbAs);z1Rl-3YaskVl; zbfVh2s4A*nrKPmm(&B!9XRX}px%+wlK5MPL_L}!j==089;5~c3xBFT_pXCnMh&+xH zhBFH}P9tx}`K6*t9p`#2$0>z3tS>Nwe5n}63Bbh|f@?7lccU*J!DxKn<{zLB`Nyc| zo?=1AaXbFC9Vdu_l9(5(pc<@+YN$E-VO!LL38;qpU@#6ue;kFXHvv^|8mhg8sCHJ^ z@^x6B{F~@U|ISSk`6&1qHG|(#54^DY)-eqRqUsgJ{OCe;5Q%!OHfkVEQT5u{d^gm9 z`XP(!q@f1tMqm1OW-Ed7Q4KD!`8CK+IB%dH*os=2U8n)PhidpN>bY;MSFtSlTd0BM zt;?XX5VGn{73_fn&>c_WkiFp->o{z$(*S$pNNj_RoP2er2cQ1#!p zeqrxlMb*E7jMe!GwIbm(ssSuOZP_yGW;cmq6ugb<@FUdHeQ7J)Kt1>Xb=v<#4cITv z)C7OLU`n_q#&$!|b4bQsmqdsqO! zLLJ5*ZTTOzJYN&D#3fPhe>m#7E~rDBf*NS1(e1cxK{jfJ%TY7fhI-%tmcSFJmH7@Q z;eA|&!i0%1?GRf&6-$zzYs{*@b2CB>Lh{sQ&I@9(>x8_4g+6i~rsb$4{Cx(Z2o8~)?W>s zqF@1jVsCVBZ5rs0H7Fm9YIp^v;9Ask-fhg%=S6i8j5-6wQHMDiwL(qMGXeA`pNJaZ zFgFQR9EBR$G}O|}u+Fm1vCcz1xDfqt8EQ+`+WZdG^LtSB_G4Z=V)GxOp8FWpuloxU zn%VcLhHj!p`~dlkJ5Nv##I!Z_8d#ekKNg&p=)$QOfg7<4o<(&W*3NOpVR;;a>riit zcYDv)x}9JW{uDI9{@51P;SO8A$9e?wQGNn-RzAZbc+uv6LH&4ridxB_4rYr&Q1uI= zW?Tl$#$$e*i}i2?G8yMQYNjPSn&--)23iGm zIAc(I-xf8%f%bl;?(6-ZN<#1VQq+t-#v^zYtKsraX5=TW7f>IPo7Tsu*VI4Wl!v1Z zVGOFg18M@vsI4B0TA@kk*3wKN5rlIvKdwZLd@E|?@1kC#^Qfh}iGg?zb;$m*K0~dX zcY+yk0II!EYbDeKV^Hn2OJMyqqP`TUp+wX`Qcz1Z7Ii-x)$t-*z6!O(yD<_EVMV-! zAsE=%JQs#hgXzJK-aMVK15B-n^#277ju(P17)xRMxd539(5>tU?`44?dd#p;TF^u zoJI}sy!9Gt&wsIb->zmLg-|P53^jo;)N}3%B!WpqqZ(|2+OrO*4tt?0j<)yRHa`zF z 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
={c~3TE|iPEh1&l=+VYdenxGv6 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Ⓢ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 delta 13125 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 diff --git a/src/callback_func.c b/src/callback_func.c index 8e88e362..a472a74a 100644 --- a/src/callback_func.c +++ b/src/callback_func.c @@ -24,6 +24,15 @@ callback_show_next_live_game(void) { gint i, j; + /*d*/ + if(debug > 0) + for(i=0;iplayers->len;i++) + printf("wee %-25s st %d cnt %f pro %.3f\n", + g_array_index(current_user.tm->players, Player, i).name->str, + g_array_index(current_user.tm->players, Player, i).streak, + g_array_index(current_user.tm->players, Player, i).streak_count, + g_array_index(current_user.tm->players, Player, i).streak_prob); + for(i=0;ilen;i++) usr(i).counters[COUNT_USER_TOOK_TURN] = 0; diff --git a/src/file.h b/src/file.h index 1391cfce..e62b5b79 100644 --- a/src/file.h +++ b/src/file.h @@ -65,9 +65,6 @@ file_compress_files(const gchar *destfile, const gchar *prefix); void file_decompress(const gchar *filename); -GPtrArray* -file_get_name_files(void); - void file_remove_files(const gchar *files); diff --git a/src/fixture.c b/src/fixture.c index 6c2829b3..738cf042 100644 --- a/src/fixture.c +++ b/src/fixture.c @@ -203,15 +203,26 @@ fixture_get_round_robin_advance(const Cup *cup, gint round) /** Return the pointer of the team that won the encounter. @param fix The fixture we examine. @param team_name Whether to return a team pointer or the - team name of the winner. + team id of the winner. @return A team pointer or a coded integer. */ gpointer fixture_winner_of(const Fixture *fix, gboolean team_id) { gint winner_idx = -1; - const Fixture *first_leg; - const CupRound *cupround = - &g_array_index(cup_from_clid(fix->clid)->rounds, CupRound, fix->round); + const Fixture *first_leg = NULL; + const CupRound *cupround = NULL; + + if(fix->clid < ID_CUP_START) + { + winner_idx = (fix->result[0][0] < fix->result[1][0]); + if(team_id) + return GINT_TO_POINTER(fix->team_ids[winner_idx]); + else + return (gpointer)fix->teams[winner_idx]; + } + + cupround = &g_array_index(cup_from_clid(fix->clid)->rounds, + CupRound, fix->round); if(cupround->replay != 0 || !cupround->home_away) winner_idx = (math_sum_int_array(&(fix->result[0][0]), 3) < diff --git a/src/game.c b/src/game.c index fe11e898..54ae01d7 100644 --- a/src/game.c +++ b/src/game.c @@ -86,7 +86,8 @@ game_get_player_contribution(const Player *pl, gint type) const_float("float_player_team_weight_forward_attack")}}; return player_get_game_skill(pl, FALSE) * - player_weights[pl->cpos - 1][type - GAME_TEAM_VALUE_DEFEND]; + player_weights[pl->cpos - 1][type - GAME_TEAM_VALUE_DEFEND] * + (1 + (gfloat)pl->streak * const_float("float_player_streak_influence_skill")); } /** Return a random attacking or defending player @@ -108,7 +109,6 @@ game_get_player(const Team *tm, gint player_type, gfloat probs[10]; gfloat rndom; - /*todo move to constants file?*/ if(player_type == GAME_PLAYER_TYPE_ATTACK) { weights[0] = const_float("float_game_player_weight_attack_def"); @@ -182,16 +182,27 @@ game_get_player_probs(GArray *players, gfloat *probs, gfloat *weights, gboolean { gint i; - probs[0] = (skills) ? player_get_game_skill(&g_array_index(players, Player, 1), FALSE) * + probs[0] = (skills) ? + player_get_game_skill(&g_array_index(players, Player, 1), FALSE) * weights[g_array_index(players, Player, 1).cpos - 1] : weights[g_array_index(players, Player, 1).cpos - 1] * (g_array_index(players, Player, 1).cskill != 0); + + probs[0] *= (1 + (gfloat)g_array_index(players, Player, 1).streak * + const_float("float_player_streak_influence_skill")); + + for(i=1;i<10;i++) + { probs[i] = probs[i - 1] + - ((skills) ? player_get_game_skill(&g_array_index(players, Player, i + 1), FALSE) * + ((skills) ? + player_get_game_skill(&g_array_index(players, Player, i + 1), FALSE) * weights[g_array_index(players, Player, i + 1).cpos - 1] : weights[g_array_index(players, Player, i + 1).cpos - 1] * (g_array_index(players, Player, i + 1).cskill != 0)); + probs[i] *= (1 + (gfloat)g_array_index(players, Player, i + 1).streak * + const_float("float_player_streak_influence_skill")); + } } /** Return the player who's shooting the following penalty @@ -281,17 +292,29 @@ game_initialize(Fixture *fix) { if(g_array_index(fix->teams[i]->players, Player, j).cskill > 0) { - player_games_goals_set(&g_array_index(fix->teams[i]->players, Player, j), fix->clid, + player_games_goals_set(&g_array_index(fix->teams[i]->players, + Player, j), fix->clid, PLAYER_VALUE_GAMES, 1); - g_array_index(fix->teams[i]->players, Player, j).career[PLAYER_VALUE_GAMES]++; + g_array_index(fix->teams[i]->players, Player, j). + career[PLAYER_VALUE_GAMES]++; - g_array_index(fix->teams[i]->players, Player, j).participation = TRUE; + g_array_index(fix->teams[i]->players, Player, j). + participation = TRUE; - if(query_player_is_youth((&g_array_index(fix->teams[i]->players, Player, j)))) + if(query_player_is_youth((&g_array_index(fix->teams[i]->players, + Player, j)))) g_array_index(fix->teams[i]->players, Player, j).lsu += const_float("float_youth_lsu_addition_match"); + + player_streak_add_to_prob( + &g_array_index(fix->teams[i]->players, Player, j), + const_float("float_player_streak_add_startup")); } } + else + player_streak_add_to_prob( + &g_array_index(fix->teams[i]->players, Player, j), + const_float("float_player_streak_add_no_startup")); } if(user_idx[i] != -1) @@ -573,8 +596,17 @@ game_player_injury(Player *pl) } if(pl->health == PLAYER_INJURY_CAREER_STOP && team_is_user(pl->team) != -1) - user_event_add(&usr(team_is_user(pl->team)), EVENT_TYPE_PLAYER_CAREER_STOP, pl->id, -1, + user_event_add(&usr(team_is_user(pl->team)), + EVENT_TYPE_PLAYER_CAREER_STOP, pl->id, -1, NULL, NULL); + + player_streak_add_to_prob( + pl, const_float("float_player_streak_add_injury")); + if(pl->streak == PLAYER_STREAK_HOT) + { + pl->streak = PLAYER_STREAK_NONE; + player_streak_reset_count(pl); + } } /** Return a factor influencing who's fouled whom @@ -603,30 +635,38 @@ game_get_foul_possession_factor(gint boost1, gint boost2) gint game_substitute_player(Team *tm, gint player_number) { - gint i; + gint i, substitute = -1; GPtrArray *substitutes = g_ptr_array_new(); gboolean adapt_structure; - gint substitute = -1; for(i=11;iplayers->len;i++) if(g_array_index(tm->players, Player, i).cskill > 0) g_ptr_array_add(substitutes, &g_array_index(tm->players, Player, i)); - g_ptr_array_sort_with_data(substitutes, (GCompareDataFunc)player_compare_substitute_func, - GINT_TO_POINTER(player_of_idx_team(tm, player_number)->cpos)); + g_ptr_array_sort_with_data(substitutes, + (GCompareDataFunc)player_compare_substitute_func, + GINT_TO_POINTER(player_of_idx_team(tm, + player_number)->cpos)); adapt_structure = (math_get_place(team_find_appropriate_structure(tm), 1) + math_get_place(team_find_appropriate_structure(tm), 2) + math_get_place(team_find_appropriate_structure(tm), 3) != 10 || - (player_of_idx_team(tm, player_number)->cpos != ((Player*)g_ptr_array_index(substitutes, 0))->pos && + (player_of_idx_team(tm, player_number)->cpos != + ((Player*)g_ptr_array_index(substitutes, 0))->pos && player_substitution_good_structure(tm->structure, player_of_idx_team(tm, player_number)->cpos, ((Player*)g_ptr_array_index(substitutes, 0))->pos))); substitute = ((Player*)g_ptr_array_index(substitutes, 0))->id; - player_swap(tm, player_number, - tm, player_id_index(tm, ((Player*)g_ptr_array_index(substitutes, 0))->id)); + player_streak_add_to_prob( + &g_array_index(tm->players, Player, player_number), + const_float("float_player_streak_add_sub_out")); + + player_streak_add_to_prob((Player*)g_ptr_array_index(substitutes, 0), + const_float("float_player_streak_add_sub_in")); + + player_swap(tm, player_number, tm, player_id_index(tm, substitute)); g_ptr_array_free(substitutes, TRUE); @@ -942,6 +982,12 @@ game_post_match(Fixture *fix) GPtrArray *teams = NULL; Cup *cup = NULL; + if((debug > 100 && fixture_user_team_involved(fix) != -1) || + debug > 130) + printf("game_post_match: %s - %s\n", + fix->teams[0]->name->str, + fix->teams[1]->name->str); + if(query_fixture_has_tables(fix)) table_update(fix); @@ -951,7 +997,7 @@ game_post_match(Fixture *fix) team_update_cpu_team(fix->teams[i], (fixture_user_team_involved(fix) != -1)); else - team_update_post_match(fix->teams[i], fix->clid); + team_update_post_match(fix->teams[i], fix); } if(fix->clid < ID_CUP_START) diff --git a/src/live_game.c b/src/live_game.c index df87f211..01d1cf14 100644 --- a/src/live_game.c +++ b/src/live_game.c @@ -49,7 +49,8 @@ live_game_calculate_fixture(Fixture *fix) game_get_values(match->fix, match->team_values, match->home_advantage); - if(debug > 80 && fixture_user_team_involved(match->fix) != -1) + if((debug > 80 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\n\nlive_game_calculate_fixture\n%04d %s %s %04d\n\n", tm0->id, tm0->name->str, tm1->name->str, tm1->id); @@ -92,8 +93,8 @@ live_game_initialize(Fixture *fix) window.live = window_create(WINDOW_LIVE); else gtk_window_set_title(GTK_WINDOW(window.live), - league_cup_get_name_string(((LiveGame*)statp)->fix->clid)); - window_live_set_spinbuttons(); + league_cup_get_name_string(((LiveGame*)statp)->fix->clid)); + window_live_set_spinbuttons(); } game_initialize(fix); @@ -109,7 +110,8 @@ live_game_create_unit(void) { LiveGameUnit new; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_create_unit\n"); if(unis->len == 0) @@ -168,7 +170,8 @@ live_game_fill_new_unit(LiveGameUnit *new) gfloat possession_change, scoring_chance = 0, injury_event_prob, foul_event_prob; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_fill_new_unit\n"); possession_change = const_float("float_live_game_event_general") * @@ -227,7 +230,8 @@ live_game_create_start_unit(void) { LiveGameUnit new; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_create_start_unit\n"); new.event.player = new.event.player2 = -1; @@ -255,7 +259,8 @@ live_game_evaluate_unit(LiveGameUnit *unit) { gint type = unit->event.type; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_evaluate_unit\n"); if(type == LIVE_GAME_EVENT_FOUL) live_game_event_foul(); @@ -295,7 +300,8 @@ live_game_event_foul(void) gfloat rndom = math_rnd(0, 1); gint type, fouled_player, foul_player, foul_team; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_foul\n"); if(math_rnd(0, 1) > const_float("float_live_game_foul_by_possession") * game_get_foul_possession_factor( @@ -322,7 +328,7 @@ live_game_event_foul(void) last_unit.area, 0, -1, FALSE); foul_player = last_unit.event.player2 = game_get_player(tm[last_unit.possession], - last_unit.area, 0, -1, FALSE); + last_unit.area, 0, -1, FALSE); } if(rndom < const_float("float_live_game_foul_red_injury")) @@ -373,7 +379,8 @@ live_game_event_foul(void) void live_game_event_lost_possession(void) { - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_lost_possession\n"); last_unit.event.player = game_get_player(tm[last_unit.possession], @@ -404,7 +411,8 @@ live_game_event_injury(gint team, gint player, gboolean create_new) LiveGameUnit new; gint old_structure = -1; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_injury\n"); if(create_new) { @@ -445,7 +453,7 @@ live_game_event_injury(gint team, gint player, gboolean create_new) if(last_unit.event.type == LIVE_GAME_EVENT_INJURY) { game_player_injury(player_of_id_team(tm[last_unit.event.team], - last_unit.event.player)); + last_unit.event.player)); if(match->subs_left[last_unit.event.team] > 0) { @@ -495,7 +503,8 @@ live_game_event_stadium(void) for(i=1;i<3;i++) probs[i] += probs[i - 1]; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_stadium\n"); if(rndom <= probs[0]) last_unit.event.type = LIVE_GAME_EVENT_STADIUM_BREAKDOWN; @@ -525,7 +534,8 @@ live_game_event_scoring_chance(void) else res_idx = 0; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_scoring_chance\n"); if(math_rnd(0, 1) < const_float("float_live_game_scoring_chance_is_own_goal")) @@ -536,6 +546,10 @@ live_game_event_scoring_chance(void) last_unit.event.team = !last_unit.possession; match->fix->result[last_unit.possession][res_idx]++; last_unit.result[last_unit.possession]++; + + player_streak_add_to_prob(player_of_id_team(tm[last_unit.event.team], + last_unit.event.player), + const_float("float_player_streak_add_own_goal")); } else { @@ -544,14 +558,14 @@ live_game_event_scoring_chance(void) if(uni(unis->len - 2).event.player != -1 && math_rnd(0, 1) < const_float("float_live_game_player_in_poss_shoots") && query_player_id_in_team(uni(unis->len - 2).event.player, - tm[last_unit.possession])) + tm[last_unit.possession])) last_unit.event.player = uni(unis->len - 2).event.player; else { if(uni(unis->len - 2).event.player != -1 && query_player_id_in_team(uni(unis->len - 2).event.player, - tm[last_unit.possession])) + tm[last_unit.possession])) { last_unit.event.player = game_get_player(tm[last_unit.possession], last_unit.area, 0, @@ -590,7 +604,8 @@ live_game_event_penalty(void) { LiveGameUnit new; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_penalty\n"); if(last_unit.time != LIVE_GAME_UNIT_TIME_PENALTIES) @@ -655,7 +670,8 @@ live_game_event_general(gboolean create_new) { LiveGameUnit new; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_general\n"); if(create_new) { @@ -738,7 +754,8 @@ live_game_event_general_get_players(void) uni(unis->len - 2).event.player; gint type = uni(unis->len - 2).event.type; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_general_get_players\n"); *pl1 = *pl2 = -1; @@ -771,7 +788,8 @@ live_game_event_free_kick(void) { LiveGameUnit new = last_unit; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_free_kick\n"); new.event.player = new.event.player2 = -1; @@ -804,7 +822,8 @@ live_game_event_send_off(gint team, gint player, gboolean second_yellow) LiveGameUnit new = last_unit; gint substitute = -1, to_substitute = -1; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_send_off\n"); new.event.player = new.event.player2 = -1; @@ -823,6 +842,15 @@ live_game_event_send_off(gint team, gint player, gboolean second_yellow) if(debug >= 50 && team_is_user(tm[team]) != -1) return; + player_streak_add_to_prob( + player_of_id_team(tm[team], player), + const_float("float_player_streak_add_sendoff")); + if(player_of_id_team(tm[team], player)->streak == PLAYER_STREAK_HOT) + { + player_of_id_team(tm[team], player)->streak = PLAYER_STREAK_NONE; + player_streak_reset_count(player_of_id_team(tm[team], player)); + } + player_of_id_team(tm[team], player)->cskill = 0; if(second_yellow) player_card_set(player_of_id_team(tm[team], player), match->fix->clid, PLAYER_VALUE_CARD_RED, 2, FALSE); @@ -939,10 +967,11 @@ live_game_event_duel(void) gfloat scoring_prob; gfloat duel_factor; LiveGameUnit new = last_unit; - Player *attacker, *goalie; + Player *attacker, *goalie, *assistant; gint res_idx1, res_idx2; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_event_duel\n"); new.minute = -1; @@ -950,8 +979,12 @@ live_game_event_duel(void) new.event.commentary = NULL; attacker = player_of_id_team(tm[new.possession], - new.event.player); + new.event.player); goalie = player_of_idx_team(tm[!new.possession], 0); + + assistant = (new.event.player2 != -1) ? + player_of_id_team(tm[new.possession], new.event.player2) : NULL; + new.event.player2 = goalie->id; duel_factor = player_get_game_skill(attacker, FALSE) / @@ -994,6 +1027,14 @@ live_game_event_duel(void) player_games_goals_set(goalie, match->fix->clid, PLAYER_VALUE_GOALS, 1); attacker->career[PLAYER_VALUE_GOALS]++; goalie->career[PLAYER_VALUE_GOALS]++; + + player_streak_add_to_prob(attacker, + const_float("float_player_streak_add_goal")); + player_streak_add_to_prob(goalie, + const_float("float_player_streak_add_goalie_goal")); + if(assistant != NULL) + player_streak_add_to_prob( + assistant, const_float("float_player_streak_add_assist")); } } else @@ -1005,6 +1046,10 @@ live_game_event_duel(void) { player_games_goals_set(goalie, match->fix->clid, PLAYER_VALUE_SHOTS, 1); goalie->career[PLAYER_VALUE_SHOTS]++; + + if(new.event.type == LIVE_GAME_EVENT_SAVE) + player_streak_add_to_prob(goalie, + const_float("float_player_streak_add_goalie_save")); } g_array_append_val(unis, new); @@ -1289,10 +1334,12 @@ live_game_finish_unit(void) { LiveGameUnit *unit = &last_unit; - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("\t\tlive_game_finish_unit\n"); - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("OOOO1 idx %d type %d poss %d team %d pl %d %d\n", unis->len - 1, unit->event.type, unit->possession, unit->event.team, unit->event.player, @@ -1345,7 +1392,8 @@ live_game_finish_unit(void) if(show) game_gui_live_game_show_unit(unit); - if(debug > 100 && fixture_user_team_involved(match->fix) != -1) + if((debug > 100 && fixture_user_team_involved(match->fix) != -1) || + debug > 130) printf("OOOO idx %d type %d poss %d team %d pl %d %d\n", unis->len - 1, unit->event.type, unit->possession, unit->event.team, unit->event.player, diff --git a/src/live_game.h b/src/live_game.h index 03a47891..00fab871 100644 --- a/src/live_game.h +++ b/src/live_game.h @@ -10,9 +10,6 @@ live_game_calculate_fixture(Fixture *fix); void live_game_initialize(Fixture *fix); -void -live_game_post_match(void); - gboolean query_live_game_event_is_break(gint minute, gint time); @@ -106,9 +103,6 @@ live_game_finish_unit(void); LiveGameUnit* live_game_unit_before(const LiveGameUnit* unit, gint gap); -void -live_game_set_match(LiveGame *live_game); - gint live_game_event_get_verbosity(gint event_type); diff --git a/src/main.c b/src/main.c index ce5ce059..b4b87b9d 100644 --- a/src/main.c +++ b/src/main.c @@ -161,7 +161,10 @@ void main_exit_program(gint exit_code, gchar *exit_message) { if(gtk_main_level() > 0) + { + window_main_save_geometry(); gtk_main_quit(); + } free_memory(); diff --git a/src/misc.h b/src/misc.h index adfc936b..2f8557e7 100644 --- a/src/misc.h +++ b/src/misc.h @@ -32,9 +32,6 @@ misc_int_compare(gint first, gint second); gint misc_float_compare(gfloat first, gfloat second); -void -misc_truncate_string(const gchar *src, gchar *dest, gint number_of_chars); - gboolean query_misc_string_contains(const gchar *string, const gchar *text); diff --git a/src/option_gui.c b/src/option_gui.c index 2c59f29b..a3ffc9c4 100644 --- a/src/option_gui.c +++ b/src/option_gui.c @@ -309,6 +309,8 @@ enum SpinOptions void option_gui_write_spin_widgets(gint **spin_options, GtkSpinButton **spin_widgets) { + gint speed_val = 0; + spin_widgets[SPIN_OPT_AUTOSAVE] = GTK_SPIN_BUTTON(lookup_widget(window.options, "spinbutton_autosave")); spin_options[SPIN_OPT_AUTOSAVE] = opt_intp("int_opt_autosave_interval"); @@ -329,9 +331,15 @@ option_gui_write_spin_widgets(gint **spin_options, GtkSpinButton **spin_widgets) GTK_SPIN_BUTTON(lookup_widget(window.options, "spinbutton_live_speed")); spin_options[SPIN_OPT_LIVE_SPEED] = opt_user_intp("int_opt_user_live_game_speed"); - gtk_spin_button_set_range(GTK_SPIN_BUTTON(spin_widgets[SPIN_OPT_LIVE_SPEED]), 0, - -rint((gfloat)(const_int("int_game_gui_live_game_speed_max") - 10) / - (gfloat)(const_int("int_game_gui_live_game_speed_grad")))); + /** Note the spinbutton value so that it doesn't get lost + when setting the range. */ + speed_val = gtk_spin_button_get_value_as_int(spin_widgets[SPIN_OPT_LIVE_SPEED]); + gtk_spin_button_set_range( + spin_widgets[SPIN_OPT_LIVE_SPEED], 0, + -rint((gfloat)(const_int("int_game_gui_live_game_speed_max") - 10) / + (gfloat)(const_int("int_game_gui_live_game_speed_grad")))); + gtk_spin_button_set_value(spin_widgets[SPIN_OPT_LIVE_SPEED], + (gfloat)speed_val); spin_widgets[SPIN_OPT_LIVE_VERBOSITY] = GTK_SPIN_BUTTON(lookup_widget(window.options, "spinbutton_live_verbosity")); @@ -409,12 +417,13 @@ option_gui_write_options(void) gint *spin_options[SPIN_OPT_END]; GtkEntry *entry_widgets[ENTRY_OPT_END]; GString *entry_options[ENTRY_OPT_END]; - + language_set(language_index); option_gui_write_bool_widgets(bool_options, bool_widgets); option_gui_write_spin_widgets(spin_options, spin_widgets); option_gui_write_entry_widgets(entry_options, entry_widgets); + for(i=0;iteam->boost * const_float("float_player_boost_fitness_effect"); + gfloat streak_factor = 1 + (gfloat)pl->streak * + const_float("float_player_streak_influence_fitness_decrease"); if(pl->age < pl->peak_age - pl->peak_region) pl->fitness -= (((pl->peak_age - pl->peak_region - pl->age) * const_float("float_player_fitness_decrease_younger_factor") + const_float("float_player_fitness_decrease_add")) * - goalie_factor * boost_factor); + goalie_factor * boost_factor * streak_factor); else if(pl->age > pl->peak_age + pl->peak_region) pl->fitness -= (((pl->age - pl->peak_age - pl->peak_region) * const_float("float_player_fitness_decrease_older_factor") + const_float("float_player_fitness_decrease_add")) * - goalie_factor * boost_factor); + goalie_factor * boost_factor * streak_factor); else pl->fitness -= (const_float("float_player_fitness_decrease_add") * - goalie_factor * boost_factor); + goalie_factor * boost_factor * streak_factor); pl->fitness = MAX(0, pl->fitness); } @@ -735,6 +725,8 @@ player_update_fitness(Player *pl) gfloat variance = math_rnd(1 - const_float("float_player_fitness_increase_variance"), 1 + const_float("float_player_fitness_increase_variance")); + gfloat streak_factor = + 1 + (pl->streak * const_float("float_player_streak_influence_fitness_increase")); if(pl->participation) { @@ -746,14 +738,15 @@ player_update_fitness(Player *pl) pl->fitness += (((pl->peak_age - pl->peak_region - pl->age) * const_float("float_player_fitness_increase_younger_factor") + const_float("float_player_fitness_increase_add")) * - variance); + variance * streak_factor); else if(pl->age > pl->peak_age + pl->peak_region) pl->fitness += (((pl->age - pl->peak_age - pl->peak_region) * const_float("float_player_fitness_increase_older_factor") + const_float("float_player_fitness_increase_add")) * - variance); + variance * streak_factor); else - pl->fitness += (const_float("float_player_fitness_increase_add") * variance); + pl->fitness += (const_float("float_player_fitness_increase_add") * + variance * streak_factor); pl->fitness = MIN(pl->fitness, 1); } @@ -993,6 +986,96 @@ player_update_injury(Player *pl) } } +/** Weekly test whether a player goes on a hot/cold + streak; if he's on a streak, decrease the streak counter. */ +void +player_update_streak(Player *pl) +{ + gfloat streak_type, streak_prob, + streak_length, decrease_factor = 0; + gfloat streak_prob_factor = + const_float("float_player_streak_prob_max") - + const_float("float_player_streak_prob_zero"), + streak_prob_add = const_float("float_player_streak_prob_zero"); + + /*d*/ + if(debug > 0) + printf("upd %-25s streak %d count %.1f prob %.3f\n", + pl->name->str, pl->streak, pl->streak_count, pl->streak_prob); + + /** Player streak is locked. */ + if(pl->streak_count < 0) + { + pl->streak_count++; + + if(pl->streak_count >= 0) + pl->streak_count = 0; + + return; + } + else if(pl->streak_count > 0) + { + if(pl->streak == PLAYER_STREAK_HOT) + decrease_factor = -1; + else if(pl->streak == PLAYER_STREAK_COLD) + decrease_factor = 1; + else + g_warning("player_update_streak: streak count is positive (%.1f) but player %s is not on a streak!\n", pl->streak_count, pl->name->str); + + pl->streak_count -= + (pl->streak_prob * decrease_factor * + const_float("float_player_streak_count_decrease_factor") + + const_float("float_player_streak_count_decrease_add")); + + /** Streak is over. */ + if(pl->streak_count <= 0) + { + pl->streak = PLAYER_STREAK_NONE; + player_streak_reset_count(pl); + } + + return; + } + + if(query_player_is_in_ya(pl)) + return; + + /** Now let's find out whether there's a new streak. */ + streak_type = math_rnd(-1, 1); + streak_prob = math_rnd(0, 1); + streak_length = math_rnd(const_float("float_player_streak_length_lower"), + const_float("float_player_streak_length_upper")); + + if(streak_type < pl->streak_prob && + ((pl->streak_prob > 0 && + streak_prob < streak_prob_factor * pl->streak_prob + streak_prob_add) || + (pl->streak_prob <= 0 && + streak_prob < streak_prob_add * pl->streak_prob + streak_prob_add))) + { + pl->streak = PLAYER_STREAK_HOT; + pl->streak_count = streak_length; + + /*d*/ + if(debug > 0) + printf("**** %s HOT length %.1f prob %.2f\n", + pl->name->str, pl->streak_count, pl->streak_prob); + } + else if(streak_type > pl->streak_prob && + ((pl->streak_prob > 0 && + streak_prob < -streak_prob_add * pl->streak_prob + streak_prob_add) || + (pl->streak_prob <= 0 && + streak_prob < -streak_prob_factor * pl->streak_prob + streak_prob_add))) + { + pl->streak = PLAYER_STREAK_COLD; + pl->streak_count = streak_length; + + /*d*/ + if(debug > 0) + printf("**** %s COLD length %.1f prob %.2f\n", + pl->name->str, pl->streak_count, pl->streak_prob); + } +} + /** Update a player in a user team (age, skill etc.). */ void player_update_weekly(Player *pl) @@ -1015,8 +1098,11 @@ player_update_weekly(Player *pl) player_remove_contract(pl); player_update_skill(pl); + if(pl->health > 0) player_update_injury(pl); + else + player_update_streak(pl); } /** Remove a player from a user team after the contract expired. @@ -1045,20 +1131,40 @@ player_remove_from_team(Team *tm, gint idx) @param pl The player we update. @param clid The fixture clid. */ void -player_update_post_match(Player *pl, gint clid) +player_update_post_match(Player *pl, const Fixture *fix) { - gint yellow_red = league_cup_get_yellow_red(clid); + gint yellow_red = league_cup_get_yellow_red(fix->clid); + gint winner = -1; - if(player_card_get(pl, clid, PLAYER_VALUE_CARD_RED) > 0) - player_card_set(pl, clid, PLAYER_VALUE_CARD_RED, -1, TRUE); + if(player_card_get(pl, fix->clid, PLAYER_VALUE_CARD_RED) > 0) + player_card_set(pl, fix->clid, PLAYER_VALUE_CARD_RED, -1, TRUE); - if(player_card_get(pl, clid, PLAYER_VALUE_CARD_YELLOW) >= yellow_red) + if(player_card_get(pl, fix->clid, PLAYER_VALUE_CARD_YELLOW) >= yellow_red) { - player_card_set(pl, clid, PLAYER_VALUE_CARD_YELLOW, 0, FALSE); + player_card_set(pl, fix->clid, PLAYER_VALUE_CARD_YELLOW, 0, FALSE); - if(player_card_get(pl, clid, PLAYER_VALUE_CARD_RED) == 0 && debug < 50) - player_card_set(pl, clid, PLAYER_VALUE_CARD_RED, 1, FALSE); - } + if(player_card_get(pl, fix->clid, PLAYER_VALUE_CARD_RED) == 0 && debug < 50) + player_card_set(pl, fix->clid, PLAYER_VALUE_CARD_RED, 1, FALSE); + } + + if(pl->cpos == PLAYER_POS_GOALIE && + ((fix->result[0][0] == 0 && fix->teams[1] == pl->team) || + (fix->result[1][0] == 0 && fix->teams[0] == pl->team))) + player_streak_add_to_prob( + pl, const_float("float_player_streak_add_goalie_clean")); + + /** No streak change if we had a draw. */ + if(!fix->decisive && fix->result[0][0] == fix->result[1][0]) + return; + + winner = GPOINTER_TO_INT(fixture_winner_of(fix, TRUE)); + + if(winner == pl->team->id) + player_streak_add_to_prob( + pl, const_float("float_player_streak_add_win")); + else + player_streak_add_to_prob( + pl, const_float("float_player_streak_add_loss")); } /** Replace a player by a new one in a cpu team. @@ -1264,3 +1370,34 @@ player_move_from_ya(gint idx) g_array_remove_index(current_user.youth_academy.players, idx); g_array_append_val(current_user.tm->players, player); } + +/** Wrapper for the streak probability addition operation + so that it always stays between -1 and 1. */ +void +player_streak_add_to_prob(Player *pl, gfloat add) +{ + /** No streaks for CPU players (yet). */ + if(team_is_user(pl->team) == -1) + return; + + pl->streak_prob += add; + pl->streak_prob = CLAMP(pl->streak_prob, -1, 1); + /*d*/ + if(debug > 0) + printf("addto %-25s st %d cnt %.1f pro %.3f\n", + pl->name->str, pl->streak, pl->streak_count, + pl->streak_prob); +} + +/** Find out whether a player is in the youth academy. */ +gboolean +query_player_is_in_ya(const Player *pl) +{ + gint i; + + for(i=0;iteam->players->len;i++) + if(pl == &g_array_index(pl->team->players, Player, i)) + return FALSE; + + return TRUE; +} diff --git a/src/player.h b/src/player.h index 1165b413..89b96bea 100644 --- a/src/player.h +++ b/src/player.h @@ -2,6 +2,8 @@ #define PLAYER_H #include "bygfoot.h" +#include "fixture_struct.h" +#include "maths.h" #include "player_struct.h" #include "team_struct.h" @@ -15,6 +17,9 @@ enum PlayerCompareAttrib #define query_player_is_youth(pl) (pl->age <= const_float("float_player_age_lower")) +/** Reset the streak counter. */ +#define player_streak_reset_count(pl) pl->streak_count = -math_rnd((gfloat)const_int("int_player_streak_lock_length_lower"), (gfloat)const_int("int_player_streak_lock_length_upper")) + Player player_new(Team *tm, gfloat average_skill, gboolean new_id); @@ -24,9 +29,6 @@ player_get_position_from_structure(gint structure, gint player_number); gfloat player_skill_from_talent(const Player *pl); -gfloat -player_new_talent(gfloat skill); - void player_estimate_talent(Player *pl); @@ -103,7 +105,7 @@ void player_update_fitness(Player *pl); void -player_update_post_match(Player *pl, gint clid); +player_update_post_match(Player *pl, const Fixture *fix); void player_replace_by_new(Player *pl, gboolean free_player); @@ -144,4 +146,13 @@ player_move_to_ya(gint idx); void player_move_from_ya(gint idx); +void +player_streak_add_to_prob(Player *pl, gfloat add); + +void +player_update_streak(Player *pl); + +gboolean +query_player_is_in_ya(const Player *pl); + #endif diff --git a/src/player_struct.h b/src/player_struct.h index 461240c8..3cbfd149 100644 --- a/src/player_struct.h +++ b/src/player_struct.h @@ -18,6 +18,14 @@ enum PlayerPos PLAYER_POS_END }; +/** Streaks a player can go on. */ +enum PlayerStreak +{ + PLAYER_STREAK_COLD = -1, + PLAYER_STREAK_NONE, + PLAYER_STREAK_HOT +}; + /** Cards in different cups are counted separately for players; for each league or cup the cards are stored in such a struct. @@ -87,25 +95,34 @@ typedef struct gint pos, /**< Position. @see #PlayerPos */ cpos, /**< Current position. @see #PlayerPos */ - health, /**< Health. An integer signifying an injury or good health. @see #PlayerInjury */ + health, /**< Health. An integer signifying an injury or + good health. @see #PlayerInjury */ recovery, /**< Weeks until the player gets healthy. */ id, /**< Id of the player within the team. */ value, /**< Value of the player. */ wage, /**< Wage of the player. */ - offers; /**< Number of times the player received a contract offer. */ - - gfloat skill, /**< Skill. Between 0 and a constant (specified in the constants file). */ + offers, /**< Number of times the player received a contract offer. */ + streak; /**< The streak the player is on. */ + + gfloat skill, /**< Skill. Between 0 and a constant + (specified in the constants file). */ cskill, /**< Current Skill. */ talent, /**< Talent. The peak ability (which isn't always reached). */ etal[QUALITY_END], /**< Estimated talent (the user never sees the actual talent). Depends on scout quality. */ fitness, /**< Fitness. Between 0 and 1. */ - lsu, /**< Last skill update. Number of weeks since the player skill was last updated. */ + lsu, /**< Last skill update. Number of weeks since the player + skill was last updated. */ age, /**< Age in years. */ peak_age, /**< Age at which the player reaches his peak ability. */ peak_region, /**< Region around the peak age during which the player's ability is at the peak (in years). */ - contract; /**< The years until the player's contract expires. */ + contract, /**< The years until the player's contract expires. */ + streak_prob, /**< This number determines how probable it is that a player + goes on a hot/cold streak. Between -1 and 1. */ + streak_count; /**< How many weeks the streak goes (or how + long a new streak may not begin if the value + is negative). */ /** Whether the player participated in the team's last match. */ gboolean participation; @@ -166,6 +183,7 @@ enum PlayerInfoAttributeValue PLAYER_INFO_ATTRIBUTE_GAMES_GOALS, PLAYER_INFO_ATTRIBUTE_YELLOW_CARDS, PLAYER_INFO_ATTRIBUTE_BANNED, + PLAYER_INFO_ATTRIBUTE_STREAK, PLAYER_INFO_ATTRIBUTE_CAREER, PLAYER_INFO_ATTRIBUTE_OFFERS, PLAYER_INFO_ATTRIBUTE_END diff --git a/src/team.c b/src/team.c index 92b23371..b37a7935 100644 --- a/src/team.c +++ b/src/team.c @@ -366,6 +366,21 @@ team_get_average_skill(const Team *tm, gboolean cskill) return (counter > 0) ? sum / (gfloat)counter : 0; } +/** Return the overall average talent of the team's players. + @param tm The team we examine. */ +gfloat +team_get_average_talent(const Team *tm) +{ + gint i; + gfloat sum = 0; + + for(i=0;iplayers->len;i++) + sum += player_of_idx_team(tm, i)->talent; + + return (tm->players->len > 0) ? sum / (gfloat)tm->players->len : 0; +} + + /** Return the rank of the team in the league tables. */ gint team_get_league_rank(const Team *tm) @@ -679,12 +694,12 @@ team_update_user_team_weekly(Team *tm) @param tm The user team we examine. @param clid The fixture clid. */ void -team_update_post_match(Team *tm, gint clid) +team_update_post_match(Team *tm, const Fixture *fix) { gint i; for(i=0;iplayers->len;i++) - player_update_post_match(player_of_idx_team(tm, i), clid); + player_update_post_match(player_of_idx_team(tm, i), fix); } /** Some updates each round. diff --git a/src/team.h b/src/team.h index 871032e1..4aa22265 100644 --- a/src/team.h +++ b/src/team.h @@ -51,6 +51,9 @@ team_get_fixture(const Team *tm, gboolean last_fixture); gfloat team_get_average_skill(const Team *tm, gboolean cskill); +gfloat +team_get_average_talent(const Team *tm); + gint team_is_user(const Team *tm); @@ -82,7 +85,7 @@ void team_update_cpu_team(Team *tm, gboolean reset_fitness); void -team_update_post_match(Team *tm, gint clid); +team_update_post_match(Team *tm, const Fixture *fix); void team_update_cpu_corrections(Team *tm, gboolean reset_fitness); diff --git a/src/transfer.c b/src/transfer.c index 34acfb1e..e9f28852 100644 --- a/src/transfer.c +++ b/src/transfer.c @@ -402,22 +402,6 @@ transfer_add_offer(gint idx, Team *tm, gint fee, gint wage) return FALSE; } -/** Return the index of the transfer containing the player going with - the team and the id. */ -gint -transfer_get_index(const Team *tm, gint id) -{ - gint i; - - for(i=0;ilen;i++) - if(trans(i).tm == tm && trans(i).id == id) - return i; - - main_exit_program(EXIT_INT_NOT_FOUND, - "transfer_get_index: didn't find transfer."); - return -1; -} - /** Remove any offers from the team for the given transfer player. */ gboolean transfer_remove_offer(gint idx, const Team *tm) diff --git a/src/transfer.h b/src/transfer.h index 36aaf489..76e16b1d 100644 --- a/src/transfer.h +++ b/src/transfer.h @@ -53,9 +53,6 @@ transfer_remove_player_ptr(const Player *pl); Team* transfer_team_get_new(void); -gint -transfer_get_index(const Team *tm, gint id); - void transfer_add_remove_user_player(Player *pl); diff --git a/src/treeview.c b/src/treeview.c index 7321565f..cbe84bf1 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -180,29 +180,32 @@ treeview_show_team_list(GtkTreeView *treeview, gboolean show_cup_teams, @param players The array containing the players. @param attributes An array containing the attributes we show. @param max The size of the attribute array. - @param separator Whether we draw a blank line after the 11th player. */ + @param separator Whether we draw a blank line after the 11th player. + @param status Whether player status is shown (takes two columns). */ GtkTreeModel* treeview_create_player_list(GPtrArray *players, gint *attributes, gint max, - gboolean show_separator, gboolean sortable) + gboolean show_separator, gboolean sortable, gboolean status) { gint i, j; GtkListStore *ls; GtkTreeIter iter; - GType types[max + 1]; + GType types[max + 1 + status]; types[0] = G_TYPE_INT; - for(i=0;ilen;i++) { gtk_list_store_append(ls, &iter); if(show_separator && i == 11) { - gtk_list_store_set(ls, &iter, 0, const_int("int_treeview_helper_int_empty"), -1); - for(j=0;j PLAYER_LIST_ATTRIBUTE_STATUS), + treeview_helper_player_compare, GINT_TO_POINTER(attributes[i]), NULL); } return (GtkTreeModel*)ls; @@ -239,7 +244,7 @@ void treeview_set_up_player_list(GtkTreeView *treeview, gint *attributes, gint max, gboolean show_separator, gboolean sortable) { - gint i; + gint i, cnt = 1; GtkTreeViewColumn *col; GtkCellRenderer *renderer; gchar *titles[PLAYER_LIST_ATTRIBUTE_END] = @@ -318,7 +323,26 @@ treeview_set_up_player_list(GtkTreeView *treeview, gint *attributes, gint max, attributes[i] == PLAYER_LIST_ATTRIBUTE_ETAL || attributes[i] == PLAYER_LIST_ATTRIBUTE_VALUE || attributes[i] == PLAYER_LIST_ATTRIBUTE_WAGE)) - gtk_tree_view_column_set_sort_column_id(col, i + 1); + gtk_tree_view_column_set_sort_column_id(col, cnt); + + cnt++; + + if(attributes[i] == PLAYER_LIST_ATTRIBUTE_STATUS) + { + col = gtk_tree_view_column_new(); + gtk_tree_view_append_column(treeview, col); + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(col, renderer, TRUE); + gtk_tree_view_column_set_cell_data_func( + col, renderer, treeview_helper_player_status_to_cell, + NULL, NULL); + + gtk_tree_view_column_set_alignment(col, 0.5); + g_object_set(renderer, "xalign", 0.5, + NULL); + + cnt++; + } } } @@ -330,24 +354,31 @@ treeview_set_up_player_list(GtkTreeView *treeview, gint *attributes, gint max, @param attrib The #PlayerListAttribute that determines which attributes to show. @param show_separator Whether we draw a blank line after the 11th player. */ void -treeview_show_player_list(GtkTreeView *treeview, GPtrArray *players, PlayerListAttribute attribute, +treeview_show_player_list(GtkTreeView *treeview, GPtrArray *players, + PlayerListAttribute attribute, gboolean show_separator) { gint i, cnt = 0; gint columns = math_sum_int_array(attribute.on_off, PLAYER_LIST_ATTRIBUTE_END); gint attributes[columns]; GtkTreeModel *model = NULL; - gboolean sortable = (treeview != GTK_TREE_VIEW(lookup_widget(window.main, "player_list1"))); + gboolean sortable = + (treeview != GTK_TREE_VIEW(lookup_widget(window.main, "player_list1"))); treeview_helper_clear(treeview); for(i=0;icards); break; + case PLAYER_INFO_ATTRIBUTE_STREAK: + treeview_helper_player_info_streak_to_cell(renderer, pl->streak); + break; case PLAYER_INFO_ATTRIBUTE_CAREER: treeview_helper_player_info_career_to_cell(renderer, pl); break; @@ -777,7 +780,8 @@ treeview_helper_player_info_banned_to_cell(GtkCellRenderer *renderer, const GArr for(i=0;ilen;i++) if(g_array_index(cards, PlayerCard, i).red > 0) { - /* Ban info of a player in the format: 'Cup/league name: Number of weeks banned' */ + /* Ban info of a player in the format: + 'Cup/league name: Number of weeks banned' */ sprintf(buf2, _("%s: %d weeks\n"), league_cup_get_name_string(g_array_index(cards, PlayerCard, i).clid), g_array_index(cards, PlayerCard, i).red); @@ -846,6 +850,15 @@ treeview_helper_player_info_games_goals_to_cell(GtkCellRenderer *renderer, const g_object_set(renderer, "text", buf, NULL); } +void +treeview_helper_player_info_streak_to_cell(GtkCellRenderer *renderer, gint streak) +{ + if(streak == PLAYER_STREAK_HOT) + g_object_set(renderer, "text", _("The player is on a hot streak"), NULL); + else if(streak == PLAYER_STREAK_COLD) + g_object_set(renderer, "text", _("The player is on a cold streak"), NULL); +} + void treeview_helper_player_info_health_to_cell(GtkCellRenderer *renderer, const Player *pl) { @@ -867,10 +880,10 @@ treeview_helper_player_info_health_to_cell(GtkCellRenderer *renderer, const Play /** Render a player list cell. */ void treeview_helper_player_to_cell(GtkTreeViewColumn *col, - GtkCellRenderer *renderer, - GtkTreeModel *model, - GtkTreeIter *iter, - gpointer user_data) + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) { gint column = treeview_helper_get_col_number_column(col); gint attribute = GPOINTER_TO_INT(user_data); @@ -921,7 +934,8 @@ treeview_helper_player_to_cell(GtkTreeViewColumn *col, treeview_helper_player_games_goals_to_cell(buf, pl, PLAYER_VALUE_SHOTS); break; case PLAYER_LIST_ATTRIBUTE_STATUS: - treeview_helper_player_status_to_cell(renderer, buf, pl); + treeview_helper_player_status_to_cell(NULL, renderer, + NULL, NULL, (gpointer)pl); break; case PLAYER_LIST_ATTRIBUTE_CARDS: treeview_helper_player_cards_to_cell(buf, pl); @@ -950,7 +964,8 @@ treeview_helper_player_to_cell(GtkTreeViewColumn *col, break; } - g_object_set(renderer, "text", buf, NULL); + if(attribute != PLAYER_LIST_ATTRIBUTE_STATUS) + g_object_set(renderer, "text", buf, NULL); } /** Render a cell of a player name. */ @@ -1064,34 +1079,95 @@ treeview_helper_player_cards_to_cell(gchar *buf, const Player *pl) @param buf The string the cell will contain. @param pl The pointer to the player. */ void -treeview_helper_player_status_to_cell(GtkCellRenderer *renderer, gchar *buf, const Player *pl) +treeview_helper_player_status_to_cell(GtkTreeViewColumn *col, + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data) { - gint ban = player_is_banned(pl); + const Player *pl = NULL; + gchar buf[SMALL]; + gint ban = 0, column = -1; + GdkPixbuf *symbol = NULL; + gboolean render_icon = (user_data == NULL); - if(pl->health != PLAYER_INJURY_NONE) + if(render_icon) { - /* Injury info. */ - sprintf(buf, _("INJ(%d)"), pl->recovery); - g_object_set(renderer, "background", - const_app("string_treeview_helper_color_player_injury"), NULL); + column = treeview_helper_get_col_number_column(col); + gtk_tree_model_get(model, iter, column, &pl, -1); + } + else + pl = (const Player*)user_data; + if(pl == NULL) + { + if(render_icon) + g_object_set(renderer, "pixbuf", NULL, NULL); return; } - if(ban > 0) + ban = player_is_banned(pl); + + if(pl->health != PLAYER_INJURY_NONE) + { + /* Injury info. */ + if(!render_icon) + { + sprintf(buf, _("INJ(%d)"), pl->recovery); + g_object_set(renderer, "background", + const_app("string_treeview_helper_color_player_injury"), NULL); + } + else + symbol = + treeview_helper_pixbuf_from_filename( + const_app("string_treeview_helper_player_status_injury")); + } + else if(ban > 0) { /* Red card info (how long the player is banned). */ - sprintf(buf, _("BAN(%d)"), ban); - g_object_set(renderer, "background", - const_app("string_treeview_helper_color_player_banned"), NULL); + if(!render_icon) + { + sprintf(buf, _("BAN(%d)"), ban); + g_object_set(renderer, "background", + const_app("string_treeview_helper_color_player_banned"), NULL); + } + else + symbol = + treeview_helper_pixbuf_from_filename( + const_app("string_treeview_helper_player_status_ban")); } else - /* Player status: ok. */ - strcpy(buf, _("OK")); + { + if(!render_icon) + strcpy(buf, "OK"); + else + { + if(ban == -1) + symbol = + treeview_helper_pixbuf_from_filename( + const_app("string_treeview_helper_player_status_yellow_danger")); + else if(pl->streak == PLAYER_STREAK_HOT) + symbol = + treeview_helper_pixbuf_from_filename( + const_app("string_treeview_helper_player_status_hot_streak")); + else if(pl->streak == PLAYER_STREAK_COLD) + symbol = + treeview_helper_pixbuf_from_filename( + const_app("string_treeview_helper_player_status_cold_streak")); + else + symbol = + treeview_helper_pixbuf_from_filename( + const_app("string_treeview_helper_player_status_ok")); + } + } - if(ban == -1) - g_object_set(renderer, "background", - const_app("string_treeview_helper_color_player_yellow_danger"), NULL); + if(render_icon) + { + g_object_set(renderer, "pixbuf", symbol, NULL); + treeview_helper_unref(G_OBJECT(symbol)); + } + else + g_object_set(renderer, "text", buf, NULL); } /** Render a cell of player games or goals. diff --git a/src/treeview_helper.h b/src/treeview_helper.h index bc447ec5..37211b15 100644 --- a/src/treeview_helper.h +++ b/src/treeview_helper.h @@ -107,7 +107,11 @@ void treeview_helper_player_cards_to_cell(gchar *buf, const Player *pl); void -treeview_helper_player_status_to_cell(GtkCellRenderer *renderer, gchar *buf, const Player *pl); +treeview_helper_player_status_to_cell(GtkTreeViewColumn *col, + GtkCellRenderer *renderer, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer user_data); void treeview_helper_player_games_goals_to_cell(gchar *buf, const Player *pl, gint type); @@ -143,6 +147,10 @@ treeview_helper_player_info_banned_to_cell(GtkCellRenderer *renderer, const GArr void treeview_helper_player_info_career_to_cell(GtkCellRenderer *renderer, const Player *pl); +void +treeview_helper_player_info_streak_to_cell(GtkCellRenderer *renderer, gint streak); + + gchar* treeview_helper_get_user_history_icon(gint history_type); diff --git a/src/window.c b/src/window.c index b18ebfe1..09bda697 100644 --- a/src/window.c +++ b/src/window.c @@ -24,21 +24,21 @@ #include "window.h" /** Show the window with the news. */ -void -window_show_news(void) -{ - GtkNotebook *nb = NULL; +/* void */ +/* window_show_news(void) */ +/* { */ +/* GtkNotebook *nb = NULL; */ - window_create(WINDOW_HELP); +/* window_create(WINDOW_HELP); */ - nb = GTK_NOTEBOOK(lookup_widget(window.help, "notebook1")); +/* nb = GTK_NOTEBOOK(lookup_widget(window.help, "notebook1")); */ - gtk_notebook_remove_page(nb, 0); - gtk_notebook_remove_page(nb, -1); +/* gtk_notebook_remove_page(nb, 0); */ +/* gtk_notebook_remove_page(nb, -1); */ - gtk_label_set_text(GTK_LABEL(lookup_widget(window.help, "label_contributors")), - _("News")); -} +/* gtk_label_set_text(GTK_LABEL(lookup_widget(window.help, "label_contributors")), */ +/* _("News")); */ +/* } */ /** Show the help/about window. @param page Which notebook page to display. */ @@ -166,16 +166,17 @@ window_show_file_sel(void) else { if(os_is_unix) - sprintf(buf, "%s%s%s%ssaves%s", home, G_DIR_SEPARATOR_S, - HOMEDIRNAME, G_DIR_SEPARATOR_S, G_DIR_SEPARATOR_S); + sprintf(buf, "%s%s%s%ssaves", home, G_DIR_SEPARATOR_S, + HOMEDIRNAME, G_DIR_SEPARATOR_S); else { gchar *pwd = g_get_current_dir(); - sprintf(buf, "%s%ssaves%s", pwd, G_DIR_SEPARATOR_S, G_DIR_SEPARATOR_S); + sprintf(buf, "%s%ssaves", pwd, G_DIR_SEPARATOR_S); g_free(pwd); } - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(window.file_chooser), buf); + gtk_file_chooser_set_current_folder( + GTK_FILE_CHOOSER(window.file_chooser), buf); } if(gtk_dialog_run(GTK_DIALOG(window.file_chooser)) == GTK_RESPONSE_OK) @@ -414,19 +415,94 @@ window_live_set_spinbuttons(void) { GtkSpinButton *sb_speed = GTK_SPIN_BUTTON(lookup_widget(window.live, "spinbutton_speed")); - - gtk_spin_button_set_range(sb_speed, 0, - -rint((gfloat)(const_int("int_game_gui_live_game_speed_max") - 10) / - (gfloat)(const_int("int_game_gui_live_game_speed_grad")))); + gfloat user_option = (gfloat)option_int("int_opt_user_live_game_speed", + &usr(stat2).options); + + gtk_spin_button_set_range( + sb_speed, 0, -rint((gfloat)(const_int("int_game_gui_live_game_speed_max") - 10) / + (gfloat)(const_int("int_game_gui_live_game_speed_grad")))); + + gtk_spin_button_set_value(sb_speed, user_option); - gtk_spin_button_set_value(sb_speed, - (gfloat)option_int("int_opt_user_live_game_speed", - &usr(stat2).options)); gtk_spin_button_set_value( GTK_SPIN_BUTTON(lookup_widget(window.live, "spinbutton_verbosity")), (gfloat)option_int("int_opt_user_live_game_verbosity", &usr(stat2).options)); } +/** Save main window size and position into a file.*/ +void +window_main_save_geometry(void) +{ + gchar filename[SMALL]; + const gchar *home = g_get_home_dir(); + gchar *pwd = g_get_current_dir(); + FILE *fil = NULL; + gint width, height, pos_x, pos_y, paned_pos; + + if(os_is_unix) + sprintf(filename, "%s%s%s%swindow_settings", + home, G_DIR_SEPARATOR_S, HOMEDIRNAME, G_DIR_SEPARATOR_S); + else + sprintf(filename, "%s%swindow_settings", + pwd, G_DIR_SEPARATOR_S); + + g_free(pwd); + + if(window.main != NULL && file_my_fopen(filename, "w", &fil, FALSE)) + { + gtk_window_get_size(GTK_WINDOW(window.main), &width, &height); + gtk_window_get_position(GTK_WINDOW(window.main), &pos_x, &pos_y); + paned_pos = gtk_paned_get_position( + GTK_PANED(lookup_widget(window.main, "hpaned2"))); + + fprintf(fil, "int_window_settings_width\t%d\n", width); + fprintf(fil, "int_window_settings_height\t%d\n", height); + fprintf(fil, "int_window_settings_pos_x\t%d\n", pos_x); + fprintf(fil, "int_window_settings_pos_y\t%d\n", pos_y); + fprintf(fil, "int_window_settings_paned_pos\t%d\n", paned_pos); + + fclose(fil); + } +} + +/** Set the main window geometry according to the file + settings. */ +void +window_main_load_geometry(void) +{ + gchar filename[SMALL]; + const gchar *home = g_get_home_dir(); + gchar *pwd = g_get_current_dir(); + OptionList optionlist; + + if(os_is_unix) + sprintf(filename, "%s%s%s%swindow_settings", + home, G_DIR_SEPARATOR_S, HOMEDIRNAME, G_DIR_SEPARATOR_S); + else + sprintf(filename, "%s%swindow_settings", + pwd, G_DIR_SEPARATOR_S); + + g_free(pwd); + + if(g_file_test(filename, G_FILE_TEST_EXISTS)) + { + optionlist.list = NULL; + optionlist.datalist = NULL; + file_load_opt_file(filename, &optionlist); + + gtk_window_resize(GTK_WINDOW(window.main), + option_int("int_window_settings_width", &optionlist), + option_int("int_window_settings_height", &optionlist)); + gtk_window_move(GTK_WINDOW(window.main), + option_int("int_window_settings_pos_x", &optionlist), + option_int("int_window_settings_pos_y", &optionlist)); + gtk_paned_set_position(GTK_PANED(lookup_widget(window.main, "hpaned2")), + option_int("int_window_settings_paned_pos", &optionlist)); + + free_option_list(&optionlist, FALSE); + } +} + /** Create and show a window. Which one depends on the argument. @param window_type An integer telling us which window to create. @@ -454,6 +530,7 @@ window_create(gint window_type) { window.main = create_main_window(); wind = window.main; + window_main_load_geometry(); game_gui_print_message(_("Welcome to Bygfoot %s"), VERS); sprintf(buf, "Bygfoot Football Manager %s", VERS); } diff --git a/src/window.h b/src/window.h index 1be206d6..f5f75fa5 100644 --- a/src/window.h +++ b/src/window.h @@ -75,4 +75,10 @@ window_show_news(void); void window_show_mmatches(void); +void +window_main_save_geometry(void); + +void +window_main_load_geometry(void); + #endif diff --git a/src/xml_loadsave_players.c b/src/xml_loadsave_players.c index bf8415f8..acd3da03 100644 --- a/src/xml_loadsave_players.c +++ b/src/xml_loadsave_players.c @@ -37,6 +37,9 @@ enum TAG_PLAYER_CARD_YELLOW, TAG_PLAYER_CARD_RED, TAG_PLAYER_CAREER, + TAG_PLAYER_STREAK, + TAG_PLAYER_STREAK_COUNT, + TAG_PLAYER_STREAK_PROB, TAG_END }; @@ -96,7 +99,10 @@ xml_loadsave_players_end_element(gint tag, GArray *players) tag == TAG_PLAYER_PARTICIPATION || tag == TAG_PLAYER_GAMES_GOAL || tag == TAG_PLAYER_CAREER || - tag == TAG_PLAYER_CARD) + tag == TAG_PLAYER_CARD || + tag == TAG_PLAYER_STREAK || + tag == TAG_PLAYER_STREAK_COUNT || + tag == TAG_PLAYER_STREAK_PROB) { state = TAG_PLAYER; if(tag == TAG_PLAYER_ETAL) @@ -187,6 +193,12 @@ xml_loadsave_players_text(gchar *text) new_card.red = int_value; else if(state == TAG_PLAYER_CAREER) new_player.career[careeridx] = int_value; + else if(state == TAG_PLAYER_STREAK) + new_player.streak = int_value; + else if(state == TAG_PLAYER_STREAK_COUNT) + new_player.streak_count = float_value; + else if(state == TAG_PLAYER_STREAK_PROB) + new_player.streak_prob = float_value; } void @@ -236,6 +248,10 @@ xml_loadsave_players_write_player(FILE *fil, const Player *pl) for(i=0;icareer[i], TAG_PLAYER_CAREER, I2); + xml_write_int(fil, pl->streak, TAG_PLAYER_STREAK, I2); + xml_write_float(fil, pl->streak_count, TAG_PLAYER_STREAK_COUNT, I2); + xml_write_float(fil, pl->streak_prob, TAG_PLAYER_STREAK_PROB, I2); + for(i=0;igames_goals->len;i++) { fprintf(fil, "%s<_%d>\n", I2, TAG_PLAYER_GAMES_GOAL); diff --git a/src/xml_loadsave_teams.h b/src/xml_loadsave_teams.h index 3a8b3418..1f08a1ca 100644 --- a/src/xml_loadsave_teams.h +++ b/src/xml_loadsave_teams.h @@ -35,7 +35,4 @@ xml_loadsave_teams_write(const gchar *filename, const GArray *teams); void xml_loadsave_teams_write_team(FILE *fil, const Team* team); -void -xml_loadsave_teams_write_player(FILE *fil, const Player *pl); - #endif diff --git a/src/xml_team.c b/src/xml_team.c index e2b1127d..0a262934 100644 --- a/src/xml_team.c +++ b/src/xml_team.c @@ -15,7 +15,7 @@ #define TAG_TEAM_NAME "team_name" #define TAG_STADIUM_NAME "stadium_name" #define TAG_SYMBOL "symbol" -#define TAG_AVERAGE_SKILL "average_skill" +#define TAG_AVERAGE_TALENT "average_talent" #define TAG_FORMATION "formation" #define TAG_NAMES_FILE "names_file" #define TAG_PLAYER "player" @@ -32,7 +32,7 @@ enum XmlTeamStates STATE_TEAM_NAME, STATE_STADIUM_NAME, STATE_SYMBOL, - STATE_AVERAGE_SKILL, + STATE_AVERAGE_TALENT, STATE_FORMATION, STATE_NAMES_FILE, STATE_PLAYER, @@ -47,7 +47,7 @@ enum XmlTeamStates gint state, birth_year; Player new_player; -gfloat average_skill; +gfloat average_talent; Team *team; const gchar *d_file; @@ -67,8 +67,8 @@ xml_team_read_start_element (GMarkupParseContext *context, state = STATE_STADIUM_NAME; else if(strcmp(element_name, TAG_SYMBOL) == 0) state = STATE_SYMBOL; - else if(strcmp(element_name, TAG_AVERAGE_SKILL) == 0) - state = STATE_AVERAGE_SKILL; + else if(strcmp(element_name, TAG_AVERAGE_TALENT) == 0) + state = STATE_AVERAGE_TALENT; else if(strcmp(element_name, TAG_FORMATION) == 0) state = STATE_FORMATION; else if(strcmp(element_name, TAG_NAMES_FILE) == 0) @@ -76,7 +76,7 @@ xml_team_read_start_element (GMarkupParseContext *context, else if(strcmp(element_name, TAG_PLAYER) == 0) { state = STATE_PLAYER; - new_player = player_new(team, average_skill, TRUE); + new_player = player_new(team, average_talent, TRUE); } else if(strcmp(element_name, TAG_PLAYER_NAME) == 0) state = STATE_PLAYER_NAME; @@ -111,7 +111,7 @@ xml_team_read_end_element (GMarkupParseContext *context, if(strcmp(element_name, TAG_TEAM_NAME) == 0 || strcmp(element_name, TAG_STADIUM_NAME) == 0 || strcmp(element_name, TAG_SYMBOL) == 0 || - strcmp(element_name, TAG_AVERAGE_SKILL) == 0 || + strcmp(element_name, TAG_AVERAGE_TALENT) == 0 || strcmp(element_name, TAG_FORMATION) == 0 || strcmp(element_name, TAG_NAMES_FILE) == 0 || strcmp(element_name, TAG_PLAYER) == 0) @@ -172,8 +172,8 @@ xml_team_read_text (GMarkupParseContext *context, } else if(state == STATE_SYMBOL) g_string_printf(team->symbol, "%s", buf); - else if(state == STATE_AVERAGE_SKILL && opt_int("int_opt_load_defs") == 1) - average_skill = int_value; + else if(state == STATE_AVERAGE_TALENT && opt_int("int_opt_load_defs") == 1) + average_talent = int_value; else if(state == STATE_FORMATION) team->structure = int_value; else if(state == STATE_PLAYER_NAME) @@ -229,6 +229,6 @@ xml_team_read(Team *tm, const gchar *def_file) misc_print_error(&error, TRUE); } - team_complete_def(tm, ((gfloat)average_skill / 10000) * + team_complete_def(tm, ((gfloat)average_talent / 10000) * const_float("float_player_max_skill")); } diff --git a/src/youth_academy.c b/src/youth_academy.c index 7b15475e..d4d52f3a 100644 --- a/src/youth_academy.c +++ b/src/youth_academy.c @@ -48,8 +48,8 @@ youth_academy_add_new_player(YouthAcademy *youth_academy) const_float("float_youth_academy_pos_midfielder"), const_float("float_youth_academy_pos_forward")}; gfloat rndom; - gfloat av_skill = team_get_average_skill(youth_academy->tm, FALSE); - gfloat percentage_coach_skill_factor; + gfloat av_talent = team_get_average_talent(youth_academy->tm); + gfloat percentage_coach_talent_factor; Player new; new.name = name_get(youth_academy->tm->names_file->str); @@ -84,35 +84,33 @@ youth_academy_add_new_player(YouthAcademy *youth_academy) (new.pos == PLAYER_POS_GOALIE) * const_float("float_player_peak_age_goalie_addition")); - /* Argument for the skill factor function, depending on average coach and + /* Argument for the talent factor function, depending on average coach and percentage values (weighted). */ - percentage_coach_skill_factor = (4 - youth_academy->av_coach) * + percentage_coach_talent_factor = (4 - youth_academy->av_coach) * (gfloat)const_int("int_youth_academy_max_percentage") * - const_float("float_youth_academy_coach_weight") * 0.25 + youth_academy->av_percentage; + const_float("float_youth_academy_coach_weight") * 0.25 + + youth_academy->av_percentage; - /* Applying the skill factor funtion leading to a factor between - float_youth_academy_skill_factor_lower and _upper */ - percentage_coach_skill_factor = - ((const_float("float_youth_academy_skill_factor_upper") - - const_float("float_youth_academy_skill_factor_lower")) / + /* Applying the talent factor funtion leading to a factor between + float_youth_academy_talent_factor_lower and _upper */ + percentage_coach_talent_factor = + ((const_float("float_youth_academy_talent_factor_upper") - + const_float("float_youth_academy_talent_factor_lower")) / ((gfloat)const_int("int_youth_academy_max_percentage") * (1 + const_float("float_youth_academy_coach_weight")))) * - percentage_coach_skill_factor + const_float("float_youth_academy_skill_factor_lower"); + percentage_coach_talent_factor + + const_float("float_youth_academy_talent_factor_lower"); - new.skill = math_gauss_dist( - percentage_coach_skill_factor * av_skill * (1 - const_float("float_youth_academy_skill_variance")), - percentage_coach_skill_factor * av_skill * (1 + const_float("float_youth_academy_skill_variance"))); + new.talent = math_gauss_dist( + percentage_coach_talent_factor * av_talent * + (1 - const_float("float_youth_academy_talent_variance")), + percentage_coach_talent_factor * av_talent * + (1 + const_float("float_youth_academy_talent_variance"))); - new.skill = CLAMP(new.skill, 0, const_float("float_player_max_skill")); - - new.talent = player_new_talent(new.skill); - player_estimate_talent(&new); - - /* Reduce skill depending on age. */ - new.skill *= powf(const_float("float_youth_academy_skill_reduce_factor"), - new.peak_age - new.age); - new.skill = CLAMP(new.skill, 0, const_float("float_player_max_skill")); + new.talent = CLAMP(new.talent, 0, const_float("float_player_max_skill")); + new.skill = player_skill_from_talent(&new); new.cskill = new.skill; + player_estimate_talent(&new); new.fitness = math_rnd(const_float("float_player_fitness_lower"), const_float("float_player_fitness_upper")); @@ -132,6 +130,9 @@ youth_academy_add_new_player(YouthAcademy *youth_academy) new.team = youth_academy->tm; new.participation = FALSE; new.offers = 0; + + new.streak = PLAYER_STREAK_NONE; + new.streak_count = new.streak_prob = 0; g_array_append_val(youth_academy->players, new); } diff --git a/support_files/bygfoot_app b/support_files/bygfoot_app index b8b8c10c..463fd7b5 100644 --- a/support_files/bygfoot_app +++ b/support_files/bygfoot_app @@ -213,3 +213,11 @@ string_treeview_helper_user_history_symbol_champion_icon champion.png string_treeview_table_up_icon table_up.png string_treeview_table_down_icon table_down.png string_treeview_table_stay_icon table_stay.png + +# player status icons +string_treeview_helper_player_status_hot_streak player_status_hot.png +string_treeview_helper_player_status_cold_streak player_status_cold.png +string_treeview_helper_player_status_injury player_status_injury.png +string_treeview_helper_player_status_ban player_status_ban.png +string_treeview_helper_player_status_ok +string_treeview_helper_player_status_yellow_danger player_status_yellow.png diff --git a/support_files/bygfoot_constants b/support_files/bygfoot_constants index 14a72f90..e271228f 100644 --- a/support_files/bygfoot_constants +++ b/support_files/bygfoot_constants @@ -767,22 +767,18 @@ float_youth_academy_youth_counter_upper 2500000 float_youth_academy_age_lower 1550000 float_youth_academy_age_upper 1750000 -# skill reduce factor (exponent is -# peak_age - age) -float_youth_academy_skill_reduce_factor 98800 - -# weight of the coach for the average skill +# weight of the coach for the average talent # between 0 and 1 float_youth_academy_coach_weight 25000 -# upper and lower factor values for average skill +# upper and lower factor values for average talent # (actual value depends on coach and percentage) -float_youth_academy_skill_factor_lower 67000 -float_youth_academy_skill_factor_upper 105000 +float_youth_academy_talent_factor_lower 67000 +float_youth_academy_talent_factor_upper 105000 -# youth skill variance (to have random -# skills, not always the same) -float_youth_academy_skill_variance 15000 +# youth talent variance (to have random +# talents, not always the same) +float_youth_academy_talent_variance 15000 # probabilities for the different positions # cumulative listing, adding up to 1 @@ -822,3 +818,56 @@ float_youth_lsu_addition_match 150000 # how many youths there may be at most in the YA int_youth_academy_max_youths 10 + +# influence of various events on the streak +# probabililty +float_player_streak_add_startup 5000 +float_player_streak_add_no_startup -3000 +float_player_streak_add_sub_in 3000 +float_player_streak_add_sub_out -2000 +float_player_streak_add_goal 12000 +float_player_streak_add_own_goal -15000 +float_player_streak_add_assist 5000 +float_player_streak_add_win 4000 +float_player_streak_add_loss -4000 +float_player_streak_add_goalie_save 2000 +float_player_streak_add_goalie_goal -3000 +float_player_streak_add_goalie_clean 6000 +float_player_streak_add_injury -18000 +float_player_streak_add_sendoff -12000 + +# influence of the streak on player values +# in percent +float_player_streak_influence_skill 7000 +float_player_streak_influence_fitness_decrease -20000 +float_player_streak_influence_fitness_increase 20000 + +# how many weeks there mustn't be an new streak +int_player_streak_count_lower 3 +int_player_streak_count_upper 6 + +# parameters (linear function) that determine how +# fast the streak count decreases depending on the +# current streak prob +float_player_streak_count_decrease_factor 75000 +float_player_streak_count_decrease_add 100000 + +# upper and lower bounds for streak lock length +# (ie. how many weeks a player may not go on a new +# streak) +int_player_streak_lock_length_lower 3 +int_player_streak_lock_length_upper 6 + +# upper and lower bounds for streak length +float_player_streak_length_lower 150000 +float_player_streak_length_upper 400000 + +# the two values determining the probability +# that a player goes on a streak +# maximum probabililty (when the player's streak_prob +# is 1 or -1) +float_player_streak_prob_max 40000 + +# probability at streak_prob=0 (this is >0 because +# the streak_prob is between -1 and 1, not 0 and 1) +float_player_streak_prob_zero 5000 diff --git a/support_files/pixmaps/player_status_ban.png b/support_files/pixmaps/player_status_ban.png new file mode 100644 index 0000000000000000000000000000000000000000..0789a5409470d256ed796846066d437e3cb06938 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^oFFy_8<4DKZ~;+lN#5=*4F5rJ!QSPQK}rfdB8wRq z_*6ldkw1)OB2X~H)5S4F;_}%uhJ4Ki0xlPChE}CasGi?1?J(K8fKgsB*ZFx(SBPMj z^Gto;?W!jO zK_Nh}4Zhnmb50+iTkB~_OB?)u-t*tv!8#FnH6lD(`F+_~>)A6;ECVa*K_f7M1kc<2 z>f*lbNgTvV)6wUa(EzGt8DS$wPvJdCkQC-)0lQLA@RAI7tcHvaQd$JDJ!(3M&1yWFkqWN48{jc-e zVj?J0?QV`wP8t*E4Ou6z!DS5-Qa57ghc{_tWj}~_&Xcq3O?s^kWyjC;5X>SK&@{q4 z)ZR5sJd5NcHC-)wsYP@sn8>BrGB#PKrRS~v>> z62)kkTFjhf|MXNmj_=M=5Z(MN-Mk1lY0sgs5Q7MY1s-q$?O4~fZH8q3t;&vs5oaFV zq^riq3npTK1D{dEmL7_ zaBOLAXDw!7V{~tFa{vH%+B2#!(lM+s)G@3u1OO3(0_g_C$|wK;002ovPDHLkV1k5r B9G3t9 literal 0 HcmV?d00001 diff --git a/support_files/pixmaps/player_status_hot.png b/support_files/pixmaps/player_status_hot.png new file mode 100644 index 0000000000000000000000000000000000000000..abba2715cd2bfc9748b04d634fbe9b21e4282a89 GIT binary patch literal 673 zcmV;S0$%-zP)2 zU?bBN<$_|vC8=2KcG^t))K(RgW(VC~E1gyY0lSlsEO1#pG|Cb+$qZj#EbwS@nV7t| zK~6KE2OJzQ)Z!LiB(VjwVo;s9B^?P9f*?ZdBBVA%evRUT8D70!q8RdWObNOPP0ym{ zljIHuKz4$w4B-fsiVv~&4dK+lkb?Lx&{rUxz+5eHr8j^Q@UtcE_A+AM<9d99ZLyC~ z1WtoWUUl=_XX5N;5|3&i1L(OOv~m@>0yKFkZ|?E&cZQd;Q6eiDNyRgaHEXo1653Lh z$DdZY?^79U^kUzI*t4Gur3=h^?09WX;(rUg9gA^eYMF6mI?k7OD}3(s6KVBvIa?t9 zB*s0>M9HtQqFTt6N=z#0g*pj^6T^Rm@;DWu&Cj&(|3p^r= z85sCfL70(0jAbHF@Uo|iV~E7%-ifxWm>dOK_WyLekmy*kaAVxjBPTAb)~Vw0PfSR7 zq{?GzaOH}JnByGH=ExH9+62eofY1w9O(q3+F`s>|-l`z#I!|E9(MLNm=Ju!`A=u!PRc3pY};u=a@NfyX~iKA$NbKPoG7(drbLe4PuNp~lbZdLS2oOdo8odmU9ETWm7JSglMY^TmUguHdfkidGs9iJ cdAl2#bL8#YD_iWA1MOk(boFyt=akR{06soG_y7O^ literal 0 HcmV?d00001