1
1
mirror of https://github.com/tstellar/bygfoot.git synced 2025-01-31 07:54:50 +01:00

"Commentary improvements."

This commit is contained in:
gyboth 2005-07-01 20:51:46 +00:00
parent 0d8bf904a4
commit aeb715bcf9
25 changed files with 658 additions and 397 deletions

File diff suppressed because one or more lines are too long

View File

@ -20,7 +20,7 @@ AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package.])
dnl Add the languages which your application supports here.
ALL_LINGUAS="de nl"
ALL_LINGUAS="de nl fr"
AM_GLIB_GNU_GETTEXT
AC_OUTPUT([

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2005-06-28 04:05+0200\n"
"POT-Creation-Date: 2005-07-01 22:48+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -71,7 +71,7 @@ msgid ""
"player's value. Do you accept?"
msgstr ""
#: src/callback_func.c:383 src/callbacks.c:538
#: src/callback_func.c:383 src/callbacks.c:537
msgid "Your offer has been removed."
msgstr ""
@ -148,7 +148,7 @@ msgstr ""
msgid "The current game state is unsaved and will be lost. Continue?"
msgstr ""
#: src/callbacks.c:148 src/callbacks.c:402
#: src/callbacks.c:148 src/callbacks.c:401
msgid "Transfers are disabled in this country definition."
msgstr ""
@ -161,86 +161,86 @@ msgstr ""
msgid "Transfer deadline is Week %d"
msgstr ""
#: src/callbacks.c:162
#: src/callbacks.c:161
msgid "The transfer deadline is over."
msgstr ""
#: src/callbacks.c:171 src/callbacks.c:566 src/callbacks.c:583
#: src/callbacks.c:170 src/callbacks.c:565 src/callbacks.c:582
msgid "You still have some transfer business to manage."
msgstr ""
#: src/callbacks.c:175
#: src/callbacks.c:174
msgid "At least one user didn't take his turn this week. Continue?"
msgstr ""
#: src/callbacks.c:181
#: src/callbacks.c:180
msgid "There are injured or banned players in one of the user teams. Continue?"
msgstr ""
#: src/callbacks.c:386
#: src/callbacks.c:385
msgid "This is your first season."
msgstr ""
#: src/callbacks.c:404 src/callbacks.c:420 src/callbacks.c:436
#: src/callbacks.c:454 src/callbacks.c:799 src/callbacks.c:815
#: src/callbacks.c:403 src/callbacks.c:419 src/callbacks.c:435
#: src/callbacks.c:453 src/callbacks.c:798 src/callbacks.c:814
msgid "You haven't selected a player."
msgstr ""
#: src/callbacks.c:406
#: src/callbacks.c:405
msgid "The player is already on the list."
msgstr ""
#: src/callbacks.c:422
#: src/callbacks.c:421
msgid "The player is not on the list."
msgstr ""
#: src/callbacks.c:438
#: src/callbacks.c:437
msgid "Your team can't have less than 11 players."
msgstr ""
#: src/callbacks.c:459
#: src/callbacks.c:458
msgid "Penalty/free kick shooter deselected."
msgstr ""
#: src/callbacks.c:465
#: src/callbacks.c:464
#, c-format
msgid "%s will shoot penalties and free kicks when he plays."
msgstr ""
#: src/callbacks.c:540
#: src/callbacks.c:539
msgid "You haven't made an offer for the player."
msgstr ""
#: src/callbacks.c:599
#: src/callbacks.c:598
msgid "Enter a structure. The digits must sum up to 10."
msgstr ""
#: src/callbacks.c:600
#: src/callbacks.c:599
msgid "Structure"
msgstr ""
#: src/callbacks.c:633 src/callbacks.c:649
#: src/callbacks.c:632 src/callbacks.c:648
msgid "No match stored."
msgstr ""
#: src/callbacks.c:727 src/game_gui.c:309
#: src/callbacks.c:726 src/game_gui.c:309
msgid "Boost ON is disabled in this country definition."
msgstr ""
#: src/callbacks.c:749
#: src/callbacks.c:748
msgid "Finances are disabled in this country definition."
msgstr ""
#: src/callbacks.c:754
#: src/callbacks.c:753
msgid ""
"Left-click: get loan; Right-click: pay back; Middle click: stadium window."
msgstr ""
#: src/callbacks.c:768
#: src/callbacks.c:767
msgid "Stadium management is disabled in this country definition."
msgstr ""
#: src/callbacks.c:793
#: src/callbacks.c:792
msgid "Contracts are disabled in this country definition."
msgstr ""
@ -733,38 +733,38 @@ msgstr ""
msgid "Next (W)"
msgstr ""
#: src/lg_commentary.c:331 src/team.c:500
#: src/lg_commentary.c:524 src/team.c:500
msgid "ALL OUT DEFEND"
msgstr ""
#: src/lg_commentary.c:334 src/team.c:502
#: src/lg_commentary.c:527 src/team.c:502
msgid "DEFEND"
msgstr ""
#: src/lg_commentary.c:337 src/team.c:504
#: src/lg_commentary.c:530 src/team.c:504
msgid "BALANCED"
msgstr ""
#: src/lg_commentary.c:340 src/team.c:506
#: src/lg_commentary.c:533 src/team.c:506
msgid "ATTACK"
msgstr ""
#: src/lg_commentary.c:343 src/team.c:508
#: src/lg_commentary.c:536 src/team.c:508
msgid "ALL OUT ATTACK"
msgstr ""
#. Boost value.
#: src/lg_commentary.c:346 src/team.c:516
#: src/lg_commentary.c:539 src/team.c:516
msgid "ANTI"
msgstr ""
#. Boost value.
#: src/lg_commentary.c:349 src/team.c:519
#: src/lg_commentary.c:542 src/team.c:519
msgid "OFF"
msgstr ""
#. Boost value.
#: src/lg_commentary.c:352 src/team.c:522
#: src/lg_commentary.c:545 src/team.c:522
msgid "ON"
msgstr ""

View File

@ -16,17 +16,17 @@ bygfoot_SOURCES = \
file.c file.h free.h main.h misc.h option.h support.h variables.h \
finance.c callbacks.h finance.h game_gui.h maths.h option.h player.h team.h user.h \
fixture.c cup.h fixture.h free.h league.h main.h maths.h misc.h option.h table.h team.h user.h variables.h \
free.c free.h transfer.h user.h variables.h \
free.c free.h lg_commentary_struct.h transfer.h user.h variables.h \
game.c cup.h finance.h fixture.h game_gui.h game.h league.h live_game.h main.h maths.h misc.h option.h player.h table.h team.h treeview.h user.h variables.h \
game_gui.c callbacks.h file.h game_gui.h gui.h league.h live_game.h maths.h misc.h option.h support.h team.h treeview.h user.h variables.h window.h \
gui.c gui.h misc.h support.h variables.h window.h \
interface.c callbacks.h interface.h support.h \
language.c callbacks.h free.h language.h lg_commentary.h misc.h option.h variables.h window.h \
lg_commentary.c file.h free.h lg_commentary.h live_game.h main.h misc.h option.h player.h variables.h xml_lg_commentary.h \
lg_commentary.c cup.h file.h fixture.h league.h lg_commentary.h live_game.h main.h maths.h misc.h option.h player.h team.h variables.h xml_lg_commentary.h \
league.c cup.h free.h league.h main.h maths.h misc.h option.h player.h stat.h table.h team.h user.h variables.h \
live_game.c callbacks.h fixture.h free.h game_gui.h game.h lg_commentary.h live_game.h main.h maths.h misc_callback_func.h option.h player.h support.h team.h treeview.h user.h variables.h window.h \
live_game.c callbacks.h fixture.h free.h game_gui.h game.h lg_commentary.h live_game.h main.h maths.h misc_callback_func.h misc.h option.h player.h support.h team.h treeview.h user.h variables.h window.h \
load_save.c callbacks.h file.h game_gui.h gui.h language.h load_save.h option.h support.h user.h variables.h xml.h xml_loadsave_cup.h xml_loadsave_league.h xml_loadsave_misc.h xml_loadsave_season_stats.h xml_loadsave_transfers.h xml_loadsave_users.h \
main.c file.h free.h language.h live_game.h main.h misc_callbacks.h name_struct.h option.h stat_struct.h transfer_struct.h variables.h window.h \
main.c file.h free.h language.h lg_commentary_struct.h live_game.h main.h misc_callbacks.h name_struct.h option.h stat_struct.h transfer_struct.h variables.h window.h \
maths.c maths.h misc.h variables.h \
misc.c main.h maths.h misc.h \
misc_callbacks.c callback_func.h callbacks.h game_gui.h game.h gui.h live_game.h load_save.h main.h maths.h misc_callback_func.h misc_callbacks.h option.h user.h variables.h window.h xml_country.h \

View File

@ -287,7 +287,7 @@ callback_get_loan(void)
}
stat1 = STATUS_GET_LOAN;
misc_print_grouped_int(max_loan, buf2, FALSE);
misc_print_grouped_int(max_loan, buf2);
sprintf(buf, _("You can take out at most %s."), buf2);
window_show_digits(buf, _("Loan"), max_loan, NULL, 0);
@ -313,7 +313,7 @@ callback_pay_loan(void)
}
stat1 = STATUS_PAY_LOAN;
misc_print_grouped_int(max_payback, buf2, FALSE);
misc_print_grouped_int(max_payback, buf2);
sprintf(buf, _("You can pay back at most %s"), buf2);
window_show_digits(buf, _("Payback"), max_payback, NULL, 0);
@ -344,10 +344,10 @@ callback_transfer_list_user(gint button, gint idx)
game_gui_print_message(_("There are some offers for the player which you rejected or will see next week."));
else
{
misc_print_grouped_int(transoff(idx, 0).fee, buf2, FALSE);
misc_print_grouped_int(transoff(idx, 0).fee, buf2);
misc_print_grouped_int(ABS(transoff(idx, 0).fee -
player_of_id_team(current_user.tm,
trans(idx).id)->value), buf3, FALSE);
trans(idx).id)->value), buf3);
if(transoff(idx, 0).fee -
player_of_id_team(current_user.tm, trans(idx).id)->value > 0)
strcat(buf3, _(" more"));
@ -391,8 +391,8 @@ callback_transfer_list_cpu(gint button, gint idx)
return;
}
misc_print_grouped_int(transoff(idx, 0).fee, buf2, FALSE);
misc_print_grouped_int(transoff(idx, 0).wage, buf3, FALSE);
misc_print_grouped_int(transoff(idx, 0).fee, buf2);
misc_print_grouped_int(transoff(idx, 0).wage, buf3);
sprintf(buf, _("You offered a transfer fee of %s and a wage of %s for %s. The owners and the player are satisfied with your offer. Do you still want to buy the player?"),
buf2, buf3, player_of_id_team(trans(idx).tm, trans(idx).id)->name->str);
@ -435,13 +435,7 @@ callback_transfer_list_clicked(gint button, gint idx)
return;
}
if (week >= transfer_get_deadline()-1)
{
game_gui_print_message(_("You can't make an offer so close to the transfer deadline."));
return;
}
stat1 = STATUS_SHOW_TRANSFER_LIST;
stat2 = idx;
@ -617,7 +611,7 @@ callback_fire_player(gint idx)
stat2 = idx;
stat3 = (gint)rint(pl->wage * const_float("float_player_fire_wage_factor") * pl->contract);
misc_print_grouped_int(stat3, buf2, FALSE);
misc_print_grouped_int(stat3, buf2);
sprintf(buf, _("You want to fire %s. Since his contract expires in %.1f years, he demands a compensation of %s. Do you accept?"), pl->name->str, pl->contract, buf2);

