1
0
Fork 0

(svn r21733) -Codechange: Clarify the update owner legend code.

-Fix: Prevent crashes caused by deleted companies.
release/1.1
terkhen 2011-01-05 11:04:29 +00:00
parent 68412eebec
commit 03088dadda
3 changed files with 28 additions and 7 deletions

View File

@ -906,8 +906,6 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
delete c; delete c;
AI::BroadcastNewEvent(new AIEventCompanyBankrupt(c_index)); AI::BroadcastNewEvent(new AIEventCompanyBankrupt(c_index));
CompanyAdminBankrupt(c_index); CompanyAdminBankrupt(c_index);
BuildOwnerLegend();
InvalidateWindowData(WC_SMALLMAP, 0, 1);
break; break;
} }

View File

@ -25,7 +25,6 @@
#include "tilehighlight_func.h" #include "tilehighlight_func.h"
#include "network/network_func.h" #include "network/network_func.h"
#include "window_func.h" #include "window_func.h"
#include "smallmap_gui.h"
extern TileIndex _cur_tileloop_tile; extern TileIndex _cur_tileloop_tile;
@ -122,9 +121,6 @@ void InitializeGame(uint size_x, uint size_y, bool reset_date, bool reset_settin
InitializeEconomy(); InitializeEconomy();
/* Rebuild the smallmap owner legend. */
BuildOwnerLegend();
ResetObjectToPlace(); ResetObjectToPlace();
GamelogReset(); GamelogReset();

View File

@ -65,6 +65,9 @@ static const int NUM_NO_COMPANY_ENTRIES = 4; ///< Number of entries in the owner
/** Macro for non-company owned property entry of LegendAndColour */ /** Macro for non-company owned property entry of LegendAndColour */
#define MO(a, b) {a, b, {INVALID_COMPANY}, true, false, false} #define MO(a, b) {a, b, {INVALID_COMPANY}, true, false, false}
/** Macro used for forcing a rebuild of the owner legend the first time it is used. */
#define MOEND() {0, 0, {OWNER_NONE}, true, true, false}
/** Macro for end of list marker in arrays of LegendAndColour */ /** Macro for end of list marker in arrays of LegendAndColour */
#define MKEND() {0, STR_NULL, {INVALID_INDUSTRYTYPE}, true, true, false} #define MKEND() {0, STR_NULL, {INVALID_INDUSTRYTYPE}, true, true, false}
@ -150,13 +153,15 @@ static LegendAndColour _legend_land_owners[NUM_NO_COMPANY_ENTRIES + MAX_COMPANIE
MO(0x00, STR_SMALLMAP_LEGENDA_NO_OWNER), // This colour will vary depending on settings. MO(0x00, STR_SMALLMAP_LEGENDA_NO_OWNER), // This colour will vary depending on settings.
MO(0xB4, STR_SMALLMAP_LEGENDA_TOWNS), MO(0xB4, STR_SMALLMAP_LEGENDA_TOWNS),
MO(0x20, STR_SMALLMAP_LEGENDA_INDUSTRIES), MO(0x20, STR_SMALLMAP_LEGENDA_INDUSTRIES),
/* The legend will be terminated after adding the companies. */ /* The legend will be terminated the first time it is used. */
MOEND(),
}; };
#undef MK #undef MK
#undef MC #undef MC
#undef MS #undef MS
#undef MO #undef MO
#undef MOEND
#undef MKEND #undef MKEND
/** /**
@ -1107,6 +1112,12 @@ public:
str = STR_SMALLMAP_INDUSTRY; str = STR_SMALLMAP_INDUSTRY;
} else if (i == SMT_OWNER) { } else if (i == SMT_OWNER) {
if (tbl->u.company != INVALID_COMPANY) { if (tbl->u.company != INVALID_COMPANY) {
if (!Company::IsValidID(tbl->u.company)) {
/* Rebuild the owner legend. */
BuildOwnerLegend();
this->OnInit();
return;
}
/* Non-fixed legend entries for the owner view. */ /* Non-fixed legend entries for the owner view. */
SetDParam(0, tbl->u.company); SetDParam(0, tbl->u.company);
str = STR_SMALLMAP_COMPANY; str = STR_SMALLMAP_COMPANY;
@ -1132,6 +1143,22 @@ public:
this->column_width = min_width + LEGEND_BLOB_WIDTH + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; this->column_width = min_width + LEGEND_BLOB_WIDTH + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
} }
virtual void OnPaint()
{
if (this->map_type == SMT_OWNER) {
for (const LegendAndColour *tbl = _legend_table[this->map_type]; !tbl->end; ++tbl) {
if (tbl->u.company != INVALID_COMPANY && !Company::IsValidID(tbl->u.company)) {
/* Rebuild the owner legend. */
BuildOwnerLegend();
this->InvalidateData(1);
break;
}
}
}
this->DrawWidgets();
}
virtual void DrawWidget(const Rect &r, int widget) const virtual void DrawWidget(const Rect &r, int widget) const
{ {
switch (widget) { switch (widget) {