Basic cleanup of ELEMENT fields abuse (more needed); some comments
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2802 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
+24
-11
@@ -122,12 +122,31 @@ struct element
|
||||
void (*death_func) (struct element *ElementPtr);
|
||||
|
||||
ELEMENT_FLAGS state_flags;
|
||||
COUNT life_span;
|
||||
COUNT crew_level;
|
||||
BYTE mass_points;
|
||||
/* Also: system loc for IP flagship */
|
||||
union
|
||||
{
|
||||
COUNT life_span;
|
||||
COUNT scan_node; /* Planetside: scan type and node id */
|
||||
};
|
||||
union
|
||||
{
|
||||
COUNT crew_level;
|
||||
COUNT hit_points;
|
||||
COUNT facing; /* Planetside: lava-spot direction of travel */
|
||||
COUNT cycle; /* Planetside: lightning cycle length */
|
||||
};
|
||||
union
|
||||
{
|
||||
BYTE mass_points;
|
||||
BYTE sys_loc; /* IP: location in system */
|
||||
};
|
||||
BYTE turn_wait;
|
||||
BYTE thrust_wait;
|
||||
union
|
||||
{
|
||||
BYTE thrust_wait;
|
||||
BYTE blast_offset;
|
||||
BYTE next_turn; /* Battle: animation interframe for some elements */
|
||||
};
|
||||
|
||||
VELOCITY_DESC velocity;
|
||||
INTERSECT_CONTROL IntersectControl;
|
||||
COUNT PrimIndex;
|
||||
@@ -150,12 +169,6 @@ extern PRIMITIVE DisplayArray[MAX_DISPLAY_PRIMS];
|
||||
#define GetElementStarShip(e,ppsd) do { *(ppsd) = (e)->pParent; } while (0)
|
||||
#define SetElementStarShip(e,psd) do { (e)->pParent = psd; } while (0)
|
||||
|
||||
// XXX: Would be nice to clean these up!
|
||||
// Should make them into a union for now.
|
||||
#define blast_offset thrust_wait
|
||||
#define hit_points crew_level
|
||||
#define next_turn thrust_wait
|
||||
|
||||
#define MAX_CREW_SIZE 42
|
||||
#define MAX_ENERGY_SIZE 42
|
||||
#define MAX_SHIP_MASS 10
|
||||
|
||||
@@ -583,7 +583,7 @@ spawn_ip_group (IP_GROUP *GroupPtr)
|
||||
LockElement (hIPSHIPElement, &IPSHIPElementPtr);
|
||||
// XXX: turn_wait hack is not actually used anywhere
|
||||
//IPSHIPElementPtr->turn_wait = GroupPtr->group_id;
|
||||
IPSHIPElementPtr->mass_points = 1;
|
||||
IPSHIPElementPtr->sys_loc = 1;
|
||||
IPSHIPElementPtr->hit_points = 1;
|
||||
IPSHIPElementPtr->state_flags =
|
||||
CHANGING | FINITE_LIFE | IGNORE_VELOCITY;
|
||||
@@ -745,7 +745,7 @@ flag_ship_preprocess (ELEMENT *ElementPtr)
|
||||
GLOBAL (ShipStamp.origin) = pt;
|
||||
ElementPtr->next.image.frame = GLOBAL (ShipStamp.frame);
|
||||
|
||||
if (ElementPtr->mass_points == flagship_loc)
|
||||
if (ElementPtr->sys_loc == flagship_loc)
|
||||
{
|
||||
if (ElementPtr->state_flags & NONSOLID)
|
||||
ElementPtr->state_flags &= ~NONSOLID;
|
||||
@@ -753,7 +753,7 @@ flag_ship_preprocess (ELEMENT *ElementPtr)
|
||||
else /* no collisions during transition */
|
||||
{
|
||||
ElementPtr->state_flags |= NONSOLID;
|
||||
ElementPtr->mass_points = flagship_loc;
|
||||
ElementPtr->sys_loc = flagship_loc;
|
||||
}
|
||||
|
||||
if ((ec = GET_GAME_STATE (ESCAPE_COUNTER))
|
||||
@@ -782,9 +782,9 @@ spawn_flag_ship (void)
|
||||
LockElement (hFlagShipElement, &FlagShipElementPtr);
|
||||
FlagShipElementPtr->hit_points = 1;
|
||||
if (pSolarSysState->pBaseDesc == pSolarSysState->PlanetDesc)
|
||||
FlagShipElementPtr->mass_points = 1;
|
||||
FlagShipElementPtr->sys_loc = 1;
|
||||
else
|
||||
FlagShipElementPtr->mass_points =
|
||||
FlagShipElementPtr->sys_loc =
|
||||
(BYTE)(pSolarSysState->pBaseDesc->pPrevDesc
|
||||
- pSolarSysState->PlanetDesc + 2);
|
||||
FlagShipElementPtr->state_flags =
|
||||
|
||||
@@ -254,6 +254,7 @@ object_animation (ELEMENT *ElementPtr)
|
||||
IncFrameIndex (pPrim->Object.Stamp.frame);
|
||||
if (ElementPtr->state_flags & FINITE_LIFE)
|
||||
{
|
||||
/* A natural disaster */
|
||||
if (ElementPtr->mass_points == DEATH_EXPLOSION)
|
||||
{
|
||||
if (++pMenuState->CurState >= EXPLOSION_LIFE)
|
||||
@@ -268,6 +269,7 @@ object_animation (ELEMENT *ElementPtr)
|
||||
s = 0;
|
||||
else
|
||||
s = (14 - frame_index) >> 1;
|
||||
// XXX: Was 0x8000 the background flag on 3DO?
|
||||
SetPrimColor (pPrim, BUILD_COLOR (0x8000 | MAKE_RGB15 (0x1F, 0x1F, 0x1F), s));
|
||||
if (frame_index == 13)
|
||||
PlaySound (SetAbsSoundIndex (LanderSounds, EARTHQUAKE_DISASTER),
|
||||
@@ -280,12 +282,13 @@ object_animation (ELEMENT *ElementPtr)
|
||||
{
|
||||
HELEMENT hLavaElement;
|
||||
|
||||
/* Change lava-spot direction of travel */
|
||||
hLavaElement = AddGroundDisaster (LAVASPOT_DISASTER);
|
||||
if (hLavaElement)
|
||||
{
|
||||
ELEMENT *LavaElementPtr;
|
||||
|
||||
angle = FACING_TO_ANGLE (ElementPtr->hit_points);
|
||||
angle = FACING_TO_ANGLE (ElementPtr->facing);
|
||||
LockElement (hLavaElement, &LavaElementPtr);
|
||||
LavaElementPtr->next.location = ElementPtr->next.location;
|
||||
LavaElementPtr->next.location.x += COSINE (angle, 4);
|
||||
@@ -298,9 +301,8 @@ object_animation (ELEMENT *ElementPtr)
|
||||
LavaElementPtr->next.location.x += MAP_WIDTH << MAG_SHIFT;
|
||||
else
|
||||
LavaElementPtr->next.location.x %= MAP_WIDTH << MAG_SHIFT;
|
||||
LavaElementPtr->hit_points = NORMALIZE_FACING (
|
||||
ElementPtr->hit_points + ((COUNT)TFB_Random () % 3) - 1
|
||||
);
|
||||
LavaElementPtr->facing = NORMALIZE_FACING (
|
||||
ElementPtr->facing + ((COUNT)TFB_Random () % 3) - 1);
|
||||
UnlockElement (hLavaElement);
|
||||
}
|
||||
}
|
||||
@@ -600,9 +602,10 @@ CheckObjectCollision (COUNT index)
|
||||
COUNT scan, NumRetrieved;
|
||||
SIZE which_node;
|
||||
|
||||
scan = LOBYTE (ElementPtr->life_span);
|
||||
scan = LOBYTE (ElementPtr->scan_node);
|
||||
if (pLanderPrim == 0)
|
||||
{
|
||||
/* Collision of lander with another object */
|
||||
if (HIBYTE (pMenuState->delta_item) == 0
|
||||
|| pPSD->InTransit)
|
||||
break;
|
||||
@@ -685,9 +688,9 @@ CheckObjectCollision (COUNT index)
|
||||
|
||||
NumRetrieved = ElementPtr->mass_points;
|
||||
}
|
||||
/* if a natural disaster */
|
||||
else if (ElementPtr->state_flags & FINITE_LIFE)
|
||||
{
|
||||
/* Collision of a stun bolt with a natural disaster */
|
||||
UnlockElement (hElement);
|
||||
continue;
|
||||
}
|
||||
@@ -697,6 +700,7 @@ CheckObjectCollision (COUNT index)
|
||||
|
||||
if (scan == ENERGY_SCAN)
|
||||
{
|
||||
/* Collision of a stun bolt with an energy node */
|
||||
UnlockElement (hElement);
|
||||
break;
|
||||
}
|
||||
@@ -706,6 +710,7 @@ CheckObjectCollision (COUNT index)
|
||||
& ~CREATURE_AWARE
|
||||
].ValueAndHitPoints)))
|
||||
{
|
||||
/* Collision of a stun bolt with a viable creature */
|
||||
if (ElementPtr->hit_points)
|
||||
{
|
||||
if (--ElementPtr->hit_points == 0)
|
||||
@@ -836,7 +841,7 @@ CheckObjectCollision (COUNT index)
|
||||
}
|
||||
}
|
||||
|
||||
which_node = HIBYTE (ElementPtr->life_span) - 1;
|
||||
which_node = HIBYTE (ElementPtr->scan_node) - 1;
|
||||
pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[scan] |=
|
||||
(1L << which_node);
|
||||
pSolarSysState->CurNode = (COUNT)~0;
|
||||
@@ -878,19 +883,28 @@ lightning_process (ELEMENT *ElementPtr)
|
||||
|
||||
num_frames = GetFrameCount (pPrim->Object.Stamp.frame) - 7;
|
||||
if (GetFrameIndex (pPrim->Object.Stamp.frame) >= num_frames)
|
||||
{
|
||||
/* Advance to the next surface strike effect frame */
|
||||
// XXX: This is unused, we never get here
|
||||
pPrim->Object.Stamp.frame =
|
||||
IncFrameIndex (pPrim->Object.Stamp.frame);
|
||||
}
|
||||
else
|
||||
{
|
||||
SIZE s;
|
||||
|
||||
s = 7 - ((SIZE)ElementPtr->crew_level - (SIZE)ElementPtr->life_span);
|
||||
// XXX: Color cycling is largely unused, because the color
|
||||
// never actually changes RGB values (see MAKE_RGB15 below).
|
||||
// This did, however, work in DOS SC2 version (fade effect).
|
||||
s = 7 - ((SIZE)ElementPtr->cycle - (SIZE)ElementPtr->life_span);
|
||||
if (s < 0)
|
||||
s = 0;
|
||||
// XXX: Was 0x8000 the background flag on 3DO?
|
||||
SetPrimColor (pPrim, BUILD_COLOR (0x8000 | MAKE_RGB15 (0x1F, 0x1F, 0x1F), s));
|
||||
|
||||
if (ElementPtr->mass_points == LIGHTNING_DISASTER)
|
||||
{
|
||||
/* This one always strikes the lander and can hurt */
|
||||
if (HIBYTE (pMenuState->delta_item)
|
||||
&& (BYTE)TFB_Random () < (256 / 10)
|
||||
&& !(
|
||||
@@ -930,7 +944,7 @@ AddLightning (void)
|
||||
LightningElementPtr->state_flags = FINITE_LIFE | BAD_GUY;
|
||||
LightningElementPtr->preprocess_func = lightning_process;
|
||||
if ((BYTE)TFB_Random () >= (256 >> 2))
|
||||
LightningElementPtr->mass_points = 0;
|
||||
LightningElementPtr->mass_points = 0; /* harmless */
|
||||
else
|
||||
LightningElementPtr->mass_points = LIGHTNING_DISASTER;
|
||||
|
||||
@@ -947,7 +961,7 @@ AddLightning (void)
|
||||
+ (HIBYTE (rand_val) % (SURFACE_HEIGHT - 12))
|
||||
) % (MAP_HEIGHT << MAG_SHIFT);
|
||||
|
||||
LightningElementPtr->crew_level = LightningElementPtr->life_span;
|
||||
LightningElementPtr->cycle = LightningElementPtr->life_span;
|
||||
|
||||
SetPrimType (&DisplayArray[LightningElementPtr->PrimIndex], STAMPFILL_PRIM);
|
||||
SetPrimColor (&DisplayArray[LightningElementPtr->PrimIndex], WHITE_COLOR);
|
||||
@@ -1001,10 +1015,10 @@ AddGroundDisaster (COUNT which_disaster)
|
||||
pPrim->Object.Stamp.frame = LanderFrame[1];
|
||||
GroundDisasterElementPtr->turn_wait = MAKE_BYTE (2, 2);
|
||||
}
|
||||
else
|
||||
else /* if (which_disaster == LAVASPOT_DISASTER) */
|
||||
{
|
||||
SetPrimType (pPrim, STAMP_PRIM);
|
||||
GroundDisasterElementPtr->hit_points =
|
||||
GroundDisasterElementPtr->facing =
|
||||
NORMALIZE_FACING (TFB_Random ());
|
||||
pPrim->Object.Stamp.frame = LanderFrame[3];
|
||||
GroundDisasterElementPtr->turn_wait = MAKE_BYTE (0, 0);
|
||||
|
||||
@@ -875,7 +875,7 @@ DrawScannedStuff (COUNT y, BYTE CurState)
|
||||
hNextElement = GetSuccElement (ElementPtr);
|
||||
|
||||
dy = y - ElementPtr->current.location.y;
|
||||
if (LOBYTE (ElementPtr->life_span) == CurState
|
||||
if (LOBYTE (ElementPtr->scan_node) == CurState
|
||||
&& dy >= 0)// && dy <= 3)
|
||||
{
|
||||
COUNT i;
|
||||
@@ -1310,7 +1310,7 @@ GeneratePlanetSide (void)
|
||||
pSolarSysState->CurNode = num_nodes;
|
||||
(*pSolarSysState->GenFunc) ((BYTE)(scan + GENERATE_MINERAL));
|
||||
|
||||
NodeElementPtr->life_span = MAKE_WORD (scan, num_nodes + 1);
|
||||
NodeElementPtr->scan_node = MAKE_WORD (scan, num_nodes + 1);
|
||||
NodeElementPtr->state_flags = BAD_GUY;
|
||||
NodeElementPtr->current.location.x =
|
||||
pSolarSysState->SysInfo.PlanetInfo.CurPt.x;
|
||||
|
||||
Reference in New Issue
Block a user