Made some progress; removed editor gui.

This commit is contained in:
gyboth 2005-03-03 12:46:48 +00:00
parent 4663d2312b
commit 7e07d74abd
80 changed files with 5124 additions and 4329 deletions

View File

@ -417,7 +417,7 @@ WARN_LOGFILE =
# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
INPUT = /home/gy/progs/bygfoot/1.9/src/
INPUT = /home/gy/progs/bygfoot/current-unstable/src/
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp

View File

@ -2,7 +2,9 @@
AM_CFLAGS = -Wall
SUBDIRS = src po b-u
SUBDIRS = src po
bin_SCRIPTS = bygfoot-update
EXTRA_DIST = \
autogen.sh \
@ -11,9 +13,9 @@ EXTRA_DIST = \
dist_man6_MANS = man/bygfoot.6
SUPPORT_DIRS = support_files support_files/pixmaps support_files/definitions support_files/names
SUPPORT_DIRS = support_files support_files/names support_files/pixmaps support_files/pixmaps/live_game support_files/definitions
SUPPORT_FILES = support_files/pixmaps/flag_ro.png support_files/pixmaps/bygfoot_team_editor_icon.png support_files/pixmaps/bygfoot_icon.png support_files/pixmaps/flag_eng.png support_files/pixmaps/pay_loan.png support_files/pixmaps/inc_cap.png support_files/pixmaps/new_week.png support_files/pixmaps/preview.png support_files/pixmaps/get_loan.png support_files/pixmaps/transfers.png support_files/pixmaps/fire_player.png support_files/pixmaps/inc_saf.png support_files/pixmaps/football.png support_files/pixmaps/flag_br.png support_files/pixmaps/flag_de.png support_files/pixmaps/fin_stad.png support_files/pixmaps/flag_es.png support_files/pixmaps/flag_fr.png support_files/pixmaps/flag_hu.png support_files/pixmaps/flag_it.png support_files/pixmaps/flag_mx.png support_files/pixmaps/flag_pl.png support_files/definitions/country_england.xml support_files/definitions/league_england1.xml support_files/definitions/league_england2.xml support_files/definitions/league_england3.xml support_files/definitions/league_england4.xml support_files/definitions/league_england5.xml support_files/definitions/cup_england_fa.xml support_files/definitions/cup_england_prom_games.xml support_files/definitions/cup_england_league.xml support_files/bygfoot.conf support_files/names/player_names
SUPPORT_FILES = support_files/names/player_names.xml support_files/bygfoot.conf support_files/pixmaps/flag_ro.png support_files/pixmaps/bygfoot_team_editor_icon.png support_files/pixmaps/bygfoot_icon.png support_files/pixmaps/pay_loan.png support_files/pixmaps/inc_cap.png support_files/pixmaps/new_week.png support_files/pixmaps/preview.png support_files/pixmaps/get_loan.png support_files/pixmaps/transfers.png support_files/pixmaps/fire_player.png support_files/pixmaps/inc_saf.png support_files/pixmaps/football.png support_files/pixmaps/flag_br.png support_files/pixmaps/flag_de.png support_files/pixmaps/fin_stad.png support_files/pixmaps/flag_en.png support_files/pixmaps/flag_es.png support_files/pixmaps/flag_fr.png support_files/pixmaps/possession_ball.png support_files/pixmaps/flag_hu.png support_files/pixmaps/live_game/yellow.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/flag_it.png support_files/pixmaps/flag_mx.png support_files/pixmaps/flag_pl.png support_files/definitions/league_turkey1_short.xml support_files/definitions/league_italy1_short.xml support_files/definitions/league_germany1_short.xml support_files/definitions/country_england.xml support_files/definitions/league_russia1_short.xml support_files/definitions/league_scotland1_short.xml support_files/definitions/league_england1.xml support_files/definitions/league_england2.xml support_files/definitions/league_england3.xml support_files/definitions/league_england4.xml support_files/definitions/league_england5.xml support_files/definitions/league_greece1_short.xml support_files/definitions/league_denmark1_short.xml support_files/definitions/cup_england_fa.xml support_files/definitions/cup_champ_league.xml support_files/definitions/league_ukraine1_short.xml support_files/definitions/league_switzerland1_short.xml support_files/definitions/cup_cwc.xml support_files/definitions/league_netherlands1_short.xml support_files/definitions/league_europe_div.xml support_files/definitions/league_czech1_short.xml support_files/definitions/cup_england_prom_games.xml support_files/definitions/league_portugal1_short.xml support_files/definitions/league_spain1_short.xml support_files/definitions/cup_uefa.xml support_files/definitions/cup_england_league.xml support_files/definitions/league_belgium1_short.xml support_files/definitions/league_france1_short.xml
install-data-local:
@$(NORMAL_INSTALL)

793
bygfoot-update Executable file
View File

@ -0,0 +1,793 @@
#!/bin/bash
####################################################
# Bygfoot Football Manager #
# AUTHOR: Gyozo Both (gyboth@bygfoot.com) #
# http://www.bygfoot.com #
####################################################
# Skript that updates src packages of the Bygfoot Football Manager
# using wget to retrieve patches from the homepage
# version number
version="0.13"
# the bygfoot release version the script is shipped with
relversion=VERSION
# the current release version on the server
packversion=
# exit codes
EXITOK=0
EXITNOPROG=1
EXITNOREV=2
EXITABORT=3
EXITWGETFAIL=4
EXITUSR=6
EXITNEWSCRIPT=7
EXITCOUNTRY=8
EXITPACKFORMAT=9
EXITDEBIAN=10
# variables
# a variable we sometimes read something into
tempvar=
# the directory containing the Bygfoot src package
packdir=
# a directory we can write to and read from
tmpdir=
# destination for the country files
countrydir=
# the Bygfoot package type, stable or unstable
type_stable=stable
type_unstable=unstable
type=
# the current revision number of the user's package
revnr=
# revision numbers fetched from the homepage
newrevnr=
# number of new revisions found
found=0
# the arguments for the script
args="$*"
# the package format the user wants to download
format_rpm=.i586.rpm
format_bin=-binary.tar.bz2
format_src=.tar.bz2
format_srpm=.src.rpm
format_deb=-1_i386.deb
format=
# which cvs version to get
cvs_version1=bygfoot-unstable
cvs_version2=bygfoot2-unstable
cvs_version=
# SourceForge.Net username (for cvs checkout)
cvs_user=
# The file we redirect dialog output to
input_file=$PWD/bygfoot-update-dialog.tmp
# The file containing all output
log_file=$PWD/bygfoot-update.log
# options
# whether all new patches should be applied automatically
apply_all=0
# whether we should skip some queries and assume standard values
auto=0
# whether we recompile automatically after patching
recompile=0
# whether we check for auxiliary programs and
# newer update script versions
check=1
# whether we just fetch the latest version number from
# the server
get_version=0
# whether we show the log file before terminating
# if so, the file doesn't get deleted by cleanup()
show_log=0
# operation modes
# source update
mode_src=0
# country file download
mode_country=1
# package download
mode_pack=2
# get cvs version
mode_cvs=3
mode=
# print a help text
function print_help()
{
cat <<END
Usage: bygfoot-update [OPTIONS]
Note: You can call bygfoot-update without any options.
MAIN OPTIONS:
-c|--country-files Download country files with official team names
and team definitions file
-n|--new-package Download the latest complete package
-u|--update Update your Bygfoot source package using patches
-b|--cvs Get CVS version
AUXILIARY OPTIONS:
Global:
-A|--auto Assume [y] for all prompts
-h|--help Print help and exit
-l|--show-log Don't clear the log file before exiting;
show its contents instead.
-t|--temp-dir DIR Set temp directory to DIR
-v|--version Print version information and exit
Relevant for source update mode:
-a|--apply-all Apply all new patches without prompting
-p|--package-dir DIR Set source package directory to DIR
-r|--recompile Run './configure && make' after updating
-R|--no-recompile Don't recompile after updating
Relevant for country files mode:
-C|--country-dir DIR Set destination directory for the
country files and def file to DIR
Relevant for package download mode:
-f|--format FORMAT Set package format to FORMAT:
'src', 'rpm', 'srpm', 'bin' or 'deb.
Note that 'deb' isn't allowed for unstable
packages.
-t|--temp-dir DIR Set download destination directory
to DIR (same as temp directory)
-T|--type TYPE Download latest TYPE package, TYPE
being either 'stable' or 'unstable'.
-V|--get-version Fetch version number of the latest
release from the server and exit.
Relevant for CVS mode:
-B|--branch BRANCH Which CVS branch to get; currently 1 or 2
for the 1.8 or 1.9 branch.
-U|--username NAME Your SourceForge.Net username used for
checking out, or A for anonymous checkout.
END
}
# print program version
function print_version()
{
cat <<END
bygfoot-update: A bash script keeping your Bygfoot Football Manager up-to-date.
Version $version.
See the file UPDATE for some more information.
Call bygfoot-update -h|--help for usage information.
END
}
# print output to stdout and the log file
function my_echo()
{
echo "$@" 2>> $log_file | tee -a $log_file
}
# show log file before exiting if the option is set
function my_exit()
{
if [ $show_log -eq 1 ]; then
if [ -r $log_file ]; then
dialog --title "Bygfoot Online Update" --textbox $log_file 22 75
else
echo "** WARNING: log file $log_file not readable."
fi
fi
cleanup
exit $1
}
# parse arguments
function parse_args()
{
TEMP=`getopt -o aAbcB:C:f:hlnNp:rRt:T:uU:vV --long apply-all,\
auto,branch:,country-files,country-dir:,cvs,format:,help,new-package,no-check,\
package-dir:,recompile,no-recompile,show-log,temp-dir:,type:,update,username:\
version,get-version -- $*`
if [ $? != 0 ]; then
my_echo "** b-u: There was an error parsing the arguments."
my_echo "** b-u: The arguments will be ignored."
return
fi
eval set -- "$TEMP"
while true; do
case "$1" in
-a|--apply-all) apply_all=1; shift ;;
-A|--auto) auto=1; apply_all=1; shift ;;
-b|--cvs) mode=$mode_cvs; shift ;;
-B|--branch) set_branch $2; shift 2 ;;
-c|--country-files) mode=$mode_country; shift ;;
-C|--country-dir) pushd $2 &> /dev/null; countrydir=$PWD; popd &> /dev/null; shift 2 ;;
-f|--format) set_format $2; shift 2 ;;
-h|--help) print_help; exit $EXITOK ;;
-l|--show-log) show_log=1; shift ;;
-n|--new-package) mode=$mode_pack; shift ;;
-N|--no-check) check=0; shift ;;
-p|--package-dir) pushd $2 &> /dev/null; packdir=$PWD; popd &> /dev/null; shift 2 ;;
-r|--recompile) recompile=1; shift ;;
-R|--no-recompile) recompile=-1; shift ;;
-t|--temp-dir) pushd $2 &> /dev/null; tmpdir=$PWD; popd &> /dev/null; shift 2 ;;
-T|--type) type=$2; shift 2 ;;
-u|--update) mode=$mode_src; shift ;;
-U|--username) cvs_user=$2; shift 2 ;;
-v|--version) print_version; exit $EXITOK ;;
-V|--get-version) mode=$mode_pack; get_version=1; shift ;;
--) shift; break ;;
esac
done
}
# clean up in the temp dir
function cleanup()
{
my_echo
my_echo "** b-u: Removing dialog output file $input_file."
rm -rfv $input_file 2>> $log_file | tee -a $log_file
if [ ! -z $tmpdir -a $mode -neq $mode_pack ];then
my_echo "** b-u: Cleaning up in the temp directory."
rm -rfv 2>> $log_file | tee -a $log_file
fi
if [ $show_log -eq 0 ]; then
my_echo "** b-u: Removing log file $log_file."
rm -rfv $log_file
fi
}
# wget something, exit if it doesn't work
function my_wget()
{
if ! wget -v $1 2>> $log_file | tee -a $log_file; then
my_echo
my_echo "** b-u: wget failure."
my_exit $EXITWGETFAIL
fi
}
# check for the programs needed
function check_progs()
{
if [ $check -eq 0 ]; then
return
fi
my_echo
for i in sed tar bzip2 wget patch cvs; do
my_echo -n "** b-u: checking for $i... "
if which $i &> /dev/null; then
my_echo "ok"
else
my_echo "failed"
my_echo
my_echo "** WARNING: Didn't find working $i, maybe it's not in your PATH."
my_echo "** WARNING: You might not be able to use all bygfoot-update features."
read a
fi
done
}
function read_input()
{
if [ $? -eq 1 ];then
my_echo "** b-u: User abort."
my_exit $EXITUSR
fi
if [ -r $input_file ]; then
tempvar=$(cat $input_file)
else
tempvar=
fi
my_echo "** b-u: User input: $tempvar"
my_echo
}
# get country files with official team names
function get_country_files()
{
my_echo
my_echo "** b-u: Fetching country files with official team names and"
my_echo "** b-u: team definitions file."
pushd $countrydir &>/dev/null
my_wget http://bygfoot.sourceforge.net/revisions/bygfoot-countries.tar.bz2
for i in country_* teams; do
mv -vf $i $i.old 2>> $log_file | tee -a $log_file
done
tar xfjv bygfoot-countries.tar.bz2 2>> $log_file | tee -a $log_file
rm -vf bygfoot-countries.tar.bz2 2>> $log_file | tee -a $log_file
popd
my_echo "** b-u: done."
my_exit $EXITCOUNTRY
}
# get the paths for a temp directory and
# the location of the user's bygfoot src package
function get_paths()
{
if [ $mode -eq $mode_src ]; then
if [ -z $packdir ]; then
if [ $auto -eq 0 ]; then
dialog --title "Bygfoot Online Update" \
--inputbox "Source package directory" 22 80 $PWD 2> $input_file
read_input
pushd $tempvar; packdir=$PWD; popd
else
packdir=$PWD
fi
my_echo
my_echo "** b-u: Package dir set to"
my_echo "** b-u: $packdir"
fi
fi
if [ $mode -ne $mode_country ]; then
if [ -z $tmpdir ]; then
if [ $auto -eq 0 ]; then
dialog --title "Bygfoot Online Update" --inputbox "Temporary directory\n(you need read/write permissions there)" \
22 80 /tmp 2> $input_file
read_input
if [ ! -z $tempvar ]; then
pushd $tempvar &> /dev/null ; tmpdir=$PWD; popd &> /dev/null
else
tmpdir=/tmp
fi
else
tmpdir=/tmp
fi
my_echo
my_echo "** b-u: Temp dir set to"
my_echo "** b-u: $tmpdir"
fi
fi
if [ $mode -eq $mode_country ]; then
if [ -z $countrydir ]; then
if [ $auto -eq 0 ]; then
dialog --title "Bygfoot Online Update" --inputbox "Country files destination directory\n(default destination recommmended)" \
22 80 $HOME/.bygfoot/text_files 2> $input_file
read_input
if [ ! -z $tempvar ]; then
pushd $tempvar; countrydir=$PWD; popd
else
countrydir=$HOME/.bygfoot/text_files
fi
else
countrydir=$HOME/.bygfoot/text_files
fi
my_echo
my_echo "** b-u: Country dir set to"
my_echo "** b-u: $countrydir"
fi
fi
}
# find out revision number and type
function get_rev_type()
{
echo
if [ ! -e $packdir/revision_number ]; then
dialog --title "Bygfoot Online Update" --msgbox \
"I couldn't find the file containing your current revision number and type ($packdir/revision_number).\nFailure." \
22 80 2> $input_file
read_input
my_exit $EXITNOREV
fi
type=$(cat $packdir/revision_number | sed s/[0-9]*//g)
revnr=$(cat $packdir/revision_number | sed s/[a-z]*//g)
my_echo "** b-u: Your current revision is: $type $revnr."
}
function apply_rev()
{
my_echo
my_echo "** b-u: Applying patch revision_$type$newrevnr"
cd $packdir
if [ -e $newrevdir/prepatch ]; then
$newrevdir/prepatch 2>> $log_file | tee -a $log_file
fi
patch -p1 < $newrevdir/patch* 2>> $log_file | tee -a $log_file
if [ -e $newrevdir/postpatch ]; then
$newrevdir/postpatch 2>> $log_file | tee -a $log_file
fi
cd $tmpdir/bygfoot-update
}
# fetch a revision archive from the homepage and
# patch the src package
function get_revision()
{
local newrevdir=$tmpdir/bygfoot-update/revision_$type$newrevnr
my_echo
my_echo "** b-u: Retrieving revision_$type$newrevnr.tar.bz2."
my_wget http://bygfoot.sourceforge.net/revisions/$type/revision_$type$newrevnr.tar.bz2
mkdir $newrevdir
cd $newrevdir
tar xfjv ../revision_$type$newrevnr.tar.bz2 2>> $log_file | tee -a $log_file
dialog --title "Bygfoot Online Update" --textbox README 22 75
if [ $apply_all -eq 0 ]; then
dialog --title "Bygfoot Online Update" --menu \
"Apply patch?\n(You can't apply newer ones if you don't apply this one because they depend on each other.)" \
22 80 10 \
1 Yes \
2 No \
3 All 2> $input_file
read_input
if [ ! -z $tempvar ]; then
if [ $tempvar -eq 3 ]; then
apply_all=1
elif [ $tempvar -ne 1 ]; then
my_echo
my_echo "** b-u: User abort."
my_exit $EXITUSR
fi
fi
fi
apply_rev
}
# look for new revisions
function get_revs()
{
my_echo
cd $tmpdir
my_echo "** b-u: Cleaning up old update directories and creating a new one..."
rm -rfv bygfoot-update 2>> $log_file | tee -a $log_file
mkdir -v bygfoot-update 2>> $log_file | tee -a $log_file
cd bygfoot-update
my_echo
my_echo "** b-u: Fetching revision list..."
my_wget http://bygfoot.sourceforge.net/revisions/$type/revisions_$type
for i in $(cat revisions_$type); do
my_echo
newrevnr=$(echo $i | sed s/'[a-z_]*\([0-9]*\).*'/'\1'/g)
if [ $newrevnr -gt $revnr ]; then
found=$[found + 1]
get_revision
else
my_echo "** b-u: $i is older than your revision..."
fi
done
}
# clean up etc.
function update_end()
{
my_echo
if [ $found -ge 1 ]; then
dialog --title "Bygfoot Online Update" --msgbox "$found new revisions found.\nYour new revision number should be $[revnr + found].\nHave a look at the files README, ChangeLog and ReleaseNotes to see the changes that were made." 2> $input_file
if [ $recompile -eq 0 -a $auto -eq 0 ]; then
dialog --title "Bygfoot Online Update" --yesno "Would you like me to execute 'configure && make' ?" 22 80 2> $input_file
read_input
fi
if [ $recompile -ne -1 ]; then
cd $packdir
./configure && make 2>> $log_file | tee -a $log_file
fi
else
dialog --title "Bygfoot Online Update" --msgbox "No new revisions found.\nYour package seems to be up-to-date." 22 80 2> $input_file
fi
my_echo
my_echo "** b-u: done."
my_exit $EXITOK
}
# set package format from a command line option
function set_format()
{
if [ $1 = "rpm" ]; then
format=$format_rpm
elif [ $1 = "srpm" ]; then
format=$format_srpm
elif [ $1 = "src" ]; then
format=$format_src
elif [ $1 = "bin" ]; then
format=$format_bin
elif [ $1 = "deb" ]; then
format=$format_deb
else
my_echo "** b-u: Unrecognized package format: $1"
my_echo "** b-u: Failure."
my_exit $EXITPACKFORMAT
fi
}
# set cvs branch from command line option
function set_branch()
{
if [ $1 -eq 1 ]; then
cvs_version=$cvs_version1;
else
cvs_version=$cvs_version2;
fi
}
# ask for the package type (stable/unstable)
function get_type()
{
if [ ! -z $type ]; then
return
fi
if [ $auto -ne 1 ];then
dialog --title "Bygfoot Online Update" --menu "Specify package type" \
22 80 10 \
1 "Stable" \
2 "Unstable" 2> $input_file
read_input
if [ $tempvar -eq 2 ]; then
type=$type_unstable
else
type=$type_stable
fi
else
type=$type_stable
fi
}
# get package format the user wants to download
function get_format()
{
if [ -z $format ]; then
if [ $auto -ne 1 -a $get_version -ne 1 ]; then
dialog --title "Bygfoot Online Update" --menu "Specify package format" \
22 80 10 \
1 "RPM" \
2 "Binary" \
3 "Source" \
4 "Debian" \
5 "Source RPM" 2> $input_file
read_input
if [ $tempvar -eq 2 ]; then
format=$format_bin
elif [ $tempvar -eq 3 ]; then
format=$format_src
elif [ $tempvar -eq 4 ]; then
format=$format_deb
elif [ $tempvar -eq 5 ]; then
format=$format_srpm
else
format=$format_rpm
fi
else
format=$format_rpm
fi
fi
if [ "$type" = "$type_unstable" -a "$format" = "$format_deb" ]; then
dialog --title "Bygfoot Online Update" --msgbox \
"There are no unstable packages for Debian. Sorry.\nFailure." 22 80 2> $input_file
my_exit $EXITDEBIAN
fi
}
function get_latest_version()
{
my_echo
my_echo "** b-u: Fetching version number of the latest $type release."
pushd $tmpdir &> /dev/null
rm -rfv bygfoot-update 2>> $log_file | tee -a $log_file
mkdir bygfoot-update
cd bygfoot-update
my_wget http://bygfoot.sourceforge.net/packages/$type/version
packversion=$(cat version)
if [ $get_version -eq 1 ]; then
my_exit $EXITOK
fi
if [ $auto -eq 1 ]; then
return
fi
dialog --title "Bygfoot Online Update" --yesno "Latest $type version is $packversion.\nYour version (as far as i know) is $relversion.\nDo you want me to download the package?" 22 80 2> $input_file
read_input
}
function get_new_package()
{
local separator=-
local file=
if [ $format = $format_rpm -o $format = $format_srpm ]; then
packversion=$(echo $packversion | sed s/'\([0-9]*\.[0-9]*\)\(\.\)\([0-9]*\)'/'\1-\3'/g)
fi
if [ $format = $format_deb ]; then
separator=_
fi
file=bygfoot$separator$packversion$format
my_wget http://bygfoot.sourceforge.net/packages/$type/$file
dialog --title "Bygfoot Online Update" --msgbox "You can find the package $file\nin the directory $PWD." \
22 80 2> $input_file
my_echo "** b-u: Done."
my_exit $EXITOK
}
# download a bygfoot package
function get_package()
{
get_type
get_format
get_latest_version
get_new_package
}
function get_mode()
{
if [ ! -z $mode ]; then
return
fi
if [ $auto -eq 1 ]; then
mode=$mode_src
return
fi
dialog --title "Bygfoot Online Update" --menu "Main Menu" 22 80 10 \
1 " Update your Bygfoot source package using patches" \
2 " Download the latest Bygfoot release" \
3 " Get country file package with official team names" \
4 " Get CVS version (2+ MB 'cause it's not compressed)" 2> $input_file
read_input
if [ -z $tempvar ]; then
mode=$mode_src
return
fi
if [ $tempvar -eq 2 ]; then
mode=$mode_pack
elif [ $tempvar -eq 3 ]; then
mode=$mode_country
elif [ $tempvar -eq 4 ]; then
mode=$mode_cvs
else
mode=$mode_src
fi
}
function get_cvs()
{
if [ -z $cvs_version ];then
dialog --title "Bygfoot Online Update" --menu "Specify CVS version" 22 80 10 \
1 " 1.8 branch" \
2 " 1.9 branch" 2> $input_file
read_input
if [ $tempvar -eq 2 ]; then
cvs_version=$cvs_version2
else
cvs_version=$cvs_version1
fi
fi
if [ -z $cvs_user ];then
dialog --title "Bygfoot Online Update" --inputbox "If you'd like to check out as a developer, enter your\nSourceForge.net username. Press RETURN to download anonymously." 22 80 2> $input_file
read_input
if [ -z $tempvar ]; then
cvs_command="cvs -d:pserver:anonymous@cvs.sf.net:/cvsroot/bygfoot"
else
cvs_command="cvs -d:ext:$tempvar@cvs.sf.net:/cvsroot/bygfoot"
fi
else
if [ $cvs_user = "A" ]; then
cvs_command="cvs -d:pserver:anonymous@cvs.sf.net:/cvsroot/bygfoot"
else
cvs_command="cvs -d:ext:$cvs_user@cvs.sf.net:/cvsroot/bygfoot"
fi
fi
cd $tmpdir
$cvs_command checkout $cvs_version 2>> $log_file | tee -a $log_file
if [ $recompile -eq 0 -a $auto -eq 0 ]; then
dialog --title "Bygfoot Online Update" \
--yesno "Would you like me to execute 'autogen.sh && make' ?" 22 80 2> $input_file
read_input
fi
if [ $recompile -ne -1 ]; then
cd $cvs_version
./autogen.sh && make 2>> $log_file | tee -a $log_file
fi
my_exit $EXITOK
}
parse_args $*
print_version
echo "Bygfoot Online Update $version log file" > $log_file
echo "Don't forget to remove this file if you don't need it anymore." >> $log_file
check_progs
get_mode
get_paths
# what to do when user presses Ctrl-C
trap 'my_echo; my_echo "** b-u: User abort." & my_exit $EXITABORT' 2
if [ $mode -eq $mode_country ]; then
get_country_files
elif [ $mode -eq $mode_pack ]; then
get_package
elif [ $mode -eq $mode_cvs ]; then
get_cvs
else
get_rev_type
get_revs
update_end
fi

File diff suppressed because it is too large Load Diff

View File

@ -71,124 +71,6 @@
</packing>
</child>
<child>
<widget class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="label" translatable="yes">Start in</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.05</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkEventBox" id="eventbox1">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Play normal league games and cups</property>
<property name="visible_window">True</property>
<property name="above_child">False</property>
<child>
<widget class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkRadioButton" id="team_selection_radio1">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Top league</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="team_selection_radio2">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Current league</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">True</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<property name="group">team_selection_radio1</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="team_selection_radio3">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Bottom league</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<property name="group">team_selection_radio1</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
<packing>
<property name="padding">5</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkHSeparator" id="hseparator11">
<property name="width_request">1</property>
<property name="height_request">10</property>
<property name="visible">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox34">
<property name="visible">True</property>
@ -363,6 +245,124 @@
</packing>
</child>
<child>
<widget class="GtkHSeparator" id="hseparator11">
<property name="width_request">1</property>
<property name="height_request">10</property>
<property name="visible">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="label" translatable="yes">Start in</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.05</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkEventBox" id="eventbox1">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Play normal league games and cups</property>
<property name="visible_window">True</property>
<property name="above_child">False</property>
<child>
<widget class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkRadioButton" id="team_selection_radio1">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Top league</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="team_selection_radio2">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Current league</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">True</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<property name="group">team_selection_radio1</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkRadioButton" id="team_selection_radio3">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Bottom league</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<property name="group">team_selection_radio1</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
<packing>
<property name="padding">5</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkHSeparator" id="hseparator12">
<property name="width_request">1</property>
@ -377,114 +377,63 @@
</child>
<child>
<widget class="GtkHBox" id="hbox46">
<widget class="GtkHBox" id="hbox54">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<property name="spacing">5</property>
<child>
<widget class="GtkVBox" id="vbox35">
<widget class="GtkLabel" id="label75">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkCheckButton" id="checkbutton_no_def">
<property name="border_width">2</property>
<property name="visible">True</property>
<property name="tooltip" translatable="yes">If you check this, the game generates all players randomly and won't read the file with team definitions</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Don't load team definitions</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_checkbutton_load_randomly_toggled" last_modification_time="Tue, 11 May 2004 15:35:43 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="checkbutton_only_names">
<property name="border_width">2</property>
<property name="visible">True</property>
<property name="tooltip" translatable="yes">If you check this, only the player names and the team structures are loaded from the definition file, values like skill or age are generated randomly</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Load only names from team definition file</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_checkbutton_only_names_toggled" last_modification_time="Thu, 20 May 2004 08:45:07 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkCheckButton" id="checkbutton_load_my_team">
<property name="border_width">2</property>
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Check this if you'd like to have your team loaded from the definitions file no matter what the other checkbuttons say.</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Load my team from definitions file</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<property name="active">True</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<property name="label" translatable="yes">Player name</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkEntry" id="entry_player_name">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">12</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char" translatable="yes">*</property>
<property name="activates_default">False</property>
<property name="width_chars">12</property>
<signal name="activate" handler="on_entry_player_name_activate" last_modification_time="Sat, 26 Feb 2005 10:40:03 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkVSeparator" id="vseparator18">
<property name="width_request">10</property>
<property name="height_request">1</property>
<widget class="GtkButton" id="button_add_player">
<property name="visible">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button_start_editor">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="tooltip" translatable="yes">You can start the editor from the commandline with 'bygfoot -e' or '--editor'</property>
<property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_button_start_editor_clicked" last_modification_time="Fri, 14 May 2004 12:55:57 GMT"/>
<signal name="clicked" handler="on_button_add_player_clicked" last_modification_time="Fri, 25 Feb 2005 16:22:19 GMT"/>
<child>
<widget class="GtkAlignment" id="alignment15">
<widget class="GtkAlignment" id="alignment19">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
@ -496,15 +445,15 @@
<property name="right_padding">0</property>
<child>
<widget class="GtkHBox" id="hbox47">
<widget class="GtkHBox" id="hbox55">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">2</property>
<child>
<widget class="GtkImage" id="image55">
<widget class="GtkImage" id="image59">
<property name="visible">True</property>
<property name="stock">gtk-preferences</property>
<property name="stock">gtk-add</property>
<property name="icon_size">4</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
@ -519,9 +468,9 @@
</child>
<child>
<widget class="GtkLabel" id="label71">
<widget class="GtkLabel" id="label76">
<property name="visible">True</property>
<property name="label" translatable="yes">Start Bygfoot Team Editor</property>
<property name="label" translatable="yes">Add player</property>
<property name="use_underline">True</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
@ -545,8 +494,8 @@
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
@ -557,6 +506,19 @@
</packing>
</child>
<child>
<widget class="GtkHSeparator" id="hseparator13">
<property name="width_request">1</property>
<property name="height_request">10</property>
<property name="visible">True</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox3">
<property name="visible">True</property>
@ -567,15 +529,16 @@
<widget class="GtkButton" id="team_selection_ok">
<property name="border_width">2</property>
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Return</property>
<property name="sensitive">False</property>
<property name="tooltip" translatable="yes">Space</property>
<property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_team_selection_ok_clicked" last_modification_time="Tue, 27 Jan 2004 17:27:11 GMT"/>
<accelerator key="Return" modifiers="0" signal="clicked"/>
<signal name="clicked" handler="on_team_selection_ok_clicked" last_modification_time="Fri, 25 Feb 2005 16:22:55 GMT"/>
<accelerator key="space" modifiers="0" signal="clicked"/>
<child>
<widget class="GtkAlignment" id="alignment1">
<widget class="GtkAlignment" id="alignment18">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
@ -587,13 +550,13 @@
<property name="right_padding">0</property>
<child>
<widget class="GtkHBox" id="hbox4">
<widget class="GtkHBox" id="hbox53">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">2</property>
<child>
<widget class="GtkImage" id="image2">
<widget class="GtkImage" id="image58">
<property name="visible">True</property>
<property name="stock">gtk-apply</property>
<property name="icon_size">4</property>
@ -610,9 +573,9 @@
</child>
<child>
<widget class="GtkLabel" id="label1">
<widget class="GtkLabel" id="label74">
<property name="visible">True</property>
<property name="label" translatable="yes">OK</property>
<property name="label" translatable="yes">Start</property>
<property name="use_underline">True</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
@ -1936,4 +1899,45 @@
</child>
</widget>
<widget class="GtkWindow" id="window_startup_users">
<property name="visible">True</property>
<property name="title" translatable="yes">Players</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">False</property>
<property name="default_width">250</property>
<property name="default_height">200</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
<property name="gravity">GDK_GRAVITY_NORTH_EAST</property>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow10">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
<property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<widget class="GtkTreeView" id="treeview_users">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Click on a player to remove him</property>
<property name="can_focus">True</property>
<property name="headers_visible">True</property>
<property name="rules_hint">False</property>
<property name="reorderable">False</property>
<property name="enable_search">True</property>
<signal name="button_press_event" handler="on_treeview_users_button_press_event" last_modification_time="Fri, 25 Feb 2005 19:29:22 GMT"/>
</widget>
</child>
</widget>
</child>
</widget>
</glade-interface>

View File

@ -12,21 +12,23 @@ AC_HEADER_STDC
pkg_modules="gtk+-2.0 >= 2.0.0"
PKG_CHECK_MODULES(PACKAGE, [$pkg_modules])
PKG_CHECK_MODULES(GNET, gnet-2.0 > 2.0.0,
[LIBS="$LIBS $GNET_LIBS" CFLAGS="$CFLAGS $GNET_CFLAGS"],
AC_MSG_ERROR(Cannot find GNet: Is gnet-config in path?))
AC_SUBST(PACKAGE_CFLAGS)
AC_SUBST(PACKAGE_LIBS)
GETTEXT_PACKAGE=bygfoot
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE")
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package.])
dnl Add the languages which your application supports here.
ALL_LINGUAS="fr de ru ro hu pt_BR"
ALL_LINGUAS=""
AM_GLIB_GNU_GETTEXT
AC_OUTPUT([
Makefile
src/Makefile
b-u/Makefile
po/Makefile.in
])

View File

@ -12,9 +12,6 @@ bygfoot_SOURCES = \
callback_func.c callback_func.h \
callbacks.c callbacks.h \
cup.c cup.h free.h maths.h misc.h team.h variables.h xml_league.h \
editor_callback_func.c editor_callback_func.h \
editor_callbacks.c editor_callbacks.h \
editor_interface.c editor_interface.h \
file.c file.h free.h misc.h support.h \
finance.c finance.h \
fixture.c cup.h fixture.h league_struct.h main.h maths.h misc.h team.h variables.h \
@ -43,11 +40,12 @@ bygfoot_SOURCES = \
player.c free.h league.h maths.h player.h team.h variables.h \
start_end.c cup.h fixture.h league.h maths.h player.h start_end.h team.h transfer.h variables.h xml_name.h \
support.c support.h \
table.c table.h \
team.c cup.h free.h league.h maths.h player.h team.h variables.h \
transfer.c transfer.h \
treeview.c gui.h league.h support.h team.h treeview.h variables.h \
treeview_cell.c treeview_cell.h \
user.c team.h user.h \
user.c team.h user.h user_struct.h \
window.c misc_interface.h file.h free.h support.h window.h \
xml_cup.c cup.h file.h misc.h variables.h xml_cup.h \
xml_country.c file.h free.h league.h misc.h variables.h xml_cup.h xml_country.h xml_league.h \

View File

@ -24,6 +24,33 @@
#define SMALL 10000
#define BIG 1000000
/** Starting numbers of league, cup and supercup numerical ids. */
#define ID_LEAGUE_START 1000
#define ID_CUP_START 2000
/** The player names file. */
#define PLAYER_NAMES_FILE "player_names.xml"
/** Convenience abbreviation. */
#define ligs country.leagues
/** Convenience abbreviation. */
#define lig(i) g_array_index(country.leagues, League, i)
/** Convenience abbreviation. */
#define cps country.cups
/** Convenience abbreviation. */
#define cp(i) g_array_index(country.cups, Cup, i)
/** Convenience abbreviation. */
#define player_name(i) ((GString*)g_ptr_array_index(player_names, i))->str;
/** Convenience abbrevs. */
#define stat0 status[0]
#define stat1 status[1]
#define stat2 status[2]
#define stat3 status[3]
#define stat4 status[4]
/**
* Exit codes.
*/
@ -39,23 +66,6 @@ enum ExitCodes
EXIT_END
};
/** Scout and physio qualities. */
enum Quality
{
QUALITY_BEST = 1,
QUALITY_GOOD,
QUALITY_AVERAGE,
QUALITY_BAD,
QUALITY_END
};
/** Starting numbers of league, cup and supercup numerical ids. */
#define ID_LEAGUE_START 1000
#define ID_CUP_START 2000
/** The player names file. */
#define PLAYER_NAMES_FILE "player_names.xml"
/**
* A struct representing a country.
*/
@ -69,17 +79,21 @@ typedef struct
GArray *leagues, *cups;
} Country;
/** Convenience abbreviation. */
#define ligs country.leagues
/** Convenience abbreviation. */
#define lig(i) g_array_index(country.leagues, League, i)
/** Struct used for having all the windows
in one place. */
typedef struct
{
GtkWidget *main,
*startup,
*startup_users,
*live;
} Windows;
/** Convenience abbreviation. */
#define cps country.cups
/** Convenience abbreviation. */
#define cp(i) g_array_index(country.cups, Cup, i)
/** Convenience abbreviation. */
#define player_name(i) ((GString*)g_ptr_array_index(player_names, i))->str;
/** A struct representing an option or a constant. */
typedef struct
{
GString *name, *string_value;
gint value;
} Option;
#endif

View File

@ -0,0 +1,88 @@
#include "callback_func.h"
#include "cup.h"
#include "fixture.h"
#include "game_gui.h"
#include "league.h"
#include "live_game.h"
#include "option.h"
#include "player.h"
#include "start_end.h"
#include "team.h"
#include "treeview.h"
#include "user.h"
#include "variables.h"
#include "window.h"
/** Show the users' live games. */
void
callback_show_next_live_game(void)
{
gint i, j;
if(week_round == 1)
{
for(i=0;i<ligs->len;i++)
for(j=0;j<lig(i).fixtures->len;j++)
if(g_array_index(lig(i).fixtures, Fixture, j).week_number == week &&
g_array_index(lig(i).fixtures, Fixture, j).week_round_number == week_round &&
fixture_user_team_involved(&g_array_index(lig(i).fixtures, Fixture, j)) != -1 &&
g_array_index(lig(i).fixtures, Fixture, j).attendance == -1)
{
live_game_calculate_fixture(&g_array_index(lig(i).fixtures, Fixture, j));
return;
}
}
else
{
for(i=0;i<cps->len;i++)
for(j=0;j<cp(i).fixtures->len;j++)
if(g_array_index(cp(i).fixtures, Fixture, j).week_number == week &&
g_array_index(cp(i).fixtures, Fixture, j).week_round_number == week_round &&
fixture_user_team_involved(&g_array_index(cp(i).fixtures, Fixture, j)) &&
g_array_index(cp(i).fixtures, Fixture, j).attendance == -1)
{
live_game_calculate_fixture(&g_array_index(cp(i).fixtures, Fixture, j));
return;
}
}
window_destroy(&window.live);
/* no more user games to show: end round. */
end_week_round();
stat0 = STATUS_MAIN;
}
/** Handle a click on the player list.
@param idx The player number.
@param event The type of button click. */
void
callback_player_clicked(gint idx, GdkEventButton *event)
{
/** Only accept single-clicks right now. */
if(event->type != GDK_BUTTON_PRESS)
return;
if(event->button == 1)
{
if(selected_row[0] == -1)
{
selected_row[0] = idx;
return;
}
player_swap(usr(current_user).tm, selected_row[0],
usr(current_user).tm, idx);
if(opt_user_int("int_opt_user_swap_adapts") == 1)
{
team_change_structure(usr(current_user).tm,
team_find_appropriate_structure(usr(current_user).tm));
team_rearrange(usr(current_user).tm);
}
game_gui_write_av_skills();
selected_row[0] = -1;
treeview_show_user_player_list(&usr(current_user), 1);
}
}

View File

@ -0,0 +1,12 @@
#ifndef CALLBACK_FUNC_H
#define CALLBACK_FUNC_H
#include "bygfoot.h"
void
callback_show_next_live_game(void);
void
callback_player_clicked(gint idx, GdkEventButton *event);
#endif

View File

@ -1,12 +1,7 @@
#include "callbacks.h"
/*d*/
#include "game.h"
#include "live_game.h"
#include "maths.h"
#include "player.h"
#include "team.h"
#include "gui.h"
#include "callback_func.h"
#include "enums.h"
#include "game_gui.h"
#include "main.h"
#include "treeview.h"
#include "variables.h"
@ -146,29 +141,8 @@ void
on_button_new_week_clicked (GtkButton *button,
gpointer user_data)
{
/*d*/
gint i, j, k;
Fixture *fix;/* = &g_array_index(lig(0).fixtures, Fixture, */
/* math_rndi(0, lig(0).fixtures->len - 1)); */
for(k=0;k<lig(0).fixtures->len;k++)
if(g_array_index(lig(0).fixtures, Fixture, k).week_number == week &&
g_array_index(lig(0).fixtures, Fixture, k).week_round_number == 1)
{
fix = &g_array_index(lig(0).fixtures, Fixture, k);
printf("\n");
for(j=0;j<2;j++)
{
printf("%s structure %d style %d av. cskill %.1f\n",
fix->teams[j]->name->str, fix->teams[j]->structure,
fix->teams[j]->style, team_average_cskill(fix->teams[j]));
}
live_game_calculate_fixture(fix);
}
week++;
stat0 = STATUS_SHOW_LIVE_GAME;
callback_show_next_live_game();
}
@ -179,13 +153,26 @@ on_button_help_clicked (GtkButton *button,
}
gboolean
on_player_list_button_press_event (GtkWidget *widget,
on_player_list1_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
{
gint idx = -1;
return FALSE;
treeview_select_row(GTK_TREE_VIEW(widget), event);
idx = treeview_get_index(GTK_TREE_VIEW(widget), 0);
if(idx < 0)
{
selected_row[0] = -1;
return FALSE;
}
callback_player_clicked(idx - 1, event);
return FALSE;
}
@ -325,103 +312,6 @@ on_menu_fixtures_activate (GtkMenuItem *menuitem,
}
void
on_menu_league1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_league2_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_league3_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_league4_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_league5_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_league6_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_cup_1_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_cup2_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_cup3_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_cup4_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_cup5_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_cup6_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_tables_activate (GtkMenuItem *menuitem,
gpointer user_data)
@ -446,14 +336,6 @@ on_menu_season_history_activate (GtkMenuItem *menuitem,
}
void
on_menu_team_history_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_player_activate (GtkMenuItem *menuitem,
gpointer user_data)
@ -470,14 +352,6 @@ on_menu_show_info_activate (GtkMenuItem *menuitem,
}
void
on_menu_show_history_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_put_on_transfer_list_activate (GtkMenuItem *menuitem,
gpointer user_data)
@ -614,14 +488,6 @@ on_menu_physio_bad_activate (GtkMenuItem *menuitem,
}
void
on_menu_boost_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_my_league_results_activate (GtkMenuItem *menuitem,
gpointer user_data)
@ -635,11 +501,11 @@ on_menu_browse_teams_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
GtkWidget *treeview_right =
lookup_widget(main_window, "treeview_right");
lookup_widget(window.main, "treeview_right");
treeview_show_team_list(GTK_TREE_VIEW(treeview_right), TRUE);
treeview_show_team_list(GTK_TREE_VIEW(treeview_right), TRUE, TRUE);
status = STATUS_BROWSE_TEAMS;
stat0 = STATUS_BROWSE_TEAMS;
}
@ -692,3 +558,59 @@ on_menu_pay_loan_activate (GtkMenuItem *menuitem,
}
void
on_menu_next_user_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
current_user = (current_user + 1) % users->len;
stat0 = STATUS_MAIN;
game_gui_show_main();
}
void
on_menu_previous_user_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
current_user = (current_user == 0) ? users->len - 1 : current_user - 1;
stat0 = STATUS_MAIN;
game_gui_show_main();
}
void
on_menu_show_user_list_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
void
on_menu_custom_structure_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}
gboolean
on_menu_team_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
{
game_gui_read_radio_items(widget);
return FALSE;
}
void
on_menu_manage_users_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
}

View File

@ -2,7 +2,6 @@
#define CALLBACKS_H
#include "bygfoot.h"
#include "interface.h"
#include "support.h"
@ -79,11 +78,6 @@ void
on_button_help_clicked (GtkButton *button,
gpointer user_data);
gboolean
on_player_list_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data);
void
on_structure_entry_activate (GtkEntry *entry,
gpointer user_data);
@ -152,54 +146,6 @@ void
on_menu_fixtures_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_league1_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_league2_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_league3_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_league4_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_league5_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_league6_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_cup_1_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_cup2_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_cup3_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_cup4_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_cup5_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_cup6_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_tables_activate (GtkMenuItem *menuitem,
gpointer user_data);
@ -212,10 +158,6 @@ void
on_menu_season_history_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_team_history_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_player_activate (GtkMenuItem *menuitem,
gpointer user_data);
@ -224,10 +166,6 @@ void
on_menu_show_info_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_show_history_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_put_on_transfer_list_activate (GtkMenuItem *menuitem,
gpointer user_data);
@ -297,10 +235,6 @@ void
on_menu_physio_bad_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_boost_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_my_league_results_activate (GtkMenuItem *menuitem,
gpointer user_data);
@ -314,8 +248,6 @@ gboolean
on_treeview_right_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data);
#endif
void
on_menu_finances_stadium_activate (GtkMenuItem *menuitem,
gpointer user_data);
@ -335,3 +267,34 @@ on_menu_get_loan_activate (GtkMenuItem *menuitem,
void
on_menu_pay_loan_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_next_user_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_previous_user_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_show_user_list_activate (GtkMenuItem *menuitem,
gpointer user_data);
void
on_menu_custom_structure_activate (GtkMenuItem *menuitem,
gpointer user_data);
gboolean
on_player_list1_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data);
gboolean
on_menu_team_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data);
#endif
void
on_menu_manage_users_activate (GtkMenuItem *menuitem,
gpointer user_data);

View File

@ -230,8 +230,9 @@ cup_load_choose_team_user(Cup *cup)
for(i = choose_team->start_idx - 1; i <= choose_team->end_idx - 1; i++)
{
if(!query_is_in_international_cups(&g_array_index(lig(number - 1).teams,
Team, permutation[i - choose_team->start_idx + 1])))
if(!query_is_in_international_cups(
&g_array_index(lig(number - 1).teams,
Team, permutation[i - choose_team->start_idx + 1])))
{
g_ptr_array_add(cup->user_teams,
(gpointer)&g_array_index(lig(number - 1).teams,
@ -305,7 +306,8 @@ cup_get_matchdays_in_cup_round(const Cup *cup, gint cup_round)
{
number_of_teams = cup_round_get_number_of_teams(cup, cup_round);
number_of_matchdays =
2 * (number_of_teams / g_array_index(cup->rounds, CupRound, cup_round).round_robin_number_of_groups - 1);
2 * (number_of_teams / g_array_index(cup->rounds, CupRound, cup_round).
round_robin_number_of_groups);
}
else if(g_array_index(cup->rounds, CupRound, cup_round).home_away)
number_of_matchdays = 2;
@ -353,3 +355,19 @@ cup_get_team_pointers(const Cup *cup)
return teams;
}
/** Return the cup pointer belonging to the id.
@param clid The id we look for.
@return The cup pointer or NULL if failed. */
Cup*
cup_from_clid(gint clid)
{
gint i;
for(i=0;i<cps->len;i++)
if(cp(i).id == clid)
return &cp(i);
g_warning("cup_from_clid: didn't find cup with id %d\n", clid);
return NULL;
}

View File

@ -37,4 +37,7 @@ cup_get_matchdays_in_cup_round(const Cup *cup, gint cup_round);
gint
cup_round_get_number_of_teams(const Cup *cup, gint cup_round);
Cup*
cup_from_clid(gint clid);
#endif

View File

@ -1,175 +0,0 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <gtk/gtk.h>
#include "editor_callbacks.h"
#include "editor_interface.h"
#include "support.h"
gboolean
on_button_exit_clicked (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
{
return FALSE;
}
void
on_button_choose_def_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_entry_country_file_changed (GtkEditable *editable,
gpointer user_data)
{
}
void
on_button_browse_team_files_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_entry_team_changed (GtkEditable *editable,
gpointer user_data)
{
}
void
on_button_change_structures_clicked (GtkEntry *entry,
gpointer user_data)
{
}
void
on_spinbutton_average_skill_value_changed
(GtkSpinButton *spinbutton,
gpointer user_data)
{
}
gboolean
on_treeview_players_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
{
return FALSE;
}
void
on_button_update_clicked (GtkEntry *entry,
gpointer user_data)
{
}
void
on_button_prev_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_button_next_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_button_swap_clicked (GtkEntry *entry,
gpointer user_data)
{
}
void
on_button_up_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_button_down_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_button_editor_help_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_button_save_defs_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_button_import_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_button_export_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_button_play_ws_clicked (GtkButton *button,
gpointer user_data)
{
}
void
on_button_save_play_clicked (GtkButton *button,
gpointer user_data)
{
}

View File

@ -1,85 +0,0 @@
#include <gtk/gtk.h>
gboolean
on_button_exit_clicked (GtkWidget *widget,
GdkEvent *event,
gpointer user_data);
void
on_button_choose_def_clicked (GtkButton *button,
gpointer user_data);
void
on_entry_country_file_changed (GtkEditable *editable,
gpointer user_data);
void
on_button_browse_team_files_clicked (GtkButton *button,
gpointer user_data);
void
on_entry_team_changed (GtkEditable *editable,
gpointer user_data);
void
on_button_change_structures_clicked (GtkEntry *entry,
gpointer user_data);
void
on_spinbutton_average_skill_value_changed
(GtkSpinButton *spinbutton,
gpointer user_data);
gboolean
on_treeview_players_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data);
void
on_button_update_clicked (GtkEntry *entry,
gpointer user_data);
void
on_button_prev_clicked (GtkButton *button,
gpointer user_data);
void
on_button_next_clicked (GtkButton *button,
gpointer user_data);
void
on_button_swap_clicked (GtkEntry *entry,
gpointer user_data);
void
on_button_up_clicked (GtkButton *button,
gpointer user_data);
void
on_button_down_clicked (GtkButton *button,
gpointer user_data);
void
on_button_editor_help_clicked (GtkButton *button,
gpointer user_data);
void
on_button_save_defs_clicked (GtkButton *button,
gpointer user_data);
void
on_button_import_clicked (GtkButton *button,
gpointer user_data);
void
on_button_export_clicked (GtkButton *button,
gpointer user_data);
void
on_button_play_ws_clicked (GtkButton *button,
gpointer user_data);
void
on_button_save_play_clicked (GtkButton *button,
gpointer user_data);

View File

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +0,0 @@
/*
* DO NOT EDIT THIS FILE - it is generated by Glade.
*/
GtkWidget* create_editor_window (void);

View File

@ -1,6 +1,16 @@
#ifndef ENUMS_H
#define ENUMS_H
/** Scout and physio qualities. */
enum Quality
{
QUALITY_BEST = 0,
QUALITY_GOOD,
QUALITY_AVERAGE,
QUALITY_BAD,
QUALITY_END
};
/** Indices for the #finances variable. */
enum FinanceValue
{
@ -19,7 +29,7 @@ enum FinanceValue
FIN_END
};
/** Indices for the #counters variable. */
/** Indices for the counters variable in #User. */
enum CounterValue
{
COUNT_LOAN = 0, /** How many weeks until user has to pay back his loan. */
@ -39,50 +49,19 @@ enum CounterValue
COUNT_END
};
/** Indices for the #options variable. */
enum OptionValue
/** Possible values for a status variable. */
enum Status0Value
{
OPT_BOOL_CONF_NEW_ROUND = 0, /**< Whether beginning of a new week round has to be confirmed. */
OPT_BOOL_CONF_UNFIT, /**< Unfit player confirmation. */
OPT_BOOL_CONF_QUIT, /**< Quit confirmation. */
OPT_BOOL_OVERWRITE, /**< Clicking on save overwrites current save game. */
OPT_BOOL_SHOW_LIVE, /**< Whether live game is shown. */
OPT_LIVE_SPEED, /**< Live game speed. */
OPT_BOOL_LIVE_TENDENCY, /**< Tendency bar. */
OPT_BOOL_MAXIMIZE, /**< Whether to start maximized. */
OPT_BOOL_NOTIFY, /**< Whether transfer list notification is on. */
OPT_NOTIFY_POS, /**< Whether we look for a certain position. */
OPT_NOTIFY_LEAGUE_UPPER, /**< League with lowest index for notification. */
OPT_NOTIFY_LEAGUE_LOWER, /**< League with highest index for notification. */
OPT_BOOL_NOTIFY_CUPS, /**< Notify when player from international cups. */
OPT_NOTIFY_AGE_UPPER, /**< Upper age bound. */
OPT_NOTIFY_AGE_LOWER, /**< Lower age bound. */
OPT_NOTIFY_SKILL_UPPER, /**< Skill bound. */
OPT_NOTIFY_SKILL_LOWER, /**< Skill bound. */
OPT_NOTIFY_ETAL_UPPER, /**< Etal bound. */
OPT_NOTIFY_ETAL_LOWER, /**< Etal bound. */
OPT_NOTIFY_VALUE, /**< Upper value bound. */
OPT_BOOL_JOBS, /**< Whether job offers are shown. */
OPT_MESS, /**< Message style. */
OPT_BOOL_PREFER_MESS, /**< Messages instead of popups when possible. */
OPT_BOOL_AUTOSAVE, /**< Whether autosave is on. */
OPT_AUTOSAVE_INTERVAL, /**< How often to autosave. */
OPT_BOOL_SORT_TRANSFERS, /**< Whether to sort transfers. */
OPT_SORT_TRANSFERS_ATTRIBUTE, /**< Which attribute to sort. */
OPT_BOOL_SORT_TRANSFERS_DESCENDING, /**< Whether we sort descending. */
OPT_BOOL_REARRANGE, /**< Whether the players get sorted when a new structure is given. */
OPT_BOOL_SWAP, /**< Whether the players get sorted when two players are swapped. */
OPT_HISTORY_TEAM_INTERVAL, /**< Interval of team history update. */
OPT_HISTORY_PLAYER_INTERVAL, /**< Interval of player history update. */
OPT_HISTORY_TEAM_MAX, /**< Maximum length of team history. */
OPT_HISTORY_PLAYER_MAX, /**< Maximum length of player history. */
OPT_BOOL_HISTORY_TEAM_DELETE, /**< Whether team histories get deleted each new season. */
OPT_BOOL_HISTORY_PLAYER_DELETE, /**< Whether player histories get deleted each new season. */
OPT_BOOL_BOOST, /**< Whether player boost is on. */
OPT_BOOL_COMPRESS, /**< Whether to zip-compress savegames. */
OPT_BOOL_OBJECTIVE, /**< Whether season objective is on. */
OPT_PENALTY_SHOOTER, /**< The id of the penalty shooter. */
OPT_END
STATUS_NONE = 0,
STATUS_MAIN,
STATUS_SHOW_LIVE_GAME,
STATUS_LIVE_GAME_PAUSE,
STATUS_BROWSE_TEAMS,
STATUS_TEAM_SELECTION,
/** We set this so that we know that
gui signals have to be ignored for the time being. */
STATUS_GUI_NO_REACTION,
STATUS_END
};
#endif

View File

@ -2,7 +2,9 @@
#include "free.h"
#include "main.h"
#include "misc.h"
#include "option.h"
#include "support.h"
#include "user.h"
#include "variables.h"
/**
@ -196,191 +198,118 @@ file_get_definitions_dir(gchar *dir)
}
/** Read the file until the next line that's not a comment or
a blank line and copy the line into buf.
@param fil The file stream.
@param buf The buffer we fill.
@return TRUE if the file still contains lines to read, FALSE otherwise. */
a blank line. Split the line into the part before and after
the first white space and copy them into the char arrays.
Trailing and leading white spaces and trailing comments are stripped.
@param fil The file stream.
@param opt_name The first char array (an option name, mostly).
@param opt_value The second array (an option value, mostly).
@return TRUE if the file still contains lines to read, FALSE otherwise. */
gboolean
file_get_next_line(FILE *fil, gchar *buf)
file_get_next_opt_line(FILE *fil, gchar *opt_name, gchar *opt_value)
{
gchar local_buf[BIG];
gint i;
gchar trash[SMALL];
gchar buf[BIG];
strcpy(local_buf, "");
strcpy(buf, "");
while( (local_buf[0] == '#' || strlen(local_buf) == 0) &&
while( (buf[0] == '#' || strlen(buf) == 0) &&
feof(fil) == 0)
{
fscanf(fil, "%[\n \t]*", local_buf);
fscanf(fil, "%[^\n]", local_buf);
fscanf(fil, "%[\n \t]*", buf);
fscanf(fil, "%[^\n]", buf);
}
if(local_buf[0] != '#' && strlen(local_buf) != 0)
if(buf[0] != '#' && strlen(buf) != 0)
{
if(strlen(local_buf) > 100)
if(strlen(buf) > 100)
g_warning("\n the text file I'm reading contains a line longer than 100 chars.\n\n");
if(buf != NULL)
strcpy(buf, local_buf);
for(i=0;i<strlen(buf);i++)
if(buf[i] == '#')
{
buf[i] = '\0';
break;
}
for(i=strlen(buf) - 1;i>0;i--)
if(buf[i] == '\t' || buf[i] == ' ')
buf[i] = '\0';
else
break;
sscanf(buf, "%[^ ]%[ ]%[^\n]", opt_name, trash, opt_value);
}
return (feof(fil) == 0);
}
/** Supply the strings in the config file that belong to the options.
@param opt_names The array we write the optionstrings into.
@param player_list_att_names The array we write the player list attribute strings into. */
/** Load a file containing name - value pairs into
the specified array. */
void
file_write_opt_names(gchar opt_names[][50], gchar player_list_att_names[][PLAYER_LIST_ATTRIBUTE_END][50])
file_load_opt_file(FILE *fil, GArray **option_array)
{
gint i, j;
gchar opt_name[SMALL], opt_value[SMALL];
Option new;
strcpy(opt_names[OPT_BOOL_CONF_NEW_ROUND], "confirm_new_week_round");
strcpy(opt_names[OPT_BOOL_CONF_UNFIT], "confirm_unfit");
strcpy(opt_names[OPT_BOOL_CONF_QUIT], "confirm_quit");
strcpy(opt_names[OPT_BOOL_OVERWRITE], "save_will_ovewrite");
strcpy(opt_names[OPT_BOOL_SHOW_LIVE], "show_live_game");
strcpy(opt_names[OPT_LIVE_SPEED], "live_game_speed");
strcpy(opt_names[OPT_BOOL_LIVE_TENDENCY], "show_tendency_bar");
strcpy(opt_names[OPT_BOOL_MAXIMIZE], "maximize_main_window");
free_option_array(option_array, TRUE);
strcpy(opt_names[OPT_BOOL_NOTIFY], "notify_transfer");
strcpy(opt_names[OPT_NOTIFY_POS], "notify_pos");
strcpy(opt_names[OPT_NOTIFY_LEAGUE_UPPER], "notify_league_upper");
strcpy(opt_names[OPT_NOTIFY_LEAGUE_LOWER], "notify_league_lower");
strcpy(opt_names[OPT_BOOL_NOTIFY_CUPS], "notify_cups");
strcpy(opt_names[OPT_NOTIFY_AGE_UPPER], "notify_age_upper");
strcpy(opt_names[OPT_NOTIFY_AGE_LOWER], "notify_age_lower");
strcpy(opt_names[OPT_NOTIFY_SKILL_UPPER], "notify_skill_upper");
strcpy(opt_names[OPT_NOTIFY_SKILL_LOWER], "notify_skill_lower");
strcpy(opt_names[OPT_NOTIFY_ETAL_UPPER], "notify_etal_upper");
strcpy(opt_names[OPT_NOTIFY_ETAL_LOWER], "notify_etal_lower");
strcpy(opt_names[OPT_NOTIFY_VALUE], "notify_value");
strcpy(opt_names[OPT_BOOL_JOBS], "show_job_offers");
strcpy(opt_names[OPT_MESS], "message_style");
strcpy(opt_names[OPT_BOOL_PREFER_MESS], "prefer_messages");
strcpy(opt_names[OPT_BOOL_AUTOSAVE], "autosave");
strcpy(opt_names[OPT_AUTOSAVE_INTERVAL], "autosave_interval");
strcpy(opt_names[OPT_BOOL_SORT_TRANSFERS], "sort_transfer_list");
strcpy(opt_names[OPT_SORT_TRANSFERS_ATTRIBUTE], "sort_transfer_attribute");
strcpy(opt_names[OPT_BOOL_REARRANGE], "reaarrange_adapts");
strcpy(opt_names[OPT_BOOL_SWAP], "swap_adapts");
strcpy(opt_names[OPT_HISTORY_TEAM_INTERVAL], "history_team_interval");
strcpy(opt_names[OPT_HISTORY_PLAYER_INTERVAL], "history_player_interval");
strcpy(opt_names[OPT_HISTORY_TEAM_MAX], "history_team_max");
strcpy(opt_names[OPT_HISTORY_PLAYER_MAX], "history_player_max");
strcpy(opt_names[OPT_BOOL_HISTORY_TEAM_DELETE], "history_team_delete");
strcpy(opt_names[OPT_BOOL_HISTORY_PLAYER_DELETE], "history_player_delete");
strcpy(opt_names[OPT_BOOL_BOOST], "boost");
strcpy(opt_names[OPT_BOOL_COMPRESS], "compress");
strcpy(opt_names[OPT_BOOL_OBJECTIVE], "objective");
strcpy(opt_names[OPT_PENALTY_SHOOTER], "penalty_shooter");
for(i=0;i<2;i++)
while(file_get_next_opt_line(fil, opt_name, opt_value))
{
for(j=0;j<PLAYER_LIST_ATTRIBUTE_END;j++)
sprintf(player_list_att_names[i][j], "pl%d_att_", i + 1);
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_NAME], "name");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_CPOS], "cpos");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_POS], "pos");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_CSKILL], "cskill");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_SKILL], "skill");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_FITNESS], "fitness");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_GAMES], "games");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_GOALS], "goals");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_STATUS], "status");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_CARDS], "cards");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_AGE], "age");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_ETAL], "etal");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_VALUE], "value");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_WAGE], "wage");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_CONTRACT], "contract");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_TEAM], "team");
strcat(player_list_att_names[i][PLAYER_LIST_ATTRIBUTE_LEAGUE_CUP], "league_cup");
}
}
/** Load the options at the beginning of a new game from
the configuration file. */
void
file_load_conf_file(void)
{
gint i, j;
gchar opt_names[OPT_END][50];
gchar player_list_attribute_names[2][PLAYER_LIST_ATTRIBUTE_END][50];
FILE *fil;
gchar *conf_file = file_find_support_file("bygfoot.conf");
gchar buf[SMALL];
gchar buf2[SMALL];
gchar trash[SMALL];
file_my_fopen(conf_file, "r", &fil, TRUE);
g_free(conf_file);
file_write_opt_names(opt_names, player_list_attribute_names);
while(file_get_next_line(fil, buf))
{
for(i=0;i<OPT_END;i++)
if(strncmp(opt_names[i], buf, strlen(opt_names[i])) == 0)
sscanf(buf, "%[^-0-9 ]%d", trash, &options[i]);
for(j=0;j<2;j++)
for(i=0;i<PLAYER_LIST_ATTRIBUTE_END;i++)
if(strncmp(player_list_attribute_names[j][i], buf, strlen(player_list_attribute_names[j][i])) == 0)
sscanf(buf, "%[^ ]%[ ]%d", trash, buf2,
&player_list_attributes[j].on_off[i]);
if(strncmp(buf, "font_name", strlen("font_name")) == 0)
new.name = g_string_new(opt_name);
if(g_str_has_prefix(opt_name, "string_"))
{
sscanf(buf, "%[font_name ]%[^\n]", trash, buf2);
g_string_printf(font_name, "%s", buf2);
new.string_value = g_string_new(opt_value);
new.value = -1;
}
else
{
new.string_value = NULL;
sscanf(opt_value, "%d", &new.value);
}
if(strncmp(buf, "debug", strlen("debug")) == 0)
sscanf(buf, "%[debug ]%d", trash, &debug);
g_array_append_val(*option_array, new);
}
}
/** Save the current options to the configuration file. */
void
file_save_conf(void)
{
gint i, j;
gchar opt_names[OPT_END][50];
gchar player_list_att_names[2][PLAYER_LIST_ATTRIBUTE_END][50];
FILE *fil = NULL;
gchar *conf_file = file_find_support_file("bygfoot.conf");
if(!file_my_fopen(conf_file, "w", &fil, FALSE))
return;
g_free(conf_file);
file_write_opt_names(opt_names, player_list_att_names);
for(i=0;i<OPT_PENALTY_SHOOTER;i++)
fprintf(fil, "%s %d\n", opt_names[i], options[i]);
fprintf(fil, "%s -1\n", opt_names[OPT_PENALTY_SHOOTER]);
for(j=0;j<2;j++)
{
fprintf(fil, "\n");
for(i=0;i<PLAYER_LIST_ATTRIBUTE_END;i++)
fprintf(fil, "%s %d\n", player_list_att_names[j][i],
player_list_attributes[j].on_off[i]);
}
fprintf(fil, "\n");
fprintf(fil, "font_name %s\n", font_name->str);
fprintf(fil, "debug %d\n", debug);
fclose(fil);
}
/** Load the options at the beginning of a new game from
the configuration files. */
void
file_load_conf_files(void)
{
FILE *fil = NULL;
gchar *conf_file = file_find_support_file("bygfoot.conf");
file_my_fopen(conf_file, "r", &fil, TRUE);
g_free(conf_file);
file_load_opt_file(fil, &options);
file_my_fopen(opt_str("string_opt_constants_file"), "r", &fil, TRUE);
file_load_opt_file(fil, &constants);
}
/** Load a user-specific conf file.
@param user The user we load the file for. */
void
file_load_user_conf_file(User *user)
{
FILE *fil = NULL;
gchar *conf_file = NULL, buf[SMALL];
sprintf(buf, "bygfoot_%s.conf", user->name->str);
conf_file = file_find_support_file(buf);
if(conf_file == NULL ||
!file_my_fopen(conf_file, "r", &fil, FALSE))
{
g_free(conf_file);
conf_file = file_find_support_file(opt_str("string_opt_default_user_conf_file"));
file_my_fopen(conf_file, "r", &fil, TRUE);
}
file_load_opt_file(fil, &user->options);
}

View File

@ -3,6 +3,7 @@
#include "bygfoot.h"
#include "player_struct.h"
#include "user_struct.h"
void
file_add_support_directory_recursive (const gchar *directory);
@ -11,7 +12,7 @@ gchar*
file_find_support_file (const gchar *filename);
gboolean
file_get_next_line(FILE *fil, gchar *buf);
file_get_next_opt_line(FILE *fil, gchar *opt_name, gchar *opt_value);
GPtrArray*
file_dir_get_contents(const gchar *dir_name, const gchar *prefix);
@ -26,12 +27,22 @@ void
file_get_definitions_dir(gchar *dir);
void
file_write_opt_names(gchar opt_names[][50], gchar player_list_att_names[][PLAYER_LIST_ATTRIBUTE_END][50]);
file_write_opt_names(gchar opt_names[][50], gchar conf_file_names[][100]);
void
file_load_conf_file(void);
file_write_user_opt_names(gchar user_opt_names[][50],
gchar player_list_att_names[][PLAYER_LIST_ATTRIBUTE_END][50]);
void
file_load_conf_files(void);
void
file_save_conf(void);
void
file_load_user_conf_file(User *user);
void
file_load_const_file(void);
#endif

View File

