bygfoot/src/user.c

736 lines
23 KiB
C
Raw Normal View History

2005-04-16 09:46:04 +02:00
#include "cup.h"
2005-03-13 16:46:15 +01:00
#include "fixture.h"
#include "free.h"
2005-03-18 23:03:23 +01:00
#include "game_gui.h"
2005-04-16 09:46:04 +02:00
#include "league.h"
2005-04-04 12:36:04 +02:00
#include "live_game.h"
2005-01-09 21:21:22 +01:00
#include "maths.h"
2005-03-20 21:49:55 +01:00
#include "misc.h"
#include "option.h"
2005-01-09 21:21:22 +01:00
#include "player.h"
2005-03-27 19:59:57 +02:00
#include "team.h"
2005-03-20 21:49:55 +01:00
#include "transfer.h"
2005-04-07 18:44:33 +02:00
#include "treeview.h"
2005-01-09 21:21:22 +01:00
#include "user.h"
2005-03-20 21:49:55 +01:00
#include "window.h"
2005-01-09 21:21:22 +01:00
/** Create a new user with default values. */
User
user_new(void)
{
User new;
new.name = g_string_new("NONAME");
new.tm = NULL;
2005-04-13 15:01:59 +02:00
new.team_id = -1;
2005-04-04 12:36:04 +02:00
live_game_reset(&new.live_game, NULL, FALSE);
2005-03-10 21:59:39 +01:00
2005-03-18 23:03:23 +01:00
new.events = g_array_new(FALSE, FALSE, sizeof(Event));
2005-04-16 09:46:04 +02:00
new.history = g_array_new(FALSE, FALSE, sizeof(UserHistory));
2005-03-24 08:42:24 +01:00
new.options.list = NULL;
new.options.datalist = NULL;
2005-03-17 21:26:01 +01:00
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. */
2005-01-09 21:21:22 +01:00
void
user_set_up_team_new_game(User *user)
2005-01-09 21:21:22 +01:00
{
gchar buf[SMALL];
gint rndom, max, lig_idx = -1;
if(user->scout == 0)
user_set_up_team(user);
2005-01-09 21:21:22 +01:00
else
{
if(user->scout == 1 &&
lig(0).id != user->tm->clid)
2005-01-09 21:21:22 +01:00
lig_idx = 0;
else if(lig(ligs->len - 1).id != user->tm->clid)
2005-01-09 21:21:22 +01:00
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",
user->tm->name->str);
g_string_printf(user->tm->name, "%s", buf);
2005-01-09 21:21:22 +01:00
user->tm = &g_array_index(lig(lig_idx).teams, Team, rndom);
2005-04-13 15:01:59 +02:00
user->team_id = g_array_index(lig(lig_idx).teams, Team, rndom).id;
2005-01-09 21:21:22 +01:00
user_set_up_team(user);
2005-01-09 21:21:22 +01:00
}
}
/** Set up finances, remove some players etc. for a new user team.
@param user The user whose team we set up. */
2005-01-09 21:21:22 +01:00
void
user_set_up_team(User *user)
2005-01-09 21:21:22 +01:00
{
gint i, j;
for(i=PLAYER_POS_DEFENDER; i<=PLAYER_POS_FORWARD; i++)
for(j=user->tm->players->len - 1; j > 10; j--)
if(g_array_index(user->tm->players, Player, j).pos == i)
2005-01-09 21:21:22 +01:00
{
player_remove_from_team(user->tm, j);
2005-01-09 21:21:22 +01:00
break;
}
user->scout = user->physio = QUALITY_AVERAGE;
2005-01-09 21:21:22 +01:00
2005-04-16 09:46:04 +02:00
user->tm->style = 0;
user_set_up_finances(user);
2005-03-18 23:03:23 +01:00
user_set_up_counters(user);
2005-01-09 21:21:22 +01:00
}
2005-03-18 23:03:23 +01:00
/** Set the counters of the user to their initial values. */
void
user_set_up_counters(User *user)
{
gint i;
for(i=0;i<COUNT_USER_END;i++)
user->counters[i] = 0;
user->counters[COUNT_USER_LOAN] =
user->counters[COUNT_USER_POSITIVE] = -1;
}
/** Set up the user's finances when he's got a new team.
@param user The user we set up the finances for. */
2005-01-09 21:21:22 +01:00
void
user_set_up_finances(User *user)
2005-01-09 21:21:22 +01:00
{
gint i;
2005-03-16 21:48:25 +01:00
for(i=0; i<MON_OUT_END;i++)
user->money_out[0][i] = user->money_out[1][i] = 0;
for(i=0; i<MON_IN_END;i++)
user->money_in[0][i] = user->money_in[1][i] = 0;
user->debt = 0;
user->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)
{
2005-03-27 19:59:57 +02:00
gint i;
if(regenerate_team)
{
for(i=0;i<usr(idx).tm->players->len;i++)
free_player(&g_array_index(usr(idx).tm->players, Player, i));
team_generate_players_stadium(usr(idx).tm);
}
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);
2005-01-09 21:21:22 +01:00
2005-03-23 20:03:26 +01:00
for(i=0;i<user->options.list->len;i++)
if(g_str_has_prefix(g_array_index(user->options.list, Option, i).name->str, prefix))
{
2005-03-23 20:03:26 +01:00
attribute->on_off[cnt] = g_array_index(user->options.list, Option, i).value;
cnt++;
}
2005-01-09 21:21:22 +01:00
}
2005-03-13 16:46:15 +01:00
/** Find out whether there are user games at the specified date. */
gboolean
2005-04-07 18:44:33 +02:00
query_user_games_in_week_round(gint week_number, gint week_round_number)
{
gint i;
for(i=0;i<users->len;i++)
if(query_user_game_in_week_round(i, week_number, week_round_number))
return TRUE;
return FALSE;
}
/** Find out whether the specified user has a match at the specified date. */
gboolean
query_user_game_in_week_round(gint usr_idx, gint week_number, gint week_round_number)
2005-03-13 16:46:15 +01:00
{
gint i, j;
if(week_round_number == 1)
{
for(i=0;i<ligs->len;i++)
for(j=0;j<lig(i).fixtures->len;j++)
2005-04-07 18:44:33 +02:00
if(fixture_user_team_involved(&g_array_index(lig(i).fixtures, Fixture, j)) == usr_idx &&
2005-03-13 16:46:15 +01:00
g_array_index(lig(i).fixtures, Fixture, j).week_number == week_number &&
g_array_index(lig(i).fixtures, Fixture, j).week_round_number == week_round_number)
return TRUE;
}
else
{
2005-04-25 21:39:43 +02:00
for(i=0;i<acps->len;i++)
for(j=0;j<acp(i)->fixtures->len;j++)
if(fixture_user_team_involved(&g_array_index(acp(i)->fixtures, Fixture, j)) == usr_idx &&
g_array_index(acp(i)->fixtures, Fixture, j).week_number == week_number &&
g_array_index(acp(i)->fixtures, Fixture, j).week_round_number == week_round_number)
2005-03-13 16:46:15 +01:00
return TRUE;
}
return FALSE;
}
2005-03-14 18:47:27 +01:00
2005-04-07 18:44:33 +02:00
2005-03-14 18:47:27 +01:00
/** Get the user managing the team.
@param tm The team.
@return A pointer to the user. */
User*
user_from_team(const Team *tm)
{
gint i;
for(i=0;i<users->len;i++)
if(usr(i).tm == tm)
return &usr(i);
g_warning("User going with team %s not found.\n",
tm->name->str);
return NULL;
}
2005-03-17 21:26:01 +01:00
2005-04-25 18:49:54 +02:00
/** Check the success counter of the user and offer a new job or
fire him if the counter says so. */
void
user_job_offer(User *user)
{
gchar buf[SMALL];
Team *new_team = NULL;
if(math_rnd(0, 1) > const_float("float_user_success_counter_check") ||
ABS(user->counters[COUNT_USER_SUCCESS]) < (gfloat)const_int("int_user_success_offer_limit") * 0.9)
return;
if(user->counters[COUNT_USER_SUCCESS] < -(gfloat)const_int("int_user_success_offer_limit") * 0.9 &&
!user->counters[COUNT_USER_WARNING])
{
sprintf(buf, "The owners of %s are not satisfied with the recent performance of the team. There are rumours they're looking for a new manager.", user->tm->name->str);
user_event_add(user, EVENT_TYPE_WARNING, -1, -1, NULL, buf);
user->counters[COUNT_USER_WARNING] = 1;
return;
}
if(math_rnd(0, 1) < const_float("float_user_success_base_prob") *
log((gfloat)ABS(user->counters[COUNT_USER_SUCCESS]) *
const_float("float_user_success_prob_factor")))
{
if(user->counters[COUNT_USER_SUCCESS] < 0)
{
new_team = team_get_new(user->tm, TRUE);
user_event_add(user, EVENT_TYPE_FIRE_FAILURE, -1, -1, new_team, NULL);
user_history_add(user, USER_HISTORY_FIRE_FAILURE, user->tm->id,
new_team->id, new_team->clid, "");
}
else if(option_int("int_opt_user_show_job_offers", &user->options))
{
new_team = team_get_new(user->tm, FALSE);
user_event_add(user, EVENT_TYPE_JOB_OFFER, -1, -1, new_team, NULL);
}
}
}
2005-03-17 21:26:01 +01:00
/** Update the counters of the users. */
void
user_weekly_update_counters(User *user)
{
2005-04-24 12:17:20 +02:00
gint rank = team_get_league_rank(user->tm);
gint teamslen = (league_cup_get_teams(user->tm->clid))->len;
gint rank_bounds[2] = {(gint)rint(const_float("float_user_success_table_bound_upper") *
(gfloat)teamslen),
(gint)rint(const_float("float_user_success_table_bound_lower") *
(gfloat)teamslen)};
2005-03-17 21:26:01 +01:00
gint *cnts = user->counters;
gint increase_capacity;
gfloat increase_safety;
if(cnts[COUNT_USER_STADIUM_CAPACITY] > 0)
{
increase_capacity = math_rndi(const_int("int_stadium_improvement_base_seats") -
const_int("int_stadium_improvement_seats_variance"),
const_int("int_stadium_improvement_base_seats") +
const_int("int_stadium_improvement_seats_variance"));
user->tm->stadium.capacity += MIN(cnts[COUNT_USER_STADIUM_CAPACITY],
increase_capacity);
cnts[COUNT_USER_STADIUM_CAPACITY] =
MAX(cnts[COUNT_USER_STADIUM_CAPACITY] - increase_capacity, 0);
}
if(cnts[COUNT_USER_STADIUM_SAFETY] > 0)
{
increase_safety = math_rnd(const_float("float_stadium_improvement_base_safety") -
const_float("float_stadium_improvement_safety_variance"),
const_float("float_stadium_improvement_base_safety") +
const_float("float_stadium_improvement_safety_variance"));
user->tm->stadium.safety += MIN((gfloat)cnts[COUNT_USER_STADIUM_SAFETY] / 100,
increase_safety);
user->tm->stadium.safety = MIN(user->tm->stadium.safety, 1);
cnts[COUNT_USER_STADIUM_SAFETY] =
MAX(cnts[COUNT_USER_STADIUM_SAFETY] - (gint)rint(increase_safety * 100), 0);
}
2005-04-24 12:17:20 +02:00
2005-04-24 16:19:57 +02:00
if(query_league_matches_in_week(league_from_clid(user->tm->clid), week))
2005-04-24 12:17:20 +02:00
{
2005-04-24 16:19:57 +02:00
if(rank < rank_bounds[0])
user->counters[COUNT_USER_SUCCESS] += (rank_bounds[0] - rank);
else if(rank > rank_bounds[1])
2005-04-25 21:01:11 +02:00
user->counters[COUNT_USER_SUCCESS] -= (rank - rank_bounds[1]);
2005-04-24 12:17:20 +02:00
else
2005-04-24 16:19:57 +02:00
{
if(user->counters[COUNT_USER_SUCCESS] > 0)
user->counters[COUNT_USER_SUCCESS] -= const_int("int_user_success_mediocre_rank_change");
else
user->counters[COUNT_USER_SUCCESS] += const_int("int_user_success_mediocre_rank_change");
}
2005-04-24 12:17:20 +02:00
}
2005-03-18 23:03:23 +01:00
}
/** Return a default new user event. */
Event
user_event_new(void)
{
Event new;
new.user = NULL;
new.type = -1;
new.value1 = new.value2 = -1;
2005-03-19 21:04:08 +01:00
new.value_pointer = NULL;
new.value_string = NULL;
2005-03-18 23:03:23 +01:00
return new;
}
/** Add an event with the specified values to the event array of the user. */
void
user_event_add(User *user, gint type, gint value1, gint value2,
2005-03-19 21:04:08 +01:00
gpointer value_pointer, gchar *value_string)
2005-03-18 23:03:23 +01:00
{
Event new = user_event_new();
2005-03-17 21:26:01 +01:00
2005-03-18 23:03:23 +01:00
new.user = user;
new.type = type;
new.value1 = value1;
new.value2 = value2;
2005-03-19 21:04:08 +01:00
new.value_pointer = value_pointer;
2005-03-18 23:03:23 +01:00
2005-03-19 21:04:08 +01:00
if(value_string != NULL)
new.value_string = g_string_new(value_string);
2005-03-21 11:16:37 +01:00
else
new.value_string = NULL;
2005-03-18 23:03:23 +01:00
g_array_append_val(user->events, new);
}
/** Remove an event from the user event array.
@param user The user.
@param idx The index of the event in the array. */
void
user_event_remove(User *user, gint idx)
{
free_event(&g_array_index(user->events, Event, idx));
g_array_remove_index(user->events, idx);
}
2005-03-21 11:16:37 +01:00
/** Find the event index going with the values. */
gint
user_event_get_index(User *user, gint type, gint value1, gint value2,
gpointer value_pointer, gchar *value_string)
{
gint i;
for(i=0;i<user->events->len;i++)
if(g_array_index(user->events, Event, i).type == type &&
g_array_index(user->events, Event, i).value1 == value1 &&
g_array_index(user->events, Event, i).value2 == value2 &&
g_array_index(user->events, Event, i).value_pointer == value_pointer &&
((gpointer)g_array_index(user->events, Event, i).value_string == (gpointer)value_string ||
strcmp(g_array_index(user->events, Event, i).value_string->str, value_string) == 0))
return i;
g_warning("user_event_get_index: didn't find index.");
return -1;
}
2005-03-18 23:03:23 +01:00
/** Show the next event for the current user. */
void
user_event_show_next(void)
{
Event *event = NULL;
2005-03-20 21:49:55 +01:00
gchar buf[BIG],
buf2[SMALL], buf3[SMALL];
2005-03-21 11:16:37 +01:00
gint temp_int = -1;
2005-03-18 23:03:23 +01:00
if(current_user.events->len == 0)
return;
2005-04-07 18:44:33 +02:00
stat1 = STATUS_SHOW_EVENT;
2005-03-18 23:03:23 +01:00
event = &g_array_index(current_user.events, Event, 0);
switch(event->type)
{
default:
g_warning("user_event_show_next: unknown event type %d\n", event->type);
break;
case EVENT_TYPE_PLAYER_LEFT:
sprintf(buf, _("%s has left your team because his contract expired."),
2005-03-19 21:04:08 +01:00
event->value_string->str);
2005-03-18 23:03:23 +01:00
game_gui_show_warning(buf);
break;
2005-03-19 21:04:08 +01:00
case EVENT_TYPE_WARNING:
game_gui_show_warning(event->value_string->str);
2005-03-18 23:03:23 +01:00
break;
case EVENT_TYPE_FIRE_FINANCE:
2005-04-25 18:49:54 +02:00
stat2 = STATUS_JOB_OFFER_FIRE_FINANCE;
2005-03-19 21:04:08 +01:00
statp = event->value_pointer;
game_gui_show_job_offer((Team*)event->value_pointer, STATUS_JOB_OFFER_FIRE_FINANCE);
break;
2005-04-25 18:49:54 +02:00
case EVENT_TYPE_FIRE_FAILURE:
stat2 = STATUS_JOB_OFFER_FIRE_FAILURE;
statp = event->value_pointer;
game_gui_show_job_offer((Team*)event->value_pointer, STATUS_JOB_OFFER_FIRE_FAILURE);
break;
case EVENT_TYPE_JOB_OFFER:
stat2 = STATUS_JOB_OFFER_SUCCESS;
statp = event->value_pointer;
game_gui_show_job_offer((Team*)event->value_pointer, STATUS_JOB_OFFER_SUCCESS);
break;
2005-03-19 21:04:08 +01:00
case EVENT_TYPE_OVERDRAW:
if(event->value1 == 1)
2005-04-16 09:46:04 +02:00
sprintf(buf, _("You have overdrawn your bank account. The team owners give you %d weeks to get above your drawing credit limit."), const_int("int_finance_overdraw_positive"));
2005-03-19 21:04:08 +01:00
else
2005-04-16 09:46:04 +02:00
sprintf(buf, _("You have overdrawn your bank account once again. Bear in mind that after the fourth time you get fired.\nThe team owners give you %d weeks to get above your drawing credit limit."), const_int("int_finance_overdraw_positive"));
2005-03-19 21:04:08 +01:00
game_gui_show_warning(buf);
break;
case EVENT_TYPE_TRANSFER_OFFER_REJECTED:
sprintf(buf, _("The owners of %s have rejected your offer for %s. Either the fee or the wage you suggested was too low, apparently."), ((Team*)event->value_pointer)->name->str, event->value_string->str);
game_gui_show_warning(buf);
break;
case EVENT_TYPE_TRANSFER_OFFER_MONEY:
sprintf(buf, _("You didn't have enough money to buy %s from %s."),
event->value_string->str, ((Team*)event->value_pointer)->name->str);
game_gui_show_warning(buf);
break;
case EVENT_TYPE_TRANSFER_OFFER_ROSTER:
sprintf(buf, _("Your roster is full. You couldn't buy %s from %s."),
event->value_string->str, ((Team*)event->value_pointer)->name->str);
game_gui_show_warning(buf);
break;
case EVENT_TYPE_TRANSFER_OFFER_ACCEPTED:
sprintf(buf, _("Congratulations! The owners of %s have accepted your offer for %s!"),
((Team*)event->value_pointer)->name->str, event->value_string->str);
game_gui_show_warning(buf);
2005-03-20 21:49:55 +01:00
break;
case EVENT_TYPE_TRANSFER_OFFER:
2005-03-21 11:16:37 +01:00
temp_int = transfer_get_index(event->user->tm, event->value1);
misc_print_grouped_int(transoff(temp_int, 0).fee, buf2, FALSE);
misc_print_grouped_int(ABS(transoff(temp_int, 0).fee -
2005-04-13 15:01:59 +02:00
player_of_id_team(event->user->tm, trans(temp_int).id)->value), buf3, FALSE);
2005-03-21 11:16:37 +01:00
if(transoff(temp_int, 0).fee -
2005-04-13 15:01:59 +02:00
player_of_id_team(event->user->tm, trans(temp_int).id)->value > 0)
2005-03-20 21:49:55 +01:00
strcat(buf3, " more");
else
strcat(buf3, " less");
2005-03-21 11:16:37 +01:00
sprintf(buf, _("%s would like to buy %s. They offer %s for him, which is %s than the player's value. Do you accept?"), transoff(temp_int, 0).tm->name->str,
2005-04-13 15:01:59 +02:00
player_of_id_team(event->user->tm, trans(temp_int).id)->name->str,
2005-03-20 21:49:55 +01:00
buf2, buf3);
2005-04-07 18:44:33 +02:00
stat1 = STATUS_TRANSFER_OFFER;
stat2 = temp_int;
window_show_yesno(buf);
2005-03-18 23:03:23 +01:00
break;
2005-03-21 11:16:37 +01:00
case EVENT_TYPE_TRANSFER_OFFER_OUTBID:
sprintf(buf, _("There was a higher bid for %s than yours."),
event->value_string->str);
game_gui_show_warning(buf);
break;
2005-04-07 18:44:33 +02:00
case EVENT_TYPE_PLAYER_CAREER_STOP:
2005-04-13 15:01:59 +02:00
sprintf(buf, _("%s's injury was so severe that he can't play football on a professional level anymore. He leaves your team."), player_of_id_team(event->user->tm, event->value1)->name->str);
2005-04-07 18:44:33 +02:00
if(event->user->tm->players->len < 12)
{
strcat(buf, _(" Fortunately he's got a cousin who can help your team out."));
2005-04-13 15:01:59 +02:00
player_replace_by_new(player_of_id_team(event->user->tm, event->value1), TRUE);
2005-04-07 18:44:33 +02:00
}
else
player_remove_from_team(event->user->tm, player_id_index(event->user->tm, event->value1));
treeview_show_user_player_list();
game_gui_show_warning(buf);
break;
2005-03-18 23:03:23 +01:00
}
2005-03-20 21:49:55 +01:00
user_event_remove(&current_user, 0);
2005-03-18 23:03:23 +01:00
}
/** Change the team of a user. */
void
user_change_team(User *user, Team *tm)
{
gint i;
2005-03-18 23:03:23 +01:00
user->tm = tm;
2005-04-13 15:01:59 +02:00
user->team_id = tm->id;
2005-03-17 21:26:01 +01:00
2005-03-18 23:03:23 +01:00
user_set_up_team(user);
for(i=user->events->len - 1; i >= 0; i--)
user_event_remove(user, i);
2005-03-17 21:26:01 +01:00
}
2005-03-19 21:04:08 +01:00
/** Return the index of the user in the users array. */
gint
user_get_index(User *user)
{
gint i;
for(i=0;i<users->len;i++)
if(&usr(i) == user)
return i;
g_warning("user_get_index: user not found.\n");
return -1;
}
2005-04-07 18:44:33 +02:00
/** Check whether one of the user teams has an unfit player
in the startup formation. */
gboolean
query_user_teams_have_unfit(void)
{
gint i, j;
for(i=0;i<users->len;i++)
{
if(query_user_game_in_week_round(i, week, week_round))
{
for(j=0;j<11;j++)
if(g_array_index(usr(i).tm->players, Player, j).health != 0 ||
2005-04-23 12:39:46 +02:00
player_is_banned(&g_array_index(usr(i).tm->players, Player, j)) > 0)
2005-04-07 18:44:33 +02:00
return TRUE;
}
}
return FALSE;
}
2005-04-16 09:46:04 +02:00
/** Compare function for history sorting. */
gint
user_history_compare(gconstpointer a, gconstpointer b)
{
gint return_value = 0;
const UserHistory *his1 = (const UserHistory*)a,
*his2 = (const UserHistory*)b;
if(his1->season < his2->season)
return_value = 1;
else if(his1->season > his2->season)
return_value = -1;
else if(his1->week < his2->week)
return_value = 1;
else if(his1->week > his2->week)
return_value = -1;
return return_value;
}
/** Add an element to the user history filled with the given values. */
void
user_history_add(User *user, gint type, gint team_id,
gint value1, gint value2, gchar *string)
{
gint i;
UserHistory new_history;
UserHistory *his = &new_history;
gboolean replace = FALSE;
if(type == USER_HISTORY_WIN_FINAL ||
type == USER_HISTORY_LOSE_FINAL ||
type == USER_HISTORY_REACH_CUP_ROUND)
{
for(i=0;i<user->history->len;i++)
if((g_array_index(user->history, UserHistory, i).type == USER_HISTORY_WIN_FINAL ||
g_array_index(user->history, UserHistory, i).type == USER_HISTORY_LOSE_FINAL ||
g_array_index(user->history, UserHistory, i).type == USER_HISTORY_REACH_CUP_ROUND) &&
g_array_index(user->history, UserHistory, i).season == season &&
g_array_index(user->history, UserHistory, i).team_id == team_id &&
g_array_index(user->history, UserHistory, i).value1 == value1)
{
/** Same cup round. */
if(g_array_index(user->history, UserHistory, i).value2 == value2 &&
type == USER_HISTORY_REACH_CUP_ROUND)
return;
his = &g_array_index(user->history, UserHistory, i);
replace = TRUE;
break;
}
}
2005-04-24 12:17:20 +02:00
if(type == USER_HISTORY_WIN_FINAL)
{
if(cup_from_clid(value1)->type == CUP_TYPE_INTERNATIONAL)
user->counters[COUNT_USER_SUCCESS] +=
const_int("int_user_success_international_winner");
else if(cup_from_clid(value1)->type == CUP_TYPE_NATIONAL)
user->counters[COUNT_USER_SUCCESS] +=
const_int("int_user_success_national_winner");
}
else if(type == USER_HISTORY_LOSE_FINAL)
{
if(cup_from_clid(value1)->type == CUP_TYPE_INTERNATIONAL)
user->counters[COUNT_USER_SUCCESS] +=
const_int("int_user_success_international_final");
else if(cup_from_clid(value1)->type == CUP_TYPE_NATIONAL)
user->counters[COUNT_USER_SUCCESS] +=
const_int("int_user_success_national_final");
}
else if(type == USER_HISTORY_REACH_CUP_ROUND)
{
if(value2 == cup_from_clid(value1)->rounds->len - 2)
{
if(cup_from_clid(value1)->type == CUP_TYPE_INTERNATIONAL)
user->counters[COUNT_USER_SUCCESS] +=
const_int("int_user_success_international_semis");
else if(cup_from_clid(value1)->type == CUP_TYPE_NATIONAL)
user->counters[COUNT_USER_SUCCESS] +=
const_int("int_user_success_national_semis");
}
else if(value2 == cup_from_clid(value1)->rounds->len - 3)
{
if(cup_from_clid(value1)->type == CUP_TYPE_INTERNATIONAL)
user->counters[COUNT_USER_SUCCESS] +=
const_int("int_user_success_international_quarter");
else if(cup_from_clid(value1)->type == CUP_TYPE_NATIONAL)
user->counters[COUNT_USER_SUCCESS] +=
const_int("int_user_success_national_quarter");
}
}
2005-04-25 18:49:54 +02:00
else if(type == USER_HISTORY_PROMOTED)
user->counters[COUNT_USER_SUCCESS] +=
const_int("int_user_success_promotion");
else if(type == USER_HISTORY_RELEGATED)
user->counters[COUNT_USER_SUCCESS] -=
const_int("int_user_success_relegation");
2005-04-24 12:17:20 +02:00
2005-04-16 09:46:04 +02:00
his->season = season;
his->week = week;
his->type = type;
his->team_id = team_id;
his->value1 = value1;
his->value2 = value2;
if(replace)
{
g_string_printf(his->value_string, "%s", string);
g_array_sort(user->history, (GCompareFunc)user_history_compare);
}
else
{
his->value_string = g_string_new(string);
g_array_prepend_val(user->history, *his);
}
}
/** Write the text corresponding to the history event
into the buffer. */
void
user_history_to_string(const UserHistory *history, gchar *buf)
{
gchar buf2[SMALL];
2005-04-16 09:46:04 +02:00
switch(history->type)
{
default:
g_warning("user_history_to_string: unknown history type %d.\n", history->type);
strcpy(buf, "FIXME!!!");
case USER_HISTORY_START_GAME:
sprintf(buf, "You start the game with %s in the %s.",
team_of_id(history->team_id)->name->str,
league_cup_get_name_string(history->value1));
break;
case USER_HISTORY_FIRE_FINANCES:
sprintf(buf, "%s fires you because of financial mismanagement.\nYou find a new job with %s in the %s.",
team_of_id(history->team_id)->name->str,
team_of_id(history->value1)->name->str,
league_cup_get_name_string(history->value2));
break;
case USER_HISTORY_FIRE_FAILURE:
sprintf(buf, "%s fires you because of unsuccessfulness.\nYou find a new job with %s in the %s.",
team_of_id(history->team_id)->name->str,
team_of_id(history->value1)->name->str,
league_cup_get_name_string(history->value2));
break;
case USER_HISTORY_JOB_OFFER_ACCEPTED:
sprintf(buf, "%s offer you a job in the %s.\nYou accept the challenge and leave %s.",
team_of_id(history->value1)->name->str,
league_cup_get_name_string(history->value2),
team_of_id(history->team_id)->name->str);
break;
case USER_HISTORY_END_SEASON:
sprintf(buf, "You finish the season in %s on rank %d.",
league_cup_get_name_string(history->value1),
history->value2);
break;
case USER_HISTORY_PROMOTED:
sprintf(buf, "You get promoted to the %s.",
league_cup_get_name_string(history->value1));
break;
case USER_HISTORY_RELEGATED:
sprintf(buf, "You get relegated to the %s.",
league_cup_get_name_string(history->value1));
break;
case USER_HISTORY_WIN_FINAL:
sprintf(buf, "You win the %s final against %s.",
league_cup_get_name_string(history->value1),
history->value_string->str);
break;
case USER_HISTORY_LOSE_FINAL:
sprintf(buf, "You lose in the %s final against %s.",
league_cup_get_name_string(history->value1),
history->value_string->str);
break;
case USER_HISTORY_REACH_CUP_ROUND:
cup_get_round_name(cup_from_clid(history->value1), history->value2, buf2);
sprintf(buf, "You reach the %s (round %d) of the %s.", buf2,
history->value2 + 1,
league_cup_get_name_string(history->value1));
break;
case USER_HISTORY_CHAMPION:
sprintf(buf, "You are champion of the %s!",
league_cup_get_name_string(history->value1));
break;
2005-04-16 09:46:04 +02:00
}
}