View File

@ -151,7 +151,6 @@ on_button_transfers_clicked (GtkButton *button,
stat0 = STATUS_SHOW_TRANSFER_LIST;
game_gui_print_message(_("Left click to make an offer. Right click to remove offer."));
sprintf(buf, _("Transfer deadline is Week %d"), transfer_get_deadline());
printf("buf %s \n", buf);
game_gui_print_message_with_delay(buf);
treeview_show_transfer_list(GTK_TREE_VIEW(lookup_widget(window.main, "treeview_right")));
gtk_notebook_set_current_page(GTK_NOTEBOOK(lookup_widget(window.main, "notebook_player")), 1);

View File

@ -160,16 +160,14 @@ void
file_check_home_dir_copy_conf_files(void)
{
gint i;
gchar *conf_files[4] =
gchar *conf_files[2] =
{"bygfoot.conf",
"bygfoot_user.conf",
"bygfoot_constants",
"bygfoot_app"};
"bygfoot_user.conf"};
const gchar *home = g_get_home_dir();
gchar *conf_file = NULL;
gchar buf[SMALL];
for(i=0;i<4;i++)
for(i=0;i<2;i++)
{
sprintf(buf, "%s/%s/%s", home, HOMEDIRNAME, conf_files[i]);
if(!g_file_test(buf, G_FILE_TEST_EXISTS))
@ -444,6 +442,7 @@ file_load_opt_file(const gchar *filename, OptionList *optionlist)
void
file_load_conf_files(void)
{
gint i;
gchar *conf_file = file_find_support_file("bygfoot.conf", TRUE);
file_load_opt_file(conf_file, &options);
@ -452,6 +451,9 @@ file_load_conf_files(void)
file_load_opt_file(opt_str("string_opt_constants_file"), &constants);
file_load_opt_file(opt_str("string_opt_appearance_file"), &constants_app);
file_load_opt_file("bygfoot_lg_tokens", &lg_tokens);
for(i=0;i<lg_tokens.list->len;i++)
g_array_index(lg_tokens.list, Option, i).value = i;
}
/** Load a user-specific conf file.

View File

@ -1,4 +1,5 @@
#include "free.h"
#include "lg_commentary_struct.h"
#include "transfer.h"
#include "user.h"
#include "variables.h"
@ -16,6 +17,7 @@ free_memory(void)
free_country(FALSE);
free_users(FALSE);
free_live_game(&live_game_temp);
free_lg_commentary(FALSE);
free_support_dirs();
}
@ -450,7 +452,7 @@ free_cup_choose_team(CupChooseTeam *cup_choose_team)
void
free_variables(void)
{
gint i;
gint i, j;
free_option_list(&options, FALSE);
free_option_list(&settings, FALSE);
@ -458,9 +460,6 @@ free_variables(void)
free_option_list(&constants_app, FALSE);
free_option_list(&lg_tokens, FALSE);
for(i=0;i<LIVE_GAME_EVENT_END;i++)
free_g_string_array(&lg_commentary[i]);
free_g_string(&save_file);
g_rand_free(rand_generator);
@ -468,6 +467,29 @@ free_variables(void)
free_season_stats(FALSE);
}
/** Free the list with live game commentary text. */
void
free_lg_commentary(gboolean reset)
{
gint i, j;
for(i=0;i<LIVE_GAME_EVENT_END;i++)
if(lg_commentary[i] != NULL)
{
for(j=0;j<lg_commentary[i]->len;j++)
{
free_g_string(&g_array_index(lg_commentary[i], LGCommentary, j).text);
free_g_string(&g_array_index(lg_commentary[i], LGCommentary, j).condition);
}
free_g_array(&lg_commentary[i]);
}
if(reset)
for(i=0;i<LIVE_GAME_EVENT_END;i++)
lg_commentary[i] = g_array_new(FALSE, FALSE, sizeof(LGCommentary));
}
/**
Free a GPtrArray containing GStrings.
@param array The array to be freed.

View File

@ -64,6 +64,9 @@ free_player(Player *pl);
void
free_live_game(LiveGame *match);
void
free_lg_commentary(gboolean reset);
void
free_option_list(OptionList *optionlist, gboolean reset);

View File

@ -201,7 +201,7 @@ game_gui_set_main_window_header(void)
if(!sett_int("int_opt_disable_finances"))
{
misc_print_grouped_int(current_user.money, buf, FALSE);
misc_print_grouped_int(current_user.money, buf);
gtk_label_set_text(label_money, buf);
}
else
@ -566,9 +566,9 @@ game_gui_show_job_offer(Team *team, gint type)
misc_print_grouped_int(math_round_integer(team->stadium.capacity *
math_rndi(const_int("int_initial_money_lower"),
const_int("int_initial_money_upper")), 2),
buf, FALSE);
buf);
gtk_label_set_text(label_money, buf);
misc_print_grouped_int(team->stadium.capacity, buf, FALSE);
misc_print_grouped_int(team->stadium.capacity, buf);
gtk_label_set_text(label_cap, buf);
gui_label_set_text_from_int(label_saf, (gint)rint(team->stadium.safety * 100), FALSE);

View File

@ -18,7 +18,7 @@ gui_label_set_text_from_int(GtkLabel *label, gint number, gboolean append)
strcpy(buf2, "");
if(number > 1000)
misc_print_grouped_int(number, buf, FALSE);
misc_print_grouped_int(number, buf);
else
sprintf(buf, "%d", number);

View File

@ -1,28 +1,96 @@
#include <locale.h>
#include "cup.h"
#include "file.h"
#include "free.h"
#include "fixture.h"
#include "league.h"
#include "lg_commentary.h"
#include "live_game.h"
#include "main.h"
#include "maths.h"
#include "misc.h"
#include "option.h"
#include "player.h"
#include "team.h"
#include "variables.h"
#include "xml_lg_commentary.h"
/** The replacement strings for the live game commentary tokens. */
gchar **token_rep;
/** Allocate memory for the token array and fill some tokens
at the beginning of the live game that don't change later. */
void
lg_commentary_initialize(const Fixture *fix)
{
gint i;
gchar buf[SMALL];
token_rep = (gchar**)g_malloc(sizeof(gchar*) * lg_tokens.list->len);
for(i=0;i<lg_tokens.list->len;i++)
token_rep[i] = NULL;
token_rep[option_int("string_lg_commentary_token_team_home", &lg_tokens)] =
g_strdup(fix->teams[0]->name->str);
token_rep[option_int("string_lg_commentary_token_team_away", &lg_tokens)] =
g_strdup(fix->teams[1]->name->str);
if(fix->teams[0]->clid < ID_CUP_START)
token_rep[option_int("string_lg_commentary_token_team_layer0", &lg_tokens)] =
misc_int_to_char(league_from_clid(fix->teams[0]->clid)->layer);
if(fix->teams[1]->clid < ID_CUP_START)
token_rep[option_int("string_lg_commentary_token_team_layer1", &lg_tokens)] =
misc_int_to_char(league_from_clid(fix->teams[1]->clid)->layer);
token_rep[option_int("string_lg_commentary_token_league_cup_name", &lg_tokens)] =
g_strdup(league_cup_get_name_string(fix->clid));
if(fix->clid >= ID_CUP_START)
{
cup_get_round_name(cup_from_clid(fix->clid), fix->round, buf);
token_rep[option_int("string_lg_commentary_token_cup_round_name", &lg_tokens)] =
g_strdup(buf);
}
misc_print_grouped_int(fix->attendance, buf);
token_rep[option_int("string_lg_commentary_token_attendance", &lg_tokens)] =
g_strdup(buf);
token_rep[option_int("string_lg_commentary_token_yellow_limit", &lg_tokens)] =
misc_int_to_char(league_cup_get_yellow_red(fix->clid));
}
/** Free the memory occupied by the tokens array and the permanent tokens. */
void
lg_commentary_post_match(void)
{
g_free(token_rep[option_int("string_lg_commentary_token_team_home", &lg_tokens)]);
g_free(token_rep[option_int("string_lg_commentary_token_team_away", &lg_tokens)]);
g_free(token_rep[option_int("string_lg_commentary_token_attendance", &lg_tokens)]);
g_free(token_rep[option_int("string_lg_commentary_token_league_cup_name", &lg_tokens)]);
g_free(token_rep[option_int("string_lg_commentary_token_cup_round_name", &lg_tokens)]);
g_free(token_rep[option_int("string_lg_commentary_token_yellow_limit", &lg_tokens)]);
g_free(token_rep[option_int("string_lg_commentary_token_team_layer0", &lg_tokens)]);
g_free(token_rep[option_int("string_lg_commentary_token_team_layer1", &lg_tokens)]);
g_free(token_rep);
}
/** Generate commentary for the live game event in the unit.
@param unit The unit we comment.
@param fix The fixture being calculated. */
void
lg_commentary_generate(LiveGameUnit *unit, const Fixture *fix)
lg_commentary_generate(const LiveGame *live_game, LiveGameUnit *unit)
{
gchar buf[SMALL];
GPtrArray **commentaries = NULL;
GPtrArray *strings = g_ptr_array_new();
GArray **commentaries = NULL;
gint i;
lg_commentary_set_strings(strings, unit, fix);
lg_commentary_set_basic_tokens(unit, live_game->fix);
lg_commentary_set_team_tokens(unit, live_game->fix);
lg_commentary_set_player_tokens(unit, live_game->fix);
lg_commentary_set_stats_tokens(&live_game->stats);
if(unit->event.type == LIVE_GAME_EVENT_STYLE_CHANGE_ALL_OUT_DEFEND ||
unit->event.type == LIVE_GAME_EVENT_STYLE_CHANGE_DEFEND ||
@ -37,12 +105,12 @@ lg_commentary_generate(LiveGameUnit *unit, const Fixture *fix)
else
commentaries = &lg_commentary[unit->event.type];
*commentaries = misc_randomise_g_pointer_array(*commentaries);
gint order[(*commentaries)->len];
lg_commentary_get_order(*commentaries, order);
for(i=0;i<(*commentaries)->len;i++)
{
if(lg_commentary_replace_tokens(
((GString*)g_ptr_array_index((*commentaries), i))->str, strings, buf))
if(lg_commentary_check_commentary(&g_array_index(*commentaries, LGCommentary, order[i]), buf))
break;
}
@ -56,260 +124,385 @@ lg_commentary_generate(LiveGameUnit *unit, const Fixture *fix)
unit->event.commentary = g_string_new(buf);
for(i=0;i<lg_tokens.list->len;i++)
g_free(g_ptr_array_index(strings, i));
if(i != option_int("string_lg_commentary_token_team_home", &lg_tokens) &&
i != option_int("string_lg_commentary_token_team_away", &lg_tokens) &&
i != option_int("string_lg_commentary_token_attendance", &lg_tokens) &&
i != option_int("string_lg_commentary_token_cup_round_name", &lg_tokens) &&
i != option_int("string_lg_commentary_token_league_cup_name", &lg_tokens) &&
i != option_int("string_lg_commentary_token_yellow_limit", &lg_tokens) &&
i != option_int("string_lg_commentary_token_team_layer0", &lg_tokens) &&
i != option_int("string_lg_commentary_token_team_layer1", &lg_tokens))
{
g_free(token_rep[i]);
token_rep[i] = NULL;
}
}
g_ptr_array_free(strings, TRUE);
/** Check whether the commentary conditions are fulfilled and whether
we can replace all tokens in the commentary. */
gboolean
lg_commentary_check_commentary(const LGCommentary *commentary, gchar *dest)
{
if(commentary->condition != NULL &&
!lg_commentary_parse_condition(commentary->condition->str))
return FALSE;
strcpy(dest, commentary->text->str);
if(lg_commentary_replace_tokens(dest))
{
lg_commentary_replace_expressions(dest);
if(lg_commentary_replace_tokens(dest))
return TRUE;
}
return FALSE;
}
/** Replace simple arithmetic expressions like "1 + 2"
and comparisons like "3 < 4" with the appropriate result. */
void
lg_commentary_replace_expressions(gchar *commentary_text)
{
gint i, j, last_idx = 0;
gint value = -1;
gchar buf[SMALL], buf2[SMALL];
strcpy(buf, commentary_text);
strcpy(commentary_text, "");
for(i=0;i<strlen(buf);i++)
if(buf[i] == '[')
{
strncpy(buf2, buf + last_idx, i - last_idx);
buf2[i - last_idx] = '\0';
strcat(commentary_text, buf2);
for(j=i + 1;j<strlen(buf);j++)
{
if(buf[j] == ']')
{
strncpy(buf2, buf + i + 1, j - i - 1);
buf2[j - i - 1] = '\0';
if(query_misc_string_contains(buf2, "<") ||
query_misc_string_contains(buf2, ">") ||
query_misc_string_contains(buf2, "="))
misc_parse(buf2, &value);
else
misc_parse_expression(buf2, &value);
sprintf(buf2, "%d", value);
strcat(commentary_text, buf2);
value = -1;
last_idx = j + 1;
break;
}
}
}
if(last_idx < strlen(buf))
{
strncpy(buf2, buf + last_idx, strlen(buf) - last_idx);
buf2[strlen(buf) - last_idx] = '\0';
strcat(commentary_text, buf2);
}
}
/** Try to replace all special tokens in the string and write the result to dest.
@param string The commentary string with tokens.
@param strings The replacements of the tokens.
@param commentary The commentary with tokens.
@param dest The destination string.
@return TRUE if we could replace all tokens, FALSE otherwise. */
@return TRUE if we could replace all tokens and the commentary condition
was fulfilled, FALSE otherwise. */
gboolean
lg_commentary_replace_tokens(const gchar *string, const GPtrArray *strings, gchar *dest)
lg_commentary_replace_tokens(gchar *commentary_text)
{
gint i;
gboolean condition;
for(i=0;i<lg_tokens.list->len;i++)
{
if(query_misc_string_contains(commentary_text,
g_array_index(lg_tokens.list, Option, i).string_value->str))
{
if(token_rep[i] == NULL)
return FALSE;
else
misc_string_replace_token(commentary_text,
g_array_index(lg_tokens.list, Option, i).string_value->str,
token_rep[i]);
}
}
return TRUE;
}
/** Find out whether the conditions of the commentary are fulfilled. */
gboolean
lg_commentary_parse_condition(const gchar *condition)
{
gint i;
gboolean return_value = FALSE;
gchar buf[SMALL];
const gchar *buf2 = NULL;
strcpy(buf, string);
strcpy(buf, condition);
for(i=0;i<lg_tokens.list->len;i++)
{
if(query_misc_string_contains(buf, g_array_index(lg_tokens.list, Option, i).string_value->str))
{
if(g_ptr_array_index(strings, i) == NULL)
if(token_rep[i] == NULL)
return FALSE;
else
misc_string_replace_token(buf,
g_array_index(lg_tokens.list, Option, i).string_value->str,
(gchar*)g_ptr_array_index(strings, i));
token_rep[i]);
}
}
misc_replace_sums(buf);
misc_parse(buf, &return_value);
if(buf[0] == '#')
{
buf2 = misc_parse(buf + 1, &condition);
strcpy(dest, buf2);
return condition;
}
else
strcpy(dest, buf);
return TRUE;
return return_value;
}
/** Get the strings corresponding to the commentary tokens. */
/** Write a random order of indices into the integer array
(only depending on the priority values of the commentaries).
I don't like this implementation of ordering the commentaries
according to their priority :-P can't think of a better one, though. */
void
lg_commentary_set_strings(GPtrArray *strings, const LiveGameUnit *unit, const Fixture *fix)
lg_commentary_get_order(const GArray *commentaries, gint *order)
{
gint i, tmp_int = 1;
gchar buf[SMALL];
gint i, j, order_idx = 0;
gint priority_sum = 0, bounds[commentaries->len + 1];
for(i=0;i<lg_tokens.list->len;i++)
bounds[0] = 0;
for(i=0;i<commentaries->len;i++)
{
if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_team_home")) == 0)
g_ptr_array_add(strings, g_strdup(fix->teams[0]->name->str));
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_team_away")) == 0)
g_ptr_array_add(strings, g_strdup(fix->teams[1]->name->str));
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_team_in_poss")) == 0)
g_ptr_array_add(strings, g_strdup(fix->teams[unit->possession]->name->str));
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_team_not_in_poss")) == 0)
g_ptr_array_add(strings, g_strdup(fix->teams[!unit->possession]->name->str));
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_team_losing")) == 0)
{
if(unit->result[0] == unit->result[1])
g_ptr_array_add(strings, NULL);
else
g_ptr_array_add(strings, g_strdup(fix->teams[(unit->result[0] > unit->result[1])]->name->str));
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_team_winning")) == 0)
{
if(unit->result[0] == unit->result[1])
g_ptr_array_add(strings, NULL);
else
g_ptr_array_add(strings, g_strdup(fix->teams[(unit->result[0] < unit->result[1])]->name->str));
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_team")) == 0)
{
if(unit->event.team == -1)
g_ptr_array_add(strings, NULL);
else
g_ptr_array_add(strings, g_strdup(fix->teams[unit->event.team]->name->str));
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_player1")) == 0)
g_ptr_array_add(strings, lg_commentary_get_player_name(unit, fix, FALSE));
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_player2")) == 0)
g_ptr_array_add(strings, lg_commentary_get_player_name(unit, fix, TRUE));
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_attendance")) == 0)
{
misc_print_grouped_int(fix->attendance, buf, FALSE);
g_ptr_array_add(strings, g_strdup(buf));
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_time")) == 0)
{
sprintf(buf, "%d", unit->time);
g_ptr_array_add(strings, g_strdup(buf));
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_minute")) == 0)
{
sprintf(buf, "%d", live_game_unit_get_minute(unit));
g_ptr_array_add(strings, g_strdup(buf));
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_minute_remaining")) == 0)
{
if(unit->time == LIVE_GAME_UNIT_TIME_EXTRA_TIME)
tmp_int = 120 - live_game_unit_get_minute(unit);
else if(unit->time == LIVE_GAME_UNIT_TIME_SECOND_HALF)
tmp_int = 90 - live_game_unit_get_minute(unit);
else if(unit->time == LIVE_GAME_UNIT_TIME_FIRST_HALF)
tmp_int = 45 - live_game_unit_get_minute(unit);
if(unit->time == LIVE_GAME_UNIT_TIME_PENALTIES ||
tmp_int <= 0)
g_ptr_array_add(strings, NULL);
else
priority_sum += g_array_index(commentaries, LGCommentary, i).priority;
bounds[i + 1] = priority_sum;
order[i] = -1;
}
gint permutation[priority_sum];
math_generate_permutation(permutation, 1, priority_sum);
for(i=0;i<priority_sum;i++)
{
if(order_idx == commentaries->len)
break;
for(j=0;j<commentaries->len;j++)
if(bounds[j] < permutation[i] && permutation[i] <= bounds[j + 1])
{
sprintf(buf, "%d", tmp_int);
g_ptr_array_add(strings, g_strdup(buf));
if(!query_integer_is_in_array(j, order, 0, commentaries->len))
{
order[order_idx] = j;
order_idx++;
}
break;
}
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_result")) == 0)
{
sprintf(buf, "%d : %d", unit->result[0], unit->result[1]);
g_ptr_array_add(strings, g_strdup(buf));
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_goals_home")) == 0)
{
sprintf(buf, "%d", unit->result[0]);
g_ptr_array_add(strings, g_strdup(buf));
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_goals_away")) == 0)
{
sprintf(buf, "%d", unit->result[1]);
g_ptr_array_add(strings, g_strdup(buf));
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_goal_diff")) == 0)
{
sprintf(buf, "%d", ABS(unit->result[0] - unit->result[1]));
g_ptr_array_add(strings, strdup(buf));
}
else if(strcmp(g_array_index(lg_tokens.list, Option, i).string_value->str,
lg_token("string_lg_commentary_token_extra")) == 0)
g_ptr_array_add(strings, lg_commentary_get_extra_data(unit, fix));
else
{
g_warning("lg_commentary_set_strings: no rule found for token %s.",
g_array_index(lg_tokens.list, Option, i).string_value->str);
main_exit_program(EXIT_GENERAL, NULL);
}
}
}
/** Return the name of a player involved in the unit (or NULL).
@param player Which player we look for. */
gchar*
lg_commentary_get_player_name(const LiveGameUnit *unit, const Fixture *fix, gboolean player2)
/** Fill the stats tokens. */
void
lg_commentary_set_stats_tokens(const LiveGameStats *stats)
{
gchar *return_value = NULL;
token_rep[option_int("string_lg_commentary_token_stat_shots0", &lg_tokens)] =
misc_int_to_char(stats->values[0][LIVE_GAME_STAT_VALUE_SHOTS]);
token_rep[option_int("string_lg_commentary_token_stat_shot_per0", &lg_tokens)] =
misc_int_to_char(stats->values[0][LIVE_GAME_STAT_VALUE_SHOT_PERCENTAGE]);
token_rep[option_int("string_lg_commentary_token_stat_poss0", &lg_tokens)] =
misc_int_to_char(stats->values[0][LIVE_GAME_STAT_VALUE_POSSESSION]);
token_rep[option_int("string_lg_commentary_token_stat_pen0", &lg_tokens)] =
misc_int_to_char(stats->values[0][LIVE_GAME_STAT_VALUE_PENALTIES]);
token_rep[option_int("string_lg_commentary_token_stat_fouls0", &lg_tokens)] =
misc_int_to_char(stats->values[0][LIVE_GAME_STAT_VALUE_FOULS]);
token_rep[option_int("string_lg_commentary_token_stat_yellows0", &lg_tokens)] =
misc_int_to_char(stats->values[0][LIVE_GAME_STAT_VALUE_CARDS]);
token_rep[option_int("string_lg_commentary_token_stat_reds0", &lg_tokens)] =
misc_int_to_char(stats->values[0][LIVE_GAME_STAT_VALUE_REDS]);
token_rep[option_int("string_lg_commentary_token_stat_injs0", &lg_tokens)] =
misc_int_to_char(stats->values[0][LIVE_GAME_STAT_VALUE_INJURIES]);
if((player2 && unit->event.player2 == -1) ||
(!player2 && unit->event.player == -1))
return NULL;
token_rep[option_int("string_lg_commentary_token_stat_shots1", &lg_tokens)] =
misc_int_to_char(stats->values[1][LIVE_GAME_STAT_VALUE_SHOTS]);
token_rep[option_int("string_lg_commentary_token_stat_shot_per1", &lg_tokens)] =
misc_int_to_char(stats->values[1][LIVE_GAME_STAT_VALUE_SHOT_PERCENTAGE]);
token_rep[option_int("string_lg_commentary_token_stat_poss1", &lg_tokens)] =
misc_int_to_char(stats->values[1][LIVE_GAME_STAT_VALUE_POSSESSION]);
token_rep[option_int("string_lg_commentary_token_stat_pen1", &lg_tokens)] =
misc_int_to_char(stats->values[1][LIVE_GAME_STAT_VALUE_PENALTIES]);
token_rep[option_int("string_lg_commentary_token_stat_fouls1", &lg_tokens)] =
misc_int_to_char(stats->values[1][LIVE_GAME_STAT_VALUE_FOULS]);
token_rep[option_int("string_lg_commentary_token_stat_yellows1", &lg_tokens)] =
misc_int_to_char(stats->values[1][LIVE_GAME_STAT_VALUE_CARDS]);
token_rep[option_int("string_lg_commentary_token_stat_reds1", &lg_tokens)] =
misc_int_to_char(stats->values[1][LIVE_GAME_STAT_VALUE_REDS]);
token_rep[option_int("string_lg_commentary_token_stat_injs1", &lg_tokens)] =
misc_int_to_char(stats->values[1][LIVE_GAME_STAT_VALUE_INJURIES]);
}
if(unit->event.type == LIVE_GAME_EVENT_GENERAL)
return_value = (player2) ?
player_get_last_name(player_of_id_team(fix->teams[unit->possession],
unit->event.player2)->name->str) :
player_get_last_name(player_of_id_team(fix->teams[unit->possession],
unit->event.player)->name->str);
else if(unit->event.type == LIVE_GAME_EVENT_LOST_POSSESSION)
/** Fill the tokens that contain general information. */
void
lg_commentary_set_basic_tokens(const LiveGameUnit *unit, const Fixture *fix)
{
gchar buf[SMALL];
gint tmp_int = 1, current_min = live_game_unit_get_minute(unit);
gint avskill0 = (gint)rint(team_get_average_skill(fix->teams[0], TRUE)),
avskill1 = (gint)rint(team_get_average_skill(fix->teams[1], TRUE));
sprintf(buf, "%d : %d", unit->result[0], unit->result[1]);
token_rep[option_int("string_lg_commentary_token_result", &lg_tokens)] =
g_strdup(buf);
token_rep[option_int("string_lg_commentary_token_time", &lg_tokens)] =
misc_int_to_char(unit->time);
token_rep[option_int("string_lg_commentary_token_minute", &lg_tokens)] =
misc_int_to_char(live_game_unit_get_minute(unit));
if(unit->time == LIVE_GAME_UNIT_TIME_EXTRA_TIME)
tmp_int = 120 - current_min;
else if(unit->time == LIVE_GAME_UNIT_TIME_SECOND_HALF)
tmp_int = 90 - current_min;
else if(unit->time == LIVE_GAME_UNIT_TIME_FIRST_HALF)
tmp_int = 45 - current_min;
if(unit->time != LIVE_GAME_UNIT_TIME_PENALTIES && tmp_int > 0)
token_rep[option_int("string_lg_commentary_token_minute_remaining", &lg_tokens)] =
misc_int_to_char(tmp_int);
if(query_fixture_is_draw(fix))
tmp_int = 120 - current_min;
else
tmp_int = 90 - current_min;
if(tmp_int > 0)
token_rep[option_int("string_lg_commentary_token_minute_total", &lg_tokens)] =
misc_int_to_char(tmp_int);
token_rep[option_int("string_lg_commentary_token_goals0", &lg_tokens)] =
misc_int_to_char(unit->result[0]);
token_rep[option_int("string_lg_commentary_token_goals1", &lg_tokens)] =
misc_int_to_char(unit->result[1]);
token_rep[option_int("string_lg_commentary_token_goal_diff", &lg_tokens)] =
misc_int_to_char(ABS(unit->result[0] - unit->result[1]));
token_rep[option_int("string_lg_commentary_token_extra", &lg_tokens)] =
lg_commentary_get_extra_data(unit, fix);
token_rep[option_int("string_lg_commentary_token_possession", &lg_tokens)] =
misc_int_to_char(unit->possession);
token_rep[option_int("string_lg_commentary_token_no_possession", &lg_tokens)] =
misc_int_to_char(!unit->possession);
token_rep[option_int("string_lg_commentary_token_team_avskill0", &lg_tokens)] =
misc_int_to_char(avskill0);
token_rep[option_int("string_lg_commentary_token_team_avskill1", &lg_tokens)] =
misc_int_to_char(avskill1);
token_rep[option_int("string_lg_commentary_token_team_avskilldiff", &lg_tokens)] =
misc_int_to_char(ABS(avskill0 - avskill1));
}
/** Set the tokens containing team data. */
void
lg_commentary_set_team_tokens(const LiveGameUnit *unit, const Fixture *fix)
{
if(unit->result[0] != unit->result[1])
{
return_value = (player2) ?
player_get_last_name(player_of_id_team(fix->teams[!unit->possession],
unit->event.player2)->name->str):
player_get_last_name(player_of_id_team(fix->teams[unit->possession],
unit->event.player)->name->str);
token_rep[option_int("string_lg_commentary_token_team_losing", &lg_tokens)] =
g_strdup(fix->teams[(unit->result[0] > unit->result[1])]->name->str);
token_rep[option_int("string_lg_commentary_token_team_winning", &lg_tokens)] =
g_strdup(fix->teams[(unit->result[0] < unit->result[1])]->name->str);
}
else if(unit->event.type == LIVE_GAME_EVENT_SCORING_CHANCE ||
unit->event.type == LIVE_GAME_EVENT_HEADER ||
unit->event.type == LIVE_GAME_EVENT_PENALTY ||
unit->event.type == LIVE_GAME_EVENT_FREE_KICK)
{
return_value = (player2) ?
player_get_last_name(player_of_id_team(fix->teams[unit->possession],
unit->event.player2)->name->str) :
player_get_last_name(player_of_id_team(fix->teams[unit->possession],
unit->event.player)->name->str);
if(unit->event.team != -1)
token_rep[option_int("string_lg_commentary_token_team", &lg_tokens)] =
g_strdup(fix->teams[unit->event.team]->name->str);
}
/** Set the player tokens. */
void
lg_commentary_set_player_tokens(const LiveGameUnit *unit, const Fixture *fix)
{
Player *pl1 = NULL,
*pl2 = NULL;
if(unit->event.type == LIVE_GAME_EVENT_GENERAL ||
unit->event.type == LIVE_GAME_EVENT_SCORING_CHANCE ||
unit->event.type == LIVE_GAME_EVENT_HEADER ||
unit->event.type == LIVE_GAME_EVENT_PENALTY ||
unit->event.type == LIVE_GAME_EVENT_FREE_KICK)
{
pl1 = player_of_id_team(fix->teams[unit->possession],
unit->event.player);
if(unit->event.player2 != -1)
pl2 = player_of_id_team(fix->teams[unit->possession],
unit->event.player2);
}
else if(unit->event.type == LIVE_GAME_EVENT_GOAL ||
else if(unit->event.type == LIVE_GAME_EVENT_SEND_OFF ||
unit->event.type == LIVE_GAME_EVENT_INJURY ||
unit->event.type == LIVE_GAME_EVENT_TEMP_INJURY ||
unit->event.type == LIVE_GAME_EVENT_SUBSTITUTION)
{
pl1 = player_of_id_team(fix->teams[unit->event.team],
unit->event.player);
if(unit->event.player2 != -1)
pl2 = player_of_id_team(fix->teams[unit->event.team],
unit->event.player2);
}
else if(unit->event.type == LIVE_GAME_EVENT_LOST_POSSESSION ||
unit->event.type == LIVE_GAME_EVENT_GOAL ||
unit->event.type == LIVE_GAME_EVENT_MISS ||
unit->event.type == LIVE_GAME_EVENT_SAVE ||
unit->event.type == LIVE_GAME_EVENT_POST ||
unit->event.type == LIVE_GAME_EVENT_CROSS_BAR)
{
return_value = (player2) ?
player_get_last_name(player_of_id_team(fix->teams[!unit->possession],
unit->event.player2)->name->str) :
player_get_last_name(player_of_id_team(fix->teams[unit->possession],
unit->event.player)->name->str);
pl1 = player_of_id_team(fix->teams[unit->possession],
unit->event.player);
pl2 = player_of_id_team(fix->teams[!unit->possession],
unit->event.player2);
}
else if(unit->event.type == LIVE_GAME_EVENT_OWN_GOAL)
return_value =
player_get_last_name(player_of_id_team(fix->teams[!unit->possession],
unit->event.player)->name->str);
pl1 = player_of_id_team(fix->teams[!unit->possession],
unit->event.player);
else if(unit->event.type == LIVE_GAME_EVENT_FOUL ||
unit->event.type == LIVE_GAME_EVENT_FOUL_RED ||
unit->event.type == LIVE_GAME_EVENT_FOUL_RED_INJURY ||
unit->event.type == LIVE_GAME_EVENT_FOUL_YELLOW)
{
return_value = (player2) ?
player_get_last_name(player_of_id_team(fix->teams[unit->event.team],
unit->event.player2)->name->str) :
player_get_last_name(player_of_id_team(fix->teams[!unit->event.team],
unit->event.player)->name->str);
}
else if(unit->event.type == LIVE_GAME_EVENT_SEND_OFF ||
unit->event.type == LIVE_GAME_EVENT_INJURY ||
unit->event.type == LIVE_GAME_EVENT_TEMP_INJURY ||
unit->event.type == LIVE_GAME_EVENT_SUBSTITUTION)
return_value = (player2) ?
player_get_last_name(player_of_id_team(fix->teams[unit->event.team],
unit->event.player2)->name->str) :
player_get_last_name(player_of_id_team(fix->teams[unit->event.team],
unit->event.player)->name->str);
else
{
g_warning("lg_commentary_get_player_name: unknown event type %d\n",
unit->event.type);
main_exit_program(EXIT_INT_NOT_FOUND, NULL);
pl1 = player_of_id_team(fix->teams[!unit->event.team],
unit->event.player);
pl2 = player_of_id_team(fix->teams[unit->event.team],
unit->event.player2);
}
return return_value;
if(pl1 != NULL)
{
token_rep[option_int("string_lg_commentary_token_player0", &lg_tokens)] =
player_get_last_name(pl1->name->str);
token_rep[option_int("string_lg_commentary_token_player_goals0", &lg_tokens)] =
misc_int_to_char(player_games_goals_get(pl1, fix->clid, PLAYER_VALUE_GOALS));
token_rep[option_int("string_lg_commentary_token_player_goals_all0", &lg_tokens)] =
misc_int_to_char(player_all_games_goals(pl1, PLAYER_VALUE_GOALS));
token_rep[option_int("string_lg_commentary_token_player_yellows", &lg_tokens)] =
misc_int_to_char(player_card_get(pl1, fix->clid, PLAYER_VALUE_CARD_YELLOW));
}
if(pl2 != NULL)
{
token_rep[option_int("string_lg_commentary_token_player1", &lg_tokens)] =
player_get_last_name(pl2->name->str);
token_rep[option_int("string_lg_commentary_token_player_goals1", &lg_tokens)] =
misc_int_to_char(player_games_goals_get(pl2, fix->clid, PLAYER_VALUE_GOALS));
token_rep[option_int("string_lg_commentary_token_player_goals_all1", &lg_tokens)] =
misc_int_to_char(player_all_games_goals(pl2, PLAYER_VALUE_GOALS));
}
}
/** Return some extra data depending on the unit type. */

View File

@ -3,43 +3,44 @@
#include "bygfoot.h"
#include "fixture_struct.h"
#include "lg_commentary_struct.h"
#include "live_game_struct.h"
/** Tokens that get replaced in the commentary text. */
enum LGTokens
{
LG_TOKEN_TEAM_HOME = 0,
LG_TOKEN_TEAM_AWAY,
LG_TOKEN_TEAM_IN_POSS,
LG_TOKEN_TEAM_NOT_IN_POSS,
LG_TOKEN_TEAM_LOSING,
LG_TOKEN_TEAM_WINNING,
LG_TOKEN_TEAM,
LG_TOKEN_ATTENDANCE,
LG_TOKEN_PLAYER1,
LG_TOKEN_PLAYER2,
LG_TOKEN_RESULT,
LG_TOKEN_MINUTE,
LG_TOKEN_GOALS_HOME,
LG_TOKEN_GOALS_AWAY,
LG_TOKEN_GOAL_DIFF,
LG_TOKEN_EXTRA,
LG_TOKEN_END
};
void
lg_commentary_post_match(void);
#define lg_token(name) option_string(name, &lg_tokens)
gchar*
lg_commentary_get_player_name(const LiveGameUnit *unit, const Fixture *fix, gint player);
void
lg_commentary_initialize(const Fixture *fix);
gboolean
lg_commentary_replace_tokens(const gchar *string, const GPtrArray *strings, gchar *dest);
lg_commentary_check_commentary(const LGCommentary *commentary, gchar *dest);
gboolean
lg_commentary_replace_tokens(gchar *commentary_text);
void
lg_commentary_set_strings(GPtrArray *strings, const LiveGameUnit *unit, const Fixture *fix);
lg_commentary_replace_expressions(gchar *commentary_text);
gboolean
lg_commentary_parse_condition(const gchar *condition);
void
lg_commentary_generate(LiveGameUnit *unit, const Fixture *fix);
lg_commentary_get_order(const GArray *commentaries, gint *order);
void
lg_commentary_set_basic_tokens(const LiveGameUnit *unit, const Fixture *fix);;
void
lg_commentary_set_player_tokens(const LiveGameUnit *unit, const Fixture *fix);
void
lg_commentary_set_team_tokens(const LiveGameUnit *unit, const Fixture *fix);
void
lg_commentary_set_stats_tokens(const LiveGameStats *stats);
void
lg_commentary_generate(const LiveGame *live_game, LiveGameUnit *unit);
gchar*
lg_commentary_get_extra_data(const LiveGameUnit *unit, const Fixture *fix);

View File

@ -0,0 +1,21 @@
#ifndef LG_COMMENTARY_STRUCT_H
#define LG_COMMENTARY_STRUCT_H
/** Structure describing a commentary
for the live game. */
typedef struct
{
/** The commentary text (possibly containing tokens). */
GString *text;
/** A condition (if not fulfilled, the commentary doesn't get
shown). */
GString *condition;
/** Priority of the commentary (compared to
the other ones for the same event).
The higher the priority the higher the
probability that the commentary gets picked. */
gint priority;
} LGCommentary;
#endif

View File

@ -7,6 +7,7 @@
#include "live_game.h"
#include "main.h"
#include "maths.h"
#include "misc.h"
#include "misc_callback_func.h"
#include "option.h"
#include "player.h"
@ -39,31 +40,7 @@ void
live_game_calculate_fixture(Fixture *fix)
{
if(stat0 != STATUS_LIVE_GAME_PAUSE)
{
match = (fixture_user_team_involved(fix) != -1) ?
&usr(fixture_user_team_involved(fix)).live_game : &live_game_temp;
show = (fixture_user_team_involved(fix) != -1 &&
option_int("int_opt_user_show_live_game",
&usr(fixture_user_team_involved(fix)).options));
stat2 = fixture_user_team_involved(fix);
statp = match;
live_game_reset(match, fix, TRUE);
if(show)
{
cur_user = stat2;
on_button_back_to_main_clicked(NULL, NULL);
if(window.live == NULL)
window.live = window_create(WINDOW_LIVE);
else
window_live_set_spinbuttons();
}
game_initialize(fix);
}
live_game_initialize(fix);
else
stat0 = STATUS_SHOW_LIVE_GAME;
@ -83,7 +60,44 @@ live_game_calculate_fixture(Fixture *fix)
stat0 != STATUS_LIVE_GAME_PAUSE);
if(last_unit.event.type == LIVE_GAME_EVENT_END_MATCH)
{
if(fixture_user_team_involved(match->fix) != -1)
lg_commentary_post_match();
game_post_match(fix);
}
}
/** Initialize a few things at the beginning of a live game. */
void
live_game_initialize(Fixture *fix)
{
match = (fixture_user_team_involved(fix) != -1) ?
&usr(fixture_user_team_involved(fix)).live_game : &live_game_temp;
show = (fixture_user_team_involved(fix) != -1 &&
option_int("int_opt_user_show_live_game",
&usr(fixture_user_team_involved(fix)).options));
stat2 = fixture_user_team_involved(fix);
statp = match;
live_game_reset(match, fix, TRUE);
if(show)
{
cur_user = stat2;
on_button_back_to_main_clicked(NULL, NULL);
if(window.live == NULL)
window.live = window_create(WINDOW_LIVE);
else
window_live_set_spinbuttons();
}
game_initialize(fix);
if(fixture_user_team_involved(match->fix) != -1)
lg_commentary_initialize(fix);
}
/** Create a game unit for the live game.
@ -216,8 +230,8 @@ live_game_create_start_unit(void)
new.event.player =
new.event.player2 = -1;
new.event.commentary = NULL;
new.minute = 0;
new.event.commentary = NULL;
new.time = LIVE_GAME_UNIT_TIME_FIRST_HALF;
new.possession = math_rndi(0, 1);
new.area = LIVE_GAME_UNIT_AREA_MIDFIELD;
@ -272,9 +286,7 @@ live_game_evaluate_unit(LiveGameUnit *unit)
type);
}
/** Calculate a foul event.
@param general Whether to create a general event after
showing this one. @see live_game_event_general() */
/** Calculate a foul event. */
void
live_game_event_foul(void)
{
@ -581,9 +593,9 @@ live_game_event_penalty(void)
if(last_unit.time != LIVE_GAME_UNIT_TIME_PENALTIES)
{
new = last_unit;
new.event.commentary = NULL;
new.minute = -1;
new.event.type = LIVE_GAME_EVENT_PENALTY;
new.event.commentary = NULL;
g_array_append_val(unis, new);
}
@ -646,8 +658,8 @@ live_game_event_general(gboolean create_new)
{
new.minute = live_game_get_minute();
new.time = last_unit.time;
new.event.commentary = NULL;
new.event.type = LIVE_GAME_EVENT_GENERAL;
new.event.commentary = NULL;
new.result[0] = last_unit.result[0];
new.result[1] = last_unit.result[1];
new.event.team = -1;
@ -874,13 +886,12 @@ live_game_event_substitution(gint team_number, gint sub_in, gint sub_out)
new.minute = -1;
new.time = live_game_get_time(&last_unit);
new.event.commentary = NULL;
new.event.type = LIVE_GAME_EVENT_SUBSTITUTION;
new.event.team = team_number;
new.event.player = sub_in;
new.event.player2 = sub_out;
new.event.commentary = NULL;
if(player_of_id_team(tm[team_number], sub_in)->cskill > 0)
{
@ -905,12 +916,12 @@ live_game_event_team_change(gint team_number, gint event_type)
new.minute = -1;
new.time = live_game_get_time(&last_unit);
new.event.commentary = NULL;
new.event.team = team_number;
new.event.player =
new.event.player2 = -1;
new.event.type = event_type;
new.event.commentary = NULL;
g_array_append_val(unis, new);
@ -933,7 +944,6 @@ live_game_event_duel(void)
new.minute = -1;
new.event.team = new.possession;
new.event.commentary = NULL;
attacker = player_of_id_team(tm[new.possession],
@ -1307,7 +1317,7 @@ live_game_finish_unit(void)
match);
}
lg_commentary_generate(unit, match->fix);
lg_commentary_generate(match, unit);
unit->event.verbosity = live_game_event_get_verbosity(unit->event.type);
}
@ -1514,4 +1524,3 @@ live_game_event_get_verbosity(gint event_type)
return return_value;
}

View File

@ -7,6 +7,12 @@
void
live_game_calculate_fixture(Fixture *fix);
void
live_game_initialize(Fixture *fix);
void
live_game_post_match(void);
gboolean
query_live_game_event_is_break(gint minute, gint time);

View File

@ -8,6 +8,7 @@
#include "file.h"
#include "free.h"
#include "language.h"
#include "lg_commentary_struct.h"
#include "live_game.h"
#include "main.h"
#include "misc_callbacks.h"
@ -65,7 +66,7 @@ main_init_variables(void)
timeout_id = -1;
for(i=0;i<LIVE_GAME_EVENT_END;i++)
lg_commentary[i] = g_ptr_array_new();
lg_commentary[i] = g_array_new(FALSE, FALSE, sizeof(LGCommentary));
file_load_conf_files();

View File

@ -121,10 +121,9 @@ misc_randomise_g_pointer_array(GPtrArray *array)
/** Print a thousands-grouped output of 'number' into 'buf',
like 2 234 345 instead of 2234345.
@param number The number to print.
@buf The buffer to hold the number.
@append Whether to overwrite the buffer or append. */
@buf The buffer to hold the number. */
void
misc_print_grouped_int(gint number, gchar *buf, gboolean append)
misc_print_grouped_int(gint number, gchar *buf)
{
gint i;
gchar buf2[SMALL];
@ -132,8 +131,7 @@ misc_print_grouped_int(gint number, gchar *buf, gboolean append)
gfloat copy = (gfloat)(abs(number));
gint number2 = abs(number);
if(!append)
strcpy(buf, "");
strcpy(buf, "");
while(copy >= 1)
{
@ -341,7 +339,7 @@ misc_parse_value(const gchar *s, gint *value)
/* parse numeric expression (supports + and -) */
const gchar*
misc_parse_expression(const gchar *s, gboolean *result)
misc_parse_expression(const gchar *s, gint *result)
{
gint value = 0;
s = misc_parse_value(s, &value);
@ -367,7 +365,7 @@ misc_parse_expression(const gchar *s, gboolean *result)
/* parse comparison (supports '<', '>' and '=') */
const gchar*
misc_parse_comparison(const gchar *s, gboolean *result)
misc_parse_comparison(const gchar *s, gint *result)
{
gint value = 0;
s = misc_parse_expression(s, result);
@ -413,7 +411,7 @@ misc_parse_comparison(const gchar *s, gboolean *result)
}
const gchar*
misc_parse_and(const gchar *s, gboolean *result)
misc_parse_and(const gchar *s, gint *result)
{
gint value = 0;
s = misc_parse_comparison(s, result);
@ -428,7 +426,7 @@ misc_parse_and(const gchar *s, gboolean *result)
}
const gchar*
misc_parse(const gchar *s, gboolean *result)
misc_parse(const gchar *s, gint *result)
{
gint value = 0;
s = misc_parse_and(s, result);
@ -440,4 +438,3 @@ misc_parse(const gchar *s, gboolean *result)
}
return s;
}

View File

@ -3,6 +3,8 @@
#include "bygfoot.h"
#define misc_int_to_char(number) g_strdup_printf("%d", number)
void
misc_print_error(GError **error, gboolean abort_program);
@ -19,7 +21,7 @@ GPtrArray*
misc_randomise_g_pointer_array(GPtrArray *array);
void
misc_print_grouped_int(gint number, gchar *buf, gboolean append);
misc_print_grouped_int(gint number, gchar *buf);
gboolean
query_integer_is_in_array(gint item, gint *array, gint min, gint max);
@ -58,15 +60,15 @@ const gchar*
misc_parse_value(const gchar *s, gint *value);
const gchar*
misc_parse_expression(const gchar *s, gboolean *result);
misc_parse_expression(const gchar *s, gint *result);
const gchar*
misc_parse_comparison(const gchar *s, gboolean *result);
misc_parse_comparison(const gchar *s, gint *result);
const gchar*
misc_parse_and(const gchar *s, gboolean *result);
misc_parse_and(const gchar *s, gint *result);
const gchar*
misc_parse(const gchar *s, gboolean *result);
misc_parse(const gchar *s, gint *result);
#endif

View File

@ -724,7 +724,7 @@ treeview_create_game_stats(LiveGame *live_game)
}
}
misc_print_grouped_int(live_game->fix->attendance, buf[0], FALSE);
misc_print_grouped_int(live_game->fix->attendance, buf[0]);
sprintf(buf[1], _("Attendance\n%s"), buf[0]);
gtk_list_store_append(ls, &iter);
gtk_list_store_set(ls, &iter, 0, buf[1], 1, "", 2, "", -1);
@ -1236,7 +1236,7 @@ treeview_create_stadium_summary(GtkListStore *ls)
}
gtk_list_store_append(ls, &iter);
misc_print_grouped_int(current_user.tm->stadium.capacity, buf, FALSE);
misc_print_grouped_int(current_user.tm->stadium.capacity, buf);
gtk_list_store_set(ls, &iter, 0, _("Stadium capacity"), 1, buf, 2, "", -1);
gtk_list_store_append(ls, &iter);
@ -1292,7 +1292,7 @@ treeview_create_finances(const User* user)
for(i=0;i<MON_IN_TRANSFERS;i++)
if(in[i] != 0)
{
misc_print_grouped_int(in[i], buf, FALSE);
misc_print_grouped_int(in[i], buf);
gtk_list_store_append(ls, &iter);
gtk_list_store_set(ls, &iter, 0, in_titles[i], 1, buf, 2, "", -1);
balance += in[i];
@ -1301,7 +1301,7 @@ treeview_create_finances(const User* user)
for(i=0;i<MON_OUT_TRANSFERS;i++)
if(out[i] != 0)
{
misc_print_grouped_int(out[i], buf3, FALSE);
misc_print_grouped_int(out[i], buf3);
sprintf(buf, "<span foreground='%s'>%s</span>",
const_app("string_treeview_finances_expenses_fg"), buf3);
gtk_list_store_append(ls, &iter);
@ -1309,7 +1309,7 @@ treeview_create_finances(const User* user)
balance += out[i];
}
misc_print_grouped_int(balance, buf, FALSE);
misc_print_grouped_int(balance, buf);
gtk_list_store_append(ls, &iter);
/* Finances balance. */
gtk_list_store_set(ls, &iter, 0, _("Balance"), 1, "", 2, "", -1);
@ -1325,8 +1325,8 @@ treeview_create_finances(const User* user)
if(in[MON_IN_TRANSFERS] != 0 || out[MON_OUT_TRANSFERS] != 0)
{
misc_print_grouped_int(in[MON_IN_TRANSFERS], buf, FALSE);
misc_print_grouped_int(out[MON_OUT_TRANSFERS], buf3, FALSE);
misc_print_grouped_int(in[MON_IN_TRANSFERS], buf);
misc_print_grouped_int(out[MON_OUT_TRANSFERS], buf3);
sprintf(buf2, "<span foreground='%s'>%s</span>",
const_app("string_treeview_finances_expenses_fg"), buf3);
gtk_list_store_append(ls, &iter);
@ -1336,7 +1336,7 @@ treeview_create_finances(const User* user)
if(out[MON_OUT_STADIUM_IMPROVEMENT] + out[MON_OUT_STADIUM_BILLS] != 0)
{
misc_print_grouped_int(out[MON_OUT_STADIUM_IMPROVEMENT] + out[MON_OUT_STADIUM_BILLS],
buf, FALSE);
buf);
sprintf(buf2, "<span foreground='%s'>%s</span>",
const_app("string_treeview_finances_expenses_fg"), buf);
gtk_list_store_append(ls, &iter);
@ -1346,7 +1346,7 @@ treeview_create_finances(const User* user)
gtk_list_store_append(ls, &iter);
gtk_list_store_set(ls, &iter, 0, "", 1, "", 2, "", -1);
misc_print_grouped_int(user->money, buf, FALSE);
misc_print_grouped_int(user->money, buf);
gtk_list_store_append(ls, &iter);
if(user->money >= 0)
strcpy(buf2, buf);
@ -1355,13 +1355,13 @@ treeview_create_finances(const User* user)
const_app("string_treeview_finances_expenses_fg"), buf);
gtk_list_store_set(ls, &iter, 0, _("Money"), 1, buf2, 2, "", -1);
misc_print_grouped_int(finance_team_drawing_credit_loan(user->tm, FALSE), buf, FALSE);
misc_print_grouped_int(finance_team_drawing_credit_loan(user->tm, FALSE), buf);
gtk_list_store_append(ls, &iter);
gtk_list_store_set(ls, &iter, 0, _("Drawing credit"), 1, buf, 2, "", -1);
if(user->debt != 0)
{
misc_print_grouped_int(user->debt, buf, FALSE);
misc_print_grouped_int(user->debt, buf);
sprintf(buf2, "<span foreground='%s'>%s</span>",
const_app("string_treeview_finances_expenses_fg"), buf);
sprintf(buf, _("Debt (repay in %d weeks)"), user->counters[COUNT_USER_LOAN]);
@ -1376,7 +1376,7 @@ treeview_create_finances(const User* user)
gtk_list_store_set(ls, &iter, 0, _("Sponsor"), 1, user->sponsor.name->str,
2, "", -1);
misc_print_grouped_int(user->sponsor.benefit, buf, FALSE);
misc_print_grouped_int(user->sponsor.benefit, buf);
/* Contract time and money a sponsor pays. */
sprintf(buf2, _("%.1f months / %s"), ((gfloat)user->sponsor.contract) / 4, buf);
gtk_list_store_append(ls, &iter);

View File

@ -933,10 +933,10 @@ treeview_helper_player_to_cell(GtkTreeViewColumn *col,
pl->etal[current_user.scout % 10]);
break;
case PLAYER_LIST_ATTRIBUTE_VALUE:
misc_print_grouped_int(pl->value, buf, FALSE);
misc_print_grouped_int(pl->value, buf);
break;
case PLAYER_LIST_ATTRIBUTE_WAGE:
misc_print_grouped_int(pl->wage, buf, FALSE);
misc_print_grouped_int(pl->wage, buf);
break;
case PLAYER_LIST_ATTRIBUTE_CONTRACT:
treeview_helper_player_contract_to_cell(renderer, buf, pl->contract);

View File

@ -443,26 +443,26 @@ user_event_show_next(void)
game_gui_show_warning(buf);
break;
case EVENT_TYPE_TRANSFER_OFFER_REJECTED_BETTER_OFFER:
misc_print_grouped_int(event->value1, buf2, FALSE);
misc_print_grouped_int(event->value2, buf3, FALSE);
misc_print_grouped_int(event->value1, buf2);
misc_print_grouped_int(event->value2, buf3);
sprintf(buf, _("The owners of %s have rejected your offer (%s / %s) for %s. There was a better offer for the player than yours."), ((Team*)event->value_pointer)->name->str, buf2, buf3, event->value_string->str);
game_gui_show_warning(buf);
break;
case EVENT_TYPE_TRANSFER_OFFER_REJECTED_FEE_WAGE:
misc_print_grouped_int(event->value1, buf2, FALSE);
misc_print_grouped_int(event->value2, buf3, FALSE);
misc_print_grouped_int(event->value1, buf2);
misc_print_grouped_int(event->value2, buf3);
sprintf(buf, _("The owners of %s have rejected your offer (%s / %s) for %s. Neither the fee nor the wage you offered were acceptable, they say."), ((Team*)event->value_pointer)->name->str, buf2, buf3, event->value_string->str);
game_gui_show_warning(buf);
break;
case EVENT_TYPE_TRANSFER_OFFER_REJECTED_FEE:
misc_print_grouped_int(event->value1, buf2, FALSE);
misc_print_grouped_int(event->value2, buf3, FALSE);
misc_print_grouped_int(event->value1, buf2);
misc_print_grouped_int(event->value2, buf3);
sprintf(buf, _("The owners of %s have rejected your offer (%s / %s) for %s. The team owners weren't satisfied with the fee you offered."), ((Team*)event->value_pointer)->name->str, buf2, buf3, event->value_string->str);
game_gui_show_warning(buf);
break;
case EVENT_TYPE_TRANSFER_OFFER_REJECTED_WAGE:
misc_print_grouped_int(event->value1, buf2, FALSE);
misc_print_grouped_int(event->value2, buf3, FALSE);
misc_print_grouped_int(event->value1, buf2);
misc_print_grouped_int(event->value2, buf3);
/* A player from a team has rejected a transfer offer. */
sprintf(buf, _("%s of %s has rejected your offer (%s / %s). He wasn't satisfied with the wage you offered."),
event->value_string->str,

View File

@ -35,7 +35,7 @@ OptionList settings;
OptionList lg_tokens;
/** The array containing the live game commentary strings. */
GPtrArray *lg_commentary[LIVE_GAME_EVENT_END];
GArray *lg_commentary[LIVE_GAME_EVENT_END];
/** The array containing players to be transfered.
@see TransferPlayer */

View File

@ -10,6 +10,9 @@
#define TAG_EVENT_NAME "name"
#define TAG_EVENT_COMMENTARY "commentary"
#define ATT_NAME_CONDITION "cond"
#define ATT_NAME_PRIORITY "pri"
#define EVENT_NAME_GENERAL "general"
#define EVENT_NAME_START_MATCH "start_match"
#define EVENT_NAME_HALF_TIME "half_time"
@ -52,8 +55,8 @@ enum XmlLgCommentaryStates
STATE_END
};
gint state, commentary_idx;
gchar condition[SMALL];
gint state, commentary_idx, priority;
GString *condition;
/**
* The function called by the parser when an opening tag is read.
@ -69,6 +72,8 @@ xml_lg_commentary_read_start_element (GMarkupParseContext *context,
gpointer user_data,
GError **error)
{
gint atidx = 0;
if(strcmp(element_name, TAG_EVENT) == 0)
state = STATE_EVENT;
else if(strcmp(element_name, TAG_EVENT_NAME) == 0)
@ -76,10 +81,20 @@ xml_lg_commentary_read_start_element (GMarkupParseContext *context,
else if(strcmp(element_name, TAG_EVENT_COMMENTARY) == 0)
{
state = STATE_EVENT_COMMENTARY;
if(attribute_names[0] != NULL)
sprintf(condition, "#%s", attribute_values[0]);
else
strcpy(condition, "");
condition = NULL;
priority = 1;
while(attribute_names[atidx] != NULL)
{
if(strcmp(attribute_names[atidx], ATT_NAME_CONDITION) == 0)
condition = g_string_new(attribute_values[atidx]);
else if(strcmp(attribute_names[atidx], ATT_NAME_PRIORITY) == 0)
priority = (gint)g_ascii_strtod(attribute_values[atidx], NULL);
atidx++;
}
}
else if(strcmp(element_name, TAG_LG_COMMENTARY) != 0)
g_warning("xml_lg_commentary_read_start_element: unknown tag: %s; I'm in state %d\n",
@ -121,7 +136,7 @@ xml_lg_commentary_read_text (GMarkupParseContext *context,
GError **error)
{
gchar buf[text_len + 1];
GString *commentary = NULL;
LGCommentary commentary;
strncpy(buf, text, text_len);
buf[text_len] = '\0';
@ -195,9 +210,10 @@ xml_lg_commentary_read_text (GMarkupParseContext *context,
}
else if(state == STATE_EVENT_COMMENTARY)
{
commentary = g_string_new("");
g_string_printf(commentary, "%s%s", condition, buf);
g_ptr_array_add(lg_commentary[commentary_idx], commentary);
commentary.text = g_string_new(buf);
commentary.condition = condition;
commentary.priority = MAX(1, priority);
g_array_append_val(lg_commentary[commentary_idx], commentary);
}
}
@ -219,7 +235,6 @@ xml_lg_commentary_read(const gchar *commentary_file)
gchar *file_contents;
gint length;
GError *error = NULL;
gint i;
context =
g_markup_parse_context_new(&parser, 0, NULL, NULL);
@ -237,11 +252,7 @@ xml_lg_commentary_read(const gchar *commentary_file)
return;
}
for(i=0;i<LIVE_GAME_EVENT_END;i++)
{
free_g_string_array(&lg_commentary[i]);
lg_commentary[i] = g_ptr_array_new();
}
free_lg_commentary(TRUE);
if(g_markup_parse_context_parse(context, file_contents, length, &error))
{

View File

@ -725,9 +725,9 @@ int_name_max_product 2000
# list instead of the specified one
float_name_random_list_prob 2000
string_language_names English Deutsch Nederlands
string_language_codes C de_DE nl_NL
string_language_symbols flag_england.png flag_germany.png flag_nl.png
string_language_names English Deutsch Français Nederlands
string_language_codes C de_DE fr_FR nl_NL
string_language_symbols flag_england.png flag_germany.png flag_france.png flag_nl.png
# lower and upper limits of which percentage
# of the player wages a sponsor pays; the actual