@ -5,6 +5,7 @@
#include "main.h"
#include "maths.h"
#include "misc.h"
#include "table.h"
#include "team.h"
#include "variables.h"
@ -57,7 +58,7 @@ fixture_write_cup_fixtures(Cup *cup)
if(g_array_index(cup->rounds, CupRound, 0).
round_robin_number_of_groups > 0)
fixture_write_cup_round_robin(cup, 0);
fixture_write_cup_round_robin(cup, 0, NULL);
else
{
if(cup->type == CUP_TYPE_INTERNATIONAL)
@ -65,7 +66,7 @@ fixture_write_cup_fixtures(Cup *cup)
else
teams = team_get_pointers_from_choose_teams(cup->choose_teams);
fixture_write_knockout_round(teams, cup, 0);
fixture_write_knockout_round(cup, 0, teams);
}
/*d*/
@ -89,25 +90,232 @@ fixture_write_cup_fixtures(Cup *cup)
/* } */
}
/** Update the fixtures for the given cup.
@param cup The cup we update. */
void
fixture_update(Cup *cup)
{
gint i;
GArray *fixtures = cup->fixtures;
gint round = g_array_index(fixtures, Fixture, fixtures->len - 1).round;
gint replay = g_array_index(cup->rounds, CupRound, round).replay;
GPtrArray *teams = NULL;
const CupRound *new_round = &g_array_index(cup->rounds, CupRound, round + 1);
if(replay != 0)
{
if(g_array_index(fixtures, Fixture, fixtures->len - 1).replay_number < replay &&
fixture_update_write_replays(cup))
{
cup->next_fixture_update_week_round++;
return;
}
}
teams = fixture_get_cup_round_winners(cup);
if(teams->len < 2)
{
g_warning("fixture_update_cup_fixtures: found less than 2 teams for cup %s\n",
cup->name->str);
return;
}
if(round == 0 && cup->bye != NULL && cup->bye->len != 0)
{
for(i=0;i<cup->bye->len;i++)
g_ptr_array_add(teams, g_ptr_array_index(cup->bye, i));
free_g_ptr_array(&cup->bye);
}
/*d*/
printf("\n");
for(i=0;i<teams->len;i++)
printf("%d adv %s\n", i, ((Team*)g_ptr_array_index(teams, i))->name->str);
printf("\n");
if(new_round->round_robin_number_of_groups > 0)
fixture_write_cup_round_robin(cup, round + 1, teams);
else
fixture_write_knockout_round(cup, round + 1, teams);
for(i=0;i<cup->fixtures->len;i++)
if(g_array_index(cup->fixtures, Fixture, i).round == round + 1)
printf("%d %d %d %25s - %-25s\n",
g_array_index(cup->fixtures, Fixture, i).week_number,
g_array_index(cup->fixtures, Fixture, i).week_round_number,
g_array_index(cup->fixtures, Fixture, i).clid,
g_array_index(cup->fixtures, Fixture, i).teams[0]->name->str,
g_array_index(cup->fixtures, Fixture, i).teams[1]->name->str);
}
/** Return the teams that advance to the next cup round.
@param fixtures The fixtures array of the cup.
@return A team pointer array. */
GPtrArray*
fixture_get_cup_round_winners(const Cup *cup)
{
gint i;
GPtrArray *array;
GArray *fixtures = cup->fixtures;
gint round = g_array_index(fixtures, Fixture, fixtures->len - 1).round;
const CupRound *cupround = &g_array_index(cup->rounds, CupRound, round);
if(cupround->round_robin_number_of_groups > 0)
return fixture_get_round_robin_advance(cup);
array = g_ptr_array_new();
if(cupround->replay != 0)
{
for(i=0;i<fixtures->len;i++)
if(g_array_index(fixtures, Fixture, i).round == round &&
(g_array_index(fixtures, Fixture, i).result[0][0] !=
g_array_index(fixtures, Fixture, i).result[1][0] ||
g_array_index(fixtures, Fixture, i).result[0][1] +
g_array_index(fixtures, Fixture, i).result[0][2] +
g_array_index(fixtures, Fixture, i).result[1][1] +
g_array_index(fixtures, Fixture, i).result[1][2] != 0))
g_ptr_array_add(array, fixture_winner_of(&g_array_index(fixtures, Fixture, i)));
return array;
}
if(!cupround->home_away)
{
for(i=0;i<fixtures->len;i++)
if(g_array_index(fixtures, Fixture, i).round == round)
g_ptr_array_add(array, fixture_winner_of(&g_array_index(fixtures, Fixture, i)));
return array;
}
for(i=0;i<fixtures->len;i++)
if(g_array_index(fixtures, Fixture, i).round == round &&
g_array_index(fixtures, Fixture, i).second_leg)
g_ptr_array_add(array, fixture_winner_of(&g_array_index(fixtures, Fixture, i)));
return array;
}
/** Return an array of teams advancing from a round robin
stage of a cup.
@param cup The cup.
@return The pointers to the teams. */
GPtrArray*
fixture_get_round_robin_advance(const Cup *cup)
{
gint i, j;
GArray *fixtures = cup->fixtures;
gint round = g_array_index(fixtures, Fixture, fixtures->len - 1).round;
GPtrArray *array = g_ptr_array_new();
const CupRound *cupround = &g_array_index(cup->rounds, CupRound, round);
GArray *best_advance = g_array_new(FALSE, FALSE, sizeof(TableElement));
for(i=0;i<cup->tables->len;i++)
for(j=0;j<g_array_index(cup->tables, Table, i).elements->len;j++)
if(j < cupround->round_robin_number_of_advance)
g_ptr_array_add(array, g_array_index(
g_array_index(cup->tables, Table, i).elements,
TableElement, j).team);
else
g_array_append_val(best_advance,
g_array_index(g_array_index(cup->tables, Table, i).elements,
TableElement, j));
g_array_sort_with_data(best_advance,
(GCompareDataFunc)table_element_compare_func,
GINT_TO_POINTER(cup->id));
for(i=0;i<cupround->round_robin_number_of_best_advance;i++)
g_ptr_array_add(array, g_array_index(best_advance, TableElement, i).team);
return array;
}
/** Return the pointer of the team that won the encounter.
@param fix The fixture we examine.
@return A team pointer. */
Team*
fixture_winner_of(const Fixture *fix)
{
gint i;
const Fixture *first_leg;
const CupRound *cupround =
&g_array_index(cup_from_clid(fix->clid)->rounds, CupRound, fix->round);
if(cupround->replay != 0 || !cupround->home_away)
return fix->teams[(math_sum_int_array(&(fix->result[0][0]), 3) <
math_sum_int_array(&(fix->result[1][0]), 3))];
first_leg = fixture_get_first_leg(fix);
printf("win_of %s %d - %d %s\n",
fix->teams[0]->name->str, fix->result[0][0],
fix->result[1][0],
fix->teams[1]->name->str);
printf("win_of %s %d - %d %s\n", first_leg->teams[0]->name->str, first_leg->result[0][0],
first_leg->result[1][0],
first_leg->teams[1]->name->str);
printf("\n");
if(fix->result[0][0] + first_leg->result[1][0] >
fix->result[1][0] + first_leg->result[0][0])
return fix->teams[0];
if(fix->result[1][0] > first_leg->result[1][0])
return fix->teams[1];
return fix->teams[(fix->result[0][1] + fix->result[0][2] <
fix->result[1][1] + fix->result[1][2])];
}
/** Write replay matches for the cup.
@param cup The cup.
@return TRUE if fixtures were written, FALSE otherwise. */
gboolean
fixture_update_write_replays(Cup *cup)
{
gint i;
GArray *fixtures = cup->fixtures;
gint replay_number = g_array_index(fixtures, Fixture, fixtures->len - 1).replay_number + 1;
gint round = g_array_index(fixtures, Fixture, fixtures->len - 1).round;
gboolean return_value;
for(i=0;i<fixtures->len;i++)
if(g_array_index(fixtures, Fixture, i).round == round &&
g_array_index(fixtures, Fixture, i).replay_number == replay_number - 1 &&
g_array_index(fixtures, Fixture, i).result[0][0] ==
g_array_index(fixtures, Fixture, i).result[1][0])
fixture_write(fixtures, g_array_index(fixtures, Fixture, i).teams[1],
g_array_index(fixtures, Fixture, i).teams[0], week, week_round + 1,
cup->id, round, replay_number,
!g_array_index(cup->rounds, CupRound, round).neutral,
FALSE, (g_array_index(cup->rounds, CupRound, round).replay == replay_number));
return_value = (g_array_index(fixtures, Fixture, fixtures->len - 1).replay_number == replay_number);
printf("retval %d\n", return_value);
return return_value;
}
/** Write round robins for the given cup and cup round.
@param cup The cup the fixtures are for.
@param cup_round The cup round. */
void
fixture_write_cup_round_robin(Cup *cup, gint cup_round)
fixture_write_cup_round_robin(Cup *cup, gint cup_round, GPtrArray *teams)
{
gint i, j;
gint number_of_groups =
g_array_index(cup->rounds, CupRound, cup_round).round_robin_number_of_groups;
GPtrArray *teams = NULL;
GPtrArray *teams_group[number_of_groups];
Table new_table;
TableElement new_table_element;
if(cup_round == 0)
if(teams == NULL)
teams = misc_randomise_g_pointer_array(cup_get_team_pointers(cup));
/*todo*/
/* else */
/* teams = cup_get_winners_of_round(cup, cup_round - 1); */
if(teams->len % number_of_groups != 0)
{
@ -123,6 +331,7 @@ fixture_write_cup_round_robin(Cup *cup, gint cup_round)
{
new_table.name = g_string_new(cup->name->str);
new_table.clid = cup->id;
new_table.round = cup_round;
new_table.elements = g_array_new(FALSE, FALSE, sizeof(TableElement));
teams_group[i] = g_ptr_array_new();
@ -131,7 +340,7 @@ fixture_write_cup_round_robin(Cup *cup, gint cup_round)
{
g_ptr_array_add(teams_group[i], g_ptr_array_index(teams, j + i * number_of_groups));
new_table_element =
league_table_element_new((Team*)g_ptr_array_index(teams, j + i * number_of_groups));
table_element_new((Team*)g_ptr_array_index(teams, j + i * number_of_groups));
g_array_append_val(new_table.elements, new_table_element);
}
@ -140,10 +349,10 @@ fixture_write_cup_round_robin(Cup *cup, gint cup_round)
fixture_write_round_robin((gpointer)cup, cup_round, teams_group[i]);
}
cup->next_fixture_update_week =
g_array_index(cup->fixtures, Fixture, cup->fixtures->len - 1).week_number;
cup->next_fixture_update_week_round =
g_array_index(cup->fixtures, Fixture, cup->fixtures->len - 1).week_round_number;
cup->next_fixture_update_week = (cup_round < cup->rounds->len - 1) ?
g_array_index(cup->fixtures, Fixture, cup->fixtures->len - 1).week_number : -1;
cup->next_fixture_update_week_round = (cup_round < cup->rounds->len - 1) ?
g_array_index(cup->fixtures, Fixture, cup->fixtures->len - 1).week_round_number : -1;
}
/** Write round robin fixtures for the teams in the array.
@ -160,7 +369,7 @@ fixture_write_round_robin(gpointer league_cup, gint cup_round, GPtrArray *teams)
{
gint i, j;
gint first_week, week_gap, clid, first_fixture;
gboolean home_advantage, second_leg, decisive;
gboolean home_advantage;
League *league = NULL;
Cup *cup = NULL;
gint len = teams->len;
@ -187,7 +396,6 @@ fixture_write_round_robin(gpointer league_cup, gint cup_round, GPtrArray *teams)
home_advantage = (!g_array_index(cup->rounds, CupRound, cup_round).neutral);
}
second_leg = decisive = FALSE;
first_fixture = fixtures->len;
if(first_week < 1)
@ -205,7 +413,7 @@ fixture_write_round_robin(gpointer league_cup, gint cup_round, GPtrArray *teams)
fixture_write_round_robin_matchday(fixtures, cup_round, teams, i,
first_week + i * week_gap,
fixture_get_free_round(first_week + i * week_gap, clid),
clid, home_advantage, second_leg, decisive);
clid, home_advantage);
/* second half of fixtures */
for(i = 0; i < len - 1; i++)
@ -214,7 +422,7 @@ fixture_write_round_robin(gpointer league_cup, gint cup_round, GPtrArray *teams)
g_array_index(fixtures, Fixture, first_fixture + i * (len / 2) + j).teams[0],
first_week + (len - 1 + i) * week_gap,
fixture_get_free_round(first_week + (len - 1 + i) * week_gap, clid),
clid, cup_round, home_advantage, second_leg, decisive);
clid, cup_round, 0, home_advantage, FALSE, FALSE);
}
/** Write one matchday of round robin games.
@ -227,14 +435,11 @@ fixture_write_round_robin(gpointer league_cup, gint cup_round, GPtrArray *teams)
@param week_number The week the matchday takes place.
@param week_round_number The week_round the matchday takes place.
@param clid The id of the league or cup.
@param home_advantage Whether there's home advantage.
@param second_leg Whether this is the second leg of a round.
@param decisive Whether the match has to have a winner. */
@param home_advantage Whether there's home advantage. */
void
fixture_write_round_robin_matchday(GArray *fixtures, gint cup_round, GPtrArray *teams,
gint special, gint week_number, gint week_round_number,
gint clid, gboolean home_advantage, gboolean second_leg,
gboolean decisive)
gint clid, gboolean home_advantage)
{
gint i;
gint len = teams->len / 2;
@ -256,7 +461,7 @@ fixture_write_round_robin_matchday(GArray *fixtures, gint cup_round, GPtrArray *
for(i=0;i<len;i++)
fixture_write(fixtures, (Team*)home[i], (Team*)away[i], week_number, week_round_number,
clid, cup_round, home_advantage, second_leg, decisive);
clid, cup_round, 0, home_advantage, FALSE, FALSE);
}
/** Write fixtures for a knockout round, e.g. home/away games.
@ -264,7 +469,7 @@ fixture_write_round_robin_matchday(GArray *fixtures, gint cup_round, GPtrArray *
@param cup The cup the fixtures belong to.
@param cup_round The index of the cup round. */
void
fixture_write_knockout_round(GPtrArray *teams, Cup *cup, gint cup_round)
fixture_write_knockout_round(Cup *cup, gint cup_round, GPtrArray *teams)
{
gint i, len = teams->len;
gint first_week = cup_get_first_week_of_cup_round(cup, cup_round);
@ -290,7 +495,7 @@ fixture_write_knockout_round(GPtrArray *teams, Cup *cup, gint cup_round)
for(i=0; i<(len - bye_len) / 2; i++)
fixture_write(cup->fixtures, (Team*)g_ptr_array_index(teams, i),
(Team*)g_ptr_array_index(teams, i + (len - bye_len) / 2), first_week,
fixture_get_free_round(first_week, cup->id), cup->id, cup_round,
fixture_get_free_round(first_week, cup->id), cup->id, cup_round, 0,
!round->neutral, FALSE, (!round->home_away && round->replay == 0));/*todo: adjust
round->replay */
if(round->home_away)
@ -298,12 +503,12 @@ fixture_write_knockout_round(GPtrArray *teams, Cup *cup, gint cup_round)
fixture_write(cup->fixtures, (Team*)g_ptr_array_index(teams, i + (len - bye_len) / 2),
(Team*)g_ptr_array_index(teams, i), first_week + cup->week_gap,
fixture_get_free_round(first_week + cup->week_gap, cup->id), cup->id,
cup_round, !round->neutral, TRUE, TRUE);
cup_round, 0, !round->neutral, TRUE, TRUE);
cup->next_fixture_update_week =
g_array_index(cup->fixtures, Fixture, cup->fixtures->len - 1).week_number;
cup->next_fixture_update_week_round =
g_array_index(cup->fixtures, Fixture, cup->fixtures->len - 1).week_round_number;
cup->next_fixture_update_week = (cup_round < cup->rounds->len - 1) ?
g_array_index(cup->fixtures, Fixture, cup->fixtures->len - 1).week_number : -1;
cup->next_fixture_update_week_round = (cup_round < cup->rounds->len - 1) ?
g_array_index(cup->fixtures, Fixture, cup->fixtures->len - 1).week_round_number : -1;
}
/** Write a fixture and append it to a fixture array.
@ -314,19 +519,21 @@ fixture_write_knockout_round(GPtrArray *teams, Cup *cup, gint cup_round)
@param week_round_number The week_round it takes place.
@param clid The id of the league or cup.
@param cup_round The index of the cup round or -1 if it's a league.
@param replay_number Whether this is a replay match and the how 'manyth' it is.
@param home_advantage Whether there's home advantage.
@param second_leg Whether this is the second leg of a round.
@param decisive Whether the match has to have a winner. */
void
fixture_write(GArray *fixtures, Team *home_team, Team *away_team, gint week_number,
gint week_round_number, gint clid, gint cup_round, gboolean home_advantage,
gboolean second_leg, gboolean decisive)
gint week_round_number, gint clid, gint cup_round, gint replay_number,
gboolean home_advantage, gboolean second_leg, gboolean decisive)
{
gint i;
Fixture new;
new.clid = clid;
new.round = cup_round;
new.replay_number = replay_number;
new.week_number = week_number;
new.week_round_number = week_round_number;
new.teams[0] = (Team*)home_team;
@ -337,7 +544,7 @@ fixture_write(GArray *fixtures, Team *home_team, Team *away_team, gint week_numb
new.home_advantage = home_advantage;
new.second_leg = second_leg;
new.decisive = decisive;
new.attendance = 0;
new.attendance = -1;
g_array_append_val(fixtures, new);
}
@ -390,14 +597,91 @@ query_fixture_is_earlier(const Fixture *fix1, const Fixture *fix2)
gboolean
query_fixture_is_draw(const Fixture *fix)
{
const Fixture *first_leg;
if(!fix->decisive)
return FALSE;
if(!fix->second_leg)
return (fix->result[0][0] + fix->result[0][1] ==
fix->result[1][0] + fix->result[1][1]);
first_leg = fixture_get_first_leg(fix);
return (fix->result[0][0] + first_leg->result[1][0] ==
fix->result[1][0] + first_leg->result[0][0] &&
fix->result[0][0] == first_leg->result[0][0] &&
fix->result[0][1] == fix->result[1][1]);
}
/** Check whether a user's team participates.
@param fix The fixture we check.
@return Index of the user or -1. */
gint
fixture_user_team_involved(const Fixture *fix)
{
if(team_is_user(fix->teams[0]) != -1)
return team_is_user(fix->teams[0]);
if(team_is_user(fix->teams[1]) != -1)
return team_is_user(fix->teams[1]);
return -1;
}
/** Check whether we have to update a table
after calculating the fixture.
@param fix The fixture that got calculated.
@return TRUE or FALSE. */
gboolean
query_fixture_has_tables(const Fixture *fix)
{
return (fix->clid < ID_CUP_START ||
g_array_index(cup_from_clid(fix->clid)->rounds, CupRound, fix->round).
round_robin_number_of_groups != 0);
}
/** Find out whether there were games in the specified league
or cup at the specified time.
@param clid The cup or league id.
@param week_number The week number.
@param week_round_number The week round.
@return TRUE or FALSE. */
gboolean
query_fixture_in_week_round(gint clid, gint week_number, gint week_round_number)
{
gint i;
GArray *fixtures = (clid < ID_CUP_START) ?
league_from_clid(clid)->fixtures : cup_from_clid(clid)->fixtures;
for(i=0;i<fixtures->len;i++)
if(g_array_index(fixtures, Fixture, i).week_number == week_number &&
g_array_index(fixtures, Fixture, i).week_round_number == week_round_number)
return TRUE;
return FALSE;
}
/** Check whether the user's team participates.
@param fix The fixture we check.
@return TRUE or FALSE. */
gboolean
query_my_team_involved(const Fixture *fix)
/** Return a pointer to the first leg going with
the fixture.
@param fix The second leg fixture.
@return A fixture pointer or NULL if failed. */
Fixture*
fixture_get_first_leg(const Fixture *fix)
{
return (fix->teams[0] == my_team || fix->teams[1] == my_team);
gint i;
Fixture *first_leg = NULL;
for(i=0;i<cup_from_clid(fix->clid)->fixtures->len;i++)
if(g_array_index(cup_from_clid(fix->clid)->fixtures, Fixture, i).round == fix->round &&
g_array_index(cup_from_clid(fix->clid)->fixtures, Fixture, i).teams[0] == fix->teams[1] &&
g_array_index(cup_from_clid(fix->clid)->fixtures, Fixture, i).teams[1] == fix->teams[0])
first_leg = &g_array_index(cup_from_clid(fix->clid)->fixtures, Fixture, i);
if(first_leg == NULL)
g_warning("fixture_get_first_leg: didn't find first leg match; cup %s round %d\n",
cup_from_clid(fix->clid)->name->str, fix->round);
return first_leg;
}

View File

@ -13,7 +13,7 @@ void
fixture_write_cup_fixtures(Cup *cup);
void
fixture_write_cup_round_robin(Cup *cup, gint cup_round);
fixture_write_cup_round_robin(Cup *cup, gint cup_round, GPtrArray *teams);
void
fixture_write_round_robin(gpointer league_cup, gint cup_round, GPtrArray *teams);
@ -21,16 +21,30 @@ fixture_write_round_robin(gpointer league_cup, gint cup_round, GPtrArray *teams)
void
fixture_write_round_robin_matchday(GArray *fixtures, gint cup_round, GPtrArray *teams,
gint special, gint week_number, gint week_round_number,
gint clid, gboolean home_advantage, gboolean second_leg,
gboolean decisive);
gint clid, gboolean home_advantage);
void
fixture_write_knockout_round(GPtrArray *teams, Cup *cup, gint cup_round);
fixture_write_knockout_round(Cup *cup, gint cup_round, GPtrArray *teams);
void
fixture_write(GArray *fixtures, Team *home_team, Team *away_team, gint week_number,
gint week_round_number, gint clid, gint cup_round, gboolean home_advantage,
gboolean second_leg, gboolean decisive);
gint week_round_number, gint clid, gint cup_round, gint replay_number,
gboolean home_advantage, gboolean second_leg, gboolean decisive);
void
fixture_update(Cup *cup);
gboolean
fixture_update_write_replays(Cup *cup);
GPtrArray*
fixture_get_cup_round_winners(const Cup *cup);
GPtrArray*
fixture_get_round_robin_advance(const Cup *cup);
Team*
fixture_winner_of(const Fixture *fix);
gint
fixture_get_free_round(gint week_number, gint clid);
@ -41,7 +55,16 @@ query_fixture_is_earlier(const Fixture *fix1, const Fixture *fix2);
gboolean
query_fixture_is_draw(const Fixture *fix);
gint
fixture_user_team_involved(const Fixture *fix);
gboolean
query_my_team_involved(const Fixture *fix);
query_fixture_has_tables(const Fixture *fix);
gboolean
query_fixture_in_week_round(gint clid, gint week_number, gint week_round_number);
Fixture*
fixture_get_first_leg(const Fixture *fix);
#endif

View File

@ -12,6 +12,8 @@ typedef struct
gint clid;
/** The round (in a cup) the fixture belongs to. */
gint round;
/** The replay number (ie. how often the match was repeated because of a draw). */
gint replay_number;
/** When it takes place. */
gint week_number, week_round_number;
/** The teams involved. */

View File

@ -3,6 +3,7 @@
#include "free.h"
#include "league.h"
#include "player.h"
#include "user.h"
#include "variables.h"
#include "window.h"
@ -15,19 +16,71 @@ free_memory(void)
{
free_variables();
free_country();
free_g_string(&font_name);
free_live_game(&live_game);
free_users();
free_live_game(&live_game_temp);
}
/** Free the users array. */
void
free_users(void)
{
gint i;
if(users == NULL)
return;
for(i=0;i<users->len;i++)
free_user(&usr(i));
free_g_array(&users);
}
/** Free the memory the user occupies.
@param user The user we free. */
void
free_user(User *user)
{
free_g_string(&user->name);
free_g_string(&user->font_name);
free_live_game(&user->live_game);
free_option_array(&user->options, FALSE);
}
/** Free an array of options.
@param array The array we free.
@param reset Whether to create the array anew (empty).
@see #Option */
void
free_option_array(GArray **array, gboolean reset)
{
gint i;
if(*array == NULL)
{
if(reset)
*array = g_array_new(FALSE, FALSE, sizeof(Option));
return;
}
for(i=0;i<(*array)->len;i++)
{
free_g_string(&g_array_index(*array, Option, i).name);
free_g_string(&g_array_index(*array, Option, i).string_value);
}
free_g_array(array);
if(reset)
*array = g_array_new(FALSE, FALSE, sizeof(Option));
}
/** Free a live game variable. */
void
free_live_game(LiveGame *match)
{
gint i;
window_destroy(&match->window);
if(match->units == NULL)
return;
@ -250,6 +303,9 @@ free_variables(void)
free_g_string_array(&player_names);
free_g_array(&transfer_list);
free_option_array(&options, FALSE);
free_option_array(&constants, FALSE);
}
/**

View File

@ -7,6 +7,7 @@
#include "live_game_struct.h"
#include "player_struct.h"
#include "team_struct.h"
#include "user_struct.h"
void
free_g_array(GArray **array);
@ -20,6 +21,12 @@ free_g_string(GString **string);
void
free_memory(void);
void
free_users(void);
void
free_user(User *user);
void
free_country(void);
@ -59,4 +66,7 @@ free_player(Player *pl);
void
free_live_game(LiveGame *match);
void
free_option_array(GArray **array, gboolean reset);
#endif

View File

@ -1,14 +1,12 @@
#include "fixture.h"
#include "game.h"
#include "maths.h"
#include "option.h"
#include "player.h"
#include "team.h"
#include "user.h"
#include "variables.h"
/** Influence in % of the game style towards more attack.
@see game_get_values() */
#define CONSTANT_GAME_STYLE_FACTOR 0.075
/** How the cskill of field players get weighted for the team values in
a match. Rows are player position, columns value type.
@see game_get_player_contribution() */
@ -33,18 +31,20 @@ game_get_values(const Fixture *fix, gfloat team_values[][GAME_TEAM_VALUE_END],
gfloat style_factor;
/*d*/
printf("\nhome %.2f\n", home_advantage);
/* printf("\nhome %.2f\n", home_advantage); */
for(i=0;i<2;i++)
{
for(j=0;j<GAME_TEAM_VALUE_END;j++)
team_values[i][j] = 0;
style_factor = (gfloat)tm[i]->style * CONSTANT_GAME_STYLE_FACTOR;
style_factor = (gfloat)tm[i]->style * const_float("float_game_style_factor");
team_values[i][GAME_TEAM_VALUE_GOALIE] =
game_get_player_contribution(player_of(tm[i], 0), FALSE) *
(1 + home_advantage * (i == 0)) *
(1 + CONSTANT_PLAYER_BOOST_SKILL_EFFECT * (tm[i] == my_team && options[OPT_BOOL_BOOST] == 1));
(1 + const_float("float_player_boost_skill_effect") *
(team_is_user(tm[i]) != -1 &&
option_int("int_opt_user_boost", usr(team_is_user(tm[i])).options) == 1));
for(j=1;j<11;j++)
{
@ -58,17 +58,14 @@ game_get_values(const Fixture *fix, gfloat team_values[][GAME_TEAM_VALUE_END],
team_values[i][GAME_TEAM_VALUE_ATTACK] *=
((1 + style_factor) * (1 + home_advantage * (i == 0)) *
(1 + CONSTANT_PLAYER_BOOST_SKILL_EFFECT * (tm[i] == my_team && options[OPT_BOOL_BOOST] == 1)));
(1 + const_float("float_player_boost_skill_effect") *
(team_is_user(tm[i]) != -1 &&
option_int("int_opt_user_boost", usr(team_is_user(tm[i])).options) == 1)));
team_values[i][GAME_TEAM_VALUE_DEFEND] *=
((1 - style_factor) * (1 + home_advantage * (i == 0)) *
(1 + CONSTANT_PLAYER_BOOST_SKILL_EFFECT * (tm[i] == my_team && options[OPT_BOOL_BOOST] == 1)));
/*d*/
printf("%s attack %.1f midf %.1f defend %.1f\n",
tm[i]->name->str,
team_values[i][GAME_TEAM_VALUE_ATTACK],
team_values[i][GAME_TEAM_VALUE_MIDFIELD],
team_values[i][GAME_TEAM_VALUE_DEFEND]);
(1 + const_float("float_player_boost_skill_effect") *
(team_is_user(tm[i]) != -1 &&
option_int("int_opt_user_boost", usr(team_is_user(tm[i])).options) == 1)));
}
}
@ -81,7 +78,7 @@ gfloat
game_get_player_contribution(const Player *pl, gint type)
{
return (gfloat)(pl->cskill * powf((gfloat)pl->fitness / 100,
CONSTANT_GAME_PLAYER_FITNESS_EXPONENT) *
const_float("float_player_fitness_exponent")) *
player_weights[pl->cpos - 1][type - GAME_TEAM_VALUE_DEFEND]);
}
@ -90,13 +87,13 @@ game_get_player_contribution(const Player *pl, gint type)
@param tm The team we examine.
@param player_type Whether we concentrate on attacking or defending players
or would like to have a penalty shooting player.
@param number_of_penalty Which penalty has to be taken (1st, 2nd etc.)
@param last_penalty The player that shot the last penalty.
@param not_this_one A player to exclude.
@param skills Whether to weight with skills, too.
@return A player index. */
gint
game_get_player(const Team *tm, gint player_type,
gint number_of_penalty, gint not_this_one,
gint last_penalty, gint not_this_one,
gboolean skills)
{
gint i, player = not_this_one;
@ -125,8 +122,7 @@ game_get_player(const Team *tm, gint player_type,
else if(player_type == GAME_PLAYER_TYPE_INJURY)
weights[0] = -1;
else if(player_type == GAME_PLAYER_TYPE_PENALTY)
/*d*/
return player_of(tm, 10)->id;
return game_get_penalty_taker(tm, last_penalty);
game_get_player_probs(tm->players, probs, weights, skills);
@ -164,15 +160,53 @@ game_get_player_probs(GArray *players, gfloat *probs, gfloat *weights, gboolean
{
probs[0] = (skills) ? (gfloat)g_array_index(players, Player, 1).cskill *
powf((gfloat)g_array_index(players, Player, 1).fitness,
CONSTANT_GAME_PLAYER_FITNESS_EXPONENT) *
const_float("float_player_fitness_exponent")) *
weights[g_array_index(players, Player, 1).pos - 1] :
weights[g_array_index(players, Player, 1).pos - 1];
for(i=1;i<10;i++)
probs[i] = probs[i - 1] +
((skills) ? (gfloat)g_array_index(players, Player, i + 1).cskill *
powf((gfloat)g_array_index(players, Player, i + 1).fitness,
CONSTANT_GAME_PLAYER_FITNESS_EXPONENT) *
const_float("float_player_fitness_exponent")) *
weights[g_array_index(players, Player, i + 1).pos - 1] :
weights[g_array_index(players, Player, i + 1).pos - 1]);
}
}
/** Return the player who's shooting the following penalty
(at penalty shoot-out).
@param tm The team that has the penalty.
@param last_penalty The player that shot the last penalty.
@return A player id. */
gint
game_get_penalty_taker(const Team *tm, gint last_penalty)
{
gint i;
GPtrArray *players = g_ptr_array_new();
for(i=0;i<11;i++)
if(player_of(tm, i)->cskill != 0)
g_ptr_array_add(players, player_of(tm, i));
g_ptr_array_sort_with_data(players, (GCompareDataFunc)player_compare_func,
GINT_TO_POINTER(PLAYER_COMPARE_ATTRIBUTE_GAME_SKILL));
if(last_penalty == -1 ||
last_penalty == ((Player*)g_ptr_array_index(players, players->len - 1))->id)
return ((Player*)g_ptr_array_index(players, 0))->id;
for(i=0;i<players->len - 1;i++)
if(last_penalty == ((Player*)g_ptr_array_index(players, i))->id)
return ((Player*)g_ptr_array_index(players, i + 1))->id;
return -1;
}
/** Calculate the number of spectators.
@param fix The fixture we examine. */
void
game_calculate_attendance(Fixture *fix)
{
/*d*/
fix->attendance = 1000;
}

View File

