From a46b2639295f27f5dd6125f3c903e70698736b38 Mon Sep 17 00:00:00 2001 From: avolkov Date: Tue, 10 Jul 2007 20:05:34 +0000 Subject: [PATCH] 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 --- sc2/src/sc2code/element.h | 35 ++++++++++++++++++++--------- sc2/src/sc2code/ipdisp.c | 10 ++++----- sc2/src/sc2code/planets/lander.c | 38 ++++++++++++++++++++++---------- sc2/src/sc2code/planets/scan.c | 4 ++-- 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/sc2/src/sc2code/element.h b/sc2/src/sc2code/element.h index 0f88dc8e8..09e1074a1 100644 --- a/sc2/src/sc2code/element.h +++ b/sc2/src/sc2code/element.h @@ -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 diff --git a/sc2/src/sc2code/ipdisp.c b/sc2/src/sc2code/ipdisp.c index 0f8aea8a8..6f6f3c7cb 100644 --- a/sc2/src/sc2code/ipdisp.c +++ b/sc2/src/sc2code/ipdisp.c @@ -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 = diff --git a/sc2/src/sc2code/planets/lander.c b/sc2/src/sc2code/planets/lander.c index dd6c0d49b..ee5bca43c 100644 --- a/sc2/src/sc2code/planets/lander.c +++ b/sc2/src/sc2code/planets/lander.c @@ -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); diff --git a/sc2/src/sc2code/planets/scan.c b/sc2/src/sc2code/planets/scan.c index 8d69ab51a..068849c8b 100644 --- a/sc2/src/sc2code/planets/scan.c +++ b/sc2/src/sc2code/planets/scan.c @@ -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;