rem: SetSemaphore (&GraphicsSem);
add: SetSemaphore (GraphicsSem);
context: GenerateThradd (BYTE control){	switch (control)	{		case GENERATE_ENERGY:			if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])			{				DWORD rand_val, old_rand;				if (CurStarDescPtr->Index != AQUA_HELIX_DEFINED)				{					COUNT i, which_node;					old_rand = SeedRandom (							pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]							);					which_node = i = 0;					do					{						rand_val = Random ();						pSolarSysState->SysInfo.PlanetInfo.CurPt.x =								(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;						pSolarSysState->SysInfo.PlanetInfo.CurPt.y =								(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;						pSolarSysState->SysInfo.PlanetInfo.CurType = 1;						pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;						if (which_node >= pSolarSysState->CurNode								&& !(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]								& (1L << i)))							break;						++which_node;					} while (++i < 16);					pSolarSysState->CurNode = which_node;					SeedRandom (old_rand);					break;				}				else if (!GET_GAME_STATE (AQUA_HELIX))				{					old_rand = SeedRandom (							pSolarSysState->SysInfo.PlanetInfo.ScanSeed[ENERGY_SCAN]							);					rand_val = Random ();					pSolarSysState->SysInfo.PlanetInfo.CurPt.x =							(LOBYTE (LOWORD (rand_val)) % (MAP_WIDTH - (8 << 1))) + 8;					pSolarSysState->SysInfo.PlanetInfo.CurPt.y =							(HIBYTE (LOWORD (rand_val)) % (MAP_HEIGHT - (8 << 1))) + 8;					pSolarSysState->SysInfo.PlanetInfo.CurDensity = 0;					pSolarSysState->SysInfo.PlanetInfo.CurType = 0;					if (!(pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]							& (1L << 0))							&& pSolarSysState->CurNode == (COUNT)~0)						pSolarSysState->CurNode = 1;					else					{						pSolarSysState->CurNode = 0;						if (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN]								& (1L << 0))						{							SET_GAME_STATE (HELIX_VISITS, 0);							SET_GAME_STATE (AQUA_HELIX, 1);							SET_GAME_STATE (AQUA_HELIX_ON_SHIP, 1);							SET_GAME_STATE (HELIX_UNPROTECTED, 1);						}					}					SeedRandom (old_rand);					break;				}			}			pSolarSysState->CurNode = 0;			break;		case GENERATE_PLANETS:		{			COUNT angle;			GenerateRandomIP (GENERATE_PLANETS);			if (CurStarDescPtr->Index == AQUA_HELIX_DEFINED)			{				pSolarSysState->PlanetDesc[0].data_index = PRIMORDIAL_WORLD;				pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 65L / 100;				angle = ARCTAN (						pSolarSysState->PlanetDesc[0].location.x,						pSolarSysState->PlanetDesc[0].location.y						);				pSolarSysState->PlanetDesc[0].location.x =						COSINE (angle, pSolarSysState->PlanetDesc[0].radius);				pSolarSysState->PlanetDesc[0].location.y =						SINE (angle, pSolarSysState->PlanetDesc[0].radius);			}			else			{				pSolarSysState->PlanetDesc[0].data_index = WATER_WORLD;				pSolarSysState->PlanetDesc[0].NumPlanets = 0;				pSolarSysState->PlanetDesc[0].radius = EARTH_RADIUS * 98L / 100;				angle = ARCTAN (						pSolarSysState->PlanetDesc[0].location.x,						pSolarSysState->PlanetDesc[0].location.y						);				pSolarSysState->PlanetDesc[0].location.x =						COSINE (angle, pSolarSysState->PlanetDesc[0].radius);				pSolarSysState->PlanetDesc[0].location.y =						SINE (angle, pSolarSysState->PlanetDesc[0].radius);			}			break;		}		case GENERATE_ORBITAL:			if (pSolarSysState->pOrbitalDesc == &pSolarSysState->PlanetDesc[0])			{				if (ActivateStarShip (THRADDASH_SHIP, SPHERE_TRACKING)						&& (CurStarDescPtr->Index == THRADD_DEFINED						|| (!GET_GAME_STATE (HELIX_UNPROTECTED)						&& (BYTE)(GET_GAME_STATE (THRADD_MISSION) - 1) >= 3)))				{					NotifyOthers (THRADDASH_SHIP, (BYTE)~0);					PutGroupInfo (0L, (BYTE)~0);					ReinitQueue (&GLOBAL (npc_built_ship_q));					CloneShipFragment (THRADDASH_SHIP,							&GLOBAL (npc_built_ship_q), (BYTE)~0);					pSolarSysState->MenuState.Initialized += 2;					GLOBAL (CurrentActivity) |= START_INTERPLANETARY;					if (CurStarDescPtr->Index == THRADD_DEFINED)					{						SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 7);					}					else					{						SET_GAME_STATE (GLOBAL_FLAGS_AND_DATA, 1 << 6);					}					InitCommunication (THRADD_CONVERSATION);					pSolarSysState->MenuState.Initialized -= 2;					if (GLOBAL (CurrentActivity) & (CHECK_ABORT | CHECK_LOAD))						break;					GLOBAL (CurrentActivity) &= ~START_INTERPLANETARY;					ReinitQueue (&GLOBAL (npc_built_ship_q));					GetGroupInfo (0L, 0);					if (CurStarDescPtr->Index == THRADD_DEFINED							|| (!GET_GAME_STATE (HELIX_UNPROTECTED)							&& (BYTE)(GET_GAME_STATE (THRADD_MISSION) - 1) >= 3))						break;					SetSemaphore (&GraphicsSem);					RepairSISBorder ();					ClearSemaphore (&GraphicsSem);				}				if (CurStarDescPtr->Index == AQUA_HELIX_DEFINED						&& !GET_GAME_STATE (AQUA_HELIX))				{					pSolarSysState->SysInfo.PlanetInfo.LanderFont =							CaptureFont (									LoadGraphic (LANDER_FONT)									);					pSolarSysState->PlanetSideFrame[1] =							CaptureDrawable (									LoadGraphic (AQUA_MASK_PMAP_ANIM)									);					pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =							CaptureStringTable (									LoadStringTable (AQUA_STRTAB)									);				}				else if (CurStarDescPtr->Index == THRADD_DEFINED)				{					pSolarSysState->SysInfo.PlanetInfo.LanderFont =							CaptureFont (									LoadGraphic (LANDER_FONT)									);					pSolarSysState->PlanetSideFrame[1] =							CaptureDrawable (							LoadGraphic (RUINS_MASK_PMAP_ANIM)							);					pSolarSysState->SysInfo.PlanetInfo.DiscoveryString =							CaptureStringTable (									LoadStringTable (RUINS_STRTAB)									);				}			}		default:			GenerateRandomIP (control);			break;	}}