@ -5,14 +5,6 @@
#include "fixture_struct.h"
#include "player_struct.h"
/** Influence of the fitness on the player contribution.
The higher the worse. @see game_get_player_contribution() */
#define CONSTANT_GAME_PLAYER_FITNESS_EXPONENT 0.25
/* #define CONSTANT_GAME_HOME_ADVANTAGE_LOWER 0.04 */
/* #define CONSTANT_GAME_HOME_ADVANTAGE_UPPER 0.08 */
#define CONSTANT_GAME_HOME_ADVANTAGE_LOWER 0.04
#define CONSTANT_GAME_HOME_ADVANTAGE_UPPER 0.08
/** Indices for the team_value array.
@see game_get_values() */
enum GameTeamValue
@ -50,4 +42,10 @@ game_get_player(const Team *tm, gint player_type,
void
game_get_player_probs(GArray *players, gfloat *probs, gfloat *weights, gboolean skills);
gint
game_get_penalty_taker(const Team *tm, gint last_penalty);
void
game_calculate_attendance(Fixture *fix);
#endif

View File

@ -1,24 +1,20 @@
#include <unistd.h>
#include "game_gui.h"
#include "gui.h"
#include "league.h"
#include "live_game.h"
#include "maths.h"
#include "option.h"
#include "treeview.h"
#include "support.h"
#include "window.h"
/** Constants determining the live game area scale
behaviour. */
#define CONSTANT_GAME_GUI_LIVE_GAME_SCALE_ATTACK 0.3
#define CONSTANT_GAME_GUI_LIVE_GAME_SCALE_CHANCE 0.45
#define CONSTANT_GAME_GUI_LIVE_GAME_SCALE_RANGE 10.0
#define CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_DEFEND "lightblue"
#define CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_MIDFIELD "khaki"
#define CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_ATTACK "gold"
#define CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_CHANCE "orange"
#define CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_GOAL "red"
#define CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_MISS "lightgreen"
#include "team.h"
#include "user.h"
#include "variables.h"
/** Show the live game in the live game window.
@param unit The current unit we show. */
@param unit The current unit we show.
@param sleep_factor The factor determining the live game speed. */
void
game_gui_live_game_show_unit(const LiveGameUnit *unit)
{
@ -26,34 +22,30 @@ game_gui_live_game_show_unit(const LiveGameUnit *unit)
gfloat fraction = (gfloat)live_game_unit_get_minute(unit) / 90;
GtkProgressBar *progress_bar;
if(live_game.window == NULL)
{
live_game.window = window_create(WINDOW_LIVE);
if(unit->event.type == LIVE_GAME_EVENT_START_MATCH)
treeview_live_game_show_initial_commentary(unit);
gtk_range_set_range(
GTK_RANGE(lookup_widget(live_game.window, "hscale_area")), 0,
CONSTANT_GAME_GUI_LIVE_GAME_SCALE_RANGE);
}
else
treeview_live_game_show_commentary(unit);
treeview_live_game_show_result(unit);
game_gui_live_game_set_hscale(unit,
GTK_HSCALE(lookup_widget(live_game.window, "hscale_area")));
GTK_HSCALE(lookup_widget(window.live, "hscale_area")));
sprintf(buf, "%d.", live_game_unit_get_minute(unit));
progress_bar = GTK_PROGRESS_BAR(lookup_widget(live_game.window, "progressbar_live"));
progress_bar = GTK_PROGRESS_BAR(lookup_widget(window.live, "progressbar_live"));
gtk_progress_bar_set_fraction(progress_bar, (fraction > 1) ? 1 : fraction);
gtk_progress_bar_set_text(progress_bar, buf);
usleep(500500 + options[OPT_LIVE_SPEED] * 50000);
usleep(500500 + option_int("int_opt_user_live_game_speed",
usr(stat2).options) * 50000);
while(gtk_events_pending())
gtk_main_iteration();
if(unit->event.type == LIVE_GAME_EVENT_END_MATCH)
gtk_widget_set_sensitive(lookup_widget(live_game.window, "button_live_close"), TRUE);
{
gtk_widget_set_sensitive(lookup_widget(window.live, "button_live_close"), TRUE);
gtk_widget_hide(lookup_widget(window.live, "button_pause"));
}
}
/** Set the area scale position and color in the live game window.
@ -68,58 +60,271 @@ game_gui_live_game_set_hscale(const LiveGameUnit *unit, GtkHScale *hscale)
if(unit->area == LIVE_GAME_UNIT_AREA_MIDFIELD)
{
gdk_color_parse(CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_MIDFIELD, &color);
gdk_color_parse(const_str("string_game_gui_live_game_scale_color_midfield"), &color);
gtk_range_set_value(GTK_RANGE(hscale),
CONSTANT_GAME_GUI_LIVE_GAME_SCALE_RANGE / 2);
const_float("float_game_gui_live_game_scale_range") / 2);
}
else if(unit->event.type == LIVE_GAME_EVENT_GOAL ||
unit->event.type == LIVE_GAME_EVENT_OWN_GOAL)
{
gdk_color_parse(CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_GOAL, &color);
gdk_color_parse(const_str("string_game_gui_live_game_scale_color_goal"), &color);
gtk_range_set_value(GTK_RANGE(hscale),
CONSTANT_GAME_GUI_LIVE_GAME_SCALE_RANGE * (unit->possession == 0));
const_float("float_game_gui_live_game_scale_range") *
(unit->possession == 0));
}
else if(unit->event.type == LIVE_GAME_EVENT_SCORING_CHANCE ||
unit->event.type == LIVE_GAME_EVENT_PENALTY ||
unit->event.type == LIVE_GAME_EVENT_FREE_KICK)
{
gdk_color_parse(CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_CHANCE, &color);
gdk_color_parse(const_str("string_game_gui_live_game_scale_color_chance"), &color);
gtk_range_set_value(GTK_RANGE(hscale),
CONSTANT_GAME_GUI_LIVE_GAME_SCALE_RANGE / 2 +
(CONSTANT_GAME_GUI_LIVE_GAME_SCALE_RANGE *
CONSTANT_GAME_GUI_LIVE_GAME_SCALE_CHANCE *
const_float("float_game_gui_live_game_scale_range") / 2 +
(const_float("float_game_gui_live_game_scale_range") *
const_float("float_game_gui_live_game_scale_chance") *
((unit->possession == 0) ? 1 : -1)));
}
else if(unit->event.type == LIVE_GAME_EVENT_POST ||
unit->event.type == LIVE_GAME_EVENT_MISSED ||
unit->event.type == LIVE_GAME_EVENT_SAVE ||
unit->event.type == LIVE_GAME_EVENT_CROSS_BAR)
gdk_color_parse(CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_MISS, &color);
gdk_color_parse(const_str("string_game_gui_live_game_scale_color_miss"), &color);
else if(unit->area == LIVE_GAME_UNIT_AREA_ATTACK)
{
gdk_color_parse(CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_ATTACK, &color);
gdk_color_parse(const_str("string_game_gui_live_game_scale_color_attack"), &color);
gtk_range_set_value(GTK_RANGE(hscale),
CONSTANT_GAME_GUI_LIVE_GAME_SCALE_RANGE / 2 +
(CONSTANT_GAME_GUI_LIVE_GAME_SCALE_RANGE *
CONSTANT_GAME_GUI_LIVE_GAME_SCALE_ATTACK *
const_float("float_game_gui_live_game_scale_range") / 2 +
(const_float("float_game_gui_live_game_scale_range") *
const_float("float_game_gui_live_game_scale_attack") *
((unit->possession == 0) ? 1 : -1)));
}
else if(unit->area == LIVE_GAME_UNIT_AREA_DEFEND)
{
gdk_color_parse(CONSTANT_GAME_GUI_LIVE_GAME_SCALE_COLOR_DEFEND, &color);
gdk_color_parse(const_str("string_game_gui_live_game_scale_color_defend"), &color);
gtk_range_set_value(GTK_RANGE(hscale),
CONSTANT_GAME_GUI_LIVE_GAME_SCALE_RANGE / 2 +
(CONSTANT_GAME_GUI_LIVE_GAME_SCALE_RANGE *
CONSTANT_GAME_GUI_LIVE_GAME_SCALE_ATTACK *
const_float("float_game_gui_live_game_scale_range") / 2 +
(const_float("float_game_gui_live_game_scale_range") *
const_float("float_game_gui_live_game_scale_attack") *
((unit->possession == 0) ? -1 : 1)));
}
else
g_warning("game_gui_live_game_set_hscale: don't know what to do!\n");
gtk_widget_modify_bg(GTK_WIDGET(hscale), GTK_STATE_NORMAL, &color);
if(debug)
printf("***** area %d value %.1f\n", unit->area, gtk_range_get_value(GTK_RANGE(hscale)));
}
/** Look up the widgets in the main window. */
void
game_gui_get_radio_items(GtkWidget **style, GtkWidget **scout,
GtkWidget **physio)
{
style[0] = lookup_widget(window.main, "menu_all_out_defend");
style[1] = lookup_widget(window.main, "menu_defend");
style[2] = lookup_widget(window.main, "menu_balanced");
style[3] = lookup_widget(window.main, "menu_attack");
style[4] = lookup_widget(window.main, "menu_all_out_attack");
scout[0] = lookup_widget(window.main, "menu_scout_best");
scout[1] = lookup_widget(window.main, "menu_scout_good");
scout[2] = lookup_widget(window.main, "menu_scout_average");
scout[3] = lookup_widget(window.main, "menu_scout_bad");
physio[0] = lookup_widget(window.main, "menu_physio_best");
physio[1] = lookup_widget(window.main, "menu_physio_good");
physio[2] = lookup_widget(window.main, "menu_physio_average");
physio[3] = lookup_widget(window.main, "menu_physio_bad");
}
/** Set information like season, user, week etc. into the appropriate labels. */
void
game_gui_set_main_window_header(void)
{
GtkLabel *label_user= GTK_LABEL(lookup_widget(window.main, "label_user"));
GtkLabel *label_season= GTK_LABEL(lookup_widget(window.main, "label_season"));
GtkLabel *label_week= GTK_LABEL(lookup_widget(window.main, "label_week"));
GtkLabel *label_round= GTK_LABEL(lookup_widget(window.main, "label_round"));
GtkLabel *label_team= GTK_LABEL(lookup_widget(window.main, "label_team"));
GtkLabel *label_league= GTK_LABEL(lookup_widget(window.main, "label_league"));
GtkLabel *label_rank= GTK_LABEL(lookup_widget(window.main, "label_rank"));
GtkLabel *label_money= GTK_LABEL(lookup_widget(window.main, "label_money"));
gtk_label_set_text(label_user, usr(current_user).name->str);
gui_label_set_text_from_int(label_season, season, FALSE);
gui_label_set_text_from_int(label_week, week, FALSE);
gui_label_set_text_from_int(label_round, week_round, FALSE);
gui_label_set_text_from_int(label_rank, week_round, FALSE);
gui_label_set_text_from_int(label_money, usr(current_user).finances[FIN_MONEY], FALSE);
gui_label_set_text_from_int(label_rank, team_rank(usr(current_user).tm), FALSE);
gtk_label_set_text(label_team, usr(current_user).tm->name->str);
gtk_label_set_text(label_league, league_from_clid(usr(current_user).tm->clid)->name->str);
game_gui_write_av_skills();
game_gui_write_radio_items();
}
/** Set the average skills of the current team
into the appropriate labels. */
void
game_gui_write_av_skills(void)
{
gchar buf[SMALL];
GtkLabel *label_av_skills= GTK_LABEL(lookup_widget(window.main, "label_av_skills"));
sprintf(buf, "%.1f %.1f",
team_get_average_skill(usr(current_user).tm, TRUE),
team_get_average_skill(usr(current_user).tm, FALSE));
gtk_label_set_text(label_av_skills, buf);
}
/** Activate the appropriate radio items for
playing style etc. according to the user settings. */
void
game_gui_write_radio_items(void)
{
GtkCheckMenuItem *boost = GTK_CHECK_MENU_ITEM(lookup_widget(window.main, "menu_boost"));
GtkWidget *style[5], *scout[4], *physio[4];
game_gui_get_radio_items(style, scout, physio);
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(style[usr(current_user).tm->style + 2]), TRUE);
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(scout[usr(current_user).scout]), TRUE);
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(physio[usr(current_user).physio]), TRUE);
gtk_check_menu_item_set_active(boost, opt_user_int("int_opt_user_boost"));
}
/** Set playing style etc. variables according to
the items.
@param widget The widget that received a click. */
void
game_gui_read_radio_items(GtkWidget *widget)
{
gint i;
GtkWidget *boost = lookup_widget(window.main, "menu_boost");
GtkWidget *style[5], *scout[4], *physio[4];
gint old_scout = usr(current_user).scout,
old_physio = usr(current_user).physio;
game_gui_get_radio_items(style, scout, physio);
if(widget == boost)
opt_user_set_int("int_opt_user_boost",
!opt_user_int("int_opt_user_boost"));
for(i=0;i<5;i++)
if(widget == style[i])
usr(current_user).tm->style = i - 2;
for(i=0;i<4;i++)
if(widget == scout[i])
usr(current_user).scout = 100 + i * 10 + old_scout % 10;
for(i=0;i<4;i++)
if(widget == physio[i])
usr(current_user).physio = 100 + i * 10 + old_physio % 10;
if(math_get_place(usr(current_user).scout, 2) == old_scout % 10)
usr(current_user).scout = old_scout % 10;
if(math_get_place(usr(current_user).physio, 2) == old_physio % 10)
usr(current_user).physio = old_physio % 10;
if(old_scout != usr(current_user).scout ||
old_physio != usr(current_user).physio)
game_gui_print_message(_("Next week you'll fire him and hire a new one."));
}
/** Show the main menu. */
void
game_gui_show_main(void)
{
game_gui_set_main_window_header();
treeview_show_user_player_list(&usr(current_user), 1);
treeview_show_user_player_list(&usr(current_user), 2);
}
/** Print a message into the main window entry. */
void
game_gui_print_message(gchar *text)
{
gtk_entry_set_text(GTK_ENTRY(lookup_widget(window.main, "entry_message")), text);
g_timeout_add(const_int("int_game_gui_message_duration") * 1000,
(GSourceFunc)game_gui_clear_entry_message, NULL);
}
/** Function that gets called from time to time. */
gboolean
game_gui_clear_entry_message(gpointer data)
{
gtk_entry_set_text(GTK_ENTRY(lookup_widget(window.main, "entry_message")), "");
return FALSE;
}
/** Which parts of the main window get affected
by a live game pause. */
enum MainWindowInensitiveItems
{
INSENSITIVE_ITEM_TOOLBAR = 0,
INSENSITIVE_ITEM_PLAYER_LIST2,
INSENSITIVE_ITEM_MENU_FILE,
INSENSITIVE_ITEM_MENU_OPTIONS,
INSENSITIVE_ITEM_MENU_FIGURES,
INSENSITIVE_ITEM_MENU_SCOUT,
INSENSITIVE_ITEM_MENU_PHYSIO,
INSENSITIVE_ITEM_MENU_BROWSE_TEAMS,
INSENSITIVE_ITEM_MENU_PUT_ON_TRANSFER_LIST,
INSENSITIVE_ITEM_MENU_REMOVE_FROM_TRANSFER_LIST,
INSENSITIVE_ITEM_MENU_FIRE,
INSENSITIVE_ITEM_MENU_MANAGE_USERS,
INSENSITIVE_ITEM_MENU_FINANCES_STADIUM,
INSENSITIVE_ITEM_MENU_HELP,
INSENSITIVE_ITEM_END
};
/** Set appropriate parts of the main window insensitive when
the live game is paused or resumed.
@param value Whether we set sensitive or insensitive. */
void
game_gui_set_main_window_sensitivity(gboolean value)
{
gint i;
GtkWidget *insensitive_items[INSENSITIVE_ITEM_END];
insensitive_items[INSENSITIVE_ITEM_TOOLBAR] =
lookup_widget(window.main, "hbox1");
insensitive_items[INSENSITIVE_ITEM_PLAYER_LIST2] =
lookup_widget(window.main, "vbox8");
insensitive_items[INSENSITIVE_ITEM_MENU_FILE] =
lookup_widget(window.main, "menu_file");
insensitive_items[INSENSITIVE_ITEM_MENU_OPTIONS] =
lookup_widget(window.main, "menu_options");
insensitive_items[INSENSITIVE_ITEM_MENU_FIGURES] =
lookup_widget(window.main, "menu_figures");
insensitive_items[INSENSITIVE_ITEM_MENU_SCOUT] =
lookup_widget(window.main, "menu_scout");
insensitive_items[INSENSITIVE_ITEM_MENU_PHYSIO] =
lookup_widget(window.main, "menu_physio");
insensitive_items[INSENSITIVE_ITEM_MENU_BROWSE_TEAMS] =
lookup_widget(window.main, "menu_browse_teams");
insensitive_items[INSENSITIVE_ITEM_MENU_PUT_ON_TRANSFER_LIST] =
lookup_widget(window.main, "menu_put_on_transfer_list");
insensitive_items[INSENSITIVE_ITEM_MENU_REMOVE_FROM_TRANSFER_LIST] =
lookup_widget(window.main, "menu_remove_from_transfer_list");
insensitive_items[INSENSITIVE_ITEM_MENU_FIRE] =
lookup_widget(window.main, "menu_fire");
insensitive_items[INSENSITIVE_ITEM_MENU_MANAGE_USERS] =
lookup_widget(window.main, "menu_manage_users");
insensitive_items[INSENSITIVE_ITEM_MENU_FINANCES_STADIUM] =
lookup_widget(window.main, "menu_finances_stadium");
insensitive_items[INSENSITIVE_ITEM_MENU_HELP] =
lookup_widget(window.main, "menu_help");
for(i=0;i<INSENSITIVE_ITEM_END;i++)
gtk_widget_set_sensitive(insensitive_items[i], !value);
gtk_widget_set_sensitive(window.main, value);
}

View File

@ -2,8 +2,7 @@
#define GAME_GUI_H
#include "bygfoot.h"
#include "live_game.h"
#include "variables.h"
#include "live_game_struct.h"
void
game_gui_live_game_show_unit(const LiveGameUnit *unit);
@ -11,4 +10,32 @@ game_gui_live_game_show_unit(const LiveGameUnit *unit);
void
game_gui_live_game_set_hscale(const LiveGameUnit *unit, GtkHScale *hscale);
void
game_gui_set_main_window_header(void);
void
game_gui_show_main(void);
void
game_gui_get_radio_items(GtkWidget **style, GtkWidget **scout,
GtkWidget **physio);
void
game_gui_print_message(gchar *text);
void
game_gui_read_radio_items(GtkWidget *widget);
void
game_gui_write_radio_items(void);
gboolean
game_gui_clear_entry_message(gpointer data);
void
game_gui_set_main_window_sensitivity(gboolean value);
void
game_gui_write_av_skills(void);
#endif

View File

@ -1,3 +1,52 @@
#include "gui.h"
#include "misc.h"
#include "variables.h"
/* Set into or append an integer into a label.
@param label The label.
@param number The number.
@param append Whether or not to append.*/
void
gui_label_set_text_from_int(GtkLabel *label, gint number, gboolean append)
{
const gchar *current_text = gtk_label_get_text(label);
gchar buf[SMALL], buf2[SMALL];
strcpy(buf, "");
strcpy(buf2, "");
if(number > 1000)
misc_print_grouped_int(number, buf, FALSE);
else
sprintf(buf, "%d", number);
if(!append)
sprintf(buf2, "%s", buf);
else
sprintf(buf2, "%s%s", current_text, buf);
gtk_label_set_text(label, buf2);
}
/* Set into or append an integer into a label.
@param label The label.
@param number The number.
@param append Whether or not to append.
@param precision Float precision to use. */
void
gui_label_set_text_from_float(GtkLabel *label, gfloat number,
gboolean append, gint precision)
{
const gchar *current_text = gtk_label_get_text(label);
gchar buf[SMALL];
strcpy(buf, "");
if(!append)
sprintf(buf, "%.*f", precision, number);
else
sprintf(buf, "%s%.*f", current_text, precision, number);
gtk_label_set_text(label, buf);
}

View File

@ -3,13 +3,11 @@
#include "bygfoot.h"
/** Possible values for the status variable. */
enum StatusValue
{
STATUS_NONE = 0,
STATUS_MAIN,
STATUS_BROWSE_TEAMS,
STATUS_END
};
void
gui_label_set_text_from_int(GtkLabel *label, gint number, gboolean append);
void
gui_label_set_text_from_float(GtkLabel *label, gfloat number,
gboolean append, gint precision);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -33,6 +33,7 @@ league_new(void)
new.table.name = g_string_new("");
new.table.clid = new.id;
new.table.round = -1;
new.table.elements = g_array_new(FALSE, FALSE, sizeof(TableElement));
new.first_week = new.week_gap = 1;
@ -83,22 +84,6 @@ league_new_id(void)
return -1;
}
/** Return a nullified table element.
@see #TableElement */
TableElement
league_table_element_new(Team *team)
{
gint i;
TableElement new;
new.team = team;
for(i=0;i<TABLE_END;i++)
new.values[i] = 0;
return new;
}
/** Get the array index of the given league or cup id.
@param clid The id of the league or cup.
@return The index in the leagues or cups array. */
@ -130,3 +115,19 @@ league_cup_get_index_from_clid(gint clid)
return index;
}
/** Return the league pointer belonging to the id.
@param clid The id we look for.
@return The league pointer or NULL if failed. */
League*
league_from_clid(gint clid)
{
gint i;
for(i=0;i<ligs->len;i++)
if(lig(i).id == clid)
return &lig(i);
g_warning("league_from_clid: didn't find league with id %d\n", clid);
return NULL;
}

View File

@ -19,4 +19,7 @@ league_table_element_new(Team *team);
gint
league_cup_get_index_from_clid(gint clid);
League*
league_from_clid(gint clid);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -65,7 +65,7 @@ void
live_game_event_send_off(gint team, gint player);
void
live_game_generate_commentary(LiveGameUnit *unit);
live_game_generate_commentary(LiveGameUnit *unit, gboolean show_unit);
void
live_game_event_duel(void);

View File

@ -141,6 +141,9 @@ typedef struct
like a substitution that doesn't count as a
match time consuming event. @see #GameUnitTime */
gint minute, time;
/** The match result at the time of this unit. */
gint result[2];
/** The event belonging to the game unit. */
LiveGameEvent event;
@ -165,9 +168,8 @@ typedef struct
gfloat home_advantage;
/** The array of units. @see #GameUnit */
GArray *units;
/** Match statistics. @see #LiveGameStats */
LiveGameStats stats;
GtkWidget *window;
} LiveGame;
#endif

View File

@ -6,6 +6,7 @@
#include <time.h>
/*d*/
#include "misc_callbacks.h"
#include "file.h"
#include "free.h"
#include "main.h"
@ -22,17 +23,21 @@ main_init_variables(void)
country.name = country.symbol = country.sid = NULL;
transfer_list = NULL;
player_names = NULL;
my_team = NULL;
font_name = g_string_new("0");
debug = FALSE;
live_game.units = g_array_new(FALSE, FALSE, sizeof(LiveGameUnit));
live_game.window = NULL;
live_game_temp.units = g_array_new(FALSE, FALSE, sizeof(LiveGameUnit));
live_game_temp.window = NULL;
window.main = window.startup = window.startup_users =
window.live = NULL;
live_game_temp.units = NULL;
users = g_array_new(FALSE, FALSE, sizeof(User));
options = g_array_new(FALSE, FALSE, sizeof(Option));
constants = g_array_new(FALSE, FALSE, sizeof(Option));
popups_active = 0;
selected_row[0] = selected_row[1] = -1;
file_load_conf_files();
}
/**
@ -70,25 +75,33 @@ main_init(gint argc, gchar *argv[])
gint
main (gint argc, gchar *argv[])
{
gint x_pos, y_pos;
#ifdef ENABLE_NLS
bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
#endif
gtk_set_locale ();
gtk_init (&argc, &argv);
gtk_set_locale ();
gtk_init (&argc, &argv);
main_init(argc, argv);
main_init(argc, argv);
window_show_startup();
window_create(WINDOW_STARTUP_USERS);
window_show_startup();
gtk_window_get_position(GTK_WINDOW(window.startup), &x_pos, &y_pos);
gtk_window_move(GTK_WINDOW(window.startup_users), x_pos, y_pos);
stat0 = STATUS_TEAM_SELECTION;
/*d*/
on_button_add_player_clicked(NULL, NULL);
gtk_main ();
gtk_main ();
main_exit_program(EXIT_OK, NULL);
main_exit_program(EXIT_OK, NULL);
return 0;
return 0;
}
/** Exit the program with the given exit code and message. Try to

View File

@ -158,11 +158,11 @@ math_get_bye_len(gint number)
{
gint i;
for(i=10;i>=0;i--)
if((gint)powf(2, i) <= number)
for(i=0;i<20;i++)
if((gint)powf(2, i) >= number)
break;
return number - (gint)powf(2, i);
return (gint)powf(2, i) - number;
}
/** Return the sum of the integers in the array.
@ -170,7 +170,7 @@ math_get_bye_len(gint number)
@param max The size of the array.
@return The sum of all the integers in the array. */
gint
math_sum_int_array(gint *array, gint max)
math_sum_int_array(const gint *array, gint max)
{
gint i, sum = 0;

View File

@ -31,6 +31,6 @@ gint
math_get_bye_len(gint number);
gint
math_sum_int_array(gint *array, gint max);
math_sum_int_array(const gint *array, gint max);
#endif

View File

@ -95,7 +95,6 @@ create_stadium_window (void)
label1 = gtk_label_new (_("Increase (seats)"));
gtk_widget_show (label1);
gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
hseparator1 = gtk_hseparator_new ();
gtk_widget_show (hseparator1);
@ -139,7 +138,6 @@ create_stadium_window (void)
label2 = gtk_label_new (_("Costs"));
gtk_widget_show (label2);
gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
hseparator2 = gtk_hseparator_new ();
gtk_widget_show (hseparator2);
@ -149,25 +147,21 @@ create_stadium_window (void)
label_cost0 = gtk_label_new (_("label4"));
gtk_widget_show (label_cost0);
gtk_box_pack_start (GTK_BOX (vbox3), label_cost0, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label_cost0), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label_cost0), 0, 4);
label_cost1 = gtk_label_new (_("label5"));
gtk_widget_show (label_cost1);
gtk_box_pack_start (GTK_BOX (vbox3), label_cost1, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label_cost1), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label_cost1), 0, 4);
label_cost2 = gtk_label_new (_("label6"));
gtk_widget_show (label_cost2);
gtk_box_pack_start (GTK_BOX (vbox3), label_cost2, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label_cost2), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label_cost2), 0, 4);
label_cost3 = gtk_label_new (_("label7"));
gtk_widget_show (label_cost3);
gtk_box_pack_start (GTK_BOX (vbox3), label_cost3, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label_cost3), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label_cost3), 0, 4);
vseparator2 = gtk_vseparator_new ();
@ -182,7 +176,6 @@ create_stadium_window (void)
label3 = gtk_label_new (_("Finished (weeks)"));
gtk_widget_show (label3);
gtk_box_pack_start (GTK_BOX (vbox4), label3, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label3), GTK_JUSTIFY_LEFT);
hseparator3 = gtk_hseparator_new ();
gtk_widget_show (hseparator3);
@ -192,25 +185,21 @@ create_stadium_window (void)
label8 = gtk_label_new (_("Before next match"));
gtk_widget_show (label8);
gtk_box_pack_start (GTK_BOX (vbox4), label8, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label8), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label8), 0, 3);
label_finished0 = gtk_label_new (_("1-2"));
gtk_widget_show (label_finished0);
gtk_box_pack_start (GTK_BOX (vbox4), label_finished0, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label_finished0), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label_finished0), 0, 3);
label_finished1 = gtk_label_new (_("3-4"));
gtk_widget_show (label_finished1);
gtk_box_pack_start (GTK_BOX (vbox4), label_finished1, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label_finished1), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label_finished1), 0, 3);
label_finished2 = gtk_label_new (_("5-6"));
gtk_widget_show (label_finished2);
gtk_box_pack_start (GTK_BOX (vbox4), label_finished2, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label_finished2), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label_finished2), 0, 3);
hseparator4 = gtk_hseparator_new ();
@ -246,7 +235,6 @@ create_stadium_window (void)
label12 = gtk_label_new_with_mnemonic (_("OK"));
gtk_widget_show (label12);
gtk_box_pack_start (GTK_BOX (hbox3), label12, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label12), GTK_JUSTIFY_LEFT);
button_cancel = gtk_button_new ();
gtk_widget_show (button_cancel);
@ -272,7 +260,6 @@ create_stadium_window (void)
label13 = gtk_label_new_with_mnemonic (_("Cancel"));
gtk_widget_show (label13);
gtk_box_pack_start (GTK_BOX (hbox4), label13, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label13), GTK_JUSTIFY_LEFT);
g_signal_connect ((gpointer) stadium_window, "delete_event",
G_CALLBACK (on_button_cancel_clicked),
@ -384,7 +371,6 @@ create_job_offer_window (void)
label20 = gtk_label_new (_("label20"));
gtk_widget_show (label20);
gtk_box_pack_start (GTK_BOX (vbox5), label20, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label20), GTK_JUSTIFY_LEFT);
hseparator5 = gtk_hseparator_new ();
gtk_widget_show (hseparator5);
@ -402,37 +388,31 @@ create_job_offer_window (void)
label15 = gtk_label_new (_("Name"));
gtk_widget_show (label15);
gtk_box_pack_start (GTK_BOX (vbox6), label15, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label15), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label15), 2.23517e-10, 0.5);
label16 = gtk_label_new (_("League"));
gtk_widget_show (label16);
gtk_box_pack_start (GTK_BOX (vbox6), label16, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label16), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label16), 2.23517e-10, 0.5);
label17 = gtk_label_new (_("Rank"));
gtk_widget_show (label17);
gtk_box_pack_start (GTK_BOX (vbox6), label17, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label17), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label17), 2.23517e-10, 0.5);
label18 = gtk_label_new (_("Money (approx.)"));
gtk_widget_show (label18);
gtk_box_pack_start (GTK_BOX (vbox6), label18, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label18), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label18), 2.23517e-10, 0.5);
label19 = gtk_label_new (_("Stadium capacity"));
gtk_widget_show (label19);
gtk_box_pack_start (GTK_BOX (vbox6), label19, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label19), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label19), 2.23517e-10, 0.5);
label14 = gtk_label_new (_("Stadium safety"));
gtk_widget_show (label14);
gtk_box_pack_start (GTK_BOX (vbox6), label14, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label14), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label14), 0, 0.5);
vseparator3 = gtk_vseparator_new ();
@ -447,32 +427,26 @@ create_job_offer_window (void)
label21 = gtk_label_new (_("label21"));
gtk_widget_show (label21);
gtk_box_pack_start (GTK_BOX (vbox7), label21, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label21), GTK_JUSTIFY_LEFT);
label22 = gtk_label_new (_("label22"));
gtk_widget_show (label22);
gtk_box_pack_start (GTK_BOX (vbox7), label22, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label22), GTK_JUSTIFY_LEFT);
label23 = gtk_label_new (_("label23"));
gtk_widget_show (label23);
gtk_box_pack_start (GTK_BOX (vbox7), label23, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label23), GTK_JUSTIFY_LEFT);
label24 = gtk_label_new (_("label24"));
gtk_widget_show (label24);
gtk_box_pack_start (GTK_BOX (vbox7), label24, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label24), GTK_JUSTIFY_LEFT);
label25 = gtk_label_new (_("label25"));
gtk_widget_show (label25);
gtk_box_pack_start (GTK_BOX (vbox7), label25, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label25), GTK_JUSTIFY_LEFT);
label26 = gtk_label_new (_("label26"));
gtk_widget_show (label26);
gtk_box_pack_start (GTK_BOX (vbox7), label26, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label26), GTK_JUSTIFY_LEFT);
hseparator6 = gtk_hseparator_new ();
gtk_widget_show (hseparator6);
@ -482,7 +456,6 @@ create_job_offer_window (void)
label28 = gtk_label_new (_("Player list"));
gtk_widget_show (label28);
gtk_box_pack_start (GTK_BOX (vbox5), label28, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label28), GTK_JUSTIFY_LEFT);
scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_show (scrolledwindow1);
@ -501,7 +474,6 @@ create_job_offer_window (void)
label27 = gtk_label_new (_("label27"));
gtk_widget_show (label27);
gtk_box_pack_start (GTK_BOX (vbox5), label27, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label27), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label27), 0, 5);
hbox6 = gtk_hbox_new (FALSE, 0);
@ -528,7 +500,6 @@ create_job_offer_window (void)
label31 = gtk_label_new_with_mnemonic (_("OK"));
gtk_widget_show (label31);
gtk_box_pack_start (GTK_BOX (hbox9), label31, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label31), GTK_JUSTIFY_LEFT);
button_cancel = gtk_button_new ();
gtk_widget_show (button_cancel);
@ -550,7 +521,6 @@ create_job_offer_window (void)
label30 = gtk_label_new_with_mnemonic (_("Cancel"));
gtk_widget_show (label30);
gtk_box_pack_start (GTK_BOX (hbox8), label30, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label30), GTK_JUSTIFY_LEFT);
g_signal_connect ((gpointer) button_ok, "clicked",
G_CALLBACK (on_button_offer_ok_clicked),
@ -666,7 +636,6 @@ create_graph_window (void)
label_title = gtk_label_new (_("Statistics"));
gtk_widget_show (label_title);
gtk_box_pack_start (GTK_BOX (vbox8), label_title, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label_title), GTK_JUSTIFY_LEFT);
vbox9 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox9);
@ -687,32 +656,26 @@ create_graph_window (void)
label36 = gtk_label_new (_("label36"));
gtk_widget_show (label36);
gtk_box_pack_start (GTK_BOX (vbox10), label36, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label36), GTK_JUSTIFY_LEFT);
label37 = gtk_label_new (_("label37"));
gtk_widget_show (label37);
gtk_box_pack_start (GTK_BOX (vbox10), label37, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label37), GTK_JUSTIFY_LEFT);
label38 = gtk_label_new (_("label38"));
gtk_widget_show (label38);
gtk_box_pack_start (GTK_BOX (vbox10), label38, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label38), GTK_JUSTIFY_LEFT);
label39 = gtk_label_new (_("label39"));
gtk_widget_show (label39);
gtk_box_pack_start (GTK_BOX (vbox10), label39, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label39), GTK_JUSTIFY_LEFT);
label40 = gtk_label_new (_("label40"));
gtk_widget_show (label40);
gtk_box_pack_start (GTK_BOX (vbox10), label40, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label40), GTK_JUSTIFY_LEFT);
label41 = gtk_label_new ("");
gtk_widget_show (label41);
gtk_box_pack_start (GTK_BOX (vbox12), label41, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label41), GTK_JUSTIFY_LEFT);
vbox11 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox11);
@ -736,7 +699,6 @@ create_graph_window (void)
label33 = gtk_label_new (_("Weeks / Seasons"));
gtk_widget_show (label33);
gtk_box_pack_start (GTK_BOX (vbox9), label33, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label33), GTK_JUSTIFY_LEFT);
hseparator8 = gtk_hseparator_new ();
gtk_widget_show (hseparator8);
@ -842,7 +804,6 @@ create_graph_window (void)
label35 = gtk_label_new_with_mnemonic (_("Close"));
gtk_widget_show (label35);
gtk_box_pack_start (GTK_BOX (hbox14), label35, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label35), GTK_JUSTIFY_LEFT);
g_signal_connect ((gpointer) graph_window, "delete_event",
G_CALLBACK (on_graph_window_delete_event),

View File

@ -1,3 +1,4 @@
#include "game_gui.h"
#include "misc_callback_func.h"
#include "start_end.h"
#include "support.h"
@ -19,7 +20,7 @@ misc_callback_show_team_list(GtkWidget *widget, const gchar *country_file)
xml_country_read(country_file);
treeview_show_team_list(GTK_TREE_VIEW(treeview_startup), FALSE);
treeview_show_team_list(GTK_TREE_VIEW(treeview_startup), FALSE, FALSE);
/*d*/
/* for(i=0;i<cps->len;i++) */
@ -50,25 +51,99 @@ misc_callback_show_team_list(GtkWidget *widget, const gchar *country_file)
/* } */
}
/** Start a new game after the user's selected a team.
@param widget A widget from the startup window that enables us
to get the row in the team list the user has selected. */
/** Start a new game after users and teams are selected. */
void
misc_callback_start_game(GtkWidget *widget)
misc_callback_start_game(void)
{
GtkTreeView *treeview =
GTK_TREE_VIEW(lookup_widget(widget, "treeview_startup"));
GtkWidget *window_startup =
lookup_widget(widget, "window_startup");
my_team = treeview_get_pointer(treeview, 2);
gint i;
stat0 = STATUS_MAIN;
start_new_game();
user_set_up_my_team_new_game(widget);
for(i=0;i<users->len;i++)
user_set_up_team_new_game(&usr(i));
window_destroy(&window_startup);
window_destroy(&window.startup);
window_destroy(&window.startup_users);
window_show_main();
window_create(WINDOW_MAIN);
treeview_show_user_player_list(1);
game_gui_show_main();
}
/** Add a user to the users array. */
void
misc_callback_add_player(void)
{
GtkToggleButton *team_selection_radio1 =
GTK_TOGGLE_BUTTON(lookup_widget(window.startup, "team_selection_radio1"));
GtkToggleButton *team_selection_radio2 =
GTK_TOGGLE_BUTTON(lookup_widget(window.startup, "team_selection_radio2"));
GtkTreeView *treeview =
GTK_TREE_VIEW(lookup_widget(window.startup, "treeview_startup"));
GtkEntry *entry_player_name =
GTK_ENTRY(lookup_widget(window.startup, "entry_player_name"));
const gchar *player_name = gtk_entry_get_text(entry_player_name);
User new_user = user_new();
if(strlen(player_name) > 0)
g_string_printf(new_user.name, "%s", player_name);
gtk_entry_set_text(entry_player_name, "");
if(gtk_toggle_button_get_active(team_selection_radio1))
new_user.scout = 1;
else if(gtk_toggle_button_get_active(team_selection_radio2))
new_user.scout = 0;
else
new_user.scout = -1;
new_user.tm = treeview_get_pointer(treeview, 2);
g_array_append_val(users, new_user);
treeview_show_users_startup();
treeview_show_team_list(GTK_TREE_VIEW(lookup_widget(window.startup, "treeview_startup")),
FALSE, FALSE);
if(users->len == 1)
{
gtk_widget_set_sensitive(lookup_widget(window.startup, "team_selection_ok"), TRUE);
gtk_widget_set_sensitive(lookup_widget(window.startup, "combo_country"), FALSE);
}
}
/** Remove a user from the users list.
@param event The mouse click event on the treeview. */
void
misc_callback_remove_user(GdkEventButton *event)
{
GtkTreeView *treeview =
GTK_TREE_VIEW(lookup_widget(window.startup_users, "treeview_users"));
treeview_select_row(treeview, event);
user_remove(treeview_get_index(treeview, 0) - 1, FALSE);
treeview_show_users_startup();
if(users->len == 0)
{
gtk_widget_set_sensitive(lookup_widget(window.startup, "team_selection_ok"), FALSE);
gtk_widget_set_sensitive(lookup_widget(window.startup, "combo_country"), TRUE);
}
}
/** Stop the live game so that users can make subs etc. */
void
misc_callback_pause_live_game(void)
{
gtk_widget_hide(lookup_widget(window.live, "button_pause"));
gtk_widget_show(lookup_widget(window.live, "button_resume"));
game_gui_set_main_window_sensitivity(TRUE);
stat0 = STATUS_LIVE_GAME_PAUSE;
}

View File

@ -4,9 +4,18 @@
#include "bygfoot.h"
void
misc_callback_start_game(GtkWidget *widget);
misc_callback_start_game(void);
void
misc_callback_show_team_list(GtkWidget *widget, const gchar *country_file);
void
misc_callback_add_player(void);
void
misc_callback_remove_user(GdkEventButton *event);
void
misc_callback_pause_live_game(void);
#endif

View File

@ -1,12 +1,39 @@
#include <string.h>
#include "callback_func.h"
#include "free.h"
#include "game_gui.h"
#include "live_game.h"
#include "misc_callback_func.h"
#include "misc_callbacks.h"
#include "option.h"
#include "user.h"
#include "variables.h"
#include "window.h"
void
on_button_add_player_clicked (GtkButton *button,
gpointer user_data)
{
misc_callback_add_player();
}
void
on_entry_player_name_activate (GtkEntry *entry,
gpointer user_data)
{
on_button_add_player_clicked(NULL, NULL);
}
void
on_team_selection_ok_clicked (GtkButton *button,
gpointer user_data)
{
misc_callback_start_game();
}
void
on_team_selection_cancel_clicked (GtkButton *button,
gpointer user_data)
@ -22,7 +49,8 @@ on_team_selection_tv_row_activated (GtkTreeView *treeview,
GtkTreeViewColumn *column,
gpointer user_data)
{
misc_callback_start_game(GTK_WIDGET(treeview));
if(GTK_WIDGET_IS_SENSITIVE(lookup_widget(window.startup, "team_selection_ok")))
misc_callback_start_game();
}
@ -66,16 +94,6 @@ on_button_start_editor_clicked (GtkButton *button,
}
void
on_team_selection_ok_clicked (GtkButton *button,
gpointer user_data)
{
misc_callback_start_game(GTK_WIDGET(button));
}
void
on_team_selection_load_clicked (GtkButton *button,
gpointer user_data)
@ -192,7 +210,7 @@ void
on_button_live_close_clicked (GtkButton *button,
gpointer user_data)
{
window_destroy(&live_game.window);
callback_show_next_live_game();
}
@ -222,7 +240,7 @@ void
on_button_pause_clicked (GtkButton *button,
gpointer user_data)
{
misc_callback_pause_live_game();
}
@ -230,14 +248,29 @@ void
on_button_resume_clicked (GtkButton *button,
gpointer user_data)
{
gtk_widget_hide(GTK_WIDGET(button));
gtk_widget_show(lookup_widget(window.live, "button_pause"));
game_gui_set_main_window_sensitivity(FALSE);
live_game_calculate_fixture(NULL);
}
void
on_spinbutton_speed_value_changed (GtkSpinButton *spinbutton,
gpointer user_data)
{
options[OPT_LIVE_SPEED] =
gtk_spin_button_get_value_as_int(spinbutton);
option_set_int("int_opt_user_live_game_speed",
usr(stat2).options, gtk_spin_button_get_value_as_int(spinbutton));
}
gboolean
on_treeview_users_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
{
misc_callback_remove_user(event);
return FALSE;
}

View File

@ -115,8 +115,22 @@ void
on_button_resume_clicked (GtkButton *button,
gpointer user_data);
#endif
void
on_spinbutton_speed_value_changed (GtkSpinButton *spinbutton,
gpointer user_data);
void
on_button_add_player_clicked (GtkButton *button,
gpointer user_data);
#endif
gboolean
on_treeview_users_button_press_event (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data);
void
on_entry_player_name_activate (GtkEntry *entry,
gpointer user_data);

View File

