Planet orbit menu cleanup: own MENU_STATE for all; clear sub-menu functions; MENU_STATE hacks removed; not relying on MENU_STATE.Initialized; moved colors to colors.h; planet surface always drawn in ScanContext; Better names for some menu items
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3431 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
+37
-1
@@ -68,7 +68,11 @@
|
||||
BUILD_COLOR (MAKE_RGB15 (0x06, 0x06, 0x06), 0x00)
|
||||
#define WHITE_COLOR \
|
||||
BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F)
|
||||
#define BLUE_COLOR \
|
||||
#define BRIGHT_RED_COLOR \
|
||||
BUILD_COLOR (MAKE_RGB15 (0x1F, 0x00, 0x00), 0x04)
|
||||
#define BRIGHT_GREEN_COLOR \
|
||||
BUILD_COLOR (MAKE_RGB15 (0x00, 0x1F, 0x00), 0x02)
|
||||
#define BRIGHT_BLUE_COLOR \
|
||||
BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x1F), 0x01)
|
||||
|
||||
#define NORMAL_ILLUMINATED_COLOR \
|
||||
@@ -390,12 +394,44 @@
|
||||
#define ROSTER_MODIFY_SHIP_COLOR \
|
||||
WHITE_COLOR
|
||||
|
||||
// === Scan menu and general ===
|
||||
|
||||
#define SCAN_PC_TITLE_COLOR \
|
||||
BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x15), 0x3B)
|
||||
|
||||
#define SCAN_INFO_COLOR \
|
||||
BUILD_COLOR (MAKE_RGB15 (0x0F, 0x00, 0x19), 0x3B)
|
||||
|
||||
#define SCAN_MINERAL_TEXT_COLOR \
|
||||
BUILD_COLOR (MAKE_RGB15_INIT (0x13, 0x00, 0x00), 0x2C)
|
||||
|
||||
#define SCAN_ENERGY_TEXT_COLOR \
|
||||
BUILD_COLOR (MAKE_RGB15_INIT (0x0C, 0x0C, 0x0C), 0x1C)
|
||||
|
||||
#define SCAN_BIOLOGICAL_TEXT_COLOR \
|
||||
BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x0E, 0x00), 0x6C)
|
||||
|
||||
#define SCAN_MINERAL_TINT_COLOR \
|
||||
BRIGHT_RED_COLOR_INIT
|
||||
|
||||
#define SCAN_ENERGY_TINT_COLOR \
|
||||
WHITE_COLOR_INIT
|
||||
|
||||
#define SCAN_BIOLOGICAL_TINT_COLOR \
|
||||
BRIGHT_GREEN_COLOR_INIT
|
||||
|
||||
|
||||
// Temporary, until we can use C'99 features:
|
||||
#define BLACK_COLOR_INIT \
|
||||
BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00)
|
||||
#define WHITE_COLOR_INIT \
|
||||
BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x1F, 0x1F), 0x0F)
|
||||
#define BRIGHT_RED_COLOR_INIT \
|
||||
BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x00, 0x00), 0x04)
|
||||
#define BRIGHT_GREEN_COLOR_INIT \
|
||||
BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x1F, 0x00), 0x02)
|
||||
#define BRIGHT_BLUE_COLOR_INIT \
|
||||
BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x1F), 0x01)
|
||||
#define UNDEFINED_COLOR_INIT \
|
||||
BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00)
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
#define CREDITS_TIMEOUT (ONE_SECOND * 5)
|
||||
|
||||
#define TRANS_COLOR BLUE_COLOR
|
||||
#define TRANS_COLOR BRIGHT_BLUE_COLOR
|
||||
|
||||
// Positive or negative scroll rate in pixel lines per second
|
||||
static int CreditsRate;
|
||||
|
||||
@@ -50,6 +50,19 @@ static COLORMAP hypercmaps[2];
|
||||
static BYTE fuel_ticks;
|
||||
static COUNT hyper_dx, hyper_dy, hyper_extra;
|
||||
|
||||
// HyperspaceMenu() items
|
||||
enum HyperMenuItems
|
||||
{
|
||||
// XXX: Must match the enum in menustat.h
|
||||
STARMAP = 1,
|
||||
EQUIP_DEVICE,
|
||||
CARGO,
|
||||
ROSTER,
|
||||
GAME_MENU,
|
||||
NAVIGATION,
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
MoveSIS (SIZE *pdx, SIZE *pdy)
|
||||
{
|
||||
|
||||
+23
-23
@@ -70,7 +70,7 @@ DrawPCMenuFrame (RECT *r)
|
||||
}
|
||||
|
||||
#define ALT_MANIFEST 0x80
|
||||
#define ALT_EXIT_MENU0 0x81
|
||||
#define ALT_EXIT_MANIFEST 0x81
|
||||
|
||||
static UNICODE pm_crew_str[128];
|
||||
static UNICODE pm_fuel_str[128];
|
||||
@@ -151,29 +151,29 @@ GetEndMenuState (BYTE BaseState)
|
||||
return PM_LAUNCH_LANDER;
|
||||
break;
|
||||
case PM_SAVE_GAME:
|
||||
return PM_EXIT_MENU1;
|
||||
return PM_EXIT_GAME_MENU;
|
||||
break;
|
||||
case PM_CONVERSE:
|
||||
return PM_SAVE_LOAD1;
|
||||
return PM_ENCOUNTER_GAME_MENU;
|
||||
break;
|
||||
case PM_FUEL:
|
||||
return PM_EXIT_MENU2;
|
||||
return PM_EXIT_OUTFIT;
|
||||
break;
|
||||
case PM_CREW:
|
||||
return PM_EXIT_MENU3;
|
||||
return PM_EXIT_SHIPYARD;
|
||||
break;
|
||||
case PM_SOUND_ON:
|
||||
return PM_EXIT_MENU4;
|
||||
return PM_EXIT_SETTINGS;
|
||||
break;
|
||||
case PM_ALT_SCAN:
|
||||
case PM_ALT_STARMAP:
|
||||
return PM_ALT_NAVIGATE;
|
||||
break;
|
||||
case PM_ALT_CARGO:
|
||||
return PM_ALT_EXITMENU0;
|
||||
return PM_ALT_EXIT_MANIFEST;
|
||||
break;
|
||||
case PM_ALT_MSCAN:
|
||||
return PM_ALT_EXITMENU1;
|
||||
return PM_ALT_EXIT_SCAN;
|
||||
break;
|
||||
}
|
||||
return BaseState;
|
||||
@@ -256,7 +256,7 @@ PreviousMenuState (BYTE BaseState, BYTE CurState)
|
||||
switch (AdjBase + CurState)
|
||||
{
|
||||
case PM_SOUND_OFF:
|
||||
NextState = PM_EXIT_MENU4;
|
||||
NextState = PM_EXIT_SETTINGS;
|
||||
break;
|
||||
case PM_MUSIC_ON:
|
||||
case PM_MUSIC_OFF:
|
||||
@@ -299,9 +299,9 @@ GetAlternateMenu (BYTE *BaseState, BYTE *CurState)
|
||||
*BaseState = PM_ALT_SCAN + adj;
|
||||
*CurState = PM_ALT_MANIFEST - PM_ALT_SCAN - adj;
|
||||
return TRUE;
|
||||
case ALT_EXIT_MENU0:
|
||||
case ALT_EXIT_MANIFEST:
|
||||
*BaseState = PM_ALT_CARGO;
|
||||
*CurState = PM_ALT_EXITMENU0 - PM_ALT_CARGO;
|
||||
*CurState = PM_ALT_EXIT_MANIFEST - PM_ALT_CARGO;
|
||||
return TRUE;
|
||||
}
|
||||
log_add (log_Error, "Unknown state combination: %d, %d",
|
||||
@@ -332,9 +332,9 @@ GetAlternateMenu (BYTE *BaseState, BYTE *CurState)
|
||||
*BaseState = PM_ALT_CARGO;
|
||||
*CurState = PM_ALT_ROSTER - PM_ALT_CARGO;
|
||||
return TRUE;
|
||||
case PM_SAVE_LOAD0:
|
||||
case PM_GAME_MENU:
|
||||
*BaseState = PM_ALT_SCAN + adj;
|
||||
*CurState = PM_ALT_SAVE0 - PM_ALT_SCAN - adj;
|
||||
*CurState = PM_ALT_GAME_MENU - PM_ALT_SCAN - adj;
|
||||
return TRUE;
|
||||
case PM_NAVIGATE:
|
||||
*BaseState = PM_ALT_SCAN + adj;
|
||||
@@ -352,9 +352,9 @@ GetAlternateMenu (BYTE *BaseState, BYTE *CurState)
|
||||
*BaseState = PM_ALT_MSCAN;
|
||||
*CurState = PM_ALT_BSCAN - PM_ALT_MSCAN;
|
||||
return TRUE;
|
||||
case PM_EXIT_MENU0:
|
||||
case PM_EXIT_SCAN:
|
||||
*BaseState = PM_ALT_MSCAN;
|
||||
*CurState = PM_ALT_EXITMENU1 - PM_ALT_MSCAN;
|
||||
*CurState = PM_ALT_EXIT_SCAN - PM_ALT_MSCAN;
|
||||
return TRUE;
|
||||
case PM_AUTO_SCAN:
|
||||
*BaseState = PM_ALT_MSCAN;
|
||||
@@ -381,8 +381,8 @@ ConvertAlternateMenu (BYTE BaseState, BYTE NewState)
|
||||
return (PM_STARMAP - PM_SCAN);
|
||||
case PM_ALT_MANIFEST:
|
||||
return (ALT_MANIFEST);
|
||||
case PM_ALT_SAVE0:
|
||||
return (PM_SAVE_LOAD0 - PM_SCAN);
|
||||
case PM_ALT_GAME_MENU:
|
||||
return (PM_GAME_MENU - PM_SCAN);
|
||||
case PM_ALT_NAVIGATE:
|
||||
return (PM_NAVIGATE - PM_SCAN);
|
||||
case PM_ALT_CARGO:
|
||||
@@ -391,8 +391,8 @@ ConvertAlternateMenu (BYTE BaseState, BYTE NewState)
|
||||
return (PM_DEVICES - PM_SCAN);
|
||||
case PM_ALT_ROSTER:
|
||||
return (PM_ROSTER - PM_SCAN);
|
||||
case PM_ALT_EXITMENU0:
|
||||
return (ALT_EXIT_MENU0);
|
||||
case PM_ALT_EXIT_MANIFEST:
|
||||
return (ALT_EXIT_MANIFEST);
|
||||
case PM_ALT_MSCAN:
|
||||
return (PM_MIN_SCAN - PM_MIN_SCAN);
|
||||
case PM_ALT_ESCAN:
|
||||
@@ -403,8 +403,8 @@ ConvertAlternateMenu (BYTE BaseState, BYTE NewState)
|
||||
return (PM_AUTO_SCAN - PM_MIN_SCAN);
|
||||
case PM_ALT_DISPATCH:
|
||||
return (PM_LAUNCH_LANDER - PM_MIN_SCAN);
|
||||
case PM_ALT_EXITMENU1:
|
||||
return (PM_EXIT_MENU0 - PM_MIN_SCAN);
|
||||
case PM_ALT_EXIT_SCAN:
|
||||
return (PM_EXIT_SCAN - PM_MIN_SCAN);
|
||||
}
|
||||
return (NewState);
|
||||
}
|
||||
@@ -432,7 +432,7 @@ DoMenuChooser (MENU_STATE *pMS, BYTE BaseState)
|
||||
pMS->CurState = PM_CARGO - PM_SCAN;
|
||||
return TRUE;
|
||||
}
|
||||
if (NewState == ALT_EXIT_MENU0)
|
||||
if (NewState == ALT_EXIT_MANIFEST)
|
||||
{
|
||||
if (OrigBase == PM_SCAN)
|
||||
DrawMenuStateStrings (PM_ALT_SCAN,
|
||||
@@ -546,7 +546,7 @@ DrawMenuStateStrings (BYTE beg_index, SWORD NewState)
|
||||
case PM_CHANGE_SHIP:
|
||||
NewState = 4;
|
||||
break;
|
||||
case PM_EXIT_MENU4:
|
||||
case PM_EXIT_SETTINGS:
|
||||
NewState = 5;
|
||||
break;
|
||||
}
|
||||
|
||||
+12
-12
@@ -57,13 +57,13 @@ enum
|
||||
PM_DEVICES,
|
||||
PM_CARGO,
|
||||
PM_ROSTER,
|
||||
PM_SAVE_LOAD0,
|
||||
PM_GAME_MENU,
|
||||
PM_NAVIGATE,
|
||||
|
||||
PM_MIN_SCAN,
|
||||
PM_ENE_SCAN,
|
||||
PM_BIO_SCAN,
|
||||
PM_EXIT_MENU0,
|
||||
PM_EXIT_SCAN,
|
||||
PM_AUTO_SCAN,
|
||||
PM_LAUNCH_LANDER,
|
||||
|
||||
@@ -71,20 +71,20 @@ enum
|
||||
PM_LOAD_GAME,
|
||||
PM_QUIT_GAME,
|
||||
PM_CHANGE_SETTINGS,
|
||||
PM_EXIT_MENU1,
|
||||
PM_EXIT_GAME_MENU,
|
||||
|
||||
PM_CONVERSE,
|
||||
PM_ATTACK,
|
||||
PM_SAVE_LOAD1,
|
||||
PM_ENCOUNTER_GAME_MENU,
|
||||
|
||||
PM_FUEL,
|
||||
PM_MODULE,
|
||||
PM_SAVE_LOAD2,
|
||||
PM_EXIT_MENU2,
|
||||
PM_OUTFIT_GAME_MENU,
|
||||
PM_EXIT_OUTFIT,
|
||||
|
||||
PM_CREW,
|
||||
PM_SAVE_LOAD3,
|
||||
PM_EXIT_MENU3,
|
||||
PM_SHIPYARD_GAME_MENU,
|
||||
PM_EXIT_SHIPYARD,
|
||||
|
||||
PM_SOUND_ON,
|
||||
PM_SOUND_OFF,
|
||||
@@ -96,25 +96,25 @@ enum
|
||||
PM_CYBORG_SUPER,
|
||||
PM_CHANGE_CAPTAIN,
|
||||
PM_CHANGE_SHIP,
|
||||
PM_EXIT_MENU4,
|
||||
PM_EXIT_SETTINGS,
|
||||
|
||||
PM_ALT_SCAN,
|
||||
PM_ALT_STARMAP,
|
||||
PM_ALT_MANIFEST,
|
||||
PM_ALT_SAVE0,
|
||||
PM_ALT_GAME_MENU,
|
||||
PM_ALT_NAVIGATE,
|
||||
|
||||
PM_ALT_CARGO,
|
||||
PM_ALT_DEVICES,
|
||||
PM_ALT_ROSTER,
|
||||
PM_ALT_EXITMENU0,
|
||||
PM_ALT_EXIT_MANIFEST,
|
||||
|
||||
PM_ALT_MSCAN,
|
||||
PM_ALT_ESCAN,
|
||||
PM_ALT_BSCAN,
|
||||
PM_ALT_ASCAN,
|
||||
PM_ALT_DISPATCH,
|
||||
PM_ALT_EXITMENU1
|
||||
PM_ALT_EXIT_SCAN,
|
||||
};
|
||||
|
||||
extern BOOLEAN DoMenuChooser (MENU_STATE *pMS, BYTE BaseState);
|
||||
|
||||
@@ -30,6 +30,8 @@ typedef struct GenerateFunctions GenerateFunctions;
|
||||
* (graphics and music) part.
|
||||
* - make generateOrbital return a meaningful value, specifically, whether
|
||||
* or not the player is going into orbit
|
||||
* - make generateMinerals et al return the last object number (or count
|
||||
* if called for all objects) and take non-pointer whichNode
|
||||
* - for GenerateNameFunction, set the name in an argument, instead
|
||||
* of in GLOBAL_SYS(PlanetName)
|
||||
* - make generateName work for moons
|
||||
|
||||
@@ -242,19 +242,19 @@ RotatePlanetSphere (BOOLEAN keepRate)
|
||||
PrepareNextRotationFrame ();
|
||||
}
|
||||
|
||||
// rgb.a is ignored
|
||||
// tintColor.a is ignored
|
||||
void
|
||||
DrawPlanet (int x, int y, int dy, Color rgb)
|
||||
DrawPlanet (int dy, Color tintColor)
|
||||
{
|
||||
STAMP s;
|
||||
UBYTE a = 128;
|
||||
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
|
||||
|
||||
s.origin.x = x;
|
||||
s.origin.y = y;
|
||||
s.origin.x = 0;
|
||||
s.origin.y = 0;
|
||||
s.frame = pSolarSysState->TopoFrame;
|
||||
BatchGraphics ();
|
||||
if (sameColor (rgb, BLACK_COLOR))
|
||||
if (sameColor (tintColor, BLACK_COLOR))
|
||||
{ // no tint -- just draw the surface
|
||||
DrawStamp (&s);
|
||||
}
|
||||
@@ -265,20 +265,21 @@ DrawPlanet (int x, int y, int dy, Color rgb)
|
||||
COUNT framew, frameh;
|
||||
RECT srect, drect, *psrect = NULL, *pdrect = NULL;
|
||||
FRAME tintFrame[2];
|
||||
|
||||
tintFrame[0] = SetAbsFrameIndex (Orbit->TintFrame, 0);
|
||||
tintFrame[1] = SetAbsFrameIndex (Orbit->TintFrame, 1);
|
||||
|
||||
framew = GetFrameWidth (tintFrame[0]);
|
||||
frameh = GetFrameHeight (tintFrame[0]);
|
||||
|
||||
if (!sameColor (rgb, pSolarSysState->Tint_rgb))
|
||||
if (!sameColor (tintColor, Orbit->TintColor))
|
||||
{
|
||||
pSolarSysState->Tint_rgb = rgb;
|
||||
Orbit->TintColor = tintColor;
|
||||
// Buffer the topoMap to the tintFrame;
|
||||
arith_frame_blit (s.frame, NULL, tintFrame[0], NULL, 0, 0);
|
||||
r = rgb.r / 2;
|
||||
g = rgb.g / 2;
|
||||
b = rgb.b / 2;
|
||||
r = tintColor.r / 2;
|
||||
g = tintColor.g / 2;
|
||||
b = tintColor.b / 2;
|
||||
#ifdef USE_ADDITIVE_SCAN_BLIT
|
||||
a = 255;
|
||||
#endif
|
||||
|
||||
@@ -35,6 +35,20 @@
|
||||
#include "libs/graphics/gfx_common.h"
|
||||
|
||||
|
||||
// PlanetOrbitMenu() items
|
||||
enum PlanetMenuItems
|
||||
{
|
||||
// XXX: Must match the enum in menustat.h
|
||||
SCAN = 0,
|
||||
STARMAP,
|
||||
EQUIP_DEVICE,
|
||||
CARGO,
|
||||
ROSTER,
|
||||
GAME_MENU,
|
||||
NAVIGATION,
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
DrawScannedObjects (BOOLEAN Reversed)
|
||||
{
|
||||
@@ -138,8 +152,10 @@ typedef enum
|
||||
static void
|
||||
DrawOrbitalDisplay (DRAW_ORBITAL_MODE Mode)
|
||||
{
|
||||
RECT r = { { SIS_ORG_X, SIS_ORG_Y },
|
||||
{ SIS_SCREEN_WIDTH, SIS_SCREEN_HEIGHT } };
|
||||
RECT r;
|
||||
|
||||
SetContext (SpaceContext);
|
||||
GetContextClipRect (&r);
|
||||
|
||||
BatchGraphics ();
|
||||
|
||||
@@ -154,16 +170,14 @@ DrawOrbitalDisplay (DRAW_ORBITAL_MODE Mode)
|
||||
DrawPlanetSurfaceBorder ();
|
||||
}
|
||||
|
||||
SetContext (SpaceContext);
|
||||
|
||||
if (Mode == DRAW_ORBITAL_WAIT)
|
||||
{
|
||||
STAMP s;
|
||||
|
||||
s.frame = CaptureDrawable (
|
||||
LoadGraphic (ORBENTER_PMAP_ANIM));
|
||||
SetContext (GetScanContext (NULL));
|
||||
s.frame = CaptureDrawable (LoadGraphic (ORBENTER_PMAP_ANIM));
|
||||
s.origin.x = -SAFE_X;
|
||||
s.origin.y = SIS_SCREEN_HEIGHT - MAP_HEIGHT;
|
||||
s.origin.y = 0;
|
||||
DrawStamp (&s);
|
||||
DestroyDrawable (ReleaseDrawable (s.frame));
|
||||
}
|
||||
@@ -174,8 +188,8 @@ DrawOrbitalDisplay (DRAW_ORBITAL_MODE Mode)
|
||||
|
||||
if (Mode != DRAW_ORBITAL_WAIT)
|
||||
{
|
||||
DrawPlanet (SIS_SCREEN_WIDTH - MAP_WIDTH,
|
||||
SIS_SCREEN_HEIGHT - MAP_HEIGHT, 0, BLACK_COLOR);
|
||||
SetContext (GetScanContext (NULL));
|
||||
DrawPlanet (0, BLACK_COLOR);
|
||||
}
|
||||
|
||||
if (Mode != DRAW_ORBITAL_UPDATE)
|
||||
@@ -277,7 +291,7 @@ FreePlanet (void)
|
||||
|
||||
DestroyDrawable (ReleaseDrawable (Orbit->TintFrame));
|
||||
Orbit->TintFrame = 0;
|
||||
pSolarSysState->Tint_rgb = BLACK_COLOR;
|
||||
Orbit->TintColor = BLACK_COLOR;
|
||||
|
||||
DestroyDrawable (ReleaseDrawable (Orbit->ObjectFrame));
|
||||
Orbit->ObjectFrame = 0;
|
||||
@@ -347,6 +361,10 @@ DoPlanetOrbit (MENU_STATE *pMS)
|
||||
{
|
||||
case SCAN:
|
||||
ScanSystem ();
|
||||
if (GLOBAL (CurrentActivity) & START_ENCOUNTER)
|
||||
{ // Found Fwiffo on Pluto
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case EQUIP_DEVICE:
|
||||
select = DevicesMenu ();
|
||||
@@ -447,6 +465,10 @@ PlanetOrbitMenu (void)
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
SetFlashRect (NULL);
|
||||
// Need to make sure ScanContext is not active because we will destroy it
|
||||
SetContext (SpaceContext);
|
||||
UnlockMutex (GraphicsLock);
|
||||
DrawMenuStateStrings (PM_STARMAP, -NAVIGATION);
|
||||
|
||||
DestroyScanContext ();
|
||||
}
|
||||
|
||||
@@ -21,27 +21,13 @@
|
||||
|
||||
#define END_INTERPLANETARY START_INTERPLANETARY
|
||||
|
||||
enum
|
||||
{
|
||||
SCAN = 0,
|
||||
STARMAP,
|
||||
EQUIP_DEVICE,
|
||||
CARGO,
|
||||
ROSTER,
|
||||
GAME_MENU,
|
||||
NAVIGATION
|
||||
};
|
||||
|
||||
enum
|
||||
enum PlanetScanTypes
|
||||
{
|
||||
MINERAL_SCAN = 0,
|
||||
ENERGY_SCAN,
|
||||
BIOLOGICAL_SCAN,
|
||||
|
||||
NUM_SCAN_TYPES,
|
||||
EXIT_SCAN = NUM_SCAN_TYPES,
|
||||
AUTO_SCAN,
|
||||
DISPATCH_SHUTTLE
|
||||
};
|
||||
|
||||
#define MAP_WIDTH SIS_SCREEN_WIDTH
|
||||
@@ -155,6 +141,8 @@ struct planet_orbit
|
||||
// automatically drawn if present
|
||||
FRAME TintFrame;
|
||||
// tinted topo images for current scan type (dynamic)
|
||||
Color TintColor;
|
||||
// the color of the last used tint
|
||||
DWORD *lpTopoMap;
|
||||
// RGBA version of topo image; for 3d planet
|
||||
DWORD *ScratchArray;
|
||||
@@ -230,7 +218,6 @@ struct solarsys_state
|
||||
* [4] = bio 2 (world-specific)
|
||||
* [5] = bio 3 (world-specific)
|
||||
*/
|
||||
Color Tint_rgb;
|
||||
FRAME TopoFrame;
|
||||
PLANET_ORBIT Orbit;
|
||||
BOOLEAN InOrbit;
|
||||
@@ -257,7 +244,7 @@ POINT displayToLocation (POINT pt, SIZE scaleRadius);
|
||||
POINT planetOuterLocation (COUNT planetI);
|
||||
|
||||
extern void LoadPlanet (FRAME SurfDefFrame);
|
||||
extern void DrawPlanet (int x, int y, int dy, Color rgb);
|
||||
extern void DrawPlanet (int dy, Color tintColor);
|
||||
extern void FreePlanet (void);
|
||||
extern void LoadStdLanderFont (PLANET_INFO *info);
|
||||
extern void FreeLanderFont (PLANET_INFO *info);
|
||||
|
||||
@@ -270,7 +270,7 @@ DoDiscoveryReport (SOUND ReadOutSounds)
|
||||
SetContext (OldContext);
|
||||
// TODO: Make CONTEXT ref-counted
|
||||
if (ownContext)
|
||||
DestroyContext (context);
|
||||
DestroyScanContext ();
|
||||
|
||||
DestroyDrawable (ReleaseDrawable (saveStamp.frame));
|
||||
|
||||
|
||||
+330
-299
@@ -57,6 +57,15 @@ static POINT planetLoc;
|
||||
static RECT cursorRect;
|
||||
static FRAME eraseFrame;
|
||||
|
||||
// ScanSystem() menu items
|
||||
// The first three are from enum PlanetScanTypes in planets.h
|
||||
enum ScanMenuItems
|
||||
{
|
||||
EXIT_SCAN = NUM_SCAN_TYPES,
|
||||
AUTO_SCAN,
|
||||
DISPATCH_SHUTTLE,
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
RepairBackRect (RECT *pRect)
|
||||
@@ -100,15 +109,13 @@ static void
|
||||
PrintScanTitlePC (TEXT *t, RECT *r, const char *txt, int xpos)
|
||||
{
|
||||
t->baseline.x = xpos;
|
||||
SetContextForeGroundColor (
|
||||
BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x15), 0x3B));
|
||||
SetContextForeGroundColor (SCAN_PC_TITLE_COLOR);
|
||||
t->pStr = txt;
|
||||
t->CharCount = (COUNT)~0;
|
||||
font_DrawText (t);
|
||||
TextRect (t, r, NULL);
|
||||
t->baseline.x += r->extent.width;
|
||||
SetContextForeGroundColor (
|
||||
BUILD_COLOR (MAKE_RGB15 (0x0F, 0x00, 0x19), 0x3B));
|
||||
SetContextForeGroundColor (SCAN_INFO_COLOR);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -171,8 +178,7 @@ PrintCoarseScanPC (void)
|
||||
t.pStr = buf;
|
||||
t.CharCount = (COUNT)~0;
|
||||
|
||||
SetContextForeGroundColor (
|
||||
BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x15), 0x3B));
|
||||
SetContextForeGroundColor (SCAN_PC_TITLE_COLOR);
|
||||
SetContextFont (MicroFont);
|
||||
font_DrawText (&t);
|
||||
|
||||
@@ -357,8 +363,7 @@ PrintCoarseScan3DO (void)
|
||||
t.pStr = buf;
|
||||
t.CharCount = (COUNT)~0;
|
||||
|
||||
SetContextForeGroundColor (
|
||||
BUILD_COLOR (MAKE_RGB15 (0x0F, 0x00, 0x19), 0x3B));
|
||||
SetContextForeGroundColor (SCAN_INFO_COLOR);
|
||||
SetContextFont (MicroFont);
|
||||
font_DrawText (&t);
|
||||
|
||||
@@ -616,7 +621,7 @@ RedrawSurfaceScan (const POINT *newLoc)
|
||||
OldContext = SetContext (ScanContext);
|
||||
|
||||
BatchGraphics ();
|
||||
DrawPlanet (0, 0, 0, BLACK_COLOR);
|
||||
DrawPlanet (0, BLACK_COLOR);
|
||||
DrawScannedObjects (TRUE);
|
||||
if (newLoc)
|
||||
{
|
||||
@@ -628,89 +633,23 @@ RedrawSurfaceScan (const POINT *newLoc)
|
||||
SetContext (OldContext);
|
||||
}
|
||||
|
||||
static BOOLEAN DoScan (MENU_STATE *pMS);
|
||||
|
||||
static BOOLEAN
|
||||
PickPlanetSide (MENU_STATE *pMS)
|
||||
static COUNT
|
||||
getLandingFuelNeeded (void)
|
||||
{
|
||||
DWORD TimeIn = GetTimeCounter ();
|
||||
BOOLEAN select, cancel;
|
||||
COUNT fuel;
|
||||
|
||||
select = PulsedInputState.menu[KEY_MENU_SELECT];
|
||||
cancel = PulsedInputState.menu[KEY_MENU_CANCEL];
|
||||
fuel = pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity << 1;
|
||||
if (fuel > 3 * FUEL_TANK_SCALE)
|
||||
fuel = 3 * FUEL_TANK_SCALE;
|
||||
|
||||
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
||||
{
|
||||
goto ExitPlanetSide;
|
||||
}
|
||||
return fuel;
|
||||
}
|
||||
|
||||
if (!pMS->Initialized)
|
||||
{
|
||||
pMS->InputFunc = PickPlanetSide;
|
||||
SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE);
|
||||
if (!select)
|
||||
{
|
||||
pMS->Initialized = TRUE;
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
SetContext (ScanContext);
|
||||
// Set the current flash location
|
||||
setPlanetCursorLoc (planetLoc);
|
||||
savePlanetLocationImage ();
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
InitLander (0);
|
||||
}
|
||||
}
|
||||
else if (select || cancel)
|
||||
{
|
||||
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
DrawStatusMessage (NULL);
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
FlushInput ();
|
||||
|
||||
if (!select)
|
||||
{ // Bailing out
|
||||
LockMutex (GraphicsLock);
|
||||
restorePlanetLocationImage ();
|
||||
UnlockMutex (GraphicsLock);
|
||||
}
|
||||
else
|
||||
{
|
||||
InputFrameCallback *oldCallback;
|
||||
COUNT fuel_required;
|
||||
|
||||
fuel_required = (COUNT)(
|
||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity << 1);
|
||||
if (fuel_required > 3 * FUEL_TANK_SCALE)
|
||||
fuel_required = 3 * FUEL_TANK_SCALE;
|
||||
|
||||
EraseCoarseScan ();
|
||||
|
||||
// Deactivate planet rotation callback
|
||||
oldCallback = SetInputCallback (NULL);
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
DeltaSISGauges (0, -(SIZE)fuel_required, 0);
|
||||
SetContext (ScanContext);
|
||||
drawPlanetCursor (FALSE);
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
PlanetSide (planetLoc);
|
||||
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
||||
goto ExitPlanetSide;
|
||||
|
||||
if (GET_GAME_STATE (FOUND_PLUTO_SPATHI) == 1)
|
||||
{
|
||||
/* Create Fwiffo group and go into comm with it */
|
||||
static void
|
||||
spawnFwiffo (void)
|
||||
{
|
||||
HSHIPFRAG hStarShip;
|
||||
|
||||
NextActivity |= CHECK_LOAD; /* fake a load game */
|
||||
GLOBAL (CurrentActivity) |= START_ENCOUNTER;
|
||||
|
||||
EncounterGroup = 0;
|
||||
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
|
||||
ReinitQueue (&GLOBAL (ip_group_q));
|
||||
@@ -729,9 +668,40 @@ PickPlanetSide (MENU_STATE *pMS)
|
||||
NUM_CAPTAINS_NAMES;
|
||||
UnlockShipFrag (&GLOBAL (npc_built_ship_q), hStarShip);
|
||||
}
|
||||
}
|
||||
|
||||
// Returns TRUE if the parent menu should remain
|
||||
static BOOLEAN
|
||||
DispatchLander (void)
|
||||
{
|
||||
InputFrameCallback *oldCallback;
|
||||
SIZE landingFuel = getLandingFuelNeeded ();
|
||||
|
||||
EraseCoarseScan ();
|
||||
|
||||
// Deactivate planet rotation callback
|
||||
oldCallback = SetInputCallback (NULL);
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
DeltaSISGauges (0, -landingFuel, 0);
|
||||
SetContext (ScanContext);
|
||||
drawPlanetCursor (FALSE);
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
PlanetSide (planetLoc);
|
||||
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
||||
return FALSE;
|
||||
|
||||
if (GET_GAME_STATE (FOUND_PLUTO_SPATHI) == 1)
|
||||
{
|
||||
/* Create Fwiffo group and go into comm with it */
|
||||
spawnFwiffo ();
|
||||
|
||||
NextActivity |= CHECK_LOAD; /* fake a load game */
|
||||
GLOBAL (CurrentActivity) |= START_ENCOUNTER;
|
||||
SaveSolarSysLocation ();
|
||||
return (FALSE);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (optWhichCoarseScan == OPT_PC)
|
||||
@@ -741,18 +711,41 @@ PickPlanetSide (MENU_STATE *pMS)
|
||||
|
||||
// Reactivate planet rotation callback
|
||||
SetInputCallback (oldCallback);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool success;
|
||||
// true when player selected a location
|
||||
} PICK_PLANET_STATE;
|
||||
|
||||
static BOOLEAN
|
||||
DoPickPlanetSide (MENU_STATE *pMS)
|
||||
{
|
||||
PICK_PLANET_STATE *pickState = pMS->privData;
|
||||
DWORD TimeIn = GetTimeCounter ();
|
||||
BOOLEAN select, cancel;
|
||||
|
||||
select = PulsedInputState.menu[KEY_MENU_SELECT];
|
||||
cancel = PulsedInputState.menu[KEY_MENU_CANCEL];
|
||||
|
||||
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
||||
{
|
||||
pickState->success = false;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DrawMenuStateStrings (PM_MIN_SCAN, DISPATCH_SHUTTLE);
|
||||
LockMutex (GraphicsLock);
|
||||
SetFlashRect (SFR_MENU_3DO);
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
ExitPlanetSide:
|
||||
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
|
||||
|
||||
pMS->InputFunc = DoScan;
|
||||
pMS->CurState = DISPATCH_SHUTTLE;
|
||||
if (cancel)
|
||||
{
|
||||
pickState->success = false;
|
||||
return FALSE;
|
||||
}
|
||||
else if (select)
|
||||
{
|
||||
pickState->success = true;
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -791,8 +784,7 @@ ExitPlanetSide:
|
||||
new_pt.y = planetLoc.y;
|
||||
}
|
||||
|
||||
if (new_pt.x != planetLoc.x
|
||||
|| new_pt.y != planetLoc.y)
|
||||
if (!pointsEqual (new_pt, planetLoc))
|
||||
{
|
||||
setPlanetLoc (new_pt, TRUE);
|
||||
}
|
||||
@@ -805,13 +797,82 @@ ExitPlanetSide:
|
||||
SleepThreadUntil (TimeIn + ONE_SECOND / 40);
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
drawLandingFuelUsage (COUNT fuel)
|
||||
{
|
||||
UNICODE buf[100];
|
||||
|
||||
sprintf (buf, "%s%1.1f",
|
||||
GAME_STRING (NAVIGATION_STRING_BASE + 5),
|
||||
(float) fuel / FUEL_TANK_SCALE);
|
||||
DrawStatusMessage (buf);
|
||||
}
|
||||
|
||||
static void
|
||||
eraseLandingFuelUsage (void)
|
||||
{
|
||||
LockMutex (GraphicsLock);
|
||||
DrawStatusMessage (NULL);
|
||||
UnlockMutex (GraphicsLock);
|
||||
}
|
||||
|
||||
static BOOLEAN
|
||||
PickPlanetSide (void)
|
||||
{
|
||||
MENU_STATE MenuState;
|
||||
PICK_PLANET_STATE PickState;
|
||||
COUNT fuel = getLandingFuelNeeded ();
|
||||
BOOLEAN retval = TRUE;
|
||||
|
||||
memset (&MenuState, 0, sizeof MenuState);
|
||||
MenuState.privData = &PickState;
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
ClearSISRect (CLEAR_SIS_RADAR);
|
||||
SetContext (ScanContext);
|
||||
BatchGraphics ();
|
||||
DrawPlanet (0, BLACK_COLOR);
|
||||
DrawScannedObjects (FALSE);
|
||||
UnbatchGraphics ();
|
||||
|
||||
drawLandingFuelUsage (fuel);
|
||||
// Set the current flash location
|
||||
setPlanetCursorLoc (planetLoc);
|
||||
savePlanetLocationImage ();
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
InitLander (0);
|
||||
|
||||
SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_SELECT);
|
||||
|
||||
PickState.success = false;
|
||||
MenuState.InputFunc = DoPickPlanetSide;
|
||||
DoInput (&MenuState, TRUE);
|
||||
|
||||
eraseLandingFuelUsage ();
|
||||
if (PickState.success)
|
||||
{ // player chose a location
|
||||
retval = DispatchLander ();
|
||||
}
|
||||
else
|
||||
{ // player bailed out
|
||||
LockMutex (GraphicsLock);
|
||||
restorePlanetLocationImage ();
|
||||
UnlockMutex (GraphicsLock);
|
||||
}
|
||||
|
||||
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
#define NUM_FLASH_COLORS 8
|
||||
|
||||
static void
|
||||
DrawScannedStuff (COUNT y, BYTE CurState)
|
||||
DrawScannedStuff (COUNT y, COUNT scan)
|
||||
{
|
||||
HELEMENT hElement, hNextElement;
|
||||
Color OldColor;
|
||||
@@ -821,76 +882,65 @@ DrawScannedStuff (COUNT y, BYTE CurState)
|
||||
for (hElement = GetHeadElement (); hElement; hElement = hNextElement)
|
||||
{
|
||||
ELEMENT *ElementPtr;
|
||||
//Color OldColor;
|
||||
SIZE dy;
|
||||
STAMP s;
|
||||
|
||||
LockElement (hElement, &ElementPtr);
|
||||
hNextElement = GetSuccElement (ElementPtr);
|
||||
|
||||
dy = y - ElementPtr->current.location.y;
|
||||
if (LOBYTE (ElementPtr->scan_node) == CurState
|
||||
&& dy >= 0)// && dy <= 3)
|
||||
{
|
||||
COUNT i;
|
||||
//DWORD Time;
|
||||
STAMP s;
|
||||
if (LOBYTE (ElementPtr->scan_node) != scan || dy < 0)
|
||||
{ // node of wrong type, or not time for it yet
|
||||
UnlockElement (hElement);
|
||||
continue;
|
||||
}
|
||||
|
||||
// XXX: Hack: flag this as a scanned object
|
||||
// XXX: flag this as 'found' scanned object
|
||||
ElementPtr->state_flags |= APPEARING;
|
||||
|
||||
s.origin = ElementPtr->current.location;
|
||||
s.frame = ElementPtr->current.image.frame;
|
||||
|
||||
if (dy >= NUM_FLASH_COLORS)
|
||||
{
|
||||
i = (COUNT)(GetFrameIndex (ElementPtr->next.image.frame)
|
||||
- GetFrameIndex (ElementPtr->current.image.frame)
|
||||
+ 1);
|
||||
do
|
||||
{
|
||||
{ // flashing done for this node, draw normal
|
||||
s.frame = ElementPtr->next.image.frame;
|
||||
DrawStamp (&s);
|
||||
s.frame = IncFrameIndex (s.frame);
|
||||
} while (--i);
|
||||
}
|
||||
else
|
||||
{
|
||||
BYTE r, g, b;
|
||||
Color c;
|
||||
BYTE grad;
|
||||
Color c = WHITE_COLOR;
|
||||
COUNT nodeSize;
|
||||
|
||||
// mineral -- white --> turquoise?? (contrasts with red)
|
||||
// energy -- white --> red (contrasts with white)
|
||||
// bio -- white --> violet (contrasts with green)
|
||||
b = (BYTE)(0x1f - 0x1f * dy / (NUM_FLASH_COLORS - 1));
|
||||
switch (CurState)
|
||||
grad = 0xff - 0xff * dy / (NUM_FLASH_COLORS - 1);
|
||||
switch (scan)
|
||||
{
|
||||
case (MINERAL_SCAN):
|
||||
r = b;
|
||||
g = 0x1f;
|
||||
b = 0x1f;
|
||||
case MINERAL_SCAN:
|
||||
c.r = grad;
|
||||
break;
|
||||
case (ENERGY_SCAN):
|
||||
r = 0x1f;
|
||||
g = b;
|
||||
case ENERGY_SCAN:
|
||||
c.g = grad;
|
||||
c.b = grad;
|
||||
break;
|
||||
case (BIOLOGICAL_SCAN):
|
||||
r = 0x1f;
|
||||
g = b;
|
||||
b = 0x1f;
|
||||
case BIOLOGICAL_SCAN:
|
||||
c.g = grad;
|
||||
break;
|
||||
}
|
||||
|
||||
c = BUILD_COLOR (MAKE_RGB15 (r, g, b), 0);
|
||||
|
||||
SetContextForeGroundColor (c);
|
||||
i = (COUNT)(GetFrameIndex (ElementPtr->next.image.frame)
|
||||
- GetFrameIndex (ElementPtr->current.image.frame)
|
||||
+ 1);
|
||||
do
|
||||
{
|
||||
|
||||
// flash the node from the smallest size to node size
|
||||
// Get the node size for mineral, or number of transitions
|
||||
// for other scan types (was set by GeneratePlanetSide())
|
||||
nodeSize = GetFrameIndex (ElementPtr->next.image.frame)
|
||||
- GetFrameIndex (ElementPtr->current.image.frame);
|
||||
if (dy > nodeSize)
|
||||
dy = nodeSize;
|
||||
|
||||
s.frame = SetRelFrameIndex (ElementPtr->current.image.frame, dy);
|
||||
DrawFilledStamp (&s);
|
||||
s.frame = IncFrameIndex (s.frame);
|
||||
} while (--i);
|
||||
}
|
||||
}
|
||||
|
||||
UnlockElement (hElement);
|
||||
@@ -920,116 +970,49 @@ callGenerateForScanType (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
|
||||
return false;
|
||||
}
|
||||
|
||||
static BOOLEAN
|
||||
DoScan (MENU_STATE *pMS)
|
||||
static void
|
||||
ScanPlanet (COUNT scanType)
|
||||
{
|
||||
#define SCAN_DURATION (ONE_SECOND * 7 / 4)
|
||||
// NUM_FLASH_COLORS for flashing blips; 1 for the final frame
|
||||
#define SCAN_LINES (MAP_HEIGHT + NUM_FLASH_COLORS + 1)
|
||||
#define SCAN_LINE_WAIT (SCAN_DURATION / SCAN_LINES)
|
||||
BOOLEAN select, cancel;
|
||||
|
||||
select = PulsedInputState.menu[KEY_MENU_SELECT];
|
||||
cancel = PulsedInputState.menu[KEY_MENU_CANCEL];
|
||||
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
||||
return (FALSE);
|
||||
|
||||
if (!pMS->Initialized)
|
||||
{
|
||||
pMS->Initialized = TRUE;
|
||||
pMS->InputFunc = DoScan;
|
||||
}
|
||||
else if (cancel || (select && pMS->CurState == EXIT_SCAN))
|
||||
{
|
||||
LockMutex (GraphicsLock);
|
||||
SetContext (SpaceContext);
|
||||
BatchGraphics ();
|
||||
DrawPlanet (SIS_SCREEN_WIDTH - MAP_WIDTH,
|
||||
SIS_SCREEN_HEIGHT - MAP_HEIGHT, 0, BLACK_COLOR);
|
||||
UnbatchGraphics ();
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
EraseCoarseScan ();
|
||||
// DrawMenuStateStrings (PM_SCAN, SCAN);
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
else if (select)
|
||||
{
|
||||
BYTE min_scan, max_scan;
|
||||
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
|
||||
COUNT startScan, endScan;
|
||||
COUNT scan;
|
||||
RECT r;
|
||||
|
||||
if (pMS->CurState == DISPATCH_SHUTTLE)
|
||||
static const Color textColors[] =
|
||||
{
|
||||
COUNT fuel_required;
|
||||
UNICODE buf[100];
|
||||
|
||||
if ((pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
|
||||
|| (pSolarSysState->SysInfo.PlanetInfo.AtmoDensity ==
|
||||
GAS_GIANT_ATMOSPHERE))
|
||||
{ // cannot dispatch to shielded planets or gas giants
|
||||
PlayMenuSound (MENU_SOUND_FAILURE);
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
fuel_required = (COUNT)(
|
||||
pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity << 1
|
||||
);
|
||||
if (fuel_required > 3 * FUEL_TANK_SCALE)
|
||||
fuel_required = 3 * FUEL_TANK_SCALE;
|
||||
|
||||
if (GLOBAL_SIS (FuelOnBoard) < (DWORD)fuel_required
|
||||
|| GLOBAL_SIS (NumLanders) == 0
|
||||
|| GLOBAL_SIS (CrewEnlisted) == 0)
|
||||
SCAN_MINERAL_TEXT_COLOR,
|
||||
SCAN_ENERGY_TEXT_COLOR,
|
||||
SCAN_BIOLOGICAL_TEXT_COLOR,
|
||||
};
|
||||
static const Color tintColors[] =
|
||||
{
|
||||
PlayMenuSound (MENU_SOUND_FAILURE);
|
||||
return (TRUE);
|
||||
SCAN_MINERAL_TINT_COLOR,
|
||||
SCAN_ENERGY_TINT_COLOR,
|
||||
SCAN_BIOLOGICAL_TINT_COLOR,
|
||||
};
|
||||
|
||||
if (scanType == AUTO_SCAN)
|
||||
{
|
||||
startScan = MINERAL_SCAN;
|
||||
endScan = BIOLOGICAL_SCAN;
|
||||
}
|
||||
|
||||
sprintf (buf, "%s%1.1f",
|
||||
GAME_STRING (NAVIGATION_STRING_BASE + 5),
|
||||
(float) fuel_required / FUEL_TANK_SCALE);
|
||||
LockMutex (GraphicsLock);
|
||||
ClearSISRect (CLEAR_SIS_RADAR);
|
||||
DrawStatusMessage (buf);
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
SetFlashRect (NULL);
|
||||
SetContext (ScanContext);
|
||||
BatchGraphics ();
|
||||
DrawPlanet (0, 0, 0, BLACK_COLOR);
|
||||
DrawScannedObjects (FALSE);
|
||||
UnbatchGraphics ();
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
pMS->Initialized = FALSE;
|
||||
pMS->CurFrame = 0;
|
||||
// XXX: PickPlanetSide() will take over the InputFunc
|
||||
// and later restore it when its done
|
||||
return PickPlanetSide (pMS);
|
||||
}
|
||||
|
||||
// Various scans
|
||||
if (pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
|
||||
{ // cannot scan shielded planets
|
||||
PlayMenuSound (MENU_SOUND_FAILURE);
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
min_scan = pMS->CurState;
|
||||
if (min_scan != AUTO_SCAN)
|
||||
max_scan = min_scan;
|
||||
else
|
||||
{
|
||||
min_scan = MINERAL_SCAN;
|
||||
max_scan = BIOLOGICAL_SCAN;
|
||||
startScan = scanType;
|
||||
endScan = scanType;
|
||||
}
|
||||
|
||||
for ( ; min_scan <= max_scan; ++min_scan)
|
||||
for (scan = startScan; scan <= endScan; ++scan)
|
||||
{
|
||||
TEXT t;
|
||||
SWORD i;
|
||||
Color tintColor;
|
||||
// Alpha value will be ignored.
|
||||
TimeCount TimeOut;
|
||||
|
||||
t.baseline.x = SIS_SCREEN_WIDTH >> 1;
|
||||
t.baseline.y = SIS_SCREEN_HEIGHT - MAP_HEIGHT - 7;
|
||||
@@ -1039,9 +1022,8 @@ DoScan (MENU_STATE *pMS)
|
||||
pSolarSysState->CurNode = (COUNT)~0;
|
||||
callGenerateForScanType (pSolarSysState,
|
||||
pSolarSysState->pOrbitalDesc, &pSolarSysState->CurNode,
|
||||
min_scan);
|
||||
pMS->delta_item = (SIZE)pSolarSysState->CurNode;
|
||||
t.pStr = GAME_STRING (SCAN_STRING_BASE + min_scan);
|
||||
scan);
|
||||
t.pStr = GAME_STRING (SCAN_STRING_BASE + scan);
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
SetContext (SpaceContext);
|
||||
@@ -1052,51 +1034,21 @@ DoScan (MENU_STATE *pMS)
|
||||
RepairBackRect (&r);
|
||||
|
||||
SetContextFont (MicroFont);
|
||||
switch (min_scan)
|
||||
{
|
||||
case MINERAL_SCAN:
|
||||
SetContextForeGroundColor (
|
||||
BUILD_COLOR (MAKE_RGB15 (0x13, 0x00, 0x00), 0x2C));
|
||||
break;
|
||||
case ENERGY_SCAN:
|
||||
SetContextForeGroundColor (
|
||||
BUILD_COLOR (MAKE_RGB15 (0x0C, 0x0C, 0x0C), 0x1C));
|
||||
break;
|
||||
case BIOLOGICAL_SCAN:
|
||||
SetContextForeGroundColor (
|
||||
BUILD_COLOR (MAKE_RGB15 (0x00, 0x0E, 0x00), 0x6C));
|
||||
break;
|
||||
}
|
||||
SetContextForeGroundColor (textColors[scan]);
|
||||
font_DrawText (&t);
|
||||
|
||||
SetContext (ScanContext);
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
{
|
||||
Color rgb;
|
||||
// Alpha value will be ignored.
|
||||
TimeCount TimeOut;
|
||||
|
||||
switch (min_scan)
|
||||
{
|
||||
case MINERAL_SCAN:
|
||||
rgb = BUILD_COLOR (MAKE_RGB15 (0x1f, 0x00, 0x00), 0x00);
|
||||
break;
|
||||
case ENERGY_SCAN:
|
||||
rgb = BUILD_COLOR (MAKE_RGB15 (0x1f, 0x1f, 0x1f), 0x00);
|
||||
break;
|
||||
case BIOLOGICAL_SCAN:
|
||||
rgb = BUILD_COLOR (MAKE_RGB15 (0x00, 0x1f, 0x00), 0x00);
|
||||
break;
|
||||
}
|
||||
|
||||
// Draw a virgin surface
|
||||
LockMutex (GraphicsLock);
|
||||
BatchGraphics ();
|
||||
DrawPlanet (0, 0, 0, BLACK_COLOR);
|
||||
DrawPlanet (0, BLACK_COLOR);
|
||||
UnbatchGraphics ();
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
tintColor = tintColors[scan];
|
||||
|
||||
// Draw the scan slowly line by line
|
||||
TimeOut = GetTimeCounter ();
|
||||
for (i = 0; i < SCAN_LINES; i++)
|
||||
@@ -1107,8 +1059,8 @@ DoScan (MENU_STATE *pMS)
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
BatchGraphics ();
|
||||
DrawPlanet (0, 0, i, rgb);
|
||||
DrawScannedStuff (i, min_scan);
|
||||
DrawPlanet (i, tintColor);
|
||||
DrawScannedStuff (i, scan);
|
||||
UnbatchGraphics ();
|
||||
#ifdef SPIN_ON_SCAN
|
||||
RotatePlanetSphere (TRUE);
|
||||
@@ -1121,14 +1073,14 @@ DoScan (MENU_STATE *pMS)
|
||||
LockMutex (GraphicsLock);
|
||||
BatchGraphics ();
|
||||
// dy < 0 means "from dy to the end"
|
||||
DrawPlanet (0, 0, -i, rgb);
|
||||
DrawScannedStuff (SCAN_LINES - 1, min_scan);
|
||||
DrawPlanet (-i, tintColor);
|
||||
DrawScannedStuff (SCAN_LINES - 1, scan);
|
||||
UnbatchGraphics ();
|
||||
UnlockMutex (GraphicsLock);
|
||||
}
|
||||
|
||||
pSolarSysState->Tint_rgb = BLACK_COLOR;
|
||||
}
|
||||
// Reset the last used tint color
|
||||
Orbit->TintColor = BLACK_COLOR;
|
||||
}
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
@@ -1141,27 +1093,92 @@ DoScan (MENU_STATE *pMS)
|
||||
RepairBackRect (&r);
|
||||
|
||||
SetContext (ScanContext);
|
||||
if (pMS->CurState == AUTO_SCAN)
|
||||
{
|
||||
DrawPlanet (0, 0, 0, BLACK_COLOR);
|
||||
if (scanType == AUTO_SCAN)
|
||||
{ // clear the last scan
|
||||
DrawPlanet (0, BLACK_COLOR);
|
||||
DrawScannedObjects (FALSE);
|
||||
}
|
||||
|
||||
UnlockMutex (GraphicsLock);
|
||||
FlushInput ();
|
||||
}
|
||||
|
||||
static BOOLEAN
|
||||
DoScan (MENU_STATE *pMS)
|
||||
{
|
||||
BOOLEAN select, cancel;
|
||||
|
||||
select = PulsedInputState.menu[KEY_MENU_SELECT];
|
||||
cancel = PulsedInputState.menu[KEY_MENU_CANCEL];
|
||||
|
||||
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
||||
return FALSE;
|
||||
|
||||
if (cancel || (select && pMS->CurState == EXIT_SCAN))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else if (select)
|
||||
{
|
||||
if (pMS->CurState == DISPATCH_SHUTTLE)
|
||||
{
|
||||
COUNT fuel_required;
|
||||
|
||||
if ((pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
|
||||
|| (pSolarSysState->SysInfo.PlanetInfo.AtmoDensity ==
|
||||
GAS_GIANT_ATMOSPHERE))
|
||||
{ // cannot dispatch to shielded planets or gas giants
|
||||
PlayMenuSound (MENU_SOUND_FAILURE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
fuel_required = getLandingFuelNeeded ();
|
||||
if (GLOBAL_SIS (FuelOnBoard) < fuel_required
|
||||
|| GLOBAL_SIS (NumLanders) == 0
|
||||
|| GLOBAL_SIS (CrewEnlisted) == 0)
|
||||
{
|
||||
PlayMenuSound (MENU_SOUND_FAILURE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
SetFlashRect (NULL);
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
if (!PickPlanetSide ())
|
||||
return FALSE;
|
||||
|
||||
DrawMenuStateStrings (PM_MIN_SCAN, pMS->CurState);
|
||||
LockMutex (GraphicsLock);
|
||||
SetFlashRect (SFR_MENU_3DO);
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// Various scans
|
||||
if (pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
|
||||
{ // cannot scan shielded planets
|
||||
PlayMenuSound (MENU_SOUND_FAILURE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
ScanPlanet (pMS->CurState);
|
||||
if (pMS->CurState == AUTO_SCAN)
|
||||
{
|
||||
pMS->CurState = DISPATCH_SHUTTLE;
|
||||
DrawMenuStateStrings (PM_MIN_SCAN, pMS->CurState);
|
||||
}
|
||||
else
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
FlushInput ();
|
||||
}
|
||||
else if (optWhichMenu == OPT_PC ||
|
||||
(!(pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
|
||||
&& pSolarSysState->SysInfo.PlanetInfo.AtmoDensity !=
|
||||
GAS_GIANT_ATMOSPHERE))
|
||||
{
|
||||
DoMenuChooser (pMS, PM_MIN_SCAN);
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static CONTEXT
|
||||
@@ -1192,13 +1209,25 @@ GetScanContext (BOOLEAN *owner)
|
||||
// TODO: Make CONTEXT ref-counted
|
||||
if (ScanContext)
|
||||
{
|
||||
if (owner)
|
||||
*owner = FALSE;
|
||||
return ScanContext;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (owner)
|
||||
*owner = TRUE;
|
||||
return CreateScanContext ();
|
||||
ScanContext = CreateScanContext ();
|
||||
}
|
||||
return ScanContext;
|
||||
}
|
||||
|
||||
void
|
||||
DestroyScanContext (void)
|
||||
{
|
||||
if (ScanContext)
|
||||
{
|
||||
DestroyContext (ScanContext);
|
||||
ScanContext = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1209,7 +1238,7 @@ ScanSystem (void)
|
||||
|
||||
memset (&MenuState, 0, sizeof MenuState);
|
||||
|
||||
MenuState.InputFunc = DoScan;
|
||||
GetScanContext (NULL);
|
||||
|
||||
if (optWhichMenu == OPT_3DO &&
|
||||
((pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
|
||||
@@ -1217,7 +1246,6 @@ ScanSystem (void)
|
||||
GAS_GIANT_ATMOSPHERE))
|
||||
{
|
||||
MenuState.CurState = EXIT_SCAN;
|
||||
ScanContext = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1227,7 +1255,6 @@ ScanSystem (void)
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
initPlanetLocationImage ();
|
||||
ScanContext = CreateScanContext ();
|
||||
SetContext (ScanContext);
|
||||
DrawScannedObjects (FALSE);
|
||||
UnlockMutex (GraphicsLock);
|
||||
@@ -1244,22 +1271,26 @@ ScanSystem (void)
|
||||
PrintCoarseScan3DO ();
|
||||
|
||||
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
|
||||
|
||||
MenuState.InputFunc = DoScan;
|
||||
DoInput (&MenuState, FALSE);
|
||||
|
||||
LockMutex (GraphicsLock);
|
||||
SetFlashRect (NULL);
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
if (ScanContext)
|
||||
{
|
||||
// cleanup scan graphics
|
||||
LockMutex (GraphicsLock);
|
||||
BatchGraphics ();
|
||||
SetContext (ScanContext);
|
||||
DrawPlanet (0, BLACK_COLOR);
|
||||
SetContext (SpaceContext);
|
||||
EraseCoarseScan ();
|
||||
UnbatchGraphics ();
|
||||
UnlockMutex (GraphicsLock);
|
||||
|
||||
DestroyDrawable (ReleaseDrawable (eraseFrame));
|
||||
eraseFrame = NULL;
|
||||
DestroyContext (ScanContext);
|
||||
ScanContext = NULL;
|
||||
UnlockMutex (GraphicsLock);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1371,7 +1402,7 @@ GeneratePlanetSide (void)
|
||||
NodeElementPtr->mass_points = HIBYTE (
|
||||
pSolarSysState->SysInfo.PlanetInfo.CurDensity);
|
||||
NodeElementPtr->current.image.frame = SetAbsFrameIndex (
|
||||
MiscDataFrame, (NUM_SCANDOT_TRANSITIONS << 1)
|
||||
MiscDataFrame, (NUM_SCANDOT_TRANSITIONS * 2)
|
||||
+ ElementCategory (EType) * 5);
|
||||
NodeElementPtr->next.image.frame = SetRelFrameIndex (
|
||||
NodeElementPtr->current.image.frame, LOBYTE (
|
||||
|
||||
@@ -52,6 +52,7 @@ extern bool callGenerateForScanType (SOLARSYS_STATE *solarSys,
|
||||
|
||||
extern void RedrawSurfaceScan (const POINT *newLoc);
|
||||
extern CONTEXT GetScanContext (BOOLEAN *owner);
|
||||
extern void DestroyScanContext (void);
|
||||
|
||||
bool isNodeRetrieved (PLANET_INFO *planetInfo, BYTE scanType, BYTE nodeNr);
|
||||
void setNodeRetrieved (PLANET_INFO *planetInfo, BYTE scanType, BYTE nodeNr);
|
||||
|
||||
@@ -60,6 +60,18 @@ static void DrawInnerSystem (void);
|
||||
static void DrawOuterSystem (void);
|
||||
static void ValidateOrbits (void);
|
||||
|
||||
// SolarSysMenu() items
|
||||
enum SolarSysMenuMenuItems
|
||||
{
|
||||
// XXX: Must match the enum in menustat.h
|
||||
STARMAP = 1,
|
||||
EQUIP_DEVICE,
|
||||
CARGO,
|
||||
ROSTER,
|
||||
GAME_MENU,
|
||||
NAVIGATION,
|
||||
};
|
||||
|
||||
|
||||
SOLARSYS_STATE *pSolarSysState;
|
||||
FRAME SISIPFrame;
|
||||
|
||||
Reference in New Issue
Block a user