Battle & ship code cleanup: Destruction of WHICH_SIDE(); removal of turn_wait abuse in new_ship()

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3265 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2009-10-30 22:33:09 +00:00
parent 6304f5e884
commit 415eec4efb
8 changed files with 54 additions and 70 deletions
-7
View File
@@ -166,13 +166,6 @@ extern PRIMITIVE DisplayArray[MAX_DISPLAY_PRIMS];
#define GRAVITY_MASS(m) ((m) > MAX_SHIP_MASS * 10) #define GRAVITY_MASS(m) ((m) > MAX_SHIP_MASS * 10)
#define GRAVITY_THRESHOLD (COUNT)255 #define GRAVITY_THRESHOLD (COUNT)255
static inline BYTE
ElementFlagsSide (ELEMENT_FLAGS flags)
{
return (BYTE) ((flags & BAD_GUY) >> 1);
}
#define WHICH_SIDE(flags) ElementFlagsSide (flags)
#define OBJECT_CLOAKED(eptr) \ #define OBJECT_CLOAKED(eptr) \
(GetPrimType (&GLOBAL (DisplayArray[(eptr)->PrimIndex])) >= NUM_PRIMS \ (GetPrimType (&GLOBAL (DisplayArray[(eptr)->PrimIndex])) >= NUM_PRIMS \
|| (GetPrimType (&GLOBAL (DisplayArray[(eptr)->PrimIndex])) == STAMPFILL_PRIM \ || (GetPrimType (&GLOBAL (DisplayArray[(eptr)->PrimIndex])) == STAMPFILL_PRIM \
+1 -1
View File
@@ -316,7 +316,7 @@ UninitShips (void)
/* Record crew left after battle */ /* Record crew left after battle */
StarShipPtr->crew_level = StarShipPtr->crew_level =
StarShipPtr->RaceDescPtr->ship_info.crew_level; StarShipPtr->RaceDescPtr->ship_info.crew_level;
SPtr[WHICH_SIDE (ElementPtr->state_flags)] = StarShipPtr; SPtr[StarShipPtr->playerNr] = StarShipPtr;
free_ship (StarShipPtr->RaceDescPtr, TRUE, TRUE); free_ship (StarShipPtr->RaceDescPtr, TRUE, TRUE);
StarShipPtr->RaceDescPtr = 0; StarShipPtr->RaceDescPtr = 0;
} }
+1 -15
View File
@@ -28,8 +28,6 @@
// for DUMP_CRC_OPS // for DUMP_CRC_OPS
#include "netconnection.h" #include "netconnection.h"
#include "netmelee.h" #include "netmelee.h"
#include "../tactrans.h"
// for new_ship
#include "libs/log.h" #include "libs/log.h"
#include "libs/mathlib.h" #include "libs/mathlib.h"
@@ -121,19 +119,7 @@ crc_processELEMENT(crc_State *state, const ELEMENT *val) {
crc_processCOUNT(state, val->life_span); crc_processCOUNT(state, val->life_span);
crc_processCOUNT(state, val->crew_level); crc_processCOUNT(state, val->crew_level);
crc_processBYTE(state, val->mass_points); crc_processBYTE(state, val->mass_points);
crc_processBYTE(state, val->turn_wait);
// HACK: when a ship is being destroyed, turn_wait is abused to store
// the side this ship is on. This must be excluded from the checksum
// as this does not have to be the same for both sides.
{
BYTE turn_wait = val->turn_wait;
if (val->preprocess_func == new_ship)
turn_wait = 0;
crc_processBYTE(state, turn_wait);
}
crc_processBYTE(state, val->thrust_wait); crc_processBYTE(state, val->thrust_wait);
crc_processVELOCITY_DESC(state, &val->velocity); crc_processVELOCITY_DESC(state, &val->velocity);
crc_processSTATE(state, &val->current); crc_processSTATE(state, &val->current);
+5 -3
View File
@@ -20,6 +20,8 @@
#include "resinst.h" #include "resinst.h"
#include "libs/mathlib.h" #include "libs/mathlib.h"
#include "uqm/init.h"
// for NUM_PLAYERS
#define MAX_CREW 20 #define MAX_CREW 20
@@ -322,7 +324,7 @@ androsynth_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern,
} }
} }
static CollisionFunc *ship_collision_func[2]; static CollisionFunc *ship_collision_func[NUM_PLAYERS];
#define BLAZER_TURN_WAIT 1 #define BLAZER_TURN_WAIT 1
@@ -355,7 +357,7 @@ androsynth_postprocess (ELEMENT *ElementPtr)
ElementPtr->mass_points = BLAZER_MASS; ElementPtr->mass_points = BLAZER_MASS;
StarShipPtr->RaceDescPtr->characteristics.turn_wait StarShipPtr->RaceDescPtr->characteristics.turn_wait
= BLAZER_TURN_WAIT; = BLAZER_TURN_WAIT;
ship_collision_func[WHICH_SIDE(ElementPtr->state_flags)] ship_collision_func[StarShipPtr->playerNr]
= ElementPtr->collision_func; = ElementPtr->collision_func;
ElementPtr->collision_func = blazer_collision; ElementPtr->collision_func = blazer_collision;
} }
@@ -424,7 +426,7 @@ androsynth_preprocess (ELEMENT *ElementPtr)
StarShipPtr->RaceDescPtr->characteristics.special_wait; StarShipPtr->RaceDescPtr->characteristics.special_wait;
StarShipPtr->RaceDescPtr->characteristics.energy_regeneration = ENERGY_REGENERATION; StarShipPtr->RaceDescPtr->characteristics.energy_regeneration = ENERGY_REGENERATION;
ElementPtr->mass_points = SHIP_MASS; ElementPtr->mass_points = SHIP_MASS;
ElementPtr->collision_func = ship_collision_func[WHICH_SIDE(ElementPtr->state_flags)]; ElementPtr->collision_func = ship_collision_func[StarShipPtr->playerNr];
ElementPtr->next.image.farray = ElementPtr->next.image.farray =
StarShipPtr->RaceDescPtr->ship_data.ship; StarShipPtr->RaceDescPtr->ship_data.ship;
ElementPtr->next.image.frame = ElementPtr->next.image.frame =
+10 -9
View File
@@ -20,6 +20,7 @@
#include "resinst.h" #include "resinst.h"
#include "uqm/init.h" #include "uqm/init.h"
// for NUM_PLAYERS
#define MAX_CREW 20 #define MAX_CREW 20
@@ -50,7 +51,7 @@
#define MMRNMHRM_OFFSET 16 #define MMRNMHRM_OFFSET 16
#define LASER_RANGE DISPLAY_TO_WORLD (125 + MMRNMHRM_OFFSET) #define LASER_RANGE DISPLAY_TO_WORLD (125 + MMRNMHRM_OFFSET)
static CHARACTERISTIC_STUFF otherwing_desc[NUM_SIDES]; static CHARACTERISTIC_STUFF otherwing_desc[NUM_PLAYERS];
static RACE_DESC mmrnmhrm_desc = static RACE_DESC mmrnmhrm_desc =
{ {
@@ -372,8 +373,8 @@ mmrnmhrm_postprocess (ELEMENT *ElementPtr)
StarShipPtr->weapon_counter = 0; StarShipPtr->weapon_counter = 0;
t = otherwing_desc[WHICH_SIDE(ElementPtr->state_flags)]; t = otherwing_desc[StarShipPtr->playerNr];
otherwing_desc[WHICH_SIDE(ElementPtr->state_flags)] = StarShipPtr->RaceDescPtr->characteristics; otherwing_desc[StarShipPtr->playerNr] = StarShipPtr->RaceDescPtr->characteristics;
StarShipPtr->RaceDescPtr->characteristics = t; StarShipPtr->RaceDescPtr->characteristics = t;
StarShipPtr->RaceDescPtr->cyborg_control.ManeuverabilityIndex = 0; StarShipPtr->RaceDescPtr->cyborg_control.ManeuverabilityIndex = 0;
@@ -407,11 +408,14 @@ mmrnmhrm_postprocess (ELEMENT *ElementPtr)
static void static void
mmrnmhrm_preprocess (ELEMENT *ElementPtr) mmrnmhrm_preprocess (ELEMENT *ElementPtr)
{ {
STARSHIP *StarShipPtr;
GetElementStarShip (ElementPtr, &StarShipPtr);
if (ElementPtr->state_flags & APPEARING) if (ElementPtr->state_flags & APPEARING)
{ {
COUNT i; // Set here because playerNr is unknown during init()
COUNT i = StarShipPtr->playerNr;
i = WHICH_SIDE (ElementPtr->state_flags);
otherwing_desc[i].max_thrust = YWING_MAX_THRUST; otherwing_desc[i].max_thrust = YWING_MAX_THRUST;
otherwing_desc[i].thrust_increment = YWING_THRUST_INCREMENT; otherwing_desc[i].thrust_increment = YWING_THRUST_INCREMENT;
otherwing_desc[i].energy_regeneration = YWING_ENERGY_REGENERATION; otherwing_desc[i].energy_regeneration = YWING_ENERGY_REGENERATION;
@@ -426,9 +430,6 @@ mmrnmhrm_preprocess (ELEMENT *ElementPtr)
} }
else else
{ {
STARSHIP *StarShipPtr;
GetElementStarShip (ElementPtr, &StarShipPtr);
if ((StarShipPtr->cur_status_flags & SPECIAL) if ((StarShipPtr->cur_status_flags & SPECIAL)
&& StarShipPtr->special_counter == 0) && StarShipPtr->special_counter == 0)
{ {
+17 -7
View File
@@ -20,6 +20,8 @@
#include "resinst.h" #include "resinst.h"
#include "libs/mathlib.h" #include "libs/mathlib.h"
#include "uqm/init.h"
// for NUM_PLAYERS
#define MAX_CREW 10 #define MAX_CREW 10
@@ -37,7 +39,7 @@
#define SHIP_MASS 1 #define SHIP_MASS 1
static FRAME LastShipFrame[2]; static FRAME LastShipFrame[NUM_PLAYERS];
static RACE_DESC umgah_desc = static RACE_DESC umgah_desc =
{ {
@@ -254,6 +256,7 @@ umgah_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern,
if (!(StarShipPtr->ship_input_state & SPECIAL)) if (!(StarShipPtr->ship_input_state & SPECIAL))
StarShipPtr->RaceDescPtr->characteristics.special_wait = 0xFF; StarShipPtr->RaceDescPtr->characteristics.special_wait = 0xFF;
} }
static COUNT static COUNT
initialize_cone (ELEMENT *ShipPtr, HELEMENT ConeArray[]) initialize_cone (ELEMENT *ShipPtr, HELEMENT ConeArray[])
{ {
@@ -281,9 +284,11 @@ initialize_cone (ELEMENT *ShipPtr, HELEMENT ConeArray[])
MissileBlock.preprocess_func = cone_preprocess; MissileBlock.preprocess_func = cone_preprocess;
MissileBlock.blast_offs = MISSILE_OFFSET; MissileBlock.blast_offs = MISSILE_OFFSET;
if (ShipPtr->next.image.frame != LastShipFrame[WHICH_SIDE(ShipPtr->state_flags)]) // This func is called every frame while the player is holding down WEAPON
// Don't reset the cone FRAME to the first image every time
if (ShipPtr->next.image.frame != LastShipFrame[StarShipPtr->playerNr])
{ {
LastShipFrame[WHICH_SIDE(ShipPtr->state_flags)] = ShipPtr->next.image.frame; LastShipFrame[StarShipPtr->playerNr] = ShipPtr->next.image.frame;
StarShipPtr->RaceDescPtr->ship_data.special[0] = StarShipPtr->RaceDescPtr->ship_data.special[0] =
SetAbsFrameIndex ( SetAbsFrameIndex (
@@ -329,14 +334,19 @@ umgah_postprocess (ELEMENT *ElementPtr)
static void static void
umgah_preprocess (ELEMENT *ElementPtr) umgah_preprocess (ELEMENT *ElementPtr)
{
if (ElementPtr->state_flags & APPEARING)
LastShipFrame[WHICH_SIDE(ElementPtr->state_flags)] = 0;
else
{ {
STARSHIP *StarShipPtr; STARSHIP *StarShipPtr;
GetElementStarShip (ElementPtr, &StarShipPtr); GetElementStarShip (ElementPtr, &StarShipPtr);
if (ElementPtr->state_flags & APPEARING)
{
// Reset prevously set value, if any. It could only have been
// set by another ship of the same player, though.
LastShipFrame[StarShipPtr->playerNr] = 0;
}
else
{
if (ElementPtr->thrust_wait == 0 if (ElementPtr->thrust_wait == 0
&& (StarShipPtr->cur_status_flags & SPECIAL) && (StarShipPtr->cur_status_flags & SPECIAL)
&& DeltaEnergy (ElementPtr, -SPECIAL_ENERGY_COST)) && DeltaEnergy (ElementPtr, -SPECIAL_ENERGY_COST))
+16 -24
View File
@@ -289,12 +289,11 @@ new_ship (ELEMENT *DeadShipPtr)
} }
MusicStarted = FALSE; MusicStarted = FALSE;
DeadShipPtr->turn_wait = (BYTE)( // XXX: Set to 0 to be vaguely checksum-compatible with previous
DeadShipPtr->state_flags & (GOOD_GUY | BAD_GUY)); // Netplay builds which abused turn_wait to store the ship's side.
// DeadShipPtr->turn_wait is abused to store which // The value is irrelevant at this point.
// side this element is for, because this information DeadShipPtr->turn_wait = 0;
// will be lost from state_flags when the element is
// set up for deletion below.
for (hElement = GetHeadElement (); hElement; hElement = hSuccElement) for (hElement = GetHeadElement (); hElement; hElement = hSuccElement)
{ {
ELEMENT *ElementPtr; ELEMENT *ElementPtr;
@@ -348,7 +347,7 @@ new_ship (ELEMENT *DeadShipPtr)
} }
if (DeadShipPtr->life_span || !readyForBattleEnd ( if (DeadShipPtr->life_span || !readyForBattleEnd (
WHICH_SIDE (DeadShipPtr->turn_wait))) DeadStarShipPtr->playerNr))
{ {
DeadShipPtr->state_flags &= ~DISAPPEARING; DeadShipPtr->state_flags &= ~DISAPPEARING;
++DeadShipPtr->life_span; ++DeadShipPtr->life_span;
@@ -369,6 +368,9 @@ new_ship (ELEMENT *DeadShipPtr)
DeadStarShipPtr->RaceDescPtr); DeadStarShipPtr->RaceDescPtr);
free_ship (DeadStarShipPtr->RaceDescPtr, TRUE, TRUE); free_ship (DeadStarShipPtr->RaceDescPtr, TRUE, TRUE);
DeadStarShipPtr->RaceDescPtr = 0; DeadStarShipPtr->RaceDescPtr = 0;
// Graphics are batched while the draw queue is processed,
// but we are going to draw the ship selection box now
UnbatchGraphics (); UnbatchGraphics ();
#ifdef NETPLAY #ifdef NETPLAY
@@ -389,8 +391,7 @@ UnbatchGraphics ();
} }
#endif /* NETPLAY */ #endif /* NETPLAY */
if (GetNextStarShip (DeadStarShipPtr, if (GetNextStarShip (DeadStarShipPtr, DeadStarShipPtr->playerNr))
WHICH_SIDE (DeadShipPtr->turn_wait)))
{ {
#ifdef NETPLAY #ifdef NETPLAY
{ {
@@ -420,17 +421,6 @@ UnbatchGraphics ();
GLOBAL (CurrentActivity) |= CHECK_ABORT; GLOBAL (CurrentActivity) |= CHECK_ABORT;
} }
#endif #endif
#ifdef NETPLAY
// Turn_wait was abused to store the side this element was on.
// We don't want this included in checksums, as it can be different
// for both sides of a connection.
// While preprocess_func == new_ship, turn_wait isn't included in
// the checksum at all all, but now that new_ship is done,
// it would be. As the value is irrelevant at this point, we can
// just set it to the same value on either side.
DeadShipPtr->turn_wait = 0;
#endif
BatchGraphics (); BatchGraphics ();
} }
} }
@@ -520,10 +510,13 @@ ship_death (ELEMENT *ShipPtr)
StopMusic (); StopMusic ();
GetElementStarShip (ShipPtr, &StarShipPtr);
if (ShipPtr->mass_points <= MAX_SHIP_MASS) if (ShipPtr->mass_points <= MAX_SHIP_MASS)
{ { // Not running away and not reincarnating (Pkunk)
COUNT side = ElementFlagsSide (ShipPtr->state_flags); // When a ship tries to run away, it is (dis)counted in DoRunAway(),
battle_counter[side]--; // so when it dies while running away, we will not count it again
battle_counter[StarShipPtr->playerNr]--;
} }
VictoriousStarShipPtr = 0; VictoriousStarShipPtr = 0;
@@ -548,7 +541,6 @@ ship_death (ELEMENT *ShipPtr)
UnlockElement (hElement); UnlockElement (hElement);
} }
GetElementStarShip (ShipPtr, &StarShipPtr);
StarShipPtr->cur_status_flags &= ~PLAY_VICTORY_DITTY; StarShipPtr->cur_status_flags &= ~PLAY_VICTORY_DITTY;
DeltaEnergy (ShipPtr, DeltaEnergy (ShipPtr,
+2 -2
View File
@@ -279,8 +279,8 @@ ModifySilhouette (ELEMENT *ElementPtr, STAMP *modify_stamp,
} }
ObjectIntersect.IntersectStamp.origin.y += ObjectIntersect.IntersectStamp.origin.y +=
(WHICH_SIDE (ElementPtr->state_flags) (ElementPtr->state_flags & GOOD_GUY) ?
? BAD_GUY_YOFFS : GOOD_GUY_YOFFS); GOOD_GUY_YOFFS : BAD_GUY_YOFFS;
if (modify_flags & MODIFY_SWAP) if (modify_flags & MODIFY_SWAP)
{ {