@ -34,14 +34,6 @@ create_window_startup (void)
GtkWidget *scrolledwindow1;
GtkWidget *treeview_startup;
GtkWidget *hseparator10;
GtkWidget *label4;
GtkWidget *eventbox1;
GtkWidget *hbox2;
GtkWidget *team_selection_radio1;
GSList *team_selection_radio1_group = NULL;
GtkWidget *team_selection_radio2;
GtkWidget *team_selection_radio3;
GtkWidget *hseparator11;
GtkWidget *vbox34;
GtkWidget *label69;
GtkWidget *hbox44;
@ -53,24 +45,30 @@ create_window_startup (void)
GtkWidget *hbox45;
GtkWidget *image45;
GtkWidget *label70;
GtkWidget *hseparator11;
GtkWidget *label4;
GtkWidget *eventbox1;
GtkWidget *hbox2;
GtkWidget *team_selection_radio1;
GSList *team_selection_radio1_group = NULL;
GtkWidget *team_selection_radio2;
GtkWidget *team_selection_radio3;
GtkWidget *hseparator12;
GtkWidget *hbox46;
GtkWidget *vbox35;
GtkWidget *checkbutton_no_def;
GtkWidget *checkbutton_only_names;
GtkWidget *checkbutton_load_my_team;
GtkWidget *vseparator18;
GtkWidget *button_start_editor;
GtkWidget *alignment15;
GtkWidget *hbox47;
GtkWidget *image55;
GtkWidget *label71;
GtkWidget *hbox54;
GtkWidget *label75;
GtkWidget *entry_player_name;
GtkWidget *button_add_player;
GtkWidget *alignment19;
GtkWidget *hbox55;
GtkWidget *image59;
GtkWidget *label76;
GtkWidget *hseparator13;
GtkWidget *hbox3;
GtkWidget *team_selection_ok;
GtkWidget *alignment1;
GtkWidget *hbox4;
GtkWidget *image2;
GtkWidget *label1;
GtkWidget *alignment18;
GtkWidget *hbox53;
GtkWidget *image58;
GtkWidget *label74;
GtkWidget *team_selection_cancel;
GtkWidget *alignment2;
GtkWidget *hbox5;
@ -116,47 +114,6 @@ create_window_startup (void)
gtk_box_pack_start (GTK_BOX (vbox2), hseparator10, FALSE, FALSE, 0);
gtk_widget_set_size_request (hseparator10, 1, 10);
label4 = gtk_label_new (_("Start in"));
gtk_widget_show (label4);
gtk_box_pack_start (GTK_BOX (vbox2), label4, FALSE, FALSE, 0);
gtk_misc_set_alignment (GTK_MISC (label4), 0.05, 0.5);
eventbox1 = gtk_event_box_new ();
gtk_widget_show (eventbox1);
gtk_box_pack_start (GTK_BOX (vbox2), eventbox1, FALSE, TRUE, 5);
gtk_tooltips_set_tip (tooltips, eventbox1, _("Play normal league games and cups"), NULL);
hbox2 = gtk_hbox_new (FALSE, 0);
gtk_widget_show (hbox2);
gtk_container_add (GTK_CONTAINER (eventbox1), hbox2);
team_selection_radio1 = gtk_radio_button_new_with_mnemonic (NULL, _("Top league"));
gtk_widget_show (team_selection_radio1);
gtk_box_pack_start (GTK_BOX (hbox2), team_selection_radio1, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (team_selection_radio1), 3);
gtk_radio_button_set_group (GTK_RADIO_BUTTON (team_selection_radio1), team_selection_radio1_group);
team_selection_radio1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (team_selection_radio1));
team_selection_radio2 = gtk_radio_button_new_with_mnemonic (NULL, _("Current league"));
gtk_widget_show (team_selection_radio2);
gtk_box_pack_start (GTK_BOX (hbox2), team_selection_radio2, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (team_selection_radio2), 3);
gtk_radio_button_set_group (GTK_RADIO_BUTTON (team_selection_radio2), team_selection_radio1_group);
team_selection_radio1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (team_selection_radio2));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (team_selection_radio2), TRUE);
team_selection_radio3 = gtk_radio_button_new_with_mnemonic (NULL, _("Bottom league"));
gtk_widget_show (team_selection_radio3);
gtk_box_pack_start (GTK_BOX (hbox2), team_selection_radio3, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (team_selection_radio3), 3);
gtk_radio_button_set_group (GTK_RADIO_BUTTON (team_selection_radio3), team_selection_radio1_group);
team_selection_radio1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (team_selection_radio3));
hseparator11 = gtk_hseparator_new ();
gtk_widget_show (hseparator11);
gtk_box_pack_start (GTK_BOX (vbox2), hseparator11, FALSE, FALSE, 0);
gtk_widget_set_size_request (hseparator11, 1, 10);
vbox34 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox34);
gtk_box_pack_start (GTK_BOX (vbox2), vbox34, FALSE, TRUE, 5);
@ -206,64 +163,90 @@ create_window_startup (void)
gtk_widget_show (label70);
gtk_box_pack_start (GTK_BOX (hbox45), label70, FALSE, FALSE, 0);
hseparator11 = gtk_hseparator_new ();
gtk_widget_show (hseparator11);
gtk_box_pack_start (GTK_BOX (vbox2), hseparator11, FALSE, FALSE, 0);
gtk_widget_set_size_request (hseparator11, 1, 10);
label4 = gtk_label_new (_("Start in"));
gtk_widget_show (label4);
gtk_box_pack_start (GTK_BOX (vbox2), label4, FALSE, FALSE, 0);
gtk_misc_set_alignment (GTK_MISC (label4), 0.05, 0.5);
eventbox1 = gtk_event_box_new ();
gtk_widget_show (eventbox1);
gtk_box_pack_start (GTK_BOX (vbox2), eventbox1, FALSE, TRUE, 5);
gtk_tooltips_set_tip (tooltips, eventbox1, _("Play normal league games and cups"), NULL);
hbox2 = gtk_hbox_new (FALSE, 0);
gtk_widget_show (hbox2);
gtk_container_add (GTK_CONTAINER (eventbox1), hbox2);
team_selection_radio1 = gtk_radio_button_new_with_mnemonic (NULL, _("Top league"));
gtk_widget_show (team_selection_radio1);
gtk_box_pack_start (GTK_BOX (hbox2), team_selection_radio1, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (team_selection_radio1), 3);
gtk_radio_button_set_group (GTK_RADIO_BUTTON (team_selection_radio1), team_selection_radio1_group);
team_selection_radio1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (team_selection_radio1));
team_selection_radio2 = gtk_radio_button_new_with_mnemonic (NULL, _("Current league"));
gtk_widget_show (team_selection_radio2);
gtk_box_pack_start (GTK_BOX (hbox2), team_selection_radio2, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (team_selection_radio2), 3);
gtk_radio_button_set_group (GTK_RADIO_BUTTON (team_selection_radio2), team_selection_radio1_group);
team_selection_radio1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (team_selection_radio2));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (team_selection_radio2), TRUE);
team_selection_radio3 = gtk_radio_button_new_with_mnemonic (NULL, _("Bottom league"));
gtk_widget_show (team_selection_radio3);
gtk_box_pack_start (GTK_BOX (hbox2), team_selection_radio3, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (team_selection_radio3), 3);
gtk_radio_button_set_group (GTK_RADIO_BUTTON (team_selection_radio3), team_selection_radio1_group);
team_selection_radio1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (team_selection_radio3));
hseparator12 = gtk_hseparator_new ();
gtk_widget_show (hseparator12);
gtk_box_pack_start (GTK_BOX (vbox2), hseparator12, FALSE, FALSE, 0);
gtk_widget_set_size_request (hseparator12, 1, 10);
hbox46 = gtk_hbox_new (FALSE, 0);
gtk_widget_show (hbox46);
gtk_box_pack_start (GTK_BOX (vbox2), hbox46, FALSE, TRUE, 0);
hbox54 = gtk_hbox_new (FALSE, 5);
gtk_widget_show (hbox54);
gtk_box_pack_start (GTK_BOX (vbox2), hbox54, FALSE, TRUE, 0);
vbox35 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox35);
gtk_box_pack_start (GTK_BOX (hbox46), vbox35, FALSE, TRUE, 0);
label75 = gtk_label_new (_("Player name"));
gtk_widget_show (label75);
gtk_box_pack_start (GTK_BOX (hbox54), label75, FALSE, FALSE, 0);
checkbutton_no_def = gtk_check_button_new_with_mnemonic (_("Don't load team definitions"));
gtk_widget_show (checkbutton_no_def);
gtk_box_pack_start (GTK_BOX (vbox35), checkbutton_no_def, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (checkbutton_no_def), 2);
gtk_tooltips_set_tip (tooltips, checkbutton_no_def, _("If you check this, the game generates all players randomly and won't read the file with team definitions"), NULL);
entry_player_name = gtk_entry_new ();
gtk_widget_show (entry_player_name);
gtk_box_pack_start (GTK_BOX (hbox54), entry_player_name, TRUE, TRUE, 0);
gtk_entry_set_max_length (GTK_ENTRY (entry_player_name), 12);
gtk_entry_set_width_chars (GTK_ENTRY (entry_player_name), 12);
checkbutton_only_names = gtk_check_button_new_with_mnemonic (_("Load only names from team definition file"));
gtk_widget_show (checkbutton_only_names);
gtk_box_pack_start (GTK_BOX (vbox35), checkbutton_only_names, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (checkbutton_only_names), 2);
gtk_tooltips_set_tip (tooltips, checkbutton_only_names, _("If you check this, only the player names and the team structures are loaded from the definition file, values like skill or age are generated randomly"), NULL);
button_add_player = gtk_button_new ();
gtk_widget_show (button_add_player);
gtk_box_pack_start (GTK_BOX (hbox54), button_add_player, FALSE, FALSE, 0);
checkbutton_load_my_team = gtk_check_button_new_with_mnemonic (_("Load my team from definitions file"));
gtk_widget_show (checkbutton_load_my_team);
gtk_box_pack_start (GTK_BOX (vbox35), checkbutton_load_my_team, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (checkbutton_load_my_team), 2);
gtk_tooltips_set_tip (tooltips, checkbutton_load_my_team, _("Check this if you'd like to have your team loaded from the definitions file no matter what the other checkbuttons say."), NULL);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton_load_my_team), TRUE);
alignment19 = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_widget_show (alignment19);
gtk_container_add (GTK_CONTAINER (button_add_player), alignment19);
vseparator18 = gtk_vseparator_new ();
gtk_widget_show (vseparator18);
gtk_box_pack_start (GTK_BOX (hbox46), vseparator18, FALSE, TRUE, 0);
gtk_widget_set_size_request (vseparator18, 10, 1);
hbox55 = gtk_hbox_new (FALSE, 2);
gtk_widget_show (hbox55);
gtk_container_add (GTK_CONTAINER (alignment19), hbox55);
button_start_editor = gtk_button_new ();
gtk_widget_show (button_start_editor);
gtk_box_pack_start (GTK_BOX (hbox46), button_start_editor, TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (button_start_editor), 3);
gtk_tooltips_set_tip (tooltips, button_start_editor, _("You can start the editor from the commandline with 'bygfoot -e' or '--editor'"), NULL);
image59 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_BUTTON);
gtk_widget_show (image59);
gtk_box_pack_start (GTK_BOX (hbox55), image59, FALSE, FALSE, 0);
alignment15 = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_widget_show (alignment15);
gtk_container_add (GTK_CONTAINER (button_start_editor), alignment15);
label76 = gtk_label_new_with_mnemonic (_("Add player"));
gtk_widget_show (label76);
gtk_box_pack_start (GTK_BOX (hbox55), label76, FALSE, FALSE, 0);
hbox47 = gtk_hbox_new (FALSE, 2);
gtk_widget_show (hbox47);
gtk_container_add (GTK_CONTAINER (alignment15), hbox47);
image55 = gtk_image_new_from_stock ("gtk-preferences", GTK_ICON_SIZE_BUTTON);
gtk_widget_show (image55);
gtk_box_pack_start (GTK_BOX (hbox47), image55, FALSE, FALSE, 0);
label71 = gtk_label_new_with_mnemonic (_("Start Bygfoot Team Editor"));
gtk_widget_show (label71);
gtk_box_pack_start (GTK_BOX (hbox47), label71, FALSE, FALSE, 0);
hseparator13 = gtk_hseparator_new ();
gtk_widget_show (hseparator13);
gtk_box_pack_start (GTK_BOX (vbox2), hseparator13, FALSE, TRUE, 0);
gtk_widget_set_size_request (hseparator13, 1, 10);
hbox3 = gtk_hbox_new (FALSE, 0);
gtk_widget_show (hbox3);
@ -273,26 +256,27 @@ create_window_startup (void)
gtk_widget_show (team_selection_ok);
gtk_box_pack_start (GTK_BOX (hbox3), team_selection_ok, TRUE, TRUE, 0);
gtk_container_set_border_width (GTK_CONTAINER (team_selection_ok), 2);
gtk_tooltips_set_tip (tooltips, team_selection_ok, _("Return"), NULL);
gtk_widget_set_sensitive (team_selection_ok, FALSE);
gtk_tooltips_set_tip (tooltips, team_selection_ok, _("Space"), NULL);
gtk_widget_add_accelerator (team_selection_ok, "clicked", accel_group,
GDK_Return, 0,
GDK_space, 0,
GTK_ACCEL_VISIBLE);
alignment1 = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_widget_show (alignment1);
gtk_container_add (GTK_CONTAINER (team_selection_ok), alignment1);
alignment18 = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_widget_show (alignment18);
gtk_container_add (GTK_CONTAINER (team_selection_ok), alignment18);
hbox4 = gtk_hbox_new (FALSE, 2);
gtk_widget_show (hbox4);
gtk_container_add (GTK_CONTAINER (alignment1), hbox4);
hbox53 = gtk_hbox_new (FALSE, 2);
gtk_widget_show (hbox53);
gtk_container_add (GTK_CONTAINER (alignment18), hbox53);
image2 = gtk_image_new_from_stock ("gtk-apply", GTK_ICON_SIZE_BUTTON);
gtk_widget_show (image2);
gtk_box_pack_start (GTK_BOX (hbox4), image2, FALSE, FALSE, 0);
image58 = gtk_image_new_from_stock ("gtk-apply", GTK_ICON_SIZE_BUTTON);
gtk_widget_show (image58);
gtk_box_pack_start (GTK_BOX (hbox53), image58, FALSE, FALSE, 0);
label1 = gtk_label_new_with_mnemonic (_("OK"));
gtk_widget_show (label1);
gtk_box_pack_start (GTK_BOX (hbox4), label1, FALSE, FALSE, 0);
label74 = gtk_label_new_with_mnemonic (_("Start"));
gtk_widget_show (label74);
gtk_box_pack_start (GTK_BOX (hbox53), label74, FALSE, FALSE, 0);
team_selection_cancel = gtk_button_new ();
gtk_widget_show (team_selection_cancel);
@ -356,14 +340,11 @@ create_window_startup (void)
g_signal_connect ((gpointer) button_select_country_file, "clicked",
G_CALLBACK (on_button_select_country_file_clicked),
NULL);
g_signal_connect ((gpointer) checkbutton_no_def, "toggled",
G_CALLBACK (on_checkbutton_load_randomly_toggled),
g_signal_connect ((gpointer) entry_player_name, "activate",
G_CALLBACK (on_entry_player_name_activate),
NULL);
g_signal_connect ((gpointer) checkbutton_only_names, "toggled",
G_CALLBACK (on_checkbutton_only_names_toggled),
NULL);
g_signal_connect ((gpointer) button_start_editor, "clicked",
G_CALLBACK (on_button_start_editor_clicked),
g_signal_connect ((gpointer) button_add_player, "clicked",
G_CALLBACK (on_button_add_player_clicked),
NULL);
g_signal_connect ((gpointer) team_selection_ok, "clicked",
G_CALLBACK (on_team_selection_ok_clicked),
@ -381,13 +362,6 @@ create_window_startup (void)
GLADE_HOOKUP_OBJECT (window_startup, scrolledwindow1, "scrolledwindow1");
GLADE_HOOKUP_OBJECT (window_startup, treeview_startup, "treeview_startup");
GLADE_HOOKUP_OBJECT (window_startup, hseparator10, "hseparator10");
GLADE_HOOKUP_OBJECT (window_startup, label4, "label4");
GLADE_HOOKUP_OBJECT (window_startup, eventbox1, "eventbox1");
GLADE_HOOKUP_OBJECT (window_startup, hbox2, "hbox2");
GLADE_HOOKUP_OBJECT (window_startup, team_selection_radio1, "team_selection_radio1");
GLADE_HOOKUP_OBJECT (window_startup, team_selection_radio2, "team_selection_radio2");
GLADE_HOOKUP_OBJECT (window_startup, team_selection_radio3, "team_selection_radio3");
GLADE_HOOKUP_OBJECT (window_startup, hseparator11, "hseparator11");
GLADE_HOOKUP_OBJECT (window_startup, vbox34, "vbox34");
GLADE_HOOKUP_OBJECT (window_startup, label69, "label69");
GLADE_HOOKUP_OBJECT (window_startup, hbox44, "hbox44");
@ -399,24 +373,29 @@ create_window_startup (void)
GLADE_HOOKUP_OBJECT (window_startup, hbox45, "hbox45");
GLADE_HOOKUP_OBJECT (window_startup, image45, "image45");
GLADE_HOOKUP_OBJECT (window_startup, label70, "label70");
GLADE_HOOKUP_OBJECT (window_startup, hseparator11, "hseparator11");
GLADE_HOOKUP_OBJECT (window_startup, label4, "label4");
GLADE_HOOKUP_OBJECT (window_startup, eventbox1, "eventbox1");
GLADE_HOOKUP_OBJECT (window_startup, hbox2, "hbox2");
GLADE_HOOKUP_OBJECT (window_startup, team_selection_radio1, "team_selection_radio1");
GLADE_HOOKUP_OBJECT (window_startup, team_selection_radio2, "team_selection_radio2");
GLADE_HOOKUP_OBJECT (window_startup, team_selection_radio3, "team_selection_radio3");
GLADE_HOOKUP_OBJECT (window_startup, hseparator12, "hseparator12");
GLADE_HOOKUP_OBJECT (window_startup, hbox46, "hbox46");
GLADE_HOOKUP_OBJECT (window_startup, vbox35, "vbox35");
GLADE_HOOKUP_OBJECT (window_startup, checkbutton_no_def, "checkbutton_no_def");
GLADE_HOOKUP_OBJECT (window_startup, checkbutton_only_names, "checkbutton_only_names");
GLADE_HOOKUP_OBJECT (window_startup, checkbutton_load_my_team, "checkbutton_load_my_team");
GLADE_HOOKUP_OBJECT (window_startup, vseparator18, "vseparator18");
GLADE_HOOKUP_OBJECT (window_startup, button_start_editor, "button_start_editor");
GLADE_HOOKUP_OBJECT (window_startup, alignment15, "alignment15");
GLADE_HOOKUP_OBJECT (window_startup, hbox47, "hbox47");
GLADE_HOOKUP_OBJECT (window_startup, image55, "image55");
GLADE_HOOKUP_OBJECT (window_startup, label71, "label71");
GLADE_HOOKUP_OBJECT (window_startup, hbox54, "hbox54");
GLADE_HOOKUP_OBJECT (window_startup, label75, "label75");
GLADE_HOOKUP_OBJECT (window_startup, entry_player_name, "entry_player_name");
GLADE_HOOKUP_OBJECT (window_startup, button_add_player, "button_add_player");
GLADE_HOOKUP_OBJECT (window_startup, alignment19, "alignment19");
GLADE_HOOKUP_OBJECT (window_startup, hbox55, "hbox55");
GLADE_HOOKUP_OBJECT (window_startup, image59, "image59");
GLADE_HOOKUP_OBJECT (window_startup, label76, "label76");
GLADE_HOOKUP_OBJECT (window_startup, hseparator13, "hseparator13");
GLADE_HOOKUP_OBJECT (window_startup, hbox3, "hbox3");
GLADE_HOOKUP_OBJECT (window_startup, team_selection_ok, "team_selection_ok");
GLADE_HOOKUP_OBJECT (window_startup, alignment1, "alignment1");
GLADE_HOOKUP_OBJECT (window_startup, hbox4, "hbox4");
GLADE_HOOKUP_OBJECT (window_startup, image2, "image2");
GLADE_HOOKUP_OBJECT (window_startup, label1, "label1");
GLADE_HOOKUP_OBJECT (window_startup, alignment18, "alignment18");
GLADE_HOOKUP_OBJECT (window_startup, hbox53, "hbox53");
GLADE_HOOKUP_OBJECT (window_startup, image58, "image58");
GLADE_HOOKUP_OBJECT (window_startup, label74, "label74");
GLADE_HOOKUP_OBJECT (window_startup, team_selection_cancel, "team_selection_cancel");
GLADE_HOOKUP_OBJECT (window_startup, alignment2, "alignment2");
GLADE_HOOKUP_OBJECT (window_startup, hbox5, "hbox5");
@ -1073,3 +1052,40 @@ create_help_window (void)
return help_window;
}
GtkWidget*
create_window_startup_users (void)
{
GtkWidget *window_startup_users;
GtkWidget *scrolledwindow10;
GtkWidget *treeview_users;
GtkTooltips *tooltips;
tooltips = gtk_tooltips_new ();
window_startup_users = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window_startup_users), _("Players"));
gtk_window_set_default_size (GTK_WINDOW (window_startup_users), 250, 200);
gtk_window_set_gravity (GTK_WINDOW (window_startup_users), GDK_GRAVITY_NORTH_EAST);
scrolledwindow10 = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_show (scrolledwindow10);
gtk_container_add (GTK_CONTAINER (window_startup_users), scrolledwindow10);
treeview_users = gtk_tree_view_new ();
gtk_widget_show (treeview_users);
gtk_container_add (GTK_CONTAINER (scrolledwindow10), treeview_users);
gtk_tooltips_set_tip (tooltips, treeview_users, _("Click on a player to remove him"), NULL);
g_signal_connect ((gpointer) treeview_users, "button_press_event",
G_CALLBACK (on_treeview_users_button_press_event),
NULL);
/* Store pointers to all widgets, for use by lookup_widget(). */
GLADE_HOOKUP_OBJECT_NO_REF (window_startup_users, window_startup_users, "window_startup_users");
GLADE_HOOKUP_OBJECT (window_startup_users, scrolledwindow10, "scrolledwindow10");
GLADE_HOOKUP_OBJECT (window_startup_users, treeview_users, "treeview_users");
GLADE_HOOKUP_OBJECT_NO_REF (window_startup_users, tooltips, "tooltips");
return window_startup_users;
}

View File

@ -8,3 +8,4 @@ GtkWidget* create_fsel_window (void);
GtkWidget* create_font_sel_window (void);
GtkWidget* create_window_live (void);
GtkWidget* create_help_window (void);
GtkWidget* create_window_startup_users (void);

View File

@ -0,0 +1,98 @@
#include "option.h"
#include "variables.h"
/** Return the string going with the option
named 'name'.
@param name The name of the option.
@return The string_value of the option.
@see #Option */
gchar*
option_string(gchar *name, GArray *option_array)
{
gint i;
for(i=0;i<option_array->len;i++)
if(strcmp(g_array_index(option_array, Option, i).name->str, name) == 0)
return g_array_index(option_array, Option, i).string_value->str;
g_warning("option_string: option named %s not found\n", name);
return NULL;
}
/** Return the integer going with the option
named 'name'.
@param name The name of the option.
@return The value of the option.
@see #Option */
gint
option_int(gchar *name, GArray *option_array)
{
gint i;
for(i=0;i<option_array->len;i++)
if(strcmp(g_array_index(option_array, Option, i).name->str, name) == 0)
return g_array_index(option_array, Option, i).value;
g_warning("option_int: option named %s not found\n", name);
return -1;
}
/** Return the int going with the option named 'name'
cast to float and divided by 1000.
@param name The name of the option.
@return The value of the option cast to float and divided by 1000.
@see #Option */
gfloat
option_float(gchar *name, GArray *option_array)
{
gint i;
for(i=0;i<option_array->len;i++)
if(strcmp(g_array_index(option_array, Option, i).name->str, name) == 0)
return (gfloat)g_array_index(option_array, Option, i).value / 1000;
g_warning("option_float: option named %s not found\n", name);
return -1;
}
/** Change the value of a string option in the array.
@param name The name of the option.
@param option_array The option array.
@param new_value The value we set. */
void
option_set_string(gchar *name, GArray *option_array, gchar *new_value)
{
gint i;
for(i=0;i<option_array->len;i++)
if(strcmp(g_array_index(option_array, Option, i).name->str, name) == 0)
{
g_string_printf(g_array_index(option_array, Option, i).string_value,
"%s", new_value);
return;
}
g_warning("option_set_string: option named %s not found\n", name);
}
/** Change the value of an int option in the array.
@param name The name of the option.
@param option_array The option array.
@param new_value The value we set. */
void
option_set_int(gchar *name, GArray *option_array, gint new_value)
{
gint i;
for(i=0;i<option_array->len;i++)
if(strcmp(g_array_index(option_array, Option, i).name->str, name) == 0)
{
g_array_index(option_array, Option, i).value = new_value;
return;
}
g_warning("option_set_int: option named %s not found\n", name);
}

View File

@ -1,6 +1,45 @@
#ifndef OPTION_H
#define OPTION_H
#include <math.h>
#include "bygfoot.h"
/** Convenience abbrevs. */
#define option_set_float(name, option_array, value) option_set_int(name, option_array, (gint)rint(value * 1000))
#define opt_str(name) option_string(name, options)
#define opt_int(name) option_int(name, options)
#define opt_float(name) option_float(name, options)
#define opt_set_int(name, value) option_set_int(name, options, value)
#define opt_set_str(name, value) option_set_string(name, options, value)
#define opt_set_float(name, value) option_set_float(name, options, value)
#define opt_user_str(name) option_string(name, usr(current_user).options)
#define opt_user_int(name) option_int(name, usr(current_user).options)
#define opt_user_float(name) option_float(name, usr(current_user).options)
#define opt_user_set_int(name, value) option_set_int(name, usr(current_user).options, value)
#define opt_user_set_str(name, value) option_set_string(name, usr(current_user).options, value)
#define opt_user_set_float(name, value) option_set_float(name, usr(current_user).options, value)
#define const_str(name) option_string(name, constants)
#define const_int(name) option_int(name, constants)
#define const_float(name) option_float(name, constants)
gfloat
option_float(gchar *name, GArray *option_array);
gint
option_int(gchar *name, GArray *option_array);
gchar*
option_string(gchar *name, GArray *option_array);
void
option_set_string(gchar *name, GArray *option_array, gchar *new_value);
void
option_set_int(gchar *name, GArray *option_array, gint new_value);
#endif

View File

