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_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) \
(GetPrimType (&GLOBAL (DisplayArray[(eptr)->PrimIndex])) >= NUM_PRIMS \
|| (GetPrimType (&GLOBAL (DisplayArray[(eptr)->PrimIndex])) == STAMPFILL_PRIM \
+1 -1
View File
@@ -316,7 +316,7 @@ UninitShips (void)
/* Record crew left after battle */
StarShipPtr->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);
StarShipPtr->RaceDescPtr = 0;
}
+1 -15
View File
@@ -28,8 +28,6 @@
// for DUMP_CRC_OPS
#include "netconnection.h"
#include "netmelee.h"
#include "../tactrans.h"
// for new_ship
#include "libs/log.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->crew_level);
crc_processBYTE(state, val->mass_points);
// 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->turn_wait);
crc_processBYTE(state, val->thrust_wait);
crc_processVELOCITY_DESC(state, &val->velocity);
crc_processSTATE(state, &val->current);
+5 -3
View File
@@ -20,6 +20,8 @@
#include "resinst.h"
#include "libs/mathlib.h"
#include "uqm/init.h"
// for NUM_PLAYERS
#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
@@ -355,7 +357,7 @@ androsynth_postprocess (ELEMENT *ElementPtr)
ElementPtr->mass_points = BLAZER_MASS;
StarShipPtr->RaceDescPtr->characteristics.turn_wait
= BLAZER_TURN_WAIT;
ship_collision_func[WHICH_SIDE(ElementPtr->state_flags)]
ship_collision_func[StarShipPtr->playerNr]
= ElementPtr->collision_func;
ElementPtr->collision_func = blazer_collision;
}
@@ -424,7 +426,7 @@ androsynth_preprocess (ELEMENT *ElementPtr)
StarShipPtr->RaceDescPtr->characteristics.special_wait;
StarShipPtr->RaceDescPtr->characteristics.energy_regeneration = ENERGY_REGENERATION;
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 =
StarShipPtr->RaceDescPtr->ship_data.ship;
ElementPtr->next.image.frame =
+10 -9
View File
@@ -20,6 +20,7 @@
#include "resinst.h"
#include "uqm/init.h"
// for NUM_PLAYERS
#define MAX_CREW 20
@@ -50,7 +51,7 @@
#define MMRNMHRM_OFFSET 16
#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 =
{
@@ -372,8 +373,8 @@ mmrnmhrm_postprocess (ELEMENT *ElementPtr)
StarShipPtr->weapon_counter = 0;
t = otherwing_desc[WHICH_SIDE(ElementPtr->state_flags)];
otherwing_desc[WHICH_SIDE(ElementPtr->state_flags)] = StarShipPtr->RaceDescPtr->characteristics;
t = otherwing_desc[StarShipPtr->playerNr];
otherwing_desc[StarShipPtr->playerNr] = StarShipPtr->RaceDescPtr->characteristics;
StarShipPtr->RaceDescPtr->characteristics = t;
StarShipPtr->RaceDescPtr->cyborg_control.ManeuverabilityIndex = 0;
@@ -407,11 +408,14 @@ mmrnmhrm_postprocess (ELEMENT *ElementPtr)
static void
mmrnmhrm_preprocess (ELEMENT *ElementPtr)
{
STARSHIP *StarShipPtr;
GetElementStarShip (ElementPtr, &StarShipPtr);
if (ElementPtr->state_flags & APPEARING)
{
COUNT i;
i = WHICH_SIDE (ElementPtr->state_flags);
// Set here because playerNr is unknown during init()
COUNT i = StarShipPtr->playerNr;
otherwing_desc[i].max_thrust = YWING_MAX_THRUST;
otherwing_desc[i].thrust_increment = YWING_THRUST_INCREMENT;
otherwing_desc[i].energy_regeneration = YWING_ENERGY_REGENERATION;
@@ -426,9 +430,6 @@ mmrnmhrm_preprocess (ELEMENT *ElementPtr)
}
else
{
STARSHIP *StarShipPtr;
GetElementStarShip (ElementPtr, &StarShipPtr);
if ((StarShipPtr->cur_status_flags & SPECIAL)
&& StarShipPtr->special_counter == 0)
{
+17 -7
View File
@@ -20,6 +20,8 @@
#include "resinst.h"
#include "libs/mathlib.h"
#include "uqm/init.h"
// for NUM_PLAYERS
#define MAX_CREW 10
@@ -37,7 +39,7 @@
#define SHIP_MASS 1
static FRAME LastShipFrame[2];
static FRAME LastShipFrame[NUM_PLAYERS];
static RACE_DESC umgah_desc =
{
@@ -254,6 +256,7 @@ umgah_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern,
if (!(StarShipPtr->ship_input_state & SPECIAL))
StarShipPtr->RaceDescPtr->characteristics.special_wait = 0xFF;
}
static COUNT
initialize_cone (ELEMENT *ShipPtr, HELEMENT ConeArray[])
{
@@ -281,9 +284,11 @@ initialize_cone (ELEMENT *ShipPtr, HELEMENT ConeArray[])
MissileBlock.preprocess_func = cone_preprocess;
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] =
SetAbsFrameIndex (
@@ -330,13 +335,18 @@ umgah_postprocess (ELEMENT *ElementPtr)
static void
umgah_preprocess (ELEMENT *ElementPtr)
{
STARSHIP *StarShipPtr;
GetElementStarShip (ElementPtr, &StarShipPtr);
if (ElementPtr->state_flags & APPEARING)
LastShipFrame[WHICH_SIDE(ElementPtr->state_flags)] = 0;
{
// 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
{
STARSHIP *StarShipPtr;
GetElementStarShip (ElementPtr, &StarShipPtr);
if (ElementPtr->thrust_wait == 0
&& (StarShipPtr->cur_status_flags & SPECIAL)
&& DeltaEnergy (ElementPtr, -SPECIAL_ENERGY_COST))
+18 -26
View File
@@ -289,12 +289,11 @@ new_ship (ELEMENT *DeadShipPtr)
}
MusicStarted = FALSE;
DeadShipPtr->turn_wait = (BYTE)(
DeadShipPtr->state_flags & (GOOD_GUY | BAD_GUY));
// DeadShipPtr->turn_wait is abused to store which
// side this element is for, because this information
// will be lost from state_flags when the element is
// set up for deletion below.
// XXX: Set to 0 to be vaguely checksum-compatible with previous
// Netplay builds which abused turn_wait to store the ship's side.
// The value is irrelevant at this point.
DeadShipPtr->turn_wait = 0;
for (hElement = GetHeadElement (); hElement; hElement = hSuccElement)
{
ELEMENT *ElementPtr;
@@ -348,7 +347,7 @@ new_ship (ELEMENT *DeadShipPtr)
}
if (DeadShipPtr->life_span || !readyForBattleEnd (
WHICH_SIDE (DeadShipPtr->turn_wait)))
DeadStarShipPtr->playerNr))
{
DeadShipPtr->state_flags &= ~DISAPPEARING;
++DeadShipPtr->life_span;
@@ -369,7 +368,10 @@ new_ship (ELEMENT *DeadShipPtr)
DeadStarShipPtr->RaceDescPtr);
free_ship (DeadStarShipPtr->RaceDescPtr, TRUE, TRUE);
DeadStarShipPtr->RaceDescPtr = 0;
UnbatchGraphics ();
// Graphics are batched while the draw queue is processed,
// but we are going to draw the ship selection box now
UnbatchGraphics ();
#ifdef NETPLAY
initBattleStateDataConnections ();
@@ -389,8 +391,7 @@ UnbatchGraphics ();
}
#endif /* NETPLAY */
if (GetNextStarShip (DeadStarShipPtr,
WHICH_SIDE (DeadShipPtr->turn_wait)))
if (GetNextStarShip (DeadStarShipPtr, DeadStarShipPtr->playerNr))
{
#ifdef NETPLAY
{
@@ -420,18 +421,7 @@ UnbatchGraphics ();
GLOBAL (CurrentActivity) |= CHECK_ABORT;
}
#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 ();
GetElementStarShip (ShipPtr, &StarShipPtr);
if (ShipPtr->mass_points <= MAX_SHIP_MASS)
{
COUNT side = ElementFlagsSide (ShipPtr->state_flags);
battle_counter[side]--;
{ // Not running away and not reincarnating (Pkunk)
// When a ship tries to run away, it is (dis)counted in DoRunAway(),
// so when it dies while running away, we will not count it again
battle_counter[StarShipPtr->playerNr]--;
}
VictoriousStarShipPtr = 0;
@@ -548,7 +541,6 @@ ship_death (ELEMENT *ShipPtr)
UnlockElement (hElement);
}
GetElementStarShip (ShipPtr, &StarShipPtr);
StarShipPtr->cur_status_flags &= ~PLAY_VICTORY_DITTY;
DeltaEnergy (ShipPtr,
+2 -2
View File
@@ -279,8 +279,8 @@ ModifySilhouette (ELEMENT *ElementPtr, STAMP *modify_stamp,
}
ObjectIntersect.IntersectStamp.origin.y +=
(WHICH_SIDE (ElementPtr->state_flags)
? BAD_GUY_YOFFS : GOOD_GUY_YOFFS);
(ElementPtr->state_flags & GOOD_GUY) ?
GOOD_GUY_YOFFS : BAD_GUY_YOFFS;
if (modify_flags & MODIFY_SWAP)
{