(svn r12906) -Fix: vehicle groups, engine replacement rules and player/company names were not properly reset/freed after bankrupt (before new player start)
authorsmatz
Sat, 26 Apr 2008 14:20:39 +0000
changeset 10365 fa999605dd21
parent 10363 d47dabff0d29
child 10368 0d80bb08272e
(svn r12906) -Fix: vehicle groups, engine replacement rules and player/company names were not properly reset/freed after bankrupt (before new player start)
src/economy.cpp
src/players.cpp
--- a/src/economy.cpp	Fri Apr 25 16:33:40 2008 +0000
+++ b/src/economy.cpp	Sat Apr 26 14:20:39 2008 +0000
@@ -44,6 +44,7 @@
 #include "rail_map.h"
 #include "signal_func.h"
 #include "gfx_func.h"
+#include "autoreplace_func.h"
 
 #include "table/strings.h"
 #include "table/sprites.h"
@@ -454,6 +455,19 @@
 		UpdateSignalsInBuffer();
 	}
 
+	/* In all cases clear replace engine rules.
+	 * Even if it was copied, it could interfere with new owner's rules */
+	RemoveAllEngineReplacementForPlayer(GetPlayer(old_player));
+
+	if (new_player == PLAYER_SPECTATOR) {
+		RemoveAllGroupsForPlayer(old_player);
+	} else {
+		Group *g;
+		FOR_ALL_GROUPS(g) {
+			if (g->owner == old_player) g->owner = new_player;
+		}
+	}
+
 	/* Change color of existing windows */
 	if (new_player != PLAYER_SPECTATOR) ChangeWindowOwner(old_player, new_player);
 
--- a/src/players.cpp	Fri Apr 25 16:33:40 2008 +0000
+++ b/src/players.cpp	Sat Apr 26 14:20:39 2008 +0000
@@ -461,6 +461,8 @@
 	/* Find a free slot */
 	FOR_ALL_PLAYERS(p) {
 		if (!p->is_active) {
+			free(p->name);
+			free(p->president_name);
 			PlayerID i = p->index;
 			memset(p, 0, sizeof(Player));
 			memset(&_players_ai[i], 0, sizeof(PlayerAI));
@@ -918,9 +920,6 @@
 			ChangeOwnershipOfPlayerItems(p->index, PLAYER_SPECTATOR);
 			p->is_active = false;
 		}
-		RemoveAllEngineReplacementForPlayer(p);
-		RemoveAllGroupsForPlayer(p->index);
-
 	} break;
 
 	case 3: { /* Merge a company (#1) into another company (#2), elimination company #1 */