From 4f737b04b64c52eff65d9c653a70a26b17e1b1d3 Mon Sep 17 00:00:00 2001
From: gyboth <gyboth@localhost>
Date: Fri, 2 May 2008 12:26:35 +0000
Subject: [PATCH] Star player balking.

---
 src/callback_func.c |  6 +++++
 src/player.c        | 55 +++++++++++++++++++++++++++++++++++++++++++++
 src/player.h        |  3 +++
 src/transfer.c      | 10 +++++++++
 src/user.c          |  6 +++++
 src/user_struct.h   |  1 +
 6 files changed, 81 insertions(+)

diff --git a/src/callback_func.c b/src/callback_func.c
index b913b86e..694e7bd7 100644
--- a/src/callback_func.c
+++ b/src/callback_func.c
@@ -527,6 +527,12 @@ callback_offer_new_contract(gint idx)
 	game_gui_show_warning(_("The player won't negotiate with you anymore."));
 	return;
     }
+    else if(query_player_star_balks(pl, current_user.tm, FALSE))
+    {
+	pl->offers = const_int("int_contract_max_offers");
+	game_gui_show_warning(_("The player feels he doesn't have a future in your star-studded team. He refuses to negotiate."));
+	return;
+    }
 
     stat1 = player_assign_wage(pl);
     statp = (gpointer)pl;
diff --git a/src/player.c b/src/player.c
index 16fcdd45..691e3859 100644
--- a/src/player.c
+++ b/src/player.c
@@ -1401,6 +1401,8 @@ player_move_from_ya(gint idx)
     Player *pl = &g_array_index(current_user.youth_academy.players, Player, idx);
     Player player = *pl;
 
+    player.contract = const_float("float_player_contract_youth");
+
     g_array_remove_index(current_user.youth_academy.players, idx);
     g_array_append_val(current_user.tm->players, player);
 }
@@ -1426,3 +1428,56 @@ query_player_is_in_ya(const Player *pl)
 
     return TRUE;
 }
+
+/** Find out if a star balks when offered a new or a renewed contract
+    because there are already enough stars on the prospective new team. */
+gboolean
+query_player_star_balks(const Player *pl, const Team *tm, gboolean transfer)
+{
+    gint i;
+    gint number_of_stars_field;
+    gint number_of_stars_goal;
+    gfloat skill_limit;
+
+    /* Weak players never balk. */
+    if(pl->skill < const_float("float_transfer_star_skill_limit"))
+	return FALSE;
+
+    /* There is some chance that the new star doesn't balk at all. */
+    if((transfer && math_rnd(0, 1) < const_float("float_transfer_star_no_balk")) ||
+       (!transfer && math_rnd(0, 1) < const_float("float_contract_star_no_balk")))
+	return FALSE;
+
+    /* Find out if there are any stars at all on the team. */
+    number_of_stars_field = 
+	number_of_stars_goal = 0;
+    skill_limit = (transfer ? 
+		   const_float("float_transfer_star_skill_limit") :
+		   const_float("float_contract_star_skill_limit"));
+    for(i = 0; i < tm->players->len; i++)
+    {
+	if(g_array_index(tm->players, Player, i).skill > skill_limit)
+	{
+	    if(g_array_index(tm->players, Player, i).pos == PLAYER_POS_GOALIE)
+		number_of_stars_goal++;
+	    else
+		number_of_stars_field++;
+	}
+    }
+    
+    if(pl->pos == PLAYER_POS_GOALIE)
+    {
+	if(number_of_stars_goal == 0)
+	    return FALSE;
+	else
+	    return (math_rnd(0, 1) > const_float("float_transfer_star_goalie_accepts"));
+    }
+    else
+    {
+	if(number_of_stars_field == 0)
+	    return FALSE;
+	else
+	    return (math_rnd(0, 1) > 1 - number_of_stars_field * 
+		    const_float("float_transfer_star_prob_decrease"));
+    }
+}
diff --git a/src/player.h b/src/player.h
index ff620855..75554e05 100644
--- a/src/player.h
+++ b/src/player.h
@@ -183,4 +183,7 @@ player_update_streak(Player *pl);
 gboolean
 query_player_is_in_ya(const Player *pl);
 
+gboolean
+query_player_star_balks(const Player *pl, const Team *tm, gboolean transfer);
+
 #endif
diff --git a/src/transfer.c b/src/transfer.c
index 24dbfea7..5da33f0e 100644
--- a/src/transfer.c
+++ b/src/transfer.c
@@ -248,6 +248,16 @@ transfer_evaluate_offers(void)
 				player_of_id_team(trans(i).tm, trans(i).id)->name);
 			    transoff(i, j).status = TRANSFER_OFFER_REJECTED;
 			}
+			else if(query_player_star_balks(
+				    player_of_id_team(trans(i).tm, trans(i).id), transoff(i, j).tm, TRUE))
+			{
+			    user_event_add(
+				user_from_team(transoff(i, j).tm),
+				EVENT_TYPE_TRANSFER_OFFER_REJECTED_STARS, -1, -1,
+				trans(i).tm, 
+				player_of_id_team(trans(i).tm, trans(i).id)->name);
+			    transoff(i, j).status = TRANSFER_OFFER_REJECTED;
+			}
 			else
 			    notify = TRUE;
 		    }
diff --git a/src/user.c b/src/user.c
index 0d35a586..1bdc8f27 100644
--- a/src/user.c
+++ b/src/user.c
@@ -525,6 +525,12 @@ user_event_show_next(void)
 		    event->value_string,
 		    ((Team*)event->value_pointer)->name, buf2, buf3);
 	    break;
+	case EVENT_TYPE_TRANSFER_OFFER_REJECTED_STARS:
+	    /* A player from a team has rejected a transfer offer. */
+	    game_gui_show_warning(_("%s of %s has rejected your offer because your team has too many star players already. 'A player of my caliber doesn't play second fiddle,' he was quoted."),
+				  event->value_string,
+				  ((Team*)event->value_pointer)->name);
+	    break;
 	case EVENT_TYPE_TRANSFER_OFFER_MONEY:
 	    /* Buy a player from a team. */
 	    game_gui_show_warning(_("You didn't have enough money to buy %s from %s."),
diff --git a/src/user_struct.h b/src/user_struct.h
index 7cae47d9..cfe09be9 100644
--- a/src/user_struct.h
+++ b/src/user_struct.h
@@ -196,6 +196,7 @@ enum EventType
     EVENT_TYPE_TRANSFER_OFFER_REJECTED_FEE_WAGE,
     EVENT_TYPE_TRANSFER_OFFER_REJECTED_FEE,
     EVENT_TYPE_TRANSFER_OFFER_REJECTED_WAGE,
+    EVENT_TYPE_TRANSFER_OFFER_REJECTED_STARS,
     EVENT_TYPE_TRANSFER_OFFER_MONEY,
     EVENT_TYPE_TRANSFER_OFFER_ROSTER,
     EVENT_TYPE_PLAYER_CAREER_STOP,