From 7cec3853ab6cec2c6b35377d81f06e33bd5dbb2a Mon Sep 17 00:00:00 2001 From: avolkov Date: Mon, 16 Nov 2009 01:12:07 +0000 Subject: [PATCH] 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 --- sc2/src/uqm/planets/lander.c | 174 +++++++++++++++++------------------ sc2/src/uqm/planets/lander.h | 2 + 2 files changed, 88 insertions(+), 88 deletions(-) diff --git a/sc2/src/uqm/planets/lander.c b/sc2/src/uqm/planets/lander.c index 99f0f49e3..e9937d88a 100644 --- a/sc2/src/uqm/planets/lander.c +++ b/sc2/src/uqm/planets/lander.c @@ -140,6 +140,19 @@ extern PRIM_LINKS DisplayLinks; 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 DamageColorCycle (COLOR c, COUNT i) { @@ -1221,12 +1234,11 @@ RepairScan (void) } static void -ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown) +ScrollPlanetSide (SIZE dx, SIZE dy, int landingIndex) { POINT old_pt, new_pt; STAMP lander_s, shadow_s, shield_s; CONTEXT OldContext; - signed char lander_pos[] = { -10, 1, 12, 22, 31, 39, 45, 50, 54, 57, 59 }; MENU_STATE *scanInputState = &pSolarSysState->MenuState; // TODO: Make a new structure ScanInputState, like // LanderInputState, instead of using MENU_STATE. @@ -1265,18 +1277,6 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown) 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); OldContext = SetContext (SpaceContext); @@ -1308,13 +1308,13 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown) lander_s.origin.x = SURFACE_WIDTH >> 1; lander_s.frame = LanderFrame[0]; - if (CountDown < 0) + if (landingIndex == ON_THE_GROUND) lander_s.origin.y = SURFACE_HEIGHT >> 1; 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.y = lander_s.origin.y; 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) && GetPredLink (DisplayLinks) != END_OF_LIST) CheckObjectCollision (END_OF_LIST); @@ -1397,7 +1397,7 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown) } static void -AnimateLaunch (FRAME farray, BOOLEAN ShowPlanetSide) +AnimateLaunch (FRAME farray) { RECT r; STAMP s; @@ -1419,18 +1419,6 @@ AnimateLaunch (FRAME farray, BOOLEAN ShowPlanetSide) 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)); Time = GetTimeCounter (); @@ -1532,7 +1520,7 @@ InitPlanetSide (void) PlaySound (SetAbsSoundIndex (LanderSounds, LANDER_DEPARTS), NotPositional (), NULL, GAME_SOUND_PRIORITY + 1); SetContext (SpaceContext); - AnimateLaunch (LanderFrame[5], FALSE); + AnimateLaunch (LanderFrame[5]); #ifdef SPIN_ON_LAUNCH pSolarSysState->PauseRotate = 1; UnlockMutex (GraphicsLock); @@ -1667,7 +1655,9 @@ LanderFire (LanderInputState *inputState, SIZE index) { static BOOLEAN DoPlanetSide (LanderInputState *pMS) { -#define NUM_LANDING_DELTAS 10 + SIZE dx = 0; + SIZE dy = 0; + #define SHUTTLE_TURN_WAIT 2 if (GLOBAL (CurrentActivity) & CHECK_ABORT) return (FALSE); @@ -1691,8 +1681,10 @@ landerSpeedNumer = WORLD_TO_VELOCITY (48); #endif SetVelocityComponents (&GLOBAL (velocity), - COSINE (angle, WORLD_TO_VELOCITY (2 * 8)) / LANDER_SPEED_DENOM, - SINE (angle, WORLD_TO_VELOCITY (2 * 8)) / LANDER_SPEED_DENOM); + COSINE (angle, landerSpeedNumer) / LANDER_SPEED_DENOM, + SINE (angle, landerSpeedNumer) / LANDER_SPEED_DENOM); + + return TRUE; } else if (pMS->delta_item == 0 || (HIBYTE (pMS->delta_item) @@ -1750,19 +1742,10 @@ landerSpeedNumer = WORLD_TO_VELOCITY (48); " allocate explosion element!"); } } - - ScrollPlanetSide (0, 0, -1); } else { - SIZE dx, dy; - - if (HIBYTE (pMS->delta_item) == 0) - { - dx = 0; - dy = 0; - } - else + if (HIBYTE (pMS->delta_item) != 0) { SIZE index = GetFrameIndex (LanderFrame[0]); if (LONIBBLE (pMS->CurState)) @@ -1813,10 +1796,13 @@ landerSpeedNumer = WORLD_TO_VELOCITY (48); LanderFire (pMS, index); } } - - ScrollPlanetSide (dx, dy, -1); } + ScrollPlanetSide (dx, dy, ON_THE_GROUND); + + SleepThreadUntil (pLanderInputState->NextTime); + pLanderInputState->NextTime += PLANET_SIDE_RATE; + return TRUE; } @@ -1906,15 +1892,61 @@ ReturnToOrbit (RECT *pRect) LoadIntoExtraScreen (pRect); SetContext (OldContext); 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 PlanetSide (MENU_STATE *pMS) { SIZE index; - DWORD TimeIn; LanderInputState landerInputState; PLANETSIDE_DESC PSD; 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 (); - TimeIn = GetTimeCounter (); - pSolarSysState->MenuState.flash_rect1.corner.x = LOWORD (TimeIn); - 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); - } + landerInputState.NextTime = GetTimeCounter () + PLANET_SIDE_RATE; + LandingTakeoffSequence (&landerInputState, TRUE); 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.InputFunc = DoPlanetSide; SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE); @@ -2030,10 +2045,6 @@ PlanetSide (MENU_STATE *pMS) r.extent.height = SIS_SCREEN_HEIGHT; if (crew_left == 0) { -#ifdef NEVER - ScrollPlanetSide (0, 0, 0); -#endif /* NEVER */ - --GLOBAL_SIS (NumLanders); LockMutex (GraphicsLock); DrawLanders (); @@ -2047,20 +2058,7 @@ PlanetSide (MENU_STATE *pMS) PlaySound (SetAbsSoundIndex (LanderSounds, LANDER_RETURNS), NotPositional (), NULL, GAME_SOUND_PRIORITY + 1); - TimeIn = GetTimeCounter (); - 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); - } - + LandingTakeoffSequence (&landerInputState, FALSE); ReturnToOrbit (&r); #ifdef SPIN_ON_LAUNCH // 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); SetContext (SpaceContext); - AnimateLaunch (LanderFrame[6], TRUE); + AnimateLaunch (LanderFrame[6]); DeltaSISGauges (crew_left, 0, 0); if (PSD.ElementLevel) diff --git a/sc2/src/uqm/planets/lander.h b/sc2/src/uqm/planets/lander.h index 8162f72ca..d1fbc8355 100644 --- a/sc2/src/uqm/planets/lander.h +++ b/sc2/src/uqm/planets/lander.h @@ -67,6 +67,8 @@ struct LanderInputState { PLANETSIDE_DESC *planetSideDesc; SIZE Initialized; MENU_STATE *scanInputState; + TimeCount NextTime; + // Frame rate control // The following fields need to be renamed: BYTE CurState;