@ -306,7 +306,6 @@ create_opt_window (void)
label53 = gtk_label_new (_("At the beginning of a new week show first"));
gtk_widget_show (label53);
gtk_box_pack_start (GTK_BOX (vbox32), label53, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label53), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label53), 0, 0.5);
hbox66 = gtk_hbox_new (FALSE, 0);
@ -344,7 +343,6 @@ create_opt_window (void)
label43 = gtk_label_new (_(" Live game duration factor "));
gtk_widget_show (label43);
gtk_box_pack_start (GTK_BOX (hbox21), label43, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label43), GTK_JUSTIFY_LEFT);
spin_live_duration_adj = gtk_adjustment_new (0, -100, 100, 1, 10, 10);
spin_live_duration = gtk_spin_button_new (GTK_ADJUSTMENT (spin_live_duration_adj), 1, 0);
@ -361,7 +359,6 @@ create_opt_window (void)
label58 = gtk_label_new (_(" "));
gtk_widget_show (label58);
gtk_box_pack_start (GTK_BOX (hbox39), label58, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label58), GTK_JUSTIFY_LEFT);
check_live_tendency = gtk_check_button_new_with_mnemonic (_("Show live game tendency bar"));
gtk_widget_show (check_live_tendency);
@ -393,12 +390,10 @@ create_opt_window (void)
label55 = gtk_label_new_with_mnemonic (_("Change font"));
gtk_widget_show (label55);
gtk_box_pack_start (GTK_BOX (hbox35), label55, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label55), GTK_JUSTIFY_LEFT);
label54 = gtk_label_new (_(" used in the main windows"));
gtk_widget_show (label54);
gtk_box_pack_start (GTK_BOX (hbox34), label54, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label54), GTK_JUSTIFY_LEFT);
hbox46 = gtk_hbox_new (FALSE, 0);
gtk_widget_show (hbox46);
@ -407,7 +402,6 @@ create_opt_window (void)
label71 = gtk_label_new (_("Change team name "));
gtk_widget_show (label71);
gtk_box_pack_start (GTK_BOX (hbox46), label71, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label71), GTK_JUSTIFY_LEFT);
entry_team_name = gtk_entry_new ();
gtk_widget_show (entry_team_name);
@ -436,7 +430,6 @@ create_opt_window (void)
label45 = gtk_label_new (_("Messages"));
gtk_widget_show (label45);
gtk_box_pack_start (GTK_BOX (hbox22), label45, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label45), GTK_JUSTIFY_LEFT);
radio_mess1 = gtk_radio_button_new_with_mnemonic (NULL, _("Moving"));
gtk_widget_show (radio_mess1);
@ -495,12 +488,10 @@ create_opt_window (void)
label89 = gtk_label_new (_("Apperance and behaviour of the game"));
gtk_widget_show (label89);
gtk_frame_set_label_widget (GTK_FRAME (frame1), label89);
gtk_label_set_justify (GTK_LABEL (label89), GTK_JUSTIFY_LEFT);
label83 = gtk_label_new (_("Look & Feel"));
gtk_widget_show (label83);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), label83);
gtk_label_set_justify (GTK_LABEL (label83), GTK_JUSTIFY_LEFT);
frame2 = gtk_frame_new (NULL);
gtk_widget_show (frame2);
@ -534,17 +525,14 @@ create_opt_window (void)
label82 = gtk_label_new (_(" weeks"));
gtk_widget_show (label82);
gtk_box_pack_start (GTK_BOX (hbox62), label82, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label82), GTK_JUSTIFY_LEFT);
label90 = gtk_label_new (_("Options for loading and saving games"));
gtk_widget_show (label90);
gtk_frame_set_label_widget (GTK_FRAME (frame2), label90);
gtk_label_set_justify (GTK_LABEL (label90), GTK_JUSTIFY_LEFT);
label84 = gtk_label_new (_("Load & Save"));
gtk_widget_show (label84);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), label84);
gtk_label_set_justify (GTK_LABEL (label84), GTK_JUSTIFY_LEFT);
frame3 = gtk_frame_new (NULL);
gtk_widget_show (frame3);
@ -675,7 +663,6 @@ create_opt_window (void)
label78 = gtk_label_new ("");
gtk_widget_show (label78);
gtk_box_pack_start (GTK_BOX (vbox28), label78, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label78), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label78), 0, 4);
vbox29 = gtk_vbox_new (FALSE, 2);
@ -727,25 +714,21 @@ create_opt_window (void)
label73 = gtk_label_new (_(" and "));
gtk_widget_show (label73);
gtk_box_pack_start (GTK_BOX (vbox30), label73, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label73), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label73), 0, 4);
label74 = gtk_label_new (_(" and "));
gtk_widget_show (label74);
gtk_box_pack_start (GTK_BOX (vbox30), label74, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label74), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label74), 0, 4);
label75 = gtk_label_new (_(" and "));
gtk_widget_show (label75);
gtk_box_pack_start (GTK_BOX (vbox30), label75, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label75), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label75), 0, 4);
label76 = gtk_label_new ("");
gtk_widget_show (label76);
gtk_box_pack_start (GTK_BOX (vbox30), label76, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label76), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label76), 0, 4);
hbox54 = gtk_hbox_new (FALSE, 0);
@ -797,7 +780,6 @@ create_opt_window (void)
label77 = gtk_label_new ("");
gtk_widget_show (label77);
gtk_box_pack_start (GTK_BOX (vboxa31), label77, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label77), GTK_JUSTIFY_LEFT);
gtk_misc_set_padding (GTK_MISC (label77), 0, 4);
hbox53 = gtk_hbox_new (FALSE, 0);
@ -822,17 +804,14 @@ create_opt_window (void)
label95 = gtk_label_new ("");
gtk_widget_show (label95);
gtk_frame_set_label_widget (GTK_FRAME (frame7), label95);
gtk_label_set_justify (GTK_LABEL (label95), GTK_JUSTIFY_LEFT);
label91 = gtk_label_new (_("Options concering the transfer list"));
gtk_widget_show (label91);
gtk_frame_set_label_widget (GTK_FRAME (frame3), label91);
gtk_label_set_justify (GTK_LABEL (label91), GTK_JUSTIFY_LEFT);
label85 = gtk_label_new (_("Transfers"));
gtk_widget_show (label85);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), label85);
gtk_label_set_justify (GTK_LABEL (label85), GTK_JUSTIFY_LEFT);
frame4 = gtk_frame_new (NULL);
gtk_widget_show (frame4);
@ -864,12 +843,10 @@ create_opt_window (void)
label92 = gtk_label_new (_("Whether to confirm certain actions"));
gtk_widget_show (label92);
gtk_frame_set_label_widget (GTK_FRAME (frame4), label92);
gtk_label_set_justify (GTK_LABEL (label92), GTK_JUSTIFY_LEFT);
label86 = gtk_label_new (_("Confirmations"));
gtk_widget_show (label86);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 3), label86);
gtk_label_set_justify (GTK_LABEL (label86), GTK_JUSTIFY_LEFT);
frame5 = gtk_frame_new (NULL);
gtk_widget_show (frame5);
@ -891,7 +868,6 @@ create_opt_window (void)
label98 = gtk_label_new (_("Attribute"));
gtk_widget_show (label98);
gtk_box_pack_start (GTK_BOX (vbox42), label98, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label98), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label98), 1.11759e-08, 0.5);
hseparator12 = gtk_hseparator_new ();
@ -902,97 +878,81 @@ create_opt_window (void)
label109 = gtk_label_new (_("Name"));
gtk_widget_show (label109);
gtk_box_pack_start (GTK_BOX (vbox42), label109, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label109), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label109), 0, 0.5);
label110 = gtk_label_new (_("Current position"));
gtk_widget_show (label110);
gtk_box_pack_start (GTK_BOX (vbox42), label110, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label110), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label110), 0, 0.5);
label111 = gtk_label_new (_("Position"));
gtk_widget_show (label111);
gtk_box_pack_start (GTK_BOX (vbox42), label111, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label111), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label111), 0, 0.5);
label112 = gtk_label_new (_("Current skill"));
gtk_widget_show (label112);
gtk_box_pack_start (GTK_BOX (vbox42), label112, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label112), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label112), 0, 0.5);
label99 = gtk_label_new (_("Skill"));
gtk_widget_show (label99);
gtk_box_pack_start (GTK_BOX (vbox42), label99, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label99), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label99), 0, 0.5);
label100 = gtk_label_new (_("Fitness"));
gtk_widget_show (label100);
gtk_box_pack_start (GTK_BOX (vbox42), label100, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label100), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label100), 0, 0.5);
label101 = gtk_label_new (_("Games"));
gtk_widget_show (label101);
gtk_box_pack_start (GTK_BOX (vbox42), label101, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label101), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label101), 0, 0.5);
label102 = gtk_label_new (_("Goals"));
gtk_widget_show (label102);
gtk_box_pack_start (GTK_BOX (vbox42), label102, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label102), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label102), 0, 0.5);
label103 = gtk_label_new (_("Status"));
gtk_widget_show (label103);
gtk_box_pack_start (GTK_BOX (vbox42), label103, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label103), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label103), 0, 0.5);
label104 = gtk_label_new (_("Age"));
gtk_widget_show (label104);
gtk_box_pack_start (GTK_BOX (vbox42), label104, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label104), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label104), 0, 0.5);
label105 = gtk_label_new (_("Estimated talent"));
gtk_widget_show (label105);
gtk_box_pack_start (GTK_BOX (vbox42), label105, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label105), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label105), 0, 0.5);
label106 = gtk_label_new (_("Yellow cards"));
gtk_widget_show (label106);
gtk_box_pack_start (GTK_BOX (vbox42), label106, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label106), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label106), 0, 0.5);
label107 = gtk_label_new (_("Value"));
gtk_widget_show (label107);
gtk_box_pack_start (GTK_BOX (vbox42), label107, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label107), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label107), 0, 0.5);
label108 = gtk_label_new (_("Wage"));
gtk_widget_show (label108);
gtk_box_pack_start (GTK_BOX (vbox42), label108, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label108), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label108), 0, 0.5);
label113 = gtk_label_new (_("Team"));
gtk_widget_show (label113);
gtk_box_pack_start (GTK_BOX (vbox42), label113, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label113), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label113), 0, 0.5);
label114 = gtk_label_new (_("League"));
gtk_widget_show (label114);
gtk_box_pack_start (GTK_BOX (vbox42), label114, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label114), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label114), 0, 0.5);
vseparator6 = gtk_vseparator_new ();
@ -1007,7 +967,6 @@ create_opt_window (void)
label130 = gtk_label_new (_("Player list 1"));
gtk_widget_show (label130);
gtk_box_pack_start (GTK_BOX (vbox45), label130, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label130), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label130), 2.23517e-10, 0.5);
hseparator13 = gtk_hseparator_new ();
@ -1091,7 +1050,6 @@ create_opt_window (void)
label115 = gtk_label_new (_("Player list 2"));
gtk_widget_show (label115);
gtk_box_pack_start (GTK_BOX (vbox46), label115, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label115), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (label115), 0, 0.5);
hseparator14 = gtk_hseparator_new ();
@ -1166,12 +1124,10 @@ create_opt_window (void)
label93 = gtk_label_new (_("Player attributes that are shown in the two player lists"));
gtk_widget_show (label93);
gtk_frame_set_label_widget (GTK_FRAME (frame5), label93);
gtk_label_set_justify (GTK_LABEL (label93), GTK_JUSTIFY_LEFT);
label87 = gtk_label_new (_("Player attributes"));
gtk_widget_show (label87);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 4), label87);
gtk_label_set_justify (GTK_LABEL (label87), GTK_JUSTIFY_LEFT);
frame8 = gtk_frame_new (NULL);
gtk_widget_show (frame8);
@ -1189,7 +1145,6 @@ create_opt_window (void)
label136 = gtk_label_new (_("Option"));
gtk_widget_show (label136);
gtk_box_pack_start (GTK_BOX (vbox50), label136, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label136), GTK_JUSTIFY_LEFT);
hseparator17 = gtk_hseparator_new ();
gtk_widget_show (hseparator17);
@ -1208,7 +1163,6 @@ create_opt_window (void)
label140 = gtk_label_new (_("Update interval (in weeks)"));
gtk_widget_show (label140);
gtk_container_add (GTK_CONTAINER (eventbox4), label140);
gtk_label_set_justify (GTK_LABEL (label140), GTK_JUSTIFY_LEFT);
eventbox5 = gtk_event_box_new ();
gtk_widget_show (eventbox5);
@ -1218,7 +1172,6 @@ create_opt_window (void)
label141 = gtk_label_new (_("Maximal history length"));
gtk_widget_show (label141);
gtk_container_add (GTK_CONTAINER (eventbox5), label141);
gtk_label_set_justify (GTK_LABEL (label141), GTK_JUSTIFY_LEFT);
eventbox6 = gtk_event_box_new ();
gtk_widget_show (eventbox6);
@ -1228,7 +1181,6 @@ create_opt_window (void)
label142 = gtk_label_new (_("Delete history at end of season"));
gtk_widget_show (label142);
gtk_container_add (GTK_CONTAINER (eventbox6), label142);
gtk_label_set_justify (GTK_LABEL (label142), GTK_JUSTIFY_LEFT);
vseparator8 = gtk_vseparator_new ();
gtk_widget_show (vseparator8);
@ -1241,7 +1193,6 @@ create_opt_window (void)
label134 = gtk_label_new (_("Team histories"));
gtk_widget_show (label134);
gtk_box_pack_start (GTK_BOX (vbox48), label134, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label134), GTK_JUSTIFY_LEFT);
hseparator15 = gtk_hseparator_new ();
gtk_widget_show (hseparator15);
@ -1279,7 +1230,6 @@ create_opt_window (void)
label135 = gtk_label_new (_("Player histories"));
gtk_widget_show (label135);
gtk_box_pack_start (GTK_BOX (vbox49), label135, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label135), GTK_JUSTIFY_LEFT);
hseparator16 = gtk_hseparator_new ();
gtk_widget_show (hseparator16);
@ -1308,12 +1258,10 @@ create_opt_window (void)
label132 = gtk_label_new (_("Team and player histories"));
gtk_widget_show (label132);
gtk_frame_set_label_widget (GTK_FRAME (frame8), label132);
gtk_label_set_justify (GTK_LABEL (label132), GTK_JUSTIFY_LEFT);
label131 = gtk_label_new (_("Histories"));
gtk_widget_show (label131);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 5), label131);
gtk_label_set_justify (GTK_LABEL (label131), GTK_JUSTIFY_LEFT);
frame6 = gtk_frame_new (NULL);
gtk_widget_show (frame6);
@ -1334,12 +1282,10 @@ create_opt_window (void)
label94 = gtk_label_new (_("Miscellaneous options"));
gtk_widget_show (label94);
gtk_frame_set_label_widget (GTK_FRAME (frame6), label94);
gtk_label_set_justify (GTK_LABEL (label94), GTK_JUSTIFY_LEFT);
label88 = gtk_label_new (_("Misc"));
gtk_widget_show (label88);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 6), label88);
gtk_label_set_justify (GTK_LABEL (label88), GTK_JUSTIFY_LEFT);
hseparator8 = gtk_hseparator_new ();
gtk_widget_show (hseparator8);
@ -1379,7 +1325,6 @@ create_opt_window (void)
label47 = gtk_label_new_with_mnemonic (_("OK"));
gtk_widget_show (label47);
gtk_box_pack_start (GTK_BOX (hbox26), label47, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label47), GTK_JUSTIFY_LEFT);
button_opt_cancel = gtk_button_new ();
gtk_widget_show (button_opt_cancel);
@ -1405,7 +1350,6 @@ create_opt_window (void)
label48 = gtk_label_new_with_mnemonic (_("Cancel"));
gtk_widget_show (label48);
gtk_box_pack_start (GTK_BOX (hbox27), label48, FALSE, FALSE, 0);
gtk_label_set_justify (GTK_LABEL (label48), GTK_JUSTIFY_LEFT);
g_signal_connect ((gpointer) opt_window, "delete_event",
G_CALLBACK (on_opt_window_delete_event),

View File

@ -1,60 +1,12 @@
#include "cup.h"
#include "free.h"
#include "league.h"
#include "maths.h"
#include "option.h"
#include "player.h"
#include "team.h"
#include "variables.h"
/** How much a player's skill can deviate from
the average skill in his team. */
#define CONSTANT_PLAYER_AVERAGE_SKILL_VARIANCE 0.1
/** Lower limit for player ages. */
#define CONSTANT_PLAYER_AGE_LOWER (18 * 52)
/** Upper limit for player ages. */
#define CONSTANT_PLAYER_AGE_UPPER (36 * 52)
/** Lower limit for player peak ages. */
#define CONSTANT_PLAYER_PEAK_AGE_LOWER (30 * 52)
/** Upper limit for player peak ages. */
#define CONSTANT_PLAYER_PEAK_AGE_UPPER (33 * 52)
/** By how many weeks the peak age of goalies is
greater. */
#define CONSTANT_PLAYER_PEAK_AGE_GOALIE_ADDITION (2 * 52)
/** Limits for initial fitness. */
#define CONSTANT_PLAYER_FITNESS_LOWER 85
/** Limits for initial fitness. */
#define CONSTANT_PLAYER_FITNESS_UPPER 100
/** The bounds determining the player positions in a newly created
team for players 13 to CONSTANT_TEAM_MAX_PLAYERS.
Player 11 is always the second goalie. */
#define CONSTANT_PLAYER_POS_BOUND1 15
#define CONSTANT_PLAYER_POS_BOUND2 18
/** Bounds for the contract time at player generation. */
#define CONSTANT_PLAYER_CONTRACT_LOWER 52
#define CONSTANT_PLAYER_CONTRACT_UPPER 4 * 52
/** Bounds for the last skill update at player generation. */
#define CONSTANT_PLAYER_LSU_LOWER 2
#define CONSTANT_PLAYER_LSU_UPPER 10
/** These determine the value calculation of players.
Value is a function of skill and talent involving
a power.
@see player_assign_value()*/
#define CONSTANT_PLAYER_VALUE_SKILL_WEIGHT 0.65
#define CONSTANT_PLAYER_VALUE_POWER 3.5
/** These determine the wage calculation of players.
Wage depends on the value and a random factor near 1.
@see player_assign_wage() */
#define CONSTANT_PLAYER_WAGE_VALUE_FACTOR 0.01
#define CONSTANT_PLAYER_WAGE_RANDOM_DEV 0.15
/** This determines the accuracy of the scout's
talent estimate. The smaller the better. */
#define CONSTANT_PLAYER_ETAL_SCOUT_FACTOR 7
/** Create and return a new player.
@param tm The team the player will belong to.
@param average_skill The average skill of the team.
@ -64,8 +16,8 @@ Player
player_new(Team *tm, gint average_skill)
{
gfloat skill_factor =
math_rnd(1 - CONSTANT_PLAYER_AVERAGE_SKILL_VARIANCE,
1 + CONSTANT_PLAYER_AVERAGE_SKILL_VARIANCE);
math_rnd(1 - const_float("float_player_average_skill_variance"),
1 + const_float("float_player_average_skill_variance"));
Player new;
new.name =
@ -73,27 +25,32 @@ player_new(Team *tm, gint average_skill)
new.id = player_new_id(tm->players);
new.pos = player_get_position_from_structure(tm->structure, tm->players->len);
new.cpos = new.pos;
new.skill = CLAMP((gint)rint((gfloat)average_skill * skill_factor), 0, CONSTANT_PLAYER_MAX_SKILL);
new.skill = CLAMP((gint)rint((gfloat)average_skill * skill_factor), 0,
const_int("int_player_max_skill"));
new.cskill = new.skill;
new.age = math_gauss_disti(CONSTANT_PLAYER_AGE_LOWER,
CONSTANT_PLAYER_AGE_UPPER);
new.age = math_gauss_disti(const_int("int_player_age_lower"),
const_int("int_player_age_upper"));
new.peak_age =
math_rndi(CONSTANT_PLAYER_PEAK_AGE_LOWER +
(new.pos == PLAYER_POS_GOALIE) * CONSTANT_PLAYER_PEAK_AGE_GOALIE_ADDITION,
CONSTANT_PLAYER_PEAK_AGE_UPPER +
(new.pos == PLAYER_POS_GOALIE) * CONSTANT_PLAYER_PEAK_AGE_GOALIE_ADDITION);
math_rndi(const_int("int_player_peak_age_lower") +
(new.pos == PLAYER_POS_GOALIE) *
const_int("int_player_peak_age_goalie_addition"),
const_int("int_player_peak_age_upper") +
(new.pos == PLAYER_POS_GOALIE) *
const_int("int_player_peak_age_goalie_addition"));
new.talent = player_new_talent(new.skill);
new.etal = player_estimate_talent(&new);
new.fitness = math_rndi(CONSTANT_PLAYER_FITNESS_LOWER, CONSTANT_PLAYER_FITNESS_UPPER);
player_estimate_talent(&new);
new.fitness = math_rndi(const_int("int_player_fitness_lower"),
const_int("int_player_fitness_upper"));
new.health = new.recovery = 0;
new.games_goals = g_array_new(FALSE, FALSE, sizeof(PlayerGamesGoals));
new.value = player_assign_value(&new);
new.wage = player_assign_wage(&new);
new.contract = math_rndi(CONSTANT_PLAYER_CONTRACT_LOWER, CONSTANT_PLAYER_CONTRACT_UPPER);
new.lsu = math_rndi(CONSTANT_PLAYER_LSU_LOWER, CONSTANT_PLAYER_LSU_UPPER);
new.contract = math_rndi(const_int("int_player_contract_lower"),
const_int("int_player_contract_upper"));
new.lsu = math_rndi(const_int("int_player_lsu_lower"),
const_int("int_player_lsu_upper"));
new.cards = g_array_new(FALSE, FALSE, sizeof(PlayerCard));
/* todo: make player history struct. */
new.history = NULL;
new.team = tm;
return new;
@ -107,7 +64,7 @@ player_new_id(const GArray *players)
{
gint i, j;
for(i=0;i<CONSTANT_TEAM_MAX_PLAYERS;i++)
for(i=0;i<const_int("int_team_max_players");i++)
{
for(j=0;j<players->len;j++)
if(g_array_index(players, Player, j).id == i)
@ -140,10 +97,10 @@ player_get_position_from_structure(gint structure, gint player_number)
if(player_number % 11 == 0)
position = PLAYER_POS_GOALIE;
else if(player_number < bound[0] ||
(player_number > 10 && player_number < CONSTANT_PLAYER_POS_BOUND1))
(player_number > 10 && player_number < const_int("int_player_pos_bound1")))
position = PLAYER_POS_DEFENDER;
else if(player_number < bound[1] ||
(player_number > 10 && player_number < CONSTANT_PLAYER_POS_BOUND2))
(player_number > 10 && player_number < const_int("int_player_pos_bound2")))
position = PLAYER_POS_MIDFIELDER;
else
position = PLAYER_POS_FORWARD;
@ -157,37 +114,37 @@ player_get_position_from_structure(gint structure, gint player_number)
gint
player_new_talent(gint skill)
{
gint talent = math_gauss_disti(2 * skill - CONSTANT_PLAYER_MAX_SKILL,
CONSTANT_PLAYER_MAX_SKILL);
gint talent = math_gauss_disti(2 * skill - const_int("int_player_max_skill"),
const_int("int_player_max_skill"));
if(talent < skill)
talent = 2 * skill - talent;
return talent;
}
/** Estimate a player's talent. The quality of the estimate
depends on the quality of the scout.
@param pl The player of which we'd like to estimate the talent.
@return A talent estimate. */
gint
player_estimate_talent(const Player *pl)
/** Estimate a player's talent.
@param pl The player of which we'd like to estimate the talent. */
void
player_estimate_talent(Player *pl)
{
gint i;
gint i, j;
gint scout_deviance[QUALITY_END];
/* the maximal deviance in both directions */
gint deviance_bound[2] =
{pl->talent - pl->skill, CONSTANT_PLAYER_MAX_SKILL - pl->talent};
{pl->talent - pl->skill, const_int("int_player_max_skill") - pl->talent};
/* the scout's maximal deviance */
gfloat scout_deviance = (scout % 10) * CONSTANT_PLAYER_ETAL_SCOUT_FACTOR;
/* adjust deviance_bounds with regard to the scout's
deviance */
for(i=0;i<2;i++)
deviance_bound[i] = MIN(deviance_bound[i], scout_deviance);
return math_rndi(pl->talent - deviance_bound[0],
pl->talent + deviance_bound[1]);
for(i=0;i<QUALITY_END;i++)
{
scout_deviance[i] = (i + 1) * const_int("int_player_etal_scout_factor");
/* adjust deviance_bounds with regard to the scout's
deviance */
for(j=0;j<2;j++)
deviance_bound[j] = MIN(deviance_bound[j], scout_deviance[i]);
pl->etal[i] = math_rndi(pl->talent - deviance_bound[0],
pl->talent + deviance_bound[1]);
}
}
/** Assign a (transfer) value to a player. The value depends on skill,
@ -199,17 +156,19 @@ player_assign_value(const Player *pl)
{
gint value;
value = (gint)powf((CONSTANT_PLAYER_VALUE_SKILL_WEIGHT * (gfloat)pl->skill
+ (1 - CONSTANT_PLAYER_VALUE_SKILL_WEIGHT) * (gfloat)pl->talent * 0.7),
CONSTANT_PLAYER_VALUE_POWER);
value = (gint)powf((const_float("float_player_value_skill_weight") *
(gfloat)pl->skill +
(1 - const_float("float_player_value_skill_weight")) *
(gfloat)pl->talent * 0.7),
const_float("float_player_value_power"));
if(pl->age <= CONSTANT_PLAYER_AGE_LOWER + 2 * 52)
if(pl->age <= const_int("int_player_age_lower") + 2 * 52)
value = (gint)((gfloat)value * 1.05);
else if(pl->age <= CONSTANT_PLAYER_AGE_LOWER + 4 * 52)
else if(pl->age <= const_int("int_player_age_lower") + 4 * 52)
value = (gint)((gfloat)value * 1.1);
else if(pl->age >= CONSTANT_PLAYER_AGE_UPPER - 4 * 52)
else if(pl->age >= const_int("int_player_age_upper") - 4 * 52)
value = (gint)((gfloat)value * 0.95);
else if(pl->age >= CONSTANT_PLAYER_AGE_UPPER - 2 * 52)
else if(pl->age >= const_int("int_player_age_upper") - 2 * 52)
value = (gint)((gfloat)value * 0.9);
value = math_round_integer(value, 2);
@ -226,9 +185,9 @@ player_assign_wage(const Player *pl)
{
gfloat wage;
wage = rint(((gfloat)pl->value * CONSTANT_PLAYER_WAGE_VALUE_FACTOR) *
math_rnd(1 - CONSTANT_PLAYER_WAGE_RANDOM_DEV,
1 + CONSTANT_PLAYER_WAGE_RANDOM_DEV) );
wage = rint(((gfloat)pl->value * const_float("float_player_wage_value_factor")) *
math_rnd(1 - const_float("float_player_wage_random_dev"),
1 + const_float("float_player_wage_random_dev") ));
return math_round_integer((gint)wage, 1);
}
@ -249,7 +208,6 @@ player_copy(const Player *source, Player *dest)
dest->name = g_string_new(source->name->str);
dest->cards = g_array_new(FALSE, FALSE, sizeof(PlayerCard));
dest->games_goals = g_array_new(FALSE, FALSE, sizeof(PlayerGamesGoals));
dest->history = NULL;
for(i=0;i<source->cards->len;i++)
g_array_append_val(dest->cards,
@ -268,7 +226,7 @@ player_copy(const Player *source, Player *dest)
void
player_append_to_array(const Player *pl, Team *tm)
{
Player new_player = player_new(tm, CONSTANT_PLAYER_MAX_SKILL);
Player new_player = player_new(tm, const_int("int_player_max_skill"));
player_copy(pl, &new_player);
@ -382,3 +340,142 @@ player_of_id(const Team *tm, gint id)
return NULL;
}
/** Compare two players in a pointer array.
@param pl1 Pointer to the pointer to the first player.
@param pl2 Pointer to the pointer to the second player.
@param data Coded integer that tells us which attribute to compare. */
gint
player_compare_func(gconstpointer a, gconstpointer b, gpointer data)
{
const Player *pl1 = *(const Player**)a;
const Player *pl2 = *(const Player**)b;
gint type = GPOINTER_TO_INT(data);
gint return_value = 0;
if(type == PLAYER_COMPARE_ATTRIBUTE_GAME_SKILL)
{
if(pl1->cskill == pl2->cskill && pl1->fitness == pl2->fitness)
return_value = 0;
else if((gfloat)pl1->cskill *
powf((gfloat)pl1->fitness / 100,
const_float("float_player_fitness_exponent")) >
(gfloat)pl2->cskill *
powf((gfloat)pl2->fitness / 100,
const_float("float_player_fitness_exponent")))
return_value = -1;
else
return_value = 1;
}
return return_value;
}
/** Move a player from one player array to another one.
@param tm1 The source team.
@param player_number The index of the player in the players array.
@param tm2 The dest team.
@param insert_at The new index of the player in the players array. */
void
player_move(Team *tm1, gint player_number, Team *tm2, gint insert_at)
{
Player pl = *player_of(tm1, player_number);
pl.team = tm2;
g_array_remove_index(tm1->players, player_number);
g_array_insert_val(tm2->players, insert_at, pl);
}
/** Swap two players. */
void
player_swap(Team *tm1, gint player_number1, Team *tm2, gint player_number2)
{
gint move = (tm1 == tm2 && player_number1 < player_number2) ?
-1 : 1;
player_move(tm1, player_number1, tm2, player_number2);
if(player_number2 < 11)
player_of(tm2, player_number2)->cpos =
player_get_position_from_structure(tm2->structure, player_number2);
else
player_of(tm2, player_number2)->cpos = player_of(tm2, player_number2)->pos;
player_of(tm2, player_number2)->cskill =
player_get_cskill(player_of(tm2, player_number2));
player_move(tm2, player_number2 + move,
tm1, player_number1);
if(player_number1 < 11)
player_of(tm1, player_number1)->cpos =
player_get_position_from_structure(tm1->structure, player_number1);
else
player_of(tm1, player_number1)->cpos = player_of(tm1, player_number1)->pos;
player_of(tm1, player_number1)->cskill =
player_get_cskill(player_of(tm1, player_number1));
}
/** Return the player's cskill depending on
whether he's on his normal position or not.
@param pl The player we examine.
@return A new cskill. */
gint
player_get_cskill(const Player *pl)
{
gfloat cskill_factor;
if(pl->health != PLAYER_INJURY_NONE ||
player_is_banned(pl) > 0)
cskill_factor = 0.0;
else if(pl->pos == pl->cpos)
cskill_factor = 1.0;
else if(pl->cpos == PLAYER_POS_GOALIE ||
pl->pos == PLAYER_POS_GOALIE)
cskill_factor = 0.5;
else if(abs(pl->cpos - pl->pos) == 2)
cskill_factor = 0.65;
else
cskill_factor = 0.75;
if(pl->cpos != pl->pos)
return MIN(pl->talent * cskill_factor, pl->skill);
else
return pl->skill * (cskill_factor != 0);
}
/** Find out whether the player is banned in
the next match or whether he will be if he
gets a yellow card.
@param pl The player we examine.
@return Number of games banned, or 0 if not banned, or -1
if yellow. */
gint
player_is_banned(const Player *pl)
{
gint i;
Fixture *fix = team_get_next_fixture(pl->team);
gint yellow_red;
if(fix == NULL)
return 0;
if(fix->clid < ID_CUP_START)
yellow_red = league_from_clid(fix->clid)->yellow_red;
else
yellow_red = cup_from_clid(fix->clid)->yellow_red;
for(i=0;i<pl->cards->len;i++)
if(g_array_index(pl->cards, PlayerCard, 0).clid == fix->clid)
{
if(g_array_index(pl->cards, PlayerCard, 0).red > 0)
return g_array_index(pl->cards, PlayerCard, 0).red;
if(g_array_index(pl->cards, PlayerCard, 0).yellow ==
yellow_red - 1)
return -1;
return 0;
}
return 0;
}

View File

@ -5,6 +5,12 @@
#include "player_struct.h"
#include "team_struct.h"
enum PlayerCompareAttrib
{
PLAYER_COMPARE_ATTRIBUTE_GAME_SKILL = 0,
PLAYER_COMPARE_ATTRIBUTE_END
};
Player
player_new(Team *tm, gint average_skill);
@ -17,8 +23,8 @@ player_get_position_from_structure(gint structure, gint player_number);
gint
player_new_talent(gint skill);
gint
player_estimate_talent(const Player *pl);
void
player_estimate_talent(Player *pl);
gint
player_assign_value(const Player *pl);
@ -50,4 +56,19 @@ player_of(const Team *tm, gint number);
Player*
player_of_id(const Team *tm, gint id);
gint
player_compare_func(gconstpointer a, gconstpointer b, gpointer data);
void
player_move(Team *tm1, gint player_number, Team *tm2, gint insert_at);
void
player_swap(Team *tm1, gint player_number1, Team *tm2, gint player_number2);
gint
player_get_cskill(const Player *pl);
gint
player_is_banned(const Player *pl);
#endif

View File

@ -2,24 +2,9 @@
#define PLAYER_STRUCT_H
#include "bygfoot.h"
#include "enums.h"
#include "team_struct.h"
/** Highest skill and talent a player can have. */
#define CONSTANT_PLAYER_MAX_SKILL 99
/** Influence of boost on player's skill. */
#define CONSTANT_PLAYER_BOOST_SKILL_EFFECT 0.3
/** Influence of boost on player's fitness decay. */
#define CONSTANT_PLAYER_BOOST_FITNESS_EFFECT 1.0
/** Influence of boost on injury probability. */
#define CONSTANT_PLAYER_BOOST_INJURY_EFFECT 1.0
/** Influence of boost on cards probability. */
#define CONSTANT_PLAYER_BOOST_CARD_EFFECT 1.0
/** The influence of the fitness on the current skill.
This determines the player's contribution to the team
during a game. The higher the value the bigger the influence. */
#define CONSTANT_PLAYER_FITNESS_IMPACT_ON_SKILL 0.25
/**
Player positions.
*/
@ -75,12 +60,13 @@ typedef struct
gint pos, /**< Position. @see #PlayerPos */
cpos, /**< Current position. @see #PlayerPos */
skill, /**< Skill. Between 0 and CONSTANT_PLAYER_MAX_SKILL. */
skill, /**< Skill. Between 0 and a constant (specified in the constants file). */
cskill, /**< Current Skill. */
age, /**< Age in weeks */
peak_age, /**< Age at which the player reaches his peak ability. */
talent, /**< Talent. The peak ability (which isn't always reached). */
etal, /**< Estimated talent (the user never sees the actual talent). */
etal[QUALITY_END], /**< Estimated talent (the user never sees the actual talent).
Depends on scout quality. */
fitness, /**< Fitness. Between 0 and 99. */
health, /**< Health. An integer signifying an injury or good health. @see #PlayerInjury */
recovery, /**< Weeks until the player gets healthy. */
@ -97,8 +83,6 @@ typedef struct
/** Array of cards; one item per league and cup.
@see PlayerCard*/
GArray *cards;
/** Player history. To be specified. */
GArray *history;
/** Pointer to the player's team. */
Team *team;

View File

@ -2,15 +2,37 @@
#include "file.h"
#include "fixture.h"
#include "league.h"
#include "live_game.h"
#include "main.h"
#include "maths.h"
#include "player.h"
#include "start_end.h"
#include "table.h"
#include "team.h"
#include "transfer.h"
#include "user.h"
#include "variables.h"
#include "xml_name.h"
/** Prototype of a function called at the start or
end of a week round. */
typedef void(*WeekFunc)(void);
/** Array of functions called when a week round
is ended. */
WeekFunc end_week_round_funcs[] =
{end_week_round_results, end_week_round_sort_tables,
end_week_round_update_fixtures, NULL};
/** Array of functions called when a week round
is started. */
WeekFunc start_week_round_funcs[] =
{NULL};
/** Array of functions called when a week
is started. */
WeekFunc start_week_funcs[] = {NULL};
/** Generate the teams etc. */
void
start_new_game(void)
@ -46,10 +68,12 @@ start_write_variables(void)
gint i;
season = week = week_round = 1;
scout = physio = QUALITY_AVERAGE;
current_user = 0;
//week=23; week_round = 2;
transfer_list = g_array_new(FALSE, FALSE, sizeof(TransferPlayer));
file_load_conf_file();
for(i=0;i<users->len;i++)
file_load_user_conf_file(&usr(i));
}
/** Generate the teams in the leagues. */
@ -89,21 +113,156 @@ start_load_cup_teams(void)
{
cup_load_choose_teams(&cp(i));
cup_load_choose_team_user(&cp(i));
/*d*/
/* for(j=0;j<cp(i).teams->len;j++) */
/* { */
/* printf("%d %s clid %d id %d\n", j, */
/* g_array_index(cp(i).teams, Team, j).name->str, */
/* g_array_index(cp(i).teams, Team, j).clid, */
/* g_array_index(cp(i).teams, Team, j).id); */
/* } */
/* for(j=0;j<cp(i).user_teams->len;j++) */
/* { */
/* printf("%d %s clid %d id %d\n", j, */
/* ((Team*)g_ptr_array_index(cp(i).user_teams, j))->name->str, */
/* ((Team*)g_ptr_array_index(cp(i).user_teams, j))->clid, */
/* ((Team*)g_ptr_array_index(cp(i).user_teams, j))->id); */
/* } */
}
}
/** End a week round. */
void
end_week_round(void)
{
gint i;
gboolean new_week = TRUE;
WeekFunc *end_func = end_week_round_funcs;
while(*end_func != NULL)
{
(*end_func)();
end_func++;
}
week_round++;
for(i=0;i<ligs->len;i++)
if(query_fixture_in_week_round(lig(i).id, week, week_round))
{
new_week = FALSE;
break;
}
for(i=0;i<cps->len;i++)
if(query_fixture_in_week_round(cp(i).id, week, week_round))
{
new_week = FALSE;
break;
}
if(new_week)
{
week++;
week_round = 1;
start_week();
}
start_week_round();
}
/** Calculate the match results of a week round. */
void
end_week_round_results(void)
{
gint i, j;
if(week_round == 1)
{
for(i=0;i<ligs->len;i++)
for(j=0;j<lig(i).fixtures->len;j++)
if(g_array_index(lig(i).fixtures, Fixture, j).week_number == week &&
g_array_index(lig(i).fixtures, Fixture, j).week_round_number == week_round &&
g_array_index(lig(i).fixtures, Fixture, j).attendance == -1)
{
live_game_calculate_fixture(&g_array_index(lig(i).fixtures, Fixture, j));
/*d*/
/* printf("%d %d %d %25s %2d - %2d %-25s\n", week, week_round, */
/* g_array_index(lig(i).fixtures, Fixture, j).clid, */
/* g_array_index(lig(i).fixtures, Fixture, j).teams[0]->name->str, */
/* g_array_index(lig(i).fixtures, Fixture, j).result[0][0], */
/* g_array_index(lig(i).fixtures, Fixture, j).result[1][0], */
/* g_array_index(lig(i).fixtures, Fixture, j).teams[1]->name->str); */
}
}
else
{
for(i=0;i<cps->len;i++)
for(j=0;j<cp(i).fixtures->len;j++)
if(g_array_index(cp(i).fixtures, Fixture, j).week_number == week &&
g_array_index(cp(i).fixtures, Fixture, j).week_round_number == week_round &&
g_array_index(lig(i).fixtures, Fixture, j).attendance == -1)
{
live_game_calculate_fixture(&g_array_index(cp(i).fixtures, Fixture, j));
/*d*/
printf("%d %d %d %25s %d %d %d - %d %d %d %-25s\n", week, week_round,
g_array_index(cp(i).fixtures, Fixture, j).clid,
g_array_index(cp(i).fixtures, Fixture, j).teams[0]->name->str,
g_array_index(cp(i).fixtures, Fixture, j).result[0][0],
g_array_index(cp(i).fixtures, Fixture, j).result[0][1],
g_array_index(cp(i).fixtures, Fixture, j).result[0][2],
g_array_index(cp(i).fixtures, Fixture, j).result[1][0],
g_array_index(cp(i).fixtures, Fixture, j).result[1][1],
g_array_index(cp(i).fixtures, Fixture, j).result[1][2],
g_array_index(cp(i).fixtures, Fixture, j).teams[1]->name->str);
}
}
printf("\n");
}
/** Sort league and cup tables. */
void
end_week_round_sort_tables(void)
{
gint i, j;
for(i=0;i<ligs->len;i++)
if(query_fixture_in_week_round(lig(i).id, week, week_round))
g_array_sort_with_data(lig(i).table.elements,
(GCompareDataFunc)table_element_compare_func,
GINT_TO_POINTER(lig(i).id));
for(i=0;i<cps->len;i++)
if(cp(i).tables != NULL && cp(i).tables->len != 0 &&
query_fixture_in_week_round(cp(i).id, week, week_round) &&
g_array_index(cp(i).fixtures, Fixture, cp(i).fixtures->len - 1).round ==
g_array_index(cp(i).tables, Table, 0).round)
for(j=0;j<cp(i).tables->len;j++)
g_array_sort_with_data(g_array_index(cp(i).tables, Table, j).elements,
(GCompareDataFunc)table_element_compare_func,
GINT_TO_POINTER(cp(i).id));
}
/** Update cup fixtures. */
void
end_week_round_update_fixtures(void)
{
gint i;
for(i=0;i<cps->len;i++)
if(cp(i).next_fixture_update_week == week &&
cp(i).next_fixture_update_week_round == week_round)
fixture_update(&cp(i));
}
/** Start a new week round. */
void
start_week_round(void)
{
WeekFunc *start_func = start_week_round_funcs;
while(*start_func != NULL)
{
(*start_func)();
start_func++;
}
}
/** Start a new week. */
void
start_week(void)
{
WeekFunc *start_func = start_week_funcs;
while(*start_func != NULL)
{
(*start_func)();
start_func++;
}
}

View File

@ -18,4 +18,22 @@ start_generate_league_teams(void);
void
start_load_cup_teams(void);
void
end_week_round(void);
void
end_week_round_results(void);
void
end_week_round_sort_tables(void);
void
end_week_round_update_fixtures(void);
void
start_week_round(void);
void
start_week(void);
#endif

View File

@ -15,6 +15,7 @@
# include <libintl.h>
# undef _
# define _(String) dgettext (PACKAGE, String)
# define Q_(String) g_strip_context ((String), gettext (String))
# ifdef gettext_noop
# define N_(String) gettext_noop (String)
# else
@ -27,6 +28,7 @@
# define dcgettext(Domain,Message,Type) (Message)
# define bindtextdomain(Domain,Directory) (Domain)
# define _(String) (String)
# define Q_(String) g_strip_context ((String), (String))
# define N_(String) (String)
#endif

182
src/table.c Normal file
View File

@ -0,0 +1,182 @@
#include "cup.h"
#include "league.h"
#include "maths.h"
#include "table.h"
#include "variables.h"
/** Return a nullified table element.
@param team The team pointer of the element.
@param clid The cup/league id.
@param round The cup round.
@see #TableElement */
TableElement
table_element_new(Team *team)
{
gint i;
TableElement new;
new.team = team;
for(i=0;i<TABLE_END;i++)
new.values[i] = 0;
return new;
}
/** Update the appropriate table entries after
a fixture has been calculated.
@param fix The fixture that's just been calculated. */
void
table_update(const Fixture *fix)
{
gint i;
gint idx = (fix->result[0][0] < fix->result[1][0]);
TableElement *elements[2] = {NULL, NULL};
table_update_get_elements(elements, fix);
for(i=0;i<2;i++)
{
elements[i]->values[TABLE_PLAYED]++;
elements[i]->values[TABLE_GF] += fix->result[i][0];
elements[i]->values[TABLE_GA] += fix->result[!i][0];
}
if(fix->result[0][0] == fix->result[1][0])
for(i=0;i<2;i++)
{
elements[i]->values[TABLE_DRAW]++;
elements[i]->values[TABLE_PTS] += 1;
}
else
{
elements[idx]->values[TABLE_WON]++;
elements[idx]->values[TABLE_PTS] += 3;
elements[!idx]->values[TABLE_LOST]++;
}
}
/** Get the pointers to the table entries
representing the two teams from the fixture.
@param elements The table entries.
@fix The fixture. */
void
table_update_get_elements(TableElement **elements, const Fixture *fix)
{
gint i, j;
Table *table;
if(fix->clid < ID_CUP_START)
{
table = &league_from_clid(fix->clid)->table;
for(i=0;i<table->elements->len;i++)
{
if(g_array_index(table->elements, TableElement, i).team == fix->teams[0])
elements[0] = &g_array_index(table->elements, TableElement, i);
else if(g_array_index(table->elements, TableElement, i).team == fix->teams[1])
elements[1] = &g_array_index(table->elements, TableElement, i);
}
}
else
for(i=0;i<cup_from_clid(fix->clid)->tables->len;i++)
{
table = &g_array_index(cup_from_clid(fix->clid)->tables, Table, i);
if(elements[0] == NULL || elements[1] == NULL)
for(j=0;j<table->elements->len;j++)
{
if(g_array_index(table->elements, TableElement, j).team == fix->teams[0])
elements[0] = &g_array_index(table->elements, TableElement, j);
else if(g_array_index(table->elements, TableElement, j).team == fix->teams[1])
elements[1] = &g_array_index(table->elements, TableElement, j);
}
}
}
/** Compare function used to sort the tables.
@param a The first table element.
@param b The second element.
@param clid_round The clid and the cup round of the table
encoded as a gpointer. */
gint
table_element_compare_func(gconstpointer a,
gconstpointer b,
gpointer clid_pointer)
{
gint i;
gint clid, cup_round, value;
TableElement *element1 = (TableElement*)a,
*element2 = (TableElement*)b;
GArray *fixtures;
const Fixture *fix[2] = {NULL, NULL};
if(element1->team == element2->team)
return 0;
clid = GPOINTER_TO_INT(clid_pointer);
if(clid < ID_CUP_START)
{
cup_round = -1;
fixtures = league_from_clid(clid)->fixtures;
}
else
{
cup_round = g_array_index(cup_from_clid(clid)->tables, Table, 0).round;
fixtures = cup_from_clid(clid)->fixtures;
}
if(element1->values[TABLE_PTS] > element2->values[TABLE_PTS])
value = -1;
else if(element1->values[TABLE_PTS] < element2->values[TABLE_PTS])
value = 1;
else if(element1->values[TABLE_GF] - element1->values[TABLE_GA] >
element2->values[TABLE_GF] - element2->values[TABLE_GA])
value = -1;
else if(element1->values[TABLE_GF] - element1->values[TABLE_GA] <
element2->values[TABLE_GF] - element2->values[TABLE_GA])
value = 1;
else if(element1->values[TABLE_GA] > element2->values[TABLE_GA])
value = -1;
else if(element1->values[TABLE_GA] < element2->values[TABLE_GA])
value = 1;
else
{
for(i=0;i<fixtures->len;i++)
{
if(g_array_index(fixtures, Fixture, i).round == cup_round &&
g_array_index(fixtures, Fixture, i).week_number <= week &&
g_array_index(fixtures, Fixture, i).week_round_number <= week_round)
{
if(g_array_index(fixtures, Fixture, i).teams[0] == element1->team &&
g_array_index(fixtures, Fixture, i).teams[1] == element2->team)
fix[0] = &g_array_index(fixtures, Fixture, i);
else if(g_array_index(fixtures, Fixture, i).teams[1] == element1->team &&
g_array_index(fixtures, Fixture, i).teams[0] == element2->team)
fix[1] = &g_array_index(fixtures, Fixture, i);
}
}
if(fix[0] == NULL || fix[1] == NULL)
value = -1;
else
{
if(fix[0]->result[0][0] + fix[1]->result[1][0] >
fix[0]->result[1][0] + fix[1]->result[0][0])
value = -1;
else if(fix[0]->result[0][0] + fix[1]->result[1][0] <
fix[0]->result[1][0] + fix[1]->result[0][0])
value = 1;
else if(fix[1]->result[1][0] > fix[0]->result[1][0])
value = -1;
else
value = 1;
}
}
return value;
}

