Skip to content

Commit

Permalink
Avoid regenerating the land tabs over top of themselves
Browse files Browse the repository at this point in the history
This was only occurring when hooks caused a GUI reload, which is
somewhat unsafe, but this seems like a useful precaution to take.
  • Loading branch information
Deiz committed Mar 22, 2015
1 parent 943086d commit 9fd2a7d
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 7 deletions.
3 changes: 3 additions & 0 deletions src/equipment.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,9 @@ void equipment_open( unsigned int wid )
GLfloat colour[4*4];
const char *buf;

/* Mark as generated. */
land_tabGenerate(LAND_WINDOW_EQUIPMENT);

/* Set global WID. */
equipment_wid = wid;

Expand Down
39 changes: 32 additions & 7 deletions src/land.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@
#define has_visited(f) (land_visited & (f)) /**< Check if player has visited. */
static unsigned int land_visited = 0; /**< Contains what the player visited. */

/* Which tabs have been generated by their respective open functions. */
unsigned int land_generated = 0;

/*
* land variables
Expand Down Expand Up @@ -187,6 +189,9 @@ static void commodity_exchange_open( unsigned int wid )
char **goods;
int w, h;

/* Mark as generated. */
land_tabGenerate(LAND_WINDOW_COMMODITY);

/* Get window dimensions. */
window_dimWindow( wid, &w, &h );

Expand Down Expand Up @@ -566,6 +571,9 @@ static void bar_open( unsigned int wid )
{
int w, h, iw, ih, bw, bh, dh, th;

/* Mark as generated. */
land_tabGenerate(LAND_WINDOW_BAR);

/* Set window functions. */
window_onClose( wid, bar_close );

Expand Down Expand Up @@ -822,6 +830,9 @@ static void misn_open( unsigned int wid )
int w, h;
int y;

/* Mark as generated. */
land_tabGenerate(LAND_WINDOW_MISSION);

/* Get window dimensions. */
window_dimWindow( wid, &w, &h );

Expand Down Expand Up @@ -1180,6 +1191,9 @@ void land_genWindows( int load, int changetab )
if (land_wid > 0) {
land_regen = 2; /* Mark we're regenning. */
window_destroy(land_wid);

/* Mark tabs as not generated. */
land_generated = 0;
}
land_loaded = 0;

Expand Down Expand Up @@ -1274,24 +1288,34 @@ void land_genWindows( int load, int changetab )
}

/* 4) Create other tabs. */
#define should_open(s, w) \
(planet_hasService(land_planet, s) && (!land_tabGenerated(w)))

/* Things get a bit hairy here. Hooks may have triggered a GUI reload via
* e.g. player.swapShip, so the land tabs may have been generated already
* and we need to check that before regenerating them.
*/

/* Basic - bar + missions */
if (planet_hasService(land_planet, PLANET_SERVICE_BAR))
if (should_open( PLANET_SERVICE_BAR, LAND_WINDOW_BAR ))
bar_open( land_getWid(LAND_WINDOW_BAR) );
if (planet_hasService(land_planet, PLANET_SERVICE_MISSIONS))
if (should_open( PLANET_SERVICE_MISSIONS, LAND_WINDOW_MISSION ))
misn_open( land_getWid(LAND_WINDOW_MISSION) );
/* Outfits. */
if (planet_hasService(land_planet, PLANET_SERVICE_OUTFITS))
if (should_open( PLANET_SERVICE_OUTFITS, LAND_WINDOW_OUTFITS ))
outfits_open( land_getWid(LAND_WINDOW_OUTFITS) );
/* Shipyard. */
if (planet_hasService(land_planet, PLANET_SERVICE_SHIPYARD))
if (should_open( PLANET_SERVICE_SHIPYARD, LAND_WINDOW_SHIPYARD ))
shipyard_open( land_getWid(LAND_WINDOW_SHIPYARD) );
/* Equipment. */
if (planet_hasService(land_planet, PLANET_SERVICE_OUTFITS) ||
planet_hasService(land_planet, PLANET_SERVICE_SHIPYARD))
if ((planet_hasService(land_planet, PLANET_SERVICE_OUTFITS) ||
planet_hasService(land_planet, PLANET_SERVICE_SHIPYARD)) &&
!land_tabGenerated( LAND_WINDOW_EQUIPMENT ))
equipment_open( land_getWid(LAND_WINDOW_EQUIPMENT) );
/* Commodity. */
if (planet_hasService(land_planet, PLANET_SERVICE_COMMODITY))
if (should_open( PLANET_SERVICE_COMMODITY, LAND_WINDOW_COMMODITY ))
commodity_exchange_open( land_getWid(LAND_WINDOW_COMMODITY) );
#undef should_open

if (!regen) {
/* Reset markers if needed. */
Expand Down Expand Up @@ -1689,6 +1713,7 @@ void land_cleanup (void)
land_planet = NULL;
landed = 0;
land_visited = 0;
land_generated = 0;

/* Destroy window. */
if (land_wid > 0)
Expand Down
6 changes: 6 additions & 0 deletions src/land.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ extern int landed;
extern Planet* land_planet;


/* Tracking for which tabs have been generated. */
#define land_tabGenerate(w) (land_generated |= (1 << w)) /**< Mark tab generated. */
#define land_tabGenerated(w) (land_generated & (1 << w)) /**< Check if tab has been generated. */
extern unsigned int land_generated;


/*
* Main interface.
*/
Expand Down
3 changes: 3 additions & 0 deletions src/land_outfits.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ void outfits_open( unsigned int wid )
{
int w, h, iw, ih, bw, bh, off;

/* Mark as generated. */
land_tabGenerate(LAND_WINDOW_OUTFITS);

/* Get dimensions. */
outfits_getSize( wid, &w, &h, &iw, &ih, &bw, &bh );

Expand Down
3 changes: 3 additions & 0 deletions src/land_shipyard.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ void shipyard_open( unsigned int wid )
int y;
const char *buf;

/* Mark as generated. */
land_tabGenerate(LAND_WINDOW_SHIPYARD);

/* Init vars. */
shipyard_selected = NULL;

Expand Down

0 comments on commit 9fd2a7d

Please sign in to comment.