(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
authorbjarni
Mon, 13 Nov 2006 20:33:51 +0000
changeset 5077 587701a06b6a
parent 5076 7dea063f194e
child 5078 130939b8e39e
(svn r7138) -Fix: [vehicle list windows] fixed a rare crash where having some (not all) vehicle list windows open for a player, that goes bankrupt would crash the game
-Codechange: closing all windows for a player will now loop all windows and close those, which got the player as caption instead of having a list of windows to close
economy.c
player.h
players.c
window.c
window.h
--- a/economy.c	Mon Nov 13 19:35:31 2006 +0000
+++ b/economy.c	Mon Nov 13 20:33:51 2006 +0000
@@ -333,13 +333,8 @@
 		} while (++tile != MapSize());
 	}
 
-	// Change color of existing windows
-	if (new_player != PLAYER_SPECTATOR) {
-		Window *w;
-		for (w = _windows; w != _last_window; w++) {
-			if (w->caption_color == old_player) w->caption_color = new_player;
-		}
-	}
+	/* Change color of existing windows */
+	if (new_player != PLAYER_SPECTATOR) ChangeWindowOwner(old_player, new_player);
 
 	{
 		Player *p;
--- a/player.h	Mon Nov 13 19:35:31 2006 +0000
+++ b/player.h	Mon Nov 13 20:33:51 2006 +0000
@@ -252,7 +252,6 @@
 	return pi < MAX_PLAYERS;
 }
 
-void DeletePlayerWindows(PlayerID pi);
 byte GetPlayerRailtypes(PlayerID p);
 
 /** Finds out if a Player has a certain railtype available */
--- a/players.c	Mon Nov 13 19:35:31 2006 +0000
+++ b/players.c	Mon Nov 13 20:33:51 2006 +0000
@@ -26,6 +26,7 @@
 #include "engine.h"
 #include "ai/ai.h"
 #include "date.h"
+#include "window.h"
 
 
 uint16 GetDrawStringPlayerColor(PlayerID player)
@@ -616,19 +617,6 @@
 	}
 }
 
-void DeletePlayerWindows(PlayerID pi)
-{
-	DeleteWindowById(WC_COMPANY, pi);
-	DeleteWindowById(WC_PLAYER_COLOR, pi);
-	DeleteWindowById(WC_FINANCES, pi);
-	DeleteWindowById(WC_STATION_LIST, pi);
-	DeleteWindowById(WC_TRAINS_LIST,   (INVALID_STATION << 16) | pi);
-	DeleteWindowById(WC_ROADVEH_LIST,  (INVALID_STATION << 16) | pi);
-	DeleteWindowById(WC_SHIPS_LIST,    (INVALID_STATION << 16) | pi);
-	DeleteWindowById(WC_AIRCRAFT_LIST, (INVALID_STATION << 16) | pi);
-	DeleteWindowById(WC_BUY_COMPANY, pi);
-}
-
 byte GetPlayerRailtypes(PlayerID p)
 {
 	byte rt = 0;
--- a/window.c	Mon Nov 13 19:35:31 2006 +0000
+++ b/window.c	Mon Nov 13 20:33:51 2006 +0000
@@ -348,6 +348,43 @@
 	}
 }
 
+void DeletePlayerWindows(PlayerID pi)
+{
+	Window *w;
+
+	for (w = _windows; w != _last_window;) {
+		if (w->caption_color == pi) {
+			DeleteWindow(w);
+			w = _windows;
+		} else {
+			w++;
+		}
+	}
+
+	/* Also delete the player specific windows, that haven't got the caption set */
+	DeleteWindowById(WC_BUY_COMPANY, pi);
+}
+
+/* Change the owner of all the windows one player can take over from another player (like vehicle view windows) */
+void ChangeWindowOwner(PlayerID old_player, PlayerID new_player)
+{
+	Window *w;
+
+	for (w = _windows; w != _last_window; w++) {
+		if (w->caption_color != old_player)      continue;
+		if (w->window_class == WC_PLAYER_COLOR)  continue;
+		if (w->window_class == WC_FINANCES)      continue;
+		if (w->window_class == WC_STATION_LIST)  continue;
+		if (w->window_class == WC_TRAINS_LIST)   continue;
+		if (w->window_class == WC_ROADVEH_LIST)  continue;
+		if (w->window_class == WC_SHIPS_LIST)    continue;
+		if (w->window_class == WC_AIRCRAFT_LIST) continue;
+		if (w->window_class == WC_BUY_COMPANY)   continue;
+		if (w->window_class == WC_COMPANY)       continue;
+		w->caption_color = new_player;
+	}
+}
+
 
 static Window *BringWindowToFront(Window *w);
 
--- a/window.h	Mon Nov 13 19:35:31 2006 +0000
+++ b/window.h	Mon Nov 13 20:33:51 2006 +0000
@@ -613,6 +613,8 @@
 
 Window *FindWindowById(WindowClass cls, WindowNumber number);
 void DeleteWindow(Window *w);
+void DeletePlayerWindows(PlayerID pi);
+void ChangeWindowOwner(PlayerID old_player, PlayerID new_player);
 Window *BringWindowToFrontById(WindowClass cls, WindowNumber number);
 Window *FindWindowFromPt(int x, int y);