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:
avolkov
2009-12-15 22:39:26 +00:00
parent af41fd64bf
commit 977bb03b05
13 changed files with 566 additions and 461 deletions
+37 -1
View File
@@ -68,7 +68,11 @@
BUILD_COLOR (MAKE_RGB15 (0x06, 0x06, 0x06), 0x00) BUILD_COLOR (MAKE_RGB15 (0x06, 0x06, 0x06), 0x00)
#define WHITE_COLOR \ #define WHITE_COLOR \
BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F) 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) BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x1F), 0x01)
#define NORMAL_ILLUMINATED_COLOR \ #define NORMAL_ILLUMINATED_COLOR \
@@ -390,12 +394,44 @@
#define ROSTER_MODIFY_SHIP_COLOR \ #define ROSTER_MODIFY_SHIP_COLOR \
WHITE_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: // Temporary, until we can use C'99 features:
#define BLACK_COLOR_INIT \ #define BLACK_COLOR_INIT \
BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00) BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00)
#define WHITE_COLOR_INIT \ #define WHITE_COLOR_INIT \
BUILD_COLOR (MAKE_RGB15_INIT (0x1F, 0x1F, 0x1F), 0x0F) 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 \ #define UNDEFINED_COLOR_INIT \
BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00) BUILD_COLOR (MAKE_RGB15_INIT (0x00, 0x00, 0x00), 0x00)
+1 -1
View File
@@ -39,7 +39,7 @@
#define CREDITS_TIMEOUT (ONE_SECOND * 5) #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 // Positive or negative scroll rate in pixel lines per second
static int CreditsRate; static int CreditsRate;
+13
View File
@@ -50,6 +50,19 @@ static COLORMAP hypercmaps[2];
static BYTE fuel_ticks; static BYTE fuel_ticks;
static COUNT hyper_dx, hyper_dy, hyper_extra; 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 void
MoveSIS (SIZE *pdx, SIZE *pdy) MoveSIS (SIZE *pdx, SIZE *pdy)
{ {
+23 -23
View File
@@ -70,7 +70,7 @@ DrawPCMenuFrame (RECT *r)
} }
#define ALT_MANIFEST 0x80 #define ALT_MANIFEST 0x80
#define ALT_EXIT_MENU0 0x81 #define ALT_EXIT_MANIFEST 0x81
static UNICODE pm_crew_str[128]; static UNICODE pm_crew_str[128];
static UNICODE pm_fuel_str[128]; static UNICODE pm_fuel_str[128];
@@ -151,29 +151,29 @@ GetEndMenuState (BYTE BaseState)
return PM_LAUNCH_LANDER; return PM_LAUNCH_LANDER;
break; break;
case PM_SAVE_GAME: case PM_SAVE_GAME:
return PM_EXIT_MENU1; return PM_EXIT_GAME_MENU;
break; break;
case PM_CONVERSE: case PM_CONVERSE:
return PM_SAVE_LOAD1; return PM_ENCOUNTER_GAME_MENU;
break; break;
case PM_FUEL: case PM_FUEL:
return PM_EXIT_MENU2; return PM_EXIT_OUTFIT;
break; break;
case PM_CREW: case PM_CREW:
return PM_EXIT_MENU3; return PM_EXIT_SHIPYARD;
break; break;
case PM_SOUND_ON: case PM_SOUND_ON:
return PM_EXIT_MENU4; return PM_EXIT_SETTINGS;
break; break;
case PM_ALT_SCAN: case PM_ALT_SCAN:
case PM_ALT_STARMAP: case PM_ALT_STARMAP:
return PM_ALT_NAVIGATE; return PM_ALT_NAVIGATE;
break; break;
case PM_ALT_CARGO: case PM_ALT_CARGO:
return PM_ALT_EXITMENU0; return PM_ALT_EXIT_MANIFEST;
break; break;
case PM_ALT_MSCAN: case PM_ALT_MSCAN:
return PM_ALT_EXITMENU1; return PM_ALT_EXIT_SCAN;
break; break;
} }
return BaseState; return BaseState;
@@ -256,7 +256,7 @@ PreviousMenuState (BYTE BaseState, BYTE CurState)
switch (AdjBase + CurState) switch (AdjBase + CurState)
{ {
case PM_SOUND_OFF: case PM_SOUND_OFF:
NextState = PM_EXIT_MENU4; NextState = PM_EXIT_SETTINGS;
break; break;
case PM_MUSIC_ON: case PM_MUSIC_ON:
case PM_MUSIC_OFF: case PM_MUSIC_OFF:
@@ -299,9 +299,9 @@ GetAlternateMenu (BYTE *BaseState, BYTE *CurState)
*BaseState = PM_ALT_SCAN + adj; *BaseState = PM_ALT_SCAN + adj;
*CurState = PM_ALT_MANIFEST - PM_ALT_SCAN - adj; *CurState = PM_ALT_MANIFEST - PM_ALT_SCAN - adj;
return TRUE; return TRUE;
case ALT_EXIT_MENU0: case ALT_EXIT_MANIFEST:
*BaseState = PM_ALT_CARGO; *BaseState = PM_ALT_CARGO;
*CurState = PM_ALT_EXITMENU0 - PM_ALT_CARGO; *CurState = PM_ALT_EXIT_MANIFEST - PM_ALT_CARGO;
return TRUE; return TRUE;
} }
log_add (log_Error, "Unknown state combination: %d, %d", log_add (log_Error, "Unknown state combination: %d, %d",
@@ -332,9 +332,9 @@ GetAlternateMenu (BYTE *BaseState, BYTE *CurState)
*BaseState = PM_ALT_CARGO; *BaseState = PM_ALT_CARGO;
*CurState = PM_ALT_ROSTER - PM_ALT_CARGO; *CurState = PM_ALT_ROSTER - PM_ALT_CARGO;
return TRUE; return TRUE;
case PM_SAVE_LOAD0: case PM_GAME_MENU:
*BaseState = PM_ALT_SCAN + adj; *BaseState = PM_ALT_SCAN + adj;
*CurState = PM_ALT_SAVE0 - PM_ALT_SCAN - adj; *CurState = PM_ALT_GAME_MENU - PM_ALT_SCAN - adj;
return TRUE; return TRUE;
case PM_NAVIGATE: case PM_NAVIGATE:
*BaseState = PM_ALT_SCAN + adj; *BaseState = PM_ALT_SCAN + adj;
@@ -352,9 +352,9 @@ GetAlternateMenu (BYTE *BaseState, BYTE *CurState)
*BaseState = PM_ALT_MSCAN; *BaseState = PM_ALT_MSCAN;
*CurState = PM_ALT_BSCAN - PM_ALT_MSCAN; *CurState = PM_ALT_BSCAN - PM_ALT_MSCAN;
return TRUE; return TRUE;
case PM_EXIT_MENU0: case PM_EXIT_SCAN:
*BaseState = PM_ALT_MSCAN; *BaseState = PM_ALT_MSCAN;
*CurState = PM_ALT_EXITMENU1 - PM_ALT_MSCAN; *CurState = PM_ALT_EXIT_SCAN - PM_ALT_MSCAN;
return TRUE; return TRUE;
case PM_AUTO_SCAN: case PM_AUTO_SCAN:
*BaseState = PM_ALT_MSCAN; *BaseState = PM_ALT_MSCAN;
@@ -381,8 +381,8 @@ ConvertAlternateMenu (BYTE BaseState, BYTE NewState)
return (PM_STARMAP - PM_SCAN); return (PM_STARMAP - PM_SCAN);
case PM_ALT_MANIFEST: case PM_ALT_MANIFEST:
return (ALT_MANIFEST); return (ALT_MANIFEST);
case PM_ALT_SAVE0: case PM_ALT_GAME_MENU:
return (PM_SAVE_LOAD0 - PM_SCAN); return (PM_GAME_MENU - PM_SCAN);
case PM_ALT_NAVIGATE: case PM_ALT_NAVIGATE:
return (PM_NAVIGATE - PM_SCAN); return (PM_NAVIGATE - PM_SCAN);
case PM_ALT_CARGO: case PM_ALT_CARGO:
@@ -391,8 +391,8 @@ ConvertAlternateMenu (BYTE BaseState, BYTE NewState)
return (PM_DEVICES - PM_SCAN); return (PM_DEVICES - PM_SCAN);
case PM_ALT_ROSTER: case PM_ALT_ROSTER:
return (PM_ROSTER - PM_SCAN); return (PM_ROSTER - PM_SCAN);
case PM_ALT_EXITMENU0: case PM_ALT_EXIT_MANIFEST:
return (ALT_EXIT_MENU0); return (ALT_EXIT_MANIFEST);
case PM_ALT_MSCAN: case PM_ALT_MSCAN:
return (PM_MIN_SCAN - PM_MIN_SCAN); return (PM_MIN_SCAN - PM_MIN_SCAN);
case PM_ALT_ESCAN: case PM_ALT_ESCAN:
@@ -403,8 +403,8 @@ ConvertAlternateMenu (BYTE BaseState, BYTE NewState)
return (PM_AUTO_SCAN - PM_MIN_SCAN); return (PM_AUTO_SCAN - PM_MIN_SCAN);
case PM_ALT_DISPATCH: case PM_ALT_DISPATCH:
return (PM_LAUNCH_LANDER - PM_MIN_SCAN); return (PM_LAUNCH_LANDER - PM_MIN_SCAN);
case PM_ALT_EXITMENU1: case PM_ALT_EXIT_SCAN:
return (PM_EXIT_MENU0 - PM_MIN_SCAN); return (PM_EXIT_SCAN - PM_MIN_SCAN);
} }
return (NewState); return (NewState);
} }
@@ -432,7 +432,7 @@ DoMenuChooser (MENU_STATE *pMS, BYTE BaseState)
pMS->CurState = PM_CARGO - PM_SCAN; pMS->CurState = PM_CARGO - PM_SCAN;
return TRUE; return TRUE;
} }
if (NewState == ALT_EXIT_MENU0) if (NewState == ALT_EXIT_MANIFEST)
{ {
if (OrigBase == PM_SCAN) if (OrigBase == PM_SCAN)
DrawMenuStateStrings (PM_ALT_SCAN, DrawMenuStateStrings (PM_ALT_SCAN,
@@ -546,7 +546,7 @@ DrawMenuStateStrings (BYTE beg_index, SWORD NewState)
case PM_CHANGE_SHIP: case PM_CHANGE_SHIP:
NewState = 4; NewState = 4;
break; break;
case PM_EXIT_MENU4: case PM_EXIT_SETTINGS:
NewState = 5; NewState = 5;
break; break;
} }
+12 -12
View File
@@ -57,13 +57,13 @@ enum
PM_DEVICES, PM_DEVICES,
PM_CARGO, PM_CARGO,
PM_ROSTER, PM_ROSTER,
PM_SAVE_LOAD0, PM_GAME_MENU,
PM_NAVIGATE, PM_NAVIGATE,
PM_MIN_SCAN, PM_MIN_SCAN,
PM_ENE_SCAN, PM_ENE_SCAN,
PM_BIO_SCAN, PM_BIO_SCAN,
PM_EXIT_MENU0, PM_EXIT_SCAN,
PM_AUTO_SCAN, PM_AUTO_SCAN,
PM_LAUNCH_LANDER, PM_LAUNCH_LANDER,
@@ -71,20 +71,20 @@ enum
PM_LOAD_GAME, PM_LOAD_GAME,
PM_QUIT_GAME, PM_QUIT_GAME,
PM_CHANGE_SETTINGS, PM_CHANGE_SETTINGS,
PM_EXIT_MENU1, PM_EXIT_GAME_MENU,
PM_CONVERSE, PM_CONVERSE,
PM_ATTACK, PM_ATTACK,
PM_SAVE_LOAD1, PM_ENCOUNTER_GAME_MENU,
PM_FUEL, PM_FUEL,
PM_MODULE, PM_MODULE,
PM_SAVE_LOAD2, PM_OUTFIT_GAME_MENU,
PM_EXIT_MENU2, PM_EXIT_OUTFIT,
PM_CREW, PM_CREW,
PM_SAVE_LOAD3, PM_SHIPYARD_GAME_MENU,
PM_EXIT_MENU3, PM_EXIT_SHIPYARD,
PM_SOUND_ON, PM_SOUND_ON,
PM_SOUND_OFF, PM_SOUND_OFF,
@@ -96,25 +96,25 @@ enum
PM_CYBORG_SUPER, PM_CYBORG_SUPER,
PM_CHANGE_CAPTAIN, PM_CHANGE_CAPTAIN,
PM_CHANGE_SHIP, PM_CHANGE_SHIP,
PM_EXIT_MENU4, PM_EXIT_SETTINGS,
PM_ALT_SCAN, PM_ALT_SCAN,
PM_ALT_STARMAP, PM_ALT_STARMAP,
PM_ALT_MANIFEST, PM_ALT_MANIFEST,
PM_ALT_SAVE0, PM_ALT_GAME_MENU,
PM_ALT_NAVIGATE, PM_ALT_NAVIGATE,
PM_ALT_CARGO, PM_ALT_CARGO,
PM_ALT_DEVICES, PM_ALT_DEVICES,
PM_ALT_ROSTER, PM_ALT_ROSTER,
PM_ALT_EXITMENU0, PM_ALT_EXIT_MANIFEST,
PM_ALT_MSCAN, PM_ALT_MSCAN,
PM_ALT_ESCAN, PM_ALT_ESCAN,
PM_ALT_BSCAN, PM_ALT_BSCAN,
PM_ALT_ASCAN, PM_ALT_ASCAN,
PM_ALT_DISPATCH, PM_ALT_DISPATCH,
PM_ALT_EXITMENU1 PM_ALT_EXIT_SCAN,
}; };
extern BOOLEAN DoMenuChooser (MENU_STATE *pMS, BYTE BaseState); extern BOOLEAN DoMenuChooser (MENU_STATE *pMS, BYTE BaseState);
+2
View File
@@ -30,6 +30,8 @@ typedef struct GenerateFunctions GenerateFunctions;
* (graphics and music) part. * (graphics and music) part.
* - make generateOrbital return a meaningful value, specifically, whether * - make generateOrbital return a meaningful value, specifically, whether
* or not the player is going into orbit * 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 * - for GenerateNameFunction, set the name in an argument, instead
* of in GLOBAL_SYS(PlanetName) * of in GLOBAL_SYS(PlanetName)
* - make generateName work for moons * - make generateName work for moons
+11 -10
View File
@@ -242,19 +242,19 @@ RotatePlanetSphere (BOOLEAN keepRate)
PrepareNextRotationFrame (); PrepareNextRotationFrame ();
} }
// rgb.a is ignored // tintColor.a is ignored
void void
DrawPlanet (int x, int y, int dy, Color rgb) DrawPlanet (int dy, Color tintColor)
{ {
STAMP s; STAMP s;
UBYTE a = 128; UBYTE a = 128;
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit; PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
s.origin.x = x; s.origin.x = 0;
s.origin.y = y; s.origin.y = 0;
s.frame = pSolarSysState->TopoFrame; s.frame = pSolarSysState->TopoFrame;
BatchGraphics (); BatchGraphics ();
if (sameColor (rgb, BLACK_COLOR)) if (sameColor (tintColor, BLACK_COLOR))
{ // no tint -- just draw the surface { // no tint -- just draw the surface
DrawStamp (&s); DrawStamp (&s);
} }
@@ -265,20 +265,21 @@ DrawPlanet (int x, int y, int dy, Color rgb)
COUNT framew, frameh; COUNT framew, frameh;
RECT srect, drect, *psrect = NULL, *pdrect = NULL; RECT srect, drect, *psrect = NULL, *pdrect = NULL;
FRAME tintFrame[2]; FRAME tintFrame[2];
tintFrame[0] = SetAbsFrameIndex (Orbit->TintFrame, 0); tintFrame[0] = SetAbsFrameIndex (Orbit->TintFrame, 0);
tintFrame[1] = SetAbsFrameIndex (Orbit->TintFrame, 1); tintFrame[1] = SetAbsFrameIndex (Orbit->TintFrame, 1);
framew = GetFrameWidth (tintFrame[0]); framew = GetFrameWidth (tintFrame[0]);
frameh = GetFrameHeight (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; // Buffer the topoMap to the tintFrame;
arith_frame_blit (s.frame, NULL, tintFrame[0], NULL, 0, 0); arith_frame_blit (s.frame, NULL, tintFrame[0], NULL, 0, 0);
r = rgb.r / 2; r = tintColor.r / 2;
g = rgb.g / 2; g = tintColor.g / 2;
b = rgb.b / 2; b = tintColor.b / 2;
#ifdef USE_ADDITIVE_SCAN_BLIT #ifdef USE_ADDITIVE_SCAN_BLIT
a = 255; a = 255;
#endif #endif
+32 -10
View File
@@ -35,6 +35,20 @@
#include "libs/graphics/gfx_common.h" #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 void
DrawScannedObjects (BOOLEAN Reversed) DrawScannedObjects (BOOLEAN Reversed)
{ {
@@ -138,8 +152,10 @@ typedef enum
static void static void
DrawOrbitalDisplay (DRAW_ORBITAL_MODE Mode) DrawOrbitalDisplay (DRAW_ORBITAL_MODE Mode)
{ {
RECT r = { { SIS_ORG_X, SIS_ORG_Y }, RECT r;
{ SIS_SCREEN_WIDTH, SIS_SCREEN_HEIGHT } };
SetContext (SpaceContext);
GetContextClipRect (&r);
BatchGraphics (); BatchGraphics ();
@@ -154,16 +170,14 @@ DrawOrbitalDisplay (DRAW_ORBITAL_MODE Mode)
DrawPlanetSurfaceBorder (); DrawPlanetSurfaceBorder ();
} }
SetContext (SpaceContext);
if (Mode == DRAW_ORBITAL_WAIT) if (Mode == DRAW_ORBITAL_WAIT)
{ {
STAMP s; STAMP s;
s.frame = CaptureDrawable ( SetContext (GetScanContext (NULL));
LoadGraphic (ORBENTER_PMAP_ANIM)); s.frame = CaptureDrawable (LoadGraphic (ORBENTER_PMAP_ANIM));
s.origin.x = -SAFE_X; s.origin.x = -SAFE_X;
s.origin.y = SIS_SCREEN_HEIGHT - MAP_HEIGHT; s.origin.y = 0;
DrawStamp (&s); DrawStamp (&s);
DestroyDrawable (ReleaseDrawable (s.frame)); DestroyDrawable (ReleaseDrawable (s.frame));
} }
@@ -174,8 +188,8 @@ DrawOrbitalDisplay (DRAW_ORBITAL_MODE Mode)
if (Mode != DRAW_ORBITAL_WAIT) if (Mode != DRAW_ORBITAL_WAIT)
{ {
DrawPlanet (SIS_SCREEN_WIDTH - MAP_WIDTH, SetContext (GetScanContext (NULL));
SIS_SCREEN_HEIGHT - MAP_HEIGHT, 0, BLACK_COLOR); DrawPlanet (0, BLACK_COLOR);
} }
if (Mode != DRAW_ORBITAL_UPDATE) if (Mode != DRAW_ORBITAL_UPDATE)
@@ -277,7 +291,7 @@ FreePlanet (void)
DestroyDrawable (ReleaseDrawable (Orbit->TintFrame)); DestroyDrawable (ReleaseDrawable (Orbit->TintFrame));
Orbit->TintFrame = 0; Orbit->TintFrame = 0;
pSolarSysState->Tint_rgb = BLACK_COLOR; Orbit->TintColor = BLACK_COLOR;
DestroyDrawable (ReleaseDrawable (Orbit->ObjectFrame)); DestroyDrawable (ReleaseDrawable (Orbit->ObjectFrame));
Orbit->ObjectFrame = 0; Orbit->ObjectFrame = 0;
@@ -347,6 +361,10 @@ DoPlanetOrbit (MENU_STATE *pMS)
{ {
case SCAN: case SCAN:
ScanSystem (); ScanSystem ();
if (GLOBAL (CurrentActivity) & START_ENCOUNTER)
{ // Found Fwiffo on Pluto
return FALSE;
}
break; break;
case EQUIP_DEVICE: case EQUIP_DEVICE:
select = DevicesMenu (); select = DevicesMenu ();
@@ -447,6 +465,10 @@ PlanetOrbitMenu (void)
LockMutex (GraphicsLock); LockMutex (GraphicsLock);
SetFlashRect (NULL); SetFlashRect (NULL);
// Need to make sure ScanContext is not active because we will destroy it
SetContext (SpaceContext);
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
DrawMenuStateStrings (PM_STARMAP, -NAVIGATION); DrawMenuStateStrings (PM_STARMAP, -NAVIGATION);
DestroyScanContext ();
} }
+4 -17
View File
@@ -21,27 +21,13 @@
#define END_INTERPLANETARY START_INTERPLANETARY #define END_INTERPLANETARY START_INTERPLANETARY
enum enum PlanetScanTypes
{
SCAN = 0,
STARMAP,
EQUIP_DEVICE,
CARGO,
ROSTER,
GAME_MENU,
NAVIGATION
};
enum
{ {
MINERAL_SCAN = 0, MINERAL_SCAN = 0,
ENERGY_SCAN, ENERGY_SCAN,
BIOLOGICAL_SCAN, BIOLOGICAL_SCAN,
NUM_SCAN_TYPES, NUM_SCAN_TYPES,
EXIT_SCAN = NUM_SCAN_TYPES,
AUTO_SCAN,
DISPATCH_SHUTTLE
}; };
#define MAP_WIDTH SIS_SCREEN_WIDTH #define MAP_WIDTH SIS_SCREEN_WIDTH
@@ -155,6 +141,8 @@ struct planet_orbit
// automatically drawn if present // automatically drawn if present
FRAME TintFrame; FRAME TintFrame;
// tinted topo images for current scan type (dynamic) // tinted topo images for current scan type (dynamic)
Color TintColor;
// the color of the last used tint
DWORD *lpTopoMap; DWORD *lpTopoMap;
// RGBA version of topo image; for 3d planet // RGBA version of topo image; for 3d planet
DWORD *ScratchArray; DWORD *ScratchArray;
@@ -230,7 +218,6 @@ struct solarsys_state
* [4] = bio 2 (world-specific) * [4] = bio 2 (world-specific)
* [5] = bio 3 (world-specific) * [5] = bio 3 (world-specific)
*/ */
Color Tint_rgb;
FRAME TopoFrame; FRAME TopoFrame;
PLANET_ORBIT Orbit; PLANET_ORBIT Orbit;
BOOLEAN InOrbit; BOOLEAN InOrbit;
@@ -257,7 +244,7 @@ POINT displayToLocation (POINT pt, SIZE scaleRadius);
POINT planetOuterLocation (COUNT planetI); POINT planetOuterLocation (COUNT planetI);
extern void LoadPlanet (FRAME SurfDefFrame); 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 FreePlanet (void);
extern void LoadStdLanderFont (PLANET_INFO *info); extern void LoadStdLanderFont (PLANET_INFO *info);
extern void FreeLanderFont (PLANET_INFO *info); extern void FreeLanderFont (PLANET_INFO *info);
+1 -1
View File
@@ -270,7 +270,7 @@ DoDiscoveryReport (SOUND ReadOutSounds)
SetContext (OldContext); SetContext (OldContext);
// TODO: Make CONTEXT ref-counted // TODO: Make CONTEXT ref-counted
if (ownContext) if (ownContext)
DestroyContext (context); DestroyScanContext ();
DestroyDrawable (ReleaseDrawable (saveStamp.frame)); DestroyDrawable (ReleaseDrawable (saveStamp.frame));
+417 -386
View File
@@ -57,6 +57,15 @@ static POINT planetLoc;
static RECT cursorRect; static RECT cursorRect;
static FRAME eraseFrame; 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 void
RepairBackRect (RECT *pRect) RepairBackRect (RECT *pRect)
@@ -100,15 +109,13 @@ static void
PrintScanTitlePC (TEXT *t, RECT *r, const char *txt, int xpos) PrintScanTitlePC (TEXT *t, RECT *r, const char *txt, int xpos)
{ {
t->baseline.x = xpos; t->baseline.x = xpos;
SetContextForeGroundColor ( SetContextForeGroundColor (SCAN_PC_TITLE_COLOR);
BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x15), 0x3B));
t->pStr = txt; t->pStr = txt;
t->CharCount = (COUNT)~0; t->CharCount = (COUNT)~0;
font_DrawText (t); font_DrawText (t);
TextRect (t, r, NULL); TextRect (t, r, NULL);
t->baseline.x += r->extent.width; t->baseline.x += r->extent.width;
SetContextForeGroundColor ( SetContextForeGroundColor (SCAN_INFO_COLOR);
BUILD_COLOR (MAKE_RGB15 (0x0F, 0x00, 0x19), 0x3B));
} }
static void static void
@@ -171,8 +178,7 @@ PrintCoarseScanPC (void)
t.pStr = buf; t.pStr = buf;
t.CharCount = (COUNT)~0; t.CharCount = (COUNT)~0;
SetContextForeGroundColor ( SetContextForeGroundColor (SCAN_PC_TITLE_COLOR);
BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x15), 0x3B));
SetContextFont (MicroFont); SetContextFont (MicroFont);
font_DrawText (&t); font_DrawText (&t);
@@ -357,8 +363,7 @@ PrintCoarseScan3DO (void)
t.pStr = buf; t.pStr = buf;
t.CharCount = (COUNT)~0; t.CharCount = (COUNT)~0;
SetContextForeGroundColor ( SetContextForeGroundColor (SCAN_INFO_COLOR);
BUILD_COLOR (MAKE_RGB15 (0x0F, 0x00, 0x19), 0x3B));
SetContextFont (MicroFont); SetContextFont (MicroFont);
font_DrawText (&t); font_DrawText (&t);
@@ -616,7 +621,7 @@ RedrawSurfaceScan (const POINT *newLoc)
OldContext = SetContext (ScanContext); OldContext = SetContext (ScanContext);
BatchGraphics (); BatchGraphics ();
DrawPlanet (0, 0, 0, BLACK_COLOR); DrawPlanet (0, BLACK_COLOR);
DrawScannedObjects (TRUE); DrawScannedObjects (TRUE);
if (newLoc) if (newLoc)
{ {
@@ -628,11 +633,98 @@ RedrawSurfaceScan (const POINT *newLoc)
SetContext (OldContext); SetContext (OldContext);
} }
static BOOLEAN DoScan (MENU_STATE *pMS); static COUNT
getLandingFuelNeeded (void)
{
COUNT fuel;
fuel = pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity << 1;
if (fuel > 3 * FUEL_TANK_SCALE)
fuel = 3 * FUEL_TANK_SCALE;
return fuel;
}
static void
spawnFwiffo (void)
{
HSHIPFRAG hStarShip;
EncounterGroup = 0;
PutGroupInfo (GROUPS_RANDOM, GROUP_SAVE_IP);
ReinitQueue (&GLOBAL (ip_group_q));
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
hStarShip = CloneShipFragment (SPATHI_SHIP,
&GLOBAL (npc_built_ship_q), 1);
if (hStarShip)
{
SHIP_FRAGMENT *StarShipPtr;
StarShipPtr = LockShipFrag (&GLOBAL (npc_built_ship_q),
hStarShip);
// Name Fwiffo
StarShipPtr->captains_name_index = NAME_OFFSET +
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;
}
if (optWhichCoarseScan == OPT_PC)
PrintCoarseScanPC ();
else
PrintCoarseScan3DO ();
// Reactivate planet rotation callback
SetInputCallback (oldCallback);
return TRUE;
}
typedef struct
{
bool success;
// true when player selected a location
} PICK_PLANET_STATE;
static BOOLEAN static BOOLEAN
PickPlanetSide (MENU_STATE *pMS) DoPickPlanetSide (MENU_STATE *pMS)
{ {
PICK_PLANET_STATE *pickState = pMS->privData;
DWORD TimeIn = GetTimeCounter (); DWORD TimeIn = GetTimeCounter ();
BOOLEAN select, cancel; BOOLEAN select, cancel;
@@ -641,118 +733,19 @@ PickPlanetSide (MENU_STATE *pMS)
if (GLOBAL (CurrentActivity) & CHECK_ABORT) if (GLOBAL (CurrentActivity) & CHECK_ABORT)
{ {
goto ExitPlanetSide; pickState->success = false;
return FALSE;
} }
if (!pMS->Initialized) if (cancel)
{ {
pMS->InputFunc = PickPlanetSide; pickState->success = false;
SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE); return FALSE;
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) else if (select)
{ {
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT); pickState->success = true;
return FALSE;
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 */
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));
assert (CountLinks (&GLOBAL (npc_built_ship_q)) == 0);
hStarShip = CloneShipFragment (SPATHI_SHIP,
&GLOBAL (npc_built_ship_q), 1);
if (hStarShip)
{
SHIP_FRAGMENT *StarShipPtr;
StarShipPtr = LockShipFrag (&GLOBAL (npc_built_ship_q),
hStarShip);
// Name Fwiffo
StarShipPtr->captains_name_index = NAME_OFFSET +
NUM_CAPTAINS_NAMES;
UnlockShipFrag (&GLOBAL (npc_built_ship_q), hStarShip);
}
SaveSolarSysLocation ();
return (FALSE);
}
if (optWhichCoarseScan == OPT_PC)
PrintCoarseScanPC ();
else
PrintCoarseScan3DO ();
// Reactivate planet rotation callback
SetInputCallback (oldCallback);
}
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;
} }
else else
{ {
@@ -791,8 +784,7 @@ ExitPlanetSide:
new_pt.y = planetLoc.y; new_pt.y = planetLoc.y;
} }
if (new_pt.x != planetLoc.x if (!pointsEqual (new_pt, planetLoc))
|| new_pt.y != planetLoc.y)
{ {
setPlanetLoc (new_pt, TRUE); setPlanetLoc (new_pt, TRUE);
} }
@@ -805,13 +797,82 @@ ExitPlanetSide:
SleepThreadUntil (TimeIn + ONE_SECOND / 40); 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 #define NUM_FLASH_COLORS 8
static void static void
DrawScannedStuff (COUNT y, BYTE CurState) DrawScannedStuff (COUNT y, COUNT scan)
{ {
HELEMENT hElement, hNextElement; HELEMENT hElement, hNextElement;
Color OldColor; Color OldColor;
@@ -821,76 +882,65 @@ DrawScannedStuff (COUNT y, BYTE CurState)
for (hElement = GetHeadElement (); hElement; hElement = hNextElement) for (hElement = GetHeadElement (); hElement; hElement = hNextElement)
{ {
ELEMENT *ElementPtr; ELEMENT *ElementPtr;
//Color OldColor;
SIZE dy; SIZE dy;
STAMP s;
LockElement (hElement, &ElementPtr); LockElement (hElement, &ElementPtr);
hNextElement = GetSuccElement (ElementPtr); hNextElement = GetSuccElement (ElementPtr);
dy = y - ElementPtr->current.location.y; dy = y - ElementPtr->current.location.y;
if (LOBYTE (ElementPtr->scan_node) == CurState if (LOBYTE (ElementPtr->scan_node) != scan || dy < 0)
&& dy >= 0)// && dy <= 3) { // node of wrong type, or not time for it yet
UnlockElement (hElement);
continue;
}
// XXX: flag this as 'found' scanned object
ElementPtr->state_flags |= APPEARING;
s.origin = ElementPtr->current.location;
if (dy >= NUM_FLASH_COLORS)
{ // flashing done for this node, draw normal
s.frame = ElementPtr->next.image.frame;
DrawStamp (&s);
}
else
{ {
COUNT i; BYTE grad;
//DWORD Time; Color c = WHITE_COLOR;
STAMP s; COUNT nodeSize;
// XXX: Hack: flag this as a scanned object
ElementPtr->state_flags |= APPEARING;
s.origin = ElementPtr->current.location;
s.frame = ElementPtr->current.image.frame;
if (dy >= NUM_FLASH_COLORS) // mineral -- white --> turquoise?? (contrasts with red)
// energy -- white --> red (contrasts with white)
// bio -- white --> violet (contrasts with green)
grad = 0xff - 0xff * dy / (NUM_FLASH_COLORS - 1);
switch (scan)
{ {
i = (COUNT)(GetFrameIndex (ElementPtr->next.image.frame) case MINERAL_SCAN:
- GetFrameIndex (ElementPtr->current.image.frame) c.r = grad;
+ 1); break;
do case ENERGY_SCAN:
{ c.g = grad;
DrawStamp (&s); c.b = grad;
s.frame = IncFrameIndex (s.frame); break;
} while (--i); case BIOLOGICAL_SCAN:
} c.g = grad;
else break;
{
BYTE r, g, b;
Color c;
// 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)
{
case (MINERAL_SCAN):
r = b;
g = 0x1f;
b = 0x1f;
break;
case (ENERGY_SCAN):
r = 0x1f;
g = b;
break;
case (BIOLOGICAL_SCAN):
r = 0x1f;
g = b;
b = 0x1f;
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
{
DrawFilledStamp (&s);
s.frame = IncFrameIndex (s.frame);
} while (--i);
} }
SetContextForeGroundColor (c);
// 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);
} }
UnlockElement (hElement); UnlockElement (hElement);
@@ -920,248 +970,215 @@ callGenerateForScanType (SOLARSYS_STATE *solarSys, PLANET_DESC *world,
return false; return false;
} }
static BOOLEAN static void
DoScan (MENU_STATE *pMS) ScanPlanet (COUNT scanType)
{ {
#define SCAN_DURATION (ONE_SECOND * 7 / 4) #define SCAN_DURATION (ONE_SECOND * 7 / 4)
// NUM_FLASH_COLORS for flashing blips; 1 for the final frame // NUM_FLASH_COLORS for flashing blips; 1 for the final frame
#define SCAN_LINES (MAP_HEIGHT + NUM_FLASH_COLORS + 1) #define SCAN_LINES (MAP_HEIGHT + NUM_FLASH_COLORS + 1)
#define SCAN_LINE_WAIT (SCAN_DURATION / SCAN_LINES) #define SCAN_LINE_WAIT (SCAN_DURATION / SCAN_LINES)
PLANET_ORBIT *Orbit = &pSolarSysState->Orbit;
COUNT startScan, endScan;
COUNT scan;
RECT r;
static const Color textColors[] =
{
SCAN_MINERAL_TEXT_COLOR,
SCAN_ENERGY_TEXT_COLOR,
SCAN_BIOLOGICAL_TEXT_COLOR,
};
static const Color tintColors[] =
{
SCAN_MINERAL_TINT_COLOR,
SCAN_ENERGY_TINT_COLOR,
SCAN_BIOLOGICAL_TINT_COLOR,
};
if (scanType == AUTO_SCAN)
{
startScan = MINERAL_SCAN;
endScan = BIOLOGICAL_SCAN;
}
else
{
startScan = scanType;
endScan = scanType;
}
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;
t.align = ALIGN_CENTER;
t.CharCount = (COUNT)~0;
pSolarSysState->CurNode = (COUNT)~0;
callGenerateForScanType (pSolarSysState,
pSolarSysState->pOrbitalDesc, &pSolarSysState->CurNode,
scan);
t.pStr = GAME_STRING (SCAN_STRING_BASE + scan);
LockMutex (GraphicsLock);
SetContext (SpaceContext);
r.corner.x = 0;
r.corner.y = t.baseline.y - 10;
r.extent.width = SIS_SCREEN_WIDTH;
r.extent.height = t.baseline.y - r.corner.y + 1;
RepairBackRect (&r);
SetContextFont (MicroFont);
SetContextForeGroundColor (textColors[scan]);
font_DrawText (&t);
SetContext (ScanContext);
UnlockMutex (GraphicsLock);
// Draw a virgin surface
LockMutex (GraphicsLock);
BatchGraphics ();
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++)
{
TimeOut += SCAN_LINE_WAIT;
if (WaitForAnyButtonUntil (TRUE, TimeOut, FALSE))
break;
LockMutex (GraphicsLock);
BatchGraphics ();
DrawPlanet (i, tintColor);
DrawScannedStuff (i, scan);
UnbatchGraphics ();
#ifdef SPIN_ON_SCAN
RotatePlanetSphere (TRUE);
#endif
UnlockMutex (GraphicsLock);
}
if (i < SCAN_LINES)
{ // Aborted by a keypress; draw in finished state
LockMutex (GraphicsLock);
BatchGraphics ();
// dy < 0 means "from dy to the end"
DrawPlanet (-i, tintColor);
DrawScannedStuff (SCAN_LINES - 1, scan);
UnbatchGraphics ();
UnlockMutex (GraphicsLock);
}
// Reset the last used tint color
Orbit->TintColor = BLACK_COLOR;
}
LockMutex (GraphicsLock);
SetContext (SpaceContext);
r.corner.x = 0;
r.corner.y = (SIS_SCREEN_HEIGHT - MAP_HEIGHT - 7) - 10;
r.extent.width = SIS_SCREEN_WIDTH;
r.extent.height = (SIS_SCREEN_HEIGHT - MAP_HEIGHT - 7)
- r.corner.y + 1;
RepairBackRect (&r);
SetContext (ScanContext);
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; BOOLEAN select, cancel;
select = PulsedInputState.menu[KEY_MENU_SELECT]; select = PulsedInputState.menu[KEY_MENU_SELECT];
cancel = PulsedInputState.menu[KEY_MENU_CANCEL]; cancel = PulsedInputState.menu[KEY_MENU_CANCEL];
if (GLOBAL (CurrentActivity) & CHECK_ABORT) if (GLOBAL (CurrentActivity) & CHECK_ABORT)
return (FALSE); return FALSE;
if (!pMS->Initialized) if (cancel || (select && pMS->CurState == EXIT_SCAN))
{ {
pMS->Initialized = TRUE; return FALSE;
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) else if (select)
{ {
BYTE min_scan, max_scan;
RECT r;
if (pMS->CurState == DISPATCH_SHUTTLE) if (pMS->CurState == DISPATCH_SHUTTLE)
{ {
COUNT fuel_required; COUNT fuel_required;
UNICODE buf[100];
if ((pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED) if ((pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
|| (pSolarSysState->SysInfo.PlanetInfo.AtmoDensity == || (pSolarSysState->SysInfo.PlanetInfo.AtmoDensity ==
GAS_GIANT_ATMOSPHERE)) GAS_GIANT_ATMOSPHERE))
{ // cannot dispatch to shielded planets or gas giants { // cannot dispatch to shielded planets or gas giants
PlayMenuSound (MENU_SOUND_FAILURE); PlayMenuSound (MENU_SOUND_FAILURE);
return (TRUE); return TRUE;
} }
fuel_required = (COUNT)( fuel_required = getLandingFuelNeeded ();
pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity << 1 if (GLOBAL_SIS (FuelOnBoard) < fuel_required
);
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 (NumLanders) == 0
|| GLOBAL_SIS (CrewEnlisted) == 0) || GLOBAL_SIS (CrewEnlisted) == 0)
{ {
PlayMenuSound (MENU_SOUND_FAILURE); PlayMenuSound (MENU_SOUND_FAILURE);
return (TRUE); return TRUE;
} }
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); LockMutex (GraphicsLock);
SetFlashRect (NULL); SetFlashRect (NULL);
SetContext (ScanContext);
BatchGraphics ();
DrawPlanet (0, 0, 0, BLACK_COLOR);
DrawScannedObjects (FALSE);
UnbatchGraphics ();
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
pMS->Initialized = FALSE; if (!PickPlanetSide ())
pMS->CurFrame = 0; return FALSE;
// XXX: PickPlanetSide() will take over the InputFunc
// and later restore it when its done DrawMenuStateStrings (PM_MIN_SCAN, pMS->CurState);
return PickPlanetSide (pMS); LockMutex (GraphicsLock);
SetFlashRect (SFR_MENU_3DO);
UnlockMutex (GraphicsLock);
return TRUE;
} }
// Various scans // Various scans
if (pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED) if (pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
{ // cannot scan shielded planets { // cannot scan shielded planets
PlayMenuSound (MENU_SOUND_FAILURE); PlayMenuSound (MENU_SOUND_FAILURE);
return (TRUE); return TRUE;
} }
min_scan = pMS->CurState; ScanPlanet (pMS->CurState);
if (min_scan != AUTO_SCAN)
max_scan = min_scan;
else
{
min_scan = MINERAL_SCAN;
max_scan = BIOLOGICAL_SCAN;
}
for ( ; min_scan <= max_scan; ++min_scan)
{
TEXT t;
SWORD i;
t.baseline.x = SIS_SCREEN_WIDTH >> 1;
t.baseline.y = SIS_SCREEN_HEIGHT - MAP_HEIGHT - 7;
t.align = ALIGN_CENTER;
t.CharCount = (COUNT)~0;
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);
LockMutex (GraphicsLock);
SetContext (SpaceContext);
r.corner.x = 0;
r.corner.y = t.baseline.y - 10;
r.extent.width = SIS_SCREEN_WIDTH;
r.extent.height = t.baseline.y - r.corner.y + 1;
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;
}
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);
UnbatchGraphics ();
UnlockMutex (GraphicsLock);
// Draw the scan slowly line by line
TimeOut = GetTimeCounter ();
for (i = 0; i < SCAN_LINES; i++)
{
TimeOut += SCAN_LINE_WAIT;
if (WaitForAnyButtonUntil (TRUE, TimeOut, FALSE))
break;
LockMutex (GraphicsLock);
BatchGraphics ();
DrawPlanet (0, 0, i, rgb);
DrawScannedStuff (i, min_scan);
UnbatchGraphics ();
#ifdef SPIN_ON_SCAN
RotatePlanetSphere (TRUE);
#endif
UnlockMutex (GraphicsLock);
}
if (i < SCAN_LINES)
{ // Aborted by a keypress; draw in finished state
LockMutex (GraphicsLock);
BatchGraphics ();
// dy < 0 means "from dy to the end"
DrawPlanet (0, 0, -i, rgb);
DrawScannedStuff (SCAN_LINES - 1, min_scan);
UnbatchGraphics ();
UnlockMutex (GraphicsLock);
}
pSolarSysState->Tint_rgb = BLACK_COLOR;
}
}
LockMutex (GraphicsLock);
SetContext (SpaceContext);
r.corner.x = 0;
r.corner.y = (SIS_SCREEN_HEIGHT - MAP_HEIGHT - 7) - 10;
r.extent.width = SIS_SCREEN_WIDTH;
r.extent.height = (SIS_SCREEN_HEIGHT - MAP_HEIGHT - 7)
- r.corner.y + 1;
RepairBackRect (&r);
SetContext (ScanContext);
if (pMS->CurState == AUTO_SCAN) if (pMS->CurState == AUTO_SCAN)
{ {
DrawPlanet (0, 0, 0, BLACK_COLOR);
DrawScannedObjects (FALSE);
UnlockMutex (GraphicsLock);
pMS->CurState = DISPATCH_SHUTTLE; pMS->CurState = DISPATCH_SHUTTLE;
DrawMenuStateStrings (PM_MIN_SCAN, pMS->CurState); DrawMenuStateStrings (PM_MIN_SCAN, pMS->CurState);
} }
else
UnlockMutex (GraphicsLock);
FlushInput ();
} }
else if (optWhichMenu == OPT_PC || else if (optWhichMenu == OPT_PC ||
(!(pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED) (!(pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
&& pSolarSysState->SysInfo.PlanetInfo.AtmoDensity != && pSolarSysState->SysInfo.PlanetInfo.AtmoDensity !=
GAS_GIANT_ATMOSPHERE)) GAS_GIANT_ATMOSPHERE))
{
DoMenuChooser (pMS, PM_MIN_SCAN); DoMenuChooser (pMS, PM_MIN_SCAN);
}
return (TRUE); return TRUE;
} }
static CONTEXT static CONTEXT
@@ -1192,13 +1209,25 @@ GetScanContext (BOOLEAN *owner)
// TODO: Make CONTEXT ref-counted // TODO: Make CONTEXT ref-counted
if (ScanContext) if (ScanContext)
{ {
*owner = FALSE; if (owner)
return ScanContext; *owner = FALSE;
} }
else else
{ {
*owner = TRUE; if (owner)
return CreateScanContext (); *owner = TRUE;
ScanContext = CreateScanContext ();
}
return ScanContext;
}
void
DestroyScanContext (void)
{
if (ScanContext)
{
DestroyContext (ScanContext);
ScanContext = NULL;
} }
} }
@@ -1209,7 +1238,7 @@ ScanSystem (void)
memset (&MenuState, 0, sizeof MenuState); memset (&MenuState, 0, sizeof MenuState);
MenuState.InputFunc = DoScan; GetScanContext (NULL);
if (optWhichMenu == OPT_3DO && if (optWhichMenu == OPT_3DO &&
((pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED) ((pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
@@ -1217,7 +1246,6 @@ ScanSystem (void)
GAS_GIANT_ATMOSPHERE)) GAS_GIANT_ATMOSPHERE))
{ {
MenuState.CurState = EXIT_SCAN; MenuState.CurState = EXIT_SCAN;
ScanContext = NULL;
} }
else else
{ {
@@ -1227,7 +1255,6 @@ ScanSystem (void)
LockMutex (GraphicsLock); LockMutex (GraphicsLock);
initPlanetLocationImage (); initPlanetLocationImage ();
ScanContext = CreateScanContext ();
SetContext (ScanContext); SetContext (ScanContext);
DrawScannedObjects (FALSE); DrawScannedObjects (FALSE);
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
@@ -1244,22 +1271,26 @@ ScanSystem (void)
PrintCoarseScan3DO (); PrintCoarseScan3DO ();
SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT); SetMenuSounds (MENU_SOUND_ARROWS, MENU_SOUND_SELECT);
MenuState.InputFunc = DoScan;
DoInput (&MenuState, FALSE); DoInput (&MenuState, FALSE);
LockMutex (GraphicsLock); LockMutex (GraphicsLock);
SetFlashRect (NULL); SetFlashRect (NULL);
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
if (ScanContext) // cleanup scan graphics
{ LockMutex (GraphicsLock);
LockMutex (GraphicsLock); BatchGraphics ();
SetContext (SpaceContext); SetContext (ScanContext);
DestroyDrawable (ReleaseDrawable (eraseFrame)); DrawPlanet (0, BLACK_COLOR);
eraseFrame = NULL; SetContext (SpaceContext);
DestroyContext (ScanContext); EraseCoarseScan ();
ScanContext = NULL; UnbatchGraphics ();
UnlockMutex (GraphicsLock); UnlockMutex (GraphicsLock);
}
DestroyDrawable (ReleaseDrawable (eraseFrame));
eraseFrame = NULL;
} }
static void static void
@@ -1371,7 +1402,7 @@ GeneratePlanetSide (void)
NodeElementPtr->mass_points = HIBYTE ( NodeElementPtr->mass_points = HIBYTE (
pSolarSysState->SysInfo.PlanetInfo.CurDensity); pSolarSysState->SysInfo.PlanetInfo.CurDensity);
NodeElementPtr->current.image.frame = SetAbsFrameIndex ( NodeElementPtr->current.image.frame = SetAbsFrameIndex (
MiscDataFrame, (NUM_SCANDOT_TRANSITIONS << 1) MiscDataFrame, (NUM_SCANDOT_TRANSITIONS * 2)
+ ElementCategory (EType) * 5); + ElementCategory (EType) * 5);
NodeElementPtr->next.image.frame = SetRelFrameIndex ( NodeElementPtr->next.image.frame = SetRelFrameIndex (
NodeElementPtr->current.image.frame, LOBYTE ( NodeElementPtr->current.image.frame, LOBYTE (
+1
View File
@@ -52,6 +52,7 @@ extern bool callGenerateForScanType (SOLARSYS_STATE *solarSys,
extern void RedrawSurfaceScan (const POINT *newLoc); extern void RedrawSurfaceScan (const POINT *newLoc);
extern CONTEXT GetScanContext (BOOLEAN *owner); extern CONTEXT GetScanContext (BOOLEAN *owner);
extern void DestroyScanContext (void);
bool isNodeRetrieved (PLANET_INFO *planetInfo, BYTE scanType, BYTE nodeNr); bool isNodeRetrieved (PLANET_INFO *planetInfo, BYTE scanType, BYTE nodeNr);
void setNodeRetrieved (PLANET_INFO *planetInfo, BYTE scanType, BYTE nodeNr); void setNodeRetrieved (PLANET_INFO *planetInfo, BYTE scanType, BYTE nodeNr);
+12
View File
@@ -60,6 +60,18 @@ static void DrawInnerSystem (void);
static void DrawOuterSystem (void); static void DrawOuterSystem (void);
static void ValidateOrbits (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; SOLARSYS_STATE *pSolarSysState;
FRAME SISIPFrame; FRAME SISIPFrame;