23
src/table.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef TABLE_H
#define TABLE_H
#include "bygfoot.h"
#include "fixture_struct.h"
#include "table_struct.h"
TableElement
table_element_new(Team *team);
void
table_update(const Fixture *fix);
void
table_update_get_elements(TableElement **elements, const Fixture *fix);
gint
table_element_compare_func(gconstpointer a,
gconstpointer b,
gpointer clid_round);
#endif

View File

@ -40,6 +40,8 @@ typedef struct
{
GString *name;
gint clid;
/** The cup round (or -1 if it's a league). */
gint round;
GArray *elements;
} Table;

View File

@ -3,35 +3,12 @@
#include "free.h"
#include "league.h"
#include "maths.h"
#include "option.h"
#include "player.h"
#include "team.h"
#include "user.h"
#include "variables.h"
/**
Constants determining the probabilities for
the playing styles of CPU teams.
@see team_assign_playing_style().
*/
#define CONSTANT_TEAM_PLAYING_STYLE_PROB1 0.1
#define CONSTANT_TEAM_PLAYING_STYLE_PROB2 0.25
#define CONSTANT_TEAM_PLAYING_STYLE_PROB3 0.75
#define CONSTANT_TEAM_PLAYING_STYLE_PROB4 0.9
/**
Constants determining the probabilities for
the playing structures of CPU teams.
@see team_assign_playing_structure().
*/
#define CONSTANT_TEAM_PLAYING_STRUCTURE_PROB1 0.15
#define CONSTANT_TEAM_PLAYING_STRUCTURE_PROB2 0.5
#define CONSTANT_TEAM_PLAYING_STRUCTURE_PROB3 0.7
#define CONSTANT_TEAM_PLAYING_STRUCTURE_PROB4 0.85
/** Kinda hard to explain.
@see team_generate_players()
@see player_generate() */
#define CONSTANT_TEAM_SKILL_VARIANCE 0.2//0.075/*d*/
/**
Generate a team with default values, e.g.
random playing structure and an empty string
@ -60,7 +37,6 @@ team_new(void)
/**
Return a random playing style.
@see The #TeamPlayingStyle enumeration.
@see The #CONSTANT_TEAM_PLAYING_STYLE_PROB1 define.
*/
gint
team_assign_playing_style(void)
@ -70,16 +46,16 @@ team_assign_playing_style(void)
rndom = math_rnd(0,1);
/* all out defend */
if(rndom < CONSTANT_TEAM_PLAYING_STYLE_PROB1)
if(rndom < const_float("float_team_playing_style_prob1"))
return -2;
/* defend */
else if(rndom < CONSTANT_TEAM_PLAYING_STYLE_PROB2)
else if(rndom < const_float("float_team_playing_style_prob2"))
return -1;
/* balanced */
else if(rndom < CONSTANT_TEAM_PLAYING_STYLE_PROB3)
else if(rndom < const_float("float_team_playing_style_prob3"))
return 0;
/* attack */
else if(rndom < CONSTANT_TEAM_PLAYING_STYLE_PROB4)
else if(rndom < const_float("float_team_playing_style_prob4"))
return 1;
/* all out attack */
@ -88,20 +64,19 @@ team_assign_playing_style(void)
/**
Return a random playing structure.
@see The #CONSTANT_TEAM_PLAYING_STRUCTURE_PROB1 define.
*/
gint
team_assign_playing_structure(void)
{
gfloat rndom = math_rnd(0,1);
if(rndom < CONSTANT_TEAM_PLAYING_STRUCTURE_PROB1)
if(rndom < const_float("float_team_playing_structure_prob1"))
return 532;
else if(rndom < CONSTANT_TEAM_PLAYING_STRUCTURE_PROB2)
else if(rndom < const_float("float_team_playing_structure_prob2"))
return 442;
else if(rndom < CONSTANT_TEAM_PLAYING_STRUCTURE_PROB3)
else if(rndom < const_float("float_team_playing_structure_prob3"))
return 352;
else if(rndom < CONSTANT_TEAM_PLAYING_STRUCTURE_PROB4)
else if(rndom < const_float("float_team_playing_structure_prob4"))
return 433;
return 343;
@ -128,8 +103,8 @@ void
team_generate_players(Team *tm)
{
gint i;
gfloat skill_factor = math_rnd(1 - CONSTANT_TEAM_SKILL_VARIANCE,
1 + CONSTANT_TEAM_SKILL_VARIANCE);
gfloat skill_factor = math_rnd(1 - const_float("float_team_skill_variance"),
1 + const_float("float_team_skill_variance"));
Player new;
gint average_skill;
@ -143,9 +118,9 @@ team_generate_players(Team *tm)
(gfloat)team_return_league_cup_value_int(tm, LEAGUE_CUP_VALUE_SKILL_DIFF)) *
skill_factor;
average_skill = CLAMP(average_skill, 0, CONSTANT_PLAYER_MAX_SKILL);
average_skill = CLAMP(average_skill, 0, const_int("int_player_max_skill"));
for(i=0;i<CONSTANT_TEAM_MAX_PLAYERS;i++)
for(i=0;i<const_int("int_team_max_players");i++)
{
new = player_new(tm, average_skill);
g_array_append_val(tm->players, new);
@ -218,7 +193,7 @@ team_get_league_cup_string(const Team *tm, gint value_type, gchar *buf)
{
gint idx = league_cup_get_index_from_clid(tm->clid);
if(tm->clid >= ID_CUP_START)
if(tm->clid < ID_CUP_START)
switch(value_type)
{
default:
@ -273,7 +248,7 @@ team_copy(const Team *source, Team *dest)
for(i=0;i<source->players->len;i++)
{
new_player = player_new(dest, CONSTANT_PLAYER_MAX_SKILL);
new_player = player_new(dest, const_int("int_player_max_skill"));
free_player(&new_player);
player_copy(&g_array_index(source->players, Player, i),
&new_player);
@ -487,17 +462,162 @@ team_get_next_fixture(const Team *tm)
return fix;
}
/** Calculate the average cskill of the first 11 players.
@param tm The team we examine.
@return The average skill. */
gfloat
team_average_cskill(const Team *tm)
/** Check whether the team is a user-managed team.
@param tm The team we examine.
@return The user's index in the #users array or -1.*/
gint
team_is_user(const Team *tm)
{
gint i;
for(i=0;i<users->len;i++)
if(usr(i).tm == tm)
return i;
return -1;
}
/** Return the overall average skill or
the cskill of the first 11 players.
@param tm The team we examine.
@param cskill Whether to take into account all players. */
gfloat
team_get_average_skill(const Team *tm, gboolean cskill)
{
gint i, counter = 0;
gfloat sum = 0;
for(i=0;i<MIN(11, tm->players->len);i++)
sum += ((gfloat)player_of(tm, i)->cskill * powf((gfloat)player_of(tm, i)->fitness / 100, 0.25));
if(!cskill)
{
for(i=0;i<tm->players->len;i++)
if(player_of(tm, i)->cskill != 0)
{
sum += player_of(tm, i)->skill;
counter++;
}
}
else
for(i=0;i<11;i++)
{
sum += player_of(tm, i)->cskill *
powf((gfloat)player_of(tm, i)->fitness / 100,
const_float("float_player_fitness_exponent"));
counter++;
}
return sum / (gfloat)(i - 1);
return sum / (gfloat)counter;
}
/** Return the rank of the team.
@param tm The team we examine. */
gint
team_rank(const Team *tm)
{
gint i, j;
GArray *elements = NULL;
if(tm->clid < ID_CUP_START)
{
elements = league_from_clid(tm->clid)->table.elements;
for(i=0;i<elements->len;i++)
if(g_array_index(elements, TableElement, i).team == tm)
return i + 1;
}
else
{
for(i=0;i<cup_from_clid(tm->clid)->tables->len;i++)
{
elements = g_array_index(cup_from_clid(tm->clid)->tables, Table, i).elements;
for(j=0;j<elements->len;j++)
if(g_array_index(elements, TableElement, j).team == tm)
return j + 1;
}
}
return -1;
}
/** Return the structure that fits the positions of
the first 11 players.
@param tm The team we examine.
@return A new structure. */
gint
team_find_appropriate_structure(const Team *tm)
{
gint i;
gint structure = 0;
for(i=1;i<11;i++)
{
if(player_of(tm, i)->pos == PLAYER_POS_DEFENDER)
structure += 100;
else if(player_of(tm, i)->pos == PLAYER_POS_MIDFIELDER)
structure += 10;
else
structure++;
}
return structure;
}
/** Change the structure of a team and the appropriate
cpos and cskill values.
@param tm The team.
@param new_structure The new structure value, e.g. 442. */
void
team_change_structure(Team *tm, gint new_structure)
{
gint i;
tm->structure = new_structure;
for(i=1;i<11;i++)
{
player_of(tm, i)->cpos =
player_get_position_from_structure(new_structure, i);
player_of(tm, i)->cskill =
player_get_cskill(player_of(tm, i));
}
}
/* Try to set each of the first 11 players on his
favoured position and sort the substitutes by position.
@param tm The team we rearrange. */
void
team_rearrange(Team *tm)
{
gint i, j;
/* reaarrange field players */
for(i=0;i<11;i++)
{
if(player_of(tm, i)->pos !=
player_of(tm, i)->cpos)
{
for(j=i+1;j<11;j++)
if(player_of(tm, j)->pos ==
player_of(tm, i)->cpos &&
player_of(tm, j)->cskill > 0)
{
player_swap(tm, i, tm, j);
break;
}
}
}
/* sort substitutes */
i = 11;
while(i != tm->players->len)
{
for(j=i+1;j<tm->players->len;j++)
if(player_of(tm, i)->pos >
player_of(tm, j)->pos)
{
player_swap(tm, i, tm, j);
i = 10;
break;
}
i++;
}
}

View File

@ -6,9 +6,6 @@
#include "fixture_struct.h"
#include "team_struct.h"
/** Maximum number of players in a team. */
#define CONSTANT_TEAM_MAX_PLAYERS 20
Team
team_new(void);
@ -64,6 +61,21 @@ Fixture*
team_get_next_fixture(const Team *tm);
gfloat
team_average_cskill(const Team *tm);
team_get_average_skill(const Team *tm, gboolean cskill);
gint
team_is_user(const Team *tm);
gint
team_rank(const Team *tm);
void
team_change_structure(Team *tm, gint new_structure);
gint
team_find_appropriate_structure(const Team *tm);
void
team_rearrange(Team *tm);
#endif

View File

@ -4,9 +4,6 @@
#include "bygfoot.h"
#include "team.h"
#define CONSTANT_TRANSFER_MAX_PLAYERS 20
#define CONSTANT_TRANSFER_DEADLINE 35
/** Structure representing a player on the transfer list. */
typedef struct
{

View File

@ -7,69 +7,30 @@
#include "live_game.h"
#include "maths.h"
#include "misc.h"
#include "option.h"
#include "support.h"
#include "team.h"
#include "treeview.h"
#include "treeview_cell.h"
#include "user.h"
#include "variables.h"
#include "window.h"
/** Return the filename of the icon going with the LiveGameEvent
with type event_type.
@param event_type The type of the event.
@return A filename specifying a pixmap. */
gchar*
treeview_live_game_icon(gint event_type)
/** Select the row that's been clicked on. */
void
treeview_select_row(GtkTreeView *treeview, GdkEventButton *event)
{
switch(event_type)
{
default:
return "";
break;
case LIVE_GAME_EVENT_FOUL_YELLOW:
return "yellow.png";
break;
case LIVE_GAME_EVENT_FOUL_RED:
return "red.png";
break;
case LIVE_GAME_EVENT_SEND_OFF:
return "red.png";
break;
case LIVE_GAME_EVENT_SAVE:
return "save.png";
break;
case LIVE_GAME_EVENT_GOAL:
return "goal.png";
break;
}
GtkTreeSelection *selection =
gtk_tree_view_get_selection(treeview);
GtkTreePath *path;
if(!gtk_tree_view_get_path_at_pos(treeview,
event->x, event->y,
&path, NULL, NULL, NULL))
return;
return "";
}
/** Return a new pixbuf created from the specified filename.
@param filename Name of a pixmap file located in one of the support directories.
@return A new pixbuf or NULL on error. */
GdkPixbuf*
treeview_pixbuf_from_filename(gchar *filename)
{
GdkPixbuf *symbol = NULL;
GError *error = NULL;
gchar *symbol_file = NULL;
if(filename != NULL && strlen(filename) != 0)
{
symbol_file = file_find_support_file(filename);
if(symbol_file != NULL)
{
symbol = gdk_pixbuf_new_from_file(symbol_file, &error);
misc_print_error(&error, FALSE);
g_free(symbol_file);
}
}
else
symbol = NULL;
return symbol;
gtk_tree_selection_select_path(selection, path);
gtk_tree_path_free(path);
}
/** Return the number in the 'column'th column of the currently
@ -130,7 +91,7 @@ treeview_clear(GtkTreeView *treeview)
gint i;
gint number_of_columns;
GtkTreeView *list = (treeview == NULL) ?
GTK_TREE_VIEW(lookup_widget(main_window, "player_info")) :
GTK_TREE_VIEW(lookup_widget(window.main, "player_info")) :
treeview;
gtk_tree_view_set_model(GTK_TREE_VIEW(list),
@ -167,6 +128,64 @@ treeview_get_col_number_column (GtkTreeViewColumn *col)
return num;
}
/** Return the filename of the icon going with the LiveGameEvent
with type event_type.
@param event_type The type of the event.
@return A filename specifying a pixmap. */
gchar*
treeview_live_game_icon(gint event_type)
{
switch(event_type)
{
default:
return "";
break;
case LIVE_GAME_EVENT_FOUL_YELLOW:
return "yellow.png";
break;
case LIVE_GAME_EVENT_FOUL_RED:
return "red.png";
break;
case LIVE_GAME_EVENT_SEND_OFF:
return "red.png";
break;
case LIVE_GAME_EVENT_SAVE:
return "save.png";
break;
case LIVE_GAME_EVENT_GOAL:
return "goal.png";
break;
}
return "";
}
/** Return a new pixbuf created from the specified filename.
@param filename Name of a pixmap file located in one of the support directories.
@return A new pixbuf or NULL on error. */
GdkPixbuf*
treeview_pixbuf_from_filename(gchar *filename)
{
GdkPixbuf *symbol = NULL;
GError *error = NULL;
gchar *symbol_file = NULL;
if(filename != NULL && strlen(filename) != 0)
{
symbol_file = file_find_support_file(filename);
if(symbol_file != NULL)
{
symbol = gdk_pixbuf_new_from_file(symbol_file, &error);
misc_print_error(&error, FALSE);
g_free(symbol_file);
}
}
else
symbol = NULL;
return symbol;
}
/**
Creates the model for the treeview in the team selection window.
The model contains a list of all the teams from the leagues in
@ -174,10 +193,11 @@ treeview_get_col_number_column (GtkTreeViewColumn *col)
teams from international cups are shown, too.
@param show_cup_teams Whether or not teams from international
cups are shown.
@param show_user_teams Whether or not user teams are shown.
@return The model containing the team names.
*/
GtkTreeModel*
treeview_create_team_selection_list(gboolean show_cup_teams)
treeview_create_team_selection_list(gboolean show_cup_teams, gboolean show_user_teams)
{
gint i, j, cnt = 1;
GtkListStore *liststore;
@ -196,13 +216,16 @@ treeview_create_team_selection_list(gboolean show_cup_teams)
for(j=0;j<lig(i).teams->len;j++)
{
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter,
0, cnt++,
1, symbol,
2, (gpointer)&g_array_index(lig(i).teams, Team, j),
3, lig(i).name->str,
-1);
if(team_is_user(&g_array_index(lig(i).teams, Team, j)) == -1)
{
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter,
0, cnt++,
1, symbol,
2, (gpointer)&g_array_index(lig(i).teams, Team, j),
3, lig(i).name->str,
-1);
}
}
if(symbol != NULL)
@ -257,8 +280,6 @@ treeview_set_up_team_selection_treeview (GtkTreeView *treeview)
gtk_tree_view_column_pack_start(col, renderer, TRUE);
gtk_tree_view_column_add_attribute(col, renderer,
"text", 0);
if(strcmp(font_name->str, "0") != 0)
g_object_set(renderer, "font", font_name->str, NULL);
/* Flags */
col = gtk_tree_view_column_new();
@ -293,12 +314,14 @@ treeview_set_up_team_selection_treeview (GtkTreeView *treeview)
@param treeview The treeview we show the list in.
@param show_cup_teams Whether or not teams from international
cups are shown.
@param show_user_teams Whether or not user teams are shown.
*/
void
treeview_show_team_list(GtkTreeView *treeview, gboolean show_cup_teams)
treeview_show_team_list(GtkTreeView *treeview, gboolean show_cup_teams,
gboolean show_user_teams)
{
GtkTreeModel *team_list =
treeview_create_team_selection_list(show_cup_teams);
treeview_create_team_selection_list(show_cup_teams, show_user_teams);
GtkTreeSelection *selection;
treeview_clear(treeview);
@ -337,7 +360,7 @@ treeview_create_player_list(GPtrArray *players, gint *attributes, gint max, gboo
gtk_list_store_append(liststore, &iter);
if(show_separator && i == 11)
{
gtk_list_store_set(liststore, &iter, 0, CONSTANT_TREEVIEW_CELL_INT_EMPTY, -1);
gtk_list_store_set(liststore, &iter, 0, const_int("int_treeview_cell_int_empty"), -1);
for(j=0;j<max;j++)
gtk_list_store_set(liststore, &iter, j + 1, NULL, -1);
@ -418,7 +441,7 @@ treeview_set_up_player_list (GtkTreeView *treeview, gint *attributes, gint max)
player attributes according to 'attrib'.
@param treeview The treeview we fill.
@param players The pointer array with the players. We free it afterwards.
@param attrib The #PlayerListAttrib that determines which attributes to show.
@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,
@ -445,16 +468,19 @@ treeview_show_player_list(GtkTreeView *treeview, GPtrArray *players, PlayerListA
}
/** Show the list of the user's players in the left view.
@param user The user we show the players of.
@param player_list The tab we use. */
void
treeview_show_user_player_list(gint player_list)
treeview_show_user_player_list(const User *user, gint player_list)
{
PlayerListAttribute attribute;
GtkWidget *treeview = (player_list == 1) ?
lookup_widget(main_window, "player_list1") :
lookup_widget(main_window, "player_list2");
lookup_widget(window.main, "player_list1") :
lookup_widget(window.main, "player_list2");
treeview_show_player_list(GTK_TREE_VIEW(treeview), team_get_player_pointers(my_team),
player_list_attributes[(player_list != 1)], TRUE);
user_set_player_list_attributes(user, &attribute, player_list);
treeview_show_player_list(GTK_TREE_VIEW(treeview),
team_get_player_pointers(user->tm), attribute, TRUE);
}
/** Show the commentary and the minute belonging to the unit.
@ -465,11 +491,11 @@ treeview_live_game_show_commentary(const LiveGameUnit *unit)
GdkPixbuf *symbol = NULL;
GtkAdjustment *adjustment =
gtk_scrolled_window_get_vadjustment(
GTK_SCROLLED_WINDOW(lookup_widget(live_game.window,
GTK_SCROLLED_WINDOW(lookup_widget(window.live,
"scrolledwindow9")));
GtkListStore *liststore =
GTK_LIST_STORE(
gtk_tree_view_get_model(GTK_TREE_VIEW(lookup_widget(live_game.window, "treeview_commentary"))));
gtk_tree_view_get_model(GTK_TREE_VIEW(lookup_widget(window.live, "treeview_commentary"))));
GtkTreeIter iter;
gchar buf[SMALL];
@ -494,7 +520,6 @@ treeview_live_game_show_commentary(const LiveGameUnit *unit)
GtkTreeModel*
treeview_live_game_create_init_commentary(const LiveGameUnit *unit)
{
gint i, j;
GtkListStore *liststore;
GtkTreeIter iter;
GdkPixbuf *symbol = NULL;
@ -525,7 +550,7 @@ void
treeview_live_game_set_up_commentary(void)
{
GtkTreeView *treeview =
GTK_TREE_VIEW(lookup_widget(live_game.window, "treeview_commentary"));
GTK_TREE_VIEW(lookup_widget(window.live, "treeview_commentary"));
GtkTreeViewColumn *col;
GtkCellRenderer *renderer;
@ -560,7 +585,7 @@ void
treeview_live_game_show_initial_commentary(const LiveGameUnit *unit)
{
GtkTreeView *treeview =
GTK_TREE_VIEW(lookup_widget(live_game.window, "treeview_commentary"));
GTK_TREE_VIEW(lookup_widget(window.live, "treeview_commentary"));
GtkTreeModel *model = NULL;
treeview_clear(treeview);
@ -595,8 +620,8 @@ treeview_live_game_create_result(const LiveGameUnit *unit)
GDK_TYPE_PIXBUF);
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter, 0, NULL, 1, (gpointer)live_game.fix,
2, (gpointer)live_game.fix, 3, (gpointer)live_game.fix, 4, NULL, -1);
gtk_list_store_set(liststore, &iter, 0, NULL, 1, (gpointer)usr(stat2).live_game.fix,
2, (gpointer)unit, 3, (gpointer)usr(stat2).live_game.fix, 4, NULL, -1);
gtk_list_store_set(liststore, &iter, 0 + (unit->possession == 1) * 4, symbol, -1);
@ -611,7 +636,7 @@ void
treeview_live_game_set_up_result(void)
{
GtkTreeView *treeview =
GTK_TREE_VIEW(lookup_widget(live_game.window, "treeview_result"));
GTK_TREE_VIEW(lookup_widget(window.live, "treeview_result"));
GtkTreeViewColumn *col;
GtkCellRenderer *renderer;
@ -664,7 +689,7 @@ void
treeview_live_game_show_result(const LiveGameUnit *unit)
{
GtkTreeView *treeview =
GTK_TREE_VIEW(lookup_widget(live_game.window, "treeview_result"));
GTK_TREE_VIEW(lookup_widget(window.live, "treeview_result"));
GtkTreeModel *model = NULL;
treeview_clear(treeview);
@ -677,3 +702,88 @@ treeview_live_game_show_result(const LiveGameUnit *unit)
gtk_tree_view_set_model(treeview, model);
g_object_unref(model);
}
/** Fill a tree model with the users. */
GtkTreeModel*
treeview_create_users_startup(void)
{
gint i;
GtkListStore *liststore;
GtkTreeIter iter;
liststore = gtk_list_store_new(4,
G_TYPE_INT,
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING);
for(i=0;i<users->len;i++)
{
gtk_list_store_append(liststore, &iter);
gtk_list_store_set(liststore, &iter, 0, i + 1,
1, usr(i).name->str,
2, usr(i).tm->name->str,
-1);
if(stat0 == STATUS_TEAM_SELECTION && usr(i).scout != 0)
{
if(usr(i).scout == 1)
gtk_list_store_set(liststore, &iter, 3,
lig(0).name->str, -1);
else
gtk_list_store_set(liststore, &iter, 3,
lig(ligs->len - 1).name->str, -1);
}
else
gtk_list_store_set(liststore, &iter, 3,
league_from_clid(usr(i).tm->clid)->name->str, -1);
}
return GTK_TREE_MODEL(liststore);
}
/** Set up the users treeview.
@param treeview The treeview we use. */
void
treeview_set_up_users_startup(GtkTreeView *treeview)
{
gint i;
GtkTreeViewColumn *col;
GtkCellRenderer *renderer;
gchar *titles[4] =
{_(""),
_("Name"),
_("Team"),
_("Start in")};
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(treeview),
GTK_SELECTION_SINGLE);
for(i=0;i<4;i++)
{
col = gtk_tree_view_column_new();
gtk_tree_view_column_set_title(col, titles[i]);
gtk_tree_view_append_column(treeview, col);
renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(col, renderer, TRUE);
gtk_tree_view_column_add_attribute(col, renderer,
"text", i);
}
}
/** Show the list of users at startup.
@param treeview The treeview we use. */
void
treeview_show_users_startup(void)
{
GtkTreeView *treeview =
GTK_TREE_VIEW(lookup_widget(window.startup_users, "treeview_users"));
GtkTreeModel *model = NULL;
treeview_clear(treeview);
gtk_tree_view_set_headers_visible(treeview, TRUE);
treeview_set_up_users_startup(treeview);
model = treeview_create_users_startup();
gtk_tree_view_set_model(treeview, model);
g_object_unref(model);
}

View File

@ -4,6 +4,10 @@
#include "bygfoot.h"
#include "live_game_struct.h"
#include "player_struct.h"
#include "user_struct.h"
void
treeview_select_row(GtkTreeView *treeview, GdkEventButton *event);
GdkPixbuf*
treeview_pixbuf_from_filename(gchar *filename);
@ -24,13 +28,15 @@ gint
treeview_get_col_number_column (GtkTreeViewColumn *col);
GtkTreeModel*
treeview_create_team_selection_list(gboolean show_cup_teams);
treeview_create_team_selection_list(gboolean show_cup_teams,
gboolean show_user_teams);
void
treeview_set_up_team_selection_treeview (GtkTreeView *treeview);
void
treeview_show_team_list(GtkTreeView *treeview, gboolean show_cup_teams);
treeview_show_team_list(GtkTreeView *treeview, gboolean show_cup_teams,
gboolean show_user_teams);
GtkTreeModel*
treeview_create_player_list(GPtrArray *players, gint *attributes, gint max, gboolean show_separator);
@ -43,7 +49,7 @@ treeview_show_player_list(GtkTreeView *treeview, GPtrArray *players, PlayerListA
gboolean show_separator);
void
treeview_show_user_player_list(gint player_list);
treeview_show_user_player_list(const User *user, gint player_list);
void
treeview_live_game_show_commentary(const LiveGameUnit *unit);
@ -69,4 +75,13 @@ treeview_live_game_set_up_result(void);
void
treeview_live_game_show_result(const LiveGameUnit *unit);
void
treeview_show_users_startup(void);
GtkTreeModel*
treeview_create_users_startup(void);
void
treeview_set_up_users_startup(GtkTreeView *treeview);
#endif

View File

@ -1,49 +1,12 @@
#include "maths.h"
#include "misc.h"
#include "option.h"
#include "player.h"
#include "team.h"
#include "treeview.h"
#include "treeview_cell.h"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_GOALIE_BG "Black"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_GOALIE_FG "White"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_DEFENDER_BG "Darkgreen"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_DEFENDER_FG "White"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_MIDFIELDER_BG "Darkblue"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_MIDFIELDER_FG "White"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_FORWARD_BG "Darkred"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_FORWARD_FG "White"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_INJURY "Lightgreen"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_BANNED "Red"
#define CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_FITNESS_BELOW1 85
#define CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_FITNESS_BELOW2 70
#define CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_FITNESS_BELOW3 60
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_FITNESS_NORMAL "DarkGreen"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_FITNESS_BELOW1 "DarkOrange"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_FITNESS_BELOW2 "OrangeRed"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_FITNESS_BELOW3 "Red"
#define CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_CONTRACT_BELOW1 52
#define CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_CONTRACT_BELOW2 40
#define CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_CONTRACT_BELOW3 20
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_CONTRACT_NORMAL "DarkGreen"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_CONTRACT_BELOW1 "DarkOrange"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_CONTRACT_BELOW2 "OrangeRed"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_CONTRACT_BELOW3 "Red"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_BAD_CSKILL_BG "Lightblue"
#define CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_BAD_CSKILL_FG "Red"
/** Font attributes for the live game window result. */
#define CONSTANT_TREEVIEW_CELL_LIVE_GAME_RESULT_ATTRIBUTES "weight='bold' size='large'"
/* #define CONSTANT_TREEVIEW_CELL_COLOR_ "" */
/* #define CONSTANT_TREEVIEW_CELL_COLOR_ "" */
/* #define CONSTANT_TREEVIEW_CELL_COLOR_ "" */
/* #define CONSTANT_TREEVIEW_CELL_COLOR_ "" */
#include "user.h"
#include "variables.h"
/** Render a cell in the team selection treeview.
@see The GTK reference. */
@ -57,9 +20,6 @@ treeview_cell_team_selection(GtkTreeViewColumn *col,
gint column = GPOINTER_TO_INT(user_data);
gpointer team_pointer;
if(strcmp(font_name->str, "0") != 0)
g_object_set(renderer, "font", font_name->str, NULL);
gtk_tree_model_get(model, iter, column, &team_pointer, -1);
if(column == 2)
@ -68,8 +28,7 @@ treeview_cell_team_selection(GtkTreeViewColumn *col,
g_warning("treeview_cell_team_selection: unknown column: %d\n", column);
}
/** Render an integer. This is only so that we know when to draw nothing.
@see #CONSTANT_TREEVIEW_CELL_INT_EMPTY */
/** Render an integer. This is only so that we know when to draw nothing. */
void
treeview_cell_int_to_cell(GtkTreeViewColumn *col,
GtkCellRenderer *renderer,
@ -81,12 +40,12 @@ treeview_cell_int_to_cell(GtkTreeViewColumn *col,
gint value;
gchar buf[SMALL];
if(strcmp(font_name->str, "0") != 0)
g_object_set(renderer, "font", font_name->str, NULL);
if(strcmp(usr(current_user).font_name->str, "0") != 0)
g_object_set(renderer, "font", usr(current_user).font_name->str, NULL);
gtk_tree_model_get(model, iter, column, &value, -1);
if(value == CONSTANT_TREEVIEW_CELL_INT_EMPTY)
if(value == const_int("int_treeview_cell_int_empty"))
strcpy(buf, "");
else
sprintf(buf, "%d", value);
@ -109,11 +68,11 @@ treeview_cell_player_to_cell(GtkTreeViewColumn *col,
bg_color[SMALL];
Player *pl;
if(strcmp(font_name->str, "0") != 0)
g_object_set(renderer, "font", font_name->str, NULL);
if(strcmp(usr(current_user).font_name->str, "0") != 0)
g_object_set(renderer, "font", usr(current_user).font_name->str, NULL);
strcpy(fg_color, "black");
strcpy(bg_color, "white");
strcpy(fg_color, const_str("string_treeview_cell_color_default_foreground"));
strcpy(bg_color, const_str("string_treeview_cell_color_default_background"));
strcpy(buf, "");
gtk_tree_model_get(model, iter, column, &pl, -1);
@ -136,7 +95,7 @@ treeview_cell_player_to_cell(GtkTreeViewColumn *col,
treeview_cell_player_pos_to_cell(renderer, buf, pl->pos);
break;
case PLAYER_LIST_ATTRIBUTE_CSKILL:
sprintf(buf, "%d", pl->cskill);
treeview_cell_player_cskill_to_cell(renderer, buf, pl);
break;
case PLAYER_LIST_ATTRIBUTE_SKILL:
sprintf(buf, "%d", pl->skill);
@ -161,7 +120,7 @@ treeview_cell_player_to_cell(GtkTreeViewColumn *col,
sprintf(buf, "%d", (gint)rint((gfloat)pl->age / 52));
break;
case PLAYER_LIST_ATTRIBUTE_ETAL:
sprintf(buf, "%d", pl->etal);
sprintf(buf, "%d", pl->etal[usr(current_user).scout % 10]);
break;
case PLAYER_LIST_ATTRIBUTE_VALUE:
misc_print_grouped_int(pl->value, buf, FALSE);
@ -192,14 +151,18 @@ treeview_cell_player_contract_to_cell(GtkCellRenderer *renderer, gchar *buf, gin
{
sprintf(buf, "%.1f", (gfloat)contract_time / 52);
if(contract_time < CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_CONTRACT_BELOW3)
g_object_set(renderer, "foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_CONTRACT_BELOW3, NULL);
else if(contract_time < CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_CONTRACT_BELOW2)
g_object_set(renderer, "foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_CONTRACT_BELOW2, NULL);
else if(contract_time < CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_CONTRACT_BELOW1)
g_object_set(renderer, "foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_CONTRACT_BELOW1, NULL);
if(contract_time < const_int("int_treeview_cell_limit_player_contract_below3"))
g_object_set(renderer, "foreground",
const_str("string_treeview_cell_color_player_contract_below3"), NULL);
else if(contract_time < const_int("int_treeview_cell_limit_player_contract_below2"))
g_object_set(renderer, "foreground",
const_str("string_treeview_cell_color_player_contract_below2"), NULL);
else if(contract_time < const_int("int_treeview_cell_limit_player_contract_below1"))
g_object_set(renderer, "foreground",
const_str("string_treeview_cell_color_player_contract_below1"), NULL);
else
g_object_set(renderer, "foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_CONTRACT_NORMAL, NULL);
g_object_set(renderer, "foreground",
const_str("string_treeview_cell_color_player_contract_normal"), NULL);
}
/** Render a cell of player yellow cards.
@ -241,34 +204,29 @@ treeview_cell_player_cards_to_cell(gchar *buf, const Player *pl)
void
treeview_cell_player_status_to_cell(GtkCellRenderer *renderer, gchar *buf, const Player *pl)
{
gint i;
Fixture *fix = team_get_next_fixture(pl->team);
gint ban = player_is_banned(pl);
if(pl->health != PLAYER_INJURY_NONE)
{
sprintf(buf, _("INJ(%d)"), pl->recovery);
g_object_set(renderer, "background",
CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_INJURY, NULL);
const_str("string_treeview_cell_color_player_injury"), NULL);
return;
}
if(fix == NULL)
if(ban > 0)
{
strcpy(buf, "OK");
return;
sprintf(buf, _("BAN(%d)"), ban);
g_object_set(renderer, "background",
const_str("string_treeview_cell_color_player_banned"), NULL);
}
else
strcpy(buf, _("OK"));
for(i=0;i<pl->cards->len;i++)
if(g_array_index(pl->cards, PlayerCard, 0).clid == fix->clid)
{
sprintf(buf, _("BAN(%d)"), g_array_index(pl->cards, PlayerCard, 0).red);
g_object_set(renderer, "background",
CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_BANNED, NULL);
return;
}
strcpy(buf, "OK");
if(ban == -1)
g_object_set(renderer, "background",
const_str("string_treeview_cell_color_player_yellow_danger"), NULL);
}
/** Render a cell of player games or goals.
@ -325,14 +283,18 @@ treeview_cell_player_fitness_to_cell(GtkCellRenderer *renderer, gchar *buf, gint
{
sprintf(buf, "%d%%", fitness);
if(fitness < CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_FITNESS_BELOW3)
g_object_set(renderer, "foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_FITNESS_BELOW3, NULL);
else if(fitness < CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_FITNESS_BELOW2)
g_object_set(renderer, "foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_FITNESS_BELOW2, NULL);
else if(fitness < CONSTANT_TREEVIEW_CELL_LIMIT_PLAYER_FITNESS_BELOW1)
g_object_set(renderer, "foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_FITNESS_BELOW1, NULL);
if(fitness < const_int("int_treeview_cell_limit_player_fitness_below3"))
g_object_set(renderer, "foreground",
const_str("string_treeview_cell_color_player_fitness_below3"), NULL);
else if(fitness < const_int("int_treeview_cell_limit_player_fitness_below2"))
g_object_set(renderer, "foreground",
const_str("string_treeview_cell_color_player_fitness_below2"), NULL);
else if(fitness < const_int("int_treeview_cell_limit_player_fitness_below2"))
g_object_set(renderer, "foreground",
const_str("string_treeview_cell_color_player_fitness_below2"), NULL);
else
g_object_set(renderer, "foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_FITNESS_NORMAL, NULL);
g_object_set(renderer, "foreground",
const_str("string_treeview_cell_color_player_fitness_normal"), NULL);
}
/** Render a cell of player position or cposition.
@ -346,23 +308,31 @@ treeview_cell_player_pos_to_cell(GtkCellRenderer *renderer, gchar *buf, gint pos
{
default:
strcpy(buf, "G");
g_object_set(renderer, "background", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_GOALIE_BG,
"foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_GOALIE_FG, NULL);
g_object_set(renderer, "background",
const_str("string_treeview_cell_color_player_pos_goalie_bg"),
"foreground",
const_str("string_treeview_cell_color_player_pos_goalie_fg"), NULL);
break;
case PLAYER_POS_DEFENDER:
strcpy(buf, "D");
g_object_set(renderer, "background", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_DEFENDER_BG,
"foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_DEFENDER_FG, NULL);
g_object_set(renderer, "background",
const_str("string_treeview_cell_color_player_pos_defender_bg"),
"foreground",
const_str("string_treeview_cell_color_player_pos_defender_fg"), NULL);
break;
case PLAYER_POS_MIDFIELDER:
strcpy(buf, "M");
g_object_set(renderer, "background", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_MIDFIELDER_BG,
"foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_MIDFIELDER_FG, NULL);
g_object_set(renderer, "background",
const_str("string_treeview_cell_color_player_pos_midfielder_bg"),
"foreground",
const_str("string_treeview_cell_color_player_pos_midfielder_fg"), NULL);
break;
case PLAYER_POS_FORWARD:
strcpy(buf, "F");
g_object_set(renderer, "background", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_FORWARD_BG,
"foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_POS_FORWARD_FG, NULL);
g_object_set(renderer, "background",
const_str("string_treeview_cell_color_player_pos_forward_bg"),
"foreground",
const_str("string_treeview_cell_color_player_pos_forward_fg"), NULL);
break;
}
}
@ -375,12 +345,20 @@ void
treeview_cell_player_cskill_to_cell(GtkCellRenderer *renderer, gchar *buf, const Player *pl)
{
sprintf(buf, "%d", (gint)rint((gfloat)pl->cskill *
powf((gfloat)pl->fitness,
CONSTANT_PLAYER_FITNESS_IMPACT_ON_SKILL)));
powf((gfloat)pl->fitness / 100,
const_float("float_player_fitness_impact_on_skill"))));
if(pl->cskill < pl->skill)
g_object_set(renderer, "background", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_BAD_CSKILL_BG,
"foreground", CONSTANT_TREEVIEW_CELL_COLOR_PLAYER_BAD_CSKILL_FG, NULL);
g_object_set(renderer, "background",
const_str("string_treeview_cell_color_player_bad_cskill_bg"),
"foreground",
const_str("string_treeview_cell_color_player_bad_cskill_bg"), NULL);
else
g_object_set(renderer, "background",
const_str("string_treeview_cell_color_default_background"),
"foreground",
const_str("string_treeview_cell_color_default_foreground"), NULL);
}
/** Render the result (team names and goals) in the live game view. */
@ -392,29 +370,30 @@ treeview_cell_live_game_result(GtkTreeViewColumn *col,
gpointer user_data)
{
gint i, result[2];
gint column = treeview_get_col_number_column(col);
gchar buf[SMALL];
Fixture *fix;
Fixture *fix = NULL;
LiveGameUnit *unit = NULL;
if(strcmp(font_name->str, "0") != 0)
g_object_set(renderer, "font", font_name->str, NULL);
if(strcmp(usr(current_user).font_name->str, "0") != 0)
g_object_set(renderer, "font", usr(current_user).font_name->str, NULL);
strcpy(buf, "");
gtk_tree_model_get(model, iter, column, &fix, -1);
if(fix != NULL)
if(column == 1 || column == 3)
{
for(i=0;i<2;i++)
result[i] = math_sum_int_array(fix->result[i], 3);
gtk_tree_model_get(model, iter, column, &fix, -1);
sprintf(buf, "<span %s>%s</span>",
const_str("string_treeview_cell_live_game_result_attributes"),
fix->teams[column == 3]->name->str);
}
else if(column == 2)
{
gtk_tree_model_get(model, iter, column, &unit, -1);
sprintf(buf, "<span %s>%d : %d</span>",
const_str("string_treeview_cell_live_game_result_attributes"),
unit->result[0], unit->result[1]);
if(column== 1 || column == 3)
sprintf(buf, "<span %s>%s</span>", CONSTANT_TREEVIEW_CELL_LIVE_GAME_RESULT_ATTRIBUTES,
fix->teams[column == 3]->name->str);
else
sprintf(buf, "<span %s>%d : %d</span>", CONSTANT_TREEVIEW_CELL_LIVE_GAME_RESULT_ATTRIBUTES,
result[0], result[1]);
}
g_object_set(renderer, "markup", buf, NULL);

View File

@ -2,10 +2,6 @@
#define TREEVIEW_CELL_H
#include "bygfoot.h"
#include "variables.h"
/** The integer that the cell data functions will interpret as an empty string. */
#define CONSTANT_TREEVIEW_CELL_INT_EMPTY -5
void
treeview_cell_team_selection(GtkTreeViewColumn *col,
@ -15,7 +11,6 @@ treeview_cell_team_selection(GtkTreeViewColumn *col,
gpointer user_data);
/** Render an integer. This is only so that we know when to draw nothing. */
void
treeview_cell_int_to_cell(GtkTreeViewColumn *col,
GtkCellRenderer *renderer,
@ -23,7 +18,6 @@ treeview_cell_int_to_cell(GtkTreeViewColumn *col,
GtkTreeIter *iter,
gpointer user_data);
/** Render a player list cell. */
void
treeview_cell_player_to_cell(GtkTreeViewColumn *col,
GtkCellRenderer *renderer,
@ -56,4 +50,7 @@ treeview_cell_live_game_result(GtkTreeViewColumn *col,
GtkTreeIter *iter,
gpointer user_data);
void
treeview_cell_player_cskill_to_cell(GtkCellRenderer *renderer, gchar *buf, const Player *pl);
#endif

View File

@ -1,80 +1,121 @@
#include "free.h"
#include "league.h"
#include "maths.h"
#include "option.h"
#include "player.h"
#include "support.h"
#include "team.h"
#include "user.h"
/** These determine how the initial money of the user
depends on the size of the stadium. */
#define CONSTANT_INITIAL_MONEY_LOWER 80
#define CONSTANT_INITIAL_MONEY_UPPER 110
/** Move the user's team to top or bottom league
at the beginning of a new game and set up the user's team. */
void
user_set_up_my_team_new_game(GtkWidget *widget)
/** Create a new user with default values. */
User
user_new(void)
{
User new;
new.name = g_string_new("NONAME");
new.font_name = g_string_new("0");
new.tm = NULL;
new.live_game.units = NULL;
new.live_game.fix = NULL;
new.options = g_array_new(FALSE, FALSE, sizeof(Option));
return new;
}
/** Move a user's team to top or bottom league
at the beginning of a new game and set up the team.
@param user The user we set up the team for. */
void
user_set_up_team_new_game(User *user)
{
GtkWidget *radiobutton1 =
lookup_widget(widget, "team_selection_radio1");
GtkWidget *radiobutton2 =
lookup_widget(widget, "team_selection_radio2");
gchar buf[SMALL];
gint rndom, max, lig_idx = -1;
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton2)))
user_set_up_my_team();
if(user->scout == 0)
user_set_up_team(user);
else
{
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton1)) &&
lig(0).id != my_team->clid)
if(user->scout == 1 &&
lig(0).id != user->tm->clid)
lig_idx = 0;
else if(lig(ligs->len - 1).id != my_team->clid)
else if(lig(ligs->len - 1).id != user->tm->clid)
lig_idx = ligs->len - 1;
max = lig(lig_idx).teams->len - 1;
rndom = math_rndi(0, max);
sprintf(buf, "%s", g_array_index(lig(lig_idx).teams, Team, rndom).name->str);
g_string_printf(g_array_index(lig(lig_idx).teams, Team, rndom).name, "%s",
my_team->name->str);
g_string_printf(my_team->name, "%s", buf);
user->tm->name->str);
g_string_printf(user->tm->name, "%s", buf);
my_team = &g_array_index(lig(lig_idx).teams, Team, rndom);
user->tm = &g_array_index(lig(lig_idx).teams, Team, rndom);
user_set_up_my_team();
user_set_up_team(user);
}
}
/** Set up finances, reomve some players etc. for a new user team. */
/** Set up finances, remove some players etc. for a new user team.
@param user The user whose team we set up. */
void
user_set_up_my_team(void)
user_set_up_team(User *user)
{
gint i, j;
for(i=PLAYER_POS_DEFENDER; i<=PLAYER_POS_FORWARD; i++)
for(j=my_team->players->len - 1; j > 10; j--)
if(g_array_index(my_team->players, Player, j).pos == i)
for(j=user->tm->players->len - 1; j > 10; j--)
if(g_array_index(user->tm->players, Player, j).pos == i)
{
player_remove_from_team(my_team, j);
player_remove_from_team(user->tm, j);
break;
}
scout = physio = QUALITY_AVERAGE;
user->scout = user->physio = QUALITY_AVERAGE;
user_set_up_finances();
user_set_up_finances(user);
}
/** Set up the user's finances when he's got a new team.*/
/** Set up the user's finances when he's got a new team.
@param user The user we set up the finances for. */
void
user_set_up_finances(void)
user_set_up_finances(User *user)
{
gint i;
for(i=0; i<FIN_END;i++)
finances[i] = 0;
user->finances[i] = 0;
finances[FIN_MONEY] =
math_round_integer(my_team->stadium.capacity *
math_rndi(CONSTANT_INITIAL_MONEY_LOWER,
CONSTANT_INITIAL_MONEY_UPPER), 2);
user->finances[FIN_MONEY] =
math_round_integer(user->tm->stadium.capacity *
math_rndi(const_int("int_initial_money_lower"),
const_int("int_initial_money_upper")), 2);
}
/** Remove a user from the game.
@param idx The index of the user in the #users array.
@param regenerate_team Whether the user's team has to be
regenerated. */
void
user_remove(gint idx, gboolean regenerate_team)
{
free_user(&usr(idx));
g_array_remove_index(users, idx);
}
void
user_set_player_list_attributes(const User *user, PlayerListAttribute *attribute, gint list_number)
{
gint i, cnt = 0;
gchar prefix[SMALL];
sprintf(prefix, "int_opt_user_pl%d_att", list_number);
for(i=0;i<user->options->len;i++)
if(g_str_has_prefix(g_array_index(user->options, Option, i).name->str, prefix))
{
attribute->on_off[cnt] = g_array_index(user->options, Option, i).value;
cnt++;
}
}

View File

@ -2,15 +2,28 @@
#define USER_H
#include "bygfoot.h"
#include "user_struct.h"
#include "variables.h"
void
user_set_up_my_team_new_game(GtkWidget *widget);
/** Convenience abbrevs. */
#define usr(i) g_array_index(users, User, i)
void
user_set_up_my_team(void);
user_set_up_team_new_game(User *user);
void
user_set_up_finances(void);
user_set_up_team(User *user);
void
user_set_up_finances(User *user);
User
user_new(void);
void
user_remove(gint idx, gboolean regenerate_team);
void
user_set_player_list_attributes(const User *user, PlayerListAttribute *attribute, gint list_number);
#endif

33
src/user_struct.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef USER_STRUCT_H
#define USER_STRUCT_H
#include "bygfoot.h"
#include "enums.h"
#include "team_struct.h"
#include "live_game_struct.h"
/** A structure representing a human player. */
typedef struct
{
/** Username. */
GString *name;
/** The team the user manages. */
Team *tm;
/** User options. */
GArray *options;
/** The user's finances. @see #FinanceValue */
gint finances[FIN_END];
/** The attributes shown in the player lists.
@see #PlayerListAttribute
@see #PlayerListAttributeValue */
PlayerListAttribute player_list_attributes[3];
/** The user's scout and physio qualities.
@see #Quality */
gint scout, physio;
/** The font used in treeviews. */
GString *font_name;
/** The variable for the latest user live game. @see #Game */
LiveGame live_game;
} User;
#endif

View File

@ -3,6 +3,7 @@
#include "live_game_struct.h"
#include "player_struct.h"
#include "team_struct.h"
#include "user_struct.h"
/**
* The main variable of the game.
@ -10,55 +11,44 @@
*/
Country country;
/** The id of the league or cup of the user's team and its numerical id. */
Team *my_team;
/** The season, week and week round numbers.
We keep track of the time in the game with these variables. */
gint season, week, week_round;
/** The user's scout and physio qualities.
@see #Quality */
gint scout, physio;
/** The user's finances. @see #FinanceValue */
gint finances[FIN_END];
/** The user's settings. @see #OptionValue */
gint options[OPT_END];
/** The attributes shown in the player lists.
@see #PlayerListAttribute
@see #PlayerListAttributeValue */
PlayerListAttribute player_list_attributes[3];
/** Some counters. @see #CounterValue */
gint counters[COUNT_END];
/** Array of options that get read from
bygfoot.conf. */
GArray *options;
/** Array of constants that get read from the constans
file specified in bygfoot.conf. */
GArray *constants;
/** The array containing players to be transfered.
@see TransferPlayer */
GArray *transfer_list;
/** The font used in treeviews. */
GString *font_name;
/** Whether we are in debug mode. */
gboolean debug;
/** These help us keep track of what's happening. */
gint status, status2, status3, status4, status5;
gint status[5];
/** The currently selected rows in the treeviews. */
gint selected_row[2];
/** An array of player names that we keep in memory. */
GPtrArray *player_names;
/** The pointer to the main window of the game. */
GtkWidget *main_window;
/** The struct containing the window pointers. */
Windows window;
/** With this we keep track of the number of popup
windows and make the main window sensitive or
insensitive, depending. */
gint popups_active;
/** The variable for the latest user live game. @see #Game */
LiveGame live_game;
/** The variable for non-user games (which aren't shown). */
LiveGame live_game_temp;
/** The array of human players. @see #User */
GArray *users;
/** The index of the current user in the #users array. */
gint current_user;

View File

@ -1,9 +1,12 @@
#include "file.h"
#include "free.h"
#include "game_gui.h"
#include "interface.h"
#include "main.h"
#include "misc_interface.h"
#include "option.h"
#include "support.h"
#include "user.h"
#include "variables.h"
#include "window.h"
@ -36,27 +39,18 @@ window_show_startup(void)
free_g_string_array(&dir_contents);
}
/** Create and show the main window. */
void
window_show_main(void)
{
main_window = window_create(WINDOW_MAIN);
gtk_widget_show(main_window);
}
/** Set 'Bygfoot x.y.z' into the title of a window.
@param window The window widget pointer.
@see #VERS */
GtkWidget*
window_set_version(GtkWidget *window)
window_set_version(GtkWidget *wind)
{
gchar buf[SMALL];
sprintf(buf, "Bygfoot Football Manager %s", VERS);
gtk_window_set_title(GTK_WINDOW(window), buf);
gtk_window_set_title(GTK_WINDOW(wind), buf);
return window;
return wind;
}
/** Create and show a window. Which one depends on the argument.
@ -67,62 +61,76 @@ window_set_version(GtkWidget *window)
GtkWidget*
window_create(gint window_type)
{
GtkWidget *window = NULL;
GtkWidget *wind = NULL;
popups_active++;
switch(window_type)
{
default:
if(main_window == NULL)
if(window.main == NULL)
{
window = create_main_window();
window.main = create_main_window();
popups_active--;
wind = window.main;
game_gui_print_message("Welcome to Bygfoot "VERS);
}
else
window = main_window;
window_set_version(window);
wind = window.main;
break;
case WINDOW_STARTUP:
window = create_window_startup();
window_set_version(window);
if(window.startup != NULL)
g_warning("window_create: called on already existing window\n");
else
window.startup = create_window_startup();
wind = window.startup;
break;
case WINDOW_LIVE:
window = create_window_live();
window_set_version(window);
if(window.live != NULL)
g_warning("window_create: called on already existing window\n");
else
window.live = create_window_live();
wind = window.live;
gtk_spin_button_set_value(
GTK_SPIN_BUTTON(lookup_widget(window, "spinbutton_speed")),
(gfloat)options[OPT_LIVE_SPEED]);
GTK_SPIN_BUTTON(lookup_widget(wind, "spinbutton_speed")),
(gfloat)option_int("int_opt_user_live_game_speed", usr(stat2).options));
break;
}
case WINDOW_STARTUP_USERS:
if(window.startup_users != NULL)
g_warning("window_create: called on already existing window\n");
else
window.startup_users = create_window_startup_users();
wind = window.startup_users;
break;
}
gtk_widget_show(window);
window_set_version(wind);
gtk_widget_show(wind);
if(popups_active != 0 && main_window != NULL)
gtk_widget_set_sensitive(main_window, FALSE);
if(popups_active != 0 && window.main != NULL)
gtk_widget_set_sensitive(window.main, FALSE);
return window;
return wind;
}
/** Destroy a window widget and set the popups and
main window sensitivity correctly.
@param window The window we destroy. */
void
window_destroy(GtkWidget **window)
window_destroy(GtkWidget **wind)
{
if(*window == NULL)
if(*wind == NULL)
return;
if(*window != main_window)
if(*wind != window.main)
{
popups_active--;
if(popups_active == 0 && main_window != NULL)
gtk_widget_set_sensitive(main_window, TRUE);
if(popups_active == 0 && window.main != NULL)
gtk_widget_set_sensitive(window.main, TRUE);
}
gtk_widget_destroy(*window);
gtk_widget_destroy(*wind);
*window = NULL;
*wind = NULL;
}

View File

@ -10,15 +10,13 @@ enum Windows
WINDOW_MAIN = 0,
WINDOW_STARTUP,
WINDOW_LIVE,
WINDOW_STARTUP_USERS,
WINDOW_END
};
void
window_show_startup(void);
void
window_show_main(void);
GtkWidget*
window_set_version(GtkWidget *window);

View File

@ -2,6 +2,7 @@
#include "league.h"
#include "misc.h"
#include "team.h"
#include "table.h"
#include "variables.h"
#include "xml_league.h"
@ -159,8 +160,6 @@ xml_league_read_end_element (GMarkupParseContext *context,
gpointer user_data,
GError **error)
{
TableElement new_table_element;
if(strcmp(element_name, TAG_NAME) == 0 ||
strcmp(element_name, TAG_SHORT_NAME) == 0 ||
strcmp(element_name, TAG_SID) == 0 ||
@ -184,12 +183,7 @@ xml_league_read_end_element (GMarkupParseContext *context,
strcmp(element_name, TAG_PROM_REL_ELEMENT_DEST_SID) == 0)
state = STATE_PROM_REL_ELEMENT;
else if(strcmp(element_name, TAG_TEAM) == 0)
{
state = STATE_TEAMS;
new_table_element = league_table_element_new(
&g_array_index(new_league.teams, Team, new_league.teams->len - 1));
g_array_append_val(new_league.table.elements, new_table_element);
}
else if(strcmp(element_name, TAG_TEAM_NAME) == 0)
state = STATE_TEAM;
else if(strcmp(element_name, TAG_LEAGUE) != 0)
@ -275,6 +269,8 @@ xml_league_read_text (GMarkupParseContext *context,
void
xml_league_read(const gchar *league_name, GArray *leagues)
{
gint i;
TableElement new_table_element;
gchar *file_name = file_find_support_file(league_name);
GMarkupParser parser = {xml_league_read_start_element,
xml_league_read_end_element,
@ -313,6 +309,12 @@ xml_league_read(const gchar *league_name, GArray *leagues)
g_free(file_contents);
g_array_append_val(leagues, new_league);
for(i=0;i<lig(ligs->len - 1).teams->len;i++)
{
new_table_element =
table_element_new(&g_array_index(lig(ligs->len - 1).teams, Team, i));
g_array_append_val(lig(ligs->len - 1).table.elements, new_table_element);
}
}
else
{

View File

@ -1,87 +1,22 @@
# Bygfoot Football Manager
# Configuration file
# Global configuration file
# Most of these options are uncommented because their meaning
# is rather clear if you take a look at the options window in the game.
confirm_new_week_round 1
confirm_unfit 1
confirm_quit 1
save_will_ovewrite 1
show_live_game 1
live_game_speed 0
show_tendency_bar 1
maximize_main_window 1
notify_transfer 0
notify_pos -1
notify_league_upper -1
notify_league_lower -1
notify_cups 0
notify_age_upper 36
notify_age_lower 18
notify_skill_upper 99
notify_skill_lower 1
notify_etal_upper 99
notify_etal_lower 1
notify_value -1
show_job_offers 1
message_style 1
prefer_messages 0
autosave 0
autosave_interval 3
sort_transfer_list 0
sort_transfer_attribute 1
reaarrange_adapts 1
swap_adapts 1
history_team_interval 5
history_player_interval 10
history_team_max 30
history_player_max 20
history_team_delete 0
history_player_delete 0
boost 0
compress 1
objective 1
penalty_shooter -1
pl1_att_name 1
pl1_att_cpos 1
pl1_att_pos 1
pl1_att_cskill 1
pl1_att_skill 1
pl1_att_fitness 1
pl1_att_games 1
pl1_att_goals 1
pl1_att_status 1
pl1_att_cards 0
pl1_att_age 1
pl1_att_etal 1
pl1_att_value 0
pl1_att_wage 0
pl1_att_contract 0
pl1_att_team 0
pl1_att_league_cup 0
pl2_att_name 1
pl2_att_cpos 0
pl2_att_pos 1
pl2_att_cskill 0
pl2_att_skill 1
pl2_att_fitness 0
pl2_att_games 0
pl2_att_goals 0
pl2_att_status 1
pl2_att_cards 0
pl2_att_age 1
pl2_att_etal 1
pl2_att_value 1
pl2_att_wage 1
pl2_att_contract 1
pl2_att_team 0
pl2_att_league_cup 0
# font name; if 0, the default system font's used
font_name 0
int_opt_confirm_new_week_round 1
int_opt_confirm_quit 1
int_opt_save_will_ovewrite 1
int_opt_maximize_main_window 1
int_opt_prefer_messages 0
int_opt_autosave 0
int_opt_autosave_interval 3
int_opt_compress 1
int_opt_objective 1
# whether some debugging info's shown (in the console)
debug 0
int_opt_debug 0
string_opt_player_names_file player_names.xml
string_opt_constants_file bygfoot_constants
string_opt_default_user_conf_file bygfoot_user.conf

View File

@ -0,0 +1,279 @@
#### int constants
# number of seconds until messages disappear
int_game_gui_message_duration 5
# lower limit for player ages.
int_player_age_lower 936
# upper limit for player ages.
int_player_age_upper 1872
# lower limit for player peak ages.
int_player_peak_age_lower 1560
# upper limit for player peak ages.
int_player_peak_age_upper 1716
# by how many weeks the peak age of goalies is
# greater.
int_player_peak_age_goalie_addition 104
# limits for initial fitness.
int_player_fitness_lower 85
# limits for initial fitness.
int_player_fitness_upper 100
# the bounds determining the player positions in a newly created
# team for players 13 to constant_team_max_players.
# player 11 is always the second goalie.
int_player_pos_bound1 15
int_player_pos_bound2 18
# bounds for the contract time at player generation.
int_player_contract_lower 52
int_player_contract_upper 208
# bounds for the last skill update at player generation.
int_player_lsu_lower 2
int_player_lsu_upper 10
# this determines the accuracy of the scout's
# talent estimate. the smaller the better.
int_player_etal_scout_factor 7
# fitness limits below which fitness is shown
# in orange and red etc.
int_treeview_cell_limit_player_fitness_below1 85
int_treeview_cell_limit_player_fitness_below2 70
int_treeview_cell_limit_player_fitness_below3 60
# contract limits below which contract time is shown
# in orange and red etc.
int_treeview_cell_limit_player_contract_below1 52
int_treeview_cell_limit_player_contract_below2 40
int_treeview_cell_limit_player_contract_below3 20
# the integer that the cell data functions will interpret as an empty string.
int_treeview_cell_int_empty -5
# transfer list configuration
int_transfer_max_players 20
int_transfer_deadline 35
# maximum number of players in a team.
int_team_max_players 20
# highest skill and talent a player can have.
int_player_max_skill 99
# determines initial money of the users
int_initial_money_lower 80
int_initial_money_upper 110
#### float constants
#### these get divided by 1000 and loaded as floats
#### so we write 500 if we'd like to have 0.5
# live game scale configuration
float_game_gui_live_game_scale_attack 300
float_game_gui_live_game_scale_chance 450
float_game_gui_live_game_scale_range 10000
# How much a player's skill can deviate from
# the average skill in his team.
float_player_average_skill_variance 100
# these determine the value calculation of players.
# value is a function of skill and talent involving
# a power.
float_player_value_skill_weight 650
float_player_value_power 3500
# these determine the wage calculation of players.
# wage depends on the value and a random factor near 1.
float_player_wage_value_factor 10
float_player_wage_random_dev 150
# constants determining the probabilities for
# the playing styles of cpu teams.
float_team_playing_style_prob1 100
float_team_playing_style_prob2 250
float_team_playing_style_prob3 750
float_team_playing_style_prob4 900
# constants determining the probabilities for
# the playing structures of cpu teams.
float_team_playing_structure_prob1 150
float_team_playing_structure_prob2 500
float_team_playing_structure_prob3 700
float_team_playing_structure_prob4 850
# kinda hard to explain.
# @see team_generate_players()
# @see player_generate()
float_team_skill_variance 75
# base probability that the ball gets from defending area
# to midfield area.
float_live_game_area_def_mid 500
# influence of attack/defend values on the base probability; the lower
# the smaller the influence.
float_live_game_area_def_mid_team_exponent 1000
# base probability that the ball gets from midfield area
# to attack area or back to defend area.
float_live_game_area_mid_att 500
float_live_game_area_mid_def 300
# influence of attack/defend values on the base probability; the lower
# the smaller the influence.
float_live_game_area_mid_team_exponent 1250
# base probability that the ball gets from attacking area
# to midfield area.
float_live_game_area_att_mid 300
# influence of attack/defend values on the base probability; the lower
# the smaller the influence.
float_live_game_area_att_mid_team_exponent 1000
# base probability of a general event (no foul, no injury, no goal etc.)
float_live_game_event_general 500
# base probability for possession change.
float_live_game_possession_changes 200
# influence of the team values on the possession change.
float_live_game_possession_team_exponent 4000
# base prob for a scoring chance if a team is attacking.
float_live_game_scoring_chance 300
# team values influence on the scoring chance.
float_live_game_scoring_chance_team_exponent 1250
# probability that it's the player in possession who
# has the scoring chance.
float_live_game_player_in_poss_shoots 500
# base probability to score with a scoring chance.
float_live_game_score_base_prob 300
# base probability to score with a free kick.
float_live_game_score_free_kick 50
# base probability to score with a penalty.
float_live_game_score_penalty 800
# influence of the attacker/goalie skills on the probability to score.
float_live_game_score_duel_exponent 300
# influence of the team attacking/defending values on the probability to score.
float_live_game_score_team_exponent 700
# the smaller this number, the smaller the probability of
# many stopping minutes after 90 or 45 minutes.
float_live_game_break_base 600
# the bigger this number, the faster the probability of
# yet another additional minute after the 45th minute decays.
float_live_game_45_break_exponent_factor 1300
# the bigger this number, the faster the probability of
# yet another additional minute after the 90th minute decays.
float_live_game_90_break_exponent_factor 700
# the probability that the team that shot on the goal stays
# in possession after a post or cross-bar hit.
float_live_game_possession_after_post 300
# probability that there is a passing event after a special event.
float_live_game_general_event_second_player 500
# constants for stadium events.
float_live_game_stadium_event_exponent 50
float_live_game_stadium_event_fire 200
float_live_game_stadium_event_riots 500
float_live_game_stadium_event_breakdown 1000
# foul probabilities.
float_live_game_foul 110
float_live_game_foul_red_injury 50
float_live_game_foul_red 80
float_live_game_foul_yellow 230
# injury probabilities.
float_live_game_injury 17
float_live_game_injury_goalie_factor 200
float_live_game_injury_is_temp 700
# probability that a scoring chance is an own goal.
float_live_game_scoring_chance_is_own_goal 10
# probability of a free kick after a foul.
float_live_game_free_kick_prob 150
# probability of a penalty after a foul.
float_live_game_penalty_prob 50
# probability that a scoring chance is a header.
float_live_game_scoring_chance_is_header 350
# influence in % of the game style towards more attack.
float_game_style_factor 75
# influence of boost on player's skill.
float_player_boost_skill_effect 300
# influence of boost on player's fitness decay.
float_player_boost_fitness_effect 1000
# influence of boost on injury probability.
float_player_boost_injury_effect 1000
# influence of boost on cards probability.
float_player_boost_card_effect 1000
# the influence of the fitness on the current skill.
# this determines the player's contribution to the team
# during a game. the higher the value the bigger the influence.
float_player_fitness_impact_on_skill 250
# influence of the fitness on the player contribution.
# the higher the worse. @see game_get_player_contribution()
float_player_fitness_exponent 250
# bounds for the home advantage factor
float_game_home_advantage_lower 40
float_game_home_advantage_upper 80
#### string constants
# live game scale configuration
string_game_gui_live_game_scale_color_defend lightblue
string_game_gui_live_game_scale_color_midfield khaki
string_game_gui_live_game_scale_color_attack gold
string_game_gui_live_game_scale_color_chance orange
string_game_gui_live_game_scale_color_goal red
string_game_gui_live_game_scale_color_miss lightgreen
# default background and foreground in treeviews
string_treeview_cell_color_default_background white
string_treeview_cell_color_default_foreground black
# player list colours
string_treeview_cell_color_player_pos_goalie_bg black
string_treeview_cell_color_player_pos_goalie_fg white
string_treeview_cell_color_player_pos_defender_bg darkgreen
string_treeview_cell_color_player_pos_defender_fg white
string_treeview_cell_color_player_pos_midfielder_bg darkblue
string_treeview_cell_color_player_pos_midfielder_fg white
string_treeview_cell_color_player_pos_forward_bg darkred
string_treeview_cell_color_player_pos_forward_fg white
string_treeview_cell_color_player_injury lightgreen
string_treeview_cell_color_player_banned red
string_treeview_cell_color_player_yellow_danger yellow
string_treeview_cell_color_player_fitness_normal darkgreen
string_treeview_cell_color_player_fitness_below1 darkorange
string_treeview_cell_color_player_fitness_below2 orangered
string_treeview_cell_color_player_fitness_below3 red
string_treeview_cell_color_player_contract_normal darkgreen
# see also the int constants for contract limits
string_treeview_cell_color_player_contract_below1 darkorange
string_treeview_cell_color_player_contract_below2 orangered
string_treeview_cell_color_player_contract_below3 red
# colours for cskill in wrong position
string_treeview_cell_color_player_bad_cskill_bg lightblue
string_treeview_cell_color_player_bad_cskill_fg red
# font attributes for the live game window result.
string_treeview_cell_live_game_result_attributes weight='bold' size='large'

View File

@ -0,0 +1,72 @@
# Bygfoot Football Manager
# Default user configuration file
# Most of these options are uncommented because their meaning
# is rather clear if you take a look at the options window in the game.
int_opt_user_confirm_unfit 1
int_opt_user_show_live_game 0
int_opt_user_live_game_speed -10
int_opt_user_show_tendency_bar 1
int_opt_user_notify_transfer 0
int_opt_user_notify_pos -1
int_opt_user_notify_league_upper -1
int_opt_user_notify_league_lower -1
int_opt_user_notify_cups 0
int_opt_user_notify_age_upper 36
int_opt_user_notify_age_lower 18
int_opt_user_notify_skill_upper 99
int_opt_user_notify_skill_lower 1
int_opt_user_notify_etal_upper 99
int_opt_user_notify_etal_lower 1
int_opt_user_notify_value -1
int_opt_user_show_job_offers 1
int_opt_user_sort_transfer_list 0
int_opt_user_sort_transfer_attribute 1
int_opt_user_reaarrange_adapts 1
int_opt_user_swap_adapts 1
int_opt_user_boost 0
int_opt_user_penalty_shooter -1
# the order of these attributes is important
# don't change it
int_opt_user_pl1_att_name 1
int_opt_user_pl1_att_cpos 1
int_opt_user_pl1_att_pos 1
int_opt_user_pl1_att_cskill 1
int_opt_user_pl1_att_skill 1
int_opt_user_pl1_att_fitness 1
int_opt_user_pl1_att_games 1
int_opt_user_pl1_att_goals 1
int_opt_user_pl1_att_status 1
int_opt_user_pl1_att_cards 0
int_opt_user_pl1_att_age 1
int_opt_user_pl1_att_etal 1
int_opt_user_pl1_att_value 0
int_opt_user_pl1_att_wage 0
int_opt_user_pl1_att_contract 0
int_opt_user_pl1_att_team 0
int_opt_user_pl1_att_league_cup 0
# the order of these attributes is important
# don't change it
int_opt_user_pl2_att_name 1
int_opt_user_pl2_att_cpos 0
int_opt_user_pl2_att_pos 1
int_opt_user_pl2_att_cskill 0
int_opt_user_pl2_att_skill 1
int_opt_user_pl2_att_fitness 0
int_opt_user_pl2_att_games 0
int_opt_user_pl2_att_goals 0
int_opt_user_pl2_att_status 1
int_opt_user_pl2_att_cards 0
int_opt_user_pl2_att_age 1
int_opt_user_pl2_att_etal 1
int_opt_user_pl2_att_value 1
int_opt_user_pl2_att_wage 1
int_opt_user_pl2_att_contract 1
int_opt_user_pl2_att_team 0
int_opt_user_pl2_att_league_cup 0
# font name; if 0, the default system font's used
string_opt_user_font_name 0