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:
avolkov
2007-07-10 20:05:34 +00:00
parent 2153b304e2
commit a46b263929
4 changed files with 57 additions and 30 deletions
+24 -11
View File
@@ -122,12 +122,31 @@ struct element
void (*death_func) (struct element *ElementPtr); void (*death_func) (struct element *ElementPtr);
ELEMENT_FLAGS state_flags; ELEMENT_FLAGS state_flags;
COUNT life_span; union
COUNT crew_level; {
BYTE mass_points; COUNT life_span;
/* Also: system loc for IP flagship */ 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 turn_wait;
BYTE thrust_wait; union
{
BYTE thrust_wait;
BYTE blast_offset;
BYTE next_turn; /* Battle: animation interframe for some elements */
};
VELOCITY_DESC velocity; VELOCITY_DESC velocity;
INTERSECT_CONTROL IntersectControl; INTERSECT_CONTROL IntersectControl;
COUNT PrimIndex; COUNT PrimIndex;
@@ -150,12 +169,6 @@ extern PRIMITIVE DisplayArray[MAX_DISPLAY_PRIMS];
#define GetElementStarShip(e,ppsd) do { *(ppsd) = (e)->pParent; } while (0) #define GetElementStarShip(e,ppsd) do { *(ppsd) = (e)->pParent; } while (0)
#define SetElementStarShip(e,psd) do { (e)->pParent = psd; } 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_CREW_SIZE 42
#define MAX_ENERGY_SIZE 42 #define MAX_ENERGY_SIZE 42
#define MAX_SHIP_MASS 10 #define MAX_SHIP_MASS 10
+5 -5
View File
@@ -583,7 +583,7 @@ spawn_ip_group (IP_GROUP *GroupPtr)
LockElement (hIPSHIPElement, &IPSHIPElementPtr); LockElement (hIPSHIPElement, &IPSHIPElementPtr);
// XXX: turn_wait hack is not actually used anywhere // XXX: turn_wait hack is not actually used anywhere
//IPSHIPElementPtr->turn_wait = GroupPtr->group_id; //IPSHIPElementPtr->turn_wait = GroupPtr->group_id;
IPSHIPElementPtr->mass_points = 1; IPSHIPElementPtr->sys_loc = 1;
IPSHIPElementPtr->hit_points = 1; IPSHIPElementPtr->hit_points = 1;
IPSHIPElementPtr->state_flags = IPSHIPElementPtr->state_flags =
CHANGING | FINITE_LIFE | IGNORE_VELOCITY; CHANGING | FINITE_LIFE | IGNORE_VELOCITY;
@@ -745,7 +745,7 @@ flag_ship_preprocess (ELEMENT *ElementPtr)
GLOBAL (ShipStamp.origin) = pt; GLOBAL (ShipStamp.origin) = pt;
ElementPtr->next.image.frame = GLOBAL (ShipStamp.frame); ElementPtr->next.image.frame = GLOBAL (ShipStamp.frame);
if (ElementPtr->mass_points == flagship_loc) if (ElementPtr->sys_loc == flagship_loc)
{ {
if (ElementPtr->state_flags & NONSOLID) if (ElementPtr->state_flags & NONSOLID)
ElementPtr->state_flags &= ~NONSOLID; ElementPtr->state_flags &= ~NONSOLID;
@@ -753,7 +753,7 @@ flag_ship_preprocess (ELEMENT *ElementPtr)
else /* no collisions during transition */ else /* no collisions during transition */
{ {
ElementPtr->state_flags |= NONSOLID; ElementPtr->state_flags |= NONSOLID;
ElementPtr->mass_points = flagship_loc; ElementPtr->sys_loc = flagship_loc;
} }
if ((ec = GET_GAME_STATE (ESCAPE_COUNTER)) if ((ec = GET_GAME_STATE (ESCAPE_COUNTER))
@@ -782,9 +782,9 @@ spawn_flag_ship (void)
LockElement (hFlagShipElement, &FlagShipElementPtr); LockElement (hFlagShipElement, &FlagShipElementPtr);
FlagShipElementPtr->hit_points = 1; FlagShipElementPtr->hit_points = 1;
if (pSolarSysState->pBaseDesc == pSolarSysState->PlanetDesc) if (pSolarSysState->pBaseDesc == pSolarSysState->PlanetDesc)
FlagShipElementPtr->mass_points = 1; FlagShipElementPtr->sys_loc = 1;
else else
FlagShipElementPtr->mass_points = FlagShipElementPtr->sys_loc =
(BYTE)(pSolarSysState->pBaseDesc->pPrevDesc (BYTE)(pSolarSysState->pBaseDesc->pPrevDesc
- pSolarSysState->PlanetDesc + 2); - pSolarSysState->PlanetDesc + 2);
FlagShipElementPtr->state_flags = FlagShipElementPtr->state_flags =
+26 -12
View File
@@ -254,6 +254,7 @@ object_animation (ELEMENT *ElementPtr)
IncFrameIndex (pPrim->Object.Stamp.frame); IncFrameIndex (pPrim->Object.Stamp.frame);
if (ElementPtr->state_flags & FINITE_LIFE) if (ElementPtr->state_flags & FINITE_LIFE)
{ {
/* A natural disaster */
if (ElementPtr->mass_points == DEATH_EXPLOSION) if (ElementPtr->mass_points == DEATH_EXPLOSION)
{ {
if (++pMenuState->CurState >= EXPLOSION_LIFE) if (++pMenuState->CurState >= EXPLOSION_LIFE)
@@ -268,6 +269,7 @@ object_animation (ELEMENT *ElementPtr)
s = 0; s = 0;
else else
s = (14 - frame_index) >> 1; s = (14 - frame_index) >> 1;
// XXX: Was 0x8000 the background flag on 3DO?
SetPrimColor (pPrim, BUILD_COLOR (0x8000 | MAKE_RGB15 (0x1F, 0x1F, 0x1F), s)); SetPrimColor (pPrim, BUILD_COLOR (0x8000 | MAKE_RGB15 (0x1F, 0x1F, 0x1F), s));
if (frame_index == 13) if (frame_index == 13)
PlaySound (SetAbsSoundIndex (LanderSounds, EARTHQUAKE_DISASTER), PlaySound (SetAbsSoundIndex (LanderSounds, EARTHQUAKE_DISASTER),
@@ -280,12 +282,13 @@ object_animation (ELEMENT *ElementPtr)
{ {
HELEMENT hLavaElement; HELEMENT hLavaElement;
/* Change lava-spot direction of travel */
hLavaElement = AddGroundDisaster (LAVASPOT_DISASTER); hLavaElement = AddGroundDisaster (LAVASPOT_DISASTER);
if (hLavaElement) if (hLavaElement)
{ {
ELEMENT *LavaElementPtr; ELEMENT *LavaElementPtr;
angle = FACING_TO_ANGLE (ElementPtr->hit_points); angle = FACING_TO_ANGLE (ElementPtr->facing);
LockElement (hLavaElement, &LavaElementPtr); LockElement (hLavaElement, &LavaElementPtr);
LavaElementPtr->next.location = ElementPtr->next.location; LavaElementPtr->next.location = ElementPtr->next.location;
LavaElementPtr->next.location.x += COSINE (angle, 4); LavaElementPtr->next.location.x += COSINE (angle, 4);
@@ -298,9 +301,8 @@ object_animation (ELEMENT *ElementPtr)
LavaElementPtr->next.location.x += MAP_WIDTH << MAG_SHIFT; LavaElementPtr->next.location.x += MAP_WIDTH << MAG_SHIFT;
else else
LavaElementPtr->next.location.x %= MAP_WIDTH << MAG_SHIFT; LavaElementPtr->next.location.x %= MAP_WIDTH << MAG_SHIFT;
LavaElementPtr->hit_points = NORMALIZE_FACING ( LavaElementPtr->facing = NORMALIZE_FACING (
ElementPtr->hit_points + ((COUNT)TFB_Random () % 3) - 1 ElementPtr->facing + ((COUNT)TFB_Random () % 3) - 1);
);
UnlockElement (hLavaElement); UnlockElement (hLavaElement);
} }
} }
@@ -600,9 +602,10 @@ CheckObjectCollision (COUNT index)
COUNT scan, NumRetrieved; COUNT scan, NumRetrieved;
SIZE which_node; SIZE which_node;
scan = LOBYTE (ElementPtr->life_span); scan = LOBYTE (ElementPtr->scan_node);
if (pLanderPrim == 0) if (pLanderPrim == 0)
{ {
/* Collision of lander with another object */
if (HIBYTE (pMenuState->delta_item) == 0 if (HIBYTE (pMenuState->delta_item) == 0
|| pPSD->InTransit) || pPSD->InTransit)
break; break;
@@ -685,9 +688,9 @@ CheckObjectCollision (COUNT index)
NumRetrieved = ElementPtr->mass_points; NumRetrieved = ElementPtr->mass_points;
} }
/* if a natural disaster */
else if (ElementPtr->state_flags & FINITE_LIFE) else if (ElementPtr->state_flags & FINITE_LIFE)
{ {
/* Collision of a stun bolt with a natural disaster */
UnlockElement (hElement); UnlockElement (hElement);
continue; continue;
} }
@@ -697,6 +700,7 @@ CheckObjectCollision (COUNT index)
if (scan == ENERGY_SCAN) if (scan == ENERGY_SCAN)
{ {
/* Collision of a stun bolt with an energy node */
UnlockElement (hElement); UnlockElement (hElement);
break; break;
} }
@@ -706,6 +710,7 @@ CheckObjectCollision (COUNT index)
& ~CREATURE_AWARE & ~CREATURE_AWARE
].ValueAndHitPoints))) ].ValueAndHitPoints)))
{ {
/* Collision of a stun bolt with a viable creature */
if (ElementPtr->hit_points) if (ElementPtr->hit_points)
{ {
if (--ElementPtr->hit_points == 0) 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] |= pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[scan] |=
(1L << which_node); (1L << which_node);
pSolarSysState->CurNode = (COUNT)~0; pSolarSysState->CurNode = (COUNT)~0;
@@ -878,19 +883,28 @@ lightning_process (ELEMENT *ElementPtr)
num_frames = GetFrameCount (pPrim->Object.Stamp.frame) - 7; num_frames = GetFrameCount (pPrim->Object.Stamp.frame) - 7;
if (GetFrameIndex (pPrim->Object.Stamp.frame) >= num_frames) 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 = pPrim->Object.Stamp.frame =
IncFrameIndex (pPrim->Object.Stamp.frame); IncFrameIndex (pPrim->Object.Stamp.frame);
}
else else
{ {
SIZE s; 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) if (s < 0)
s = 0; s = 0;
// XXX: Was 0x8000 the background flag on 3DO?
SetPrimColor (pPrim, BUILD_COLOR (0x8000 | MAKE_RGB15 (0x1F, 0x1F, 0x1F), s)); SetPrimColor (pPrim, BUILD_COLOR (0x8000 | MAKE_RGB15 (0x1F, 0x1F, 0x1F), s));
if (ElementPtr->mass_points == LIGHTNING_DISASTER) if (ElementPtr->mass_points == LIGHTNING_DISASTER)
{ {
/* This one always strikes the lander and can hurt */
if (HIBYTE (pMenuState->delta_item) if (HIBYTE (pMenuState->delta_item)
&& (BYTE)TFB_Random () < (256 / 10) && (BYTE)TFB_Random () < (256 / 10)
&& !( && !(
@@ -930,7 +944,7 @@ AddLightning (void)
LightningElementPtr->state_flags = FINITE_LIFE | BAD_GUY; LightningElementPtr->state_flags = FINITE_LIFE | BAD_GUY;
LightningElementPtr->preprocess_func = lightning_process; LightningElementPtr->preprocess_func = lightning_process;
if ((BYTE)TFB_Random () >= (256 >> 2)) if ((BYTE)TFB_Random () >= (256 >> 2))
LightningElementPtr->mass_points = 0; LightningElementPtr->mass_points = 0; /* harmless */
else else
LightningElementPtr->mass_points = LIGHTNING_DISASTER; LightningElementPtr->mass_points = LIGHTNING_DISASTER;
@@ -947,7 +961,7 @@ AddLightning (void)
+ (HIBYTE (rand_val) % (SURFACE_HEIGHT - 12)) + (HIBYTE (rand_val) % (SURFACE_HEIGHT - 12))
) % (MAP_HEIGHT << MAG_SHIFT); ) % (MAP_HEIGHT << MAG_SHIFT);
LightningElementPtr->crew_level = LightningElementPtr->life_span; LightningElementPtr->cycle = LightningElementPtr->life_span;
SetPrimType (&DisplayArray[LightningElementPtr->PrimIndex], STAMPFILL_PRIM); SetPrimType (&DisplayArray[LightningElementPtr->PrimIndex], STAMPFILL_PRIM);
SetPrimColor (&DisplayArray[LightningElementPtr->PrimIndex], WHITE_COLOR); SetPrimColor (&DisplayArray[LightningElementPtr->PrimIndex], WHITE_COLOR);
@@ -1001,10 +1015,10 @@ AddGroundDisaster (COUNT which_disaster)
pPrim->Object.Stamp.frame = LanderFrame[1]; pPrim->Object.Stamp.frame = LanderFrame[1];
GroundDisasterElementPtr->turn_wait = MAKE_BYTE (2, 2); GroundDisasterElementPtr->turn_wait = MAKE_BYTE (2, 2);
} }
else else /* if (which_disaster == LAVASPOT_DISASTER) */
{ {
SetPrimType (pPrim, STAMP_PRIM); SetPrimType (pPrim, STAMP_PRIM);
GroundDisasterElementPtr->hit_points = GroundDisasterElementPtr->facing =
NORMALIZE_FACING (TFB_Random ()); NORMALIZE_FACING (TFB_Random ());
pPrim->Object.Stamp.frame = LanderFrame[3]; pPrim->Object.Stamp.frame = LanderFrame[3];
GroundDisasterElementPtr->turn_wait = MAKE_BYTE (0, 0); GroundDisasterElementPtr->turn_wait = MAKE_BYTE (0, 0);
+2 -2
View File
@@ -875,7 +875,7 @@ DrawScannedStuff (COUNT y, BYTE CurState)
hNextElement = GetSuccElement (ElementPtr); hNextElement = GetSuccElement (ElementPtr);
dy = y - ElementPtr->current.location.y; dy = y - ElementPtr->current.location.y;
if (LOBYTE (ElementPtr->life_span) == CurState if (LOBYTE (ElementPtr->scan_node) == CurState
&& dy >= 0)// && dy <= 3) && dy >= 0)// && dy <= 3)
{ {
COUNT i; COUNT i;
@@ -1310,7 +1310,7 @@ GeneratePlanetSide (void)
pSolarSysState->CurNode = num_nodes; pSolarSysState->CurNode = num_nodes;
(*pSolarSysState->GenFunc) ((BYTE)(scan + GENERATE_MINERAL)); (*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->state_flags = BAD_GUY;
NodeElementPtr->current.location.x = NodeElementPtr->current.location.x =
pSolarSysState->SysInfo.PlanetInfo.CurPt.x; pSolarSysState->SysInfo.PlanetInfo.CurPt.x;