First steps towards disentangling the lander input state from MENU_STATE.

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3303 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
Meep-Eep
2009-11-15 02:32:54 +00:00
parent 823c756b3c
commit 646cbb76b5
3 changed files with 300 additions and 262 deletions
+229 -193
View File
@@ -48,6 +48,35 @@
// ONE_SECOND. // ONE_SECOND.
#define PLANET_SIDE_RATE (ONE_SECOND / 35) #define PLANET_SIDE_RATE (ONE_SECOND / 35)
// This is a derived type from INPUT_STATE_DESC.
// Originally, the general MENU_STATE structure was used. Now, only the
// fields which are relevant are put in here. In the MENU_STATE structure,
// these fields were reused for all sorts of purposes, which had nothing
// to do with what the name suggests. Not all fields have been renamed yet
// in LanderInputState.
typedef struct LanderInputState LanderInputState;
struct LanderInputState {
BOOLEAN (*InputFunc) (LanderInputState *pMS);
COUNT MenuRepeatDelay;
PLANETSIDE_DESC *planetSideDesc;
SIZE Initialized;
MENU_STATE *scanInputState;
// The following fields need to be renamed:
BYTE CurState;
// High byte: ?
// Low byte: ?
SIZE delta_item;
// High byte: ?
// Low byte: bits 0-6: current lander crew count
// bit 7: set if damage was prevented by a shield
};
LanderInputState *pLanderInputState;
// Temporary, to replace the references to pMenuState.
// Eventually, this should become a parameter to everything which
// needs it.
FRAME LanderFrame[8]; FRAME LanderFrame[8];
static SOUND LanderSounds; static SOUND LanderSounds;
@@ -111,8 +140,6 @@ const LIFEFORM_DESC CreatureData[] =
// Zex's Beauty // Zex's Beauty
}; };
#define FLASH_WIDTH 9
#define FLASH_HEIGHT 9
extern PRIM_LINKS DisplayLinks; extern PRIM_LINKS DisplayLinks;
@@ -196,7 +223,8 @@ RepairTopography (ELEMENT *ElementPtr)
r.corner.x += delta; r.corner.x += delta;
r.extent.width -= delta; r.extent.width -= delta;
} }
if ((ElementPtr->current.location.x += delta) < 0) ElementPtr->current.location.x += delta;
if (ElementPtr->current.location.x < 0)
ElementPtr->current.location.x += MAP_WIDTH; ElementPtr->current.location.x += MAP_WIDTH;
else if (ElementPtr->current.location.x >= MAP_WIDTH) else if (ElementPtr->current.location.x >= MAP_WIDTH)
ElementPtr->current.location.x -= MAP_WIDTH; ElementPtr->current.location.x -= MAP_WIDTH;
@@ -211,7 +239,7 @@ RepairTopography (ELEMENT *ElementPtr)
} }
ElementPtr->current.location.y += delta; ElementPtr->current.location.y += delta;
return (FALSE); return FALSE;
} }
static HELEMENT AddGroundDisaster (COUNT which_disaster); static HELEMENT AddGroundDisaster (COUNT which_disaster);
@@ -261,7 +289,7 @@ object_animation (ELEMENT *ElementPtr)
/* A natural disaster */ /* A natural disaster */
if (ElementPtr->mass_points == DEATH_EXPLOSION) if (ElementPtr->mass_points == DEATH_EXPLOSION)
{ {
if (++pMenuState->CurState >= EXPLOSION_LIFE) if (++pLanderInputState->CurState >= EXPLOSION_LIFE)
pPrim->Object.Stamp.frame = pPrim->Object.Stamp.frame =
DecFrameIndex (pPrim->Object.Stamp.frame); DecFrameIndex (pPrim->Object.Stamp.frame);
} }
@@ -347,7 +375,7 @@ object_animation (ELEMENT *ElementPtr)
DetectPercent = (((BYTE)(CreatureData[index].Attributes DetectPercent = (((BYTE)(CreatureData[index].Attributes
& AWARENESS_MASK) >> AWARENESS_SHIFT) + 1) & AWARENESS_MASK) >> AWARENESS_SHIFT) + 1)
* (30 / 6); * (30 / 6);
// XXX: Shouldn't this be dependant on // XXX: Shouldn't this be dependent on
// PLANET_SIDE_RATE somehow? And why is it // PLANET_SIDE_RATE somehow? And why is it
// written as '30 / 6' instead of 5? Does the 30 // written as '30 / 6' instead of 5? Does the 30
// specify the (PC) framerate? That doesn't make // specify the (PC) framerate? That doesn't make
@@ -442,8 +470,9 @@ DeltaLanderCrew (SIZE crew_delta, COUNT which_disaster)
if (crew_delta > 0) if (crew_delta > 0)
{ {
crew_delta = HIBYTE (pMenuState->delta_item); // Filling up the crew bar when landing.
pMenuState->delta_item += MAKE_WORD (0, 1); crew_delta = HIBYTE (pLanderInputState->delta_item);
pLanderInputState->delta_item += MAKE_WORD (0, 1);
s.frame = SetAbsFrameIndex (LanderFrame[0], 55); s.frame = SetAbsFrameIndex (LanderFrame[0], 55);
} }
@@ -453,20 +482,24 @@ DeltaLanderCrew (SIZE crew_delta, COUNT which_disaster)
ShieldFlags = GET_GAME_STATE (LANDER_SHIELDS); ShieldFlags = GET_GAME_STATE (LANDER_SHIELDS);
ShieldFlags &= 1 << which_disaster; ShieldFlags &= 1 << which_disaster;
crew_delta = HIBYTE (pMenuState->delta_item); crew_delta = HIBYTE (pLanderInputState->delta_item);
if (crew_delta < 1) if (crew_delta < 1)
return; return;
if (ShieldFlags && (BYTE)TFB_Random () < 256 * 95 / 100) if (ShieldFlags && (BYTE)TFB_Random () < 256 * 95 / 100)
pMenuState->delta_item = SHIELD_BIT; {
// Protected by a lander shield.
pLanderInputState->delta_item = SHIELD_BIT;
}
else else
{ {
// Deal damage.
ShieldFlags = 0; ShieldFlags = 0;
if (--crew_delta == 0) if (--crew_delta == 0)
pMenuState->CurState = 0; pLanderInputState->CurState = 0;
pMenuState->delta_item = 0; pLanderInputState->delta_item = 0;
} }
pMenuState->delta_item |= MAKE_WORD (DAMAGE_CYCLE, crew_delta); pLanderInputState->delta_item |= MAKE_WORD (DAMAGE_CYCLE, crew_delta);
if (ShieldFlags) if (ShieldFlags)
return; return;
@@ -557,7 +590,7 @@ CheckObjectCollision (COUNT index)
index = GetSuccLink (DisplayLinks); index = GetSuccLink (DisplayLinks);
} }
pPSD = (PLANETSIDE_DESC*)pMenuState->ModuleFrame; pPSD = pLanderInputState->planetSideDesc;
LanderControl.EndPoint = LanderControl.IntersectStamp.origin; LanderControl.EndPoint = LanderControl.IntersectStamp.origin;
LanderHandle = GetFrameParentDrawable (LanderControl.IntersectStamp.frame); LanderHandle = GetFrameParentDrawable (LanderControl.IntersectStamp.frame);
@@ -610,7 +643,7 @@ CheckObjectCollision (COUNT index)
if (pLanderPrim == 0) if (pLanderPrim == 0)
{ {
/* Collision of lander with another object */ /* Collision of lander with another object */
if (HIBYTE (pMenuState->delta_item) == 0 if (HIBYTE (pLanderInputState->delta_item) == 0
|| pPSD->InTransit) || pPSD->InTransit)
break; break;
@@ -644,10 +677,11 @@ CheckObjectCollision (COUNT index)
DeltaLanderCrew (-1, LANDER_INJURED); DeltaLanderCrew (-1, LANDER_INJURED);
SleepThreadUntil (TimeIn + ONE_SECOND / 20); SleepThreadUntil (TimeIn + ONE_SECOND / 20);
TimeIn = GetTimeCounter(); TimeIn = GetTimeCounter();
} while (HIBYTE (pMenuState->delta_item) && --which_node); } while (HIBYTE (pLanderInputState->delta_item) &&
--which_node);
} }
if (HIBYTE (pMenuState->delta_item) if (HIBYTE (pLanderInputState->delta_item)
&& pSolarSysState->SysInfo.PlanetInfo.DiscoveryString && pSolarSysState->SysInfo.PlanetInfo.DiscoveryString
&& CurStarDescPtr->Index != ANDROSYNTH_DEFINED) && CurStarDescPtr->Index != ANDROSYNTH_DEFINED)
{ {
@@ -682,8 +716,9 @@ CheckObjectCollision (COUNT index)
danger_vals[dangerLevel]) danger_vals[dangerLevel])
{ {
PlaySound (SetAbsSoundIndex ( PlaySound (SetAbsSoundIndex (
LanderSounds, BIOLOGICAL_DISASTER LanderSounds, BIOLOGICAL_DISASTER),
), NotPositional (), NULL, GAME_SOUND_PRIORITY); NotPositional (), NULL,
GAME_SOUND_PRIORITY);
DeltaLanderCrew (-1, BIOLOGICAL_DISASTER); DeltaLanderCrew (-1, BIOLOGICAL_DISASTER);
} }
UnlockElement (hElement); UnlockElement (hElement);
@@ -738,8 +773,7 @@ CheckObjectCollision (COUNT index)
DeltaVelocityComponents ( DeltaVelocityComponents (
&ElementPtr->velocity, &ElementPtr->velocity,
COSINE (angle, WORLD_TO_VELOCITY (1)), COSINE (angle, WORLD_TO_VELOCITY (1)),
SINE (angle, WORLD_TO_VELOCITY (1)) SINE (angle, WORLD_TO_VELOCITY (1)));
);
ElementPtr->thrust_wait = 0; ElementPtr->thrust_wait = 0;
ElementPtr->mass_points |= CREATURE_AWARE; ElementPtr->mass_points |= CREATURE_AWARE;
} }
@@ -914,11 +948,10 @@ lightning_process (ELEMENT *ElementPtr)
if (ElementPtr->mass_points == LIGHTNING_DISASTER) if (ElementPtr->mass_points == LIGHTNING_DISASTER)
{ {
/* This one always strikes the lander and can hurt */ /* This one always strikes the lander and can hurt */
if (HIBYTE (pMenuState->delta_item) PLANETSIDE_DESC *pPSD = pLanderInputState->planetSideDesc;
if (HIBYTE (pLanderInputState->delta_item)
&& (BYTE)TFB_Random () < (256 / 10) && (BYTE)TFB_Random () < (256 / 10)
&& !( && !pPSD->InTransit)
(PLANETSIDE_DESC*)pMenuState->ModuleFrame
)->InTransit)
lander_flags |= KILL_CREW; lander_flags |= KILL_CREW;
ElementPtr->next.location = ElementPtr->next.location =
@@ -1058,7 +1091,7 @@ BuildObjectList (void)
lander_flags &= ~KILL_CREW; lander_flags &= ~KILL_CREW;
pPSD = (PLANETSIDE_DESC*)pMenuState->ModuleFrame; pPSD = pLanderInputState->planetSideDesc;
rand_val = TFB_Random (); rand_val = TFB_Random ();
if (LOBYTE (HIWORD (rand_val)) < pPSD->FireChance) if (LOBYTE (HIWORD (rand_val)) < pPSD->FireChance)
{ {
@@ -1206,7 +1239,7 @@ RepairScan (void)
DrawPlanet (0, 0, 0, 0); DrawPlanet (0, 0, 0, 0);
#endif #endif
DrawScannedObjects (TRUE); DrawScannedObjects (TRUE);
drawPlanetCursor (pMenuState, FALSE); drawPlanetCursor (pLanderInputState->scanInputState, FALSE);
UnbatchGraphics (); UnbatchGraphics ();
SetContext (OldContext); SetContext (OldContext);
@@ -1219,9 +1252,12 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
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 }; 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.
old_pt.x = pSolarSysState->MenuState.first_item.x - (SURFACE_WIDTH >> 1); old_pt.x = scanInputState->first_item.x - (SURFACE_WIDTH >> 1);
old_pt.y = pSolarSysState->MenuState.first_item.y - (SURFACE_HEIGHT >> 1); old_pt.y = scanInputState->first_item.y - (SURFACE_HEIGHT >> 1);
new_pt.y = old_pt.y + dy; new_pt.y = old_pt.y + dy;
if (new_pt.y < -(SURFACE_HEIGHT >> 1)) if (new_pt.y < -(SURFACE_HEIGHT >> 1))
@@ -1245,26 +1281,25 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
else if (new_pt.x >= MAP_WIDTH << MAG_SHIFT) else if (new_pt.x >= MAP_WIDTH << MAG_SHIFT)
new_pt.x -= MAP_WIDTH << MAG_SHIFT; new_pt.x -= MAP_WIDTH << MAG_SHIFT;
new_pt.x = pSolarSysState->MenuState.first_item.x + dx; new_pt.x = scanInputState->first_item.x + dx;
if (new_pt.x < 0) if (new_pt.x < 0)
new_pt.x += MAP_WIDTH << MAG_SHIFT; new_pt.x += MAP_WIDTH << MAG_SHIFT;
else if (new_pt.x >= MAP_WIDTH << MAG_SHIFT) else if (new_pt.x >= MAP_WIDTH << MAG_SHIFT)
new_pt.x -= MAP_WIDTH << MAG_SHIFT; new_pt.x -= MAP_WIDTH << MAG_SHIFT;
new_pt.y = pSolarSysState->MenuState.first_item.y + dy; new_pt.y = scanInputState->first_item.y + dy;
pSolarSysState->MenuState.first_item = new_pt; scanInputState->first_item = new_pt;
{ {
DWORD TimeIn; DWORD TimeIn;
SleepThreadUntil (MAKE_DWORD ( SleepThreadUntil (MAKE_DWORD (
pSolarSysState->MenuState.flash_rect1.corner.x, scanInputState->flash_rect1.corner.x,
pSolarSysState->MenuState.flash_rect1.corner.y scanInputState->flash_rect1.corner.y));
));
// planet-side rate is set here // planet-side rate is set here
TimeIn = GetTimeCounter () + PLANET_SIDE_RATE; TimeIn = GetTimeCounter () + PLANET_SIDE_RATE;
pSolarSysState->MenuState.flash_rect1.corner.x = LOWORD (TimeIn); scanInputState->flash_rect1.corner.x = LOWORD (TimeIn);
pSolarSysState->MenuState.flash_rect1.corner.y = HIWORD (TimeIn); scanInputState->flash_rect1.corner.y = HIWORD (TimeIn);
} }
LockMutex (GraphicsLock); LockMutex (GraphicsLock);
@@ -1292,7 +1327,7 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
DrawBatch (DisplayArray, DisplayLinks, 0); DrawBatch (DisplayArray, DisplayLinks, 0);
if (pMenuState->delta_item || pMenuState->CurState < 3) if (pLanderInputState->delta_item || pLanderInputState->CurState < 3)
{ {
BYTE damage_index; BYTE damage_index;
@@ -1312,11 +1347,12 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
DrawFilledStamp (&shadow_s); DrawFilledStamp (&shadow_s);
} }
if ((damage_index = LOBYTE (pMenuState->delta_item)) == 0) damage_index = LOBYTE (pLanderInputState->delta_item);
if (damage_index == 0)
DrawStamp (&lander_s); DrawStamp (&lander_s);
else else
{ {
--pMenuState->delta_item; --pLanderInputState->delta_item;
if (!(damage_index & SHIELD_BIT)) if (!(damage_index & SHIELD_BIT))
{ {
SetContextForeGroundColor (DamageColorCycle (0, damage_index)); SetContextForeGroundColor (DamageColorCycle (0, damage_index));
@@ -1324,20 +1360,18 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
} }
else else
{ {
if ((damage_index = damage_index = (BYTE)((damage_index & ~SHIELD_BIT) - 1);
(BYTE)((damage_index & ~SHIELD_BIT) - 1)) == 0) if (damage_index == 0)
pMenuState->delta_item &= ~SHIELD_BIT; pLanderInputState->delta_item &= ~SHIELD_BIT;
else else
{ {
shield_s.origin = lander_s.origin; shield_s.origin = lander_s.origin;
shield_s.frame = SetEquFrameIndex ( shield_s.frame = SetEquFrameIndex (
LanderFrame[4], LanderFrame[4], lander_s.frame);
lander_s.frame
);
SetContextForeGroundColor ( SetContextForeGroundColor (BUILD_COLOR (
BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F) | 0x8000, damage_index) MAKE_RGB15 (0x1F, 0x1F, 0x1F) | 0x8000,
); damage_index));
DrawFilledStamp (&shield_s); DrawFilledStamp (&shield_s);
} }
DrawStamp (&lander_s); DrawStamp (&lander_s);
@@ -1346,14 +1380,14 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
} }
if (CountDown < 0 if (CountDown < 0
&& HIBYTE (pMenuState->delta_item) && HIBYTE (pLanderInputState->delta_item)
&& GetPredLink (DisplayLinks) != END_OF_LIST) && GetPredLink (DisplayLinks) != END_OF_LIST)
CheckObjectCollision (END_OF_LIST); CheckObjectCollision (END_OF_LIST);
{ {
PLANETSIDE_DESC *pPSD; PLANETSIDE_DESC *pPSD;
pPSD = (PLANETSIDE_DESC*)pMenuState->ModuleFrame; pPSD = pLanderInputState->planetSideDesc;
if (pPSD->NumFrames) if (pPSD->NumFrames)
{ {
--pPSD->NumFrames; --pPSD->NumFrames;
@@ -1362,16 +1396,20 @@ ScrollPlanetSide (SIZE dx, SIZE dy, SIZE CountDown)
pPSD->MineralText[0].baseline.x -= dx; pPSD->MineralText[0].baseline.x -= dx;
pPSD->MineralText[0].baseline.y -= dy; pPSD->MineralText[0].baseline.y -= dy;
font_DrawText (&pPSD->MineralText[0]); font_DrawText (&pPSD->MineralText[0]);
pPSD->MineralText[1].baseline.x = pPSD->MineralText[0].baseline.x; pPSD->MineralText[1].baseline.x =
pPSD->MineralText[1].baseline.y = pPSD->MineralText[0].baseline.y + 7; pPSD->MineralText[0].baseline.x;
pPSD->MineralText[1].baseline.y =
pPSD->MineralText[0].baseline.y + 7;
font_DrawText (&pPSD->MineralText[1]); font_DrawText (&pPSD->MineralText[1]);
pPSD->MineralText[2].baseline.x = pPSD->MineralText[1].baseline.x; pPSD->MineralText[2].baseline.x =
pPSD->MineralText[2].baseline.y = pPSD->MineralText[1].baseline.y + 7; pPSD->MineralText[1].baseline.x;
pPSD->MineralText[2].baseline.y =
pPSD->MineralText[1].baseline.y + 7;
font_DrawText (&pPSD->MineralText[2]); font_DrawText (&pPSD->MineralText[2]);
} }
} }
setPlanetCursorLoc (pMenuState, new_pt); setPlanetCursorLoc (pLanderInputState->scanInputState, new_pt);
RepairScan (); RepairScan ();
if (lander_flags & KILL_CREW) if (lander_flags & KILL_CREW)
@@ -1592,54 +1630,104 @@ InitPlanetSide (void)
SET_GAME_STATE (PLANETARY_LANDING, 1); SET_GAME_STATE (PLANETARY_LANDING, 1);
} }
static void
LanderFire (LanderInputState *inputState, SIZE index) {
#define SHUTTLE_FIRE_WAIT 15
HELEMENT hWeaponElement;
SIZE wdx, wdy;
ELEMENT *WeaponElementPtr;
hWeaponElement = AllocElement ();
if (hWeaponElement == NULL)
return;
LockElement (hWeaponElement, &WeaponElementPtr);
WeaponElementPtr->playerNr = PS_HUMAN_PLAYER;
WeaponElementPtr->mass_points = 1;
WeaponElementPtr->life_span = 12;
WeaponElementPtr->state_flags = FINITE_LIFE;
WeaponElementPtr->next.location =
pSolarSysState->MenuState.first_item;
WeaponElementPtr->current.location.x =
WeaponElementPtr->next.location.x >> MAG_SHIFT;
WeaponElementPtr->current.location.y =
WeaponElementPtr->next.location.y >> MAG_SHIFT;
SetPrimType (&DisplayArray[WeaponElementPtr->PrimIndex], STAMP_PRIM);
DisplayArray[WeaponElementPtr->PrimIndex].Object.Stamp.frame =
SetAbsFrameIndex (
LanderFrame[0],
index + ANGLE_TO_FACING (FULL_CIRCLE));
if (!CurrentInputState.key[PlayerControls[0]][KEY_UP])
{
wdx = 0;
wdy = 0;
}
else
{
GetCurrentVelocityComponents (&GLOBAL (velocity), &wdx, &wdy);
}
index = FACING_TO_ANGLE (index);
SetVelocityComponents (
&WeaponElementPtr->velocity,
COSINE (index, WORLD_TO_VELOCITY (2 * 3)) + wdx,
SINE (index, WORLD_TO_VELOCITY (2 * 3)) + wdy);
UnlockElement (hWeaponElement);
InsertElement (hWeaponElement, GetHeadElement ());
PlaySound (SetAbsSoundIndex (LanderSounds, LANDER_SHOOTS),
NotPositional (), NULL, GAME_SOUND_PRIORITY);
wdx = SHUTTLE_FIRE_WAIT;
if (GET_GAME_STATE (IMPROVED_LANDER_SHOT))
wdx >>= 1;
inputState->CurState = MAKE_BYTE (LONIBBLE (inputState->CurState), wdx);
}
static BOOLEAN static BOOLEAN
DoPlanetSide (MENU_STATE *pMS) DoPlanetSide (LanderInputState *pMS)
{ {
#define NUM_LANDING_DELTAS 10 #define NUM_LANDING_DELTAS 10
#define SHUTTLE_TURN_WAIT 2 #define SHUTTLE_TURN_WAIT 2
#define SHUTTLE_FIRE_WAIT 15
SIZE index;
if (GLOBAL (CurrentActivity) & CHECK_ABORT) if (GLOBAL (CurrentActivity) & CHECK_ABORT)
return (FALSE); return (FALSE);
pMS->MenuRepeatDelay = 0; pMS->MenuRepeatDelay = 0;
if (!pMS->Initialized) if (!pMS->Initialized)
{ {
COUNT landerSpeedNumer;
COUNT angle;
pMS->Initialized = TRUE; pMS->Initialized = TRUE;
pMS->CurState = 0; pMS->CurState = 0;
index = FACING_TO_ANGLE (GetFrameIndex (LanderFrame[0])); angle = FACING_TO_ANGLE (GetFrameIndex (LanderFrame[0]));
if (!GET_GAME_STATE (IMPROVED_LANDER_SPEED)) landerSpeedNumer = GET_GAME_STATE (IMPROVED_LANDER_SPEED) ?
SetVelocityComponents ( WORLD_TO_VELOCITY (2 * 14) :
&GLOBAL (velocity), WORLD_TO_VELOCITY (2 * 8);
COSINE (index, WORLD_TO_VELOCITY (2 * 8)) / LANDER_SPEED_DENOM,
SINE (index, WORLD_TO_VELOCITY (2 * 8)) / LANDER_SPEED_DENOM
);
else
SetVelocityComponents (
&GLOBAL (velocity),
COSINE (index, WORLD_TO_VELOCITY (2 * 14)) / LANDER_SPEED_DENOM,
SINE (index, WORLD_TO_VELOCITY (2 * 14)) / LANDER_SPEED_DENOM
);
#ifdef FAST_FAST #ifdef FAST_FAST
SetVelocityComponents ( landerSpeedNumer = WORLD_TO_VELOCITY (48);
&GLOBAL (velocity),
COSINE (index, WORLD_TO_VELOCITY (48)) / LANDER_SPEED_DENOM,
SINE (index, WORLD_TO_VELOCITY (48)) / LANDER_SPEED_DENOM
);
#endif #endif
SetVelocityComponents (&GLOBAL (velocity),
COSINE (angle, WORLD_TO_VELOCITY (2 * 8)) / LANDER_SPEED_DENOM,
SINE (angle, WORLD_TO_VELOCITY (2 * 8)) / LANDER_SPEED_DENOM);
} }
else if (pMS->delta_item == 0 else if (pMS->delta_item == 0
|| (HIBYTE (pMS->delta_item) || (HIBYTE (pMS->delta_item)
&& ((CurrentInputState.key[PlayerControls[0]][KEY_ESCAPE] || && ((CurrentInputState.key[PlayerControls[0]][KEY_ESCAPE] ||
CurrentInputState.key[PlayerControls[0]][KEY_SPECIAL]) CurrentInputState.key[PlayerControls[0]][KEY_SPECIAL])
|| ((PLANETSIDE_DESC*)pMenuState->ModuleFrame)->InTransit))) || pLanderInputState->planetSideDesc->InTransit)))
{ {
if (pMS->delta_item || pMS->CurState > EXPLOSION_LIFE + 60) if (pMS->delta_item || pMS->CurState > EXPLOSION_LIFE + 60)
return (FALSE); return FALSE;
else
{
if (pMS->CurState > EXPLOSION_LIFE) if (pMS->CurState > EXPLOSION_LIFE)
++pMS->CurState; ++pMS->CurState;
else if (pMS->CurState == 0) else if (pMS->CurState == 0)
@@ -1667,7 +1755,8 @@ SetVelocityComponents (
EXPLOSION_LIFE EXPLOSION_LIFE
* (LONIBBLE (ExplosionElementPtr->turn_wait) + 1); * (LONIBBLE (ExplosionElementPtr->turn_wait) + 1);
SetPrimType (&DisplayArray[ExplosionElementPtr->PrimIndex], STAMP_PRIM); SetPrimType (&DisplayArray[ExplosionElementPtr->PrimIndex],
STAMP_PRIM);
DisplayArray[ExplosionElementPtr->PrimIndex].Object.Stamp.frame = DisplayArray[ExplosionElementPtr->PrimIndex].Object.Stamp.frame =
SetAbsFrameIndex (LanderFrame[0], 46); SetAbsFrameIndex (LanderFrame[0], 46);
@@ -1689,164 +1778,105 @@ SetVelocityComponents (
ScrollPlanetSide (0, 0, -1); ScrollPlanetSide (0, 0, -1);
} }
}
else else
{ {
SIZE dx, dy; SIZE dx, dy;
if (HIBYTE (pMS->delta_item) == 0) if (HIBYTE (pMS->delta_item) == 0)
dx = dy = 0; {
dx = 0;
dy = 0;
}
else else
{ {
index = GetFrameIndex (LanderFrame[0]); SIZE index = GetFrameIndex (LanderFrame[0]);
if (LONIBBLE (pMS->CurState)) if (LONIBBLE (pMS->CurState))
pMS->CurState -= MAKE_BYTE (1, 0); pMS->CurState -= MAKE_BYTE (1, 0);
else if (CurrentInputState.key[PlayerControls[0]][KEY_LEFT] || else if (CurrentInputState.key[PlayerControls[0]][KEY_LEFT] ||
CurrentInputState.key[PlayerControls[0]][KEY_RIGHT]) CurrentInputState.key[PlayerControls[0]][KEY_RIGHT])
{ {
COUNT landerSpeedNumer;
COUNT angle;
if (CurrentInputState.key[PlayerControls[0]][KEY_LEFT]) if (CurrentInputState.key[PlayerControls[0]][KEY_LEFT])
{
dx = -1;
--index; --index;
}
else else
{
dx = +1;
++index; ++index;
}
index = NORMALIZE_FACING (index); index = NORMALIZE_FACING (index);
LanderFrame[0] = SetAbsFrameIndex (LanderFrame[0], index); LanderFrame[0] = SetAbsFrameIndex (LanderFrame[0], index);
dx = FACING_TO_ANGLE (index); angle = FACING_TO_ANGLE (index);
if (!GET_GAME_STATE (IMPROVED_LANDER_SPEED)) landerSpeedNumer = GET_GAME_STATE (IMPROVED_LANDER_SPEED) ?
SetVelocityComponents ( WORLD_TO_VELOCITY (2 * 14) :
&GLOBAL (velocity), WORLD_TO_VELOCITY (2 * 8);
COSINE (dx, WORLD_TO_VELOCITY (2 * 8)) / LANDER_SPEED_DENOM,
SINE (dx, WORLD_TO_VELOCITY (2 * 8)) / LANDER_SPEED_DENOM
);
else
SetVelocityComponents (
&GLOBAL (velocity),
COSINE (dx, WORLD_TO_VELOCITY (2 * 14)) / LANDER_SPEED_DENOM,
SINE (dx, WORLD_TO_VELOCITY (2 * 14)) / LANDER_SPEED_DENOM
);
#ifdef FAST_FAST #ifdef FAST_FAST
SetVelocityComponents ( landerSpeedNumer = WORLD_TO_VELOCITY (48);
&GLOBAL (velocity),
COSINE (dx, WORLD_TO_VELOCITY (48)) / LANDER_SPEED_DENOM,
SINE (dx, WORLD_TO_VELOCITY (48)) / LANDER_SPEED_DENOM
);
#endif #endif
SetVelocityComponents (&GLOBAL (velocity),
COSINE (angle, landerSpeedNumer) / LANDER_SPEED_DENOM,
SINE (angle, landerSpeedNumer) / LANDER_SPEED_DENOM);
pMS->CurState = MAKE_BYTE ( pMS->CurState = MAKE_BYTE (
SHUTTLE_TURN_WAIT, HINIBBLE (pMS->CurState) SHUTTLE_TURN_WAIT, HINIBBLE (pMS->CurState));
);
} }
if (!CurrentInputState.key[PlayerControls[0]][KEY_UP]) if (!CurrentInputState.key[PlayerControls[0]][KEY_UP])
dx = dy = 0; {
dx = 0;
dy = 0;
}
else else
GetNextVelocityComponents ( GetNextVelocityComponents (&GLOBAL (velocity), &dx, &dy, 1);
&GLOBAL (velocity), &dx, &dy, 1
);
if (HINIBBLE (pMS->CurState)) if (HINIBBLE (pMS->CurState))
pMS->CurState -= MAKE_BYTE (0, 1); pMS->CurState -= MAKE_BYTE (0, 1);
else if (CurrentInputState.key[PlayerControls[0]][KEY_WEAPON]) else if (CurrentInputState.key[PlayerControls[0]][KEY_WEAPON])
{ {
HELEMENT hWeaponElement; LanderFire (pMS, index);
hWeaponElement = AllocElement ();
if (hWeaponElement)
{
SIZE wdx, wdy;
ELEMENT *WeaponElementPtr;
LockElement (hWeaponElement, &WeaponElementPtr);
WeaponElementPtr->playerNr = PS_HUMAN_PLAYER;
WeaponElementPtr->mass_points = 1;
WeaponElementPtr->life_span = 12;
WeaponElementPtr->state_flags = FINITE_LIFE;
WeaponElementPtr->next.location =
pSolarSysState->MenuState.first_item;
WeaponElementPtr->current.location.x =
WeaponElementPtr->next.location.x >> MAG_SHIFT;
WeaponElementPtr->current.location.y =
WeaponElementPtr->next.location.y >> MAG_SHIFT;
SetPrimType (&DisplayArray[WeaponElementPtr->PrimIndex], STAMP_PRIM);
DisplayArray[WeaponElementPtr->PrimIndex].Object.Stamp.frame =
SetAbsFrameIndex (
LanderFrame[0],
index + ANGLE_TO_FACING (FULL_CIRCLE)
);
if (!CurrentInputState.key[PlayerControls[0]][KEY_UP])
wdx = wdy = 0;
else
GetCurrentVelocityComponents (
&GLOBAL (velocity), &wdx, &wdy
);
index = FACING_TO_ANGLE (index);
SetVelocityComponents (
&WeaponElementPtr->velocity,
COSINE (index, WORLD_TO_VELOCITY (2 * 3)) + wdx,
SINE (index, WORLD_TO_VELOCITY (2 * 3)) + wdy
);
UnlockElement (hWeaponElement);
InsertElement (hWeaponElement, GetHeadElement ());
PlaySound (SetAbsSoundIndex (
LanderSounds, LANDER_SHOOTS
), NotPositional (), NULL, GAME_SOUND_PRIORITY);
wdx = SHUTTLE_FIRE_WAIT;
if (GET_GAME_STATE (IMPROVED_LANDER_SHOT))
wdx >>= 1;
pMS->CurState = MAKE_BYTE (LONIBBLE (pMS->CurState), wdx);
}
} }
} }
ScrollPlanetSide (dx, dy, -1); ScrollPlanetSide (dx, dy, -1);
} }
return (TRUE); return TRUE;
} }
void void
FreeLanderData (void) FreeLanderData (void)
{ {
if (LanderFrame[0])
{
COUNT i; COUNT i;
COUNT landerFrameCount;
if (LanderFrame[0] == NULL)
return;
for (i = 0; i < NUM_ORBIT_THEMES; ++i) for (i = 0; i < NUM_ORBIT_THEMES; ++i)
{ {
DestroyMusic (OrbitMusic[i]); DestroyMusic (OrbitMusic[i]);
OrbitMusic[i] = 0; OrbitMusic[i] = 0;
} }
DestroySound (ReleaseSound (LanderSounds)); DestroySound (ReleaseSound (LanderSounds));
LanderSounds = 0; LanderSounds = 0;
for (i = 0; i < sizeof (LanderFrame) landerFrameCount = sizeof (LanderFrame) / sizeof (LanderFrame[0]);
/ sizeof (LanderFrame[0]); ++i) for (i = 0; i < landerFrameCount; ++i)
{ {
DestroyDrawable (ReleaseDrawable (LanderFrame[i])); DestroyDrawable (ReleaseDrawable (LanderFrame[i]));
LanderFrame[i] = 0; LanderFrame[i] = 0;
} }
}
} }
void void
LoadLanderData (void) LoadLanderData (void)
{ {
if (LanderFrame[0] == 0) if (LanderFrame[0] != 0)
{ return;
LanderFrame[0] = LanderFrame[0] =
CaptureDrawable (LoadGraphic (LANDER_MASK_PMAP_ANIM)); CaptureDrawable (LoadGraphic (LANDER_MASK_PMAP_ANIM));
LanderFrame[1] = LanderFrame[1] =
@@ -1855,23 +1885,23 @@ LoadLanderData (void)
CaptureDrawable (LoadGraphic (LIGHTNING_MASK_ANIM)); CaptureDrawable (LoadGraphic (LIGHTNING_MASK_ANIM));
LanderFrame[3] = LanderFrame[3] =
CaptureDrawable (LoadGraphic (LAVA_MASK_PMAP_ANIM)); CaptureDrawable (LoadGraphic (LAVA_MASK_PMAP_ANIM));
LanderFrame[4] = CaptureDrawable (LoadGraphic (LANDER_SHIELD_MASK_ANIM)); LanderFrame[4] =
CaptureDrawable (LoadGraphic (LANDER_SHIELD_MASK_ANIM));
LanderFrame[5] = LanderFrame[5] =
CaptureDrawable (LoadGraphic (LANDER_LAUNCH_MASK_PMAP_ANIM)); CaptureDrawable (LoadGraphic (LANDER_LAUNCH_MASK_PMAP_ANIM));
LanderFrame[6] = LanderFrame[6] =
CaptureDrawable (LoadGraphic (LANDER_RETURN_MASK_PMAP_ANIM)); CaptureDrawable (LoadGraphic (LANDER_RETURN_MASK_PMAP_ANIM));
LanderSounds = CaptureSound (LoadSound (LANDER_SOUNDS));
LanderFrame[7] = LanderFrame[7] =
CaptureDrawable (LoadGraphic (ORBIT_VIEW_ANIM)); CaptureDrawable (LoadGraphic (ORBIT_VIEW_ANIM));
LanderSounds = CaptureSound (LoadSound (LANDER_SOUNDS));
{ {
COUNT i; COUNT i;
for (i = 0; i < NUM_ORBIT_THEMES; ++i) for (i = 0; i < NUM_ORBIT_THEMES; ++i)
OrbitMusic[i] = load_orbit_theme (i); OrbitMusic[i] = load_orbit_theme (i);
} }
}
} }
void void
@@ -1910,6 +1940,7 @@ PlanetSide (MENU_STATE *pMS)
{ {
SIZE index; SIZE index;
DWORD TimeIn; DWORD TimeIn;
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};
BYTE WeatherChanceTab[] = {0*3, 0*3, 1*3, 2*3, 3*3, 6*3, 12*3, 24*3}; BYTE WeatherChanceTab[] = {0*3, 0*3, 1*3, 2*3, 3*3, 6*3, 12*3, 24*3};
@@ -1959,7 +1990,10 @@ PlanetSide (MENU_STATE *pMS)
PSD.ColorCycle[2] = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x11, 0x00), 0x7B); PSD.ColorCycle[2] = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x11, 0x00), 0x7B);
PSD.ColorCycle[3] = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x00), 0x71); PSD.ColorCycle[3] = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x00), 0x71);
for (index = 4; index < (NUM_TEXT_FRAMES >> 1) - 4; ++index) for (index = 4; index < (NUM_TEXT_FRAMES >> 1) - 4; ++index)
PSD.ColorCycle[index] = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F); {
PSD.ColorCycle[index] =
BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F);
}
PSD.ColorCycle[(NUM_TEXT_FRAMES >> 1) - 4] = PSD.ColorCycle[(NUM_TEXT_FRAMES >> 1) - 4] =
BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x00), 0x71); BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x00), 0x71);
PSD.ColorCycle[(NUM_TEXT_FRAMES >> 1) - 3] = PSD.ColorCycle[(NUM_TEXT_FRAMES >> 1) - 3] =
@@ -1968,13 +2002,15 @@ PlanetSide (MENU_STATE *pMS)
BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0A, 0x00), 0x7D); BUILD_COLOR (MAKE_RGB15 (0x1F, 0x0A, 0x00), 0x7D);
PSD.ColorCycle[(NUM_TEXT_FRAMES >> 1) - 1] = PSD.ColorCycle[(NUM_TEXT_FRAMES >> 1) - 1] =
BUILD_COLOR (MAKE_RGB15 (0x1F, 0x03, 0x00), 0x7F); BUILD_COLOR (MAKE_RGB15 (0x1F, 0x03, 0x00), 0x7F);
pMS->ModuleFrame = (FRAME)&PSD; landerInputState.planetSideDesc = &PSD;
// ScrollPlanetSide depends on this. Not just DoPlanetSide().
pLanderInputState = &landerInputState;
landerInputState.scanInputState = pMS;
index = NORMALIZE_FACING ((COUNT)TFB_Random ()); index = NORMALIZE_FACING ((COUNT)TFB_Random ());
LanderFrame[0] = SetAbsFrameIndex ( LanderFrame[0] = SetAbsFrameIndex (LanderFrame[0], index);
LanderFrame[0], index landerInputState.delta_item = 0;
);
pMS->delta_item = 0;
pSolarSysState->MenuState.Initialized += 4; pSolarSysState->MenuState.Initialized += 4;
InitPlanetSide (); InitPlanetSide ();
@@ -2000,10 +2036,10 @@ PlanetSide (MENU_STATE *pMS)
pSolarSysState->MenuState.flash_rect1.corner.x = LOWORD (TimeIn); pSolarSysState->MenuState.flash_rect1.corner.x = LOWORD (TimeIn);
pSolarSysState->MenuState.flash_rect1.corner.y = HIWORD (TimeIn); pSolarSysState->MenuState.flash_rect1.corner.y = HIWORD (TimeIn);
pMS->Initialized = FALSE; landerInputState.Initialized = FALSE;
pMS->InputFunc = DoPlanetSide; landerInputState.InputFunc = DoPlanetSide;
SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE); SetMenuSounds (MENU_SOUND_NONE, MENU_SOUND_NONE);
DoInput (pMS, FALSE); DoInput (&landerInputState, FALSE);
if (!(GLOBAL (CurrentActivity) & CHECK_ABORT)) if (!(GLOBAL (CurrentActivity) & CHECK_ABORT))
{ {
@@ -2011,7 +2047,7 @@ PlanetSide (MENU_STATE *pMS)
RECT r; RECT r;
//CONTEXT OldContext; //CONTEXT OldContext;
crew_left = HIBYTE (pMS->delta_item); crew_left = HIBYTE (landerInputState.delta_item);
r.corner.x = SIS_ORG_X; r.corner.x = SIS_ORG_X;
r.corner.y = SIS_ORG_Y; r.corner.y = SIS_ORG_Y;
@@ -2083,7 +2119,7 @@ PlanetSide (MENU_STATE *pMS)
} }
} }
pMS->ModuleFrame = 0; landerInputState.planetSideDesc = NULL;
{ {
HELEMENT hElement, hNextElement; HELEMENT hElement, hNextElement;
+6 -3
View File
@@ -37,8 +37,9 @@ typedef struct
SOUND OldMenuSounds; SOUND OldMenuSounds;
COUNT ElementLevel, MaxElementLevel, COUNT ElementLevel;
BiologicalLevel; COUNT MaxElementLevel;
COUNT BiologicalLevel;
COUNT ElementAmounts[NUM_ELEMENT_CATEGORIES]; COUNT ElementAmounts[NUM_ELEMENT_CATEGORIES];
COUNT NumFrames; COUNT NumFrames;
@@ -47,7 +48,9 @@ typedef struct
COLOR ColorCycle[NUM_TEXT_FRAMES >> 1]; COLOR ColorCycle[NUM_TEXT_FRAMES >> 1];
BYTE TectonicsChance, WeatherChance, FireChance; BYTE TectonicsChance;
BYTE WeatherChance;
BYTE FireChance;
} PLANETSIDE_DESC; } PLANETSIDE_DESC;
extern CONTEXT ScanContext; extern CONTEXT ScanContext;
+1 -2
View File
@@ -670,8 +670,7 @@ PickPlanetSide (MENU_STATE *pMS)
COUNT fuel_required; COUNT fuel_required;
fuel_required = (COUNT)( fuel_required = (COUNT)(
pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity << 1 pSolarSysState->SysInfo.PlanetInfo.SurfaceGravity << 1);
);
if (fuel_required > 3 * FUEL_TANK_SCALE) if (fuel_required > 3 * FUEL_TANK_SCALE)
fuel_required = 3 * FUEL_TANK_SCALE; fuel_required = 3 * FUEL_TANK_SCALE;