Further lander cleanups: decoupled from scan's MENU_STATE.flash_rect1; stabilized frame rate; better semantics
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3307 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -140,6 +140,19 @@ extern PRIM_LINKS DisplayLinks;
|
|||||||
|
|
||||||
static BYTE lander_flags;
|
static BYTE lander_flags;
|
||||||
|
|
||||||
|
#define NUM_LANDING_DELTAS 11
|
||||||
|
#define ON_THE_GROUND -1
|
||||||
|
#define IDLE_INDEX 0
|
||||||
|
// XXX: These should be calculated based on SURFACE_HEIGHT and not fixed
|
||||||
|
// In fact, because 3DO SURFACE_HEIGHT was smaller, the lander visibly
|
||||||
|
// jumps up during takeoff, and slams hard on landing.
|
||||||
|
// I brought these out here from the only func that used them.
|
||||||
|
static signed char landing_pos[NUM_LANDING_DELTAS] =
|
||||||
|
{
|
||||||
|
-10, 1, 12, 22, 31, 39, 45, 50, 54, 57, 59
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static COLOR
|
static COLOR
|
||||||
DamageColorCycle (COLOR c, COUNT i)
|
DamageColorCycle (COLOR c, COUNT i)
|
||||||
{
|
{
|
||||||
@@ -1221,12 +1234,11 @@ RepairScan (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
|
ScrollPlanetSide (SIZE dx, SIZE dy, int landingIndex)
|
||||||
{
|
{
|
||||||
POINT old_pt, new_pt;
|
POINT old_pt, new_pt;
|
||||||
STAMP lander_s, shadow_s, shield_s;
|
STAMP lander_s, shadow_s, shield_s;
|
||||||
CONTEXT OldContext;
|
CONTEXT OldContext;
|
||||||
signed char lander_pos[] = { -10, 1, 12, 22, 31, 39, 45, 50, 54, 57, 59 };
|
|
||||||
MENU_STATE *scanInputState = &pSolarSysState->MenuState;
|
MENU_STATE *scanInputState = &pSolarSysState->MenuState;
|
||||||
// TODO: Make a new structure ScanInputState, like
|
// TODO: Make a new structure ScanInputState, like
|
||||||
// LanderInputState, instead of using MENU_STATE.
|
// LanderInputState, instead of using MENU_STATE.
|
||||||
@@ -1265,18 +1277,6 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
|
|||||||
|
|
||||||
scanInputState->first_item = new_pt;
|
scanInputState->first_item = new_pt;
|
||||||
|
|
||||||
{
|
|
||||||
DWORD TimeIn;
|
|
||||||
|
|
||||||
SleepThreadUntil (MAKE_DWORD (
|
|
||||||
scanInputState->flash_rect1.corner.x,
|
|
||||||
scanInputState->flash_rect1.corner.y));
|
|
||||||
// planet-side rate is set here
|
|
||||||
TimeIn = GetTimeCounter () + PLANET_SIDE_RATE;
|
|
||||||
scanInputState->flash_rect1.corner.x = LOWORD (TimeIn);
|
|
||||||
scanInputState->flash_rect1.corner.y = HIWORD (TimeIn);
|
|
||||||
}
|
|
||||||
|
|
||||||
LockMutex (GraphicsLock);
|
LockMutex (GraphicsLock);
|
||||||
OldContext = SetContext (SpaceContext);
|
OldContext = SetContext (SpaceContext);
|
||||||
|
|
||||||
@@ -1308,13 +1308,13 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
|
|||||||
|
|
||||||
lander_s.origin.x = SURFACE_WIDTH >> 1;
|
lander_s.origin.x = SURFACE_WIDTH >> 1;
|
||||||
lander_s.frame = LanderFrame[0];
|
lander_s.frame = LanderFrame[0];
|
||||||
if (CountDown < 0)
|
if (landingIndex == ON_THE_GROUND)
|
||||||
lander_s.origin.y = SURFACE_HEIGHT >> 1;
|
lander_s.origin.y = SURFACE_HEIGHT >> 1;
|
||||||
else
|
else
|
||||||
lander_s.origin.y = lander_pos[CountDown];
|
lander_s.origin.y = landing_pos[landingIndex];
|
||||||
|
|
||||||
if (CountDown >= 0)
|
if (landingIndex != ON_THE_GROUND)
|
||||||
{
|
{ // Landing, draw a shadow
|
||||||
shadow_s.origin.x = lander_s.origin.y + (SURFACE_WIDTH >> 1) - (SURFACE_HEIGHT >> 1);//2;
|
shadow_s.origin.x = lander_s.origin.y + (SURFACE_WIDTH >> 1) - (SURFACE_HEIGHT >> 1);//2;
|
||||||
shadow_s.origin.y = lander_s.origin.y;
|
shadow_s.origin.y = lander_s.origin.y;
|
||||||
shadow_s.frame = lander_s.frame;
|
shadow_s.frame = lander_s.frame;
|
||||||
@@ -1354,7 +1354,7 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CountDown < 0
|
if (landingIndex == ON_THE_GROUND
|
||||||
&& HIBYTE (pLanderInputState->delta_item)
|
&& HIBYTE (pLanderInputState->delta_item)
|
||||||
&& GetPredLink (DisplayLinks) != END_OF_LIST)
|
&& GetPredLink (DisplayLinks) != END_OF_LIST)
|
||||||
CheckObjectCollision (END_OF_LIST);
|
CheckObjectCollision (END_OF_LIST);
|
||||||
@@ -1397,7 +1397,7 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
AnimateLaunch (FRAME farray, BOOLEAN ShowPlanetSide)
|
AnimateLaunch (FRAME farray)
|
||||||
{
|
{
|
||||||
RECT r;
|
RECT r;
|
||||||
STAMP s;
|
STAMP s;
|
||||||
@@ -1419,18 +1419,6 @@ AnimateLaunch (FRAME farray, BOOLEAN ShowPlanetSide)
|
|||||||
|
|
||||||
UnlockMutex (GraphicsLock);
|
UnlockMutex (GraphicsLock);
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (ShowPlanetSide)
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
ScrollPlanetSide (0, 0, 0);
|
|
||||||
} while (GetTimeCounter () < Time + (ONE_SECOND / 22));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
(void) ShowPlanetSide; /* Satisfying compiler (unused parameter) */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SleepThreadUntil (Time + (ONE_SECOND / 22));
|
SleepThreadUntil (Time + (ONE_SECOND / 22));
|
||||||
Time = GetTimeCounter ();
|
Time = GetTimeCounter ();
|
||||||
|
|
||||||
@@ -1532,7 +1520,7 @@ InitPlanetSide (void)
|
|||||||
PlaySound (SetAbsSoundIndex (LanderSounds, LANDER_DEPARTS),
|
PlaySound (SetAbsSoundIndex (LanderSounds, LANDER_DEPARTS),
|
||||||
NotPositional (), NULL, GAME_SOUND_PRIORITY + 1);
|
NotPositional (), NULL, GAME_SOUND_PRIORITY + 1);
|
||||||
SetContext (SpaceContext);
|
SetContext (SpaceContext);
|
||||||
AnimateLaunch (LanderFrame[5], FALSE);
|
AnimateLaunch (LanderFrame[5]);
|
||||||
#ifdef SPIN_ON_LAUNCH
|
#ifdef SPIN_ON_LAUNCH
|
||||||
pSolarSysState->PauseRotate = 1;
|
pSolarSysState->PauseRotate = 1;
|
||||||
UnlockMutex (GraphicsLock);
|
UnlockMutex (GraphicsLock);
|
||||||
@@ -1667,7 +1655,9 @@ LanderFire (LanderInputState *inputState, SIZE index) {
|
|||||||
static BOOLEAN
|
static BOOLEAN
|
||||||
DoPlanetSide (LanderInputState *pMS)
|
DoPlanetSide (LanderInputState *pMS)
|
||||||
{
|
{
|
||||||
#define NUM_LANDING_DELTAS 10
|
SIZE dx = 0;
|
||||||
|
SIZE dy = 0;
|
||||||
|
|
||||||
#define SHUTTLE_TURN_WAIT 2
|
#define SHUTTLE_TURN_WAIT 2
|
||||||
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
@@ -1691,8 +1681,10 @@ landerSpeedNumer = WORLD_TO_VELOCITY (48);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
SetVelocityComponents (&GLOBAL (velocity),
|
SetVelocityComponents (&GLOBAL (velocity),
|
||||||
COSINE (angle, WORLD_TO_VELOCITY (2 * 8)) / LANDER_SPEED_DENOM,
|
COSINE (angle, landerSpeedNumer) / LANDER_SPEED_DENOM,
|
||||||
SINE (angle, WORLD_TO_VELOCITY (2 * 8)) / LANDER_SPEED_DENOM);
|
SINE (angle, landerSpeedNumer) / LANDER_SPEED_DENOM);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
else if (pMS->delta_item == 0
|
else if (pMS->delta_item == 0
|
||||||
|| (HIBYTE (pMS->delta_item)
|
|| (HIBYTE (pMS->delta_item)
|
||||||
@@ -1750,19 +1742,10 @@ landerSpeedNumer = WORLD_TO_VELOCITY (48);
|
|||||||
" allocate explosion element!");
|
" allocate explosion element!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrollPlanetSide (0, 0, -1);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SIZE dx, dy;
|
if (HIBYTE (pMS->delta_item) != 0)
|
||||||
|
|
||||||
if (HIBYTE (pMS->delta_item) == 0)
|
|
||||||
{
|
|
||||||
dx = 0;
|
|
||||||
dy = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
SIZE index = GetFrameIndex (LanderFrame[0]);
|
SIZE index = GetFrameIndex (LanderFrame[0]);
|
||||||
if (LONIBBLE (pMS->CurState))
|
if (LONIBBLE (pMS->CurState))
|
||||||
@@ -1813,10 +1796,13 @@ landerSpeedNumer = WORLD_TO_VELOCITY (48);
|
|||||||
LanderFire (pMS, index);
|
LanderFire (pMS, index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ScrollPlanetSide (dx, dy, -1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScrollPlanetSide (dx, dy, ON_THE_GROUND);
|
||||||
|
|
||||||
|
SleepThreadUntil (pLanderInputState->NextTime);
|
||||||
|
pLanderInputState->NextTime += PLANET_SIDE_RATE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1906,15 +1892,61 @@ ReturnToOrbit (RECT *pRect)
|
|||||||
LoadIntoExtraScreen (pRect);
|
LoadIntoExtraScreen (pRect);
|
||||||
SetContext (OldContext);
|
SetContext (OldContext);
|
||||||
UnlockMutex (GraphicsLock);
|
UnlockMutex (GraphicsLock);
|
||||||
|
}
|
||||||
|
|
||||||
// SetPlanetTilt (0);
|
static void
|
||||||
|
IdlePlanetSide (LanderInputState *inputState, TimeCount howLong)
|
||||||
|
{
|
||||||
|
TimeCount TimeOut = GetTimeCounter () + howLong;
|
||||||
|
|
||||||
|
while (GetTimeCounter () < TimeOut)
|
||||||
|
{
|
||||||
|
ScrollPlanetSide (0, 0, IDLE_INDEX);
|
||||||
|
SleepThreadUntil (inputState->NextTime);
|
||||||
|
inputState->NextTime += PLANET_SIDE_RATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
LandingTakeoffSequence (LanderInputState *inputState, BOOLEAN landing)
|
||||||
|
{
|
||||||
|
int start;
|
||||||
|
int end;
|
||||||
|
int delta;
|
||||||
|
int index;
|
||||||
|
|
||||||
|
if (landing)
|
||||||
|
{
|
||||||
|
start = 0;
|
||||||
|
end = NUM_LANDING_DELTAS;
|
||||||
|
delta = +1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // takeoff
|
||||||
|
start = NUM_LANDING_DELTAS - 1;
|
||||||
|
end = -1;
|
||||||
|
delta = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (landing)
|
||||||
|
IdlePlanetSide (inputState, ONE_SECOND);
|
||||||
|
|
||||||
|
// Draw the landing/takeoff lander positions
|
||||||
|
for (index = start; index != end; index += delta)
|
||||||
|
{
|
||||||
|
ScrollPlanetSide (0, 0, index);
|
||||||
|
SleepThreadUntil (inputState->NextTime);
|
||||||
|
inputState->NextTime += PLANET_SIDE_RATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!landing)
|
||||||
|
IdlePlanetSide (inputState, ONE_SECOND / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PlanetSide (MENU_STATE *pMS)
|
PlanetSide (MENU_STATE *pMS)
|
||||||
{
|
{
|
||||||
SIZE index;
|
SIZE index;
|
||||||
DWORD TimeIn;
|
|
||||||
LanderInputState landerInputState;
|
LanderInputState landerInputState;
|
||||||
PLANETSIDE_DESC PSD;
|
PLANETSIDE_DESC PSD;
|
||||||
BYTE TectonicsChanceTab[] = {0*3, 0*3, 1*3, 2*3, 4*3, 8*3, 16*3, 32*3};
|
BYTE TectonicsChanceTab[] = {0*3, 0*3, 1*3, 2*3, 4*3, 8*3, 16*3, 32*3};
|
||||||
@@ -1990,27 +2022,10 @@ PlanetSide (MENU_STATE *pMS)
|
|||||||
|
|
||||||
InitPlanetSide ();
|
InitPlanetSide ();
|
||||||
|
|
||||||
TimeIn = GetTimeCounter ();
|
landerInputState.NextTime = GetTimeCounter () + PLANET_SIDE_RATE;
|
||||||
pSolarSysState->MenuState.flash_rect1.corner.x = LOWORD (TimeIn);
|
LandingTakeoffSequence (&landerInputState, TRUE);
|
||||||
pSolarSysState->MenuState.flash_rect1.corner.y = HIWORD (TimeIn);
|
|
||||||
for (index = 0; index <= NUM_LANDING_DELTAS; ++index)
|
|
||||||
{
|
|
||||||
if (index == 0)
|
|
||||||
TimeIn += ONE_SECOND;
|
|
||||||
else
|
|
||||||
TimeIn += ONE_SECOND / 60;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
ScrollPlanetSide (0, 0, index);
|
|
||||||
} while (GetTimeCounter () < TimeIn);
|
|
||||||
}
|
|
||||||
PSD.InTransit = FALSE;
|
PSD.InTransit = FALSE;
|
||||||
|
|
||||||
TimeIn += ONE_SECOND / 30;
|
|
||||||
pSolarSysState->MenuState.flash_rect1.corner.x = LOWORD (TimeIn);
|
|
||||||
pSolarSysState->MenuState.flash_rect1.corner.y = HIWORD (TimeIn);
|
|
||||||
|
|
||||||
landerInputState.Initialized = FALSE;
|
landerInputState.Initialized = FALSE;
|
||||||
landerInputState.InputFunc = DoPlanetSide;
|
landerInputState.InputFunc = DoPlanetSide;
|
||||||
SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE);
|
SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE);
|
||||||
@@ -2030,10 +2045,6 @@ PlanetSide (MENU_STATE *pMS)
|
|||||||
r.extent.height = SIS_SCREEN_HEIGHT;
|
r.extent.height = SIS_SCREEN_HEIGHT;
|
||||||
if (crew_left == 0)
|
if (crew_left == 0)
|
||||||
{
|
{
|
||||||
#ifdef NEVER
|
|
||||||
ScrollPlanetSide (0, 0, 0);
|
|
||||||
#endif /* NEVER */
|
|
||||||
|
|
||||||
--GLOBAL_SIS (NumLanders);
|
--GLOBAL_SIS (NumLanders);
|
||||||
LockMutex (GraphicsLock);
|
LockMutex (GraphicsLock);
|
||||||
DrawLanders ();
|
DrawLanders ();
|
||||||
@@ -2047,20 +2058,7 @@ PlanetSide (MENU_STATE *pMS)
|
|||||||
PlaySound (SetAbsSoundIndex (LanderSounds, LANDER_RETURNS),
|
PlaySound (SetAbsSoundIndex (LanderSounds, LANDER_RETURNS),
|
||||||
NotPositional (), NULL, GAME_SOUND_PRIORITY + 1);
|
NotPositional (), NULL, GAME_SOUND_PRIORITY + 1);
|
||||||
|
|
||||||
TimeIn = GetTimeCounter ();
|
LandingTakeoffSequence (&landerInputState, FALSE);
|
||||||
for (index = NUM_LANDING_DELTAS; index >= 0; --index)
|
|
||||||
{
|
|
||||||
if (index == 0)
|
|
||||||
TimeIn += (ONE_SECOND >> 1);
|
|
||||||
else
|
|
||||||
TimeIn += ONE_SECOND / 60;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
ScrollPlanetSide (0, 0, index);
|
|
||||||
} while (GetTimeCounter () < TimeIn);
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnToOrbit (&r);
|
ReturnToOrbit (&r);
|
||||||
#ifdef SPIN_ON_LAUNCH
|
#ifdef SPIN_ON_LAUNCH
|
||||||
// If PauseRotate is set to 2 the plaet will be displayed, but won't rotate
|
// If PauseRotate is set to 2 the plaet will be displayed, but won't rotate
|
||||||
@@ -2073,7 +2071,7 @@ PlanetSide (MENU_STATE *pMS)
|
|||||||
LockMutex (GraphicsLock);
|
LockMutex (GraphicsLock);
|
||||||
SetContext (SpaceContext);
|
SetContext (SpaceContext);
|
||||||
|
|
||||||
AnimateLaunch (LanderFrame[6], TRUE);
|
AnimateLaunch (LanderFrame[6]);
|
||||||
DeltaSISGauges (crew_left, 0, 0);
|
DeltaSISGauges (crew_left, 0, 0);
|
||||||
|
|
||||||
if (PSD.ElementLevel)
|
if (PSD.ElementLevel)
|
||||||
|
|||||||
@@ -67,6 +67,8 @@ struct LanderInputState {
|
|||||||
PLANETSIDE_DESC *planetSideDesc;
|
PLANETSIDE_DESC *planetSideDesc;
|
||||||
SIZE Initialized;
|
SIZE Initialized;
|
||||||
MENU_STATE *scanInputState;
|
MENU_STATE *scanInputState;
|
||||||
|
TimeCount NextTime;
|
||||||
|
// Frame rate control
|
||||||
|
|
||||||
// The following fields need to be renamed:
|
// The following fields need to be renamed:
|
||||||
BYTE CurState;
|
BYTE CurState;
|
||||||
|
|||||||
Reference in New Issue
Block a user