mirror of https://github.com/OpenTTD/OpenTTD.git
(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
This commit is contained in:
parent
21dd00b299
commit
ed46b7d380
|
@ -333,13 +333,8 @@ void ChangeOwnershipOfPlayerItems(PlayerID old_player, PlayerID new_player)
|
|||
} 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;
|
||||
|
|
1
player.h
1
player.h
|
@ -252,7 +252,6 @@ static inline bool IsValidPlayer(PlayerID pi)
|
|||
return pi < MAX_PLAYERS;
|
||||
}
|
||||
|
||||
void DeletePlayerWindows(PlayerID pi);
|
||||
byte GetPlayerRailtypes(PlayerID p);
|
||||
|
||||
/** Finds out if a Player has a certain railtype available */
|
||||
|
|
14
players.c
14
players.c
|
@ -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 PlayersYearlyLoop(void)
|
|||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
37
window.c
37
window.c
|
@ -348,6 +348,43 @@ void DeleteWindowByClass(WindowClass cls)
|
|||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
|
2
window.h
2
window.h
|
@ -613,6 +613,8 @@ void SendWindowMessageClass(WindowClass wnd_class, uint msg, uint wparam, uint l
|
|||
|
||||
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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue